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 3 // found in the LICENSE file. 4 5 #include "net/http/http_auth_handler.h" 6 7 #include "base/logging.h" 8 #include "net/base/net_errors.h" 9 10 namespace net { 11 12 HttpAuthHandler::HttpAuthHandler() 13 : auth_scheme_(HttpAuth::AUTH_SCHEME_MAX), 14 score_(-1), 15 target_(HttpAuth::AUTH_NONE), 16 properties_(-1), 17 original_callback_(NULL), 18 ALLOW_THIS_IN_INITIALIZER_LIST( 19 wrapper_callback_( 20 this, &HttpAuthHandler::OnGenerateAuthTokenComplete)) { 21 } 22 23 HttpAuthHandler::~HttpAuthHandler() { 24 } 25 26 bool HttpAuthHandler::InitFromChallenge( 27 HttpAuth::ChallengeTokenizer* challenge, 28 HttpAuth::Target target, 29 const GURL& origin, 30 const BoundNetLog& net_log) { 31 origin_ = origin; 32 target_ = target; 33 score_ = -1; 34 properties_ = -1; 35 net_log_ = net_log; 36 37 auth_challenge_ = challenge->challenge_text(); 38 bool ok = Init(challenge); 39 40 // Init() is expected to set the scheme, realm, score, and properties. The 41 // realm may be empty. 42 DCHECK(!ok || score_ != -1); 43 DCHECK(!ok || properties_ != -1); 44 DCHECK(!ok || auth_scheme_ != HttpAuth::AUTH_SCHEME_MAX); 45 46 return ok; 47 } 48 49 namespace { 50 51 NetLog::EventType EventTypeFromAuthTarget(HttpAuth::Target target) { 52 switch (target) { 53 case HttpAuth::AUTH_PROXY: 54 return NetLog::TYPE_AUTH_PROXY; 55 case HttpAuth::AUTH_SERVER: 56 return NetLog::TYPE_AUTH_SERVER; 57 default: 58 NOTREACHED(); 59 return NetLog::TYPE_CANCELLED; 60 } 61 } 62 63 } // namespace 64 65 int HttpAuthHandler::GenerateAuthToken(const string16* username, 66 const string16* password, 67 const HttpRequestInfo* request, 68 CompletionCallback* callback, 69 std::string* auth_token) { 70 // TODO(cbentzel): Enforce non-NULL callback after cleaning up SocketStream. 71 DCHECK(request); 72 DCHECK((username == NULL) == (password == NULL)); 73 DCHECK(username != NULL || AllowsDefaultCredentials()); 74 DCHECK(auth_token != NULL); 75 DCHECK(original_callback_ == NULL); 76 original_callback_ = callback; 77 net_log_.BeginEvent(EventTypeFromAuthTarget(target_), NULL); 78 int rv = GenerateAuthTokenImpl(username, password, request, 79 &wrapper_callback_, auth_token); 80 if (rv != ERR_IO_PENDING) 81 FinishGenerateAuthToken(); 82 return rv; 83 } 84 85 bool HttpAuthHandler::NeedsIdentity() { 86 return true; 87 } 88 89 bool HttpAuthHandler::AllowsDefaultCredentials() { 90 return false; 91 } 92 93 void HttpAuthHandler::OnGenerateAuthTokenComplete(int rv) { 94 CompletionCallback* callback = original_callback_; 95 FinishGenerateAuthToken(); 96 if (callback) 97 callback->Run(rv); 98 } 99 100 void HttpAuthHandler::FinishGenerateAuthToken() { 101 // TOOD(cbentzel): Should this be done in OK case only? 102 net_log_.EndEvent(EventTypeFromAuthTarget(target_), NULL); 103 original_callback_ = NULL; 104 } 105 106 } // namespace net 107