OLD | NEW |
---|---|
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/http/http_auth_handler_digest.h" | 5 #include "net/http/http_auth_handler_digest.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/md5.h" | 10 #include "base/md5.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
107 HttpAuth::AuthorizationResult HttpAuthHandlerDigest::HandleAnotherChallenge( | 107 HttpAuth::AuthorizationResult HttpAuthHandlerDigest::HandleAnotherChallenge( |
108 HttpAuth::ChallengeTokenizer* challenge) { | 108 HttpAuth::ChallengeTokenizer* challenge) { |
109 // Even though Digest is not connection based, a "second round" is parsed | 109 // Even though Digest is not connection based, a "second round" is parsed |
110 // to differentiate between stale and rejected responses. | 110 // to differentiate between stale and rejected responses. |
111 // Note that the state of the current handler is not mutated - this way if | 111 // Note that the state of the current handler is not mutated - this way if |
112 // there is a rejection the realm hasn't changed. | 112 // there is a rejection the realm hasn't changed. |
113 if (!LowerCaseEqualsASCII(challenge->scheme(), "digest")) | 113 if (!LowerCaseEqualsASCII(challenge->scheme(), "digest")) |
114 return HttpAuth::AUTHORIZATION_RESULT_INVALID; | 114 return HttpAuth::AUTHORIZATION_RESULT_INVALID; |
115 | 115 |
116 HttpUtil::NameValuePairsIterator parameters = challenge->param_pairs(); | 116 HttpUtil::NameValuePairsIterator parameters = challenge->param_pairs(); |
117 std::string realm; | |
117 | 118 |
118 // Try to find the "stale" value. | 119 // Try to find the "stale" value, and also keep track of the realm |
120 // for the new challenge. | |
119 while (parameters.GetNext()) { | 121 while (parameters.GetNext()) { |
120 if (!LowerCaseEqualsASCII(parameters.name(), "stale")) | 122 if (LowerCaseEqualsASCII(parameters.name(), "stale")) { |
121 continue; | 123 if (LowerCaseEqualsASCII(parameters.value(), "true")) |
122 if (LowerCaseEqualsASCII(parameters.value(), "true")) | 124 return HttpAuth::AUTHORIZATION_RESULT_STALE; |
wtc
2011/02/22 23:17:32
IMPORTANT: what if the new challenge has both stal
cbentzel
2011/02/23 14:49:54
It could happen, but it seems unexpected. It seems
asanka
2011/02/23 18:06:40
RFC 2617 states that the 'stale' value should only
| |
123 return HttpAuth::AUTHORIZATION_RESULT_STALE; | 125 } else if (LowerCaseEqualsASCII(parameters.name(), "realm")) { |
126 realm = parameters.value(); | |
127 } | |
124 } | 128 } |
125 | 129 return (realm_ != realm) ? |
126 return HttpAuth::AUTHORIZATION_RESULT_REJECT; | 130 HttpAuth::AUTHORIZATION_RESULT_DIFFERENT_REALM : |
131 HttpAuth::AUTHORIZATION_RESULT_REJECT; | |
127 } | 132 } |
128 | 133 |
129 bool HttpAuthHandlerDigest::Init(HttpAuth::ChallengeTokenizer* challenge) { | 134 bool HttpAuthHandlerDigest::Init(HttpAuth::ChallengeTokenizer* challenge) { |
130 return ParseChallenge(challenge); | 135 return ParseChallenge(challenge); |
131 } | 136 } |
132 | 137 |
133 int HttpAuthHandlerDigest::GenerateAuthTokenImpl( | 138 int HttpAuthHandlerDigest::GenerateAuthTokenImpl( |
134 const string16* username, | 139 const string16* username, |
135 const string16* password, | 140 const string16* password, |
136 const HttpRequestInfo* request, | 141 const HttpRequestInfo* request, |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
366 // TODO(eroman): Supposedly IIS server requires quotes surrounding qop. | 371 // TODO(eroman): Supposedly IIS server requires quotes surrounding qop. |
367 authorization += ", qop=" + QopToString(qop_); | 372 authorization += ", qop=" + QopToString(qop_); |
368 authorization += ", nc=" + nc; | 373 authorization += ", nc=" + nc; |
369 authorization += ", cnonce=" + HttpUtil::Quote(cnonce); | 374 authorization += ", cnonce=" + HttpUtil::Quote(cnonce); |
370 } | 375 } |
371 | 376 |
372 return authorization; | 377 return authorization; |
373 } | 378 } |
374 | 379 |
375 } // namespace net | 380 } // namespace net |
OLD | NEW |