Revision 56:0dd97c329887

View differences:

WebContent/WEB-INF/config/ss223_application/form-beans.xml
33 33
			<form-property name="hasAppCreateAccess" type="java.lang.Boolean" />
34 34
			<form-property name="hasAppEditAccess" type="java.lang.Boolean" />
35 35
			<form-property name="hasAppDeleteAccess" type="java.lang.Boolean" />
36
			<form-property name="hasAppResetAccess" type="java.lang.Boolean" />
36 37
			
37 38
			<form-property name="jspTitle" type="java.lang.String" />
38 39
			
WebContent/WEB-INF/config/ss223_application/struts-config.xml
8 8
	<global-forwards>
9 9
	</global-forwards>
10 10
	<action-mappings>
11
	    <!-- Enquiry Main Page -->
11
	    <!-- App Admin Enquiry Main Page -->
12 12
	    <action name="appUserForm" path="/ss223/appUserEnquiryMain"
13 13
			scope="session"
14 14
			type="com.ib.ibss.controller.actions.ss223_application.IBSSApplicationUserMainAction"
......
16 16
			<forward name="success" path=".ibss.app.user.enquiry.main" />
17 17
		</action>
18 18
	    
19
		<!-- Create App User -->
19
		<!-- Create App Admin -->
20 20
		<action name="appUserForm" path="/ss223/createAppUserDetails" scope="session"
21 21
			type="com.ib.ibss.controller.actions.ss223_application.IBSSApplicationUserCreateDetailsAction"
22 22
			validate="false">
......
40 40
			<forward name="failure" path=".ibss.app.user.create" />
41 41
		</action>
42 42
		
43
		<!-- Delete Group -->
43
		<!-- Delete App Admin -->
44 44
		<action name="appUserForm" path="/ss223/deleteAppUserConfirm"
45 45
			scope="session"
46 46
			type="com.ib.ibss.controller.actions.ss223_application.IBSSApplicationUserDeleteConfirmAction"
......
57 57
			<forward name="failure" path=".ibss.app.user.details" />
58 58
		</action>
59 59
		
60
		<!-- Group Details -->
60
		<!-- App Admin Details -->
61 61
		<action name="appUserForm" path="/ss223/appUserDetails" scope="session"
62 62
			type="com.ib.ibss.controller.actions.ss223_application.IBSSApplicationUserDetailsAction"
63 63
			validate="false">
......
65 65
			<forward name="failure" path=".ibss.app.user.enquiry.main" />
66 66
		</action>
67 67
		
68
		<!-- Group Edit -->
68
		<!-- App Admin Edit -->
69 69
		<action name="appUserForm" path="/ss223/appUserEditDetails" scope="session"
70 70
			type="com.ib.ibss.controller.actions.ss223_application.IBSSApplicationUserEditDetailsAction"
71 71
			validate="false">
......
89 89
			<forward name="back" path=".ibss.app.user.edit" />
90 90
			<forward name="failure" path=".ibss.app.user.edit" />
91 91
		</action>
92
		
93
		<!-- App Admin Reset Password -->
94
		<action name="appUserForm" path="/ss223/appUserResetPass"
95
			scope="session"
96
			type="com.ib.ibss.controller.actions.ss223_application.IBSSApplicationUserResetPassAction"
97
			validate="false">
98
			<forward name="success" path=".ibss.app.user.reset.pass" />
99
			<forward name="failure" path=".ibss.app.user.reset.pass" />
100
		</action>
101
		<action name="appUserForm" path="/ss223/appUserResetPassResult" scope="session"
102
			type="com.ib.ibss.controller.actions.ss223_application.IBSSApplicationUserResetPassResultAction"
103
			validate="false">
104
			<forward name="success" path=".ibss.app.user.reset.pass.success" />
105
			<forward name="back" path=".ibss.app.user.details" />
106
			<forward name="failure" path=".ibss.app.user.reset.pass" />
107
		</action>
92 108
	</action-mappings>
93 109
	<controller />
94 110
</struts-config>
WebContent/WEB-INF/config/ss223_application/tiles-defs.xml
3 3
                                   "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
4 4
<tiles-definitions>
5 5
	<definition name="tiles-defs" />
6
	<!-- Create Group -->
6
	<!-- Create App Admin -->
7 7
	<definition name=".ibss.app.user.create" extends=".ibss.content.template">
8 8
		<put name="body" value="/jsp/ss223_application/ibssAppUserCreateDetails.jsp" />
9 9
	</definition>
......
13 13
	<definition name=".ibss.app.user.create.result" extends=".ibss.content.template">
14 14
		<put name="body" value="/jsp/ss223_application/ibssAppUserCreateResult.jsp" />
15 15
	</definition>
16
	
17
	<!-- Delete App Admin -->
16 18
	<definition name=".ibss.app.user.delete.confirm" extends=".ibss.content.template">
17 19
		<put name="body" value="/jsp/ss223_application/ibssAppUserDeleteConfirm.jsp" />
18 20
	</definition>
19 21
	<definition name=".ibss.app.user.delete.result" extends=".ibss.content.template">
20 22
		<put name="body" value="/jsp/ss223_application/ibssAppUserDeleteResult.jsp" />
21 23
	</definition>
24
	
25
	<!-- App Admin Details Page -->
22 26
	<definition name=".ibss.app.user.details" extends=".ibss.content.template">
23 27
		<put name="body" value="/jsp/ss223_application/ibssAppUserDetails.jsp" />
24 28
	</definition>
29
	
30
	<!-- Edit App Admin -->
25 31
	<definition name=".ibss.app.user.edit" extends=".ibss.content.template">
26 32
		<put name="body" value="/jsp/ss223_application/ibssAppUserEditDetails.jsp" />
27 33
	</definition>
......
31 37
	<definition name=".ibss.app.user.edit.result" extends=".ibss.content.template">
32 38
		<put name="body" value="/jsp/ss223_application/ibssAppUserEditResult.jsp" />
33 39
	</definition>
40
	
41
	<!-- App Admin Enquiry Main Page -->
34 42
	<definition name=".ibss.app.user.enquiry.main" extends=".ibss.content.template">
35 43
		<put name="body" value="/jsp/ss223_application/ibssAppUserEnquiry.jsp" />
36 44
	</definition>
......
38 46
		<put name="body" value="/jsp/ss223_application/ibssAppUserEnquiryNoUsers.jsp" />
39 47
	</definition>
40 48
	
49
	<!-- Print  -->
41 50
	<definition name=".ibss.app.user.print" extends=".ibss.popup.print.template">
42 51
		<put name="body" value="/jsp/ss223_application/ibssAppUserPrint.jsp" />
43 52
	</definition>
53
	
54
	<!-- App Admin Reset Password -->
55
	<definition name=".ibss.app.user.reset.pass" extends=".ibss.content.template">
56
		<put name="body" value="/jsp/ss223_application/ibssAppUserResetPass.jsp" />
57
	</definition>
58
	<definition name=".ibss.app.user.reset.pass.success" extends=".ibss.content.template">
59
		<put name="body" value="/jsp/ss223_application/ibssAppUserResetPassResult.jsp" />
60
	</definition>
44 61
</tiles-definitions>
WebContent/WEB-INF/config/ss223_application/validation.xml
12 12
     <var-value>64</var-value>
13 13
    </var>
14 14
   </field>
15
   <field depends="maxlength, required" property="password">
15
   <field depends="required, minlength, maxlength" property="password">
16 16
    <arg0 key="appuser.user.password"/>
17
    <arg1 key="${var:maxlength}" name="maxlength" resource="false"/>
17
	<arg1 key="${var:minlength}" name="minlength" resource="false"/>
18
	<var>
19
	 <var-name>minlength</var-name>
20
	 <var-value>8</var-value>
21
	 </var>
22
    <arg2 key="${var:maxlength}" name="maxlength" resource="false"/>
18 23
    <var>
19 24
     <var-name>maxlength</var-name>
20
     <var-value>16</var-value>
25
     <var-value>12</var-value>
21 26
    </var>
22 27
   </field>
23
    <field depends="maxlength, required" property="confirmPassword">
28
    <field depends="required, minlength, maxlength" property="confirmPassword">
24 29
    <arg0 key="appuser.user.confirmPassword"/>
25
    <arg1 key="${var:maxlength}" name="maxlength" resource="false"/>
30
    <arg1 key="${var:minlength}" name="minlength" resource="false"/>
31
	<var>
32
	 <var-name>minlength</var-name>
33
	 <var-value>8</var-value>
34
	 </var>
35
    <arg2 key="${var:maxlength}" name="maxlength" resource="false"/>
26 36
    <var>
27 37
     <var-name>maxlength</var-name>
28
     <var-value>16</var-value>
38
     <var-value>12</var-value>
29 39
    </var>
30 40
   </field>
31 41
   <field depends="maxlength, required" property="userDescription">
......
60 70
   </field>
61 71
  </form>
62 72
  
73
  <form name="appUserResetPassValidation">
74
	<field depends="required, minlength" property="password">
75
	<msg key="errors.minlength" name="minlength"/>
76
	 <arg0 key="appuser.user.password"/>
77
	 <arg1 key="${var:minlength}" name="minlength" resource="false"/>
78
		 <var>
79
			<var-name>minlength</var-name>
80
			<var-value>8</var-value>
81
		 </var>
82
	</field>
83
	<field depends="required, minlength" property="confirmPassword">
84
	<msg key="errors.minlength" name="minlength"/>
85
	<arg0 key="appuser.user.confirmPassword"/>
86
	<arg1 key="${var:minlength}" name="minlength" resource="false"/>
87
		<var>
88
			<var-name>minlength</var-name>
89
			 <var-value>8</var-value>
90
		 </var>
91
	</field>
92
	</form>
93
  
63 94
 </formset>
64 95
</form-validation>
WebContent/jsp/ss223_application/ibssAppUserDetails.jsp
93 93
	  	<htmlEL:submit property="action" styleClass="button" onclick="overlay();">
94 94
			<bean:message key="general.button.back"/>						
95 95
		</htmlEL:submit>
96
		<c:if test="${appUserForm.map.hasAppResetAccess eq true}">
97
		<htmlEL:hidden property="userId" name="detailBean" value="${detailBean.map.userId}"></htmlEL:hidden>
98
	  	<htmlEL:submit property="action" styleClass="button" onclick="overlay();">
99
			<bean:message key="general.button.reset.password"/>						
100
		</htmlEL:submit>
101
		</c:if>
96 102
		<c:if test="${appUserForm.map.hasAppEditAccess eq true}">
97 103
		<htmlEL:hidden property="userId" name="detailBean" value="${detailBean.map.userId}"></htmlEL:hidden>
98 104
	  	<htmlEL:submit property="action" styleClass="button" onclick="overlay();">
......
105 111
			<bean:message key="general.button.delete"/>						
106 112
		</htmlEL:submit>
107 113
		</c:if>
108
	  	<%-- <htmlEL:submit  property="action" styleClass="button" onclick="popUp('../ss103/printForm.do','console',1000,800);return false;">
109
	  		<bean:message key="general.button.print"/>
110
		</htmlEL:submit> --%>
111 114

  
112 115
	  </div>
113 116
  </htmlEL:form>
WebContent/jsp/ss223_application/ibssAppUserResetPass.jsp
1
<%@ taglib uri="/WEB-INF/tld/struts-html-el" prefix="htmlEL" %>
2
<%@ taglib uri="/WEB-INF/tld/struts-bean" prefix="bean" %>
3
<%@ taglib uri="/WEB-INF/tld/c" prefix="c" %>
4

  
5
<bean:define id="detailBean" name="appUserForm" property="appUserDetailsBean"/>
6

  
7
<h3 class="title"><strong><c:out value="${sessionScope.displayDesc}"/> - Reset Password</strong></h3>
8

  
9
<table id="errorTable">
10
	<tr>
11
		<td>
12
			<span id="serverSideError" class="error"><jsp:include flush="true" page="/jsp/errorHandler.jsp"></jsp:include></span>
13
		</td>
14
	</tr>
15
</table>
16

  
17
<table class="stepTable">
18
<tr>
19
<td>&nbsp;</td>
20
<td><div id="steps"><span><bean:message key="general.title.steps" arg0="1" arg1="2"/></span></div></td>
21

  
22
</tr>
23
</table>
24
<htmlEL:form action="/ss223/appUserResetPassResult.do">
25
<table class="tabularForm">
26
  <tr>
27
    <td width="69">&nbsp;</td>
28
    <td width="133">&nbsp;</td>
29
    <td colspan="2">&nbsp;</td>
30
    <td width="63">&nbsp;</td>
31
  </tr>
32
  <tr>
33
    <td width="69">&nbsp;</td>
34
    <td><bean:message key="appuser.user.id"/>:</td>
35
    <td colspan="2"><strong><c:out value="${detailBean.map.userId}"/></strong></td>
36
    <td>&nbsp;</td>
37
    </tr>
38
     <tr>
39
    <td width="69">&nbsp;</td>
40
    <td><bean:message key="appuser.user.alias"/>:</td>
41
    <td colspan="2"><strong><c:out value="${detailBean.map.userAlias}"/></strong></td>
42
    <td>&nbsp;</td>
43
    </tr>
44
  	<tr>
45
		<td>&nbsp;</td>
46
		<td><bean:message key="appuser.application.name"" />:</td>
47
		 <td colspan="2"><strong><c:out value="${detailBean.map.appName}"/></strong></td>
48
		<td>&nbsp;</td>
49
	</tr>
50
	<tr>
51
	    <td>&nbsp;</td>
52
	    <td><bean:message key="appuser.user.description"/>:</td>
53
	    <td colspan="2">
54
		    <c:choose>
55
		    	<c:when test="${not empty detailBean.map.userDescription}">
56
		    		 <strong><c:out value="${detailBean.map.userDescription}"/></strong>
57
		    	</c:when>
58
		    	<c:otherwise>-</c:otherwise>
59
		    </c:choose>
60
	    </td>
61
	    <td>&nbsp;</td>
62
  	</tr>
63
	<tr>
64
		<td>&nbsp;</td>
65
		<td><bean:message key="appuser.created.date" />:</td>
66
		<td colspan="2"><strong> <c:choose>
67
					<c:when test="${not empty detailBean.map.userCreationDate}">
68
						<c:out value="${detailBean.map.userCreationDate}"></c:out>
69
					</c:when>
70
					<c:otherwise>-</c:otherwise>
71
				</c:choose> </strong></td>
72
		<td>&nbsp;</td>
73
	</tr>
74
	 <tr>
75
    <td>&nbsp;</td>
76
    <td><bean:message key="appuser.user.password"/>:</td>
77
    <td colspan="2"><htmlEL:password autocomplete="off" property="password" name="appUserForm" maxlength="12"/></td>
78
    <td>&nbsp;</td>
79
  </tr>
80
  <tr>
81
    <td>&nbsp;</td>
82
    <td><bean:message key="appuser.user.confirmPassword"/>:</td>
83
    <td colspan="2"><htmlEL:password autocomplete="off" property="confirmPassword" name="appUserForm" maxlength="12"/></td>
84
    <td>&nbsp;</td>
85
  </tr>
86
  <tr>
87
    <td>&nbsp;</td>
88
    <td>&nbsp;</td>
89
    <td colspan="2">&nbsp;</td>
90
    <td>&nbsp;</td>
91
  </tr>
92
  <tr>
93
    <td>&nbsp;</td>
94
    <td>&nbsp;</td>
95
    <td>&nbsp;</td>
96
    <td colspan="2" width="150">
97
        <htmlEL:submit property="action" styleClass="button" onclick="overlay();">
98
			<bean:message key="general.button.back"/>						
99
		</htmlEL:submit>
100
		<htmlEL:submit property="action" styleClass="button" onclick="overlay();">
101
			<bean:message key="general.button.confirm"/>						
102
		</htmlEL:submit>
103
    </td>
104
  </tr>
105
</table>
106
</htmlEL:form>
WebContent/jsp/ss223_application/ibssAppUserResetPassResult.jsp
1
<%@ taglib uri="/WEB-INF/tld/struts-bean" prefix="bean" %>
2
<%@ taglib uri="/WEB-INF/tld/struts-html-el" prefix="htmlEL" %>
3
<%@ taglib uri="/WEB-INF/tld/c" prefix="c" %>
4
<h3 class="title"><strong><c:out value="${sessionScope.displayDesc}"/> - Reset Password Result</strong></h3>
5
<table class="stepTable">
6
<tr>
7
<td>&nbsp;</td>
8
<td><div id="steps"><span><bean:message key="general.title.steps" arg0="2" arg1="2"/></span></div></td>
9

  
10
<bean:define id="detailBean" name="appUserForm"
11
	property="appUserDetailsBean" />
12

  
13
</tr>
14
</table>
15
<table class="tabularForm">
16
  <tr>
17
    <td width="96">&nbsp;</td>
18
    <td class="success" width="264"><strong><bean:message key="general.status.successful"/></strong></td>
19
    <td width="146">&nbsp;</td>
20
    <td width="86">&nbsp;</td>
21
  </tr>
22
  <tr>
23
    <td height="28">&nbsp;</td>
24
    <td colspan="2"><bean:message key="appuser.user.id" />:<c:out value="${detailBean.map.userAlias}"></c:out>&nbsp;<bean:message key="user.password.reset.successful"/> </td>
25
    <td>&nbsp;</td>
26
  </tr>
27
  <tr>
28
    <td>&nbsp;</td>
29
    <td>&nbsp;</td>
30
    <td>&nbsp;</td>
31
    <td>&nbsp;</td>
32
  </tr>
33
</table>
34
<div class="floatRight">
35
<htmlEL:form action="/ss223/appUserEnquiryMain.do">
36
	<htmlEL:hidden name="appUserForm" property="userId" />
37
	<htmlEL:submit property="action" styleClass="button" onclick="overlay();">
38
		<bean:message key="general.button.back"/>
39
	</htmlEL:submit>
40
</htmlEL:form>
41
</div>
resource/com/ib/ibss/resources/message/IBSSApplicationResources.properties
2958 2958
appuser.user.id=User ID
2959 2959
appuser.user.alias=User Alias
2960 2960
appuser.user.description=User Description
2961
appuser.user.password=Password
2961
appuser.user.password=New Password
2962 2962
appuser.user.confirmPassword=Confirm Password
2963 2963
appuser.application=Application Selection
2964 2964
appuser.admin.password=Admin Password
2965 2965
appuser.application.name=Application Name
2966 2966
appuser.created.date=Created Date
2967
appuser.word=Application User
2967
appuser.word=Application Admin
2968 2968

  
2969 2969
app.user.successful.msg=Application User {0} has been successfully
2970 2970

  
src/com/ib/ibss/common/constant/AdminPermissionModeType.java
503 503
				Long actionId = 8003L;
504 504
				return actionId;
505 505
			}
506
		},
507
		RESET_APPLICATION_USER
508
		{
509
			public Long getActionId ()
510
			{
511
				Long actionId = 8004L;
512
				return actionId;
513
			}
506 514
		};
507 515

  
508 516
		public abstract Long getActionId();
src/com/ib/ibss/common/constant/JSPValidator.java
288 288
	/*ss223 Application User Maintenance Validation*/
289 289
	public static final String APP_USER_CREATE_CONFIRM_VALIDATION			= "appUserCreateConfirmValidation";
290 290
	public static final String APP_USER_EDIT_CONFIRM_VALIDATION				= "appUserEditConfirmValidation";
291
	public static final String APP_USER_RESET_PASSWORD_VALIDATION			= "appUserResetPassValidation";
291 292
}
src/com/ib/ibss/controller/actions/ss223_application/IBSSApplicationUserResetPassAction.java
1
/**
2
 * Copyright (M) 2009 Penril Datability (M) Sdn Bhd All rights reserved.
3
 *
4
 * This software is copyrighted. Under the copyright laws, this software
5
 * may not be copied, in whole or in part, without prior written consent
6
 * of Penril Datability (M) Sdn Bhd or its assignees. This software is
7
 * provided under the terms of a license between Penril Datability (M)
8
 * Sdn Bhd and the recipient, and its use is subject to the terms of that
9
 * license.
10
 */
11

  
12
package com.ib.ibss.controller.actions.ss223_application;
13

  
14
import javax.servlet.http.HttpServletRequest;
15
import javax.servlet.http.HttpServletResponse;
16

  
17
import org.apache.struts.action.ActionForm;
18
import org.apache.struts.action.ActionForward;
19
import org.apache.struts.action.ActionMapping;
20

  
21
import com.ib.ibss.common.constant.AdminPermissionModeType.ApplicationPermission;
22
import com.ib.ibss.common.constant.FunctionConstants.FunctionCodeEnum;
23
import com.ib.ibss.common.utils.IBSSNavigationUtil;
24
import com.ib.ibss.enterprise.services.common.SessionUserPermissionVerificationService;
25
import com.ib.ibss.error.exception.IBSSGenericException;
26
import com.ib.ibss.struts.utils.IBSSControllerAction;
27
import com.ib.ibss.struts.utils.IBSSSessionObjects;
28

  
29
/**
30
 * This is the Action controller class to go to user reset password display 
31
 */
32
public class IBSSApplicationUserResetPassAction extends IBSSControllerAction
33
{
34

  
35
	/**
36
	 * <pre>
37
	 * Check token value to make sure is valid session.
38
	 * </pre>
39
	 *
40
	 * @param mapping The ActionMapping used to select this instance
41
	 * @param form The optional ActionForm bean for this request which is from form-bean.xml(if any)
42
	 * @param request The HTTP request we are processing
43
	 * @param response The HTTP response we are creating
44
	 * @return The requested ActionForward object
45
	 * @throws Exception if the application business logic throws an exception
46
	 *
47
	 * @see com.ib.ibss.struts.utils.IBSSControllerAction#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
48
	 */
49
	public ActionForward execute (ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
50
	{
51
		noErrorHandling (request, mapping);
52
		try
53
		{	
54
			checkToken (request, mapping, false);
55
			checkCredential (request, FunctionCodeEnum.APPLICATION_USER_MAINTENANCE);
56
			
57
			IBSSSessionObjects sessionObjects = new IBSSSessionObjects(request);
58
			IBSSNavigationUtil tree = new IBSSNavigationUtil(sessionObjects);
59
			tree.buildNavigation ();
60
			
61
			//Check User Permission Access
62
			Long actionId = ApplicationPermission.RESET_APPLICATION_USER.getActionId();
63
			SessionUserPermissionVerificationService access = new SessionUserPermissionVerificationService(sessionObjects);
64
			access.validateUser(actionId);
65
		}
66
		catch (IBSSGenericException e)
67
		{
68
			errorHandling(request, mapping, e);
69
		}
70
		return super.execute (mapping, form, request, response);
71
	}
72
}
src/com/ib/ibss/controller/actions/ss223_application/IBSSApplicationUserResetPassResultAction.java
1
/**
2
 * Copyright (M) 2009 Penril Datability (M) Sdn Bhd All rights reserved.
3
 *
4
 * This software is copyrighted. Under the copyright laws, this software
5
 * may not be copied, in whole or in part, without prior written consent
6
 * of Penril Datability (M) Sdn Bhd or its assignees. This software is
7
 * provided under the terms of a license between Penril Datability (M)
8
 * Sdn Bhd and the recipient, and its use is subject to the terms of that
9
 * license.
10
 */
11

  
12
package com.ib.ibss.controller.actions.ss223_application;
13

  
14
import javax.servlet.http.HttpServletRequest;
15
import javax.servlet.http.HttpServletResponse;
16

  
17
import org.apache.struts.action.ActionErrors;
18
import org.apache.struts.action.ActionForm;
19
import org.apache.struts.action.ActionForward;
20
import org.apache.struts.action.ActionMapping;
21

  
22
import com.ib.ibss.common.constant.AdminPermissionModeType.ApplicationPermission;
23
import com.ib.ibss.common.constant.FunctionConstants.FunctionCodeEnum;
24
import com.ib.ibss.common.constant.JSPValidator;
25
import com.ib.ibss.common.utils.ActionTag;
26
import com.ib.ibss.common.utils.IBSSNavigationUtil;
27
import com.ib.ibss.enterprise.services.AccessConstants;
28
import com.ib.ibss.enterprise.services.common.SessionUserPermissionVerificationService;
29
import com.ib.ibss.enterprise.services.ss222_application.constants.IBSSApplicationUserConstants;
30
import com.ib.ibss.enterprise.services.ss223_application.IBSSApplicationUserResetPassResultServices;
31
import com.ib.ibss.error.exception.IBSSGenericException;
32
import com.ib.ibss.struts.utils.IBSSControllerAction;
33
import com.ib.ibss.struts.utils.IBSSDynaBean;
34
import com.ib.ibss.struts.utils.IBSSDynaBeanManager;
35
import com.ib.ibss.struts.utils.IBSSSessionObjects;
36

  
37
/**
38
 * This is the Action controller class to reset App Admin password
39
 */
40
public class IBSSApplicationUserResetPassResultAction extends IBSSControllerAction
41
{
42
	/**
43
	 * <pre>
44
	 * Create new desired IBSSDynaBean instance, form-beans: ibssUserForm and IBSSessionObjects.
45
	 * Check token value to make sure is valid session.
46
	 * Create new instance of IBSSRetailUserEnquiryResetPassServices and call userResetPassword() method.
47
	 * </pre>
48
	 *
49
	 * @param mapping The ActionMapping used to select this instance
50
	 * @param form The optional ActionForm bean for this request which is from form-bean.xml(if any)
51
	 * @param request The HTTP request we are processing
52
	 * @param response The HTTP response we are creating
53
	 * @return The requested ActionForward object
54
	 * @throws Exception if the application business logic throws an exception
55
	 *
56
	 * @see com.ib.ibss.struts.utils.IBSSControllerAction#execute(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
57
	 */
58
	public ActionForward execute (ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
59
	{
60
		noErrorHandling (request, mapping);
61
		IBSSDynaBean ibDynaBean = IBSSDynaBeanManager.createIBSSDynaBean (form, mapping);
62
		String action 			= request.getParameter(AccessConstants.ACTION);
63
		
64
		if(ActionTag.isBack(action))
65
		{
66
			action = ActionTag.BACK;
67
			ibDynaBean.set(IBSSApplicationUserConstants.PASSWORD, "");
68
			ibDynaBean.set(IBSSApplicationUserConstants.CONFIRM_PASSWORD, "");
69
			setForwardPage(action.toLowerCase ());
70
		}
71
		else
72
		{
73
			ActionErrors error = form.validate(createNewActionMapping(mapping, JSPValidator.APP_USER_RESET_PASSWORD_VALIDATION), request);
74
			
75
			if(!error.isEmpty ())
76
			{
77
				errorHandling(request, mapping, error);
78
			}
79
			else
80
			{
81
				try
82
				{
83
					checkToken (request, mapping, false);
84
					checkCredential(request, FunctionCodeEnum.APPLICATION_USER_MAINTENANCE);
85
					
86
					IBSSSessionObjects sessionObjects = new IBSSSessionObjects(request);
87
					IBSSNavigationUtil tree = new IBSSNavigationUtil(sessionObjects);
88
					tree.buildNavigation ();
89
					
90
					//Check User Permission Access
91
					Long actionId = ApplicationPermission.RESET_APPLICATION_USER.getActionId();
92
					SessionUserPermissionVerificationService access = new SessionUserPermissionVerificationService(sessionObjects);
93
					access.validateUser(actionId);
94
				
95
					IBSSApplicationUserResetPassResultServices services = new IBSSApplicationUserResetPassResultServices(sessionObjects);
96
					services.setIBSSDynaBean (ibDynaBean);
97
					services.userResetPassword();
98
				}
99
				catch (IBSSGenericException e)
100
				{
101
					errorHandling(request, mapping, e);
102
				}
103
			}
104
		}
105
		return super.execute (mapping, form, request, response);
106
	}
107
}
src/com/ib/ibss/enterprise/services/ss222_application/constants/IBSSApplicationUserConstants.java
43 43
	public static final String HAS_APP_CREATE_ACCESS			= "hasAppCreateAccess";
44 44
	public static final String HAS_APP_EDIT_ACCESS				= "hasAppEditAccess";
45 45
	public static final String HAS_APP_DELETE_ACCESS			= "hasAppDeleteAccess";
46
	public static final String HAS_APP_RESET_PWD_ACCESS			= "hasAppResetAccess";
46 47
	
47 48
	public static final String ENQUIRY_SEGMENT 					= "enquirySegment";
48 49
	public static final String PAGINATION 						= "pagination";
src/com/ib/ibss/enterprise/services/ss223_application/IBSSApplicationUserCreateResultServices.java
52 52
	{
53 53
		String logReason = "";
54 54
		Long status 	 = AuditLogConstants.UNSUCCESSFUL;
55
		Session session = null;
55 56
		
56 57
		try
57 58
		{
58
			String userAlias 			= getBeanMessage (IBSSApplicationUserConstants.USER_ALIAS);
59
			Integer selectedAppId 		= (Integer) getBeanMessageObj(IBSSApplicationUserConstants.SELECTED_APPLICATION_ID);
60
			String password 			= getBeanMessage (IBSSApplicationUserConstants.PASSWORD);
61
			String confirmPassword 		= getBeanMessage (IBSSApplicationUserConstants.CONFIRM_PASSWORD);
62
			String userDesc				= getBeanMessage (IBSSApplicationUserConstants.USER_DESCRIPTION);
63
			String adminUserAlias		= getIBSSessionObjects().getSessionUserAlias();
64
			String adminPassword		= getIBSSessionObjects().getSessionUserPassword();
59
			String userAlias 		= getBeanMessage (IBSSApplicationUserConstants.USER_ALIAS);
60
			Integer selectedAppId 	= (Integer) getBeanMessageObj(IBSSApplicationUserConstants.SELECTED_APPLICATION_ID);
61
			String password 		= getBeanMessage (IBSSApplicationUserConstants.PASSWORD);
62
			String confirmPassword 	= getBeanMessage (IBSSApplicationUserConstants.CONFIRM_PASSWORD);
63
			String userDesc			= getBeanMessage (IBSSApplicationUserConstants.USER_DESCRIPTION);
64
			String upassAdmin		= ResourcesUtils.getAppConfigValue("application.upass.admin.id");
65
			String upassAdminPass	= ResourcesUtils.getAppConfigValue("application.upass.admin.password");
65 66
			
66 67
			/* This service to be shared among admin features and MK features */
67 68
			AdminSharedServices service = new AdminSharedServices ();
......
71 72
			
72 73
			/*verify and create user*/
73 74
			MinimalUPassControllerV2 upass = new MinimalUPassControllerV2();
74
			Session session = HibernateUtils.currentSession();
75
			session = HibernateUtils.currentSession();
75 76
			session.beginTransaction();
76 77
			
77 78
			MinimalUserBean user = new MinimalUserBean();
......
80 81
			user.setDescription(userDesc);
81 82
			user.setUserType(MinimalConstants.UTYPE_STATE_USER);
82 83
			
83
			int rc = upass.addUser(adminUserAlias, adminPassword, user, UserAppAccess.TYPE_ADMIN, selectedAppId, session, true);
84
			int rc = upass.addUser(upassAdmin, upassAdminPass, user, UserAppAccess.TYPE_ADMIN, selectedAppId, session, true);
84 85
			
85 86
			if(rc != MinimalConstants.ERR_SUCCESS && rc != MinimalConstants.ERR_USERALIAS_NOT_FOUND)
86 87
			{
......
122 123
						getIBSSessionObjects ().getSessionUser ().getRoleId (),
123 124
						getIBSSessionObjects ().getSessionUser ().getGroupId (),
124 125
						getIBSSessionObjects ().getSessionUser ().getCurrentLoginIPAddress());
126
				
127
				session.close();
125 128
			}
126 129
			catch (Exception e)
127 130
			{
src/com/ib/ibss/enterprise/services/ss223_application/IBSSApplicationUserDeleteResultServices.java
51 51
	{
52 52
		IBSSLogger.debug (c_oClass, "Entering deleteAppUser");
53 53
		
54
		Long logStatus					= AuditLogConstants.UNSUCCESSFUL;
55
		IBSSDynaBean m_oViewBean 		= (IBSSDynaBean) getIBSSDynaBean ().get(IBSSApplicationUserConstants.APPLICATION_USER_VIEW_BEAN);
56
		String userId 					= (String)m_oViewBean.get(IBSSApplicationUserConstants.USER_ID);
57
		String logReason				= null;
54
		Long logStatus				= AuditLogConstants.UNSUCCESSFUL;
55
		IBSSDynaBean m_oViewBean 	= (IBSSDynaBean) getIBSSDynaBean ().get(IBSSApplicationUserConstants.APPLICATION_USER_VIEW_BEAN);
56
		String userId 				= (String)m_oViewBean.get(IBSSApplicationUserConstants.USER_ID);
57
		String logReason			= null;
58
		Session session 			= null;
58 59
		
59 60
		try
60 61
		{
......
63 64
			IBSSDynaBean userDetailBean = (IBSSDynaBean) getIBSSDynaBean().get(IBSSApplicationUserConstants.APPLICATION_USER_DETAILS_BEAN);
64 65
			String userAlias			= (String) userDetailBean.get (IBSSApplicationUserConstants.USER_ALIAS);
65 66
			Integer appId				= (Integer) userDetailBean.get (IBSSApplicationUserConstants.APPLICATION_ID);
67
			String upassAdmin			= ResourcesUtils.getAppConfigValue("application.upass.admin.id");
68
			String upassAdminPass		= ResourcesUtils.getAppConfigValue("application.upass.admin.password");
66 69
			
67 70
			UPassControllerV2 upass = new UPassControllerV2();
68 71
			
69
			Session session = HibernateUtils.currentSession();
72
			session = HibernateUtils.currentSession();
70 73
			session.beginTransaction();
71 74
			
72
			int rc = upass.deleteUserWithTheProfile(getIBSSessionObjects().getSessionUserAlias(), getIBSSessionObjects().getSessionUserPassword(),
73
					userAlias, appId, session);
75
			int rc = upass.deleteUserWithTheProfile(upassAdmin, upassAdminPass, userAlias, appId, session);
74 76
			
75 77
			if(rc != MinimalConstants.ERR_SUCCESS)
76 78
			{
......
115 117
						getIBSSessionObjects ().getSessionUser ().getRoleId (),
116 118
						getIBSSessionObjects ().getSessionUser ().getGroupId (),
117 119
						getIBSSessionObjects ().getSessionUser ().getCurrentLoginIPAddress());
120
				
121
				session.close();
118 122
			}
119 123
			catch (Exception e)
120 124
			{
src/com/ib/ibss/enterprise/services/ss223_application/IBSSApplicationUserEditResultServices.java
62 62
		MinimalUserBean user1 = null;
63 63
		MinimalUserBean user2 = null;
64 64
		
65
		Session session = null;
66
		
65 67
		String logReason = "";
66 68
		Long status 	 = AuditLogConstants.UNSUCCESSFUL;
67 69

  
......
73 75
			userAlias		= (String)getIBSSDynaBean().get (IBSSApplicationUserConstants.USER_ALIAS);
74 76
			userDescription = (String)getIBSSDynaBean().get (IBSSApplicationUserConstants.USER_DESCRIPTION);
75 77
			
78
			String upassAdmin		= ResourcesUtils.getAppConfigValue("application.upass.admin.id");
79
			String upassAdminPass	= ResourcesUtils.getAppConfigValue("application.upass.admin.password");
80
			
76 81
			/*Update user*/
77 82
			MinimalUPassControllerV2 upass = new MinimalUPassControllerV2();
78 83
			
79
			Session session = HibernateUtils.currentSession();
80
			session.beginTransaction();
81
			
82 84
			UserProfile profile = (UserProfile) getIBSSDynaBean().get (IBSSApplicationUserConstants.USER_PROFILE);
83 85
			user1 = profile.getMinUser();//before value
84 86
			user1.setDescription(userDescription);
......
86 88
			
87 89
			user2 = profile.getMinUser();//after value
88 90
			
89
			int rc = upass.updateProfileShallowly(getIBSSessionObjects().getSessionUserAlias(), 
90
					getIBSSessionObjects().getSessionUserPassword(), profile, session);
91
			session = HibernateUtils.currentSession();
92
			session.beginTransaction();
93
			
94
			int rc = upass.updateProfileShallowly(upassAdmin, upassAdminPass, profile, session);
91 95
			
92 96
			if(rc != MinimalConstants.ERR_SUCCESS)
93 97
			{
......
130 134
						getIBSSessionObjects ().getSessionUser ().getGroupId (),
131 135
						getIBSSessionObjects ().getSessionUser ().getCurrentLoginIPAddress(),
132 136
						BeanToBeanTransferUtils.convertBeanToStringForDiffValue(user1, user2));
137
				
138
				session.close();
133 139
			}
134 140
			catch (Exception e)
135 141
			{
src/com/ib/ibss/enterprise/services/ss223_application/IBSSApplicationUserMainServices.java
38 38
import com.ib.ibss.common.constant.IBSSCommonConstants;
39 39
import com.ib.ibss.common.utils.IBSSLogger;
40 40
import com.ib.ibss.common.utils.Pagination;
41
import com.ib.ibss.common.utils.ResourcesUtils;
41 42
import com.ib.ibss.enterprise.services.IBSSEnterpriseServicesWorkspace;
42 43
import com.ib.ibss.enterprise.services.common.SessionUserPermissionVerificationService;
43 44
import com.ib.ibss.enterprise.services.ss222_application.constants.IBSSApplicationUserConstants;
......
88 89
		
89 90
		try
90 91
		{
92
			String upassAdmin		= ResourcesUtils.getAppConfigValue("application.upass.admin.id");
93
			String upassAdminPass	= ResourcesUtils.getAppConfigValue("application.upass.admin.password");
94
			
91 95
			session = HibernateUtils.currentSession();
92 96
			session.beginTransaction();
93 97
			
......
98 102
			examples.add(new IbccUser());
99 103
			examples.add(new Im2uUser());
100 104
			
101
			List <UserProfile> userProfileList = upass.listProfilesByExamples(
102
					getIBSSessionObjects().getSessionUserAlias(), getIBSSessionObjects().getSessionUserPassword(),
103
					examples, null, null);
105
			List <UserProfile> userProfileList = upass.listProfilesByExamples(upassAdmin, upassAdminPass, examples, null, session);
104 106
			
105 107
			if (userProfileList == null)
106 108
			{
......
128 130
				startIndex 		= totalFixRow - userEnquiryRowPerPage;
129 131
				endIndex 		= Math.min(totalFixRow-1, appUserListSize-1);
130 132
				
131
				session = HibernateUtils.currentSession();
132
				session.beginTransaction();
133
//				session = HibernateUtils.currentSession();
134
//				session.beginTransaction();
133 135
				List <ClientApp> clientAppList = upass.listRecognizedClientApps(session);
134 136
				
135 137
				for(int i = startIndex; i <= endIndex; i++)
......
142 144
					appUserBean.set (IBSSApplicationUserConstants.USER_DESCRIPTION, user.getDescription());
143 145
					appUserBean.set (IBSSApplicationUserConstants.USER_ALIAS, user.getUserAlias());
144 146
					
145
					session = HibernateUtils.currentSession();
146
					session.beginTransaction();
147
//					session = HibernateUtils.currentSession();
148
//					session.beginTransaction();
147 149
					AccessCheckResult result = upass.checkAppAccess(user.getUserAlias(), user.getDoubleHashedPassword(), session);
148 150
					
149 151
					for(ClientApp app : clientAppList)
......
182 184
				Boolean hasCreate 	= false;
183 185
				Boolean hasEdit 	= false;
184 186
				Boolean hasDelete 	= false;
187
				Boolean hasReset 	= false;
185 188
				
186 189
				if(appUserAccess.isEditable ()){
187 190
					Long createId 	= ApplicationPermission.CREATE_APPLICATION_USER.getActionId();
188 191
					Long editId 	= ApplicationPermission.EDIT_APPLICATION_USER.getActionId();
189 192
					Long deleteId 	= ApplicationPermission.DELETE_APPLICATION_USER.getActionId();
193
					Long resetId 	= ApplicationPermission.RESET_APPLICATION_USER.getActionId();
190 194
					
191 195
					SessionUserPermissionVerificationService accessService = new SessionUserPermissionVerificationService(getIBSSessionObjects());
192 196
					hasCreate 	= accessService.checkUserAccess(createId);
193 197
					hasEdit		= accessService.checkUserAccess(editId);
194 198
					hasDelete 	= accessService.checkUserAccess(deleteId);
199
					hasReset	= accessService.checkUserAccess(resetId);
195 200
					
196 201
					getIBSSDynaBean ().set (IBSSApplicationUserConstants.HAS_APP_CREATE_ACCESS,	hasCreate);
197 202
					getIBSSDynaBean ().set (IBSSApplicationUserConstants.HAS_APP_EDIT_ACCESS,	hasEdit);
198 203
					getIBSSDynaBean ().set (IBSSApplicationUserConstants.HAS_APP_DELETE_ACCESS,	hasDelete);
204
					getIBSSDynaBean ().set (IBSSApplicationUserConstants.HAS_APP_RESET_PWD_ACCESS,	hasReset);
199 205
				} else {
200 206
					getIBSSDynaBean ().set (IBSSApplicationUserConstants.HAS_APP_CREATE_ACCESS,	hasCreate);
201 207
					getIBSSDynaBean ().set (IBSSApplicationUserConstants.HAS_APP_EDIT_ACCESS,	hasEdit);
202 208
					getIBSSDynaBean ().set (IBSSApplicationUserConstants.HAS_APP_DELETE_ACCESS,	hasDelete);
209
					getIBSSDynaBean ().set (IBSSApplicationUserConstants.HAS_APP_RESET_PWD_ACCESS,	hasReset);
203 210
				}
204 211
			}
205 212
			
......
208 215
		{
209 216
			IBSSErrorHandler.handleServiceError (e, c_oClass);
210 217
		}
218
		finally
219
		{
220
			session.close();
221
		}
211 222
		IBSSLogger.debug (c_oClass, "Exiting execute");
212 223
	}
213 224
}
src/com/ib/ibss/enterprise/services/ss223_application/IBSSApplicationUserResetPassResultServices.java
1
/**
2
 * Copyright (M) 2010 Penril Datability (M) Sdn Bhd All rights reserved.
3
 *
4
 * This software is copyrighted. Under the copyright laws, this software
5
 * may not be copied, in whole or in part, without prior written consent
6
 * of Penril Datability (M) Sdn Bhd or its assignees. This software is
7
 * provided under the terms of a license between Penril Datability (M)
8
 * Sdn Bhd and the recipient, and its use is subject to the terms of that
9
 * license.
10
 */
11

  
12
package com.ib.ibss.enterprise.services.ss223_application;
13

  
14
import my.com.upass.MinimalUPassControllerV2;
15
import net.penril.generic.hibernate.HibernateUtils;
16
import net.penril.ibss.audit.log.AuditLogConstants;
17
import net.penril.ibss.audit.log.USER_ACTIVITY_TYTPE;
18

  
19
import org.hibernate.Session;
20

  
21
import com.ib.ibss.common.constant.ExceptionErrors;
22
import com.ib.ibss.common.utils.IBSSLogger;
23
import com.ib.ibss.common.utils.ResourcesUtils;
24
import com.ib.ibss.enterprise.services.IBSSEnterpriseServicesWorkspace;
25
import com.ib.ibss.enterprise.services.StatusConstants;
26
import com.ib.ibss.enterprise.services.ss102_user_admin.constants.IBSSUserConstants;
27
import com.ib.ibss.enterprise.services.ss222_application.constants.IBSSApplicationUserConstants;
28
import com.ib.ibss.error.exception.IBSSBusinessException;
29
import com.ib.ibss.error.exception.IBSSGenericException;
30
import com.ib.ibss.error.handler.IBSSErrorHandler;
31
import com.ib.ibss.struts.utils.IBSSDynaBean;
32
import com.ib.ibss.struts.utils.IBSSSessionObjects;
33

  
34
/**
35
 * Get necessary details information for performing app Admin reset password
36
 */
37
public class IBSSApplicationUserResetPassResultServices extends IBSSEnterpriseServicesWorkspace
38
{
39
	private static Class<IBSSApplicationUserResetPassResultServices> c_oClass = IBSSApplicationUserResetPassResultServices.class;
40
	
41
	/**
42
	 * Class constructor specifying session object.
43
	 *
44
	 * @param sessionObjects session object containing all information stored in HTTP session
45
	 */
46
	public IBSSApplicationUserResetPassResultServices(IBSSSessionObjects sessionObjects)
47
	{
48
		super(sessionObjects);
49
	}
50
	
51
	public void userResetPassword() throws IBSSGenericException
52
	{
53
		IBSSLogger.debug (c_oClass, "Entering userResetPassword");
54
		
55
		Long logStatus 			= AuditLogConstants.UNSUCCESSFUL;
56
		String upassAdmin		= ResourcesUtils.getAppConfigValue("application.upass.admin.id");
57
		String upassAdminPass	= ResourcesUtils.getAppConfigValue("application.upass.admin.password");
58
		String password 		= getBeanMessage (IBSSApplicationUserConstants.PASSWORD);
59
		String confirmPassword 	= getBeanMessage (IBSSApplicationUserConstants.CONFIRM_PASSWORD);
60
		IBSSDynaBean detailBean = (IBSSDynaBean) getIBSSDynaBean().get(IBSSApplicationUserConstants.APPLICATION_USER_DETAILS_BEAN);
61
		Long userID				= (Long) detailBean.get (IBSSApplicationUserConstants.USER_ID);
62
		String userAlias 		= (String) detailBean.get (IBSSApplicationUserConstants.USER_ALIAS);
63
		String logReason		= null;
64
		
65
		try
66
		{
67
			/* Match password and re-type password */
68
			checkPasswordMatching(password, confirmPassword);
69
			
70
			/* Reset password */
71
			MinimalUPassControllerV2 upass = new MinimalUPassControllerV2();
72
			Session session = HibernateUtils.currentSession();
73
			session.beginTransaction();
74
			int rc = upass.resetPassword_withAppChecked(upassAdmin, upassAdminPass, userAlias, password);
75
			System.out.println("rc:"+rc);
76
			
77
			switch(rc)
78
			{
79
				case StatusConstants.ERR_SUCCESS:
80
					getIBSSDynaBean().set (IBSSApplicationUserConstants.PASSWORD, "");
81
					getIBSSDynaBean().set (IBSSApplicationUserConstants.CONFIRM_PASSWORD, "");
82
					getIBSSDynaBean().set (IBSSApplicationUserConstants.USER_ID, String.valueOf (userID));
83
					logReason = "Update Successful";
84
					break;
85
				default:
86
					logReason = "Unhandled response: " + rc;
87
					throw IBSSErrorHandler.createBusinessException (IBSSBusinessException.LOGIN, ExceptionErrors.ERR_SYSTEM_NOT_READY);
88
			}
89
			
90
			/* Log successful */
91
			logStatus = AuditLogConstants.SUCCESSFUL;
92
				
93
			setBeanMessage (IBSSUserConstants.JSP_TITLE, 
94
					ResourcesUtils.getApplicationResourceMessage ("appuser.word") + ": " + userAlias + " " +
95
					ResourcesUtils.getApplicationResourceMessage ("user.has.been.successfully") + " " +
96
					ResourcesUtils.getApplicationResourceMessage ("user.reset.desc"));
97
		}
98
		catch (Exception e)
99
		{
100
			IBSSErrorHandler.handleServiceError (e, c_oClass);
101
		}
102
		finally
103
		{
104
			try
105
			{
106
				getAuditLogDAO ().logActivity (USER_ACTIVITY_TYTPE.RESET_APP_USER.getID(), 
107
						USER_ACTIVITY_TYTPE.RESET_APP_USER.getDescription(), 
108
						logStatus, 
109
						logReason, 
110
						getIBSSessionObjects ().getSessionUserAlias (), 
111
						getIBSSessionObjects ().getSessionUser ().getRoleId (),
112
						getIBSSessionObjects ().getSessionUser ().getGroupId (),
113
						getIBSSessionObjects ().getSessionUser ().getCurrentLoginIPAddress());
114
			}
115
			catch (Exception e)
116
			{
117
				IBSSErrorHandler.handleServiceError (e, c_oClass);
118
			}
119
		}
120
		IBSSLogger.debug (c_oClass, "Exiting userResetPassword");
121
	}
122

  
123
	private void checkPasswordMatching (String password, String confirmPassword) throws IBSSGenericException
124
	{
125
		IBSSLogger.debug (c_oClass, "Entering checkPasswordMatching");
126
		
127
		if (!password.equals(confirmPassword))
128
		{
129
			String[] params = new String[1];
130
			params[0] = ResourcesUtils.getApplicationResourceMessage("appuser.user.password");
131
			throw IBSSErrorHandler.createBusinessException (IBSSBusinessException.LOGIN, ExceptionErrors.LOGIN_PASSWORD_NOT_MATCH, params);
132
		}
133
		
134
		IBSSLogger.debug (c_oClass, "Exiting checkPasswordMatching");
135
	}
136
	
137
}

Also available in: Unified diff