=== modified file 'dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/AccountController.java' --- dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/AccountController.java 2015-07-08 07:25:31 +0000 +++ dhis-2/dhis-web/dhis-web-api/src/main/java/org/hisp/dhis/webapi/controller/AccountController.java 2015-07-08 08:12:45 +0000 @@ -33,6 +33,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hisp.dhis.configuration.ConfigurationService; +import org.hisp.dhis.dxf2.webmessage.WebMessageException; import org.hisp.dhis.organisationunit.OrganisationUnit; import org.hisp.dhis.security.RestoreOptions; import org.hisp.dhis.security.RestoreType; @@ -44,7 +45,9 @@ import org.hisp.dhis.user.UserAuthorityGroup; import org.hisp.dhis.user.UserCredentials; import org.hisp.dhis.user.UserService; +import org.hisp.dhis.webapi.service.WebMessageService; import org.hisp.dhis.webapi.utils.ContextUtils; +import org.hisp.dhis.webapi.utils.WebMessageUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -107,41 +110,41 @@ @Autowired private SystemSettingManager systemSettingManager; + @Autowired + private WebMessageService webMessageService; + private ObjectMapper objectMapper = new ObjectMapper(); @RequestMapping( value = "/recovery", method = RequestMethod.POST ) public void recoverAccount( @RequestParam String username, HttpServletRequest request, - HttpServletResponse response ) + HttpServletResponse response ) throws WebMessageException { String rootPath = ContextUtils.getContextPath( request ); if ( !systemSettingManager.accountRecoveryEnabled() ) { - ContextUtils.conflictResponse( response, "Account recovery is not enabled" ); - return; + throw new WebMessageException( WebMessageUtils.conflict( "Account recovery is not enabled" ) ); } UserCredentials credentials = userService.getUserCredentialsByUsername( username ); if ( credentials == null ) { - ContextUtils.conflictResponse( response, "User does not exist: " + username ); - return; + throw new WebMessageException( WebMessageUtils.conflict( "User does not exist: " + username ) ); } boolean recover = securityService.sendRestoreMessage( credentials, rootPath, RestoreOptions.RECOVER_PASSWORD_OPTION ); if ( !recover ) { - ContextUtils.conflictResponse( response, "Account could not be created" ); - return; + throw new WebMessageException( WebMessageUtils.conflict( "Account could not be recovered" ) ); } log.info( "Recovery message sent for user: " + username ); - ContextUtils.okResponse( response, "Recovery message sent" ); + webMessageService.send( WebMessageUtils.ok( "Recovery message sent" ), response, request ); } @RequestMapping( value = "/restore", method = RequestMethod.POST ) @@ -151,45 +154,40 @@ @RequestParam String code, @RequestParam String password, HttpServletRequest request, - HttpServletResponse response ) + HttpServletResponse response ) throws WebMessageException { if ( !systemSettingManager.accountRecoveryEnabled() ) { - ContextUtils.conflictResponse( response, "Account recovery is not enabled" ); - return; + throw new WebMessageException( WebMessageUtils.conflict( "Account recovery is not enabled" ) ); } if ( password == null || !ValidationUtils.passwordIsValid( password ) ) { - ContextUtils.badRequestResponse( response, "Password is not specified or invalid" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Password is not specified or invalid" ) ); } if ( password.trim().equals( username.trim() ) ) { - ContextUtils.badRequestResponse( response, "Password cannot be equal to username" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Password cannot be equal to username" ) ); } UserCredentials credentials = userService.getUserCredentialsByUsername( username ); if ( credentials == null ) { - ContextUtils.conflictResponse( response, "User does not exist: " + username ); - return; + throw new WebMessageException( WebMessageUtils.conflict( "User does not exist: " + username ) ); } boolean restore = securityService.restore( credentials, token, code, password, RestoreType.RECOVER_PASSWORD ); if ( !restore ) { - ContextUtils.badRequestResponse( response, "Account could not be restored" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Account could not be restored" ) ); } log.info( "Account restored for user: " + username ); - ContextUtils.okResponse( response, "Account restored" ); + webMessageService.send( WebMessageUtils.ok( "Account restored" ), response, request ); } @RequestMapping( method = RequestMethod.POST ) @@ -207,7 +205,7 @@ @RequestParam( value = "recaptcha_challenge_field", required = false ) String recapChallenge, @RequestParam( value = "recaptcha_response_field", required = false ) String recapResponse, HttpServletRequest request, - HttpServletResponse response ) + HttpServletResponse response ) throws WebMessageException { UserCredentials credentials = null; @@ -221,16 +219,14 @@ if ( credentials == null ) { - ContextUtils.badRequestResponse( response, "Invitation link not valid" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Invitation link not valid" ) ); } boolean canRestore = securityService.canRestore( credentials, inviteToken, inviteCode, RestoreType.INVITE ); if ( !canRestore ) { - ContextUtils.badRequestResponse( response, "Invitation code not valid" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Invitation code not valid" ) ); } RestoreOptions restoreOptions = securityService.getRestoreOptions( inviteToken ); @@ -243,8 +239,7 @@ if ( !allowed ) { - ContextUtils.badRequestResponse( response, "User self registration is not allowed" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "User self registration is not allowed" ) ); } } @@ -268,71 +263,61 @@ if ( username == null || username.trim().length() > MAX_LENGTH ) { - ContextUtils.badRequestResponse( response, "User name is not specified or invalid" ); + throw new WebMessageException( WebMessageUtils.badRequest( "User name is not specified or invalid" ) ); } UserCredentials usernameAlreadyTakenCredentials = userService.getUserCredentialsByUsername( username ); if ( canChooseUsername && usernameAlreadyTakenCredentials != null ) { - ContextUtils.badRequestResponse( response, "User name is already taken" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "User name is already taken" ) ); } if ( firstName == null || firstName.trim().length() > MAX_LENGTH ) { - ContextUtils.badRequestResponse( response, "First name is not specified or invalid" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "First name is not specified or invalid" ) ); } if ( surname == null || surname.trim().length() > MAX_LENGTH ) { - ContextUtils.badRequestResponse( response, "Last name is not specified or invalid" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Last name is not specified or invalid" ) ); } if ( password == null || !ValidationUtils.passwordIsValid( password ) ) { - ContextUtils.badRequestResponse( response, "Password is not specified or invalid" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Password is not specified or invalid" ) ); } if ( password.trim().equals( username != null ? username.trim() : null ) ) { - ContextUtils.badRequestResponse( response, "Password cannot be equal to username" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Password cannot be equal to username" ) ); } if ( email == null || !ValidationUtils.emailIsValid( email ) ) { - ContextUtils.badRequestResponse( response, "Email is not specified or invalid" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Email is not specified or invalid" ) ); } if ( phoneNumber == null || phoneNumber.trim().length() > 30 ) { - ContextUtils.badRequestResponse( response, "Phone number is not specified or invalid" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Phone number is not specified or invalid" ) ); } if ( employer == null || employer.trim().length() > MAX_LENGTH ) { - ContextUtils.badRequestResponse( response, "Employer is not specified or invalid" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Employer is not specified or invalid" ) ); } if ( !systemSettingManager.selfRegistrationNoRecaptcha() ) { if ( recapChallenge == null ) { - ContextUtils.badRequestResponse( response, "Recaptcha challenge must be specified" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Recaptcha challenge must be specified" ) ); } if ( recapResponse == null ) { - ContextUtils.badRequestResponse( response, "Recaptcha response must be specified" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Recaptcha response must be specified" ) ); } // --------------------------------------------------------------------- @@ -343,8 +328,7 @@ if ( results == null || results.length == 0 ) { - ContextUtils.errorResponse( response, "Captcha could not be verified due to a server error" ); - return; + throw new WebMessageException( WebMessageUtils.error( "Captcha could not be verified due to a server error" ) ); } // --------------------------------------------------------------------- @@ -355,8 +339,7 @@ { log.info( "Recaptcha failed with code: " + (results.length > 0 ? results[1] : "") ); - ContextUtils.badRequestResponse( response, "The characters you entered did not match the word verification, try again" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "The characters you entered did not match the word verification, try again" ) ); } } @@ -372,8 +355,7 @@ { log.info( "Invite restore failed for: " + inviteUsername ); - ContextUtils.badRequestResponse( response, "Unable to create invited user account" ); - return; + throw new WebMessageException( WebMessageUtils.badRequest( "Unable to create invited user account" ) ); } User user = credentials.getUser(); @@ -431,7 +413,7 @@ authenticate( username, password, authorities, request ); - ContextUtils.createdResponse( response, "Account created", null ); + webMessageService.send( WebMessageUtils.ok( "Account created" ), response, request ); } @RequestMapping( value = "/password", method = RequestMethod.POST ) === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/useraccount/account.js' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/useraccount/account.js 2014-01-17 03:48:57 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/useraccount/account.js 2015-07-08 08:12:45 +0000 @@ -1,47 +1,47 @@ var validationRules = { - rules: { - firstName: { - required: true, - rangelength: [ 2, 80 ] - }, - surname: { - required: true, - rangelength: [ 2, 80 ] - }, - username: { - required: true, - rangelength: [ 4, 80 ], - remote: "../../api/account/username" - }, - password: { - required: true, - rangelength: [ 8, 80 ], - password: true, - notequalto: "#username", - }, - retypePassword: { - required: true, - equalTo: "#password", - }, - email: { - required: true, - email: true, - rangelength: [ 4, 80 ] - }, - inviteEmail : { - required : true, - email : true, - rangelength : [ 4, 80 ] - }, - phoneNumber: { - required: true, - rangelength: [ 6, 30 ] - }, - employer: { - required: true, - rangelength: [ 2, 80 ] - } + rules: { + firstName: { + required: true, + rangelength: [2, 80] + }, + surname: { + required: true, + rangelength: [2, 80] + }, + username: { + required: true, + rangelength: [4, 80], + remote: "../../api/account/username" + }, + password: { + required: true, + rangelength: [8, 80], + password: true, + notequalto: "#username", + }, + retypePassword: { + required: true, + equalTo: "#password", + }, + email: { + required: true, + email: true, + rangelength: [4, 80] + }, + inviteEmail: { + required: true, + email: true, + rangelength: [4, 80] + }, + phoneNumber: { + required: true, + rangelength: [6, 30] + }, + employer: { + required: true, + rangelength: [2, 80] } + } }; @@ -50,77 +50,78 @@ $(document).ready(function() { - var locale = localStorage[login.localeKey]; - - if( undefined !== locale && locale ) { - login.changeLocale(locale); - } - - if( recaptchaEnabled() ) { - Recaptcha.create("6LcM6tcSAAAAANwYsFp--0SYtcnze_WdYn8XwMMk", "recaptchaDiv", { - theme: "white" - }); - } - - $("#accountForm").validate({ - rules: validationRules.rules, - submitHandler: accountSubmitHandler, - errorPlacement: function( error, element ) { - element.parent("td").append("
").append(error); - } + var locale = localStorage[login.localeKey]; + + if( undefined !== locale && locale ) { + login.changeLocale(locale); + } + + if( recaptchaEnabled() ) { + Recaptcha.create("6LcM6tcSAAAAANwYsFp--0SYtcnze_WdYn8XwMMk", "recaptchaDiv", { + theme: "white" }); + } + + $("#accountForm").validate({ + rules: validationRules.rules, + submitHandler: accountSubmitHandler, + errorPlacement: function(error, element) { + element.parent("td").append("
").append(error); + } + }); }); function accountSubmitHandler() { - if( recaptchaEnabled() ) { - if( $.trim($("#recaptcha_challenge_field").val()).length == 0 || - $.trim($("#recaptcha_response_field").val()).length == 0 ) { - $("#messageSpan").show().text("Please enter a value for the word verification above"); - return false; - } - } - - $("#submitButton").attr("disabled", "disabled"); - - $.ajax({ - url: "../../api/account", - data: $("#accountForm").serialize(), - type: "post", - success: function( data ) { - window.location.href = "../../dhis-web-commons-about/redirect.action"; - }, - error: function( jqXHR, textStatus, errorThrown ) { - $("#messageSpan").show().text(jqXHR.responseText); - reloadRecaptcha(); - $("#submitButton").removeAttr("disabled"); - } - }); + if( recaptchaEnabled() ) { + if( $.trim($("#recaptcha_challenge_field").val()).length == 0 || + $.trim($("#recaptcha_response_field").val()).length == 0 ) { + $("#messageSpan").show().text("Please enter a value for the word verification above"); + return false; + } + } + + $("#submitButton").attr("disabled", "disabled"); + + $.ajax({ + url: "../../api/account", + data: $("#accountForm").serialize(), + type: "post", + success: function(data) { + window.location.href = "../../dhis-web-commons-about/redirect.action"; + }, + error: function(jqXHR, textStatus, errorThrown) { + var error = JSON.parse(jqXHR.responseText); + $("#messageSpan").show().text(error.message); + reloadRecaptcha(); + $("#submitButton").removeAttr("disabled"); + } + }); } function recaptchaEnabled() { - return typeof Recaptcha !== 'undefined'; + return typeof Recaptcha !== 'undefined'; } function reloadRecaptcha() { - if( recaptchaEnabled() ) { - Recaptcha.reload(); - } + if( recaptchaEnabled() ) { + Recaptcha.reload(); + } } -login.changeLocale = function( locale ) { - $.get('accountStrings.action?loc=' + locale, function( json ) { - $('#create_new_account').html(json.create_new_account); - $('#label_firstName').html(json.name); - $('#firstName').attr("placeholder", json.first_name); - $('#surname').attr("placeholder", json.last_name); - $('#label_username').html(json.user_name); - $('#label_password').html(json.password); - $('#label_retypePassword').html(json.confirm_password); - $('#label_email').html(json.email); - $('#label_mobile_phone').html(json.mobile_phone); - $('#label_employer').html(json.employer); - $('#label_recaptchaDiv').html(json.prove_not_robot); - $('#cant_read_words').html(json.cant_read_words); - $('#submitButton').val(json.create); - }); +login.changeLocale = function(locale) { + $.get('accountStrings.action?loc=' + locale, function(json) { + $('#create_new_account').html(json.create_new_account); + $('#label_firstName').html(json.name); + $('#firstName').attr("placeholder", json.first_name); + $('#surname').attr("placeholder", json.last_name); + $('#label_username').html(json.user_name); + $('#label_password').html(json.password); + $('#label_retypePassword').html(json.confirm_password); + $('#label_email').html(json.email); + $('#label_mobile_phone').html(json.mobile_phone); + $('#label_employer').html(json.employer); + $('#label_recaptchaDiv').html(json.prove_not_robot); + $('#cant_read_words').html(json.cant_read_words); + $('#submitButton').val(json.create); + }); } === modified file 'dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/useraccount/restore.js' --- dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/useraccount/restore.js 2015-07-08 07:25:31 +0000 +++ dhis-2/dhis-web/dhis-web-commons-resources/src/main/webapp/dhis-web-commons/javascripts/useraccount/restore.js 2015-07-08 08:12:45 +0000 @@ -16,7 +16,6 @@ }; $(document).ready(function() { - $("#restoreForm").validate({ rules: validationRules.rules, submitHandler: restoreSubmitHandler,