Skip to content
Snippets Groups Projects
Commit 5384b32f authored by srosse's avatar srosse
Browse files

OO-3188: make the queries case insensitive with PostgreSQL

parent 74a806e3
No related branches found
No related tags found
No related merge requests found
...@@ -24,6 +24,7 @@ import java.util.List; ...@@ -24,6 +24,7 @@ import java.util.List;
import org.olat.basesecurity.IdentityImpl; import org.olat.basesecurity.IdentityImpl;
import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DB;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.id.UserConstants;
import org.olat.core.util.StringHelper; import org.olat.core.util.StringHelper;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -41,17 +42,20 @@ public class UserDAO { ...@@ -41,17 +42,20 @@ public class UserDAO {
private DB dbInstance; private DB dbInstance;
public Identity findUniqueIdentityByEmail(String email) { public Identity findUniqueIdentityByEmail(String email) {
String query = new StringBuilder() StringBuilder query = new StringBuilder(255)
.append("select identity from ").append(IdentityImpl.class.getName()).append(" identity ") .append("select identity from ").append(IdentityImpl.class.getName()).append(" identity ")
.append(" inner join fetch identity.user user ") .append(" inner join fetch identity.user user ")
.append(" where user.email=:email") .append(" where");
.append(" or user.institutionalEmail=:email") boolean mysql = "mysql".equals(dbInstance.getDbVendor());
.toString(); if(mysql) {
query.append(" user.").append(UserConstants.EMAIL).append("=:email or user.").append(UserConstants.INSTITUTIONALEMAIL).append("=:email");
} else {
query.append(" lower(user.").append(UserConstants.EMAIL).append(")=:email or lower(user.").append(UserConstants.INSTITUTIONALEMAIL).append(")=:email");
}
try { try {
return dbInstance.getCurrentEntityManager() return dbInstance.getCurrentEntityManager()
.createQuery(query, Identity.class) .createQuery(query.toString(), Identity.class)
.setParameter("email", email) .setParameter("email", email.toLowerCase())
.getSingleResult(); .getSingleResult();
} catch (Exception e) { } catch (Exception e) {
return null; return null;
...@@ -61,15 +65,20 @@ public class UserDAO { ...@@ -61,15 +65,20 @@ public class UserDAO {
public boolean isEmailInUse(String email) { public boolean isEmailInUse(String email) {
if (!StringHelper.containsNonWhitespace(email)) return false; if (!StringHelper.containsNonWhitespace(email)) return false;
String query = new StringBuilder() StringBuilder query = new StringBuilder(255)
.append("select count(*) ") .append("select count(*) ")
.append(" from org.olat.core.id.User user") .append(" from org.olat.core.id.User user")
.append(" where user.email=:email") .append(" where");
.append(" or user.institutionalEmail=:email")
.toString(); boolean mysql = "mysql".equals(dbInstance.getDbVendor());
if(mysql) {
query.append(" user.").append(UserConstants.EMAIL).append("=:email or user.").append(UserConstants.INSTITUTIONALEMAIL).append("=:email");
} else {
query.append(" lower(user.").append(UserConstants.EMAIL).append(")=:email or lower(user.").append(UserConstants.INSTITUTIONALEMAIL).append(")=:email");
}
Long numberOfUsers = dbInstance.getCurrentEntityManager() Long numberOfUsers = dbInstance.getCurrentEntityManager()
.createQuery(query, Long.class) .createQuery(query.toString(), Long.class)
.setParameter("email", email.toLowerCase()) .setParameter("email", email.toLowerCase())
.getSingleResult(); .getSingleResult();
......
...@@ -57,6 +57,16 @@ public class UserDAOTest extends OlatTestCase { ...@@ -57,6 +57,16 @@ public class UserDAOTest extends OlatTestCase {
assertThat(foundIdentity).isNotNull().isEqualTo(identity); assertThat(foundIdentity).isNotNull().isEqualTo(identity);
} }
@Test
public void shouldReturnUniqueUserIfFoundLowerUpperCase() {
Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("userlow");
String email = identity.getUser().getEmail().toUpperCase();
Identity foundIdentity = sut.findUniqueIdentityByEmail(email);
assertThat(foundIdentity).isNotNull().isEqualTo(identity);
}
@Test @Test
public void shouldReturnUniqueUserIfFoundInInstitutionalEmail() { public void shouldReturnUniqueUserIfFoundInInstitutionalEmail() {
Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("userdao"); Identity identity = JunitTestHelper.createAndPersistIdentityAsRndUser("userdao");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment