| Index: net/http/http_auth_handler_digest.cc
|
| ===================================================================
|
| --- net/http/http_auth_handler_digest.cc (revision 66137)
|
| +++ net/http/http_auth_handler_digest.cc (working copy)
|
| @@ -46,15 +46,13 @@
|
| //=====================+==========================================+
|
|
|
|
|
| -//static
|
| -bool HttpAuthHandlerDigest::fixed_cnonce_ = false;
|
| +HttpAuthHandlerDigest::NonceGenerator::~NonceGenerator() {
|
| +}
|
|
|
| -// static
|
| -std::string HttpAuthHandlerDigest::GenerateNonce() {
|
| +std::string HttpAuthHandlerDigest::DynamicNonceGenerator::GenerateNonce()
|
| + const {
|
| // This is how mozilla generates their cnonce -- a 16 digit hex string.
|
| static const char domain[] = "0123456789abcdef";
|
| - if (fixed_cnonce_)
|
| - return std::string(domain);
|
| std::string cnonce;
|
| cnonce.reserve(16);
|
| for (int i = 0; i < 16; ++i)
|
| @@ -62,6 +60,15 @@
|
| return cnonce;
|
| }
|
|
|
| +HttpAuthHandlerDigest::FixedNonceGenerator::FixedNonceGenerator(
|
| + const std::string& nonce)
|
| + : nonce_(nonce) {
|
| +}
|
| +
|
| +std::string HttpAuthHandlerDigest::FixedNonceGenerator::GenerateNonce() const {
|
| + return nonce_;
|
| +}
|
| +
|
| // static
|
| std::string HttpAuthHandlerDigest::QopToString(QualityOfProtection qop) {
|
| switch (qop) {
|
| @@ -91,11 +98,14 @@
|
| }
|
| }
|
|
|
| -HttpAuthHandlerDigest::HttpAuthHandlerDigest(int nonce_count)
|
| +HttpAuthHandlerDigest::HttpAuthHandlerDigest(
|
| + int nonce_count, const NonceGenerator* nonce_generator)
|
| : stale_(false),
|
| algorithm_(ALGORITHM_UNSPECIFIED),
|
| qop_(QOP_UNSPECIFIED),
|
| - nonce_count_(nonce_count) {
|
| + nonce_count_(nonce_count),
|
| + nonce_generator_(nonce_generator) {
|
| + DCHECK(nonce_generator_);
|
| }
|
|
|
| HttpAuthHandlerDigest::~HttpAuthHandlerDigest() {
|
| @@ -108,7 +118,7 @@
|
| CompletionCallback* callback,
|
| std::string* auth_token) {
|
| // Generate a random client nonce.
|
| - std::string cnonce = GenerateNonce();
|
| + std::string cnonce = nonce_generator_->GenerateNonce();
|
|
|
| // Extract the request method and path -- the meaning of 'path' is overloaded
|
| // in certain cases, to be a hostname.
|
| @@ -327,12 +337,18 @@
|
| return true;
|
| }
|
|
|
| -HttpAuthHandlerDigest::Factory::Factory() {
|
| +HttpAuthHandlerDigest::Factory::Factory()
|
| + : nonce_generator_(new DynamicNonceGenerator()) {
|
| }
|
|
|
| HttpAuthHandlerDigest::Factory::~Factory() {
|
| }
|
|
|
| +void HttpAuthHandlerDigest::Factory::set_nonce_generator(
|
| + const NonceGenerator* nonce_generator) {
|
| + nonce_generator_.reset(nonce_generator);
|
| +}
|
| +
|
| int HttpAuthHandlerDigest::Factory::CreateAuthHandler(
|
| HttpAuth::ChallengeTokenizer* challenge,
|
| HttpAuth::Target target,
|
| @@ -344,7 +360,7 @@
|
| // TODO(cbentzel): Move towards model of parsing in the factory
|
| // method and only constructing when valid.
|
| scoped_ptr<HttpAuthHandler> tmp_handler(
|
| - new HttpAuthHandlerDigest(digest_nonce_count));
|
| + new HttpAuthHandlerDigest(digest_nonce_count, nonce_generator_.get()));
|
| if (!tmp_handler->InitFromChallenge(challenge, target, origin, net_log))
|
| return ERR_INVALID_RESPONSE;
|
| handler->swap(tmp_handler);
|
|
|