]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/internal/useradmin/JcrUserAdmin.java
- Fix JCR security model initialisation order
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / useradmin / JcrUserAdmin.java
index 4ee4312ab11e68e53bb4bd131771e916b50632c7..f36a0714f0cfdf52b7df5f72959c36016a62075c 100644 (file)
@@ -1,23 +1,20 @@
 package org.argeo.cms.internal.useradmin;
 
-import static org.argeo.jcr.ArgeoJcrConstants.ALIAS_NODE;
-import static org.argeo.jcr.ArgeoJcrConstants.JCR_REPOSITORY_ALIAS;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
-import javax.jcr.Node;
 import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 
 import org.argeo.ArgeoException;
+import org.argeo.cms.CmsException;
+import org.argeo.cms.internal.useradmin.jackrabbit.JackrabbitUserAdminService;
+import org.argeo.jcr.JcrUtils;
 import org.argeo.security.UserAdminService;
-import org.argeo.security.jcr.JcrSecurityModel;
 import org.argeo.security.jcr.JcrUserDetails;
-import org.argeo.security.jcr.SimpleJcrSecurityModel;
+import org.argeo.security.jcr.NewUserDetails;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
@@ -27,55 +24,43 @@ import org.osgi.service.useradmin.User;
 import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.service.useradmin.UserAdminEvent;
 import org.osgi.service.useradmin.UserAdminListener;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
 
+/**
+ * Incomplete implementation of {@link UserAdmin} wrapping the supported
+ * {@link UserAdminService} for the time being.
+ */
 public class JcrUserAdmin implements UserAdmin {
        private final BundleContext bundleContext;
-       private UserAdminService userAdminService;
+       private JackrabbitUserAdminService userAdminService;
 
-       private final JcrSecurityModel jcrSecurityModel = new SimpleJcrSecurityModel();
        private final Session session;
 
-       public JcrUserAdmin(BundleContext bundleContext) {
+       public JcrUserAdmin(BundleContext bundleContext, Repository node) {
                try {
                        this.bundleContext = bundleContext;
-
-                       ServiceReference<Repository> nodeRepo = bundleContext
-                                       .getServiceReferences(Repository.class,
-                                                       "(" + JCR_REPOSITORY_ALIAS + "=" + ALIAS_NODE + ")")
-                                       .iterator().next();
-                       this.session = bundleContext.getService(nodeRepo).login();
+                       this.session = node.login();
                } catch (Exception e) {
                        throw new ArgeoException("Cannot initialize user admin", e);
                }
        }
 
+       public void destroy() {
+               JcrUtils.logoutQuietly(session);
+       }
+
        @Override
        public Role createRole(String name, int type) {
-               try {
-                       if (Role.USER == type) {
-                               Node userProfile = jcrSecurityModel.sync(session, name, null);
-                               session.getWorkspace().getVersionManager()
-                                               .checkout(userProfile.getPath());
-                               String password = "";
-                               // TODO add roles
-                               JcrUserDetails userDetails = new JcrUserDetails(userProfile,
-                                               password, new ArrayList<GrantedAuthority>());
-                               session.save();
-                               session.getWorkspace().getVersionManager()
-                                               .checkin(userProfile.getPath());
-                               userAdminService().createUser(userDetails);
-                               return new JcrEnduser(userDetails);
-                       } else if (Role.GROUP == type) {
-                               userAdminService().newRole(name);
-                               return new JcrGroup(name);
-                       } else {
-                               throw new ArgeoException("Unsupported role type " + type);
-                       }
-               } catch (RepositoryException e) {
-                       throw new ArgeoException("Cannot create role " + name);
+               if (Role.USER == type) {
+                       NewUserDetails userDetails = new NewUserDetails(name, null);
+                       userAdminService().createUser(userDetails);
+                       return new JcrEndUser((JcrUserDetails) userAdminService()
+                                       .loadUserByUsername(name));
+               } else if (Role.GROUP == type) {
+                       userAdminService().newRole(name);
+                       return new JcrGroup(name);
+               } else {
+                       throw new ArgeoException("Unsupported role type " + type);
                }
        }
 
@@ -84,7 +69,7 @@ public class JcrUserAdmin implements UserAdmin {
                Role role = getRole(name);
                if (role == null)
                        return false;
-               if (role instanceof JcrEnduser)
+               if (role instanceof JcrEndUser)
                        userAdminService().deleteUser(role.getName());
                else if (role instanceof JcrGroup)
                        userAdminService().deleteRole(role.getName());
@@ -95,14 +80,15 @@ public class JcrUserAdmin implements UserAdmin {
 
        @Override
        public Role getRole(String name) {
-               if (userAdminService().listEditableRoles().contains(name))
-                       return new JcrGroup(name);
                try {
-                       UserDetails userDetails = userAdminService().loadUserByUsername(
-                                       name);
-                       return new JcrEnduser(userDetails);
+                       JcrUserDetails userDetails = (JcrUserDetails) userAdminService()
+                                       .loadUserByUsername(name);
+                       return new JcrEndUser(userDetails);
                } catch (UsernameNotFoundException e) {
-                       return null;
+                       if (userAdminService().listEditableRoles().contains(name))
+                               return new JcrGroup(name);
+                       else
+                               return null;
                }
        }
 
@@ -118,26 +104,27 @@ public class JcrUserAdmin implements UserAdmin {
                for (int i = 0; i < roles.size(); i++)
                        res[i] = new JcrGroup(roles.get(i));
                for (int i = 0; i < users.size(); i++)
-                       res[roles.size() + i] = new JcrEnduser(userAdminService()
-                                       .loadUserByUsername(users.get(i)));
+                       res[roles.size() + i] = new JcrEndUser(
+                                       (JcrUserDetails) userAdminService().loadUserByUsername(
+                                                       users.get(i)));
                return res;
        }
 
        @Override
        public User getUser(String key, String value) {
-               throw new ArgeoException("Property based search not yet implemented");
+               throw new CmsException("Property based search not yet implemented");
        }
 
        @Override
        public Authorization getAuthorization(User user) {
-               return null;
+               return new JcrAuthorization(((JcrEndUser) user).getUserDetails());
        }
 
        private synchronized UserAdminService userAdminService() {
                return userAdminService;
        }
 
-       public void setUserAdminService(UserAdminService userAdminService) {
+       public void setUserAdminService(JackrabbitUserAdminService userAdminService) {
                this.userAdminService = userAdminService;
        }