diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java index ebe0dcb7f8adf7dede37457a43e7a138e441f7e2..0aca12db49039a08ea2808687fa96249b44c5672 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java @@ -594,12 +594,12 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable { public List<IdentityShort> searchIdentityShort(String search, List<? extends OrganisationRef> searcheableOrgnisations, GroupRoles repositoryEntryRole, int maxResults) { String[] searchArr = search.split(" "); - String[] attributes = new String[]{ "name", "firstName", "lastName", "email" }; + String[] attributes = new String[]{ "name", "nickName", "firstName", "lastName", "email" }; StringBuilder sb = new StringBuilder(); sb.append("select ident from bidentityshort as ident ") .append(" where ident.status<").append(Identity.STATUS_VISIBLE_LIMIT).append(" and ("); - + boolean start = true; for(int i=0; i<searchArr.length; i++) { for(String attribute:attributes) { @@ -608,16 +608,13 @@ public class BaseSecurityManager implements BaseSecurity, UserDataDeletable { } else { sb.append(" or "); } - - if (searchArr[i].contains("_") && dbInstance.isOracle()) { - //oracle needs special ESCAPE sequence to search for escaped strings - sb.append(" lower(ident.").append(attribute).append(") like :search").append(i).append(" ESCAPE '\\'"); - } else if (dbInstance.isMySQL()) { - sb.append(" ident.").append(attribute).append(" like :search").append(i); - } else { - sb.append(" lower(ident.").append(attribute).append(") like :search").append(i); - } + PersistenceHelper.appendFuzzyLike(sb, "ident." + attribute, "search" + i, dbInstance.getDbVendor()); } + + sb.append(" or exists (select auth from ").append(AuthenticationImpl.class.getName()).append(" as auth") + .append(" where ident.key=auth.identity.key and"); + PersistenceHelper.appendFuzzyLike(sb, "auth.authusername", "search" + i, dbInstance.getDbVendor()); + sb.append(")"); } sb.append(")"); if(searcheableOrgnisations != null && !searcheableOrgnisations.isEmpty()) { diff --git a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java index c83ec0d3c85828857159a384da22dc60c1a582d3..b82161d3e80a0777e1299af46b328b9408d02927 100644 --- a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java +++ b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java @@ -283,6 +283,74 @@ public class BaseSecurityManagerTest extends OlatTestCase { Assert.assertTrue(identities.contains(id2)); } + @Test + public void testLoadIdentityByKey() { + //create a security group with 2 identities + Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("load-1-sec-"); + dbInstance.commitAndCloseSession(); + + Identity identity = securityManager.loadIdentityByKey(id1.getKey()); + Assert.assertNotNull(identity); + Assert.assertEquals(id1, identity); + } + + @Test + public void searchIdentityShort() { + //create a security group with 2 identities + IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("short-1-search-"); + dbInstance.commitAndCloseSession(); + + String login = id.getLogin().substring(0, 12); + List<IdentityShort> identities = securityManager.searchIdentityShort(login, 32000); + Assert.assertNotNull(identities); + + boolean found = false; + for(IdentityShort identity:identities) { + if(identity.getKey().equals(id.getKey())) { + found = true; + } + } + Assert.assertTrue(found); + } + + @Test + public void searchIdentityShort_multiWords() { + //create a security group with 2 identities + IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("short-2-search-"); + dbInstance.commitAndCloseSession(); + + String login = id.getLogin().substring(0, 12); + List<IdentityShort> identities = securityManager.searchIdentityShort(login + " hello world", 32000); + Assert.assertNotNull(identities); + + boolean found = false; + for(IdentityShort identity:identities) { + if(identity.getKey().equals(id.getKey())) { + found = true; + } + } + Assert.assertTrue(found); + } + + /** + * The test checks only if the query is valid. + * + */ + @Test + public void searchIdentityShortLongAllParameters() { + //create a security group with 2 identities + IdentityWithLogin id = JunitTestHelper.createAndPersistRndUser("short-2-search-"); + dbInstance.commitAndCloseSession(); + + Organisation defOrganisation = organisationService.getDefaultOrganisation(); + + String login = id.getLogin().substring(0, 12); + List<IdentityShort> identities = securityManager.searchIdentityShort(login + " hello world", + Collections.singletonList(defOrganisation), GroupRoles.participant, 32000); + Assert.assertNotNull(identities); + } + + /** * Update roles */