diff --git a/mifosng-data/src/main/java/org/mifosng/data/AppUserData.java b/mifosng-data/src/main/java/org/mifosng/data/AppUserData.java index 53a2636a0..e7879f647 100644 --- a/mifosng-data/src/main/java/org/mifosng/data/AppUserData.java +++ b/mifosng-data/src/main/java/org/mifosng/data/AppUserData.java @@ -17,7 +17,7 @@ public class AppUserData { private String lastname; private String email; - private List allowedOffices = new ArrayList(); + private List allowedOffices = new ArrayList(); private List availableRoles = new ArrayList(); private List selectedRoles = new ArrayList(); @@ -85,11 +85,11 @@ public class AppUserData { this.officeName = officeName; } - public List getAllowedOffices() { + public List getAllowedOffices() { return allowedOffices; } - public void setAllowedOffices(List allowedOffices) { + public void setAllowedOffices(List allowedOffices) { this.allowedOffices = allowedOffices; } diff --git a/mifosng-data/src/main/java/org/mifosng/data/AuthenticatedUserData.java b/mifosng-data/src/main/java/org/mifosng/data/AuthenticatedUserData.java index 783d24191..c3a03c4ee 100644 --- a/mifosng-data/src/main/java/org/mifosng/data/AuthenticatedUserData.java +++ b/mifosng-data/src/main/java/org/mifosng/data/AuthenticatedUserData.java @@ -9,6 +9,7 @@ import javax.xml.bind.annotation.XmlRootElement; public class AuthenticatedUserData { private String username; + private Long userId; private String base64EncodedAuthenticationKey; private boolean authenticated = false; private Collection permissions = new ArrayList(); @@ -53,4 +54,12 @@ public class AuthenticatedUserData { String base64EncodedAuthenticationKey) { this.base64EncodedAuthenticationKey = base64EncodedAuthenticationKey; } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } } \ No newline at end of file diff --git a/mifosng-data/src/main/java/org/mifosng/data/OfficeLookup.java b/mifosng-data/src/main/java/org/mifosng/data/OfficeLookup.java index 1b0947f91..ef73d26a0 100644 --- a/mifosng-data/src/main/java/org/mifosng/data/OfficeLookup.java +++ b/mifosng-data/src/main/java/org/mifosng/data/OfficeLookup.java @@ -4,7 +4,7 @@ import java.io.Serializable; import javax.xml.bind.annotation.XmlRootElement; -@XmlRootElement(name = "office lookup") +@XmlRootElement(name = "officeLookup") public class OfficeLookup implements Serializable { private Long id; diff --git a/mifosng-data/src/main/java/org/mifosng/data/command/ChangePasswordCommand.java b/mifosng-data/src/main/java/org/mifosng/data/command/ChangePasswordCommand.java deleted file mode 100644 index 256a33bb0..000000000 --- a/mifosng-data/src/main/java/org/mifosng/data/command/ChangePasswordCommand.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.mifosng.data.command; - -import javax.xml.bind.annotation.XmlRootElement; - -@XmlRootElement -public class ChangePasswordCommand { - - private String password; - private String passwordrepeat; - - public ChangePasswordCommand() { - // - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getPasswordrepeat() { - return passwordrepeat; - } - - public void setPasswordrepeat(String passwordrepeat) { - this.passwordrepeat = passwordrepeat; - } -} \ No newline at end of file diff --git a/mifosng-data/src/main/java/org/mifosng/data/command/UserCommand.java b/mifosng-data/src/main/java/org/mifosng/data/command/UserCommand.java index f725cc6d2..bd0c25c3d 100644 --- a/mifosng-data/src/main/java/org/mifosng/data/command/UserCommand.java +++ b/mifosng-data/src/main/java/org/mifosng/data/command/UserCommand.java @@ -15,6 +15,7 @@ public class UserCommand implements Serializable { private String firstname; private String lastname; private String password; + private String repeatPassword; private String email; private Long officeId; @@ -100,4 +101,12 @@ public class UserCommand implements Serializable { public void setRoles(String... roles) { this.roles = roles; } + + public String getRepeatPassword() { + return repeatPassword; + } + + public void setRepeatPassword(String repeatPassword) { + this.repeatPassword = repeatPassword; + } } \ No newline at end of file diff --git a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/ApplicationPagesRoutesController.java b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/ApplicationPagesRoutesController.java index c908b0f60..f7dae0f46 100644 --- a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/ApplicationPagesRoutesController.java +++ b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/ApplicationPagesRoutesController.java @@ -79,6 +79,7 @@ public class ApplicationPagesRoutesController { BasicAuthUserDetails userDetails = (BasicAuthUserDetails) authentication.getPrincipal(); model.addAttribute("basicAuthKey", userDetails.getBasicAuthenticationKey()); model.addAttribute("baseApiUrl", userDetails.getFullApiUrl()); + model.addAttribute("userId", userDetails.getUserId()); return "admin/accountsettings"; } diff --git a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/infrastructure/ApiDelegatingAuthenticationProvider.java b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/infrastructure/ApiDelegatingAuthenticationProvider.java index 82bab0f7b..e34a7f70a 100644 --- a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/infrastructure/ApiDelegatingAuthenticationProvider.java +++ b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/infrastructure/ApiDelegatingAuthenticationProvider.java @@ -65,7 +65,7 @@ public class ApiDelegatingAuthenticationProvider extends AbstractUserDetailsAuth authorities.add(new SimpleGrantedAuthority(permission)); } User user = new User(authenticatedUserData.getUsername(), "[not needed]", authorities); - userDetails = new BasicAuthUserDetails(user, authenticatedUserData.getBase64EncodedAuthenticationKey(), platformApiUrl); + userDetails = new BasicAuthUserDetails(user, authenticatedUserData.getBase64EncodedAuthenticationKey(), platformApiUrl, authenticatedUserData.getUserId()); } return userDetails; @@ -80,8 +80,8 @@ public class ApiDelegatingAuthenticationProvider extends AbstractUserDetailsAuth private HttpEntity authRequest() { HttpHeaders requestHeaders = new HttpHeaders(); - requestHeaders.set("Accept", "application/xml"); - requestHeaders.set("Content-Type", "application/xml"); + requestHeaders.set("Accept", "application/json"); + requestHeaders.set("Content-Type", "application/json"); HttpEntity requestEntity = new HttpEntity(requestHeaders); return requestEntity; diff --git a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/infrastructure/BasicAuthUserDetails.java b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/infrastructure/BasicAuthUserDetails.java index 9a716a168..02147eeae 100644 --- a/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/infrastructure/BasicAuthUserDetails.java +++ b/mifosng-individual-lending-app/src/main/java/org/mifosng/ui/infrastructure/BasicAuthUserDetails.java @@ -11,11 +11,13 @@ public class BasicAuthUserDetails implements UserDetails { private final User user; private final String basicAuthenticationKey; private final String fullApiUrl; + private final Long userId; - public BasicAuthUserDetails(User user, String basicAuthenticationKey, String fullApiUrl) { + public BasicAuthUserDetails(User user, String basicAuthenticationKey, String fullApiUrl, Long userId) { this.user = user; this.basicAuthenticationKey = basicAuthenticationKey; this.fullApiUrl = fullApiUrl; + this.userId = userId; } @Override @@ -60,4 +62,8 @@ public class BasicAuthUserDetails implements UserDetails { public String getFullApiUrl() { return this.fullApiUrl; } + + public Long getUserId() { + return userId; + } } \ No newline at end of file diff --git a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/admin/accountsettings.jsp b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/admin/accountsettings.jsp index ffff7516c..f210d4719 100644 --- a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/admin/accountsettings.jsp +++ b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/admin/accountsettings.jsp @@ -23,6 +23,7 @@ $(document).ready(function() { // basic auth details var base64 = "${basicAuthKey}"; var baseApiUrl = "${baseApiUrl}"; + var userId = "${userId}"; // these helpers are registered for the jsViews and jsRender functionality to fix bug with display zero! $.views.registerHelpers({ @@ -215,7 +216,6 @@ $(document).ready(function() { dataType: 'json', cache: false, beforeSend: function(xhr) { - console.log("base64: " + base64); xhr.setRequestHeader("Authorization", "Basic " + base64); }, success: function(data, textStatus, jqXHR) { @@ -249,7 +249,6 @@ $(document).ready(function() { data: newFormData, cache: false, beforeSend: function(xhr) { - console.log("base64: " + base64); xhr.setRequestHeader("Authorization", "Basic " + base64); }, success: saveSuccessFunction, @@ -295,6 +294,78 @@ $(document).ready(function() { }); } + function popupDialogWithPostOnlyFormView(postOrPutUrl, submitType, titleCode, templateSelector, width, height, saveSuccessFunction) { + + var dialogDiv = $("
"); + + var data = new Object(); + var formHtml = $(templateSelector).render(data); + + dialogDiv.append(formHtml); + + var saveButton = jQuery.i18n.prop('dialog.button.save'); + var cancelButton = jQuery.i18n.prop('dialog.button.cancel'); + + var buttonsOpts = {}; + buttonsOpts[saveButton] = function() { + + $('.multiSelectedItems option').each(function(i) { + $(this).attr("selected", "selected"); + }); + + var newFormData = JSON.stringify($('#entityform').serializeObject()); + console.log(newFormData); + + var jqxhr = $.ajax({ + url: postOrPutUrl, + type: submitType, + contentType: 'application/json', + dataType: 'json', + cache: false, + data: newFormData, + beforeSend: function(xhr) { + xhr.setRequestHeader("Authorization", "Basic " + base64); + }, + success: function(data, textStatus, jqXHR) { + dialogDiv.dialog("close"); + $newtabs.tabs('load', tabIndex); + } + }); + + jqxhr.error(function(jqXHR, textStatus, errorThrown) { + handleXhrError(jqXHR, textStatus, errorThrown, "#formErrorsTemplate", "#formerrors"); + }); + }; + + buttonsOpts[cancelButton] = function() {$(this).dialog( "close" );}; + + dialogDiv.dialog({ + title: jQuery.i18n.prop(titleCode), + width: width, + height: height, + modal: true, + buttons: buttonsOpts, + close: function() { + // if i dont do this, theres a problem with errors being appended to dialog view second time round + $(this).remove(); + }, + open: function (event, ui) { + $('.multiadd').click(function() { + return !$('.multiNotSelectedItems option:selected').remove().appendTo('#selectedItems'); + }); + + $('.multiremove').click(function() { + return !$('.multiSelectedItems option:selected').remove().appendTo('#notSelectedItems'); + }); + + $('.datepickerfield').datepicker({constrainInput: true, dateFormat: 'dd MM yy'}); + + $("#entityform textarea").first().focus(); + $('#entityform input').first().focus(); + } + }).dialog('open'); + } + $("#tabs").tabs({ "ajaxOptions": { type: 'GET', @@ -313,8 +384,7 @@ $(document).ready(function() { $("#settings").html(tableHtml); $('#changepassword').click(function(e) { - var getUrl = baseApiUrl + 'useraccounts/current/password/template'; - var putUrl = baseApiUrl + 'useraccounts/current/password'; + var putUrl = baseApiUrl + 'users/' + userId; var templateSelector = "#changePasswordFormTemplate"; var width = 600; var height = 350; @@ -324,13 +394,13 @@ $(document).ready(function() { $("#tabs").tabs('load', 0); } - popupDialogWithFormView(getUrl, putUrl, 'PUT', 'dialog.title.update.password', templateSelector, width, height, saveSuccessFunction); + popupDialogWithPostOnlyFormView(putUrl, 'PUT', 'dialog.title.update.password', templateSelector, width, height, saveSuccessFunction); e.preventDefault(); }); $('#changedetails').click(function(e) { - var getAndPutUrl = baseApiUrl + 'useraccounts/current'; + var getAndPutUrl = baseApiUrl + 'users/' + userId; var templateSelector = "#userSettingsFormTemplate"; var width = 600; var height = 350; @@ -362,7 +432,7 @@ $(document).ready(function() {
    -
  • +
diff --git a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/administration-view-templates.jsp b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/administration-view-templates.jsp index 2c75e0d78..3e9c3f344 100644 --- a/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/administration-view-templates.jsp +++ b/mifosng-individual-lending-app/src/main/webapp/WEB-INF/views/administration-view-templates.jsp @@ -297,8 +297,8 @@ - - + + diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/DataValidatorBuilder.java b/mifosng-provider/src/main/java/org/mifosng/platform/DataValidatorBuilder.java index d7b27fda1..6aeb631b9 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/DataValidatorBuilder.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/DataValidatorBuilder.java @@ -41,6 +41,20 @@ public class DataValidatorBuilder { this.ignoreNullValue = true; return this; } + + public DataValidatorBuilder equalToParameter(String linkedParameterName, Object linkedValue) { + if (value == null && linkedValue == null && ignoreNullValue) { + return this; + } + + if (value != null && !value.equals(linkedValue)) { + StringBuilder validationErrorCode = new StringBuilder("validation.msg.").append(resource).append(".").append(linkedParameterName).append(".not.equal.to").append(parameter); + StringBuilder defaultEnglishMessage = new StringBuilder("The parameter ").append(linkedParameterName).append(" is not equal to ").append(parameter).append("."); + ApiParameterError error = ApiParameterError.parameterError(validationErrorCode.toString(), defaultEnglishMessage.toString(), linkedParameterName, linkedValue, value); + dataValidationErrors.add(error); + } + return this; + } public DataValidatorBuilder notNull() { if (value == null && !ignoreNullValue) { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/AuthenticationApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/AuthenticationApiResource.java index 1b5fd12a3..e8360659a 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/AuthenticationApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/AuthenticationApiResource.java @@ -12,6 +12,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.mifosng.data.AuthenticatedUserData; +import org.mifosng.platform.user.domain.AppUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Scope; @@ -33,8 +34,8 @@ public class AuthenticationApiResource { private DaoAuthenticationProvider customAuthenticationProvider; @POST - @Consumes({MediaType.APPLICATION_XML}) - @Produces({MediaType.APPLICATION_XML}) + @Consumes({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON}) public Response authenticate(@QueryParam("username") final String username, @QueryParam("password") final String password) { Authentication authentication = new UsernamePasswordAuthenticationToken(username, password); @@ -51,6 +52,8 @@ public class AuthenticationApiResource { } authenticatedUserData.setPermissions(permissions); authenticatedUserData.setAuthenticated(true); + AppUser principal = (AppUser) authenticationCheck.getPrincipal(); + authenticatedUserData.setUserId(principal.getId()); byte[] base64EncodedAuthenticationKey = Base64.encode(username + ":" + password); authenticatedUserData.setBase64EncodedAuthenticationKey(new String(base64EncodedAuthenticationKey)); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/UserAccountApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/UserAccountApiResource.java deleted file mode 100644 index 0355d810f..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/UserAccountApiResource.java +++ /dev/null @@ -1,73 +0,0 @@ -package org.mifosng.platform.api; - -import javax.ws.rs.Consumes; -import javax.ws.rs.GET; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; - -import org.mifosng.data.AppUserData; -import org.mifosng.data.EntityIdentifier; -import org.mifosng.data.command.ChangePasswordCommand; -import org.mifosng.data.command.UserCommand; -import org.mifosng.platform.user.service.AppUserReadPlatformService; -import org.mifosng.platform.user.service.AppUserWritePlatformService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -@Path("/v1/useraccounts") -@Component -@Scope("singleton") -public class UserAccountApiResource { - - @Autowired - private AppUserReadPlatformService appUserReadPlatformService; - - @Autowired - private AppUserWritePlatformService appUserWritePlatformService; - - @GET - @Path("current") - @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @Produces({ MediaType.APPLICATION_JSON}) - public Response retrieveCurrentUser() { - - AppUserData user = this.appUserReadPlatformService.retrieveCurrentUser(); - - return Response.ok().entity(user).build(); - } - - @PUT - @Path("current") - @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @Produces({ MediaType.APPLICATION_JSON}) - public Response updateCurrentUser(UserCommand command) { - - Long userId = this.appUserWritePlatformService.updateCurrentUser(command); - - return Response.ok().entity(new EntityIdentifier(userId)).build(); - } - - @GET - @Path("current/password/template") - @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @Produces({ MediaType.APPLICATION_JSON}) - public Response retrieveCurrentPasswordTemplate() { - - return Response.ok().entity(new ChangePasswordCommand()).build(); - } - - @PUT - @Path("current/password") - @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @Produces({ MediaType.APPLICATION_JSON}) - public Response updateCurrentUserPassword(ChangePasswordCommand command) { - - Long userId = this.appUserWritePlatformService.updateCurrentUserPassword(command); - - return Response.ok().entity(new EntityIdentifier(userId)).build(); - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/AppUser.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/AppUser.java index cac09ee2f..8c1b14b57 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/AppUser.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/AppUser.java @@ -270,22 +270,29 @@ public class AppUser extends AbstractAuditableCustom implements P return lastname; } - public void update(Set allRoles, Office office, String username, - String firstname, String lastname, String email) { - this.roles.clear(); - this.roles = allRoles; - this.office = office; - this.username = username; - this.firstname = firstname; - this.lastname = lastname; - this.email = email; - } - - public void update(String username, String firstname, String lastname, String email) { - this.username = username; - this.firstname = firstname; - this.lastname = lastname; - this.email = email; + /** + * When updating details, any parameters with null values are ignored. + */ + public void update(Set allRoles, Office office, String username, String firstname, String lastname, String email) { + if (!allRoles.isEmpty()) { + this.roles.clear(); + this.roles = allRoles; + } + if (office != null) { + this.office = office; + } + if (username != null) { + this.username = username; + } + if (firstname != null) { + this.firstname = firstname; + } + if (lastname != null) { + this.lastname = lastname; + } + if (email != null) { + this.email = email; + } } public boolean canNotApproveLoanInPast() { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/JpaUserDomainService.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/JpaUserDomainService.java index be9c72eb5..a1e02b69a 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/JpaUserDomainService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/JpaUserDomainService.java @@ -71,11 +71,10 @@ public class JpaUserDomainService implements UserDomainService { generateKeyUsedForPasswordSalting(appUser); String unencodedPassword = appUser.getPassword(); - if (org.apache.commons.lang.StringUtils.isBlank(unencodedPassword)) { + if (org.apache.commons.lang.StringUtils.isBlank(unencodedPassword) || "autogenerate".equalsIgnoreCase(unencodedPassword)) { unencodedPassword = new RandomPasswordGenerator(13).generate(); + appUser.updatePassword(unencodedPassword); } - // update so encoding works. - appUser.updatePassword(unencodedPassword); String encodePassword = this.applicationPasswordEncoder.encode(appUser); appUser.updatePassword(encodePassword); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/Role.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/Role.java index d5f287467..8cdc2e2a3 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/Role.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/domain/Role.java @@ -82,7 +82,7 @@ public class Role extends AbstractAuditableCustom { } /** - * When updating role details, any parameters with null values are ignored. + * When updating details, any parameters with null values are ignored. */ public void update(String name, String description, List selectedPermissions) { if (name != null) { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformService.java index d6a928578..baac12dac 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformService.java @@ -11,6 +11,4 @@ public interface AppUserReadPlatformService { AppUserData retrieveNewUserDetails(); AppUserData retrieveUser(Long userId); - - AppUserData retrieveCurrentUser(); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformServiceImpl.java index af0935e4e..422832f4c 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserReadPlatformServiceImpl.java @@ -13,6 +13,7 @@ import javax.sql.DataSource; import org.mifosng.data.AppUserData; import org.mifosng.data.OfficeData; +import org.mifosng.data.OfficeLookup; import org.mifosng.data.RoleData; import org.mifosng.platform.exceptions.PlatformResourceNotFoundException; import org.mifosng.platform.organisation.service.OfficeReadPlatformService; @@ -78,7 +79,7 @@ public class AppUserReadPlatformServiceImpl implements AppUserReadPlatformServic @Override public AppUserData retrieveNewUserDetails() { - List offices = new ArrayList(officeReadPlatformService.retrieveAllOffices()); + List offices = new ArrayList(officeReadPlatformService.retrieveAllOfficesForLookup()); List availableRoles = new ArrayList(this.roleReadPlatformService.retrieveAllRoles()); @@ -94,7 +95,7 @@ public class AppUserReadPlatformServiceImpl implements AppUserReadPlatformServic AppUser currentUser = context.authenticatedUser(); - List offices = new ArrayList(officeReadPlatformService.retrieveAllOffices()); + List offices = new ArrayList(officeReadPlatformService.retrieveAllOfficesForLookup()); List availableRoles = new ArrayList(this.roleReadPlatformService.retrieveAllRoles()); @@ -125,38 +126,6 @@ public class AppUserReadPlatformServiceImpl implements AppUserReadPlatformServic return userData; } - @Override - public AppUserData retrieveCurrentUser() { - AppUser currentUser = context.authenticatedUser(); - - List offices = new ArrayList(officeReadPlatformService.retrieveAllOffices()); - - List availableRoles = new ArrayList(this.roleReadPlatformService.retrieveAllRoles()); - - AppUser user = this.appUserRepository.findOne(usersThatMatch(currentUser.getOrganisation(), currentUser.getId())); - - List userRoleData = new ArrayList(); - Set userRoles = user.getRoles(); - for (Role role : userRoles) { - userRoleData.add(role.toData()); - } - - AppUserData userData = new AppUserData(user.getId(), - user.getUsername(), user.getEmail(), user.getOrganisation() - .getId(), user.getOffice().getId(), user.getOffice() - .getName()); - userData.setFirstname(user.getFirstname()); - userData.setLastname(user.getLastname()); - - userData.setAllowedOffices(offices); - - availableRoles.removeAll(userRoleData); - userData.setAvailableRoles(availableRoles); - userData.setSelectedRoles(userRoleData); - - return userData; - } - private static final class AppUserMapper implements RowMapper { private final List offices; diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserWritePlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserWritePlatformService.java index b2e204e2a..39106edc8 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserWritePlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserWritePlatformService.java @@ -1,6 +1,5 @@ package org.mifosng.platform.user.service; -import org.mifosng.data.command.ChangePasswordCommand; import org.mifosng.data.command.UserCommand; public interface AppUserWritePlatformService { @@ -10,8 +9,4 @@ public interface AppUserWritePlatformService { Long updateUser(final UserCommand command); void deleteUser(final Long userId); - - Long updateCurrentUser(UserCommand command); - - Long updateCurrentUserPassword(ChangePasswordCommand command); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserWritePlatformServiceJpaRepositoryImpl.java index 8d9ba816a..e5de4d999 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/AppUserWritePlatformServiceJpaRepositoryImpl.java @@ -9,7 +9,6 @@ import java.util.Set; import org.apache.commons.lang.StringUtils; import org.mifosng.data.ApiParameterError; -import org.mifosng.data.command.ChangePasswordCommand; import org.mifosng.data.command.UserCommand; import org.mifosng.platform.exceptions.PlatformApiDataValidationException; import org.mifosng.platform.exceptions.PlatformDataIntegrityException; @@ -65,7 +64,7 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit AppUser currentUser = context.authenticatedUser(); UserCommandValidator validator = new UserCommandValidator(command); - validator.validate(); + validator.validateForCreate(); Set allRoles = assembleSetOfRoles(command.getRoles()); @@ -104,21 +103,16 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit AppUser currentUser = context.authenticatedUser(); UserCommandValidator validator = new UserCommandValidator(command); - validator.validate(); - - List dataValidationErrors = new ArrayList(); - if (command.getId() == null) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.id.cannot.be.blank", "The parameter id cannot be empty.", "id"); - dataValidationErrors.add(error); - - throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); - } + validator.validateForUpdate(); Set allRoles = assembleSetOfRoles(command.getRoles()); - Office office = this.officeRepository.findOne(command.getOfficeId()); - if (office == null) { - throw new PlatformResourceNotFoundException("error.msg.office.id.invalid", "Office with identifier {0} does not exist.", command.getOfficeId()); + Office office = null; + if (command.getOfficeId() != null) { + office = this.officeRepository.findOne(command.getOfficeId()); + if (office == null) { + throw new PlatformResourceNotFoundException("error.msg.office.id.invalid", "Office with identifier {0} does not exist.", command.getOfficeId()); + } } AppUser userToUpdate = this.appUserRepository.findOne(usersThatMatch(currentUser.getOrganisation(), command.getId())); @@ -129,6 +123,17 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit userToUpdate.update(allRoles, office, command.getUsername(), command.getFirstname(), command.getLastname(), command.getEmail()); this.appUserRepository.saveAndFlush(userToUpdate); + if (command.getPassword() != null || command.getRepeatPassword() != null) { + PlatformUser dummyPlatformUser = new BasicPasswordEncodablePlatformUser( + userToUpdate.getId(), + userToUpdate.getUsername(), command.getPassword()); + + String newPasswordEncoded = this.platformPasswordEncoder.encode(dummyPlatformUser); + + userToUpdate.updatePasswordOnFirstTimeLogin(newPasswordEncoded); + this.appUserRepository.saveAndFlush(userToUpdate); + } + return userToUpdate.getId(); } catch (DataIntegrityViolationException dve) { handleOfficeDataIntegrityIssues(command, dve); @@ -153,44 +158,6 @@ public class AppUserWritePlatformServiceJpaRepositoryImpl implements AppUserWrit this.appUserRepository.delete(userId); } - @Transactional - @Override - public Long updateCurrentUser(UserCommand command) { - AppUser currentUser = context.authenticatedUser(); - - UserCommandValidator validator = new UserCommandValidator(command); - validator.validateAccountSettingDetails(); - - AppUser userToUpdate = this.appUserRepository.findOne(currentUser.getId()); - - userToUpdate.update(command.getUsername(), command.getFirstname(), command.getLastname(), command.getEmail()); - - this.appUserRepository.save(userToUpdate); - - return userToUpdate.getId(); - } - - @Transactional - @Override - public Long updateCurrentUserPassword(ChangePasswordCommand command) { - AppUser currentUser = context.authenticatedUser(); - - ChangePasswordCommandValidator validator = new ChangePasswordCommandValidator(command); - validator.validate(); - - AppUser userToUpdate = this.appUserRepository.findOne(currentUser.getId()); - - PlatformUser dummyPlatformUser = new BasicPasswordEncodablePlatformUser( - userToUpdate.getId(), - userToUpdate.getUsername(), command.getPassword()); - - String newPasswordEncoded = this.platformPasswordEncoder.encode(dummyPlatformUser); - - userToUpdate.updatePasswordOnFirstTimeLogin(newPasswordEncoded); - - return userToUpdate.getId(); - } - /* * Guaranteed to throw an exception no matter what the data integrity issue is. */ diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/ChangePasswordCommandValidator.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/ChangePasswordCommandValidator.java deleted file mode 100644 index ac48b6f81..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/ChangePasswordCommandValidator.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.mifosng.platform.user.service; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.commons.lang.StringUtils; -import org.mifosng.data.ApiParameterError; -import org.mifosng.data.command.ChangePasswordCommand; -import org.mifosng.platform.exceptions.PlatformApiDataValidationException; - -public class ChangePasswordCommandValidator { - - private final ChangePasswordCommand command; - - public ChangePasswordCommandValidator(ChangePasswordCommand command) { - this.command = command; - } - - public void validate() { - List dataValidationErrors = new ArrayList(); - - if (StringUtils.isBlank(command.getPassword())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.changepassword.password.cannot.be.blank", "The parameter password cannot be blank.", "password"); - dataValidationErrors.add(error); - } - - if (StringUtils.isBlank(command.getPasswordrepeat())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.changepassword.passwordrepeat.cannot.be.blank", "The parameter passwordrepeat cannot be blank.", "passwordrepeat"); - dataValidationErrors.add(error); - } else { - if (!command.getPasswordrepeat().equals(command.getPassword())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.changepassword.passwordrepeat.not.the.same", "The parameter passwordrepeat cannot be blank.", "passwordrepeat"); - dataValidationErrors.add(error); - } - } - - if (!dataValidationErrors.isEmpty()) { - throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); - } - } -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/UserCommandValidator.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/UserCommandValidator.java index fa9746119..60b688e8b 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/UserCommandValidator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/UserCommandValidator.java @@ -3,12 +3,10 @@ package org.mifosng.platform.user.service; import java.util.ArrayList; import java.util.List; -import org.apache.commons.lang.StringUtils; import org.mifosng.data.ApiParameterError; import org.mifosng.data.command.UserCommand; import org.mifosng.platform.DataValidatorBuilder; import org.mifosng.platform.exceptions.PlatformApiDataValidationException; -import org.springframework.util.ObjectUtils; public class UserCommandValidator { @@ -21,72 +19,43 @@ public class UserCommandValidator { public void validateForUpdate() { List dataValidationErrors = new ArrayList(); - DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("role"); + DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("user"); baseDataValidator.reset().parameter("id").value(command.getId()).notNull(); + baseDataValidator.reset().parameter("username").value(command.getUsername()).ignoreIfNull().notBlank(); baseDataValidator.reset().parameter("firstname").value(command.getFirstname()).ignoreIfNull().notBlank(); baseDataValidator.reset().parameter("lastname").value(command.getLastname()).ignoreIfNull().notBlank(); baseDataValidator.reset().parameter("email").value(command.getEmail()).ignoreIfNull().notBlank(); + baseDataValidator.reset().parameter("officeId").value(command.getOfficeId()).ignoreIfNull().notNull(); baseDataValidator.reset().parameter("roles").value(command.getRoles()).ignoreIfNull().arrayNotEmpty(); baseDataValidator.reset().parameter("password").value(command.getPassword()).ignoreIfNull().notBlank(); baseDataValidator.reset().parameter("passwordRepeat").value(command.getPassword()).ignoreIfNull().notBlank(); + baseDataValidator.reset().parameter("password").value(command.getPassword()).ignoreIfNull().equalToParameter("repeatPassword", command.getRepeatPassword()); + + baseDataValidator.reset().anyOfNotNull(command.getUsername(), command.getFirstname(), command.getLastname(), command.getEmail(), command.getOfficeId(), + command.getRoles(), command.getPassword(), command.getRepeatPassword()); if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); } } - public void validate() { + public void validateForCreate() { List dataValidationErrors = new ArrayList(); - validateAccountSettings(dataValidationErrors); - - if (command.getOfficeId() == null || command.getOfficeId().equals(Long.valueOf(-1))) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.office.cannot.be.blank", "The parameter officeId cannot be blank.", "officeId"); - dataValidationErrors.add(error); - } - - if (ObjectUtils.isEmpty(command.getRoles())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.roles.cannot.be.blank", "The parameter selectedItems cannot be blank.", "selectedItems"); - dataValidationErrors.add(error); - } + DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("user"); + baseDataValidator.reset().parameter("username").value(command.getUsername()).notBlank(); + baseDataValidator.reset().parameter("firstname").value(command.getFirstname()).notBlank(); + baseDataValidator.reset().parameter("lastname").value(command.getLastname()).notBlank(); + baseDataValidator.reset().parameter("email").value(command.getEmail()).notBlank(); + baseDataValidator.reset().parameter("officeId").value(command.getOfficeId()).notNull(); + baseDataValidator.reset().parameter("roles").value(command.getRoles()).arrayNotEmpty(); + if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); } } - - public void validateAccountSettingDetails() { - List dataValidationErrors = new ArrayList(); - - validateAccountSettings(dataValidationErrors); - - if (!dataValidationErrors.isEmpty()) { - throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); - } - } - - private void validateAccountSettings(List dataValidationErrors) { - if (StringUtils.isBlank(command.getUsername())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.username.cannot.be.blank", "The parameter username cannot be blank.", "username"); - dataValidationErrors.add(error); - } - - if (StringUtils.isBlank(command.getFirstname())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.firstname.cannot.be.blank", "The parameter firstname cannot be blank.", "firstname"); - dataValidationErrors.add(error); - } - - if (StringUtils.isBlank(command.getLastname())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.lastname.cannot.be.blank", "The parameter lastname cannot be blank.", "lastname"); - dataValidationErrors.add(error); - } - - if (StringUtils.isBlank(command.getEmail())) { - ApiParameterError error = ApiParameterError.parameterError("validation.msg.user.email.cannot.be.blank", "The parameter email cannot be blank.", "email"); - dataValidationErrors.add(error); - } - } } \ No newline at end of file