Author: echatellier Date: 2014-06-01 23:07:49 +0200 (Sun, 01 Jun 2014) New Revision: 118 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/118 Log: Retreive user from ldap Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/FakeLdapProvider.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/LdapProvider.java Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/LdapService.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/UserFolderAction.java trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/EDIManagementJob.java trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/user-folder-input.jsp trunk/faxtomail-ui-web/src/main/webapp/js/user-folder.js Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java 2014-05-30 21:01:38 UTC (rev 117) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfiguration.java 2014-06-01 21:07:49 UTC (rev 118) @@ -251,6 +251,10 @@ public String getLdapPassword() { return applicationConfig.getOption(FaxToMailConfigurationOption.LDAP_PASSWORD.getKey()); } + + public boolean isLdapMock() { + return applicationConfig.getOptionAsBoolean(FaxToMailConfigurationOption.LDAP_MOCK.getKey()); + } public String getInstanceUrl() { return applicationConfig.getOption(FaxToMailConfigurationOption.INSTANCE_URL.getKey()); Modified: trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java =================================================================== --- trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java 2014-05-30 21:01:38 UTC (rev 117) +++ trunk/faxtomail-persistence/src/main/java/com/franciaflex/faxtomail/FaxToMailConfigurationOption.java 2014-06-01 21:07:49 UTC (rev 118) @@ -94,7 +94,7 @@ LDAP_PORT( "faxtomail.ldap.port", "Port du serveur LDAP", "389", Integer.class), - + LDAP_USER( "faxtomail.ldap.user", "Nom d'utilisateur pour la connexion au serveur ldap", null, String.class), @@ -103,6 +103,10 @@ "faxtomail.ldap.password", "Mot de passe pour la connexion au serveur LDAP", null, String.class), + LDAP_MOCK( + "faxtomail.ldap.mock", + "Use mock ldap provider for test purpose", "false", Boolean.class), + // TRANSIENT CONFIG VERSION( "faxtomail.version", Modified: trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties =================================================================== --- trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties 2014-05-30 21:01:38 UTC (rev 117) +++ trunk/faxtomail-persistence/src/main/xmi/faxtomail.properties 2014-06-01 21:07:49 UTC (rev 118) @@ -66,11 +66,16 @@ com.franciaflex.faxtomail.persistence.entities.MailFilter.attribute.mailFolder.tagvalue.notNull=true com.franciaflex.faxtomail.persistence.entities.MailFilter.attribute.position.tagvalue.unique=true -# FaxToMailGroup -com.franciaflex.faxtomail.persistence.entities.FaxToMailUserGroup.attribute.name.tagvalue.naturalId=true - # Email com.franciaflex.faxtomail.persistence.entities.Email.attribute.mailFolder.tagvalue.notNull=true # History com.franciaflex.faxtomail.persistence.entities.History.attribute.type.tagvalue.notNull=true + + + +# FaxToMailUser +com.franciaflex.faxtomail.persistence.entities.FaxToMailUser.attribute.login.tagvalue.naturalId=true + +# FaxToMailUserGroup +com.franciaflex.faxtomail.persistence.entities.FaxToMailUserGroup.attribute.name.tagvalue.naturalId=true Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java 2014-05-30 21:01:38 UTC (rev 117) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ConfigurationService.java 2014-06-01 21:07:49 UTC (rev 118) @@ -41,6 +41,8 @@ import com.franciaflex.faxtomail.persistence.entities.EmailAccount; import com.franciaflex.faxtomail.persistence.entities.EmailAccountImpl; import com.franciaflex.faxtomail.persistence.entities.EmailAccountTopiaDao; +import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; +import com.franciaflex.faxtomail.persistence.entities.FaxToMailUserTopiaDao; import com.franciaflex.faxtomail.persistence.entities.MailFilter; import com.franciaflex.faxtomail.persistence.entities.MailFilterTopiaDao; import com.franciaflex.faxtomail.services.FaxToMailServiceSupport; @@ -169,4 +171,9 @@ emailAccountTopiaDao.deleteAll(emailAccountMap.values()); getPersistenceContext().commit(); } + + public List<FaxToMailUser> getAllUsers() { + FaxToMailUserTopiaDao faxToMailUserDao = getPersistenceContext().getFaxToMailUserDao(); + return faxToMailUserDao.findAll(); + } } Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/LdapService.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/LdapService.java 2014-05-30 21:01:38 UTC (rev 117) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/LdapService.java 2014-06-01 21:07:49 UTC (rev 118) @@ -1,77 +1,43 @@ package com.franciaflex.faxtomail.services.service; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.nuiton.util.beans.Binder; +import org.nuiton.util.beans.BinderFactory; +import com.franciaflex.faxtomail.FaxToMailConfiguration; +import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; +import com.franciaflex.faxtomail.persistence.entities.FaxToMailUserGroup; +import com.franciaflex.faxtomail.persistence.entities.FaxToMailUserGroupTopiaDao; +import com.franciaflex.faxtomail.persistence.entities.FaxToMailUserImpl; +import com.franciaflex.faxtomail.persistence.entities.FaxToMailUserTopiaDao; import com.franciaflex.faxtomail.services.FaxToMailServiceSupport; +import com.franciaflex.faxtomail.services.service.ldap.FakeLdapProvider; +import com.franciaflex.faxtomail.services.service.ldap.LdapProvider; import com.franciaflex.faxtomail.services.service.ldap.LdapUser; -import com.unboundid.ldap.sdk.LDAPConnection; -import com.unboundid.ldap.sdk.LDAPException; -import com.unboundid.ldap.sdk.SearchResult; -import com.unboundid.ldap.sdk.SearchResultEntry; -import com.unboundid.ldap.sdk.SearchScope; public class LdapService extends FaxToMailServiceSupport { private static final Log log = LogFactory.getLog(LdapService.class); - /** - * Get ldap connection. - * - * @return - * @throws LDAPException - */ - protected LDAPConnection getLDAPConnection() throws LDAPException { - // host, port, username and password - return new LDAPConnection(getApplicationConfig().getLdapHost(), - getApplicationConfig().getLdapPort(), - getApplicationConfig().getLdapUser(), - getApplicationConfig().getLdapPassword()); - } + protected LdapProvider ldapProvider; - /** - * Get all user from ldap. - * - * @return ldap users with group infos - * @throws LDAPException - */ - protected Collection<LdapUser> getAllLdapUsers() throws LDAPException { - Collection<LdapUser> results = new ArrayList<>(); - - // ldapsearch -h ldap.codelutin.home -b "ou=People,DC=codelutin,DC=home" "objectClass=posixGroup" - // ldapsearch -h ldap.codelutin.home -b "ou=People,DC=codelutin,DC=home" "objectClass=account" - String baseDN = "ou=People,DC=codelutin,DC=home"; - String filter = "(objectClass=account)"; - - LDAPConnection connection = null; - try { - connection = getLDAPConnection(); - if (connection.isConnected()) { - SearchResult searchResult = connection.search(baseDN, SearchScope.ONE, filter); - - List<SearchResultEntry> searchEntries = searchResult.getSearchEntries(); - for (SearchResultEntry searchEntry : searchEntries) { - LdapUser user = new LdapUser(); - user.setLogin(searchEntry.getAttributeValue("uid")); - user.setLogin(searchEntry.getAttributeValue("uid")); - user.setLogin(searchEntry.getAttributeValue("uid")); - - results.add(user); + protected LdapProvider getLdapProvider() { + if (ldapProvider == null) { + FaxToMailConfiguration config = getApplicationConfig(); + if (config.isLdapMock()) { + ldapProvider = new FakeLdapProvider(); + if (log.isInfoEnabled()) { + log.info("Using fake ldap provider"); } + } else { + ldapProvider = new LdapProvider(config); } - } finally { - if (connection != null) { - connection.close(); - } } - - - return results; + return ldapProvider; } /** @@ -82,8 +48,52 @@ if (log.isDebugEnabled()) { log.debug("Ldap service not configured !"); } + return; + } else { + if (log.isDebugEnabled()) { + log.debug("Updating user data from ldap"); + } } + + Collection<LdapUser> ldapUsers = getLdapProvider().getAllLdapUsers(); + + FaxToMailUserTopiaDao faxtomailUserDao = getPersistenceContext().getFaxToMailUserDao(); + FaxToMailUserGroupTopiaDao faxToMailUserGroupDao = getPersistenceContext().getFaxToMailUserGroupDao(); + Binder<FaxToMailUser, FaxToMailUser> userBinder = BinderFactory.newBinder(FaxToMailUser.class); + for (LdapUser ldapUser : ldapUsers) { + + // manage user from login + FaxToMailUser user = faxtomailUserDao.forLoginEquals(ldapUser.getLogin()).findUniqueOrNull(); + if (user == null) { + user = new FaxToMailUserImpl(); + } + + // FIXME echatellier 20140601 : it's not necessary to save user in database if information didn't change + userBinder.copyExcluding(ldapUser, user, + FaxToMailUser.PROPERTY_TOPIA_ID, + FaxToMailUser.PROPERTY_TOPIA_CREATE_DATE, + FaxToMailUser.PROPERTY_TOPIA_VERSION, + FaxToMailUser.PROPERTY_FAX_TO_MAIL_USER_GROUP); + + // manage user group + Collection<String> groups = ldapUser.getGroups(); + user.clearFaxToMailUserGroup(); + for (String group : groups) { + FaxToMailUserGroup userGroup = faxToMailUserGroupDao.forNameEquals(group).findUniqueOrNull(); + if (userGroup == null) { + userGroup = faxToMailUserGroupDao.create(FaxToMailUserGroup.PROPERTY_NAME, group); + } + user.addFaxToMailUserGroup(userGroup); + } + + // persist user + if (user.isPersisted()) { + faxtomailUserDao.update(user); + } else { + faxtomailUserDao.create(user); + } + } - + getPersistenceContext().commit(); } } Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/FakeLdapProvider.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/FakeLdapProvider.java (rev 0) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/FakeLdapProvider.java 2014-06-01 21:07:49 UTC (rev 118) @@ -0,0 +1,33 @@ +package com.franciaflex.faxtomail.services.service.ldap; + +import java.util.Arrays; +import java.util.Collection; + +import com.unboundid.ldap.sdk.LDAPException; + +/** + * Fake ldap provider for test/demo purpose. + * + * @author Eric Chatellier + */ +public class FakeLdapProvider extends LdapProvider { + + @Override + public Collection<LdapUser> getAllLdapUsers() { + + LdapUser ldapUser1 = new LdapUser(); + ldapUser1.setLogin("user1"); + ldapUser1.addGroup("Groupe 1"); + + LdapUser ldapUser2 = new LdapUser(); + ldapUser2.setLogin("user2"); + ldapUser2.addGroup("Groupe 1"); + + LdapUser ldapUser3 = new LdapUser(); + ldapUser3.setLogin("user3"); + ldapUser3.addGroup("Groupe 2"); + + return Arrays.asList(ldapUser1, ldapUser2, ldapUser3); + } + +} Property changes on: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/FakeLdapProvider.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/LdapProvider.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/LdapProvider.java (rev 0) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/LdapProvider.java 2014-06-01 21:07:49 UTC (rev 118) @@ -0,0 +1,85 @@ +package com.franciaflex.faxtomail.services.service.ldap; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.franciaflex.faxtomail.FaxToMailConfiguration; +import com.unboundid.ldap.sdk.LDAPConnection; +import com.unboundid.ldap.sdk.LDAPException; +import com.unboundid.ldap.sdk.SearchResult; +import com.unboundid.ldap.sdk.SearchResultEntry; +import com.unboundid.ldap.sdk.SearchScope; + +/** + * Real ldap provider. + * + * @author Eric Chatellier + */ +public class LdapProvider { + + protected FaxToMailConfiguration config; + + protected LdapProvider() { + + } + + public LdapProvider(FaxToMailConfiguration config) { + this(); + this.config = config; + } + + /** + * Get ldap connection. + * + * @return + * @throws LDAPException + */ + protected LDAPConnection getLDAPConnection() throws LDAPException { + // host, port, username and password + return new LDAPConnection(config.getLdapHost(), + config.getLdapPort(), + config.getLdapUser(), + config.getLdapPassword()); + } + + /** + * Get all user from ldap. + * + * @return ldap users with group infos + */ + public Collection<LdapUser> getAllLdapUsers() { + Collection<LdapUser> results = new ArrayList<>(); + + // ldapsearch -h ldap.codelutin.home -b "ou=People,DC=codelutin,DC=home" "objectClass=posixGroup" + // ldapsearch -h ldap.codelutin.home -b "ou=People,DC=codelutin,DC=home" "objectClass=account" + String baseDN = "ou=People,DC=codelutin,DC=home"; + String filter = "(objectClass=account)"; + + LDAPConnection connection = null; + try { + connection = getLDAPConnection(); + if (connection.isConnected()) { + SearchResult searchResult = connection.search(baseDN, SearchScope.ONE, filter); + + List<SearchResultEntry> searchEntries = searchResult.getSearchEntries(); + for (SearchResultEntry searchEntry : searchEntries) { + LdapUser user = new LdapUser(); + user.setLogin(searchEntry.getAttributeValue("uid")); + user.setLogin(searchEntry.getAttributeValue("uid")); + user.setLogin(searchEntry.getAttributeValue("uid")); + + results.add(user); + } + } + } catch (LDAPException ex) { + throw new RuntimeException("Can't connect to ldap", ex); + } finally { + if (connection != null) { + connection.close(); + } + } + + return results; + } +} Property changes on: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/ldap/LdapProvider.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/UserFolderAction.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/UserFolderAction.java 2014-05-30 21:01:38 UTC (rev 117) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/action/admin/UserFolderAction.java 2014-06-01 21:07:49 UTC (rev 118) @@ -24,9 +24,6 @@ * #L% */ -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; import java.util.Collections; import java.util.List; @@ -34,10 +31,10 @@ import org.apache.commons.logging.LogFactory; import org.apache.struts2.convention.annotation.Result; +import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; import com.franciaflex.faxtomail.persistence.entities.MailFolder; import com.franciaflex.faxtomail.services.service.ConfigurationService; import com.franciaflex.faxtomail.services.service.MailFolderService; -import com.franciaflex.faxtomail.services.service.ReferentielService; import com.franciaflex.faxtomail.web.FaxToMailActionSupport; public class UserFolderAction extends FaxToMailActionSupport { @@ -50,7 +47,7 @@ protected List<MailFolder> mailFolders; - protected List<String> groupNames; + protected List<FaxToMailUser> users; public void setConfigurationService(ConfigurationService configurationService) { this.configurationService = configurationService; @@ -64,7 +61,7 @@ @org.apache.struts2.convention.annotation.Action("user-folder-input") public String input() throws Exception { mailFolders = mailFolderService.getAllMailFolders(); - groupNames = Collections.emptyList(); //FIXME: configurationService.getAllGroups(); + users = configurationService.getAllUsers(); return INPUT; } @@ -81,7 +78,7 @@ return mailFolders; } - public List<String> getGroupNames() { - return groupNames; + public List<FaxToMailUser> getUsers() { + return users; } } Modified: trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/EDIManagementJob.java =================================================================== --- trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/EDIManagementJob.java 2014-05-30 21:01:38 UTC (rev 117) +++ trunk/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/EDIManagementJob.java 2014-06-01 21:07:49 UTC (rev 118) @@ -28,7 +28,6 @@ import com.franciaflex.faxtomail.services.service.EmailService; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; Modified: trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/user-folder-input.jsp =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/user-folder-input.jsp 2014-05-30 21:01:38 UTC (rev 117) +++ trunk/faxtomail-ui-web/src/main/webapp/WEB-INF/content/admin/user-folder-input.jsp 2014-06-01 21:07:49 UTC (rev 118) @@ -39,7 +39,7 @@ angular.module('UserFolderModule', ['FaxToMail']) .value('UserFolderData', { 'mailFolders': <s:property value="toJson(mailFolders)" escapeHtml="false"/>, - 'groupNames': <s:property value="toJson(groupNames)" escapeHtml="false"/> + 'users': <s:property value="toJson(users)" escapeHtml="false"/> }); </script> </head> @@ -61,8 +61,8 @@ </tr> </thead> <tbody> - <tr ng-repeat="groupName in groupNames"> - <th>{{groupName}}</th> + <tr ng-repeat="user in users"> + <th>{{user.login}}</th> <td> <input type="text" /> </td> Modified: trunk/faxtomail-ui-web/src/main/webapp/js/user-folder.js =================================================================== --- trunk/faxtomail-ui-web/src/main/webapp/js/user-folder.js 2014-05-30 21:01:38 UTC (rev 117) +++ trunk/faxtomail-ui-web/src/main/webapp/js/user-folder.js 2014-06-01 21:07:49 UTC (rev 118) @@ -29,8 +29,8 @@ function($scope, $http, UserFolderData) { //{Array} mail folders $scope.mailFolders = UserFolderData.mailFolders; - // {Array} Liste des groupes ldap - $scope.groupNames = UserFolderData.groupNames; + // {Array} Liste des utilisateurs ldap + $scope.users = UserFolderData.users; // method privée recursive pour retourner l'ensemble des dossiers var recursiveAddMailFolder = function(result, mailFolders) {