From d2c296a84a00e15f3de5d6bc3ce75a17d38b2d7d Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Fri, 25 Sep 2020 20:03:33 +0200 Subject: [PATCH] Forms for managing users (not tested yet!) --- .../usersgroupsroles/EmailFormController.java | 281 ++++++++++++++++++ .../usersgroupsroles/EmailFormModel.java | 76 +++++ .../usersgroupsroles/UserDetailsModel.java | 5 +- .../usersgroupsroles/UserFormController.java | 207 +++++++++++++ .../usersgroupsroles/UsersController.java | 209 ++++++++++--- .../admin/users-groups-roles/email-form.xhtml | 90 ++++++ .../users-groups-roles/email-not-found.xhtml | 38 +++ .../users-groups-roles/user-details.xhtml | 48 ++- .../admin/users-groups-roles/user-form.xhtml | 190 ++++++++++++ .../ui/admin/users-groups-roles/users.xhtml | 43 ++- .../org/libreccm/ui/AdminBundle.properties | 45 +++ .../org/libreccm/ui/AdminBundle_de.properties | 45 +++ 12 files changed, 1224 insertions(+), 53 deletions(-) create mode 100644 ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/EmailFormController.java create mode 100644 ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/EmailFormModel.java create mode 100644 ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserFormController.java create mode 100644 ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/email-form.xhtml create mode 100644 ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/email-not-found.xhtml create mode 100644 ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-form.xhtml diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/EmailFormController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/EmailFormController.java new file mode 100644 index 000000000..6f1bc5e81 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/EmailFormController.java @@ -0,0 +1,281 @@ +/* + * Copyright (C) 2020 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.ui.admin.usersgroupsroles; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.core.CoreConstants; +import org.libreccm.core.EmailAddress; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.RequiresPrivilege; +import org.libreccm.security.User; +import org.libreccm.security.UserRepository; +import org.libreccm.ui.Message; +import org.libreccm.ui.MessageType; +import org.libreccm.ui.admin.AdminMessages; + +import java.util.Arrays; +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.mvc.binding.MvcBinding; +import javax.transaction.Transactional; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Controller +@Path("/users-groups-roles/users/{userIdentifier}/email-addresses") +public class EmailFormController { + + @Inject + private AdminMessages adminMessages; + + @Inject + private EmailFormModel emailFormModel; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private Models models; + + @Inject + private UserDetailsModel userDetailsModel; + + @Inject + private UserRepository userRepository; + + @MvcBinding + @FormParam("address") + @NotBlank + @Email + private String address; + + @FormParam("bouncing") + private boolean bouncing; + + @FormParam("verified") + private boolean verified; + + @GET + @Path("/new") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String getNewEmailAddressForm( + @PathParam("userIdentifier") final String userIdentifierParam + ) { + return "org/libreccm/ui/admin/users-groups-roles/email-form.xhtml"; + } + + @POST + @Path("/new") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String addNewEmailAddress( + @PathParam("userIdentifier") final String userIdentifierParam + ) { + final Identifier identifier = identifierParser.parseIdentifier( + userIdentifierParam + ); + final Optional result; + switch (identifier.getType()) { + case ID: + result = userRepository.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = userRepository.findByUuid( + identifier.getIdentifier() + ); + break; + default: + result = userRepository.findByName(identifier.getIdentifier()); + break; + } + + if (result.isPresent()) { + final User user = result.get(); + + final EmailAddress emailAddress = new EmailAddress(); + emailAddress.setAddress(address); + emailAddress.setBouncing(bouncing); + emailAddress.setVerified(verified); + user.addEmailAddress(emailAddress); + + userRepository.save(user); + + return String.format( + "redirect:/users-groups-roles/users/%s/details", + user.getName() + ); + } else { + userDetailsModel.addMessage( + new Message( + adminMessages.getMessage( + "usersgroupsroles.users.not_found.message", + Arrays.asList(userIdentifierParam) + ), + MessageType.WARNING + ) + ); + return "org/libreccm/ui/admin/users-groups-roles/user-not-found.xhtml"; + } + } + + @GET + @Path("/{emailId}") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String getEditEmailAddressForm( + @PathParam("userIdentifier") final String userIdentifierParam, + @PathParam("emailId") final int emailId + ) { + final Identifier identifier = identifierParser.parseIdentifier( + userIdentifierParam + ); + final Optional result; + switch (identifier.getType()) { + case ID: + result = userRepository.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = userRepository.findByUuid( + identifier.getIdentifier() + ); + break; + default: + result = userRepository.findByName(identifier.getIdentifier()); + break; + } + + if (result.isPresent()) { + final User user = result.get(); + + if (user.getEmailAddresses().size() <= emailId) { + models.put("error.userIdentifier", userIdentifierParam); + models.put("error.emailId", emailId); + return "org/libreccm/ui/admin/users-groups-roles/email-not-found.xhtml"; + } else { + final EmailAddress emailAddress = user + .getEmailAddresses() + .get(emailId); + emailFormModel.setAddress(emailAddress.getAddress()); + emailFormModel.setBouncing(emailAddress.isBouncing()); + emailFormModel.setVerified(emailAddress.isVerified()); + return "org/libreccm/ui/admin/users-groups-roles/email-form.xhtml"; + } + } else { + userDetailsModel.addMessage( + new Message( + adminMessages.getMessage( + "usersgroupsroles.users.not_found.message", + Arrays.asList(userIdentifierParam) + ), + MessageType.WARNING + ) + ); + + return "org/libreccm/ui/admin/users-groups-roles/user-not-found.xhtml"; + } + } + + @POST + @Path("/{emailId}") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String updateEmailAddress( + @PathParam("userIdentifier") final String userIdentifierParam, + @PathParam("emailId") final int emailId + ) { + final Identifier identifier = identifierParser.parseIdentifier( + userIdentifierParam + ); + final Optional result; + switch (identifier.getType()) { + case ID: + result = userRepository.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = userRepository.findByUuid( + identifier.getIdentifier() + ); + break; + default: + result = userRepository.findByName(identifier.getIdentifier()); + break; + } + + if (result.isPresent()) { + final User user = result.get(); + + if (user.getEmailAddresses().size() <= emailId) { + models.put("error.userIdentifier", userIdentifierParam); + models.put("error.emailId", emailId); + return "org/libreccm/ui/admin/users-groups-roles/email-not-found.xhtml"; + } else { + final EmailAddress emailAddress = user + .getEmailAddresses() + .get(emailId); + + emailAddress.setAddress(address); + emailAddress.setBouncing(bouncing); + emailAddress.setVerified(verified); + + userRepository.save(user); + + return "org/libreccm/ui/admin/users-groups-roles/email-form.xhtml"; + } + } else { + userDetailsModel.addMessage( + new Message( + adminMessages.getMessage( + "usersgroupsroles.users.not_found.message", + Arrays.asList(userIdentifierParam) + ), + MessageType.WARNING + ) + ); + + return "org/libreccm/ui/admin/users-groups-roles/user-not-found.xhtml"; + } + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/EmailFormModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/EmailFormModel.java new file mode 100644 index 000000000..d85904d25 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/EmailFormModel.java @@ -0,0 +1,76 @@ +/* + * Copyright (C) 2020 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.ui.admin.usersgroupsroles; + +import org.libreccm.core.EmailAddress; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ + +@RequestScoped +@Named("EmailFormModel") +public class EmailFormModel { + + private String address; + + private boolean bouncing; + + private boolean verified; + + public void setEmailAddress(final EmailAddress emailAddress) { + address = emailAddress.getAddress(); + bouncing = emailAddress.isBouncing(); + verified = emailAddress.isVerified(); + } + + public boolean isNew() { + return address == null; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public boolean isBouncing() { + return bouncing; + } + + public void setBouncing(boolean bouncing) { + this.bouncing = bouncing; + } + + public boolean isVerified() { + return verified; + } + + public void setVerified(boolean verified) { + this.verified = verified; + } + + +} diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java index 68b4a8a5a..744eea92b 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserDetailsModel.java @@ -58,7 +58,7 @@ public class UserDetailsModel { private boolean banned; - private boolean passwordResetRequired; + private boolean passwordResetRequired = true; private List groupMemberships; @@ -153,4 +153,7 @@ public class UserDetailsModel { return Collections.unmodifiableList(roles); } + public boolean isNewUser() { + return userId == 0; + } } diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserFormController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserFormController.java new file mode 100644 index 000000000..1cda75d47 --- /dev/null +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserFormController.java @@ -0,0 +1,207 @@ +/* + * Copyright (C) 2020 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.libreccm.ui.admin.usersgroupsroles; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.core.CoreConstants; +import org.libreccm.security.AuthorizationRequired; +import org.libreccm.security.RequiresPrivilege; +import org.libreccm.security.User; +import org.libreccm.security.UserManager; +import org.libreccm.security.UserRepository; +import org.libreccm.ui.admin.AdminMessages; + +import java.util.Arrays; +import java.util.Objects; +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.mvc.binding.BindingResult; +import javax.mvc.binding.MvcBinding; +import javax.transaction.Transactional; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; +import javax.ws.rs.FormParam; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; + +/** + * + * @author Jens Pelzetter + */ +@Controller +@Path("/users-groups-roles/users/") +@RequestScoped +public class UserFormController { + + @Inject + private AdminMessages adminMessages; + + @Inject + private BindingResult bindingResult; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private Models models; + + @Inject + private UserManager userManager; + + @Inject + private UserRepository userRepository; + + @MvcBinding + @FormParam("userName") + @NotBlank + private String userName; + + @FormParam("givenName") + private String givenName; + + @FormParam("familyName") + private String familyName; + + @MvcBinding + @FormParam("primaryEmailAddress") + @NotBlank + @Email + private String primaryEmailAddress; + + @FormParam("primaryEmailAddressBouncing") + private boolean primaryEmailAddressBouncing; + + @FormParam("primaryEmailAddressVerified") + private boolean primaryEmailAddressVerified; + + @FormParam("banned") + private boolean banned; + + @FormParam("passwordResetRequired") + private boolean passwordResetRequired; + + @FormParam("password") + private String password; + + @FormParam("passwordConfirmation") + private String passwordConfirmation; + + @POST + @Path("/new") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String createUser() { + if (bindingResult.isFailed()) { + models.put("errors", bindingResult.getAllMessages()); + return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; + } + + if (password == null || password.isEmpty()) { + models.put("errors", Arrays.asList( + adminMessages.get( + "usersgroupsroles.users.new.errors.password.empty") + )); + return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; + } + + if (!Objects.equals(password, passwordConfirmation)) { + models.put("errors", Arrays.asList( + adminMessages.get( + "usersgroupsroles.users.new.errors.password.no_match") + )); + return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; + } + + userManager.createUser( + givenName, familyName, userName, primaryEmailAddress, password + ); + + return "redirect:users-groups-roles/users"; + } + + @POST + @Path("{userIdentifier}/edit") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String updateUser( + @PathParam("userIdentifier") final String userIdentifierParam + ) { + if (bindingResult.isFailed()) { + models.put("errors", bindingResult.getAllMessages()); + return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; + } + + final Identifier identifier = identifierParser.parseIdentifier( + userIdentifierParam + ); + final Optional result; + switch (identifier.getType()) { + case ID: + result = userRepository.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = userRepository.findByUuid( + identifier.getIdentifier() + ); + break; + default: + result = userRepository.findByName(identifier.getIdentifier()); + break; + } + + if (result.isPresent()) { + final User user = result.get(); + user.setUuid(userName); + user.setGivenName(givenName); + user.setFamilyName(familyName); + user.getPrimaryEmailAddress().setAddress(primaryEmailAddress); + user + .getPrimaryEmailAddress() + .setBouncing(primaryEmailAddressBouncing); + user + .getPrimaryEmailAddress() + .setBouncing(primaryEmailAddressVerified); + user.setBanned(banned); + user.setPasswordResetRequired(passwordResetRequired); + + userRepository.save(user); + return "redirect:users-groups-roles/users"; + } else { + models.put("errors", Arrays.asList( + adminMessages.getMessage( + "usersgroupsroles.users.not_found.message", + Arrays.asList(userIdentifierParam) + ) + )); + return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; + } + + } + +} diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersController.java index 3b079f3e4..f13121cd9 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersController.java @@ -35,8 +35,10 @@ import java.util.Optional; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.mvc.Controller; +import javax.mvc.MvcContext; import javax.transaction.Transactional; import javax.ws.rs.DefaultValue; +import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; @@ -58,6 +60,9 @@ public class UsersController { @Inject private IdentifierParser identifierParser; + @Inject + private MvcContext mvc; + @Inject private UserDetailsModel userDetailsModel; @@ -123,81 +128,189 @@ public class UsersController { } } - @POST - @Path("/{userIdentifier}/create") + @GET + @Path("/new") @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) - public String createUser( + public String newUser( @PathParam("userIdentifier") final String userIdentifier ) { - - throw new UnsupportedOperationException(); + return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; } @GET - @Path("/users/{userIdentifier}/edit") + @Path("/{userIdentifier}/edit") @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) public String editUser( - @PathParam("userIdentifier") final String userIdentifier + @PathParam("userIdentifier") final String userIdentifierParam ) { + final Identifier identifier = identifierParser.parseIdentifier( + userIdentifierParam + ); + final Optional result; + switch (identifier.getType()) { + case ID: + result = userRepository.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = userRepository.findByUuid( + identifier.getIdentifier() + ); + break; + default: + result = userRepository.findByName(identifier.getIdentifier()); + break; + } - throw new UnsupportedOperationException(); + if (result.isPresent()) { + userDetailsModel.setUser(result.get()); + return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; + } else { + userDetailsModel.addMessage( + new Message( + adminMessages.getMessage( + "usersgroupsroles.users.not_found.message", + Arrays.asList(userIdentifierParam) + ), + MessageType.WARNING + ) + ); + return "org/libreccm/ui/admin/users-groups-roles/user-not-found.xhtml"; + } } @POST - @Path("/users/{userIdentifier}/edit") - @AuthorizationRequired - @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) - public String updateUser( - @PathParam("userIdentifier") final String userIdentifier - ) { - - throw new UnsupportedOperationException(); - } - - @POST - @Path("/users/{userIdentifier}/disable") + @Path("/{userIdentifier}/disable") @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) public String disableUser( - @PathParam("userIdentifier") final String userIdentifier + @PathParam("userIdentifier") final String userIdentifierParam, + @FormParam("confirmed") final boolean confirmed ) { + final Identifier identifier = identifierParser.parseIdentifier( + userIdentifierParam + ); + final Optional result; + switch (identifier.getType()) { + case ID: + result = userRepository.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = userRepository.findByUuid( + identifier.getIdentifier() + ); + break; + default: + result = userRepository.findByName(identifier.getIdentifier()); + break; + } - throw new UnsupportedOperationException(); - } - - @GET - @Path("/{userIdentifier}/emailaddresses") - @AuthorizationRequired - @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) - public String getEmailAddressesOfUser( - @PathParam("userIdentifier") final String userIdentifier - ) { - - throw new UnsupportedOperationException(); + if (result.isPresent()) { + final User user = result.get(); + user.setBanned(true); + userRepository.save(user); + return String.format( + "redirect:%s", mvc.uri("UsersController#getUsers") + ); + } else { + userDetailsModel.addMessage( + new Message( + adminMessages.getMessage( + "usersgroupsroles.users.not_found.message", + Arrays.asList(userIdentifierParam) + ), + MessageType.WARNING + ) + ); + return "org/libreccm/ui/admin/users-groups-roles/user-not-found.xhtml"; + } } @POST - @Path("/{userIdentifier}/emailaddresses/{address}/add") + @Path("/{userIdentifier}/email-addresses/{emailId}/remove") @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) - public String addEmailAddresses( - @PathParam("userIdentifier") final String userIdentifier, - @PathParam("address") final String addressToAdd + public String removeEmailAddress( + @PathParam("userIdentifier") final String userIdentifierParam, + @PathParam("emailId") final int emailId, + @FormParam("confirmed") final boolean confirmed ) { - throw new UnsupportedOperationException(); - } + if (!confirmed) { + return String.format( + "redirect:%s", + mvc.uri( + String.format( + "UsersController#getUserDetails", + "{ userIdentifier: %s}", + userIdentifierParam + ) + ) + ); + } - @POST - @Path("/{userIdentifier}/emailaddresses/{address}/remove") - @AuthorizationRequired - @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) - public String removeEmailAddresses( - @PathParam("userIdentifier") final String userIdentifier, - @PathParam("address") final String addressToRemove - ) { - throw new UnsupportedOperationException(); + final Identifier identifier = identifierParser.parseIdentifier( + userIdentifierParam + ); + final Optional result; + switch (identifier.getType()) { + case ID: + result = userRepository.findById( + Long.parseLong(identifier.getIdentifier()) + ); + break; + case UUID: + result = userRepository.findByUuid( + identifier.getIdentifier() + ); + break; + default: + result = userRepository.findByName(identifier.getIdentifier()); + break; + } + + if (result.isPresent()) { + final User user = result.get(); + if (user.getEmailAddresses().size() <= emailId) { + return String.format( + "redirect:%s", + mvc.uri( + String.format( + "UsersController#getUserDetails", + "{ userIdentifier: %s}", + userIdentifierParam + ) + ) + ); + } + user.getEmailAddresses().remove(emailId); + userRepository.save(user); + return String.format( + "redirect:%s", + mvc.uri( + String.format( + "UsersController#getUserDetails", + "{ userIdentifier: %s}", + userIdentifierParam + ) + ) + ); + } else { + userDetailsModel.addMessage( + new Message( + adminMessages.getMessage( + "usersgroupsroles.users.not_found.message", + Arrays.asList(userIdentifierParam) + ), + MessageType.WARNING + ) + ); + return "org/libreccm/ui/admin/users-groups-roles/user-not-found.xhtml"; + } } } diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/email-form.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/email-form.xhtml new file mode 100644 index 000000000..c57e40915 --- /dev/null +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/email-form.xhtml @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + +
+
+ + + + #{AdminMessages['usersgroupsroles.users.email.form.address.help']} + +
+
+ + +
+
+ + +
+ +
+
+ +
+ diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/email-not-found.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/email-not-found.xhtml new file mode 100644 index 000000000..eb93843ca --- /dev/null +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/email-not-found.xhtml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-details.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-details.xhtml index 4f8c952f5..a130e9b64 100644 --- a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-details.xhtml +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-details.xhtml @@ -161,7 +161,8 @@ + var="address" + varStatus="status"> #{address.address} @@ -200,7 +201,9 @@ - + + diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-form.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-form.xhtml new file mode 100644 index 000000000..8045f6c47 --- /dev/null +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/user-form.xhtml @@ -0,0 +1,190 @@ + + + + + + + + + + + +
  • + + #{UserDetailsModel.newUser ? AdminMessages['usersgroupsroles.users.breadcrumb.new'] : AdminMessages['usersgroupsroles.users.breadcrumb.edit']} +
  • +
    + + + + + +
    +
    + + + + #{AdminMessages['usersgroupsroles.users.form.username.help']} + +
    +
    + + + + #{AdminMessages['usersgroupsroles.users.form.givenname.help']} + +
    +
    + + + + #{AdminMessages['usersgroupsroles.users.form.familyname.help']} + +
    +
    + + + + #{AdminMessages['usersgroupsroles.users.form.primaryemailaddress.help']} + +
    +
    + + +
    +
    + + +
    + +
    + + + + #{AdminMessages['usersgroupsroles.users.form.password.help']} + +
    +
    + + + + #{AdminMessages['usersgroupsroles.users.form.passwordconfirmation.help']} + +
    +
    +
    + + +
    +
    + + +
    + + #{AdminMessages['usersgroupsroles.users.form.buttons.cancel']} + + +
    +
    + + + diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/users.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/users.xhtml index fc26a29cc..8b124acd1 100644 --- a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/users.xhtml +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/users.xhtml @@ -92,7 +92,9 @@ - + diff --git a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties index a9a37b990..80ef75e86 100644 --- a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties +++ b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties @@ -70,3 +70,48 @@ usergroupsroles.users.user_details.roles.heading=Roles usergroupsroles.users.user_details.roles.add=Add usergroupsroles.users.user_details.roles.remove=Remove usergroupsroles.users.user_details.edit_user=Edit +usersgroupsroles.users.new.errors.password.empty=Password of a new user can't be empty +usersgroupsroles.users.new.errors.password.no_match=Password and confirmation do not match +usersgroupsroles.users.edit.title=Edit user {0} +usersgroupsroles.users.form.username.label=User name +usersgroupsroles.users.form.username.help=Unique name of the user which can be used to login +usersgroupsroles.users.form.givenname.label=Given Name +usersgroupsroles.users.form.givenname.help=Given name of the user +usersgroupsroles.users.form.familyname.label=Family Name +usersgroupsroles.users.form.familyname.help=Family name of the user +usersgroupsroles.users.form.primaryemailaddress.label=Primary Email address +usersgroupsroles.users.form.primaryemailaddress.help=Primary email address of the user +usersgroupsroles.users.form.primaryemailaddress.boucing.label=Primary email address bouncing? +usersgroupsroles.users.form.primaryemailaddress.verified.label=Primary email address verified? +usersgroupsroles.users.form.password=Password +usersgroupsroles.users.form.password.help=Password of the new user +usersgroupsroles.users.form.passwordconfirmation=Password Confirmation +usersgroupsroles.users.form.passwordconfirmation.help=Confirm the password by repeating it +usersgroupsroles.users.form.banned.label=Disabled? +usersgroupsroles.users.form.passwordresetrequired.label=Password reset required +usersgroupsroles.users.form.buttons.cancel=Cancel +usersgroupsroles.users.form.buttons.create=Create new user +usersgroupsroles.users.form.buttons.save=Save +usersgroupsroles.users.create.title=Create new user +usersgroupsroles.users.email.not_found.title=Email address not found +usersgroupsroles.users.email.not_found.message=User {0} has no email address with ID {1}. +usersgroupsroles.users.breadcrumb.new=New User +usersgroupsroles.users.breadcrumb.edit=Edit user +usersgroupsroles.users.breadcrumbs.email.add=Add Email Address +usersgroupsroles.users.breadcrumbs.email.edit=Edit Email Address +usersgroupsroles.users.email.edit.title=Edit Email Address +usersgroupsroles.users.email.add.title=Add Email Address +usersgroupsroles.users.email.form.address.label=Email Address +usersgroupsroles.users.email.form.address.help=The Email Address +usersgroupsroles.users.email.form.bouncing.label=Bouncing? +usersgroupsroles.users.email.form.verified.label=Verified +usersgroupsroles.users.email.form.buttons.add=Add +usersgroupsroles.users.email.form.buttons.save=Save +usersgroupsroles.users.disable.confirm.title=Confirm to disable user +usersgroupsroles.users.disable.confirm.cancel=Cancel +usersgroupsroles.users.disable.confirm.message=Are you sure to disable user {0} +usersgroupsroles.users.disable.confirm.yes=Disable User +usergroupsroles.users.user_details.email_addresses.remove.confirm.title=Confirm Removal Of Email Address +usergroupsroles.users.user_details.email_addresses.remove.confirm.cancel=Cancel +usergroupsroles.users.user_details.email_addresses.remove.confirm.message=Are you sure to remove email address {0}? +usergroupsroles.users.user_details.email_addresses.remove.confirm.yes=Remove Email Address diff --git a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties index 56dd82bf4..d7ca0fe66 100644 --- a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties +++ b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle_de.properties @@ -70,3 +70,48 @@ usergroupsroles.users.user_details.roles.heading=Rollen usergroupsroles.users.user_details.roles.add=Hinzuf\u00fcgen usergroupsroles.users.user_details.roles.remove=Entfernen usergroupsroles.users.user_details.edit_user=Bearbeiten +usersgroupsroles.users.new.errors.password.empty=Das Passwort eines neuen Benutzers darf nicht leer sein. +usersgroupsroles.users.new.errors.password.no_match=Password und Best\u00e4tigung stimmen nicht \u00fcberein. +usersgroupsroles.users.edit.title=Benutzer*in {0} bearbeiten +usersgroupsroles.users.form.username.label=Login-Name +usersgroupsroles.users.form.username.help=Eindeutiger Name f\u00fcr den/die Benutzer*in +usersgroupsroles.users.form.givenname.label=Vorname +usersgroupsroles.users.form.givenname.help=Vorname des/der Benutzer*in +usersgroupsroles.users.form.familyname.label=Familienname +usersgroupsroles.users.form.familyname.help=Familienname des/der Benutzer*in +usersgroupsroles.users.form.primaryemailaddress.label=Prim\u00e4re E-Mail-Addresse +usersgroupsroles.users.form.primaryemailaddress.help=Prim\u00e4re E-Mail Addresse des/der Benutzer*in +usersgroupsroles.users.form.primaryemailaddress.boucing.label=Werden Mails an die prim\u00e4re E-Mail-Addresse zur\u00fcckgewiesen? +usersgroupsroles.users.form.primaryemailaddress.verified.label=Ist die prim\u00e4re E-Mail-Addresse verifiziert? +usersgroupsroles.users.form.password=Passwort +usersgroupsroles.users.form.password.help=Passwort des neuen Benutzers +usersgroupsroles.users.form.passwordconfirmation=Passwort-Best\u00e4tigung +usersgroupsroles.users.form.passwordconfirmation.help=Wiederholen Sie das Passwort zur Best\u00e4tigung +usersgroupsroles.users.form.banned.label=Inaktiv? +usersgroupsroles.users.form.passwordresetrequired.label=Neues Passwort erforderlich? +usersgroupsroles.users.form.buttons.cancel=Abbrechen +usersgroupsroles.users.form.buttons.create=Benutzer*in neu anlegen +usersgroupsroles.users.form.buttons.save=Speichern +usersgroupsroles.users.create.title=Neue(n) Benutzer*in anlegen +usersgroupsroles.users.email.not_found.title=E-Mail Addresse nicht gefunden +usersgroupsroles.users.email.not_found.message=Benutzer*in {0} hat keine E-Mail-Addresse mit der ID {1}. +usersgroupsroles.users.breadcrumb.new=Benutzer*in anlegen +usersgroupsroles.users.breadcrumb.edit=Benutzer*in bearbeiten +usersgroupsroles.users.breadcrumbs.email.add=E-Mail-Addresse hinzuf\u00fcgen +usersgroupsroles.users.breadcrumbs.email.edit=E-Mail-Addresse bearbeiten +usersgroupsroles.users.email.edit.title=E-Mail Addresse bearbeiten +usersgroupsroles.users.email.add.title=E-Mail Addresse hinzuf\u00fcgen +usersgroupsroles.users.email.form.address.label=E-Mail-Addresse +usersgroupsroles.users.email.form.address.help=Die E-Mail-Addresse +usersgroupsroles.users.email.form.bouncing.label=Wird zur\u00fcckgewiesen? +usersgroupsroles.users.email.form.verified.label=Verifiziert +usersgroupsroles.users.email.form.buttons.add=Hinzuf\u00fcgen +usersgroupsroles.users.email.form.buttons.save=Speichern +usersgroupsroles.users.disable.confirm.title=Deaktivierung Benutzer*in best\u00e4tigen +usersgroupsroles.users.disable.confirm.cancel=Abbrechen +usersgroupsroles.users.disable.confirm.message=Sind Sie sicher das Sie den/die Benutzer*in {0} deaktivieren wollen? +usersgroupsroles.users.disable.confirm.yes=Benutzer*in deaktivieren +usergroupsroles.users.user_details.email_addresses.remove.confirm.title=Entfernen E-Mail-Addresse best\u00e4tigen +usergroupsroles.users.user_details.email_addresses.remove.confirm.cancel=Abbrechen +usergroupsroles.users.user_details.email_addresses.remove.confirm.message=Sind Sie sicher, dass Sie die E-Mail-Addresse {0} entfernen wollen? +usergroupsroles.users.user_details.email_addresses.remove.confirm.yes=E-Mail-Addresse entfernen