Author: markt
Date: Tue Nov 17 02:19:49 2009
New Revision: 881100

URL: http://svn.apache.org/viewvc?rev=881100&view=rev
Log:
Implement request.authenticate()
This required re-factoring the Authenticator interface to use 
HttpServletResponse. It would be nice to refactor to use HttpServletRequest as 
well but at the moment the authenticator requires too much access to the 
request internals.

Modified:
    tomcat/trunk/java/org/apache/catalina/Authenticator.java
    tomcat/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java
    tomcat/trunk/java/org/apache/catalina/authenticator/BasicAuthenticator.java
    tomcat/trunk/java/org/apache/catalina/authenticator/DigestAuthenticator.java
    tomcat/trunk/java/org/apache/catalina/authenticator/FormAuthenticator.java
    
tomcat/trunk/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java
    tomcat/trunk/java/org/apache/catalina/authenticator/SSLAuthenticator.java
    tomcat/trunk/java/org/apache/catalina/connector/Request.java

Modified: tomcat/trunk/java/org/apache/catalina/Authenticator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/Authenticator.java?rev=881100&r1=881099&r2=881100&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/Authenticator.java (original)
+++ tomcat/trunk/java/org/apache/catalina/Authenticator.java Tue Nov 17 
02:19:49 2009
@@ -21,6 +21,8 @@
 import java.io.IOException;
 import java.security.Principal;
 
+import javax.servlet.http.HttpServletResponse;
+
 import org.apache.catalina.connector.Request;
 import org.apache.catalina.connector.Response;
 import org.apache.catalina.deploy.LoginConfig;
@@ -43,13 +45,13 @@
      * created a response challenge already.
      *
      * @param request Request we are processing
-     * @param response Response we are creating
+     * @param response Response we are populating
      * @param config    Login configuration describing how authentication
      *              should be performed
      *
      * @exception IOException if an input/output error occurs
      */
-    public boolean authenticate(Request request, Response response,
+    public boolean authenticate(Request request, HttpServletResponse response,
             LoginConfig config) throws IOException;
     
     /**
@@ -60,13 +62,13 @@
      * SSO sessions.
      *
      * @param request The servlet request we are processing
-     * @param response The servlet response we are generating
+     * @param response The servlet response we are populating
      * @param principal The authenticated Principal to be registered
      * @param authType The authentication type to be registered
      * @param username Username used to authenticate (if any)
      * @param password Password used to authenticate (if any)
      */
-    public void register(Request request, Response response,
+    public void register(Request request, HttpServletResponse response,
             Principal principal, String authType,
             String username, String password);
 }

Modified: 
tomcat/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java?rev=881100&r1=881099&r2=881100&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/authenticator/AuthenticatorBase.java 
Tue Nov 17 02:19:49 2009
@@ -30,6 +30,7 @@
 
 import javax.servlet.ServletException;
 import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
 
 import org.apache.catalina.Authenticator;
 import org.apache.catalina.Container;
@@ -101,6 +102,10 @@
      */
     protected static final int SESSION_ID_BYTES = 16;
 
+    /**
+     * Authentication header
+     */
+    protected static final String AUTH_HEADER_NAME = "WWW-Authenticate";
 
     /**
      * The message digest algorithm to be used when generating session
@@ -564,14 +569,14 @@
      * created a response challenge already.
      *
      * @param request Request we are processing
-     * @param response Response we are creating
+     * @param response Response we are populating
      * @param config    Login configuration describing how authentication
      *              should be performed
      *
      * @exception IOException if an input/output error occurs
      */
     public abstract boolean authenticate(Request request,
-                                            Response response,
+                                            HttpServletResponse response,
                                             LoginConfig config)
         throws IOException;
 
@@ -708,7 +713,7 @@
      * @param username Username used to authenticate (if any)
      * @param password Password used to authenticate (if any)
      */
-    public void register(Request request, Response response,
+    public void register(Request request, HttpServletResponse response,
                             Principal principal, String authType,
                             String username, String password) {
 

Modified: 
tomcat/trunk/java/org/apache/catalina/authenticator/BasicAuthenticator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/BasicAuthenticator.java?rev=881100&r1=881099&r2=881100&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/authenticator/BasicAuthenticator.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/authenticator/BasicAuthenticator.java 
Tue Nov 17 02:19:49 2009
@@ -25,7 +25,6 @@
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.catalina.connector.Request;
-import org.apache.catalina.connector.Response;
 import org.apache.catalina.deploy.LoginConfig;
 import org.apache.catalina.util.Base64;
 import org.apache.juli.logging.Log;
@@ -49,31 +48,6 @@
     extends AuthenticatorBase {
     private static final Log log = LogFactory.getLog(BasicAuthenticator.class);
 
-
-
-    /**
-     * Authenticate bytes.
-     */
-    public static final byte[] AUTHENTICATE_BYTES = {
-        (byte) 'W',
-        (byte) 'W',
-        (byte) 'W',
-        (byte) '-',
-        (byte) 'A',
-        (byte) 'u',
-        (byte) 't',
-        (byte) 'h',
-        (byte) 'e',
-        (byte) 'n',
-        (byte) 't',
-        (byte) 'i',
-        (byte) 'c',
-        (byte) 'a',
-        (byte) 't',
-        (byte) 'e'
-    };
-
-
    // ----------------------------------------------------- Instance Variables
 
 
@@ -116,7 +90,7 @@
      */
     @Override
     public boolean authenticate(Request request,
-                                Response response,
+                                HttpServletResponse response,
                                 LoginConfig config)
         throws IOException {
 
@@ -188,24 +162,18 @@
             }
         }
         
-
-        // Send an "unauthorized" response and an appropriate challenge
-        MessageBytes authenticate = 
-            response.getCoyoteResponse().getMimeHeaders()
-            .addValue(AUTHENTICATE_BYTES, 0, AUTHENTICATE_BYTES.length);
-        CharChunk authenticateCC = authenticate.getCharChunk();
-        authenticateCC.append("Basic realm=\"");
+        StringBuilder value = new StringBuilder(16);
+        value.append("Basic realm=\"");
         if (config.getRealmName() == null) {
-            authenticateCC.append(request.getServerName());
-            authenticateCC.append(':');
-            authenticateCC.append(Integer.toString(request.getServerPort()));
+            value.append(request.getServerName());
+            value.append(':');
+            value.append(Integer.toString(request.getServerPort()));
         } else {
-            authenticateCC.append(config.getRealmName());
+            value.append(config.getRealmName());
         }
-        authenticateCC.append('\"');        
-        authenticate.toChars();
+        value.append('\"');        
+        response.setHeader(AUTH_HEADER_NAME, value.toString());
         response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
-        //response.flushBuffer();
         return (false);
 
     }

Modified: 
tomcat/trunk/java/org/apache/catalina/authenticator/DigestAuthenticator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/DigestAuthenticator.java?rev=881100&r1=881099&r2=881100&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/catalina/authenticator/DigestAuthenticator.java 
(original)
+++ 
tomcat/trunk/java/org/apache/catalina/authenticator/DigestAuthenticator.java 
Tue Nov 17 02:19:49 2009
@@ -25,12 +25,12 @@
 import java.security.Principal;
 import java.util.StringTokenizer;
 
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 
 import org.apache.catalina.Realm;
 import org.apache.catalina.connector.Request;
-import org.apache.catalina.connector.Response;
 import org.apache.catalina.deploy.LoginConfig;
 import org.apache.catalina.util.MD5Encoder;
 import org.apache.juli.logging.Log;
@@ -129,7 +129,7 @@
      */
     @Override
     public boolean authenticate(Request request,
-                                Response response,
+                                HttpServletResponse response,
                                 LoginConfig config)
         throws IOException {
 
@@ -400,8 +400,8 @@
      *              should be performed
      * @param nOnce nonce token
      */
-    protected void setAuthenticateHeader(Request request,
-                                         Response response,
+    protected void setAuthenticateHeader(HttpServletRequest request,
+                                         HttpServletResponse response,
                                          LoginConfig config,
                                          String nOnce) {
 
@@ -419,7 +419,7 @@
         String authenticateHeader = "Digest realm=\"" + realmName + "\", "
             +  "qop=\"auth\", nonce=\"" + nOnce + "\", " + "opaque=\""
             + md5Encoder.encode(buffer) + "\"";
-        response.setHeader("WWW-Authenticate", authenticateHeader);
+        response.setHeader(AUTH_HEADER_NAME, authenticateHeader);
 
     }
 

Modified: 
tomcat/trunk/java/org/apache/catalina/authenticator/FormAuthenticator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/FormAuthenticator.java?rev=881100&r1=881099&r2=881100&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/authenticator/FormAuthenticator.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/authenticator/FormAuthenticator.java 
Tue Nov 17 02:19:49 2009
@@ -123,7 +123,7 @@
      */
     @Override
     public boolean authenticate(Request request,
-                                Response response,
+                                HttpServletResponse response,
                                 LoginConfig config)
         throws IOException {
 
@@ -305,17 +305,17 @@
      * Called to forward to the login page
      * 
      * @param request Request we are processing
-     * @param response Response we are creating
+     * @param response Response we are populating
      * @param config    Login configuration describing how authentication
      *              should be performed
      */
-    protected void forwardToLoginPage(Request request, Response response, 
LoginConfig config) {
+    protected void forwardToLoginPage(Request request,
+            HttpServletResponse response, LoginConfig config) {
         RequestDispatcher disp =
             context.getServletContext().getRequestDispatcher
             (config.getLoginPage());
         try {
-            disp.forward(request.getRequest(), response.getResponse());
-            response.finishResponse();
+            disp.forward(request.getRequest(), response);
         } catch (Throwable t) {
             log.warn("Unexpected error forwarding to login page", t);
         }
@@ -326,16 +326,17 @@
      * Called to forward to the error page
      * 
      * @param request Request we are processing
-     * @param response Response we are creating
+     * @param response Response we are populating
      * @param config    Login configuration describing how authentication
      *              should be performed
      */
-    protected void forwardToErrorPage(Request request, Response response, 
LoginConfig config) {
+    protected void forwardToErrorPage(Request request,
+            HttpServletResponse response, LoginConfig config) {
         RequestDispatcher disp =
             context.getServletContext().getRequestDispatcher
             (config.getErrorPage());
         try {
-            disp.forward(request.getRequest(), response.getResponse());
+            disp.forward(request.getRequest(), response);
         } catch (Throwable t) {
             log.warn("Unexpected error forwarding to error page", t);
         }

Modified: 
tomcat/trunk/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java?rev=881100&r1=881099&r2=881100&view=diff
==============================================================================
--- 
tomcat/trunk/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java 
(original)
+++ 
tomcat/trunk/java/org/apache/catalina/authenticator/NonLoginAuthenticator.java 
Tue Nov 17 02:19:49 2009
@@ -21,8 +21,9 @@
 
 import java.io.IOException;
 
+import javax.servlet.http.HttpServletResponse;
+
 import org.apache.catalina.connector.Request;
-import org.apache.catalina.connector.Response;
 import org.apache.catalina.deploy.LoginConfig;
 
 
@@ -73,7 +74,7 @@
      * created a response challenge already.
      *
      * @param request Request we are processing
-     * @param response Response we are creating
+     * @param response Response we are populating
      * @param config    Login configuration describing how authentication
      *              should be performed
      *
@@ -81,7 +82,7 @@
      */
     @Override
     public boolean authenticate(Request request,
-                                Response response,
+                                HttpServletResponse response,
                                 LoginConfig config)
         throws IOException {
 

Modified: 
tomcat/trunk/java/org/apache/catalina/authenticator/SSLAuthenticator.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/authenticator/SSLAuthenticator.java?rev=881100&r1=881099&r2=881100&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/authenticator/SSLAuthenticator.java 
(original)
+++ tomcat/trunk/java/org/apache/catalina/authenticator/SSLAuthenticator.java 
Tue Nov 17 02:19:49 2009
@@ -29,7 +29,6 @@
 import org.apache.catalina.Globals;
 import org.apache.catalina.LifecycleException;
 import org.apache.catalina.connector.Request;
-import org.apache.catalina.connector.Response;
 import org.apache.catalina.deploy.LoginConfig;
 
 
@@ -84,7 +83,7 @@
      */
     @Override
     public boolean authenticate(Request request,
-                                Response response,
+                                HttpServletResponse response,
                                 LoginConfig config)
         throws IOException {
 

Modified: tomcat/trunk/java/org/apache/catalina/connector/Request.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/connector/Request.java?rev=881100&r1=881099&r2=881100&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/connector/Request.java (original)
+++ tomcat/trunk/java/org/apache/catalina/connector/Request.java Tue Nov 17 
02:19:49 2009
@@ -54,7 +54,6 @@
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.Part;
 
-import org.apache.catalina.Authenticator;
 import org.apache.catalina.Context;
 import org.apache.catalina.Globals;
 import org.apache.catalina.Host;
@@ -2322,8 +2321,13 @@
                     sm.getString("coyoteRequest.authenticate.ise"));
         }
 
-        // TODO SERVLET3
-        return false;
+        LoginConfig config = context.getLoginConfig();
+        
+        if (config == null) {
+            throw new ServletException(
+                    sm.getString("coyoteRequest.noLoginConfig"));
+        }
+        return context.getAuthenticator().authenticate(this, response, config);
     }
     
     /**
@@ -2341,12 +2345,13 @@
                     sm.getString("coyoteRequest.alreadyAuthenticated"));
         }
         
-        if (context.getLoginConfig() == null) {
+        LoginConfig config = context.getLoginConfig();
+        if (config == null) {
             throw new ServletException(
                     sm.getString("coyoteRequest.noLoginConfig"));
         }
         
-        String authMethod = context.getLoginConfig().getAuthMethod();
+        String authMethod = config.getAuthMethod();
         if (BASIC_AUTH.equals(authMethod) || FORM_AUTH.equals(authMethod) ||
                 DIGEST_AUTH.equals(authMethod)) {
             // Methods support user name and password authentication



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to