From f0736212f1919898614bb911f4a14823b177777d Mon Sep 17 00:00:00 2001 From: Massimiliano Assante Date: Mon, 30 Nov 2015 16:55:04 +0000 Subject: [PATCH] Initial import. git-svn-id: http://svn.research-infrastructures.eu/public/d4science/gcube/trunk/portal/ldap-export-servlet@120490 82a268e6-3cf1-43bd-a215-b396298e98cf --- .classpath | 32 ++ .project | 42 ++ .settings/.jsdtscope | 13 + .settings/org.eclipse.core.resources.prefs | 4 + .settings/org.eclipse.jdt.core.prefs | 8 + .settings/org.eclipse.m2e.core.prefs | 4 + .settings/org.eclipse.wst.common.component | 10 + ....eclipse.wst.common.project.facet.core.xml | 7 + ...rg.eclipse.wst.jsdt.ui.superType.container | 1 + .../org.eclipse.wst.jsdt.ui.superType.name | 1 + .settings/org.eclipse.wst.validation.prefs | 2 + pom.xml | 180 +++++++++ .../portal/ldapexport/LDAPExportService.java | 128 +++++++ .../org/gcube/portal/ldapexport/LDAPSync.java | 360 ++++++++++++++++++ src/main/webapp/WEB-INF/web.xml | 20 + src/main/webapp/index.jsp | 7 + target/ldap-export-servlet.war | Bin 0 -> 13730 bytes .../portal/ldapexport/LDAPExportService.class | Bin 0 -> 8057 bytes .../gcube/portal/ldapexport/LDAPSync.class | Bin 0 -> 13492 bytes target/ldap-export-servlet/WEB-INF/web.xml | 20 + target/ldap-export-servlet/index.jsp | 7 + target/maven-archiver/pom.properties | 5 + 22 files changed, 851 insertions(+) create mode 100644 .classpath create mode 100644 .project create mode 100644 .settings/.jsdtscope create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 .settings/org.eclipse.wst.common.component create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 .settings/org.eclipse.wst.jsdt.ui.superType.container create mode 100644 .settings/org.eclipse.wst.jsdt.ui.superType.name create mode 100644 .settings/org.eclipse.wst.validation.prefs create mode 100644 pom.xml create mode 100644 src/main/java/org/gcube/portal/ldapexport/LDAPExportService.java create mode 100644 src/main/java/org/gcube/portal/ldapexport/LDAPSync.java create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/index.jsp create mode 100644 target/ldap-export-servlet.war create mode 100644 target/ldap-export-servlet/WEB-INF/classes/org/gcube/portal/ldapexport/LDAPExportService.class create mode 100644 target/ldap-export-servlet/WEB-INF/classes/org/gcube/portal/ldapexport/LDAPSync.class create mode 100644 target/ldap-export-servlet/WEB-INF/web.xml create mode 100644 target/ldap-export-servlet/index.jsp create mode 100644 target/maven-archiver/pom.properties diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..91f2707 --- /dev/null +++ b/.classpath @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.project b/.project new file mode 100644 index 0000000..ef7e969 --- /dev/null +++ b/.project @@ -0,0 +1,42 @@ + + + ldap-export-servlet + + + + + + org.eclipse.wst.jsdt.core.javascriptValidator + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.jem.workbench.JavaEMFNature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.jsdt.core.jsNature + + diff --git a/.settings/.jsdtscope b/.settings/.jsdtscope new file mode 100644 index 0000000..b72a6a4 --- /dev/null +++ b/.settings/.jsdtscope @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..abdea9a --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/main/resources=UTF-8 +encoding/=UTF-8 diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..443e085 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,8 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.source=1.7 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..b4fac8a --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..4045d87 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.container b/.settings/org.eclipse.wst.jsdt.ui.superType.container new file mode 100644 index 0000000..3bd5d0a --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.container @@ -0,0 +1 @@ +org.eclipse.wst.jsdt.launching.baseBrowserLibrary \ No newline at end of file diff --git a/.settings/org.eclipse.wst.jsdt.ui.superType.name b/.settings/org.eclipse.wst.jsdt.ui.superType.name new file mode 100644 index 0000000..05bd71b --- /dev/null +++ b/.settings/org.eclipse.wst.jsdt.ui.superType.name @@ -0,0 +1 @@ +Window \ No newline at end of file diff --git a/.settings/org.eclipse.wst.validation.prefs b/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..04cad8c --- /dev/null +++ b/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,2 @@ +disabled=06target +eclipse.preferences.version=1 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4673839 --- /dev/null +++ b/pom.xml @@ -0,0 +1,180 @@ + + + maven-parent + org.gcube.tools + 1.0.0 + + + + 4.0.0 + org.gcube.portal + ldap-export-servlet + war + 1.0.0-SNAPSHOT + ldap-export-servlet Maven Webapp + http://maven.apache.org + This component read periodically exports users and their groups in LDAP + + 1.7 + 6.0.6 + ${project.basedir}/distro + ${project.build.directory}/${project.build.finalName} + distro + + UTF-8 + UTF-8 + + + + + http://svn.d4science.research-infrastructures.eu/gcube/trunk/portal/${project.artifactId} + + + + + org.gcube.distribution + maven-portal-bom + LATEST + pom + import + + + + + + org.gcube.common.portal + portal-manager + + + org.gcube.portal + custom-portal-handler + provided + + + org.gcube.resources.discovery + ic-client + + + org.gcube.core + common-encryption + provided + + + com.sun.mail + javax.mail + provided + + + com.liferay.portal + portal-service + provided + + + javax.portlet + portlet-api + provided + + + javax.servlet + servlet-api + 2.3 + provided + + + javax.servlet.jsp + jsp-api + 2.0 + provided + + + org.slf4j + slf4j-api + provided + + + junit + junit + 3.8.1 + test + + + + ldap-export-servlet + + + org.apache.maven.plugins + maven-war-plugin + 2.1.1 + + + compile + + exploded + + + + + ${webappDirectory} + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.7 + 1.7 + + + + + org.apache.maven.plugins + maven-assembly-plugin + 2.2 + + + ${distroDirectory}/descriptor.xml + + + + + servicearchive + install + + single + + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.5 + + + copy-profile + install + + copy-resources + + + target + + + ${distroDirectory} + true + + profile.xml + + + + + + + + + + + + diff --git a/src/main/java/org/gcube/portal/ldapexport/LDAPExportService.java b/src/main/java/org/gcube/portal/ldapexport/LDAPExportService.java new file mode 100644 index 0000000..0a8f351 --- /dev/null +++ b/src/main/java/org/gcube/portal/ldapexport/LDAPExportService.java @@ -0,0 +1,128 @@ +package org.gcube.portal.ldapexport; + +import static org.gcube.resources.discovery.icclient.ICFactory.clientFor; +import static org.gcube.resources.discovery.icclient.ICFactory.queryFor; + +import java.io.IOException; +import java.util.List; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.gcube.common.encryption.StringEncrypter; +import org.gcube.common.portal.PortalContext; +import org.gcube.common.resources.gcore.ServiceEndpoint; +import org.gcube.common.resources.gcore.ServiceEndpoint.AccessPoint; +import org.gcube.common.resources.gcore.ServiceEndpoint.Property; +import org.gcube.common.resources.gcore.utils.Group; +import org.gcube.common.scope.api.ScopeProvider; +import org.gcube.resources.discovery.client.api.DiscoveryClient; +import org.gcube.resources.discovery.client.queries.api.SimpleQuery; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + + +@SuppressWarnings("serial") +public class LDAPExportService extends HttpServlet { + + private static final Logger _log = LoggerFactory.getLogger(LDAPExportService.class); + + private static final String LDAP_SERVER_NAME = "LDAPServer"; + private static final String LDAP_SERVER_FILTER_NAME = "filter"; + private static final String LDAP_SERVER_PRINCPAL_NAME = "ldapPrincipal"; + + private static final int LDAP_MINUTES_DELAY = 10; + + private String portalName; + private String ldapUrl; + private String filter; + private String principal; + private String ldapPassword; + + public void init() { + portalName = PortalContext.getPortalInstanceName(); + + PortalContext context = PortalContext.getConfiguration(); + String scope = "/" + context.getInfrastructureName(); + ScopeProvider.instance.set(scope); + + SimpleQuery query = queryFor(ServiceEndpoint.class); + query.addCondition("$resource/Profile/Category/text() eq 'Portal'"); + query.addCondition("$resource/Profile/Name/text() eq '" + portalName + "'"); + + DiscoveryClient client = clientFor(ServiceEndpoint.class); + + List list = client.submit(query); + if (list == null || list.isEmpty()) { + _log.error("Could not find any Service endpoint registred in the infrastructure for this portal: " + portalName); + } + else if (list.size() > 1) { + _log.warn("Found more than one Service endpoint registred in the infrastructure for this portal: " + portalName); + } + else { + for (ServiceEndpoint res : list) { + Group apGroup = res.profile().accessPoints(); + AccessPoint[] accessPoints = (AccessPoint[]) apGroup.toArray(new AccessPoint[apGroup.size()]); + for (int i = 0; i < accessPoints.length; i++) { + if (accessPoints[i].name().compareTo(LDAP_SERVER_NAME) == 0) { + _log.info("Found credentials for " + LDAP_SERVER_NAME); + AccessPoint found = accessPoints[i]; + ldapUrl = found.address(); + String encrPassword = found.password(); + try { + ldapPassword = StringEncrypter.getEncrypter().decrypt( encrPassword); + } catch (Exception e) { + _log.error("Something went wrong while decrypting password for " + LDAP_SERVER_NAME); + e.printStackTrace(); + } + Group propGroup = found.properties(); + Property[] props = (Property[]) propGroup.toArray(new Property[propGroup.size()]); + for (int j = 0; j < props.length; j++) { + if (props[j].name().compareTo(LDAP_SERVER_FILTER_NAME) == 0) { + _log.info("\tFound properties of " + LDAP_SERVER_FILTER_NAME); + String encrValue = props[j].value(); + System.out.println("Filter encrypted = " + encrValue); + try { + filter = StringEncrypter.getEncrypter().decrypt(encrValue); + } catch (Exception e) { + _log.error("Something went wrong while decrypting value for " + LDAP_SERVER_FILTER_NAME); + e.printStackTrace(); + } + } + else if (props[j].name().compareTo(LDAP_SERVER_PRINCPAL_NAME) == 0) { + _log.info("\tFound properties of " + LDAP_SERVER_PRINCPAL_NAME); + String encrValue = props[j].value(); + try { + principal = StringEncrypter.getEncrypter().decrypt(encrValue); + } catch (Exception e) { + _log.error("Something went wrong while decrypting value for " + LDAP_SERVER_PRINCPAL_NAME); + e.printStackTrace(); + } + } + } + + } + } + + } + } + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + ScheduledExecutorService ldapScheduler = Executors.newScheduledThreadPool(1); + ldapScheduler.scheduleAtFixedRate(new LDAPSync(ldapUrl, filter, principal, ldapPassword), 0, LDAP_MINUTES_DELAY, TimeUnit.MINUTES); + + String toReturn = "
LDAPSync SCRIPT Started ...
"; + + response.setContentType("text/html"); + response.getWriter().write(toReturn); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {} +} \ No newline at end of file diff --git a/src/main/java/org/gcube/portal/ldapexport/LDAPSync.java b/src/main/java/org/gcube/portal/ldapexport/LDAPSync.java new file mode 100644 index 0000000..55d9d47 --- /dev/null +++ b/src/main/java/org/gcube/portal/ldapexport/LDAPSync.java @@ -0,0 +1,360 @@ +package org.gcube.portal.ldapexport; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import java.util.Random; + +import javax.naming.Context; +import javax.naming.NamingEnumeration; +import javax.naming.NamingException; +import javax.naming.directory.Attribute; +import javax.naming.directory.Attributes; +import javax.naming.directory.BasicAttribute; +import javax.naming.directory.BasicAttributes; +import javax.naming.directory.DirContext; +import javax.naming.directory.InitialDirContext; +import javax.naming.directory.SearchControls; +import javax.naming.directory.SearchResult; + +import org.gcube.common.portal.PortalContext; +import org.gcube.portal.custom.communitymanager.OrganizationsUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.liferay.portal.kernel.cache.CacheRegistryUtil; +import com.liferay.portal.kernel.exception.PortalException; +import com.liferay.portal.kernel.exception.SystemException; +import com.liferay.portal.model.Organization; +import com.liferay.portal.model.User; +import com.liferay.portal.service.OrganizationLocalServiceUtil; +import com.liferay.portal.service.UserLocalServiceUtil; + +public class LDAPSync implements Runnable { + private static final Logger _log = LoggerFactory.getLogger(LDAPSync.class); + + private static final String LDAP_ORG_FILTER = "(objectClass=organizationalUnit)"; + private static final String LDAP_GROUP_FILTER = "(objectClass=posixGroup)"; + + private String ldapUrl; + private String filter; + private String principal; + private String pwd; + + + public LDAPSync(String ldapUrl, String filter, String principal, String pwd) { + this.ldapUrl = ldapUrl; + this.filter = filter; + this.principal = principal; + this.pwd = pwd; + _log.info("Starting LDAPSync over " + ldapUrl); + } + + /** + * + * @return the Liferay mapped as Root Organization + */ + private Organization getRootVO() { + String rootVoName = PortalContext.getConfiguration().getInfrastructureName(); + _log.debug("Root organization name found: " + rootVoName); + + //start of iteration of the actual groups + List organizations; + try { + organizations = OrganizationLocalServiceUtil.getOrganizations(0, OrganizationLocalServiceUtil.getOrganizationsCount()); + for (Organization organization : organizations) { + if (organization.getName().equals(rootVoName)) { + return organization; + } + } + } + catch (SystemException e) { + _log.error("There were problems retrieving root organization", e); + } + _log.error("Could not find any root organization"); + return null; + } + + + + + @Override + public void run() { + _log.debug("Reading Portal Users ..."); + List users = null; + try { + users = getAllLiferayUsers(); + _log.debug("\n***Read " + users.size() + " from LR DB\n"); + } catch (Exception e1) { + e1.printStackTrace(); + } + _log.debug("Reading Portal Organizations ..."); + Organization rootVO = getRootVO(); + + _log.debug("Initializing LDAP exporter ..."); + + Properties env = new Properties(); + env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory"); + env.put(Context.PROVIDER_URL, ldapUrl); + env.put(Context.SECURITY_PRINCIPAL, principal); + env.put(Context.SECURITY_CREDENTIALS, pwd); + + try { + DirContext ctx = new InitialDirContext(env); + _log.debug("Initiating LDAP Sync ..."); + //update the whole list of users (uid="+username+",ou=People,o=Liferay,ou=Organizations,dc=d4science,dc=org") + exportSingleUsers(ctx, env, users); + + //crate or update the whole list of organizations (objectClass=organizationalUnit, ou="+orgName+",dc=d4science,dc=org) and groups ( objectClass=top and POSIXGroup) + updateGroups(ctx, rootVO); + + } catch (NamingException e) { + _log.error("Something went Wrong during LDAP Sync in Exporting to LDAP"); + e.printStackTrace(); + } catch (SystemException es) { + _log.error("Something went Wrong during LDAP Sync in retrieving Liferay Organization"); + es.printStackTrace(); + } + } + + private void updateGroups(DirContext ctx, Organization root) throws NamingException, SystemException { + String subCtx = getOrgSubContext(root.getName()); + if (!checkIfLDAPOrganizationalUnitExists(ctx, subCtx)) + createOrganizationalUnit(ctx, subCtx); + for (Organization org : root.getSuborganizations()) { + String orgSubCtx = "ou="+org.getName()+","+subCtx; + if (!checkIfLDAPOrganizationalUnitExists(ctx, orgSubCtx)) + createOrganizationalUnit(ctx, orgSubCtx); + for (Organization vre : org.getSuborganizations()) { + String vreSubCtx = "cn="+vre.getName()+","+orgSubCtx; + if (!checkIfLDAPGroupExists(ctx, vreSubCtx)) + createGroupVRE(ctx, vreSubCtx, vre.getName()); + //update the list of users in such VRE + updateUsersInGroup(ctx, vreSubCtx, vre); + } + } + } + + private void updateUsersInGroup(DirContext ctx, String vreSubCtx, Organization vre) throws NamingException, SystemException { + List users = UserLocalServiceUtil.getOrganizationUsers(vre.getOrganizationId()); + for (User userObj : users) { + String user = userObj.getScreenName(); + try { + Attribute memberUid = new BasicAttribute("memberUid"); + memberUid.add(user); + Attributes attributes = new BasicAttributes(); + attributes.put(memberUid); + ctx.modifyAttributes(vreSubCtx, DirContext.ADD_ATTRIBUTE, attributes); + _log.info("Adding user: " + user); + } + catch (javax.naming.directory.AttributeInUseException ex) { + _log.trace("Not adding already existing user: " + user); + } + + } + + } + + private void exportSingleUsers(DirContext ctx, Properties env, List users) throws NamingException { + for (User user : users) { + updateUserInLDAP(user.getScreenName(), user.getFirstName(), user.getLastName(), user.getFullName(), user.getEmailAddress(), "{SHA}"+user.getPassword(), ctx, filter); + //_log.debug("Updated " + user.getScreenName()); + } + _log.debug("LDAP Users Sync cycle done"); + if (! users.isEmpty()) + _log.info("LDAP Users Sync Completed OK!"); + else + _log.warn("LDAP Users Sync cycle skipped this time"); + } + /** + * + * @param ctx + * @param subContext + * @throws NamingException + */ + private void createOrganizationalUnit(DirContext ctx, String subContext) throws NamingException { + Attributes attributes = new BasicAttributes(); + Attribute objectClass = new BasicAttribute("objectClass"); + objectClass.add("organizationalUnit"); + attributes.put(objectClass); + + Attribute description = new BasicAttribute("description"); + description.add("Liferay Organization"); + attributes.put(description); + ctx.createSubcontext(subContext, attributes); + _log.info("Added " + subContext); + } + /** + * + * @param ctx + * @param subContext + * @param vreName + * @throws NamingException + */ + private void createGroupVRE(DirContext ctx, String subContext, String vreName) throws NamingException { + Attributes attributes = new BasicAttributes(); + + Attribute objectClass = new BasicAttribute("objectClass"); + objectClass.add("top"); + objectClass.add("posixGroup"); + // objectClass.add("researchProject"); + // objectClass.add("groupOfMembers"); + attributes.put(objectClass); + + Attribute cn = new BasicAttribute("cn"); + cn.add(vreName); + attributes.put(cn); + + Attribute gidNumber = new BasicAttribute("gidNumber"); + gidNumber.add(getRandomPOSIXidentifier(ctx)); + attributes.put(gidNumber); + + ctx.createSubcontext(subContext, attributes); + _log.info("Added " + subContext); + } + + private String getOrgSubContext(String orgName) { + return "ou="+orgName+",dc=d4science,dc=org"; + } + /** + * + * @param ctx + * @param orgSubctx + * @return true if exists + */ + private boolean checkIfLDAPOrganizationalUnitExists(DirContext ctx, String orgSubctx) { + SearchControls ctls = new SearchControls(); + ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); + NamingEnumeration answer; + try { + answer = ctx.search(orgSubctx, LDAP_ORG_FILTER, ctls); + } catch (NamingException e) { + _log.debug("not found in LDAP (will add it): Organization: " + orgSubctx); + return false; + } + boolean toReturn = answer.hasMoreElements(); + _log.debug("Organization: " + orgSubctx + " exists? " + toReturn); + return toReturn; + } + /** + * + * @param ctx + * @param groupSubctx + * @return true if exists + */ + private boolean checkIfLDAPGroupExists(DirContext ctx, String groupSubctx) { + SearchControls ctls = new SearchControls(); + ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); + NamingEnumeration answer; + try { + answer = ctx.search(groupSubctx, LDAP_GROUP_FILTER, ctls); + } catch (NamingException e) { + _log.debug("not found in LDAP (will add it): Group: " + groupSubctx); + return false; + } + boolean toReturn = answer.hasMoreElements(); + _log.debug("Group: " + groupSubctx + " exists? " + toReturn); + return toReturn; + } + /** + * + * @param username + * @return the single user subContext + */ + private String getSubContext(String username) { + return "uid="+username+",ou=People,o=Liferay,ou=Organizations,dc=d4science,dc=org"; + } + /** + * + * @param username + * @param ctx + * @param filter + * @return true if exists + */ + private boolean checkIfLDAPUserExists(String username, DirContext ctx, String filter) { + SearchControls ctls = new SearchControls(); + ctls.setSearchScope(SearchControls.SUBTREE_SCOPE); + NamingEnumeration answer; + try { + answer = ctx.search(getSubContext(username), filter, ctls); + } catch (NamingException e) { + _log.info("user: " + username + " not found in LDAP, trying to export it"); + return false; + } + return answer.hasMoreElements(); + } + /** + * + * @param username + * @param name + * @param lastName + * @param email + * @param passwd + * @param ctx + * @throws NamingException + */ + private void updateUserInLDAP(String username, String name, String lastName, String fullName, String email, String passwd, DirContext ctx, String filter) throws NamingException { + Attributes attributes=new BasicAttributes(); + Attribute objectClass=new BasicAttribute("objectClass"); + objectClass.add("inetOrgPerson"); + attributes.put(objectClass); + + //the main ldap server uses 'givenName' for the First name, 'cn' for "first name last name', 'sn' for the last name + Attribute givenName = new BasicAttribute("givenName"); + Attribute cn = new BasicAttribute("cn"); + Attribute sn = new BasicAttribute("sn"); + Attribute mail = new BasicAttribute("mail"); + Attribute userPassword = new BasicAttribute("userPassword"); + + givenName.add(name); + cn.add(fullName); + sn.add(lastName); + mail.add(email); + userPassword.add(passwd); + + attributes.put(givenName); + attributes.put(cn); + attributes.put(sn); + attributes.put(mail); + attributes.put(userPassword); + + if (checkIfLDAPUserExists(username, ctx, filter)) { + //_log.debug("User " + username + " already exists, replacing attributes"); + ctx.modifyAttributes(getSubContext(username), DirContext.REPLACE_ATTRIBUTE, attributes); + } + else { + ctx.createSubcontext(getSubContext(username),attributes); + _log.debug("New User Found with uid=" + username + " created"); + } + } + /** + * + * @return the whole list of users + */ + private List getAllLiferayUsers() { + String infraName = PortalContext.getConfiguration().getInfrastructureName(); + _log.info("TRY Reading non chached users belonging to: /" + infraName); + + List toReturn = new ArrayList(); + Organization rootInfra; + try { + CacheRegistryUtil.clear(); //needed to avoid cache use by liferay API + rootInfra = OrganizationLocalServiceUtil.getOrganization(OrganizationsUtil.getCompany().getCompanyId(), infraName); + toReturn = UserLocalServiceUtil.getOrganizationUsers(rootInfra.getOrganizationId()); + } catch (PortalException | SystemException e) { + _log.error("Error during LDAP Sync, could not retrieve users from LR DB: " + e.getMessage()); + } + return toReturn; + } + /** + * + * @return an integer between 1000 and 2147483647 + */ + private String getRandomPOSIXidentifier(DirContext ctx) { + final int Low = 1000; + final int High = 2147483647; + Random r = new Random(); + int toReturn = r.nextInt(High-Low) + Low; + return toReturn+""; + } +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..07ae064 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,20 @@ + + + + LDAP Export servlet + + + start-ldap-export + org.gcube.portal.ldapexport.LDAPExportService + + + + start-ldap-export + /start-ldap-export + + + + + diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000..7f6f0e4 --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,7 @@ + + +

Hello From D4Science LDAP Export service!

+ +RUN D4Science LDAP Export service (repeat: every 10 minutes [Default]) + + diff --git a/target/ldap-export-servlet.war b/target/ldap-export-servlet.war new file mode 100644 index 0000000000000000000000000000000000000000..b4d8b691fc14ec3b675ea0cf680c94ba16fef4af GIT binary patch literal 13730 zcmbt*1y~%}wlz+0cX#*3-QC@T2X_q;+}+(J5Zv9}9fCUqcL)T2a_44d-kZ7ez4!jz zUv*V~z1Q03oH~7KSM}No(x70_KtF9a)LZ;t2mgM9dfUs2stD3a%84;3{M+pv(9WCN z%E>~%>D$+yZyV~L-DCyjB*jFPRp@2Ku4TtYWu)oor{SdOs3*oIYn2%1ST^?@Xr(5G zXr<|d-a+mbs3oA&bdkC>XM`)ENGmBjWm1=;;=&-uvnZi?qKqnCzkMUc;waU%-5lEA zpNi;1N5t1K>upjTT_0wcW+1PqC)?r^?&t3{F9fFm4Tz9 ziR15m{j2xSzW(C;{&137`gUwaeQ(s=}m)sWCzM ziiU?!YKey1^W-sdIkZc4cqx@@XO2&9%?7H_!#jPeHOMeTBiPC)27L;PyB$v|p*u`C zp|A5{%?i}A)7O%z!#*aQ3W65vfIBEf>qTxJ10eBPW9pwDys`sK0E{(6H=DjmFr_0c zD0MdyG3gV-jzx)B_TPe4^sjM#o&9$}+i$b7seX*u6b=Z;od5_(_BT zWfKP%b0ZV_f1TfYO{n*%W@s<#`zgHSq+lSrA4cOKBt988=ca=SNxUb5lBTZ^!gQe+ zo*JKEZk3iOTkyB2$G>g3Ev=X8FPlP^u&marZ_u*Twk==qn6u!uI95dSd>uP8jfac- z1j7BwbpEn&*|`;4d!Gqhm2t;89b_cuiJfgv_-Qh1`GC}OJ(LHxcE^SZA0wTj?*t$6 ztX~p?KZrELVH*&1+B6yXbP3LlU$qml^gRy-VOyHs6H6b7w9{g6QOE6_J_a|!$|YR2 zn+Pqw^H%ypk{i#y2yn+~-_Ao6iu|SllziAF71ScPV%YiDOJ0hOXo96nVc#Dl)sIGk z&lHAt$`n}xlcdi&5tAXO`VwvnQTklfsGZ1&ok`5dX7x0WEOAzn61mEfj+1J|Kco=PEp+UBdd)QW5sGx+UvCl!atl+G)V6U`j zA8TWSuLAGIY{SvS>e+r=og!|BRiDZcH?${1K3D32N@Qd~sT|%|jTLh>>wv0z)W!k1 z9XFrZ)(!8hug$M+|0rza_(Kll(J?>_%uI!STdGO*$P7Y>qd0?p zQIM|mqKH-xGC{*ifL#byIbXES4Ued}EiataW=dElze+Q_q&)QHN9lC#2|`&BoS#&a zG!vj&&Srn$sSdN-@@p}B%2K5Von)I|sD}n^o6wb*?W5wARML;}EF<{|wpXwj$Y-zmrZhz+p-1ZWZ@l6@YHAuYMT zKSrv|9k>bTrfe(6DP^Y;F(O4pBOPHLVp7+%!>fkJk&Ctg+=wJ7I2(KoZ9r!1G z#v`ULnJ{Jhhw9@U($l0bqPfsXu3q<(j+l(F=%-U=wpS6i$&-|jYFZEWTXIr$5`s5cYQG(ihH%TH0RXUXP~&r6>~*Iam|Q$b6`YISUqpl%98zYCkl{B+sG+ki|R0hE^n)!@IvrG@(*p2*yZOoL|Z5o7cs_h!l zf>|;*PLnPSn6ctfOklCsI0I+a6*W0AV;;|cJh5V?%W=RuJtTBuI}EiOLYdyl!ly&N zqKp-kSCWfPL!C1!X+QZMgnjh^Nxn^fFLzMEjRI*mUXho#Wecf(*{D!GTRaas6@3Pc znJ%wCpn_achWCdRSdcO?K5yO&Ler26m4-@ea<6z1*%ws0LK9}X;zZ=~ID5SE{g`bo zH!64WB37q*89r*$MdWqT_p1K+>O~f%L~gXFezcrVHAMkNMI|IT%=6Hk#{tEsXju(v z9FttB-^_UpN{{TB?mh~KBX~5H_%pLkL1001s1!#!>JrU09RHwRA)YzLdY_dAEQ~SB zcLyXd0f+4mJBTyAJ5DT}B?e|1KQ*GnRY>g^q6E`fM zt{F-0xJYuwO^cgtPscrso|?AIe2AV_k(MGC+=n-=Lg~B)aFlt!JEF-|p^^W|_ymQP z;==$^QhtcU9I-NuHCcl0q0m=8Oelwu+)pAa#uoW5pz?t1DbIkN8drqy-(TW(pZB-KOT^p$>XvboqUdc$3nCKxX3EFm>7c z?~SG>NjIhTqiWu@+%TnT*MRmm!#47YknZIYUM*X{egKsUk)PHv2Y7k6gN&wMei1sUCR)Egf#jnNk{nHWLw zaj}G%J4^gScY*u^PFeyX0TXxZTH8E(=#I^BfyJHuJX(C~G0geRnZ(+)2^p$kZ!q9E z;p+hF1KAxiJj^!o9zkdCP&C=yefYYYMZ$cKB-x()R7^jHnGJ?vH0ya5MwUC~QnS3*ESRVYx1c z2cZ<5kJbg^7+&6#eSRV5kkdE!A)=Z!t;;B%xv$suq=M5-{e{hIbfSkAof2rh2?YCe=SASZDxfS905gOv? z)T+jA7Du{D3qy+Rxt~fvXQW#kG0B5wu!Kc3fC!cO- z>2TXcM62CU=MGP+^Q*ZxcYGWHD3s$sG5~xePE}3{jm?Vov6OGU08dTWdi4qM&iLD6 zQizDiflj;oHTaVLP>d{;;-bdLBZ{TrBQX+7nSI7^2m&3h+R5Px-1yB^>gT%nE0|-^ zq}GDXYlyyp%YmXkr+VZ$Wle|m$C)1`mAxt9KwtYBHOG*3@g_}kQFIBd4w~Vv-P=iw z+JhFkSr(4n+F@E}k1Zbt>8d$5(s5hkcRF@UQjG9->?p=35i8qx;+AyXpq*C1lpj-V zZ6*W}_)TDd+7EYPa|&awZG`E=unJAK%$MYd4*(A7=i=)V%0moELGSeeV2}vHb`2Sy zEH4?2af)&`0Y!Cc=os+%LqVsBQ~{r1n=kZsFBEjF3^WnR2LSpN+>H*Hv(^`T&DZ!s zzTCE$WC7ZWE+8yQBBoJ@OqUF`Ta;^b0&5xU=eXe9mar#Qz#m1r^d^pIH!}HQJ90Oq zAp1|Gdi*IbByAQfClGn~TGL9iOZ4Y~WEZY4-O-tn@&*=ymw5luxoqGRmo7IoqRty)>kcyyTIoZ4HxvTu8IMbR5V zD!uPMlLR{5tQL{Tae3V3=9}5_Md4cPidjM?%^2MPc>N368q0ecFr}B*0v!2#(Vlfc zphh=)91^ZPkkl?MSW7vT?z#r;Sf>=j7jxhV_C9b1dGLh6x#35;LCNlRiKRu!szC6o z8nBf2p_dA?G%lCVg|h8;B)Sj@5LuDHouZ0Du7$|81g1}|RA)vRK(2*n-e9`S&K{al zRpy#i2kUj|c_2L;u*b2PrZgFJjK-3gC1J$K-Av1dM*+ZGpPa&t?%MDlec4*(B8Y(yv*x44%5@ zjm*@Sx*o~l4+g;)Xk6NFFkrV$w%{DI@pV}6*bc8E7<5vZT`y3*);T+`*QyhT1IsRi zqIbhYJ9=^3IRi+_I{d<8-=LRy#i|WhJO(r|t2fe(Bs+dW%^k&NyYA9-Kr3XmfYeq{ zFz$G~iehUcEyxF_w=>gGhBs`2>DUwMJjO0Oz*WjEIlxug4PjIBhGB`U?H)I~fd=Q( zhJ;&oz`Zo(PMb5lwt^inB^1G?>*nP`UTxFNs;=k($E#c>qA4d`Aiii^XE=iL^Zow!)!C(~5v)dg3W^TV=dzs*j~6=5K=MH+ zD<0riMmFgsy|(`3)}|(ROgc8ZZ5y&C$KWdG0--Tv8((1=*H6)|h^i+%WlQ$omYoAw zDyuli*Tly70ua&@jd}Tch|G8H>znWhj2b`pIIVV9B!ow&*AE79Uqb15F_(91y@bAw zj8QAHr;PC|i~?AsSn^40WqMq2Wfwb@P{NKc0AO-PE4(T8t9{s8jLFq!%+21=iprO` z1Js)*+g(!l2$v5WgNx7{FQ9+i#{GP_pv-UO6^sD{R0jY8;`%?_#woko82$V1O$*9R zW&W1mj5+?E*`0_8j4{bXWRBE0Ry09CApp@&lhFW4$By|rjwfZTkDWze)q1{E7q#9- zS9ezQSc&X?%aT_8{MUuE@CCIM3rkDa6)nK)M)UdjE*Wgh)$Oa-Zu|9_!x?X9?K(Hl z)7g$bd0t=#m0(LI4fLT}MS^%D&;D?}7XDj$4aRs7>xhv`!$Afz(cx1*fIm8)b8jEO@l&CCS}wUJCz_mbubt3#;?v%7^aEs1&Oh>C zb*SPWSmG`;(@2B|%92X#c^1`)?-`8bYd0+9J6294O{^4{xAGWX9mY?%#h|QKUV;bC z^)(DgX6nHzu@pmdj&lRnu?o~GD0g*v6oxRaM7i|8T#|9=Q}^hS$I~YdqFuRF@~jtM zCth_(B{gXs+=tIC9(tBfEDmQN9NrX75X>FPbNNVUcxxOSJ9h{kta1I2E$$p`!*TAA z+)4MJdn0%VnP?nZ(su4BkFh=Ac6uq9AV8tzuehdgdMTL5o_UnZJdZnaJ@$;Axc}yv zJrVCrKkptkVKT!~a$W5F5;2iI|KKRt0&()_?M*n8eE#Z4G9*a=j&H^ zx0;*{I84a4Q_M(tHe@Jd-0~*VMpgDh(&RL&TTHvKX{Z5 z+J{JS+ZXTy<`fuUxs2_=hd8{R>Yr_Sr{D9c!qg$_A(+XlgGgG6nMD$j;w?_94e&c6--o)|5} z;e}0wrkseSDbT|>LzwGja7Qlh*w=N@Y%qOC|;2fnvSzGcIsJVMr4me-~ zJVc|gdBrvvgVB83#p;ta4t5!=WPak|6L%;ZOH^m&$nCvblBmR5USFj%KM;6_<0=R@ zOakd3y>PEObtA4+T|ipk&v*>zbtzDPSPo5jkn-lpTBYgET3%{6^`)VEW9uCI8H7JPO-gDzrZEIIbT6O<<;blL|GJYxxx@AX;UO5} zHN+=^YjQLDLSFF%>zU=HxtrliT4qqTgqHCEqb9x*^O^Y-xs=Bb1asNjtI|9@H}mSS z5v3}l!+3}dIHXw^v1(A-_@eRwt*Ds>APx_9o+1cvQ@&UUF?FU zq=sKwUe4;qMF5@-tEQ?tj7fM?N_Y+XihYLstpUX=Hz{h08h6QDDk^Sqb7Kl6q-*El zqoBh=?$Z%)Nimj~QJ~R6Al6z?#&^(`e##66heGe7dkM#KqpA8e1CxpRq+XaZ(EG2( zTzai^`1KZhO)4vXkQRgU6AJ!5qm{tm3>X6Kpf*N}MSD&hqbrF367v-)xH%8Gu-pvL znDxYiKr%;F+`dztRPlBM@9s(?ZaMLVG2xL3G>yvXV+gNgz4vMMB`hGyUS@fdeZxq! zE`}tzvMwOT0PAQIi+X+&j=QAx;j#b?5(5Q-QGb~0650w(aRO1)(`;G|B*?WM3 zNfCJ};O2Cb#G{HF!+=o1ZHka@s74Hp>!Qi3v}B<lR{Pj^7VpSywYirX zOCPx#dr&PnHPonLGbM`CYW#q_*`L4ze!@8L0H4IEiAjb6PcfAik}Dv$33DMJs??_b zFyoB*L!#;~t+n)kK1=U`LOg}t#YjE69PVHwHRkq>!C(bxRK1B{VmupPOL>+PgjjP_ z=9HC{6?IWr@7qARc7BWm3b6+8X`v zhiE3dN7d?I<@I7CC-lKw;GVQ#s)Y?-; zV=t1jH=IQDI!xrURMhw$@<|Ca0*__S@VbhNymChVYt!-R@J`(nuIjrA(L1hybuvbR zlJgq-w$=EPgs^(fgi;$~#37dAT^?hKqIpPOt|&cAHM!mWTCn=`dEU)P9BGFSRqi0J zc_4a(dz3?673$h9`_MUv*>ncyi{DN%1(-Up_vWJG`q<{jakZGue3o(&txk^R;kvY3 zg7&mZ`XntKRO9VW>0bNS!d(YZT7G0F1VE^G&0=*6LOy+Jwn@;oolj|}=Iy~rv~M)o zxl1?>`+~{0npQO~hAUu?EfEH4&6xl?&hM5IErF-dsFa0giXbzAZx;dh{?o%+#K(K6j2P&^m=G9FqF@#|Tf=`DjHw)p4WUO6q%lF<)^?pOm_B;eurJliW?7=hNIC zuYjv(gZ{f&w}~EzP>Uh?dKCd@K&V^+6(D=W9GEUI@CNIK-T^&ta^@fe)w%dG*pkbIV)4w4OP&+UOBX zg$ZD$#3QIQwR491^ZX;36z93q1pPCg4|cl;{wk{w6@}tPs~@iLO)T^dLH8fi7ES9c;jT8-+K zyl;8aB-V@VWq-D^izApUpU;pRtC7!uVK}4y$rof^J)$3cjv%b67S(MP#4_bHke&46 zj3k5iekxO9X6}Gd)lXDaTlT0;3HHmfin5mWE#)I_ z4Sc}{kvtd{qC?8QZ3R{y_^tO=&6I)GS!F7_NccqseqKDp=bj^8P4i-0S~;u&=3;Bf zhH||Nzy~I}+-4^_+9ScKD{tm9-gMK=Wl2G;=vbWGXj#l!aFz)_Id)-bGhy2U1)9v@ ztZQ?cz}$X%DWw4VLdvGwDcKK?9M=BYx4y2}Wu!U7-XY$=@8yhG)3bUa&IPjhbMT~| z@Cy7pvpb~p{XJ}Yyt4`_cb*KWgYL3HZc$5$4IsT0qbwmIyyCNb;W3|@gF1W@J(s58 z>-bFMCic92&0UEdkuj%uA<+&dKU}kAFzIJ0QeN63@Cy`Z4_b*74w`e zYVf|puT)c|F~iC$v{t>&$uMzM@Fm8cs@6gGOXuV(#64Ba)scrW{&J|YBiu zx`bHn)DiSyeshS|pTv?hWsfRe1Aa3UVlxOs2}?KN-A5+YDKdrU!n#a)e`bba?L+AI zk9w3xUN>GXVR{8+Mv3TVZ=@kbgOOSP@Gff&+N*vZgTv#4_-vbnk9#+t)&Yfl z6Q?q2i97Q+A)a#OM+m1VtSWp^v6EonX`zxmsfVPUmD?d<5rR*v1R@E~h#r-}4z{28 z&x=@&#N6&=jc3MF9C1w7K+x8qRab%eUs99|`AzA?QGH_d{Ju?y$UT84=zOwgIZVEx zsiO-h?gSD2u-OUo?UB`v7SvTS4{ZLaMyidWtnVp7@d1@gEH+q`ue9xJ_U-%PJrP^uz3@qKq$jJRKx)y%do zMNkP<%awGuw$sDOTqHkmMpqWYN!RUM&s#;HP7PMbViz$(h+3rqe#AxVsa|hZ8cC3t zb+6D0-!(esD7XV;6*R?B zZ^7Ng%zh)Y->We!j!zWoYyRbox%-53G4a(oMo8xaTPAm_z}DelPX7(J>e(~CkL?rz zE{33Xme8z&Y^&_Dm&OTxSCR{-i$2Lv0}Z5rt%%1Kf8n%@E#VGK*U(tLEWY$PMBY57 zWd-$KI)dO?u%ace5KAmgl=$1FvW70us%*2WJf;N0B~}myXPnr`B)0l6dW6^+jI8>C z=VC>|w&zOKlSK|0C=#1R zP5Wcky7f%>rhedRCoi|qXct+P93}$=HV@Rb4>aF*0PO+RoX%vP_Y=C%#r3=CjUwkE zFEf&-+a7W2fP-+P6kE}$abv5Y)c*4ZTJOf@2dGz*af{E(&^icb8K~!<& zz$&%xH4e<%oXjV9d44#V%x5m?w$C8))DZzdVb z(_0>*qGOU>8ge&F8+koM!S8_w-<=65Y_}MIh|2*2w&7RzDl)lp_z|Q1)tB_icavMd zEOAEt3JJ*|^*1)f0Yrid_iuJQf*DO|p= zeFx6>{Ap^}5ws_cOj_?T^36xjI>y)9>q0?1!&*io@gt>xy}xJ{qcTFbS^%E_gFi8W zJmEHe`RK`WHOMst**pcc&~f@+(=QUk45oVeJsvGWlHPvMlHXMh#XEiawZQ!8uL`?p zLg-Xi?Lu-&yH5eM^bB8III%#Q^TL>syyJ38OAJGA&-?->{Bj~_RTB!yO+Fh23td)7 zUV87H0_G(VFd$dC9AeO$=w=w{d36#MZ|3oXap``v9#VEGL$#~rlBbE+HljL;mq>q#

kQB>TFs)97p(Ob2j97AN!<15<<_Hm=wf&Apy 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 literal 0 HcmV?d00001 diff --git a/target/ldap-export-servlet/WEB-INF/classes/org/gcube/portal/ldapexport/LDAPExportService.class b/target/ldap-export-servlet/WEB-INF/classes/org/gcube/portal/ldapexport/LDAPExportService.class new file mode 100644 index 0000000000000000000000000000000000000000..655ab7d7e6f5a7db8a604be3c487c8e1cf1d958c GIT binary patch literal 8057 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 R#>!r<=ed54@wErx{{x|V5W4^X literal 0 HcmV?d00001 diff --git a/target/ldap-export-servlet/WEB-INF/classes/org/gcube/portal/ldapexport/LDAPSync.class b/target/ldap-export-servlet/WEB-INF/classes/org/gcube/portal/ldapexport/LDAPSync.class new file mode 100644 index 0000000000000000000000000000000000000000..4d3564a318480484f3336e8283d07ead66c5cf07 GIT binary patch literal 13492 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 OB`fH`r=ZTqbN?5&{5j76 literal 0 HcmV?d00001 diff --git a/target/ldap-export-servlet/WEB-INF/web.xml b/target/ldap-export-servlet/WEB-INF/web.xml new file mode 100644 index 0000000..07ae064 --- /dev/null +++ b/target/ldap-export-servlet/WEB-INF/web.xml @@ -0,0 +1,20 @@ + + + + LDAP Export servlet + + + start-ldap-export + org.gcube.portal.ldapexport.LDAPExportService + + + + start-ldap-export + /start-ldap-export + + + + + diff --git a/target/ldap-export-servlet/index.jsp b/target/ldap-export-servlet/index.jsp new file mode 100644 index 0000000..7f6f0e4 --- /dev/null +++ b/target/ldap-export-servlet/index.jsp @@ -0,0 +1,7 @@ + + +

Hello From D4Science LDAP Export service!

+ +RUN D4Science LDAP Export service (repeat: every 10 minutes [Default]) + + diff --git a/target/maven-archiver/pom.properties b/target/maven-archiver/pom.properties new file mode 100644 index 0000000..0d297b8 --- /dev/null +++ b/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Mon Nov 30 17:15:06 CET 2015 +version=0.0.1-SNAPSHOT +groupId=org.gcube.portal +artifactId=ldap-export-servlet