diff --git a/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java b/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java index 28867e97d37b16bca7c31eb2053f3c38533451cb..80d93744d8e335c7e6d8e072ef4d6937dc03e98b 100644 --- a/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java +++ b/ad-connector/src/main/java/net/jami/jams/ad/connector/ADConnector.java @@ -93,8 +93,15 @@ public class ADConnector implements AuthenticationSource { } @Override - public List<UserProfile> getUserProfile(String queryString, String field) { - return userProfileService.getUserProfile(queryString, field); + public List<UserProfile> searchUserProfiles(String queryString, String field) { + return userProfileService.getUserProfile(queryString, field,false); + } + + @Override + public UserProfile getUserProfile(String username) { + List<UserProfile> result = userProfileService.getUserProfile(username, "LOGON_NAME",true); + if(result == null || result.size() != 1) return null; + return result.get(0); } @Override diff --git a/ad-connector/src/main/java/net/jami/jams/ad/connector/service/UserProfileService.java b/ad-connector/src/main/java/net/jami/jams/ad/connector/service/UserProfileService.java index e3d62c44247909d7bc9cb00da2f1b43d56d3ccda..4aaef1cfe3f1ef5e5552849d2d68b771aaf90dc9 100644 --- a/ad-connector/src/main/java/net/jami/jams/ad/connector/service/UserProfileService.java +++ b/ad-connector/src/main/java/net/jami/jams/ad/connector/service/UserProfileService.java @@ -51,9 +51,8 @@ public class UserProfileService { private static final HashMap<String, String> fieldMap = ADConnector.settings.getFieldMappings(); - public List<UserProfile> getUserProfile(String queryString, String field) { + public List<UserProfile> getUserProfile(String queryString, String field,boolean exactMatch) { Endpoint endpoint = ADConnector.getConnection(); - UserProfile[] profiles = null; try { QueryRequest queryRequest = buildRequest(endpoint); Sentence sentence = null; @@ -61,8 +60,14 @@ public class UserProfileService { sentence = new QueryAssembler().addPhrase(FieldType.OBJECT_CLASS, PhraseOperator.EQUAL, ObjectType.USER.toString()).closeSentence(); } else { if (field.equals("LOGON_NAME")) { - sentence = new QueryAssembler().addPhrase(FieldType.LOGON_NAME, PhraseOperator.CONTAINS, queryString) - .closeSentence(); + if(exactMatch){ + sentence = new QueryAssembler().addPhrase(FieldType.LOGON_NAME, PhraseOperator.EQUAL, queryString) + .closeSentence(); + } + else { + sentence = new QueryAssembler().addPhrase(FieldType.LOGON_NAME, PhraseOperator.CONTAINS, queryString) + .closeSentence(); + } } if (field.equals("FULL_TEXT_NAME")) { sentence = new QueryAssembler().addPhrase(FieldType.FIRST_NAME, PhraseOperator.CONTAINS, queryString) diff --git a/datastore/src/main/java/net/jami/datastore/main/DataStore.java b/datastore/src/main/java/net/jami/datastore/main/DataStore.java index 7e83e187fbd018bc268e10169987daa21fdf0392..e9b1dc82c09fa162be0efd0842bbec1c4446164f 100644 --- a/datastore/src/main/java/net/jami/datastore/main/DataStore.java +++ b/datastore/src/main/java/net/jami/datastore/main/DataStore.java @@ -80,7 +80,7 @@ public class DataStore implements AuthenticationSource { return userDao.storeObject(user); } @Override - public List<UserProfile> getUserProfile(String queryString, String field) { + public List<UserProfile> searchUserProfiles(String queryString, String field) { List<UserProfile> userList; if (!queryString.equals("*")) { @@ -100,6 +100,15 @@ public class DataStore implements AuthenticationSource { return userList; } + @Override + public UserProfile getUserProfile(String username) { + StatementList statementList = new StatementList(); + statementList.addStatement(new StatementElement("username","=", username,"")); + List<UserProfile> userList = userProfileDao.getObjects(statementList); + if(userList.size() != 1) return null; + else return userList.get(0); + } + @Override public boolean setUserProfile(UserProfile userProfile) { return userProfileDao.storeObject(userProfile); diff --git a/jami-nameserver/src/main/java/net/jami/jams/nameserver/LocalNameServer.java b/jami-nameserver/src/main/java/net/jami/jams/nameserver/LocalNameServer.java index 7d6b7964613e1c554834cb86e3b58c913e31f244..08acf7876155847de434256079c6f5aad2802329 100644 --- a/jami-nameserver/src/main/java/net/jami/jams/nameserver/LocalNameServer.java +++ b/jami-nameserver/src/main/java/net/jami/jams/nameserver/LocalNameServer.java @@ -69,9 +69,10 @@ public class LocalNameServer implements NameServer { //Reattempt resolution via directory lookups. final User user = new User(); for(AuthModuleKey key : authenticationModule.getAuthSources().keySet()){ - List<UserProfile> profiles = authenticationModule.getAuthSources().get(key).getUserProfile(username,"LOGON_NAME"); - if(profiles != null && profiles.size() == 1){ - user.setUsername(username); + UserProfile profile = authenticationModule.getAuthSources().get(key).getUserProfile(username); + if(profile != null){ + //Use the username from the profile, not the one supplied otherwise phantom users will be created. + user.setUsername(profile.getUsername()); user.setRealm(key.getRealm()); user.setUserType(key.getType()); user.setAccessLevel(AccessLevel.USER); diff --git a/jams-common/src/main/java/net/jami/jams/common/authentication/AuthenticationSource.java b/jams-common/src/main/java/net/jami/jams/common/authentication/AuthenticationSource.java index 170e5bb37f0447a0d7568dcf53ab52499306f67f..b65fb69544a79304b952ecd81c1bcc88968388d3 100644 --- a/jams-common/src/main/java/net/jami/jams/common/authentication/AuthenticationSource.java +++ b/jams-common/src/main/java/net/jami/jams/common/authentication/AuthenticationSource.java @@ -30,7 +30,8 @@ import java.util.List; public interface AuthenticationSource { boolean createUser(User user); - List<UserProfile> getUserProfile(String queryString, String field); + List<UserProfile> searchUserProfiles(String queryString, String field); + UserProfile getUserProfile(String username); boolean setUserProfile(UserProfile userProfile); boolean authenticate(String username, String password); AuthenticationSourceInfo getInfo(); diff --git a/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java b/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java index 09f67e6935a547ed23151e69fd238792f80ec418..56aaed6a293eb5e7324870a634a761a6ec10ba0c 100644 --- a/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java +++ b/jams-server/src/main/java/net/jami/jams/server/core/workflows/RegisterDeviceFlow.java @@ -50,7 +50,7 @@ public class RegisterDeviceFlow { User user = dataStore.getUserDao().getObjects(statementList).get(0); UserProfile userProfile = userAuthenticationModule.getAuthSources() .get(new AuthModuleKey(user.getRealm(),user.getUserType())) - .getUserProfile(username,"LOGON_NAME").get(0); + .searchUserProfiles(username,"LOGON_NAME").get(0); if (user == null) { log.error("Tried to enroll a device, but could not find a user, this is impossible!"); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java index 3511994c258b0447181ba60efe8ad86e6119fc20..aa73eaf5118249b8351bd391bca0ca93f3099bcd 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/DirectoryEntryServlet.java @@ -34,7 +34,6 @@ import net.jami.jams.common.objects.user.UserProfile; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import static net.jami.jams.server.Server.userAuthenticationModule; @@ -195,7 +194,7 @@ public class DirectoryEntryServlet extends HttpServlet { if (req.getParameter("directory") != null && req.getParameter("directoryType") != null) { List<UserProfile> profiles = userAuthenticationModule.getAuthSources() .get(new AuthModuleKey(req.getParameter("directory"), AuthenticationSourceType.fromString(req.getParameter("directoryType")))) - .getUserProfile(req.getParameter("username"), "LOGON_NAME"); + .searchUserProfiles(req.getParameter("username"), "LOGON_NAME"); if(req.getParameter("format") != null && req.getParameter("format").equals("vcard")){ resp.getOutputStream().write(profiles.get(0).getAsVCard().getBytes()); } @@ -204,7 +203,7 @@ public class DirectoryEntryServlet extends HttpServlet { } List<UserProfile> userProfiles = new ArrayList<>(); userAuthenticationModule.getAuthSources().forEach((k, v) -> { - userProfiles.addAll(v.getUserProfile(req.getParameter("username"), "LOGON_NAME")); + userProfiles.addAll(v.searchUserProfiles(req.getParameter("username"), "LOGON_NAME")); }); if(req.getParameter("format") != null && req.getParameter("format").equals("vcard")){ resp.getOutputStream().write(userProfiles.get(0).getAsVCard().getBytes()); diff --git a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java index de295eac806cc48ad061657dd44a04611c955ad1..ce2c53815c91e75deed1543ceb5855c646739334 100644 --- a/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java +++ b/jams-server/src/main/java/net/jami/jams/server/servlets/api/auth/directory/SearchDirectoryServlet.java @@ -36,7 +36,6 @@ import net.jami.jams.common.objects.user.UserProfile; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import static net.jami.jams.server.Server.dataStore; @@ -57,10 +56,10 @@ public class SearchDirectoryServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { List<UserProfile> userProfiles = new ArrayList<>(); userAuthenticationModule.getAuthSources().forEach((k, v) -> { - List<UserProfile> profiles = v.getUserProfile(req.getParameter("queryString"), "FULL_TEXT_NAME"); + List<UserProfile> profiles = v.searchUserProfiles(req.getParameter("queryString"), "FULL_TEXT_NAME"); if(profiles == null || profiles.size() == 0){ // check logon names if nothing was found - profiles = v.getUserProfile(req.getParameter("queryString"), "LOGON_NAME"); + profiles = v.searchUserProfiles(req.getParameter("queryString"), "LOGON_NAME"); } profiles.parallelStream().forEach(profile -> { StatementList statementList = new StatementList(); diff --git a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java index bd6f4495705eb0cf35410cdba65fab6b77ee8159..8179ed2192ceec1c03f2f500ce368dc48715e9b6 100644 --- a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java +++ b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/LDAPConnector.java @@ -69,8 +69,15 @@ public class LDAPConnector implements AuthenticationSource { } @Override - public List<UserProfile> getUserProfile(String queryString, String field) { - return userProfileService.getUserProfile(queryString,field); + public List<UserProfile> searchUserProfiles(String queryString, String field) { + return userProfileService.getUserProfile(queryString,field,false); + } + + @Override + public UserProfile getUserProfile(String username) { + List<UserProfile> results = userProfileService.getUserProfile(username,"LOGON_NAME",true); + if(results == null || results.size() != 1) return null; + return results.get(0); } @Override @@ -91,7 +98,7 @@ public class LDAPConnector implements AuthenticationSource { @Override public boolean test() { - return (getUserProfile("*","LOGON_NAME").size() != 0); + return (searchUserProfiles("*","LOGON_NAME").size() != 0); } diff --git a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/UserProfileService.java b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/UserProfileService.java index 711392288337fd748040c26ce3eedf35f8862cf8..854944b01e1cad67c23a75dec332734aac6d69c6 100644 --- a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/UserProfileService.java +++ b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/UserProfileService.java @@ -50,7 +50,7 @@ public class UserProfileService { this.connectionFactory = connectionFactory; } - public List<UserProfile> getUserProfile(String queryString, String field){ + public List<UserProfile> getUserProfile(String queryString, String field, boolean exactMatch){ Connection connection = null; try { queryString = queryString.replaceAll("[^\\x00-\\x7F]","*"); @@ -58,7 +58,7 @@ public class UserProfileService { try { connection.open(); SearchOperation search = new SearchOperation(connectionFactory); - SearchResponse res = search.execute(buildRequest(queryString,field)); + SearchResponse res = search.execute(buildRequest(queryString,field, exactMatch)); if (res.getEntries().size() == 0) return null; return res.getEntries().stream().map(UserProfileService::profileFromResponse).collect(Collectors.toList()); } catch (Exception e) { @@ -76,10 +76,12 @@ public class UserProfileService { } - public static SearchRequest buildRequest(String queryString, String field) { + public static SearchRequest buildRequest(String queryString, String field, boolean exactMatch) { - if (!queryString.startsWith("*")) - queryString = "*".concat(queryString).concat("*"); + if(!exactMatch) { + if (!queryString.startsWith("*")) + queryString = "*".concat(queryString).concat("*"); + } if(field.equals("LOGON_NAME")) { return SearchRequest.builder() diff --git a/ldap-connector/src/test/java/tests/GenericLDAPTest.java b/ldap-connector/src/test/java/tests/GenericLDAPTest.java index 1525e1bb4681db67f307509db9667ee83ee167b9..82cb05e5146f6428835e6a427b8c8fd81663258f 100644 --- a/ldap-connector/src/test/java/tests/GenericLDAPTest.java +++ b/ldap-connector/src/test/java/tests/GenericLDAPTest.java @@ -34,7 +34,7 @@ public class GenericLDAPTest { @Test public void testLookUp() throws Exception{ initLdapConnector(); - List<UserProfile> profiles = ldapConnector.getUserProfile("*","FULL_TEXT_NAME"); + List<UserProfile> profiles = ldapConnector.searchUserProfiles("*","FULL_TEXT_NAME"); Assertions.assertEquals(2,profiles.size()); Assertions.assertNotNull(profiles.get(0).getFirstName()); Assertions.assertNotNull(profiles.get(1).getFirstName()); @@ -53,7 +53,7 @@ public class GenericLDAPTest { @Test public void getVcard() throws Exception{ initLdapConnector(); - List<UserProfile> profiles = ldapConnector.getUserProfile("Felix","FULL_TEXT_NAME"); + List<UserProfile> profiles = ldapConnector.searchUserProfiles("Felix","FULL_TEXT_NAME"); Assert.assertEquals(1,profiles.size()); Assert.assertNotNull(profiles.get(0).getUsername()); String vcard = profiles.get(0).getAsVCard(); diff --git a/versions.json b/versions.json index 9916d14194aa5a84daab70a855a27b55e0be5f3e..d798f29682750f59b41737d2b845a105ceee1754 100644 --- a/versions.json +++ b/versions.json @@ -2,26 +2,26 @@ "net.jami.jams.ad.connector.ADConnector": { "version": "2.0", "filename": "ad-connector.jar", - "md5": "bd362666285da485a316e93f934b66a7" + "md5": "9ae70d75d615ee650a6f930c9700de96" }, "net.jami.jams.authmodule.UserAuthenticationModule": { "version": "2.0", "filename": "authentication-module.jar", - "md5": "da9f724c4162593cf80f6c6e7260c1b2" + "md5": "d69348e9c6bd62678880fea25ed03605" }, "net.jami.jams.server.Server": { "version": "2.0", - "md5": "ae811d245d4e10b45f4530a08fce3c8e", + "md5": "bd2af8ffbd4c41ea5f86cc508d1ea5c8", "filename": "jams-server.jar" }, "net.jami.jams.ca.JamsCA": { "version": "2.0", - "md5": "fbcb88fbe485c2803cc388b4a33da752", + "md5": "4bbfb901bb528ff77fec1c9d0a2d8b45", "filename": "cryptoengine.jar" }, "net.jami.jams.ldap.connector.LDAPConnector": { "version": "2.0", - "md5": "366361cb125966f86ea7b2192ee9c10c", + "md5": "1094b1742b016e39824693a511978916", "filename": "ldap-connector.jar" } } \ No newline at end of file