| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef NET_HTTP_HTTP_AUTH_HANDLER_DIGEST_H_ | |
| 6 #define NET_HTTP_HTTP_AUTH_HANDLER_DIGEST_H_ | |
| 7 | |
| 8 #include <string> | |
| 9 | |
| 10 #include "base/basictypes.h" | |
| 11 #include "base/gtest_prod_util.h" | |
| 12 #include "base/memory/scoped_ptr.h" | |
| 13 #include "net/base/net_export.h" | |
| 14 #include "net/http/http_auth_handler.h" | |
| 15 #include "net/http/http_auth_handler_factory.h" | |
| 16 | |
| 17 namespace net { | |
| 18 | |
| 19 // Code for handling http digest authentication. | |
| 20 class NET_EXPORT_PRIVATE HttpAuthHandlerDigest : public HttpAuthHandler { | |
| 21 public: | |
| 22 // A NonceGenerator is a simple interface for generating client nonces. | |
| 23 // Unit tests can override the default client nonce behavior with fixed | |
| 24 // nonce generation to get reproducible results. | |
| 25 class NET_EXPORT_PRIVATE NonceGenerator { | |
| 26 public: | |
| 27 NonceGenerator(); | |
| 28 virtual ~NonceGenerator(); | |
| 29 | |
| 30 // Generates a client nonce. | |
| 31 virtual std::string GenerateNonce() const = 0; | |
| 32 private: | |
| 33 DISALLOW_COPY_AND_ASSIGN(NonceGenerator); | |
| 34 }; | |
| 35 | |
| 36 // DynamicNonceGenerator does a random shuffle of 16 | |
| 37 // characters to generate a client nonce. | |
| 38 class DynamicNonceGenerator : public NonceGenerator { | |
| 39 public: | |
| 40 DynamicNonceGenerator(); | |
| 41 std::string GenerateNonce() const override; | |
| 42 | |
| 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 NET_EXPORT_PRIVATE FixedNonceGenerator : public NonceGenerator { | |
| 50 public: | |
| 51 explicit FixedNonceGenerator(const std::string& nonce); | |
| 52 | |
| 53 std::string GenerateNonce() const override; | |
| 54 | |
| 55 private: | |
| 56 const std::string nonce_; | |
| 57 DISALLOW_COPY_AND_ASSIGN(FixedNonceGenerator); | |
| 58 }; | |
| 59 | |
| 60 class NET_EXPORT_PRIVATE Factory : public HttpAuthHandlerFactory { | |
| 61 public: | |
| 62 Factory(); | |
| 63 ~Factory() override; | |
| 64 | |
| 65 // This factory owns the passed in |nonce_generator|. | |
| 66 void set_nonce_generator(const NonceGenerator* nonce_generator); | |
| 67 | |
| 68 int CreateAuthHandler(HttpAuthChallengeTokenizer* challenge, | |
| 69 HttpAuth::Target target, | |
| 70 const GURL& origin, | |
| 71 CreateReason reason, | |
| 72 int digest_nonce_count, | |
| 73 const BoundNetLog& net_log, | |
| 74 scoped_ptr<HttpAuthHandler>* handler) override; | |
| 75 | |
| 76 private: | |
| 77 scoped_ptr<const NonceGenerator> nonce_generator_; | |
| 78 }; | |
| 79 | |
| 80 HttpAuth::AuthorizationResult HandleAnotherChallenge( | |
| 81 HttpAuthChallengeTokenizer* challenge) override; | |
| 82 | |
| 83 protected: | |
| 84 bool Init(HttpAuthChallengeTokenizer* challenge) override; | |
| 85 | |
| 86 int GenerateAuthTokenImpl(const AuthCredentials* credentials, | |
| 87 const HttpRequestInfo* request, | |
| 88 const CompletionCallback& callback, | |
| 89 std::string* auth_token) override; | |
| 90 | |
| 91 private: | |
| 92 FRIEND_TEST_ALL_PREFIXES(HttpAuthHandlerDigestTest, ParseChallenge); | |
| 93 FRIEND_TEST_ALL_PREFIXES(HttpAuthHandlerDigestTest, AssembleCredentials); | |
| 94 FRIEND_TEST_ALL_PREFIXES(HttpNetworkTransactionTest, DigestPreAuthNonceCount); | |
| 95 | |
| 96 // Possible values for the "algorithm" property. | |
| 97 enum DigestAlgorithm { | |
| 98 // No algorithm was specified. According to RFC 2617 this means | |
| 99 // we should default to ALGORITHM_MD5. | |
| 100 ALGORITHM_UNSPECIFIED, | |
| 101 | |
| 102 // Hashes are run for every request. | |
| 103 ALGORITHM_MD5, | |
| 104 | |
| 105 // Hash is run only once during the first WWW-Authenticate handshake. | |
| 106 // (SESS means session). | |
| 107 ALGORITHM_MD5_SESS, | |
| 108 }; | |
| 109 | |
| 110 // Possible values for QualityOfProtection. | |
| 111 // auth-int is not supported, see http://crbug.com/62890 for justification. | |
| 112 enum QualityOfProtection { | |
| 113 QOP_UNSPECIFIED, | |
| 114 QOP_AUTH, | |
| 115 }; | |
| 116 | |
| 117 // |nonce_count| indicates how many times the server-specified nonce has | |
| 118 // been used so far. | |
| 119 // |nonce_generator| is used to create a client nonce, and is not owned by | |
| 120 // the handler. The lifetime of the |nonce_generator| must exceed that of this | |
| 121 // handler. | |
| 122 HttpAuthHandlerDigest(int nonce_count, const NonceGenerator* nonce_generator); | |
| 123 ~HttpAuthHandlerDigest() override; | |
| 124 | |
| 125 // Parse the challenge, saving the results into this instance. | |
| 126 // Returns true on success. | |
| 127 bool ParseChallenge(HttpAuthChallengeTokenizer* challenge); | |
| 128 | |
| 129 // Parse an individual property. Returns true on success. | |
| 130 bool ParseChallengeProperty(const std::string& name, | |
| 131 const std::string& value); | |
| 132 | |
| 133 // Generates a random string, to be used for client-nonce. | |
| 134 static std::string GenerateNonce(); | |
| 135 | |
| 136 // Convert enum value back to string. | |
| 137 static std::string QopToString(QualityOfProtection qop); | |
| 138 static std::string AlgorithmToString(DigestAlgorithm algorithm); | |
| 139 | |
| 140 // Extract the method and path of the request, as needed by | |
| 141 // the 'A2' production. (path may be a hostname for proxy). | |
| 142 void GetRequestMethodAndPath(const HttpRequestInfo* request, | |
| 143 std::string* method, | |
| 144 std::string* path) const; | |
| 145 | |
| 146 // Build up the 'response' production. | |
| 147 std::string AssembleResponseDigest(const std::string& method, | |
| 148 const std::string& path, | |
| 149 const AuthCredentials& credentials, | |
| 150 const std::string& cnonce, | |
| 151 const std::string& nc) const; | |
| 152 | |
| 153 // Build up the value for (Authorization/Proxy-Authorization). | |
| 154 std::string AssembleCredentials(const std::string& method, | |
| 155 const std::string& path, | |
| 156 const AuthCredentials& credentials, | |
| 157 const std::string& cnonce, | |
| 158 int nonce_count) const; | |
| 159 | |
| 160 // Information parsed from the challenge. | |
| 161 std::string nonce_; | |
| 162 std::string domain_; | |
| 163 std::string opaque_; | |
| 164 bool stale_; | |
| 165 DigestAlgorithm algorithm_; | |
| 166 QualityOfProtection qop_; | |
| 167 | |
| 168 // The realm as initially encoded over-the-wire. This is used in the | |
| 169 // challenge text, rather than |realm_| which has been converted to | |
| 170 // UTF-8. | |
| 171 std::string original_realm_; | |
| 172 | |
| 173 int nonce_count_; | |
| 174 const NonceGenerator* nonce_generator_; | |
| 175 }; | |
| 176 | |
| 177 } // namespace net | |
| 178 | |
| 179 #endif // NET_HTTP_HTTP_AUTH_HANDLER_DIGEST_H_ | |
| OLD | NEW |