Centralise HTTP headers
authorMathieu Baudier <mbaudier@argeo.org>
Mon, 18 Jul 2022 05:32:25 +0000 (07:32 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Mon, 18 Jul 2022 05:32:25 +0000 (07:32 +0200)
org.argeo.cms.ee/src/org/argeo/cms/servlet/PrivateWwwAuthServletContext.java
org.argeo.cms.ee/src/org/argeo/cms/servlet/internal/HttpUtils.java
org.argeo.cms/src/org/argeo/cms/auth/CmsAuthUtils.java
org.argeo.cms/src/org/argeo/cms/auth/RemoteSessionLoginModule.java
org.argeo.cms/src/org/argeo/cms/internal/http/CmsAuthenticator.java
org.argeo.util/src/org/argeo/util/dav/DavClient.java
org.argeo.util/src/org/argeo/util/dav/DavHeader.java
org.argeo.util/src/org/argeo/util/http/HttpHeader.java [new file with mode: 0644]

index 3bea0b4de717f44f11aecd8f94474e98eedeaae5..bf1ddcf88d08e559b61a0cab0dd21292288dec1b 100644 (file)
@@ -5,7 +5,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import org.argeo.cms.auth.SpnegoLoginModule;
-import org.argeo.cms.servlet.internal.HttpUtils;
+import org.argeo.util.http.HttpHeader;
 
 /** Servlet context forcing authentication. */
 public class PrivateWwwAuthServletContext extends CmsServletContext {
@@ -23,9 +23,10 @@ public class PrivateWwwAuthServletContext extends CmsServletContext {
                // response.setHeader(HttpUtils.HEADER_WWW_AUTHENTICATE, "basic
                // realm=\"" + httpAuthRealm + "\"");
                if (SpnegoLoginModule.hasAcceptorCredentials() && !forceBasic)// SPNEGO
-                       response.setHeader(HttpUtils.HEADER_WWW_AUTHENTICATE, "Negotiate");
+                       response.setHeader(HttpHeader.WWW_AUTHENTICATE.getName(), HttpHeader.NEGOTIATE);
                else
-                       response.setHeader(HttpUtils.HEADER_WWW_AUTHENTICATE, "Basic realm=\"" + httpAuthRealm + "\"");
+                       response.setHeader(HttpHeader.WWW_AUTHENTICATE.getName(),
+                                       HttpHeader.BASIC + " " + HttpHeader.REALM + "=\"" + httpAuthRealm + "\"");
 
                // response.setDateHeader("Date", System.currentTimeMillis());
                // response.setDateHeader("Expires", System.currentTimeMillis() + (24 *
index 70f2cc6b0390052693baff68f98641661b368f15..f0e11f8b9d27c7464dc534397dbb53da45d2457e 100644 (file)
@@ -8,8 +8,8 @@ import javax.servlet.http.HttpServletResponse;
 import org.argeo.api.cms.CmsLog;
 
 public class HttpUtils {
-       public final static String HEADER_AUTHORIZATION = "Authorization";
-       public final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate";
+//     public final static String HEADER_AUTHORIZATION = "Authorization";
+//     public final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate";
 
        static boolean isBrowser(String userAgent) {
                return userAgent.contains("webkit") || userAgent.contains("gecko") || userAgent.contains("firefox")
index 711edba2f013b925d088889b7489a9bab9616b75..6abaf71f262ac676d33efb5eff0968039c9378c1 100644 (file)
@@ -34,8 +34,8 @@ class CmsAuthUtils {
        // Standard
        final static String SHARED_STATE_NAME = AuthenticatingUser.SHARED_STATE_NAME;
        final static String SHARED_STATE_PWD = AuthenticatingUser.SHARED_STATE_PWD;
-       final static String HEADER_AUTHORIZATION = "Authorization";
-       final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate";
+//     final static String HEADER_AUTHORIZATION = "Authorization";
+//     final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate";
 
        // Argeo specific
        final static String SHARED_STATE_HTTP_REQUEST = "org.argeo.cms.auth.http.request";
index 8f05096906e12d613cd77343c120a0235d4765b2..d801b5e57978aed234b519c0a657e9d2861fd240 100644 (file)
@@ -19,6 +19,7 @@ import org.argeo.cms.CmsDeployProperty;
 import org.argeo.cms.internal.auth.CmsSessionImpl;
 import org.argeo.cms.internal.runtime.CmsContextImpl;
 import org.argeo.cms.internal.runtime.CmsStateImpl;
+import org.argeo.util.http.HttpHeader;
 import org.osgi.service.useradmin.Authorization;
 
 /** Use the HTTP session as the basis for authentication. */
@@ -32,8 +33,6 @@ public class RemoteSessionLoginModule implements LoginModule {
        private RemoteAuthRequest request = null;
        private RemoteAuthResponse response = null;
 
-//     private BundleContext bc;
-
        private Authorization authorization;
        private Locale locale;
 
@@ -41,8 +40,6 @@ public class RemoteSessionLoginModule implements LoginModule {
        @Override
        public void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState,
                        Map<String, ?> options) {
-//             bc = FrameworkUtil.getBundle(RemoteSessionLoginModule.class).getBundleContext();
-//             assert bc != null;
                this.subject = subject;
                this.callbackHandler = callbackHandler;
                this.sharedState = (Map<String, Object>) sharedState;
@@ -117,7 +114,7 @@ public class RemoteSessionLoginModule implements LoginModule {
        public boolean commit() throws LoginException {
                byte[] outToken = (byte[]) sharedState.get(CmsAuthUtils.SHARED_STATE_SPNEGO_OUT_TOKEN);
                if (outToken != null) {
-                       response.setHeader(CmsAuthUtils.HEADER_WWW_AUTHENTICATE,
+                       response.setHeader(HttpHeader.WWW_AUTHENTICATE.getName(),
                                        "Negotiate " + java.util.Base64.getEncoder().encodeToString(outToken));
                }
 
@@ -155,7 +152,7 @@ public class RemoteSessionLoginModule implements LoginModule {
        }
 
        private void extractHttpAuth(final RemoteAuthRequest httpRequest) {
-               String authHeader = httpRequest.getHeader(CmsAuthUtils.HEADER_AUTHORIZATION);
+               String authHeader = httpRequest.getHeader(HttpHeader.AUTHORIZATION.getName());
                extractHttpAuth(authHeader);
        }
 
@@ -164,7 +161,7 @@ public class RemoteSessionLoginModule implements LoginModule {
                        StringTokenizer st = new StringTokenizer(authHeader);
                        if (st.hasMoreTokens()) {
                                String basic = st.nextToken();
-                               if (basic.equalsIgnoreCase("Basic")) {
+                               if (basic.equalsIgnoreCase(HttpHeader.BASIC)) {
                                        try {
                                                // TODO manipulate char[]
                                                Base64.Decoder decoder = Base64.getDecoder();
@@ -182,7 +179,7 @@ public class RemoteSessionLoginModule implements LoginModule {
                                        } catch (Exception e) {
                                                throw new IllegalStateException("Couldn't retrieve authentication", e);
                                        }
-                               } else if (basic.equalsIgnoreCase("Negotiate")) {
+                               } else if (basic.equalsIgnoreCase(HttpHeader.NEGOTIATE)) {
                                        String spnegoToken = st.nextToken();
                                        Base64.Decoder decoder = Base64.getDecoder();
                                        byte[] authToken = decoder.decode(spnegoToken);
index 04312eca3d8abcb573c446f6be45eb434191a244..e15d074fe4a9435e626cf9f367dd3df2eed7ac0e 100644 (file)
@@ -9,14 +9,15 @@ import org.argeo.api.cms.CmsLog;
 import org.argeo.cms.auth.CurrentUser;
 import org.argeo.cms.auth.RemoteAuthCallbackHandler;
 import org.argeo.cms.auth.SpnegoLoginModule;
+import org.argeo.util.http.HttpHeader;
 
 import com.sun.net.httpserver.Authenticator;
 import com.sun.net.httpserver.HttpExchange;
 import com.sun.net.httpserver.HttpPrincipal;
 
 public class CmsAuthenticator extends Authenticator {
-       final static String HEADER_AUTHORIZATION = "Authorization";
-       final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate";
+//     final static String HEADER_AUTHORIZATION = "Authorization";
+//     final static String HEADER_WWW_AUTHENTICATE = "WWW-Authenticate";
 
        private final static CmsLog log = CmsLog.getLog(CmsAuthenticator.class);
 
@@ -96,9 +97,10 @@ public class CmsAuthenticator extends Authenticator {
                // response.setHeader(HttpUtils.HEADER_WWW_AUTHENTICATE, "basic
                // realm=\"" + httpAuthRealm + "\"");
                if (SpnegoLoginModule.hasAcceptorCredentials() && !forceBasic)// SPNEGO
-                       httpExchange.getResponseHeaders().set(HEADER_WWW_AUTHENTICATE, "Negotiate");
+                       httpExchange.getResponseHeaders().set(HttpHeader.WWW_AUTHENTICATE.getName(), HttpHeader.NEGOTIATE);
                else
-                       httpExchange.getResponseHeaders().set(HEADER_WWW_AUTHENTICATE, "Basic realm=\"" + httpAuthRealm + "\"");
+                       httpExchange.getResponseHeaders().set(HttpHeader.WWW_AUTHENTICATE.getName(),
+                                       HttpHeader.BASIC + " " + HttpHeader.REALM + "=\"" + httpAuthRealm + "\"");
 
                // response.setDateHeader("Date", System.currentTimeMillis());
                // response.setDateHeader("Expires", System.currentTimeMillis() + (24 *
index 4fa8648cf15ae55f41bb5ec3f31c3eca3bddc70b..f8a8fa1f0e60a9f3f159dc90cd90765c929c8488 100644 (file)
@@ -64,7 +64,7 @@ public class DavClient {
                                          <D:propname/>
                                        </D:propfind>""";
                        HttpRequest request = HttpRequest.newBuilder().uri(uri) //
-                                       .header(DavHeader.Depth.name(), "1") //
+                                       .header(DavHeader.DEPTH.name(), "1") //
                                        .method(DavMethod.PROPFIND.name(), BodyPublishers.ofString(body)) //
                                        .build();
 
@@ -83,7 +83,7 @@ public class DavClient {
        public boolean exists(URI uri) {
                try {
                        HttpRequest request = HttpRequest.newBuilder().uri(uri) //
-                                       .header(DavHeader.Depth.name(), "0") //
+                                       .header(DavHeader.DEPTH.name(), "0") //
                                        .method(DavMethod.HEAD.name(), BodyPublishers.noBody()) //
                                        .build();
                        BodyHandler<String> bodyHandler = BodyHandlers.ofString();
@@ -110,7 +110,7 @@ public class DavClient {
                                          <D:allprop/>
                                        </D:propfind>""";
                        HttpRequest request = HttpRequest.newBuilder().uri(uri) //
-                                       .header(DavHeader.Depth.name(), "0") //
+                                       .header(DavHeader.DEPTH.name(), "0") //
                                        .method(DavMethod.PROPFIND.name(), BodyPublishers.ofString(body)) //
                                        .build();
 
index e527ba7a89971f25f88dd356c6c514c4c7ba26b5..a1b034bf36991eee280ca6042432ceef17c3efb4 100644 (file)
@@ -1,5 +1,23 @@
 package org.argeo.util.dav;
 
+/** Standard HTTP headers. */
 public enum DavHeader {
-       Depth;
+       DEPTH("Depth"), //
+       ;
+
+       private final String name;
+
+       private DavHeader(String headerName) {
+               this.name = headerName;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       @Override
+       public String toString() {
+               return getName();
+       }
+
 }
diff --git a/org.argeo.util/src/org/argeo/util/http/HttpHeader.java b/org.argeo.util/src/org/argeo/util/http/HttpHeader.java
new file mode 100644 (file)
index 0000000..a6d4186
--- /dev/null
@@ -0,0 +1,28 @@
+package org.argeo.util.http;
+
+/** HTTP headers which are specific to WebDAV. */
+public enum HttpHeader {
+       AUTHORIZATION("Authorization"), //
+       WWW_AUTHENTICATE("WWW-Authenticate"), //
+       ;
+
+       public final static String BASIC = "Basic";
+       public final static String REALM = "realm";
+       public final static String NEGOTIATE = "Negotiate";
+
+       private final String name;
+
+       private HttpHeader(String headerName) {
+               this.name = headerName;
+       }
+
+       public String getName() {
+               return name;
+       }
+
+       @Override
+       public String toString() {
+               return getName();
+       }
+
+}