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>