Make user/anonymous semantics more consistent with Authorization
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / NodeUserAdmin.java
index caadadefa8785054696476473892a90419b5262d..077a1f8a7286bf76568fb3547ab53e791e75d258 100644 (file)
@@ -14,6 +14,7 @@ import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 
 import javax.naming.ldap.LdapName;
 import javax.security.auth.Subject;
@@ -44,6 +45,7 @@ import org.argeo.osgi.useradmin.AbstractUserDirectory;
 import org.argeo.osgi.useradmin.AggregatingUserAdmin;
 import org.argeo.osgi.useradmin.LdapUserAdmin;
 import org.argeo.osgi.useradmin.LdifUserAdmin;
+import org.argeo.osgi.useradmin.OsUserDirectory;
 import org.argeo.osgi.useradmin.UserAdminConf;
 import org.argeo.osgi.useradmin.UserDirectory;
 import org.ietf.jgss.GSSCredential;
@@ -57,6 +59,7 @@ import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedServiceFactory;
+import org.osgi.service.useradmin.Authorization;
 import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.util.tracker.ServiceTracker;
 
@@ -84,6 +87,8 @@ class NodeUserAdmin extends AggregatingUserAdmin implements ManagedServiceFactor
        private Path nodeKeyTab = KernelUtils.getOsgiInstancePath(KernelConstants.NODE_KEY_TAB_PATH);
        private GSSCredential acceptorCredentials;
 
+       private boolean singleUser = false;
+
        public NodeUserAdmin(String systemRolesBaseDn) {
                super(systemRolesBaseDn);
                tmTracker = new ServiceTracker<>(bc, TransactionManager.class, null);
@@ -95,14 +100,27 @@ class NodeUserAdmin extends AggregatingUserAdmin implements ManagedServiceFactor
                String uri = (String) properties.get(UserAdminConf.uri.name());
                URI u;
                try {
-                       u = new URI(uri);
+                       if (uri == null) {
+                               String baseDn = (String) properties.get(UserAdminConf.baseDn.name());
+                               u = KernelUtils.getOsgiInstanceUri(KernelConstants.DIR_NODE + '/' + baseDn + ".ldif");
+                       } else
+                               u = new URI(uri);
                } catch (URISyntaxException e) {
                        throw new CmsException("Badly formatted URI " + uri, e);
                }
 
                // Create
-               AbstractUserDirectory userDirectory = u.getScheme().equals("ldap") ? new LdapUserAdmin(properties)
-                               : new LdifUserAdmin(properties);
+               AbstractUserDirectory userDirectory;
+               if (UserAdminConf.SCHEME_LDAP.equals(u.getScheme())) {
+                       userDirectory = new LdapUserAdmin(properties);
+               } else if (UserAdminConf.SCHEME_FILE.equals(u.getScheme())) {
+                       userDirectory = new LdifUserAdmin(u, properties);
+               } else if (UserAdminConf.SCHEME_OS.equals(u.getScheme())) {
+                       userDirectory = new OsUserDirectory(u, properties);
+                       singleUser = true;
+               } else {
+                       throw new CmsException("Unsupported scheme " + u.getScheme());
+               }
                Object realm = userDirectory.getProperties().get(UserAdminConf.realm.name());
                addUserDirectory(userDirectory);
 
@@ -145,6 +163,17 @@ class NodeUserAdmin extends AggregatingUserAdmin implements ManagedServiceFactor
        public String getName() {
                return "Node User Admin";
        }
+       
+       
+
+       @Override
+       protected void addAbstractSystemRoles(Authorization rawAuthorization, Set<String> sysRoles) {
+               if(rawAuthorization.getName()==null) {
+                       sysRoles.add(NodeConstants.ROLE_ANONYMOUS);
+               }else {
+                       sysRoles.add(NodeConstants.ROLE_USER);
+               }
+       }
 
        protected void postAdd(AbstractUserDirectory userDirectory) {
                // JTA
@@ -268,6 +297,10 @@ class NodeUserAdmin extends AggregatingUserAdmin implements ManagedServiceFactor
                return acceptorCredentials;
        }
 
+       public boolean isSingleUser() {
+               return singleUser;
+       }
+
        public final static Oid KERBEROS_OID;
        static {
                try {