From f268712e0af20283ad4ed490622f8fe09de2a78c Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 18 Oct 2013 10:20:02 +0200
Subject: [PATCH] OO-809: fix the wrong equals for non-mysql database in
 findIdentiesByEmail (patch 1 of S. Clemenz), add unit tests

---
 .../java/org/olat/user/UserManagerImpl.java   | 15 ++--
 .../java/org/olat/user/UserManagerTest.java   | 79 ++++++++++++++++---
 2 files changed, 78 insertions(+), 16 deletions(-)

diff --git a/src/main/java/org/olat/user/UserManagerImpl.java b/src/main/java/org/olat/user/UserManagerImpl.java
index d3d5269ea06..0de81c5c2e8 100644
--- a/src/main/java/org/olat/user/UserManagerImpl.java
+++ b/src/main/java/org/olat/user/UserManagerImpl.java
@@ -25,7 +25,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -204,14 +203,16 @@ public class UserManagerImpl extends UserManager {
 	@Override
 	public List<Identity> findIdentitiesByEmail(List<String> emailList) {
 		List<String> emails = new ArrayList<String>(emailList);
-		for(Iterator<String> emailIt=emails.iterator(); emailIt.hasNext(); ) {
-			String email = emailIt.next();
+		for (int i=0; i<emails.size(); i++) {
+			String email = emails.get(i).toLowerCase();
 			if (!MailHelper.isValidEmailAddress(email)) {
-				emailIt.remove();
+				emails.remove(i);
 				logWarn("Invalid email address: " + email, null);
 			}
+			else {
+				emails.set(i, email);
+			}
 		}
-		
 		if(emails.isEmpty()) {
 			return Collections.emptyList();
 		}
@@ -225,7 +226,7 @@ public class UserManagerImpl extends UserManager {
 		if(mysql) {
 			emailSb.append(" user.properties['").append(UserConstants.EMAIL).append("']  in (:emails) ");
 		} else {
-			emailSb.append(" lower(user.properties['").append(UserConstants.EMAIL).append("']) = lower(:emails)");
+			emailSb.append(" lower(user.properties['").append(UserConstants.EMAIL).append("']) in (:emails)");
 		}
 
 		List<Identity> identities = dbInstance.getCurrentEntityManager()
@@ -237,7 +238,7 @@ public class UserManagerImpl extends UserManager {
 		if(mysql) {
 			institutionalSb.append(" user.properties['").append(UserConstants.INSTITUTIONALEMAIL).append("'] in (:emails) ");
 		} else {
-			institutionalSb.append(" lower(user.properties['").append(UserConstants.INSTITUTIONALEMAIL).append("']) = lower(:emails)");
+			institutionalSb.append(" lower(user.properties['").append(UserConstants.INSTITUTIONALEMAIL).append("']) in (:emails)");
 		}
 		if(!identities.isEmpty()) {
 			institutionalSb.append(" and identity not in (:identities) ");
diff --git a/src/test/java/org/olat/user/UserManagerTest.java b/src/test/java/org/olat/user/UserManagerTest.java
index 185861eebee..f52fe18696a 100644
--- a/src/test/java/org/olat/user/UserManagerTest.java
+++ b/src/test/java/org/olat/user/UserManagerTest.java
@@ -19,6 +19,7 @@
  */
 package org.olat.user;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
@@ -31,6 +32,7 @@ import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.core.commons.persistence.DB;
 import org.olat.core.id.Identity;
 import org.olat.core.id.User;
+import org.olat.core.id.UserConstants;
 import org.olat.core.util.Encoder;
 import org.olat.test.OlatTestCase;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -51,13 +53,38 @@ public class UserManagerTest extends OlatTestCase {
 	@Autowired
 	private BaseSecurity securityManager;
 	
+	
 	@Test
-	public void findIdentitiesByEmail() {
+	public void findIdentityByEmail_email() {
 		//create a user
-		String name = "createid-" + UUID.randomUUID().toString();
-		String email = name + "@frentix.com";
-		User user = userManager.createUser("first" + name, "last" + name, email);
-		Identity identity = securityManager.createAndPersistIdentityAndUser(name, user, BaseSecurityModule.getDefaultAuthProviderIdentifier(), name, Encoder.encrypt("secret"));
+		Identity id = createUser(UUID.randomUUID().toString());
+		dbInstance.commitAndCloseSession();
+
+		//get the identity by email
+		String email = id.getUser().getProperty(UserConstants.EMAIL, null);
+		Identity foundIdentity = userManager.findIdentityByEmail(email);
+		Assert.assertNotNull(foundIdentity);
+		Assert.assertEquals(id, foundIdentity);
+	}
+	
+	@Test
+	public void findIdentityByEmail_institutionalEmail() {
+		//create a user
+		Identity id = createUser(UUID.randomUUID().toString());
+		dbInstance.commitAndCloseSession();
+
+		//get the identity by email
+		String email = id.getUser().getProperty(UserConstants.INSTITUTIONALEMAIL, null);
+		Identity foundIdentity = userManager.findIdentityByEmail(email);
+		Assert.assertNotNull(foundIdentity);
+		Assert.assertEquals(id, foundIdentity);
+	}
+	
+	@Test
+	public void findIdentitiesByEmail_email() {
+		//create a user
+		Identity id1 = createUser(UUID.randomUUID().toString());
+		Identity id2 = createUser(UUID.randomUUID().toString());
 		dbInstance.commitAndCloseSession();
 		
 		//get empty (must survive)
@@ -65,11 +92,45 @@ public class UserManagerTest extends OlatTestCase {
 		Assert.assertNotNull(emptyIdentities);
 		Assert.assertTrue(emptyIdentities.isEmpty());
 		
-		//get the identity
-		List<Identity> identities = userManager.findIdentitiesByEmail(Collections.singletonList(email));
+		//get the identities by emails
+		List<String> emails = new ArrayList<String>();
+		emails.add(id1.getUser().getProperty(UserConstants.EMAIL, null));
+		emails.add(id2.getUser().getProperty(UserConstants.EMAIL, null));
+		
+		List<Identity> identities = userManager.findIdentitiesByEmail(emails);
 		Assert.assertNotNull(identities);
-		Assert.assertEquals(1, identities.size());
-		Assert.assertTrue(identities.contains(identity));	
+		Assert.assertEquals(2, identities.size());
+		Assert.assertTrue(identities.contains(id1));
+		Assert.assertTrue(identities.contains(id2));
 	}
+	
+	@Test
+	public void findIdentitiesByEmail_institutionalEmail() {
+		//create a user
+		Identity id1 = createUser(UUID.randomUUID().toString());
+		Identity id2 = createUser(UUID.randomUUID().toString());
+		dbInstance.commitAndCloseSession();
 
+		//get the identities by emails
+		List<String> emails = new ArrayList<String>();
+		emails.add(id1.getUser().getProperty(UserConstants.INSTITUTIONALEMAIL, null));
+		emails.add(id2.getUser().getProperty(UserConstants.INSTITUTIONALEMAIL, null));
+		
+		List<Identity> identities = userManager.findIdentitiesByEmail(emails);
+		Assert.assertNotNull(identities);
+		Assert.assertEquals(2, identities.size());
+		Assert.assertTrue(identities.contains(id1));
+		Assert.assertTrue(identities.contains(id2));
+	}
+	
+	private Identity createUser(String uuid) {
+		String name = "createid-" + uuid;
+		String email = name + "@frentix.com";
+		String institutEmail = name + "@openolat.com";
+		User user = userManager.createUser("first" + name, "last" + name, email);
+		user.setProperty(UserConstants.INSTITUTIONALEMAIL, institutEmail);
+		Identity identity = securityManager.createAndPersistIdentityAndUser(name, user, BaseSecurityModule.getDefaultAuthProviderIdentifier(), name, Encoder.encrypt("secret"));
+		Assert.assertNotNull(identity);
+		return identity;
+	}
 }
-- 
GitLab