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 610e4e952e14a37ed899bbaeda2c538208d9f2e9..0b270ced2c0e647c4310554f1058a180161add2f 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 @@ -4,6 +4,7 @@ import com.imperva.ddc.core.query.Endpoint; import com.jsoniter.JsonIterator; import lombok.extern.slf4j.Slf4j; import net.jami.jams.ad.connector.service.AuthenticationService; +import net.jami.jams.ad.connector.service.UserProfileService; import net.jami.jams.common.authentication.AuthenticationSource; import net.jami.jams.common.authentication.AuthenticationSourceInfo; import net.jami.jams.common.authentication.AuthenticationSourceType; @@ -19,7 +20,8 @@ public class ADConnector implements AuthenticationSource { private static final ConcurrentLinkedQueue<Endpoint> endpoints = new ConcurrentLinkedQueue<>(); private static ActiveDirectorySettings settings; - private AuthenticationService authenticationService = new AuthenticationService(); + private final AuthenticationService authenticationService = new AuthenticationService(); + private final UserProfileService userProfileService = new UserProfileService(); public ADConnector(String settings) { JsoniterRegistry.initCodecs(); @@ -65,11 +67,10 @@ public class ADConnector implements AuthenticationSource { } @Override - public UserProfile getUserProfile(String username) { - return null; + public UserProfile getUserProfile(String queryString, String field) { + return userProfileService.getUserProfile(queryString,field); } - @Override public boolean authenticate(String username, String password) { try { 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 be611eec61c396467ae7fed577b312e96a8b0074..73d9943b9e5df2e6c3900a1af89e9ecdea82c540 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 @@ -1,7 +1,94 @@ package net.jami.jams.ad.connector.service; +import com.imperva.ddc.core.Connector; +import com.imperva.ddc.core.language.PhraseOperator; +import com.imperva.ddc.core.language.QueryAssembler; +import com.imperva.ddc.core.language.Sentence; +import com.imperva.ddc.core.language.SentenceOperator; +import com.imperva.ddc.core.query.*; +import lombok.extern.slf4j.Slf4j; +import net.jami.jams.ad.connector.ADConnector; +import net.jami.jams.common.objects.user.UserProfile; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j public class UserProfileService { + private static final HashMap<String,String> fieldMap = new HashMap<>(); + + static{ + fieldMap.put("givenname","FirstName"); + fieldMap.put("sn","LastName"); + fieldMap.put("thumbnailPhoto","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 UserProfile getUserProfile(String queryString, String field){ + Endpoint endpoint = ADConnector.getConnection(); + try{ + QueryRequest queryRequest = buildRequest(endpoint); + Sentence sentence = null; + if(field.equals("LOGON_NAME")){ + sentence = new QueryAssembler().addPhrase(FieldType.LOGON_NAME, PhraseOperator.EQUAL, queryString) + .closeSentence(); + } + if(field.equals("FULL_TEXT_NAME")) { + sentence = new QueryAssembler().addPhrase(FieldType.FIRST_NAME, PhraseOperator.EQUAL, queryString) + .addPhrase(FieldType.LAST_NAME, PhraseOperator.EQUAL, queryString) + .closeSentence(SentenceOperator.OR); + } + queryRequest.addSearchSentence(sentence); + QueryResponse queryResponse; + try(Connector connector = new Connector(queryRequest)) { + queryResponse = connector.execute(); + } + List<Field> fields = queryResponse.getAll().stream().map(EntityResponse::getValue).collect(Collectors.toList()).get(0); + return profileFromResponse(fields); + } + catch (Exception e){ + log.error("Could not find entity with specified parameters."); + return null; + } + finally { + ADConnector.returnConnection(endpoint); + } + } + + + public static QueryRequest buildRequest(Endpoint endpoint) { + QueryRequest queryRequest = new QueryRequest(); + queryRequest.setDirectoryType(DirectoryType.MS_ACTIVE_DIRECTORY); + queryRequest.setEndpoints(new ArrayList<>() {{ add(endpoint);}}); + queryRequest.setSizeLimit(1); + queryRequest.setTimeLimit(1000); + queryRequest.setObjectType(ObjectType.USER); + for(String field : fieldMap.keySet()) queryRequest.addRequestedField(field); + return queryRequest; + } + + public static UserProfile profileFromResponse(List<Field> fields){ + //Use reflection to remap. + try { + UserProfile userProfile = new UserProfile(); + for (Field field : fields) { + UserProfile.exposedMethods.get("set" + fieldMap.get(field.getName())).invoke(userProfile, field.getValue()); + } + return userProfile; + } + catch (Exception e){ + log.error("An error occured while trying to invoke methods: " + e.toString()); + return null; + } + } } 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 a142753ab8b1c015f89d56b7ad7e6412d3858f0e..c8acdbe60ea623b4a9ce9eed0ccb454120c54d9c 100644 --- a/datastore/src/main/java/net/jami/datastore/main/DataStore.java +++ b/datastore/src/main/java/net/jami/datastore/main/DataStore.java @@ -47,7 +47,7 @@ public class DataStore implements AuthenticationSource { } @Override - public UserProfile getUserProfile(String username) { + public UserProfile getUserProfile(String queryString, String field) { return null; } 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 f00b6d9598e9dea13632e75eef0232bd57e7d9ec..d2c95a25827bbc58d1f9df1fa8a379eb1c19084a 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 @@ -6,7 +6,7 @@ import net.jami.jams.common.objects.user.UserProfile; public interface AuthenticationSource { boolean createUser(User user); - UserProfile getUserProfile(String username); + UserProfile getUserProfile(String queryString, String field); boolean authenticate(String username, String password); AuthenticationSourceInfo getInfo(); boolean testConfiguration(String configuration); diff --git a/jams-common/src/main/java/net/jami/jams/common/objects/user/UserProfile.java b/jams-common/src/main/java/net/jami/jams/common/objects/user/UserProfile.java index 92ce57987b27a24d981edb5d1ccc8284b8bc8e0f..19f47b105e2016d89d4b9f9c5cb3fc612894f695 100644 --- a/jams-common/src/main/java/net/jami/jams/common/objects/user/UserProfile.java +++ b/jams-common/src/main/java/net/jami/jams/common/objects/user/UserProfile.java @@ -3,12 +3,33 @@ package net.jami.jams.common.objects.user; import lombok.Getter; import lombok.Setter; +import java.lang.reflect.Method; +import java.util.HashMap; + @Getter @Setter public class UserProfile { + + + public static HashMap<String, Method> exposedMethods = new HashMap<>(); + + static{ + for(Method method: UserProfile.class.getMethods()){ + exposedMethods.put(method.getName(),method); + } + } + + private String firstName; private String lastName; private String phoneNumber; + private String phoneNumberExtension; + private String mobileNumber; + private String faxNumber; private String profilePicture; private String email; + private String organization; + + + } 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 cc584dab3d7df0b2b0aa7e82da397a17026c13bb..757241b7a1cdf80b1221eb37dc1946383f6fe4a6 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 @@ -3,9 +3,12 @@ package net.jami.jams.server; import lombok.extern.slf4j.Slf4j; import net.jami.datastore.main.DataStore; import net.jami.jams.common.authentication.AuthenticationSource; +import net.jami.jams.common.authentication.AuthenticationSourceType; import net.jami.jams.common.cryptoengineapi.CertificateAuthority; +import net.jami.jams.common.objects.user.UserProfile; import net.jami.jams.common.serialization.JsoniterRegistry; import net.jami.jams.server.core.TomcatLauncher; +import net.jami.jams.server.core.usermanagement.AuthModuleKey; import net.jami.jams.server.core.usermanagement.UserAuthenticationModule; import net.jami.jams.server.startup.CryptoEngineLoader; import net.jami.jams.server.startup.LibraryLoader; @@ -54,8 +57,12 @@ public class Server { try { InputStream path; ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - path = classLoader.getResourceAsStream("ldapconfig.json"); - userAuthenticationModule.attachLDAPAuthSource(new String(path.readAllBytes())); + path = classLoader.getResourceAsStream("adsampleconfig.json"); + userAuthenticationModule.attachADAuthSource(new String(path.readAllBytes())); + UserProfile userProfile = userAuthenticationModule.getAuthenticationSources() + .get(new AuthModuleKey("SAVOIRFAIRELINU", AuthenticationSourceType.AD)) + .getUserProfile("fsidokhine","LOGON_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/java/net/jami/jams/server/core/usermanagement/UserAuthenticationModule.java b/jams-server/src/main/java/net/jami/jams/server/core/usermanagement/UserAuthenticationModule.java index 09cba5f150f08fe7128a009df3222819bb1cb2da..ce11e6b98a5b20723e068b01551fcd34e6cb6ede 100644 --- a/jams-server/src/main/java/net/jami/jams/server/core/usermanagement/UserAuthenticationModule.java +++ b/jams-server/src/main/java/net/jami/jams/server/core/usermanagement/UserAuthenticationModule.java @@ -1,5 +1,6 @@ package net.jami.jams.server.core.usermanagement; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.jami.jams.common.authentication.AuthenticationSource; import net.jami.jams.common.authentication.AuthenticationSourceType; @@ -14,6 +15,7 @@ import java.util.HashMap; import static net.jami.jams.server.Server.dataStore; @Slf4j +@Getter public class UserAuthenticationModule { //This contains the DOMAIN-SOURCE. //In general there is at most 2 here. diff --git a/jams-server/src/main/java/net/jami/jams/server/startup/CryptoEngineLoader.java b/jams-server/src/main/java/net/jami/jams/server/startup/CryptoEngineLoader.java index 165b90c1dc8a63eac5eabfef3af9d092770412c2..d594213f495eecb79893707f7522be5ae5cd8c71 100644 --- a/jams-server/src/main/java/net/jami/jams/server/startup/CryptoEngineLoader.java +++ b/jams-server/src/main/java/net/jami/jams/server/startup/CryptoEngineLoader.java @@ -22,7 +22,7 @@ public class CryptoEngineLoader { List<SystemAccount> accounts = dataStore.getSystemDao().getObjects(statementList); if(accounts.size() == 0){ log.info("This is an fresh install, and it has no CA or any system accounts - if there is a config.json" + - "file in your directory, this means the install is broken and you should delete and restart!"); + " file in your directory, this means the install is broken and you should delete and restart!"); } else{ 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 3e646a51460524fc21374503ce73fbc8790ba2cd..f1b7461b12d692c83940fb2f76a48d4f5c08f3ec 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 @@ -42,7 +42,7 @@ public class LDAPConnector implements AuthenticationSource { } @Override - public UserProfile getUserProfile(String username) { + public UserProfile getUserProfile(String queryString, String field) { return null; }