You are viewing a plain text version of this content. The canonical link for it is here.
Posted to slide-dev@jakarta.apache.org by di...@apache.org on 2002/02/09 17:20:21 UTC

cvs commit: jakarta-slide/src/webdav/client/src/org/apache/commons/httpclient Authenticator.java HttpClient.java

dirkv       02/02/09 08:20:21

  Modified:    src/webdav/client/src/org/apache/commons/httpclient
                        Authenticator.java HttpClient.java
  Log:
  Start implementation of client support for digest authentication
  (Robert Owen)
  
  Revision  Changes    Path
  1.2       +93 -9     jakarta-slide/src/webdav/client/src/org/apache/commons/httpclient/Authenticator.java
  
  Index: Authenticator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/webdav/client/src/org/apache/commons/httpclient/Authenticator.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- Authenticator.java	10 Aug 2001 20:39:50 -0000	1.1
  +++ Authenticator.java	9 Feb 2002 16:20:21 -0000	1.2
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/webdav/client/src/org/apache/commons/httpclient/Authenticator.java,v 1.1 2001/08/10 20:39:50 remm Exp $
  - * $Revision: 1.1 $
  - * $Date: 2001/08/10 20:39:50 $
  + * $Header: /home/cvs/jakarta-slide/src/webdav/client/src/org/apache/commons/httpclient/Authenticator.java,v 1.2 2002/02/09 16:20:21 dirkv Exp $
  + * $Revision: 1.2 $
  + * $Date: 2002/02/09 16:20:21 $
    *
    * ====================================================================
    *
  @@ -90,7 +90,7 @@
        * @param credentials Credentials to use to answser the challenge
        * @return String response to the challenge
        */
  -    public static String challengeResponse(State state,
  +    public static String challengeResponse(HttpMethod method, State state,
                                              Credentials credentials)
           throws HttpException {
   
  @@ -110,7 +110,7 @@
           if (challengeName.equalsIgnoreCase("basic")) {
               return basic(state, credentials);
           } else if (challengeName.equalsIgnoreCase("digest")) {
  -            return digest(state, credentials);
  +            return digest(method, state, credentials);
           } else {
   
           }
  @@ -134,15 +134,99 @@
   
   
       /**
  -     * Generate a basic response.
  +     * Generate a digest response.
        *
        * @param credentials Credentials to use to answser the challenge
        */
  -    public static String digest(State state, Credentials credentials) {
  +    public static String digest(HttpMethod method, State state, Credentials credentials) {
  +		// FIXME / TODO
  +		// 1. Only supports md5 algorithm.
  +		// 2. Fixed client nonce and nonce count values.
  +		// 3. Assumes credentials passed to Authenticator are values
  +		//    to be used for requested realm.
  + 
  +        int p1, p2;
  +        String realm      = "";
  +        String nonce      = "";
  +        String CNonce     = "0a4f113b";
  +        String algorithm  = "";
  +        String nonceCount = "00000001";
  +        String qop        = "";
  +        String domain     = "";
  +        String opaque     = "";
  +
  +        String user       = credentials.getUserName();
  +        String pw         = credentials.getPassword();
  +        String methodName = method.getName();
  +        String uri        = method.getPath();
   
  -        return null;
  +        String challenge = state.getAuthenticateToken();
  +        if (challenge == null) return null;
   
  -    }
  +        java.security.MessageDigest md5;
  +        try {
  +            md5 = java.security.MessageDigest.getInstance("MD5");
  +        } catch (java.security.NoSuchAlgorithmException nsa) {
  +            return null;
  +        }
  +
  +        // Assumes that none of the field values has a comma
  +        java.util.StringTokenizer st = new java.util.StringTokenizer( challenge.substring("digest ".length()), "," );
  +        String aField, aFieldName, aFieldValue;
  +        int equals;
  +        while (st.hasMoreTokens())
  +        {
  +            aField = st.nextToken();
  +            equals = aField.indexOf('=');
  +            if (equals < 0) continue;
  +
  +            aFieldName = aField.substring(0,equals).trim();
  +            aFieldValue = aField.substring(equals+1);
  +            if (aFieldValue.indexOf('"') >= 0)
  +            {
  +                aFieldValue = aFieldValue.replace('"', ' ');
  +                aFieldValue = aFieldValue.trim();
  +            }
  +
  +            if (aFieldName.equalsIgnoreCase("realm"))          realm     = aFieldValue;
  +            else if (aFieldName.equalsIgnoreCase("domain"))    domain    = aFieldValue;
  +            else if (aFieldName.equalsIgnoreCase("nonce"))     nonce     = aFieldValue;
  +            else if (aFieldName.equalsIgnoreCase("algorithm")) algorithm = aFieldValue;
  +            else if (aFieldName.equalsIgnoreCase("qop"))       qop       = aFieldValue;
  +            else if (aFieldName.equalsIgnoreCase("opaque"))    opaque    = aFieldValue;
  +        }
  +        if (!algorithm.equalsIgnoreCase("md5")) return null;
   
  +        MD5Encoder md5enc = new MD5Encoder();
  +        String A1 = user+":"+realm+":"+pw;
  +        byte[] HA1 = md5.digest(A1.getBytes());
  +        String HA1HEX = md5enc.encode(HA1);
  +
  +        String A2 = methodName+":"+uri;
  +        byte[] HA2 = md5.digest(A2.getBytes());
  +        String HA2HEX = md5enc.encode(HA2);
  +
  +        String request_digest_String = HA1HEX+":"+nonce+":"+nonceCount+":"+CNonce+":"+qop+":"+HA2HEX;
  +        byte[] request_digest_bytes = md5.digest(request_digest_String.getBytes());
  +        String request_digest = md5enc.encode(request_digest_bytes);
  +
  +        StringBuffer retStr = new StringBuffer("Digest username=\""+user+"\",realm=\""+realm+
  +                        "\",nonce=\""+nonce+"\",uri=\""+uri+"\"");
  +        if (!qop.equals(""))
  +        {
  +            retStr.append(",qop=");
  +            retStr.append(qop);
  +            retStr.append(",nc=\"");
  +            retStr.append(nonceCount);
  +            retStr.append("\",cnonce=\"");
  +            retStr.append(CNonce);
  +            retStr.append("\"");
  +        }
  +        retStr.append(",response=\"");
  +        retStr.append(request_digest);
  +        retStr.append("\"");
  +        if (!opaque.equals(""))retStr.append(",opaque=\""+opaque+"\"");
  +        return retStr.toString();
  +    }
   
   }
  
  
  
  1.9       +4 -4      jakarta-slide/src/webdav/client/src/org/apache/commons/httpclient/HttpClient.java
  
  Index: HttpClient.java
  ===================================================================
  RCS file: /home/cvs/jakarta-slide/src/webdav/client/src/org/apache/commons/httpclient/HttpClient.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- HttpClient.java	6 Feb 2002 17:01:32 -0000	1.8
  +++ HttpClient.java	9 Feb 2002 16:20:21 -0000	1.9
  @@ -1,7 +1,7 @@
   /*
  - * $Header: /home/cvs/jakarta-slide/src/webdav/client/src/org/apache/commons/httpclient/HttpClient.java,v 1.8 2002/02/06 17:01:32 juergen Exp $
  - * $Revision: 1.8 $
  - * $Date: 2002/02/06 17:01:32 $
  + * $Header: /home/cvs/jakarta-slide/src/webdav/client/src/org/apache/commons/httpclient/HttpClient.java,v 1.9 2002/02/09 16:20:21 dirkv Exp $
  + * $Revision: 1.9 $
  + * $Date: 2002/02/09 16:20:21 $
    *
    * ====================================================================
    *
  @@ -969,7 +969,7 @@
           if (state.getAuthenticateToken() != null) {
   
               String challengeResponse = Authenticator.challengeResponse
  -                (state, credentials);
  +                (method, state, credentials);
               if (challengeResponse != null) {
                   if (debug > 1)
                       System.out.print("Authorization: "
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>