Reactivate JCR webdav and remote servlets
authorMathieu Baudier <mbaudier@argeo.org>
Tue, 8 Feb 2022 07:45:20 +0000 (08:45 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Tue, 8 Feb 2022 07:45:20 +0000 (08:45 +0100)
jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrDeployment.java
jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsSessionProvider.java
org.argeo.api.cms/src/org/argeo/api/cms/CmsSession.java
org.argeo.cms/src/org/argeo/cms/internal/auth/CmsSessionImpl.java

index 340d137824849b28917838e4aab5e43a15e378c1..16f5979d736304caad7833a607730c4db91d6537 100644 (file)
@@ -74,10 +74,6 @@ public class CmsJcrDeployment {
 
        CmsDeployment cmsDeployment;
 
-       public CmsJcrDeployment() {
-//             initTrackers();
-       }
-
        public void start() {
                dataModels = new DataModels(bc);
 
@@ -390,9 +386,8 @@ public class CmsJcrDeployment {
 //     }
 
        protected void registerRepositoryServlets(String alias, Repository repository) {
-               // FIXME re-enable it with a proper class loader
-//             registerRemotingServlet(alias, repository);
-//             registerWebdavServlet(alias, repository);
+               registerRemotingServlet(alias, repository);
+               registerWebdavServlet(alias, repository);
        }
 
        protected void registerWebdavServlet(String alias, Repository repository) {
index 0f27fd005dca58aa2f17eea8d95ed59f40702159..4e067eea25a01653e1e7a0fbb318687628497091 100644 (file)
@@ -17,9 +17,11 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 
 import org.apache.jackrabbit.server.SessionProvider;
-import org.argeo.api.cms.CmsSession;
-import org.argeo.api.cms.CmsLog;
 import org.argeo.api.cms.CmsConstants;
+import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.CmsSession;
+import org.argeo.cms.auth.RemoteAuthUtils;
+import org.argeo.cms.servlet.ServletHttpRequest;
 import org.argeo.jcr.JcrUtils;
 
 /**
@@ -46,9 +48,8 @@ public class CmsSessionProvider implements SessionProvider, Serializable {
 //             if (workspace == null)
 //                     return null;
 
-//             CmsSessionImpl cmsSession = WebCmsSessionImpl.getCmsSession(request);
-               // FIXME retrieve CMS session
-               CmsSession cmsSession = null;
+               CmsSession cmsSession = RemoteAuthUtils.getCmsSession(new ServletHttpRequest(request));
+               // CmsSessionImpl cmsSession = WebCmsSessionImpl.getCmsSession(request);
                if (log.isTraceEnabled()) {
                        log.trace("Get JCR session from " + cmsSession);
                }
@@ -80,6 +81,7 @@ public class CmsSessionProvider implements SessionProvider, Serializable {
 
                private CmsDataSession(CmsSession cmsSession) {
                        this.cmsSession = cmsSession;
+                       cmsSession.addOnCloseCallback((sess) -> close());
                }
 
                public Session newDataSession(String cn, String workspace, Repository repository) {
@@ -160,8 +162,7 @@ public class CmsSessionProvider implements SessionProvider, Serializable {
                                                "CMS session " + cmsSession.getUuid() + " is not valid since " + cmsSession.getEnd());
                }
 
-               private void close() {
-                       // FIXME class this when CMS session is closed
+               protected void close() {
                        synchronized (this) {
                                // TODO check data session in use ?
                                for (String path : dataSessions.keySet())
index 18d53cee88a1daa2ba2c391ad1034ab5b022eadc..ea9d10ba24d1573ed74df47bf9049e07969f7ed1 100644 (file)
@@ -3,6 +3,7 @@ package org.argeo.api.cms;
 import java.time.ZonedDateTime;
 import java.util.Locale;
 import java.util.UUID;
+import java.util.function.Consumer;
 
 import javax.naming.ldap.LdapName;
 import javax.security.auth.Subject;
@@ -16,14 +17,14 @@ public interface CmsSession {
        UUID getUuid();
 
        String getUserRole();
-       
+
        LdapName getUserDn();
 
        String getLocalId();
 
        String getDisplayName();
 //     Authorization getAuthorization();
-       
+
        Subject getSubject();
 
        boolean isAnonymous();
@@ -37,4 +38,6 @@ public interface CmsSession {
        boolean isValid();
 
        void registerView(String uid, Object view);
+
+       void addOnCloseCallback(Consumer<CmsSession> onClose);
 }
index b0824e84bb1924835d0232c1691a7609d8de1807..aa3a6ad17dd3e61fa4bd4dc751c6533a2a1f8b4a 100644 (file)
@@ -5,13 +5,17 @@ import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.time.ZonedDateTime;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
+import java.util.function.Consumer;
 
 import javax.crypto.SecretKey;
 import javax.naming.InvalidNameException;
@@ -21,10 +25,10 @@ import javax.security.auth.login.LoginContext;
 import javax.security.auth.login.LoginException;
 import javax.security.auth.x500.X500Principal;
 
-import org.argeo.api.cms.CmsSession;
+import org.argeo.api.cms.CmsAuth;
 import org.argeo.api.cms.CmsLog;
+import org.argeo.api.cms.CmsSession;
 import org.argeo.cms.security.NodeSecurityUtils;
-import org.argeo.api.cms.CmsAuth;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.InvalidSyntaxException;
@@ -54,6 +58,8 @@ public class CmsSessionImpl implements CmsSession, Serializable {
 
        private Map<String, Object> views = new HashMap<>();
 
+       private List<Consumer<CmsSession>> onCloseCallbacks = Collections.synchronizedList(new ArrayList<>());
+
        public CmsSessionImpl(Subject initialSubject, Authorization authorization, Locale locale, String localSessionId) {
                this.creationTime = ZonedDateTime.now();
                this.locale = locale;
@@ -92,6 +98,10 @@ public class CmsSessionImpl implements CmsSession, Serializable {
                end = ZonedDateTime.now();
                serviceRegistration.unregister();
 
+               for (Consumer<CmsSession> onClose : onCloseCallbacks) {
+                       onClose.accept(this);
+               }
+
                try {
                        LoginContext lc;
                        if (isAnonymous()) {
@@ -108,6 +118,11 @@ public class CmsSessionImpl implements CmsSession, Serializable {
                log.debug("Closed " + this);
        }
 
+       @Override
+       public void addOnCloseCallback(Consumer<CmsSession> onClose) {
+               onCloseCallbacks.add(onClose);
+       }
+
        public Subject getSubject() {
                return Subject.getSubject(accessControlContext);
        }