Home | History | Annotate | Download | only in http
      1 // Copyright (c) 2006-2008 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 "net/http/http_auth_handler.h"
      9 
     10 // This is needed for the FRIEND_TEST() macro.
     11 #include "testing/gtest/include/gtest/gtest_prod.h"
     12 
     13 namespace net {
     14 
     15 // Code for handling http digest authentication.
     16 class HttpAuthHandlerDigest : public HttpAuthHandler {
     17  public:
     18   virtual std::string GenerateCredentials(const std::wstring& username,
     19                                           const std::wstring& password,
     20                                           const HttpRequestInfo* request,
     21                                           const ProxyInfo* proxy);
     22 
     23  protected:
     24   virtual bool Init(std::string::const_iterator challenge_begin,
     25                     std::string::const_iterator challenge_end) {
     26     nonce_count_ = 0;
     27     return ParseChallenge(challenge_begin, challenge_end);
     28   }
     29 
     30  private:
     31   FRIEND_TEST(HttpAuthHandlerDigestTest, ParseChallenge);
     32   FRIEND_TEST(HttpAuthHandlerDigestTest, AssembleCredentials);
     33 
     34   // Possible values for the "algorithm" property.
     35   enum DigestAlgorithm {
     36     // No algorithm was specified. According to RFC 2617 this means
     37     // we should default to ALGORITHM_MD5.
     38     ALGORITHM_UNSPECIFIED,
     39 
     40     // Hashes are run for every request.
     41     ALGORITHM_MD5,
     42 
     43     // Hash is run only once during the first WWW-Authenticate handshake.
     44     // (SESS means session).
     45     ALGORITHM_MD5_SESS,
     46   };
     47 
     48   // Possible values for "qop" -- may be or-ed together if there were
     49   // multiple comma separated values.
     50   enum QualityOfProtection {
     51     QOP_UNSPECIFIED = 0,
     52     QOP_AUTH = 1 << 0,
     53     QOP_AUTH_INT = 1 << 1,
     54   };
     55 
     56   ~HttpAuthHandlerDigest() {}
     57 
     58   // Parse the challenge, saving the results into this instance.
     59   // Returns true on success.
     60   bool ParseChallenge(std::string::const_iterator challenge_begin,
     61                       std::string::const_iterator challenge_end);
     62 
     63   // Parse an individual property. Returns true on success.
     64   bool ParseChallengeProperty(const std::string& name,
     65                               const std::string& value);
     66 
     67   // Generates a random string, to be used for client-nonce.
     68   static std::string GenerateNonce();
     69 
     70   // Convert enum value back to string.
     71   static std::string QopToString(int qop);
     72   static std::string AlgorithmToString(int algorithm);
     73 
     74   // Extract the method and path of the request, as needed by
     75   // the 'A2' production. (path may be a hostname for proxy).
     76   void GetRequestMethodAndPath(const HttpRequestInfo* request,
     77                                const ProxyInfo* proxy,
     78                                std::string* method,
     79                                std::string* path) const;
     80 
     81   // Build up  the 'response' production.
     82   std::string AssembleResponseDigest(const std::string& method,
     83                                      const std::string& path,
     84                                      const std::string& username,
     85                                      const std::string& password,
     86                                      const std::string& cnonce,
     87                                      const std::string& nc) const;
     88 
     89   // Build up  the value for (Authorization/Proxy-Authorization).
     90   std::string AssembleCredentials(const std::string& method,
     91                                   const std::string& path,
     92                                   const std::string& username,
     93                                   const std::string& password,
     94                                   const std::string& cnonce,
     95                                   int nonce_count) const;
     96 
     97   // Information parsed from the challenge.
     98   std::string nonce_;
     99   std::string domain_;
    100   std::string opaque_;
    101   bool stale_;
    102   DigestAlgorithm algorithm_;
    103   int qop_; // Bitfield of QualityOfProtection
    104 
    105   int nonce_count_;
    106 };
    107 
    108 }  // namespace net
    109 
    110 #endif  // NET_HTTP_HTTP_AUTH_HANDLER_DIGEST_H_
    111