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 73d9943b9e5df2e6c3900a1af89e9ecdea82c540..c686d80783132b8cb799ac1745e30153be7e4720 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 @@ -80,7 +80,9 @@ public class UserProfileService { try { UserProfile userProfile = new UserProfile(); for (Field field : fields) { - UserProfile.exposedMethods.get("set" + fieldMap.get(field.getName())).invoke(userProfile, field.getValue()); + if(fieldMap.containsKey(field.getName())) { + UserProfile.exposedMethods.get("set" + fieldMap.get(field.getName())).invoke(userProfile, field.getValue()); + } } return userProfile; } diff --git a/jams-server/src/main/java/net/jami/jams/server/Server.java b/jams-server/src/main/java/net/jami/jams/server/Server.java index 757241b7a1cdf80b1221eb37dc1946383f6fe4a6..ecb00bbb3648fbad38724db71e7582868d4b4ae7 100644 --- a/jams-server/src/main/java/net/jami/jams/server/Server.java +++ b/jams-server/src/main/java/net/jami/jams/server/Server.java @@ -57,11 +57,11 @@ public class Server { try { InputStream path; ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - path = classLoader.getResourceAsStream("adsampleconfig.json"); - userAuthenticationModule.attachADAuthSource(new String(path.readAllBytes())); + path = classLoader.getResourceAsStream("ldapconfig.json"); + userAuthenticationModule.attachLDAPAuthSource(new String(path.readAllBytes())); UserProfile userProfile = userAuthenticationModule.getAuthenticationSources() - .get(new AuthModuleKey("SAVOIRFAIRELINU", AuthenticationSourceType.AD)) - .getUserProfile("fsidokhine","LOGON_NAME"); + .get(new AuthModuleKey("savoirfairelinux", AuthenticationSourceType.LDAP)) + .getUserProfile("Sidokhine","FULL_TEXT_NAME"); System.out.println(userProfile); } catch (Exception e) { log.error("Could not load and inject active directory connector with error: " + e.toString()); diff --git a/jams-server/src/main/resources/ldapconfig.json b/jams-server/src/main/resources/ldapconfig.json index aa5e439c4e537e556f459752816bae6460ac7b27..54a125b26f823a186fb604d04ed092627108cbf1 100644 --- a/jams-server/src/main/resources/ldapconfig.json +++ b/jams-server/src/main/resources/ldapconfig.json @@ -5,5 +5,5 @@ "host": "ldap://annuaire.savoirfairelinux.com", "username": "cn=sipallow,ou=dsa,dc=savoirfairelinux,dc=net", "password": "Dewaaghei3Yo", - "usernameField": "uid=%s" + "usernameField": "uid" } \ No newline at end of file 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 f1b7461b12d692c83940fb2f76a48d4f5c08f3ec..194212863ac904972a05a6e5d29a1405bc2fdf68 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 @@ -10,6 +10,7 @@ import net.jami.jams.common.objects.user.User; import net.jami.jams.common.objects.user.UserProfile; import net.jami.jams.common.serialization.JsoniterRegistry; import net.jami.jams.ldap.connector.service.AuthenticationService; +import net.jami.jams.ldap.connector.service.UserProfileService; import org.ldaptive.BindConnectionInitializer; import org.ldaptive.ConnectionConfig; import org.ldaptive.Credential; @@ -18,7 +19,8 @@ import org.ldaptive.DefaultConnectionFactory; @Slf4j public class LDAPConnector implements AuthenticationSource { - private AuthenticationService authenticationService; + private final AuthenticationService authenticationService; + private final UserProfileService userProfileService; public static LDAPSettings settings; public LDAPConnector(String strSettings) { @@ -33,6 +35,7 @@ public class LDAPConnector implements AuthenticationSource { .connectionInitializers(bindConnectionInitializer) .build(); authenticationService = new AuthenticationService(new DefaultConnectionFactory(connConfig)); + userProfileService = new UserProfileService(new DefaultConnectionFactory(connConfig)); log.info("Started LDAP Connector!"); } @@ -43,7 +46,7 @@ public class LDAPConnector implements AuthenticationSource { @Override public UserProfile getUserProfile(String queryString, String field) { - return null; + return userProfileService.getUserProfile(queryString,field); } @Override diff --git a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/AuthenticationService.java b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/AuthenticationService.java index 90b07eec2aa19b78f0e525f45a7f998dd3908afe..1ce8eff4ff7ebec37c7da26d91887bba63744c3a 100644 --- a/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/AuthenticationService.java +++ b/ldap-connector/src/main/java/net/jami/jams/ldap/connector/service/AuthenticationService.java @@ -19,7 +19,7 @@ public class AuthenticationService { public boolean authenticateUser(String username, String password) { try { FormatDnResolver dnResolver = new FormatDnResolver(); - dnResolver.setFormat(settings.getUsernameField() + "," + settings.getBaseDN()); + dnResolver.setFormat(settings.getUsernameField() + "=%s," + settings.getBaseDN()); SimpleBindAuthenticationHandler bindAuthenticationHandler = new SimpleBindAuthenticationHandler(connectionFactory); Authenticator auth = new Authenticator(); auth.setDnResolver(dnResolver); 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 0fa7b5472464117406ecf75883b3e710a76c1293..faff16aaf2d5a234e092829f27c54afcc072fcce 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 @@ -1,4 +1,89 @@ package net.jami.jams.ldap.connector.service; +import lombok.extern.slf4j.Slf4j; +import net.jami.jams.common.objects.user.UserProfile; +import net.jami.jams.ldap.connector.LDAPConnector; +import org.ldaptive.*; + +import java.util.HashMap; + +@Slf4j public class UserProfileService { + + private static final HashMap<String,String> fieldMap = new HashMap<>(); + private final ConnectionFactory connectionFactory; + + static{ + fieldMap.put("givenName","FirstName"); + fieldMap.put("sn","LastName"); + fieldMap.put("jpegPhoto","ProfilePicture"); + fieldMap.put("mail","Email"); + fieldMap.put("telephoneNumber","PhoneNumber"); + fieldMap.put("mobile","MobileNumber"); + fieldMap.put("facsimileTelephoneNumber","FaxNumber"); + fieldMap.put("extensionName","PhoneNumberExtension"); + fieldMap.put("o","Organization"); + } + + public UserProfileService(ConnectionFactory connectionFactory) { + this.connectionFactory = connectionFactory; + } + + public UserProfile getUserProfile(String queryString, String field){ + Connection connection = null; + try { + connection = connectionFactory.getConnection(); + try { + connection.open(); + SearchOperation search = new SearchOperation(connectionFactory); + SearchResponse res = search.execute(buildRequest(queryString,field)); + if (res.getEntries().size() > 0) return profileFromResponse(res.getEntry()); + return null; + } catch (Exception e) { + log.error("Could not search LDAP directory with error " + e.toString()); + return null; + } + } + catch (Exception e){ + log.info("Failed to search LDAP directory with error " + e.toString()); + return null; + } + finally { + connection.close(); + } + } + + + public static SearchRequest buildRequest(String queryString, String field) { + if(field.equals("LOGON_NAME")) { + return SearchRequest.builder() + .dn(LDAPConnector.settings.getBaseDN()) + .filter("(&("+LDAPConnector.settings.getUsernameField()+"=" + queryString + "))") + .build(); + } + if(field.equals("FULL_TEXT_NAME")){ + return SearchRequest.builder() + .dn(LDAPConnector.settings.getBaseDN()) + .filter("(|(givenName=" + queryString + ")(sn="+queryString+")") + .build(); + } + return null; + } + + public static UserProfile profileFromResponse(LdapEntry entry){ + //Use reflection to remap. + try { + UserProfile userProfile = new UserProfile(); + for (String attribute : entry.getAttributeNames()) { + if(fieldMap.containsKey(attribute)) { + UserProfile.exposedMethods.get("set" + fieldMap.get(attribute)).invoke(userProfile, entry.getAttribute(attribute).getStringValue()); + } + } + return userProfile; + } + catch (Exception e){ + log.error("An error occured while trying to invoke methods: " + e.toString()); + return null; + } + } }