Improve servlet integration.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 4 Nov 2020 07:36:50 +0000 (08:36 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 4 Nov 2020 07:36:50 +0000 (08:36 +0100)
org.argeo.cms/src/org/argeo/cms/auth/ServletAuthUtils.java [deleted file]
org.argeo.cms/src/org/argeo/cms/integration/CmsPrivateServletContext.java
org.argeo.cms/src/org/argeo/cms/servlet/CmsServletContext.java
org.argeo.cms/src/org/argeo/cms/servlet/ServletAuthUtils.java [new file with mode: 0644]

diff --git a/org.argeo.cms/src/org/argeo/cms/auth/ServletAuthUtils.java b/org.argeo.cms/src/org/argeo/cms/auth/ServletAuthUtils.java
deleted file mode 100644 (file)
index 9cb7fdc..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.argeo.cms.auth;
-
-import java.security.AccessControlContext;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
-import java.util.function.Supplier;
-
-import javax.security.auth.Subject;
-import javax.servlet.http.HttpServletRequest;
-
-import org.osgi.service.http.HttpContext;
-
-/** Authentications utilities when using servlets. */
-public class ServletAuthUtils {
-       public final static <T> T doAs(Supplier<T> supplier, HttpServletRequest req) {
-               return Subject.doAs(
-                               Subject.getSubject((AccessControlContext) req.getAttribute(AccessControlContext.class.getName())),
-                               new PrivilegedAction<T>() {
-
-                                       @Override
-                                       public T run() {
-                                               return supplier.get();
-                                       }
-
-                               });
-       }
-
-       public final static void configureRequestSecurity(HttpServletRequest req) {
-               if (req.getAttribute(AccessControlContext.class.getName()) != null)
-                       throw new IllegalStateException("Request already authenticated.");
-               AccessControlContext acc = AccessController.getContext();
-               req.setAttribute(HttpContext.REMOTE_USER, CurrentUser.getUsername());
-               req.setAttribute(AccessControlContext.class.getName(), acc);
-       }
-
-       public final static void clearRequestSecurity(HttpServletRequest req) {
-               if (req.getAttribute(AccessControlContext.class.getName()) == null)
-                       throw new IllegalStateException("Cannot clear non-authenticated request.");
-               req.setAttribute(HttpContext.REMOTE_USER, null);
-               req.setAttribute(AccessControlContext.class.getName(), null);
-       }
-}
index a97f4133fdbdc2cd3191a6164136ef9a1d703e5f..862d7ee08eda8eab931b31a8c65d987df28e27ac 100644 (file)
@@ -14,7 +14,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.argeo.cms.auth.HttpRequestCallbackHandler;
-import org.argeo.cms.auth.ServletAuthUtils;
+import org.argeo.cms.servlet.ServletAuthUtils;
 import org.osgi.service.http.context.ServletContextHelper;
 
 /** Manages security access to servlets. */
index 0d94ff3f10781d7aace56e9eafc8a1b9e64416d7..9ff8f855f662db1c14bd8e2f33bfce8417123f3a 100644 (file)
@@ -15,7 +15,6 @@ import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.api.NodeConstants;
 import org.argeo.cms.auth.HttpRequestCallbackHandler;
-import org.argeo.cms.auth.ServletAuthUtils;
 import org.argeo.cms.internal.http.HttpUtils;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.FrameworkUtil;
diff --git a/org.argeo.cms/src/org/argeo/cms/servlet/ServletAuthUtils.java b/org.argeo.cms/src/org/argeo/cms/servlet/ServletAuthUtils.java
new file mode 100644 (file)
index 0000000..13dfbe6
--- /dev/null
@@ -0,0 +1,53 @@
+package org.argeo.cms.servlet;
+
+import java.security.AccessControlContext;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+import java.util.function.Supplier;
+
+import javax.security.auth.Subject;
+import javax.servlet.http.HttpServletRequest;
+
+import org.argeo.cms.auth.CurrentUser;
+import org.osgi.service.http.HttpContext;
+
+/** Authentications utilities when using servlets. */
+public class ServletAuthUtils {
+       /**
+        * Execute this supplier, using the CMS class loader as context classloader.
+        * Useful to log in to JCR.
+        */
+       public final static <T> T doAs(Supplier<T> supplier, HttpServletRequest req) {
+               ClassLoader currentContextCl = Thread.currentThread().getContextClassLoader();
+               Thread.currentThread().setContextClassLoader(ServletAuthUtils.class.getClassLoader());
+               try {
+                       return Subject.doAs(
+                                       Subject.getSubject((AccessControlContext) req.getAttribute(AccessControlContext.class.getName())),
+                                       new PrivilegedAction<T>() {
+
+                                               @Override
+                                               public T run() {
+                                                       return supplier.get();
+                                               }
+
+                                       });
+               } finally {
+                       Thread.currentThread().setContextClassLoader(currentContextCl);
+               }
+       }
+
+       public final static void configureRequestSecurity(HttpServletRequest req) {
+               if (req.getAttribute(AccessControlContext.class.getName()) != null)
+                       throw new IllegalStateException("Request already authenticated.");
+               AccessControlContext acc = AccessController.getContext();
+               req.setAttribute(HttpContext.REMOTE_USER, CurrentUser.getUsername());
+               req.setAttribute(AccessControlContext.class.getName(), acc);
+       }
+
+       public final static void clearRequestSecurity(HttpServletRequest req) {
+               if (req.getAttribute(AccessControlContext.class.getName()) == null)
+                       throw new IllegalStateException("Cannot clear non-authenticated request.");
+               req.setAttribute(HttpContext.REMOTE_USER, null);
+               req.setAttribute(AccessControlContext.class.getName(), null);
+       }
+}