Changeset 1532
- Timestamp:
- 2010-05-11 11:42:49 (3 years ago)
- Location:
- trunk/modules/kauri-security
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/modules/kauri-security/kauri-security-auth-methods/src/main/java/org/kauriproject/security/providers/DigestAuthenticationMethod.java
r1525 r1532 30 30 import org.restlet.data.ChallengeResponse; 31 31 import org.restlet.data.ChallengeScheme; 32 import org.restlet.data.Parameter;33 32 import org.restlet.data.Status; 34 33 import org.restlet.ext.crypto.internal.CryptoUtils; 35 import org.restlet.util.Series;36 34 import org.springframework.security.Authentication; 37 35 import org.springframework.security.AuthenticationException; … … 83 81 if (!cr.getScheme().equals(ChallengeScheme.HTTP_DIGEST)) return null; 84 82 85 final Series<Parameter> credentials = cr.getParameters(); 86 final String username = credentials.getFirstValue("username"); 87 final String crealm = credentials.getFirstValue("realm"); 88 final String nonce = credentials.getFirstValue("nonce"); 89 final String uri = credentials.getFirstValue("uri"); 90 final String cresponse = credentials.getFirstValue("response"); 91 final String qop = credentials.getFirstValue("qop"); 92 final String nc = credentials.getFirstValue("nc"); 93 final String cnonce = credentials.getFirstValue("cnonce"); 94 83 final String username = cr.getIdentifier(); 84 final String crealm = cr.getRealm(); 85 final String nonce = cr.getServerNonce(); 86 final String uri = cr.getDigestRef().toString(); 87 final String cresponse = new String(cr.getSecret()); 88 final String qop = cr.getQuality(); 89 final String nc = cr.getServerNounceCountAsHex(); 90 final String cnonce = cr.getClientNonce(); 91 95 92 // if (!isNonceValid(nonce)) { 96 93 // throw new MalformedAuthenticationRequestException("The supplied nonce is invalid"); … … 98 95 99 96 // Check all required parameters were supplied (ie RFC 2069) 100 if ((username == null) || (realm == null) || (nonce == null) || (uri == null) || ( response == null)) {97 if ((username == null) || (realm == null) || (nonce == null) || (uri == null) || (cresponse == null)) { 101 98 throw new MalformedAuthenticationRequestException("Missing parameter in Authenticate header"); 102 99 } … … 236 233 // there is only one challenge scheme, that of the Guard. 237 234 ChallengeRequest challengeRequest = new ChallengeRequest(ChallengeScheme.HTTP_DIGEST, realm.getName()); 235 236 challengeRequest.setServerNonce(CryptoUtils.makeNonce(getServerKey())); 237 238 // indicate stale nonce was found in challenge response 239 challengeRequest.setStale(response.getAttributes().containsKey("stale")); 238 240 239 241 response.setStatus(Status.CLIENT_ERROR_UNAUTHORIZED); 240 242 response.setChallengeRequest(challengeRequest); 241 242 final Series<Parameter> parameters = challengeRequest243 .getParameters();244 245 //TODO: domain?246 parameters.add("domain", domain);247 248 parameters.add("nonce", CryptoUtils.makeNonce(getServerKey()));249 250 if (response.getAttributes().containsKey("stale")) {251 // indicate stale nonce was found in challenge response252 parameters.add("stale", "true");253 }254 255 243 } 256 244 -
trunk/modules/kauri-security/kauri-security-impl/src/test/java/org/kauriproject/security/test/SecurityTest.java
r1525 r1532 114 114 115 115 //DIGEST authentication 116 /*117 116 doTestUnauthenticated(externalPrefix, "/test", externalSuffix, 200); 118 117 doTestUnauthenticated(externalPrefix, "/digest/user", externalSuffix, 401); … … 126 125 doTestDigest(externalPrefix, "/digest/user", externalSuffix, ADMIN, ADMINPW, 403); 127 126 doTestDigest(externalPrefix, "/digest/admin", externalSuffix, ADMIN, ADMINPW, 200); 128 */129 127 130 128 //FORM-based authentication … … 164 162 // basic auth does not suffice for strength 2, we should get a new challenge 165 163 doTestBasic(externalPrefix, "/strengths/strength2", externalSuffix, USER, USERPW, 401); 166 //doTestDigest(externalPrefix, "/strengths/strength2", externalSuffix, USER, USERPW, 200);164 doTestDigest(externalPrefix, "/strengths/strength2", externalSuffix, USER, USERPW, 200); 167 165 // there's no method with strength 3 168 166 doTestBasic(externalPrefix, "/strengths/strength3", externalSuffix, USER, USERPW, 500); … … 198 196 199 197 //DIGEST authentication 200 /*201 198 doTestDigest(internalPrefix, "/test", internalSuffix, USER, USERPW, 200); 202 199 doTestDigest(internalPrefix, "/digest/user", internalSuffix, USER, USERPW, 200); … … 206 203 doTestDigest(internalPrefix, "/digest/user", internalSuffix, ADMIN, ADMINPW, 403); 207 204 doTestDigest(internalPrefix, "/digest/admin", internalSuffix, ADMIN, ADMINPW, 200); 208 */209 205 210 206 } … … 278 274 // first request: 279 275 Request request = createRequest(path); 280 Reference ref = request.getResourceRef();281 276 Response response = cd.handle(request); 282 277 … … 291 286 } 292 287 293 ChallengeRequest challengeRequest = response.getChallengeRequests().get(0);294 295 288 // second request: 296 request = new Request(Method.GET, path); 297 298 ChallengeResponse challengeResponse = new ChallengeResponse(ChallengeScheme.HTTP_DIGEST, user, password); 299 Series<Parameter> cReqParams = challengeRequest.getParameters(); 300 Form form = new Form(); 301 form.add("username", user); 302 form.add("uri", ref.getPath()); 303 304 // Retrieve values sent by the server 305 form.add(cReqParams.getFirst("nonce")); 306 form.add(cReqParams.getFirst("realm")); 307 form.add(cReqParams.getFirst("domain")); 308 form.add(cReqParams.getFirst("algorithm")); 309 form.add(cReqParams.getFirst("qop")); 310 form.add("cnonce", Long.toHexString((long)(Math.random()*10000))); 311 form.add("nc", "1"); 312 313 String a1 = DigestUtils.toMd5(form.getFirstValue("username") + ":" + form.getFirstValue("realm") + ":" + password); 314 String a2 = DigestUtils.toMd5(request.getMethod() + ":" + form.getFirstValue("uri")); 315 316 form.add("response", DigestUtils.toMd5(a1 + ":" + form.getFirstValue("nonce") + ":" + form.getFirstValue("nc") + ":" + form.getFirstValue("cnonce") + ":" + form.getFirstValue("qop") + ":" + a2)); 317 318 //challengeResponse.setCredentialComponents(form); 319 challengeResponse.setParameters(form); 289 290 // Complete the challengeResponse object according to the server's data 291 // 1- Loop over the challengeRequest objects sent by the server. 292 ChallengeRequest c1 = null; 293 for (ChallengeRequest challengeRequest : response.getChallengeRequests()) { 294 if (ChallengeScheme.HTTP_DIGEST.equals(challengeRequest.getScheme())) { 295 c1 = challengeRequest; 296 break; 297 } 298 } 299 300 // 2- Create the Challenge response used by the client to authenticate 301 // its requests. 302 ChallengeResponse challengeResponse = new ChallengeResponse(c1, response, user, password); 303 //resource.setChallengeResponse(challengeResponse); 320 304 request.setChallengeResponse(challengeResponse); 321 305
Note: See TracChangeset
for help on using the changeset viewer.