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 #ifndef NET_HTTP_HTTP_AUTH_HANDLER_DIGEST_H_ | 5 #ifndef NET_HTTP_HTTP_AUTH_HANDLER_DIGEST_H_ |
6 #define NET_HTTP_HTTP_AUTH_HANDLER_DIGEST_H_ | 6 #define NET_HTTP_HTTP_AUTH_HANDLER_DIGEST_H_ |
7 #pragma once | 7 #pragma once |
8 | 8 |
9 #include <string> | 9 #include <string> |
10 | 10 |
11 #include "base/basictypes.h" | |
11 #include "base/gtest_prod_util.h" | 12 #include "base/gtest_prod_util.h" |
13 #include "base/scoped_ptr.h" | |
12 #include "base/string16.h" | 14 #include "base/string16.h" |
13 #include "net/http/http_auth_handler.h" | 15 #include "net/http/http_auth_handler.h" |
14 #include "net/http/http_auth_handler_factory.h" | 16 #include "net/http/http_auth_handler_factory.h" |
15 | 17 |
16 namespace net { | 18 namespace net { |
17 | 19 |
18 // Code for handling http digest authentication. | 20 // Code for handling http digest authentication. |
19 class HttpAuthHandlerDigest : public HttpAuthHandler { | 21 class HttpAuthHandlerDigest : public HttpAuthHandler { |
20 public: | 22 public: |
23 // A NonceGenerator is a simple interface for generating client nonces. | |
24 // Unit tests can override the default client nonce behavior with fixed | |
25 // nonce generation to get reproducible results. | |
26 class NonceGenerator { | |
27 public: | |
28 NonceGenerator(); | |
29 virtual ~NonceGenerator(); | |
30 | |
31 // Generates a client nonce. | |
32 virtual std::string GenerateNonce() const = 0; | |
33 private: | |
34 DISALLOW_COPY_AND_ASSIGN(NonceGenerator); | |
35 }; | |
36 | |
37 // DynamicNonceGenerator does a random shuffle of 16 | |
38 // characters to generate a client nonce. | |
39 class DynamicNonceGenerator : public NonceGenerator { | |
40 public: | |
41 DynamicNonceGenerator(); | |
42 virtual std::string GenerateNonce() const; | |
43 private: | |
44 DISALLOW_COPY_AND_ASSIGN(DynamicNonceGenerator); | |
45 }; | |
46 | |
47 // FixedNonceGenerator always uses the same string specified at | |
48 // construction time as the client nonce. | |
49 class FixedNonceGenerator : public NonceGenerator { | |
50 public: | |
51 explicit FixedNonceGenerator(const std::string& nonce); | |
52 | |
53 virtual std::string GenerateNonce() const; | |
54 | |
55 private: | |
56 const std::string nonce_; | |
57 DISALLOW_COPY_AND_ASSIGN(FixedNonceGenerator); | |
58 }; | |
59 | |
21 class Factory : public HttpAuthHandlerFactory { | 60 class Factory : public HttpAuthHandlerFactory { |
22 public: | 61 public: |
23 Factory(); | 62 Factory(); |
24 virtual ~Factory(); | 63 virtual ~Factory(); |
25 | 64 |
26 virtual int CreateAuthHandler(HttpAuth::ChallengeTokenizer* challenge, | 65 virtual int CreateAuthHandler(HttpAuth::ChallengeTokenizer* challenge, |
27 HttpAuth::Target target, | 66 HttpAuth::Target target, |
28 const GURL& origin, | 67 const GURL& origin, |
29 CreateReason reason, | 68 CreateReason reason, |
30 int digest_nonce_count, | 69 int digest_nonce_count, |
31 const BoundNetLog& net_log, | 70 const BoundNetLog& net_log, |
32 scoped_ptr<HttpAuthHandler>* handler); | 71 scoped_ptr<HttpAuthHandler>* handler); |
72 | |
73 // This factory owns the passed in |nonce_generator|. | |
74 void set_nonce_generator(const NonceGenerator* nonce_generator); | |
75 | |
76 private: | |
77 scoped_ptr<const NonceGenerator> nonce_generator_; | |
wtc
2010/11/17 20:21:51
I know the C++ language allows deleting a const po
cbentzel
2010/11/18 12:06:38
I tend to veer towards const-heaviness.
Flame war
| |
33 }; | 78 }; |
34 | 79 |
35 HttpAuth::AuthorizationResult HandleAnotherChallenge( | 80 HttpAuth::AuthorizationResult HandleAnotherChallenge( |
36 HttpAuth::ChallengeTokenizer* challenge); | 81 HttpAuth::ChallengeTokenizer* challenge); |
37 | 82 |
38 protected: | 83 protected: |
39 virtual bool Init(HttpAuth::ChallengeTokenizer* challenge); | 84 virtual bool Init(HttpAuth::ChallengeTokenizer* challenge); |
40 | 85 |
41 virtual int GenerateAuthTokenImpl(const string16* username, | 86 virtual int GenerateAuthTokenImpl(const string16* username, |
42 const string16* password, | 87 const string16* password, |
(...skipping 20 matching lines...) Expand all Loading... | |
63 ALGORITHM_MD5_SESS, | 108 ALGORITHM_MD5_SESS, |
64 }; | 109 }; |
65 | 110 |
66 // Possible values for QualityOfProtection. | 111 // Possible values for QualityOfProtection. |
67 // auth-int is not supported, see http://crbug.com/62890 for justification. | 112 // auth-int is not supported, see http://crbug.com/62890 for justification. |
68 enum QualityOfProtection { | 113 enum QualityOfProtection { |
69 QOP_UNSPECIFIED, | 114 QOP_UNSPECIFIED, |
70 QOP_AUTH, | 115 QOP_AUTH, |
71 }; | 116 }; |
72 | 117 |
73 explicit HttpAuthHandlerDigest(int nonce_count); | 118 // |nonce_count| indicates how many times the server-specified nonce has |
119 // been used so far. | |
120 // |nonce_generator| is used to create a client nonce, and is not owned by | |
121 // the handler. The lifetime of the |nonce_generator| must exceed that of this | |
122 // handler. | |
123 HttpAuthHandlerDigest(int nonce_count, const NonceGenerator* nonce_generator); | |
74 ~HttpAuthHandlerDigest(); | 124 ~HttpAuthHandlerDigest(); |
75 | 125 |
76 // Parse the challenge, saving the results into this instance. | 126 // Parse the challenge, saving the results into this instance. |
77 // Returns true on success. | 127 // Returns true on success. |
78 bool ParseChallenge(HttpAuth::ChallengeTokenizer* challenge); | 128 bool ParseChallenge(HttpAuth::ChallengeTokenizer* challenge); |
79 | 129 |
80 // Parse an individual property. Returns true on success. | 130 // Parse an individual property. Returns true on success. |
81 bool ParseChallengeProperty(const std::string& name, | 131 bool ParseChallengeProperty(const std::string& name, |
82 const std::string& value); | 132 const std::string& value); |
83 | 133 |
(...skipping 19 matching lines...) Expand all Loading... | |
103 const std::string& nc) const; | 153 const std::string& nc) const; |
104 | 154 |
105 // Build up the value for (Authorization/Proxy-Authorization). | 155 // Build up the value for (Authorization/Proxy-Authorization). |
106 std::string AssembleCredentials(const std::string& method, | 156 std::string AssembleCredentials(const std::string& method, |
107 const std::string& path, | 157 const std::string& path, |
108 const string16& username, | 158 const string16& username, |
109 const string16& password, | 159 const string16& password, |
110 const std::string& cnonce, | 160 const std::string& cnonce, |
111 int nonce_count) const; | 161 int nonce_count) const; |
112 | 162 |
113 // Forces cnonce to be the same each time. This is used for unit tests. | |
114 static void SetFixedCnonce(bool fixed_cnonce) { | |
115 fixed_cnonce_ = fixed_cnonce; | |
116 } | |
117 | |
118 // Information parsed from the challenge. | 163 // Information parsed from the challenge. |
119 std::string nonce_; | 164 std::string nonce_; |
120 std::string domain_; | 165 std::string domain_; |
121 std::string opaque_; | 166 std::string opaque_; |
122 bool stale_; | 167 bool stale_; |
123 DigestAlgorithm algorithm_; | 168 DigestAlgorithm algorithm_; |
124 QualityOfProtection qop_; | 169 QualityOfProtection qop_; |
125 | 170 |
126 int nonce_count_; | 171 int nonce_count_; |
127 | 172 const NonceGenerator* nonce_generator_; |
wtc
2010/11/17 20:21:51
In contrast, it is fine to use a const pointer her
| |
128 // Forces the cnonce to be the same each time, for unit tests. | |
129 static bool fixed_cnonce_; | |
130 }; | 173 }; |
131 | 174 |
132 } // namespace net | 175 } // namespace net |
133 | 176 |
134 #endif // NET_HTTP_HTTP_AUTH_HANDLER_DIGEST_H_ | 177 #endif // NET_HTTP_HTTP_AUTH_HANDLER_DIGEST_H_ |
OLD | NEW |