From 87dea3cebda076f37bb58c504d48ce1f7cbf29a8 Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Sun, 24 May 2020 14:00:23 +0200 Subject: [PATCH] Don't use embedded entity for email address in User class --- .../main/java/org/libreccm/security/User.java | 75 +++++++++++++------ .../org/libreccm/security/UserManager.java | 9 +-- .../org/libreccm/security/UserRepository.java | 29 ++++--- .../categorization/CategoryManagerTest.java | 3 + .../libreccm/security/ListContainsTest.java | 12 +-- .../security/PartyRepositoryTest.java | 13 ++-- .../libreccm/security/UserRepositoryTest.java | 17 ++--- .../test-persistence.xml | 7 +- .../OneTimeAuthManagerTest/after-create.xml | 4 +- .../after-invalidate.xml | 4 +- .../security/OneTimeAuthManagerTest/data.xml | 4 +- .../security/RoleManagerTest/after-add.yml | 2 +- .../security/RoleManagerTest/after-remove.yml | 2 +- .../security/RoleManagerTest/data.yml | 2 +- .../UserManagerTest/after-create-user.yml | 2 +- .../security/UserManagerTest/data.yml | 12 ++- 16 files changed, 119 insertions(+), 78 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 75ca63024..02c73a316 100644 --- a/ccm-core/src/main/java/org/libreccm/security/User.java +++ b/ccm-core/src/main/java/org/libreccm/security/User.java @@ -45,15 +45,22 @@ import javax.json.Json; import javax.json.JsonArrayBuilder; import javax.json.JsonObjectBuilder; import javax.persistence.Column; +import javax.persistence.ColumnResult; import javax.persistence.Entity; +import javax.persistence.EntityResult; import javax.persistence.FetchType; +import javax.persistence.FieldResult; import javax.persistence.NamedAttributeNode; import javax.persistence.NamedEntityGraph; import javax.persistence.NamedEntityGraphs; +import javax.persistence.NamedNativeQueries; +import javax.persistence.NamedNativeQuery; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; import javax.persistence.NamedSubgraph; import javax.persistence.OneToMany; +import javax.persistence.SqlResultSetMapping; +import javax.persistence.SqlResultSetMappings; import javax.persistence.Table; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; @@ -84,16 +91,16 @@ import javax.xml.bind.annotation.XmlTransient; ), @NamedQuery(name = "User.countByName", query = "SELECT COUNT(u) FROM User u WHERE u.name = :name"), -// @NamedQuery(name = "User.findByEmailAddress", -// query = "SELECT u FROM User u WHERE " -// + "u.primaryEmailAddress.address = :emailAddress " -// + "ORDER BY u.name, " -// + " u.familyName, " -// + " u.givenName, " -// + " u.primaryEmailAddress.address"), -// @NamedQuery(name = "User.countByPrimaryEmailAddress", -// query = "SELECT COUNT(u) FROM User u " -// + "WHERE u.primaryEmailAddress.address = :emailAddress"), + @NamedQuery(name = "User.findByEmailAddress", + query = "SELECT u FROM User u WHERE " + + "u.primaryEmailAddress = :emailAddress " + + "ORDER BY u.name, " + + " u.familyName, " + + " u.givenName, " + + " u.primaryEmailAddress"), + @NamedQuery(name = "User.countByPrimaryEmailAddress", + query = "SELECT COUNT(u) FROM User u " + + "WHERE u.primaryEmailAddress.address = :emailAddress"), @NamedQuery( name = "User.filterByNameAndEmail", query = "SELECT u FROM User u WHERE " @@ -104,12 +111,12 @@ import javax.xml.bind.annotation.XmlTransient; + "u.familyName, " + "u.givenName" ), -// @NamedQuery( -// name = "User.findAllOrderedByUsername", -// query = "SELECT u FROM User u ORDER BY u.name, " -// + " u.familyName, " -// + " u.givenName, " -// + " u.primaryEmailAddress.address"), + @NamedQuery( + name = "User.findAllOrderedByUsername", + query = "SELECT u FROM User u ORDER BY u.name, " + + " u.familyName, " + + " u.givenName, " + + " u.primaryEmailAddress"), @NamedQuery(name = "User.findByGroup", query = "SELECT u FROM User u " + "JOIN u.groupMemberships m " @@ -168,16 +175,22 @@ public class User extends Party implements Serializable, Exportable { * The primary email address of the user. */ @Column(name = "PRIMARY_EMAIL_ADDRESS") - @Type(type = "org.libreccm.core.EmailAddressType") @NotNull @XmlElement(name = "primary-email-address", namespace = CORE_XML_NS) - private EmailAddress primaryEmailAddress; + private String primaryEmailAddress; + + @Column(name = "PRIMARY_EMAIL_ADDRESS_BOUNCING") + private boolean primaryEmailAddressBouncing; + + @Column(name = "PRIMARY_EMAIL_ADDRESS_VERIFIED") + private boolean primaryEmailAddressVerified; /** * Additional email addresses of the user. */ @Column(name = "EMAIL_ADDRESSES") @Type(type = "org.libreccm.core.EmailAddressListType") + @Deprecated @XmlElementWrapper(name = "email-addresses", namespace = CORE_XML_NS) @XmlElement(name = "email-address", namespace = CORE_XML_NS) private List emailAddresses; @@ -238,14 +251,31 @@ public class User extends Party implements Serializable, Exportable { this.familyName = familyName; } - public EmailAddress getPrimaryEmailAddress() { + public String getPrimaryEmailAddress() { return primaryEmailAddress; } - public void setPrimaryEmailAddress(final EmailAddress primaryEmailAddress) { + public void setPrimaryEmailAddress(final String primaryEmailAddress) { this.primaryEmailAddress = primaryEmailAddress; } + + public boolean isPrimaryEmailAddressBouncing() { + return primaryEmailAddressBouncing; + } + + public void setPrimaryEmailAddressBouncing(final boolean bouncing) { + primaryEmailAddressBouncing = bouncing; + } + + public boolean isPrimaryEmailAddressVerified() { + return primaryEmailAddressVerified; + } + + public void setPrimaryEmailAddressVerified(final boolean verified) { + primaryEmailAddressVerified = verified; + } + @Deprecated public List getEmailAddresses() { if (emailAddresses == null) { return null; @@ -254,6 +284,7 @@ public class User extends Party implements Serializable, Exportable { } } + @Deprecated protected void setEmailAddresses(final List emailAddresses) { this.emailAddresses = new ArrayList<>(emailAddresses); } @@ -363,7 +394,9 @@ public class User extends Party implements Serializable, Exportable { .buildJson() .add("givenName", givenName) .add("familyName", familyName) - .add("primaryEmailAddress", primaryEmailAddress.buildJson()) + .add("primaryEmailAddress", primaryEmailAddress) + .add("primaryEmailAddressBouncing", primaryEmailAddressBouncing) + .add("primaryEmailAddressVerified", primaryEmailAddressVerified) .add( "emailAddresses", emailAddresses diff --git a/ccm-core/src/main/java/org/libreccm/security/UserManager.java b/ccm-core/src/main/java/org/libreccm/security/UserManager.java index 22fcbe298..4ad178743 100644 --- a/ccm-core/src/main/java/org/libreccm/security/UserManager.java +++ b/ccm-core/src/main/java/org/libreccm/security/UserManager.java @@ -94,10 +94,9 @@ public class UserManager implements Serializable { user.setGivenName(givenName); user.setFamilyName(familyName); user.setName(name); - final EmailAddress email = new EmailAddress(); - email.setAddress(emailAddress); - user.setPrimaryEmailAddress(email); - email.setVerified(true); + user.setPrimaryEmailAddress(emailAddress); + user.setPrimaryEmailAddressBouncing(false); + user.setPrimaryEmailAddressVerified(true); if (password == null) { user.setPassword(null); } else { @@ -131,7 +130,7 @@ public class UserManager implements Serializable { final KernelConfig kernelConfig = confManager.findConfiguration( KernelConfig.class); if (kernelConfig.emailIsPrimaryIdentifier()) { - userIdentifier = user.getPrimaryEmailAddress().getAddress(); + userIdentifier = user.getPrimaryEmailAddress(); } else { userIdentifier = user.getName(); } diff --git a/ccm-core/src/main/java/org/libreccm/security/UserRepository.java b/ccm-core/src/main/java/org/libreccm/security/UserRepository.java index 44ee36cdb..68227f8d9 100644 --- a/ccm-core/src/main/java/org/libreccm/security/UserRepository.java +++ b/ccm-core/src/main/java/org/libreccm/security/UserRepository.java @@ -18,8 +18,11 @@ */ package org.libreccm.security; +import org.hibernate.Session; import org.libreccm.core.AbstractEntityRepository; import org.libreccm.core.CoreConstants; +import org.libreccm.core.EmailAddressListType; +import org.libreccm.core.EmailAddressType; import javax.enterprise.context.RequestScoped; import javax.persistence.EntityGraph; @@ -30,6 +33,9 @@ import java.util.List; import java.util.Optional; import java.util.UUID; +import javax.persistence.NoResultException; +import javax.persistence.Query; + /** * Repository for user objects. * @@ -49,7 +55,7 @@ public class UserRepository extends AbstractEntityRepository { public String getIdAttributeName() { return "partyId"; } - + @Override public Long getIdOfEntity(final User entity) { return entity.getPartyId(); @@ -70,7 +76,7 @@ public class UserRepository extends AbstractEntityRepository { return getSingleResult(query); } - + /** * Finds a user by its user name. * @@ -138,11 +144,16 @@ public class UserRepository extends AbstractEntityRepository { * is no matching user {@code null} is returned. */ public Optional findByEmailAddress(final String emailAddress) { - final TypedQuery query = getEntityManager().createNamedQuery( - "User.findByEmailAddress", User.class); - query.setParameter("emailAddress", emailAddress); - - return getSingleResult(query); + try { + return Optional.of( + getEntityManager() + .createNamedQuery("User.findByEmailAddress", User.class) + .setParameter("emailAddress", emailAddress) + .getSingleResult() + ); + } catch (NoResultException ex) { + return Optional.empty(); + } } public Optional findByEmailAddress(final String emailAddress, @@ -206,12 +217,10 @@ public class UserRepository extends AbstractEntityRepository { @Override protected void initNewEntity(final User entity) { - + entity.setUuid(UUID.randomUUID().toString()); } - - @AuthorizationRequired @RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN) @Transactional(Transactional.TxType.REQUIRED) diff --git a/ccm-core/src/test/java/org/libreccm/categorization/CategoryManagerTest.java b/ccm-core/src/test/java/org/libreccm/categorization/CategoryManagerTest.java index ea54311e3..872317641 100644 --- a/ccm-core/src/test/java/org/libreccm/categorization/CategoryManagerTest.java +++ b/ccm-core/src/test/java/org/libreccm/categorization/CategoryManagerTest.java @@ -154,6 +154,9 @@ public class CategoryManagerTest { org.libreccm.testutils.dbunit.PgSqlJsonbType.class ) .addClass(org.libreccm.hibernate.AbstractCcmJsonUserType.class) + .addClass( + org.libreccm.hibernate.dialects.LibreCcmPgSql9Dialect.class + ) .addAsLibraries(getModuleDependencies()) .addAsResource("configs/shiro.ini", "shiro.ini") .addAsResource("test-persistence.xml", diff --git a/ccm-core/src/test/java/org/libreccm/security/ListContainsTest.java b/ccm-core/src/test/java/org/libreccm/security/ListContainsTest.java index 827602255..9efe9ca96 100644 --- a/ccm-core/src/test/java/org/libreccm/security/ListContainsTest.java +++ b/ccm-core/src/test/java/org/libreccm/security/ListContainsTest.java @@ -65,25 +65,19 @@ public class ListContainsTest { user1.setName("user1"); user1.setGivenName("User"); user1.setFamilyName("One"); - final EmailAddress user1mail = new EmailAddress(); - user1mail.setAddress("user.one@example.org"); - user1.setPrimaryEmailAddress(user1mail); + user1.setPrimaryEmailAddress("user.one@example.org"); final User user2 = new User(); user2.setName("user2"); user2.setGivenName("User"); user2.setFamilyName("Two"); - final EmailAddress user2mail = new EmailAddress(); - user2mail.setAddress("user.two@example.org"); - user2.setPrimaryEmailAddress(user1mail); + user2.setPrimaryEmailAddress("user.two@example.org"); final User user3 = new User(); user3.setName("user3"); user3.setGivenName("User"); user3.setFamilyName("Three"); - final EmailAddress user3mail = new EmailAddress(); - user3mail.setAddress("user.three@example.org"); - user3.setPrimaryEmailAddress(user1mail); + user3.setPrimaryEmailAddress("user.three@example.org"); final List users = new ArrayList<>(); users.add(user1); diff --git a/ccm-core/src/test/java/org/libreccm/security/PartyRepositoryTest.java b/ccm-core/src/test/java/org/libreccm/security/PartyRepositoryTest.java index 46859d060..f319c01aa 100644 --- a/ccm-core/src/test/java/org/libreccm/security/PartyRepositoryTest.java +++ b/ccm-core/src/test/java/org/libreccm/security/PartyRepositoryTest.java @@ -63,8 +63,8 @@ import org.jboss.arquillian.persistence.TestExecutionPhase; @RunWith(Arquillian.class) @PersistenceTest @Transactional(TransactionMode.COMMIT) -@CreateSchema({"001_create_schema.sql", - "002_create_ccm_core_tables.sql", +@CreateSchema({"001_create_schema.sql", + "002_create_ccm_core_tables.sql", "003_init_hibernate_sequence.sql"}) @CleanupUsingScript(value = {"999_cleanup.sql"}, phase = TestExecutionPhase.BEFORE) @@ -218,15 +218,12 @@ public class PartyRepositoryTest { public void saveNewParty() { final User mmuster = new User(); - final EmailAddress emailAddress = new EmailAddress(); - emailAddress.setAddress("max.mustermann@example.org"); - emailAddress.setBouncing(false); - emailAddress.setVerified(true); - mmuster.setName("mmuster"); mmuster.setGivenName("Max"); mmuster.setFamilyName("Mustermann"); - mmuster.setPrimaryEmailAddress(emailAddress); + mmuster.setPrimaryEmailAddress("max.mustermann@example.org"); + mmuster.setPrimaryEmailAddressBouncing(false); + mmuster.setPrimaryEmailAddressVerified(true); mmuster.setPassword( "$shiro1$SHA-512$500000$Y7CnccN1h25sR7KCElMOXg==$CVLWBhetodaEzzhDfGjRcCFZtSW02xOnjH7xhBx0lbxO66grKIt6LWmXoUhLEydce1JZ7cbzNLYOxIwwTeqi5Q=="); mmuster.setPasswordResetRequired(false); diff --git a/ccm-core/src/test/java/org/libreccm/security/UserRepositoryTest.java b/ccm-core/src/test/java/org/libreccm/security/UserRepositoryTest.java index 4f7aa4b58..16f8a99ab 100644 --- a/ccm-core/src/test/java/org/libreccm/security/UserRepositoryTest.java +++ b/ccm-core/src/test/java/org/libreccm/security/UserRepositoryTest.java @@ -260,15 +260,12 @@ public class UserRepositoryTest { public void saveNewUser() { final User user = new User(); - final EmailAddress emailAddress = new EmailAddress(); - emailAddress.setAddress("jane.doe@example.org"); - emailAddress.setBouncing(false); - emailAddress.setVerified(false); - user.setName("jane"); user.setGivenName("Jane"); user.setFamilyName("Doe"); - user.setPrimaryEmailAddress(emailAddress); + user.setPrimaryEmailAddress("jane.doe@example.org"); + user.setPrimaryEmailAddressBouncing(false); + user.setPrimaryEmailAddressVerified(false); user.setPassword( "$shiro1$SHA-512$500000$24lA090z7GKYr4VFlZ6t4A==$/heoTHPA5huT1UfJ8Q+waXEG6AjUKhFYLFrj7KW/l0/z9O+QkiZTtfPfbcPblgjcEvrROMEIoQY4Z65S7rFLQg=="); user.setPasswordResetRequired(false); @@ -289,11 +286,9 @@ public class UserRepositoryTest { user.setPassword( "$shiro1$SHA-512$500000$AH1llRaMHE8W31Q7VG6jsA==$XXgKeyDCsrN23NvszQ5wt+uViQUlVqTAM+05LrE7Bd9sc0eaJT8HlAGvSdY+rqTLbiGm9YS4pohzoUt1x3kmKg=="); - final EmailAddress emailAddress = new EmailAddress(); - emailAddress.setAddress("jd@example.com"); - emailAddress.setBouncing(false); - emailAddress.setVerified(true); - user.setPrimaryEmailAddress(emailAddress); + user.setPrimaryEmailAddress("jd@example.com"); + user.setPrimaryEmailAddressBouncing(false); + user.setPrimaryEmailAddressVerified(true); shiro.getSystemUser().execute(() -> userRepository.save(user)); } diff --git a/ccm-core/src/test/resources-wildfly-remote-pgsql/test-persistence.xml b/ccm-core/src/test/resources-wildfly-remote-pgsql/test-persistence.xml index 02d9cd7c9..3763e0009 100644 --- a/ccm-core/src/test/resources-wildfly-remote-pgsql/test-persistence.xml +++ b/ccm-core/src/test/resources-wildfly-remote-pgsql/test-persistence.xml @@ -26,6 +26,11 @@ + + + value="org.hibernate.envers.strategy.ValidityAuditStrategy"/>--> diff --git a/ccm-core/src/test/resources/datasets/org/libreccm/security/OneTimeAuthManagerTest/after-create.xml b/ccm-core/src/test/resources/datasets/org/libreccm/security/OneTimeAuthManagerTest/after-create.xml index d631a360b..5f550adfd 100644 --- a/ccm-core/src/test/resources/datasets/org/libreccm/security/OneTimeAuthManagerTest/after-create.xml +++ b/ccm-core/src/test/resources/datasets/org/libreccm/security/OneTimeAuthManagerTest/after-create.xml @@ -31,7 +31,7 @@