X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=security%2Fruntime%2Forg.argeo.security.ldap%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fsecurity%2Fldap%2Fjcr%2FJcrUserDetailsContextMapper.java;h=3a39e690627712d3379d90b1c65638e05c2ec6e8;hb=5266ec50ddbf3247a5033d98a1dbceec6673a5b8;hp=bfbed855860f4f37f57d1444600a6f7c2a3559fa;hpb=2745f0c8c57d9468855179d56f858fb2448f779c;p=lgpl%2Fargeo-commons.git diff --git a/security/runtime/org.argeo.security.ldap/src/main/java/org/argeo/security/ldap/jcr/JcrUserDetailsContextMapper.java b/security/runtime/org.argeo.security.ldap/src/main/java/org/argeo/security/ldap/jcr/JcrUserDetailsContextMapper.java index bfbed8558..3a39e6906 100644 --- a/security/runtime/org.argeo.security.ldap/src/main/java/org/argeo/security/ldap/jcr/JcrUserDetailsContextMapper.java +++ b/security/runtime/org.argeo.security.ldap/src/main/java/org/argeo/security/ldap/jcr/JcrUserDetailsContextMapper.java @@ -9,6 +9,7 @@ import java.util.Random; import java.util.concurrent.Executor; import javax.jcr.Node; +import javax.jcr.Property; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.nodetype.NodeType; @@ -17,7 +18,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; import org.argeo.jcr.ArgeoNames; -import org.argeo.jcr.ArgeoTypes; import org.argeo.jcr.JcrUtils; import org.argeo.security.jcr.JcrUserDetails; import org.springframework.ldap.core.DirContextAdapter; @@ -64,8 +64,6 @@ public class JcrUserDetailsContextMapper implements UserDetailsContextMapper, public UserDetails mapUserFromContext(final DirContextOperations ctx, final String username, GrantedAuthority[] authorities) { - // if (repository == null) - // throw new ArgeoException("No JCR repository registered"); final StringBuffer userHomePathT = new StringBuffer(""); Runnable action = new Runnable() { public void run() { @@ -76,8 +74,11 @@ public class JcrUserDetailsContextMapper implements UserDetailsContextMapper, if (SecurityContextHolder.getContext().getAuthentication() == null) { // authentication - systemExecutor.execute(action); - JcrUtils.logoutQuietly(session); + try { + systemExecutor.execute(action); + } finally { + JcrUtils.logoutQuietly(session); + } } else { // authenticated user action.run(); @@ -96,56 +97,44 @@ public class JcrUserDetailsContextMapper implements UserDetailsContextMapper, /** @return path to the user home node */ protected String mapLdapToJcr(String username, DirContextOperations ctx) { - // Session session = null; try { - // Repository nodeRepo = JcrUtils.getRepositoryByAlias( - // repositoryFactory, ArgeoJcrConstants.ALIAS_NODE); - // session = nodeRepo.login(); Node userHome = JcrUtils.getUserHome(session, username); if (userHome == null) - userHome = createUserHome(session, username); + userHome = JcrUtils.createUserHome(session, homeBasePath, + username); String userHomePath = userHome.getPath(); - Node userProfile; - if (userHome.hasNode(ARGEO_USER_PROFILE)) { - userProfile = userHome.getNode(ARGEO_USER_PROFILE); + Node userProfile = userHome.getNode(ARGEO_PROFILE); + if (userHome.hasNode(ARGEO_PROFILE)) { + userProfile = userHome.getNode(ARGEO_PROFILE); } else { - userProfile = userHome.addNode(ARGEO_USER_PROFILE); + userProfile = userHome.addNode(ARGEO_PROFILE); userProfile.addMixin(NodeType.MIX_TITLE); userProfile.addMixin(NodeType.MIX_CREATED); userProfile.addMixin(NodeType.MIX_LAST_MODIFIED); } + for (String jcrProperty : propertyToAttributes.keySet()) ldapToJcr(userProfile, jcrProperty, ctx); + + // assign default values + if (!userProfile.hasProperty(Property.JCR_DESCRIPTION)) + userProfile.setProperty(Property.JCR_DESCRIPTION, ""); + if (!userProfile.hasProperty(Property.JCR_TITLE)) + userProfile.setProperty(Property.JCR_TITLE, userProfile + .getProperty(ARGEO_FIRST_NAME).getString() + + " " + + userProfile.getProperty(ARGEO_LAST_NAME).getString()); + session.save(); - if (log.isDebugEnabled()) - log.debug("Mapped " + ctx.getDn() + " to " + userProfile); + if (log.isTraceEnabled()) + log.trace("Mapped " + ctx.getDn() + " to " + userProfile); return userHomePath; - } catch (RepositoryException e) { + } catch (Exception e) { JcrUtils.discardQuietly(session); throw new ArgeoException("Cannot synchronize JCR and LDAP", e); - } finally { - // JcrUtils.logoutQuietly(session); } } - protected Node createUserHome(Session session, String username) { - try { - Node userHome = JcrUtils.mkdirs(session, - usernameToHomePath(username)); - userHome.addMixin(ArgeoTypes.ARGEO_USER_HOME); - userHome.setProperty(ARGEO_USER_ID, username); - return userHome; - } catch (RepositoryException e) { - throw new ArgeoException("Cannot create home node for user " - + username, e); - } - } - - protected String usernameToHomePath(String username) { - return homeBasePath + '/' + JcrUtils.firstCharsToPath(username, 2) - + '/' + username; - } - public void mapUserToContext(UserDetails user, final DirContextAdapter ctx) { if (!(user instanceof JcrUserDetails)) throw new ArgeoException("Unsupported user details: " @@ -157,26 +146,17 @@ public class JcrUserDetailsContextMapper implements UserDetailsContextMapper, encodePassword(user.getPassword())); final JcrUserDetails jcrUserDetails = (JcrUserDetails) user; - // systemExecutor.execute(new Runnable() { - // public void run() { - // Session session = null; try { - // Repository nodeRepo = JcrUtils.getRepositoryByAlias( - // repositoryFactory, ArgeoJcrConstants.ALIAS_NODE); - // session = nodeRepo.login(); Node userProfile = session.getNode(jcrUserDetails.getHomePath() - + '/' + ARGEO_USER_PROFILE); + + '/' + ARGEO_PROFILE); for (String jcrProperty : propertyToAttributes.keySet()) jcrToLdap(userProfile, jcrProperty, ctx); - if (log.isDebugEnabled()) - log.debug("Mapped " + userProfile + " to " + ctx.getDn()); + + if (log.isTraceEnabled()) + log.trace("Mapped " + userProfile + " to " + ctx.getDn()); } catch (RepositoryException e) { throw new ArgeoException("Cannot synchronize JCR and LDAP", e); - } finally { - // session.logout(); } - // } - // }); } protected String encodePassword(String password) { @@ -213,10 +193,6 @@ public class JcrUserDetailsContextMapper implements UserDetailsContextMapper, protected void jcrToLdap(Node userProfile, String jcrProperty, DirContextOperations ctx) { try { - if (!userProfile.hasProperty(jcrProperty)) - return; - String value = userProfile.getProperty(jcrProperty).getString(); - String ldapAttribute; if (propertyToAttributes.containsKey(jcrProperty)) ldapAttribute = propertyToAttributes.get(jcrProperty); @@ -224,6 +200,18 @@ public class JcrUserDetailsContextMapper implements UserDetailsContextMapper, throw new ArgeoException( "No LDAP attribute mapped for JCR proprty " + jcrProperty); + + // fix issue with empty 'sn' in LDAP + if (ldapAttribute.equals("sn") + && (!userProfile.hasProperty(jcrProperty) || userProfile + .getProperty(jcrProperty).getString().trim() + .equals(""))) + userProfile.setProperty(jcrProperty, "empty"); + + if (!userProfile.hasProperty(jcrProperty)) + return; + String value = userProfile.getProperty(jcrProperty).getString(); + ctx.setAttributeValue(ldapAttribute, value); } catch (Exception e) { throw new ArgeoException("Cannot map JCR property " + jcrProperty @@ -243,16 +231,6 @@ public class JcrUserDetailsContextMapper implements UserDetailsContextMapper, this.homeBasePath = homeBasePath; } - // public void register(RepositoryFactory repositoryFactory, - // Map parameters) { - // this.repositoryFactory = repositoryFactory; - // } - // - // public void unregister(RepositoryFactory repositoryFactory, - // Map parameters) { - // this.repositoryFactory = null; - // } - public void setUsernameAttribute(String usernameAttribute) { this.usernameAttribute = usernameAttribute; }