Skip to content
Snippets Groups Projects
Commit 7cd4b773 authored by Felix Sidokhine's avatar Felix Sidokhine
Browse files

fixed extendeddata for AD

parent e02e48a5
No related branches found
No related tags found
No related merge requests found
Showing
with 128 additions and 10 deletions
......@@ -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 {
......
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;
}
}
}
......@@ -47,7 +47,7 @@ public class DataStore implements AuthenticationSource {
}
@Override
public UserProfile getUserProfile(String username) {
public UserProfile getUserProfile(String queryString, String field) {
return null;
}
......
......@@ -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);
......
......@@ -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;
}
......@@ -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());
}
......
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.
......
......@@ -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();
......
......@@ -42,7 +42,7 @@ public class LDAPConnector implements AuthenticationSource {
}
@Override
public UserProfile getUserProfile(String username) {
public UserProfile getUserProfile(String queryString, String field) {
return null;
}
......
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