]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - org.argeo.cms/src/org/argeo/cms/internal/kernel/CmsDeployment.java
Fix regression with anonymous WebDav
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / kernel / CmsDeployment.java
index 0373e3690c6da4ee5607b34700000da1acbd7cd8..e30249f3c63fcbbe751b4ea2ed4923558952c946 100644 (file)
@@ -14,6 +14,7 @@ import java.util.Set;
 
 import javax.jcr.Repository;
 import javax.jcr.Session;
+import javax.security.auth.callback.CallbackHandler;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -25,6 +26,8 @@ import org.argeo.node.DataModelNamespace;
 import org.argeo.node.NodeConstants;
 import org.argeo.node.NodeDeployment;
 import org.argeo.node.NodeState;
+import org.argeo.node.security.CryptoKeyring;
+import org.argeo.util.LangUtils;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.Constants;
@@ -34,11 +37,14 @@ import org.osgi.framework.wiring.BundleCapability;
 import org.osgi.framework.wiring.BundleWire;
 import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.service.cm.ConfigurationAdmin;
+import org.osgi.service.cm.ManagedService;
 import org.osgi.service.http.HttpService;
 import org.osgi.service.useradmin.UserAdmin;
 import org.osgi.util.tracker.ServiceTracker;
 
 public class CmsDeployment implements NodeDeployment {
+       private final static String LEGACY_JCR_REPOSITORY_ALIAS = "argeo.jcr.repository.alias";
+       
        private final Log log = LogFactory.getLog(getClass());
        private final BundleContext bc = FrameworkUtil.getBundle(getClass()).getBundleContext();
 
@@ -127,13 +133,31 @@ public class CmsDeployment implements NodeDeployment {
                        throw new CmsException("Deployment is already available");
                }
 
+               // home
                prepareDataModel(KernelUtils.openAdminSession(deployedNodeRepository));
+       }
+
+       private void prepareHomeRepository(Repository deployedRepository) {
                Hashtable<String, String> regProps = new Hashtable<String, String>();
-               regProps.put(NodeConstants.CN, NodeConstants.ALIAS_HOME);
-               regProps.put(NodeConstants.JCR_REPOSITORY_ALIAS, NodeConstants.ALIAS_HOME);
-               homeRepository = new HomeRepository(deployedNodeRepository);
+               regProps.put(NodeConstants.CN, NodeConstants.HOME);
+               regProps.put(LEGACY_JCR_REPOSITORY_ALIAS, NodeConstants.HOME);
+               homeRepository = new HomeRepository(deployedRepository);
                // register
                bc.registerService(Repository.class, homeRepository, regProps);
+
+               new ServiceTracker<CallbackHandler, CallbackHandler>(bc, CallbackHandler.class, null) {
+
+                       @Override
+                       public CallbackHandler addingService(ServiceReference<CallbackHandler> reference) {
+                               NodeKeyRing nodeKeyring = new NodeKeyRing(homeRepository);
+                               CallbackHandler callbackHandler = bc.getService(reference);
+                               nodeKeyring.setDefaultCallbackHandler(callbackHandler);
+                               bc.registerService(LangUtils.names(CryptoKeyring.class, ManagedService.class), nodeKeyring,
+                                               LangUtils.dico(Constants.SERVICE_PID, NodeConstants.NODE_KEYRING_PID));
+                               return callbackHandler;
+                       }
+
+               }.open();
        }
 
        /** Session is logged out. */
@@ -185,9 +209,9 @@ public class CmsDeployment implements NodeDeployment {
 
                if (!asBoolean((String) attrs.get(DataModelNamespace.CAPABILITY_ABSTRACT_ATTRIBUTE))) {
                        Hashtable<String, Object> properties = new Hashtable<>();
-                       properties.put(NodeConstants.JCR_REPOSITORY_ALIAS, name);
+                       properties.put(LEGACY_JCR_REPOSITORY_ALIAS, name);
                        properties.put(NodeConstants.CN, name);
-                       if (name.equals(NodeConstants.ALIAS_NODE))
+                       if (name.equals(NodeConstants.NODE))
                                properties.put(Constants.SERVICE_RANKING, Integer.MAX_VALUE);
                        LocalRepository localRepository = new LocalRepository(adminSession.getRepository(), capability);
                        bc.registerService(Repository.class, localRepository, properties);
@@ -225,10 +249,15 @@ public class CmsDeployment implements NodeDeployment {
                public RepositoryContext addingService(ServiceReference<RepositoryContext> reference) {
                        RepositoryContext nodeRepo = bc.getService(reference);
                        Object cn = reference.getProperty(NodeConstants.CN);
-                       if (cn != null && cn.equals(NodeConstants.ALIAS_NODE)) {
-                               prepareNodeRepository(nodeRepo.getRepository());
-                               nodeAvailable = true;
-                               checkReadiness();
+                       if (cn != null) {
+                               if (cn.equals(NodeConstants.NODE)) {
+                                       prepareNodeRepository(nodeRepo.getRepository());
+                                       prepareHomeRepository(nodeRepo.getRepository());
+                                       nodeAvailable = true;
+                                       checkReadiness();
+                               }else{
+                                       // TODO standalone
+                               }
                        }
                        return nodeRepo;
                }