From 743ceeb07decead429a65bb77128544772cd9171 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Fri, 23 Oct 2020 09:45:23 +0200 Subject: [PATCH] Some bugfixes for the users/groups/roles adminstration, JavaDoc --- .../usersgroupsroles/EmailFormController.java | 8 +- .../usersgroupsroles/GroupDetailsModel.java | 4 + .../usersgroupsroles/GroupFormController.java | 78 +++++++-- .../GroupMembersRolesController.java | 4 +- .../usersgroupsroles/GroupUserFormEntry.java | 3 +- .../usersgroupsroles/GroupsController.java | 3 + .../usersgroupsroles/RoleDetailsModel.java | 7 +- .../usersgroupsroles/RoleFormController.java | 84 +++++++-- .../RoleMembersController.java | 5 +- .../usersgroupsroles/RolePartyFormEntry.java | 3 +- .../usersgroupsroles/RolePartyMembership.java | 3 +- .../usersgroupsroles/RolePermission.java | 3 +- .../usersgroupsroles/RolesController.java | 3 + .../usersgroupsroles/UserDetailsModel.java | 24 ++- .../usersgroupsroles/UserFormController.java | 162 ++++++++++++++---- .../UserGroupsRolesController.java | 5 +- .../UsersGroupsRolesController.java | 2 +- .../UsersGroupsRolesPage.java | 2 + .../admin/users-groups-roles/group-form.xhtml | 2 + .../admin/users-groups-roles/role-form.xhtml | 2 + .../admin/users-groups-roles/user-form.xhtml | 5 + .../org/libreccm/ui/AdminBundle.properties | 7 + .../org/libreccm/ui/AdminBundle_de.properties | 7 + 23 files changed, 346 insertions(+), 80 deletions(-) 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 b0868fb54..1aec4519c 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 @@ -44,7 +44,7 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; /** - * Controller managing the post request from the email edit form. + * Controller managing the post requests from the email edit form. * * * @author Jens Pelzetter @@ -59,8 +59,6 @@ public class EmailFormController { @Inject private AdminMessages adminMessages; -// @Inject -// private BindingResult bindingResult; @Inject private EmailFormModel emailFormModel; @@ -76,7 +74,7 @@ public class EmailFormController { @Inject private UserRepository userRepository; - // MVC does not work with Krazo 1.1.0-M1 + // MvcBinding does not work with Krazo 1.1.0-M1 // @MvcBinding @FormParam("address") // @NotBlank @@ -121,7 +119,7 @@ public class EmailFormController { if (result.isPresent()) { final User user = result.get(); - // MVC Binding does not work with Krazo 1.1.0-M1 + // MvcBinding does not work with Krazo 1.1.0-M1 // if (bindingResult.isFailed()) { // models.put("errors", bindingResult.getAllMessages()); // emailFormModel.setUserIdentifier(userIdentifierParam); diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java index b2831bb87..ba2255ae9 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupDetailsModel.java @@ -88,6 +88,10 @@ public class GroupDetailsModel { public String getGroupName() { return groupName; } + + public void setGroupName(final String groupName) { + this.groupName = groupName; + } public List getMembers() { return Collections.unmodifiableList(members); diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupFormController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupFormController.java index 22784c16b..90297e926 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupFormController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupFormController.java @@ -27,24 +27,26 @@ import org.libreccm.security.GroupRepository; import org.libreccm.security.RequiresPrivilege; import org.libreccm.ui.admin.AdminMessages; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; 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.NotBlank; import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; /** - * + * Controller for processing the POST requests from the group form. Depending + * on the value returned by {@link GroupDetailsModel#isNewGroup()} a new group + * is created or an existing group is updated. + * * @author Jens Pelzetter */ @Controller @@ -54,10 +56,13 @@ public class GroupFormController { @Inject private AdminMessages adminMessages; - + @Inject - private BindingResult bindingResult; + private GroupDetailsModel groupDetailsModel; + // MvcBinding does not work with Krazo 1.1.0-M1 +// @Inject +// private BindingResult bindingResult; @Inject private IdentifierParser identifierParser; @@ -67,9 +72,10 @@ public class GroupFormController { @Inject private GroupRepository groupRepository; - @MvcBinding + // MvcBinding does not work with Krazo 1.1.0-M1 +// @MvcBinding @FormParam("groupName") - @NotBlank +// @NotBlank private String groupName; @POST @@ -78,8 +84,29 @@ public class GroupFormController { @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @Transactional(Transactional.TxType.REQUIRED) public String createGroup() { - if (bindingResult.isFailed()) { - models.put("errors", bindingResult.getAllMessages()); + // MvcBinding does not work with Krazo 1.1.0-M1 +// if (bindingResult.isFailed()) { +// models.put("errors", bindingResult.getAllMessages()); +// return "org/libreccm/ui/admin/users-groups-roles/group-form.xhtml"; +// } + final List errors = new ArrayList<>(); + if (groupName == null || groupName.matches("\\s*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.groups.form.errors.name_not_empty" + ) + ); + } + if (!groupName.matches("[a-zA-Z0-9_-]*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.groups.form.errors.name_invalid" + ) + ); + } + if (!errors.isEmpty()) { + models.put("errors", errors); + groupDetailsModel.setGroupName(groupName); return "org/libreccm/ui/admin/users-groups-roles/group-form.xhtml"; } @@ -98,10 +125,6 @@ public class GroupFormController { public String updateGroup( @PathParam("groupIdentifier") final String groupIdentifierParam ) { - if (bindingResult.isFailed()) { - models.put("errors", bindingResult.getAllMessages()); - return "org/libreccm/ui/admin/users-groups-roles/group-form.xhtml"; - } final Identifier identifier = identifierParser.parseIdentifier( groupIdentifierParam @@ -123,6 +146,33 @@ public class GroupFormController { if (result.isPresent()) { final Group group = result.get(); + + // MvcBinding does not work with Krazo 1.1.0-M1 +// if (bindingResult.isFailed()) { +// models.put("errors", bindingResult.getAllMessages()); +// return "org/libreccm/ui/admin/users-groups-roles/group-form.xhtml"; +// } + final List errors = new ArrayList<>(); + if (groupName == null || groupName.matches("\\s*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.groups.form.errors.name_not_empty" + ) + ); + } + if (!groupName.matches("[a-zA-Z_-]*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.groups.form.errors.name_invalid" + ) + ); + } + if (!errors.isEmpty()) { + models.put("errors", errors); + groupDetailsModel.setGroup(group); + return "org/libreccm/ui/admin/users-groups-roles/group-form.xhtml"; + } + group.setName(groupName); groupRepository.save(group); diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupMembersRolesController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupMembersRolesController.java index 80a899071..a7bd8978c 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupMembersRolesController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupMembersRolesController.java @@ -49,7 +49,9 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; /** - * + * Controller for adding members to a group or removing members from a group + * based on the selections in the member form (dialog in group-details). + * * @author Jens Pelzetter */ @Controller diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserFormEntry.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserFormEntry.java index d56e71d83..24b051d9f 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserFormEntry.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupUserFormEntry.java @@ -19,7 +19,8 @@ package org.libreccm.ui.admin.usersgroupsroles; /** - * + * Model of an entry in the form for managing the members of group. + * * @author Jens Pelzetter */ public class GroupUserFormEntry { diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupsController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupsController.java index 69147e572..4f21c91d6 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupsController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/GroupsController.java @@ -49,6 +49,9 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; /** + * Primary controller for managing groups. Retrieves data for the views and + * shows them. Processing of POST requests from the forms is done in other + * controllers. * * @author Jens Pelzetter */ diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleDetailsModel.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleDetailsModel.java index a22f07c45..2b822ed1d 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleDetailsModel.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleDetailsModel.java @@ -36,7 +36,8 @@ import javax.inject.Named; import javax.transaction.Transactional; /** - * + * Provides the data for the details view of a role and the role edit form. + * * @author Jens Pelzetter */ @RequestScoped @@ -81,6 +82,10 @@ public class RoleDetailsModel { public String getRoleName() { return roleName; } + + public void setRoleName(final String roleName) { + this.roleName = roleName; + } public List getMembers() { return Collections.unmodifiableList(members); diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleFormController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleFormController.java index 80df106d9..6f9abd5fe 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleFormController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleFormController.java @@ -27,24 +27,26 @@ import org.libreccm.security.Role; import org.libreccm.security.RoleRepository; import org.libreccm.ui.admin.AdminMessages; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; 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.NotBlank; import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.PathParam; /** - * + * Processes the POST requests from the role edit form. Depending on the value + * returned by {@link RoleDetailsModel#isNewRole()} a new role is created or + * an existing role updated. + * * @author Jens Pelzetter */ @Controller @@ -55,21 +57,25 @@ public class RoleFormController { @Inject private AdminMessages adminMessages; - @Inject - private BindingResult bindingResult; - + // MvcBinding does not work with Krazo 1.1.0-M1 +// @Inject +// private BindingResult bindingResult; @Inject private IdentifierParser identifierParser; @Inject private Models models; + @Inject + private RoleDetailsModel roleDetailsModel; + @Inject private RoleRepository roleRepository; - @MvcBinding + // MvcBinding does not work with Krazo 1.1.0-M1 +// @MvcBinding @FormParam("roleName") - @NotBlank +// @NotBlank private String roleName; @POST @@ -78,8 +84,29 @@ public class RoleFormController { @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @Transactional(Transactional.TxType.REQUIRED) public String createRole() { - if (bindingResult.isFailed()) { - models.put("errors", bindingResult.getAllMessages()); + // MvcBinding does not work with Krazo 1.1.0-M1 +// if (bindingResult.isFailed()) { +// models.put("errors", bindingResult.getAllMessages()); +// return "org/libreccm/ui/admin/users-groups-roles/role-form.xhtml"; +// } + final List errors = new ArrayList<>(); + if (roleName == null || roleName.matches("\\s*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.roles.form.errors.name_not_empty" + ) + ); + } + if (!roleName.matches("[a-zA-Z0-9_-]")) { + errors.add( + adminMessages.get( + "usersgroupsroles.roles.form.errors.name_invalid" + ) + ); + } + if (!errors.isEmpty()) { + models.put("errors", errors); + roleDetailsModel.setRoleName(roleName); return "org/libreccm/ui/admin/users-groups-roles/role-form.xhtml"; } @@ -98,11 +125,6 @@ public class RoleFormController { public String updateRole( @PathParam("roleIdentifier") final String roleIdentifierParam ) { - if (bindingResult.isFailed()) { - models.put("errors", bindingResult.getAllMessages()); - return "org/libreccm/ui/admin/users-groups-roles/role-form.xhtml"; - } - final Identifier identifier = identifierParser.parseIdentifier( roleIdentifierParam ); @@ -120,11 +142,37 @@ public class RoleFormController { result = roleRepository.findByName(identifier.getIdentifier()); break; } - + if (result.isPresent()) { final Role role = result.get(); - role.setName(roleName); + + // MvcBinding does not work with Krazo 1.1.0-M1 +// if (bindingResult.isFailed()) { +// models.put("errors", bindingResult.getAllMessages()); +// return "org/libreccm/ui/admin/users-groups-roles/role-form.xhtml"; +// } + final List errors = new ArrayList<>(); + if (roleName == null || roleName.matches("\\s*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.roles.form.errors.name_not_empty" + ) + ); + } + if (!roleName.matches("[a-zA-Z0-9_-]")) { + errors.add( + adminMessages.get( + "usersgroupsroles.roles.form.errors.name_invalid" + ) + ); + } + if (!errors.isEmpty()) { + models.put("errors", errors); + roleDetailsModel.setRole(role); + return "org/libreccm/ui/admin/users-groups-roles/role-form.xhtml"; + } + role.setName(roleName); return "redirect:users-groups-roles/roles"; } else { models.put( diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleMembersController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleMembersController.java index 8bf005a29..340caa9b9 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleMembersController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RoleMembersController.java @@ -46,7 +46,10 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; /** - * + * Controller for adding members to a role and removing members from a role + * depending on the selections in the role members management form (dialog in + * role details). + * * @author Jens Pelzetter */ @Controller diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePartyFormEntry.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePartyFormEntry.java index cab35dc5e..0b1c2acf2 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePartyFormEntry.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePartyFormEntry.java @@ -19,7 +19,8 @@ package org.libreccm.ui.admin.usersgroupsroles; /** - * + * Model for an entry in the role members form. + * * @author Jens Pelzetter */ public class RolePartyFormEntry { diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePartyMembership.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePartyMembership.java index c5b272468..e82ab66fc 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePartyMembership.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePartyMembership.java @@ -23,7 +23,8 @@ import org.libreccm.security.Party; import java.util.Objects; /** - * + * Model friendly representation of a member of a role. + * * @author Jens Pelzetter */ public class RolePartyMembership implements Comparable{ diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePermission.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePermission.java index c17199a7f..0c34c5a0e 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePermission.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolePermission.java @@ -23,7 +23,8 @@ import org.libreccm.security.Permission; import java.util.Objects; /** - * + * Model friendly representation of a permission granted to a role. + * * @author Jens Pelzetter */ public class RolePermission implements Comparable { diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolesController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolesController.java index f71b5080e..b03aac08c 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolesController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/RolesController.java @@ -45,6 +45,9 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; /** + * Primary controller for managing roles. Retrieves the data for the views for + * manageing roles. POST requests from the forms a processed by other + * controllers. * * @author Jens Pelzetter */ 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 78d052288..5a9b208d3 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 @@ -134,19 +134,31 @@ public class UserDetailsModel { public String getName() { return name; } + + public void setName(final String name) { + this.name = name; + } public String getGivenName() { return givenName; } + + public void setGivenName(final String givenName) { + this.givenName = givenName; + } public String getFamilyName() { return familyName; } + + public void setFamilyName(final String familyName) { + this.familyName = familyName; + } public EmailAddress getPrimaryEmailAddress() { return primaryEmailAddress; } - + public List getEmailAddresses() { return Collections.unmodifiableList(emailAddresses); } @@ -154,10 +166,20 @@ public class UserDetailsModel { public boolean isBanned() { return banned; } + + public void setBanned(final boolean banned) { + this.banned = banned; + } public boolean isPasswordResetRequired() { return passwordResetRequired; } + + public void setPasswordResetRequired( + final boolean passwordResetRequired + ) { + this.passwordResetRequired = passwordResetRequired; + } public List getGroupMemberships() { return Collections.unmodifiableList(groupMemberships); 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 index 57cbb9968..d7ffba95b 100644 --- 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 @@ -28,8 +28,9 @@ import org.libreccm.security.UserManager; import org.libreccm.security.UserRepository; import org.libreccm.ui.admin.AdminMessages; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Map; +import java.util.List; import java.util.Objects; import java.util.Optional; @@ -37,12 +38,7 @@ import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.mvc.Controller; import javax.mvc.Models; -import javax.mvc.MvcContext; -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; @@ -61,9 +57,9 @@ public class UserFormController { @Inject private AdminMessages adminMessages; - @Inject - private BindingResult bindingResult; - + // MvcBinding does not work with Krazo 1.1.0-M1 +// @Inject +// private BindingResult bindingResult; @Inject private IdentifierParser identifierParser; @@ -71,7 +67,7 @@ public class UserFormController { private Models models; @Inject - private MvcContext mvc; + private UserDetailsModel userDetailsModel; @Inject private UserManager userManager; @@ -79,9 +75,10 @@ public class UserFormController { @Inject private UserRepository userRepository; - @MvcBinding + // MvcBinding does not work with Krazo 1.1.0-M1 +// @MvcBinding @FormParam("userName") - @NotBlank +// @NotBlank private String userName; @FormParam("givenName") @@ -90,10 +87,11 @@ public class UserFormController { @FormParam("familyName") private String familyName; - @MvcBinding + // MvcBinding does not work with Krazo 1.1.0-M1 +// @MvcBinding @FormParam("primaryEmailAddress") - @NotBlank - @Email +// @NotBlank +// @Email private String primaryEmailAddress; @FormParam("primaryEmailAddressBouncing") @@ -120,24 +118,75 @@ public class UserFormController { @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"; + // MvcBinding does not work with Krazo 1.1.0-M1 +// if (bindingResult.isFailed()) { +// models.put("errors", bindingResult.getAllMessages()); +// return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; +// } + final List errors = new ArrayList<>(); + if (userName == null || userName.matches("\\s*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.users.form.errors.username.empty" + ) + ); + } + if (!userName.matches("[a-zA-Z0-9_-]*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.users.form.errors.username.invalid" + ) + ); + } + + if (primaryEmailAddress == null || primaryEmailAddress.matches("\\s*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.users.form.errors.primary_email.empty" + ) + ); + } + if (!primaryEmailAddress.matches( + "^[a-zA-Z0-9\\._-]*@[a-zA-Z0-9\\._-]*$" + )) { + errors.add( + adminMessages.get( + "usersgroupsroles.users.form.errors.primary_email.invalid" + ) + ); } 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"; + errors.add( + adminMessages.get( + "usersgroupsroles.users.new.errors.password.empty" + ) + ); } if (!Objects.equals(password, passwordConfirmation)) { - models.put("errors", Arrays.asList( - adminMessages.get( - "usersgroupsroles.users.new.errors.password.no_match") - )); + errors.add( + adminMessages.get( + "usersgroupsroles.users.new.errors.password.no_match" + ) + ); + } + if (!errors.isEmpty()) { + models.put("errors", errors); + userDetailsModel.setName(userName); + userDetailsModel.setGivenName(givenName); + userDetailsModel.setFamilyName(familyName); + userDetailsModel + .getPrimaryEmailAddress() + .setAddress(primaryEmailAddress); + userDetailsModel + .getPrimaryEmailAddress() + .setBouncing(primaryEmailAddressBouncing); + userDetailsModel + .getPrimaryEmailAddress() + .setVerified(primaryEmailAddressVerified); + userDetailsModel.setBanned(banned); + userDetailsModel.setPasswordResetRequired(passwordResetRequired); return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; } @@ -156,11 +205,6 @@ public class UserFormController { 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 ); @@ -183,6 +227,60 @@ public class UserFormController { if (result.isPresent()) { final User user = result.get(); + + // MvcBinding does not work with Krazo 1.1.0-M1 +// if (bindingResult.isFailed()) { +// models.put("errors", bindingResult.getAllMessages()); +// return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; +// } + final List errors = new ArrayList<>(); + if (userName == null || userName.matches("\\s*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.users.form.errors.username.empty" + ) + ); + } + if (!userName.matches("[a-zA-Z0-9_-]*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.users.form.errors.username.invalid" + ) + ); + } + + if (primaryEmailAddress == null || primaryEmailAddress.matches( + "\\s*")) { + errors.add( + adminMessages.get( + "usersgroupsroles.users.form.errors.primary_email.empty" + ) + ); + } + if (!primaryEmailAddress.matches( + "^[a-zA-Z0-9\\._-]*@[a-zA-Z0-9\\._-]*$" + )) { + errors.add( + adminMessages.get( + "usersgroupsroles.users.form.errors.primary_email.invalid" + ) + ); + } + + if (password != null) { + if (!Objects.equals(password, passwordConfirmation)) { + errors.add( + adminMessages.get( + "usersgroupsroles.users.new.errors.password.no_match" + ) + ); + } + } + if (!errors.isEmpty()) { + userDetailsModel.setUser(user); + return "org/libreccm/ui/admin/users-groups-roles/user-form.xhtml"; + } + user.setUuid(userName); user.setGivenName(givenName); user.setFamilyName(familyName); diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserGroupsRolesController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserGroupsRolesController.java index 9afa33c92..bf54ce05c 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserGroupsRolesController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UserGroupsRolesController.java @@ -35,7 +35,6 @@ import org.libreccm.ui.admin.AdminMessages; import java.util.Arrays; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; @@ -50,7 +49,9 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; /** - * + * Adds and removes a user from groups and roles depending on the selections + * in the corresponding dialogs in the user details view. + * * @author Jens Pelzetter */ @Controller diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesController.java index 70951149a..c724cb047 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesController.java @@ -28,7 +28,7 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; /** - * + * Controller for the overview page of the users/groups/roles admin section. * * @author Jens Pelzetter */ diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesPage.java b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesPage.java index 2a2c833d5..0b3e39d9c 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesPage.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/usersgroupsroles/UsersGroupsRolesPage.java @@ -27,6 +27,8 @@ import java.util.Set; import javax.enterprise.context.ApplicationScoped; /** + * {@link AdminPage} implementation for the users/groups/roles section of the + * AdminUI. * * @author Jens Pelzetter */ diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-form.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-form.xhtml index 8dbdfcfc7..389b7ec73 100644 --- a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-form.xhtml +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/users-groups-roles/group-form.xhtml @@ -47,6 +47,8 @@ class="form-control" id="groupname" name="groupName" + pattern="[a-zA-Z0-9_-]*" + required="required" value="#{GroupDetailsModel.groupName}" type="text" /> @@ -143,6 +147,7 @@ class="form-control" id="password-confirmation" name="passwordConfirmation" + required="required" type="password" /> 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 0597f2db6..2503fdeb8 100644 --- a/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties +++ b/ccm-core/src/main/resources/org/libreccm/ui/AdminBundle.properties @@ -199,3 +199,10 @@ usersgroupsroles.roles.delete.confirm.message=Are you sure to delete role {0}? usersgroupsroles.roles.delete.confirm.cancel=Cancel usersgroupsroles.roles.delete.confirm.yes=Delete role usersgroupsroles.roles.role_details.uuid=UUID +usersgroupsroles.groups.form.errors.name_not_empty=The name of a group can't be empty +usersgroupsroles.groups.form.errors.name_invalid=The name of a group may only contain the characters a to z, A to Z, 0 to 9, the dash (-), and the underscore (_). +usersgroupsroles.roles.form.errors.name_not_empty=The name of a role can't be empty +usersgroupsroles.users.form.errors.username.empty=The username of a user can't be empty +usersgroupsroles.users.form.errors.username.invalid=The username may only contain the characters a to z, A to Z, 0 to 9, the dash (-) and the underscore (_) +usersgroupsroles.users.form.errors.primary_email.empty=The primary email address of a user can't b be empty +usersgroupsroles.users.form.errors.primary_email.invalid=The primary email address of a user must be a valid 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 4c184f715..c856e17f0 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 @@ -199,3 +199,10 @@ usersgroupsroles.roles.delete.confirm.message=Sind Sie sicher, dass Sie die Roll usersgroupsroles.roles.delete.confirm.cancel=Abbrechen usersgroupsroles.roles.delete.confirm.yes=Rolle l\u00f6schen usersgroupsroles.roles.role_details.uuid=UUID +usersgroupsroles.groups.form.errors.name_not_empty=Der Name einer Gruppe darf nicht leer sein +usersgroupsroles.groups.form.errors.name_invalid=Der Name einer Gruppe darf nur die Zeichen a bis z, A bis Z, 0 bis 9, den Bindestrich (-) und den Unterstrich (_) enthalten +usersgroupsroles.roles.form.errors.name_not_empty=Der Name einer Rolle darf nicht leer sein +usersgroupsroles.users.form.errors.username.empty=Der Benutzername eines Benutzers darf nicht leer sein +usersgroupsroles.users.form.errors.username.invalid=Der Benutzername eines Benutzers darf nur die Zeichen a bis z, A bis Z, 0 bis 9, den Bindestrich (-) und den Unterstrich (_) enthalten +usersgroupsroles.users.form.errors.primary_email.empty=Die prim\u00e4re E-Mail-Addresse eines Benutzers darf nicht leer sein. +usersgroupsroles.users.form.errors.primary_email.invalid=Die prim\u00e4re E-Mail-Addresse eines Benutzers muss eine valide E-Mail-Addresse sein