From 77086c84c1f36a1ddb2c074b22f50150bbea0420 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Mon, 5 Oct 2020 21:26:18 +0200 Subject: [PATCH] Bugfixes --- .../main/java/org/libreccm/security/User.java | 45 +- .../usersgroupsroles/EmailFormController.java | 412 ++++++++++-------- .../usersgroupsroles/EmailFormModel.java | 23 + .../usersgroupsroles/UsersController.java | 82 ++++ .../admin/users-groups-roles/email-form.xhtml | 25 +- .../users-groups-roles/email-not-found.xhtml | 4 +- .../users-groups-roles/user-details.xhtml | 4 +- .../users-groups-roles/user-not-found.xhtml | 2 +- .../org/libreccm/ui/AdminBundle.properties | 1 + .../org/libreccm/ui/AdminBundle_de.properties | 1 + 10 files changed, 392 insertions(+), 207 deletions(-) diff --git a/ccm-core/src/main/java/org/libreccm/security/User.java b/ccm-core/src/main/java/org/libreccm/security/User.java index ce71aa92c..56f4857e2 100644 --- a/ccm-core/src/main/java/org/libreccm/security/User.java +++ b/ccm-core/src/main/java/org/libreccm/security/User.java @@ -59,6 +59,7 @@ import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.NamedSubgraph; import javax.persistence.OneToMany; +import javax.persistence.OrderBy; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -186,6 +187,7 @@ public class User extends Party implements Serializable, Exportable { * Additional email addresses of the user. */ @ElementCollection(fetch = FetchType.EAGER) + @OrderBy("address") @CollectionTable(name = "USER_EMAIL_ADDRESSES", schema = DB_SCHEMA, joinColumns = { @@ -363,36 +365,37 @@ public class User extends Party implements Serializable, Exportable { @Override public JsonObjectBuilder buildJson() { - final JsonArrayBuilder emailAddressesArrayBuilder = Json.createArrayBuilder(); - + final JsonArrayBuilder emailAddressesArrayBuilder = Json + .createArrayBuilder(); + emailAddresses .stream() .map(EmailAddress::buildJson) .forEach(emailAddressesArrayBuilder::add); - + return super .buildJson() .add("givenName", givenName) .add("familyName", familyName) .add("primaryEmailAddress", primaryEmailAddress.buildJson()) - .add( - "emailAddresses", - emailAddresses - .stream() - .map(EmailAddress::buildJson) - .map(JsonObjectBuilder::build) - .collect(new JsonArrayCollector()) - ) - .add("banned", banned) - .add("passwordResetRequired", passwordResetRequired) - .add( - "groupMemberships", - groupMemberships - .stream() - .map(GroupMembership::buildJson) - .map(JsonObjectBuilder::build) - .collect(new JsonArrayCollector()) - ); + .add( + "emailAddresses", + emailAddresses + .stream() + .map(EmailAddress::buildJson) + .map(JsonObjectBuilder::build) + .collect(new JsonArrayCollector()) + ) + .add("banned", banned) + .add("passwordResetRequired", passwordResetRequired) + .add( + "groupMemberships", + groupMemberships + .stream() + .map(GroupMembership::buildJson) + .map(JsonObjectBuilder::build) + .collect(new JsonArrayCollector()) + ); } @Override 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 index df68fb66a..d661ff8e5 100644 --- 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 @@ -37,12 +37,9 @@ import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.mvc.Controller; import javax.mvc.Models; -import javax.mvc.binding.MvcBinding; +import javax.mvc.binding.BindingResult; 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; @@ -53,12 +50,16 @@ import javax.ws.rs.PathParam; */ @RequestScoped @Controller -@Path("/users-groups-roles/users/{userIdentifier}/email-addresses") +@Path( + "/users-groups-roles/users/{userIdentifier}/email-addresses/{emailIdentifier}/save") public class EmailFormController { @Inject private AdminMessages adminMessages; + @Inject + private BindingResult bindingResult; + @Inject private EmailFormModel emailFormModel; @@ -74,40 +75,27 @@ public class EmailFormController { @Inject private UserRepository userRepository; -// @MvcBinding -// @FormParam("address") + // MVC does not work with Krazo 1.1.0-M1 +// @MvcBinding + @FormParam("address") // @NotBlank // @Email -// private String address; -// -// @FormParam("bouncing") -// private boolean bouncing; -// -// @FormParam("verified") -// private boolean verified; + private String address; - @GET - @Path("/new") - @AuthorizationRequired - @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) - @Transactional(Transactional.TxType.REQUIRED) - public String getNewEmailAddressForm( - @PathParam("userIdentifier") final String userIdentifierParam - ) { - emailFormModel.setUserIdentifier(userIdentifierParam); - emailFormModel.setAddress("example@example.org"); - emailFormModel.setBouncing(false); - emailFormModel.setVerified(false); - return "org/libreccm/ui/admin/users-groups-roles/email-form.xhtml"; - } + @FormParam("bouncing") + private String bouncingParam; + + @FormParam("verified") + private String verifiedParam; @POST - @Path("/new") + @Path("/") @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @Transactional(Transactional.TxType.REQUIRED) - public String addNewEmailAddress( - @PathParam("userIdentifier") final String userIdentifierParam + public String saveEmailAddress( + @PathParam("userIdentifier") final String userIdentifierParam, + @PathParam("emailIdentifier") final String emailIdentifierParam ) { final Identifier identifier = identifierParser.parseIdentifier( userIdentifierParam @@ -132,11 +120,86 @@ public class EmailFormController { if (result.isPresent()) { final User user = result.get(); - final EmailAddress emailAddress = new EmailAddress(); - emailAddress.setAddress(emailFormModel.getAddress()); - emailAddress.setBouncing(emailAddress.isBouncing()); - emailAddress.setVerified(emailFormModel.isVerified()); - user.addEmailAddress(emailAddress); + // MVC Binding does not work with Krazo 1.1.0-M1 +// if (bindingResult.isFailed()) { +// models.put("errors", bindingResult.getAllMessages()); +// emailFormModel.setUserIdentifier(userIdentifierParam); +// emailFormModel.setAddress(address); +// emailFormModel.setBouncing(bouncing); +// emailFormModel.setVerified(verified); +// +// return "org/libreccm/ui/admin/users-groups-roles/email-form.xhtml"; +// } + if (address == null || address.matches("\\s*")) { + emailFormModel.addMessage( + new Message( + "usergroupsroles.users.user_details.email_addresses.errors.address_empty", + MessageType.DANGER) + ); + emailFormModel.setUserIdentifier(userIdentifierParam); + emailFormModel.setAddress(address); + emailFormModel.setBouncing(bouncingParam != null); + emailFormModel.setVerified(verifiedParam != null); + + return "org/libreccm/ui/admin/users-groups-roles/email-form.xhtml"; + } + + if ("new".equals(emailIdentifierParam)) { + return addEmailAddress(user); + } else { + return updateEmailAddress( + userIdentifierParam, + user, + Integer.parseInt(emailIdentifierParam) + ); + } + + } 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"; + } + } + + private String addEmailAddress(final User user) { + final EmailAddress emailAddress = new EmailAddress(); + emailAddress.setAddress(address); + emailAddress.setBouncing(bouncingParam != null); + emailAddress.setVerified(verifiedParam != null); + user.addEmailAddress(emailAddress); + + userRepository.save(user); + + return String.format( + "redirect:/users-groups-roles/users/%s/details", + user.getName() + ); + } + + private String updateEmailAddress( + final String userIdentifierParam, + final User user, + final int emailId + ) { + 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(bouncingParam != null); + emailAddress.setVerified(verifiedParam != null); userRepository.save(user); @@ -144,143 +207,148 @@ public class EmailFormController { "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.setEmailId(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(emailFormModel.getAddress()); - emailAddress.setBouncing(emailFormModel.isBouncing()); - emailAddress.setVerified(emailFormModel.isVerified()); - - 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"; } } +// @POST +// @Path("/users-groups-roles/users/{userIdentifier}/email-addresses/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(); +// +// if (bindingResult.isFailed()) { +// models.put("errors", bindingResult.getAllMessages()); +// emailFormModel.setUserIdentifier(userIdentifierParam); +// emailFormModel.setAddress(address); +// emailFormModel.setBouncing(bouncing); +// emailFormModel.setVerified(verified); +// +// return "org/libreccm/ui/admin/users-groups-roles/email-form.xhtml"; +// } +// +// 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"; +// } +// } +// +// @POST +// @Path("/users-groups-roles/users/{userIdentifier}/email-addresses/{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 (bindingResult.isFailed()) { +// models.put("errors", bindingResult.getAllMessages()); +// emailFormModel.setUserIdentifier(userIdentifierParam); +// emailFormModel.setEmailId(emailId); +// emailFormModel.setAddress(address); +// emailFormModel.setBouncing(bouncing); +// emailFormModel.setVerified(verified); +// +// return "org/libreccm/ui/admin/users-groups-roles/email-form.xhtml"; +// } +// +// 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 index 20f2bd830..443da7b23 100644 --- 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 @@ -19,6 +19,11 @@ package org.libreccm.ui.admin.usersgroupsroles; import org.libreccm.core.EmailAddress; +import org.libreccm.ui.Message; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import javax.enterprise.context.RequestScoped; import javax.inject.Named; @@ -40,6 +45,24 @@ public class EmailFormModel { private boolean bouncing; private boolean verified; + + private List messages; + + public EmailFormModel() { + this.messages = new ArrayList<>(); + } + + public List getMessages() { + return Collections.unmodifiableList(messages); + } + + public void addMessage(final Message message) { + messages.add(message); + } + + public void setMessages(final List messages) { + this.messages = new ArrayList<>(messages); + } public void setEmailAddress( final String userIdentifier, 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 d61cf8743..704800ac4 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 @@ -21,6 +21,7 @@ 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; @@ -35,6 +36,7 @@ import java.util.Optional; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.mvc.Controller; +import javax.mvc.Models; import javax.mvc.MvcContext; import javax.transaction.Transactional; import javax.ws.rs.DefaultValue; @@ -57,9 +59,15 @@ public class UsersController { @Inject private AdminMessages adminMessages; + @Inject + private EmailFormModel emailFormModel; + @Inject private IdentifierParser identifierParser; + @Inject + private Models models; + @Inject private MvcContext mvc; @@ -233,6 +241,80 @@ public class UsersController { } } + @GET + @Path("/{userIdentifier}/email-addresses/new") + @AuthorizationRequired + @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) + @Transactional(Transactional.TxType.REQUIRED) + public String getNewEmailAddressForm( + @PathParam("userIdentifier") final String userIdentifierParam + ) { + emailFormModel.setUserIdentifier(userIdentifierParam); + return "org/libreccm/ui/admin/users-groups-roles/email-form.xhtml"; + } + + @GET + @Path("/{userIdentifier}/email-addresses/{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("errorUserIdentifier", userIdentifierParam); + models.put("errorEmailId", emailId); + return "org/libreccm/ui/admin/users-groups-roles/email-not-found.xhtml"; + } else { + final EmailAddress emailAddress = user + .getEmailAddresses() + .get(emailId); + emailFormModel.setUserIdentifier(userIdentifierParam); + emailFormModel.setEmailId(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("/{userIdentifier}/email-addresses/{emailId}/remove") @AuthorizationRequired 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 index 1b81c451c..a8a5d164b 100644 --- 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 @@ -7,8 +7,8 @@ - + value="#{EmailFormModel.new ? AdminMessages['usersgroupsroles.users.email.add.title'] : AdminMessages.getMessage('usersgroupsroles.users.email.edit.title', [UserDetailsModel.name])}" /> + - + -
+ + +
-
- + type="checkbox" /> @@ -85,6 +92,6 @@ - + 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 index eb93843ca..37aff6e5d 100644 --- 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 @@ -7,7 +7,7 @@ + value="#{AdminMessages['usersgroupsroles.users.email.not_found.title']}" />