From 600afe220ae3bad9b2904f7a6d5529168e5c0f1b Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Tue, 8 Feb 2022 08:45:20 +0100 Subject: [PATCH] Reactivate JCR webdav and remote servlets --- .../cms/jcr/internal/CmsJcrDeployment.java | 9 ++------- .../internal/servlet/CmsSessionProvider.java | 15 ++++++++------- .../src/org/argeo/api/cms/CmsSession.java | 7 +++++-- .../cms/internal/auth/CmsSessionImpl.java | 19 +++++++++++++++++-- 4 files changed, 32 insertions(+), 18 deletions(-) diff --git a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrDeployment.java b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrDeployment.java index 340d13782..16f5979d7 100644 --- a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrDeployment.java +++ b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/CmsJcrDeployment.java @@ -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) { diff --git a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsSessionProvider.java b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsSessionProvider.java index 0f27fd005..4e067eea2 100644 --- a/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsSessionProvider.java +++ b/jcr/org.argeo.cms.jcr/src/org/argeo/cms/jcr/internal/servlet/CmsSessionProvider.java @@ -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()) diff --git a/org.argeo.api.cms/src/org/argeo/api/cms/CmsSession.java b/org.argeo.api.cms/src/org/argeo/api/cms/CmsSession.java index 18d53cee8..ea9d10ba2 100644 --- a/org.argeo.api.cms/src/org/argeo/api/cms/CmsSession.java +++ b/org.argeo.api.cms/src/org/argeo/api/cms/CmsSession.java @@ -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 onClose); } diff --git a/org.argeo.cms/src/org/argeo/cms/internal/auth/CmsSessionImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/auth/CmsSessionImpl.java index b0824e84b..aa3a6ad17 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/auth/CmsSessionImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/auth/CmsSessionImpl.java @@ -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 views = new HashMap<>(); + private List> 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 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 onClose) { + onCloseCallbacks.add(onClose); + } + public Subject getSubject() { return Subject.getSubject(accessControlContext); } -- 2.30.2