1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker
5*6777b538SAndroid Build Coastguard Worker #include "net/http/http_auth_handler.h"
6*6777b538SAndroid Build Coastguard Worker
7*6777b538SAndroid Build Coastguard Worker #include <utility>
8*6777b538SAndroid Build Coastguard Worker
9*6777b538SAndroid Build Coastguard Worker #include "base/check_op.h"
10*6777b538SAndroid Build Coastguard Worker #include "base/functional/bind.h"
11*6777b538SAndroid Build Coastguard Worker #include "base/functional/callback_helpers.h"
12*6777b538SAndroid Build Coastguard Worker #include "net/base/net_errors.h"
13*6777b538SAndroid Build Coastguard Worker #include "net/http/http_auth_challenge_tokenizer.h"
14*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log.h"
15*6777b538SAndroid Build Coastguard Worker #include "net/log/net_log_event_type.h"
16*6777b538SAndroid Build Coastguard Worker
17*6777b538SAndroid Build Coastguard Worker namespace net {
18*6777b538SAndroid Build Coastguard Worker
19*6777b538SAndroid Build Coastguard Worker HttpAuthHandler::HttpAuthHandler() = default;
20*6777b538SAndroid Build Coastguard Worker
21*6777b538SAndroid Build Coastguard Worker HttpAuthHandler::~HttpAuthHandler() = default;
22*6777b538SAndroid Build Coastguard Worker
InitFromChallenge(HttpAuthChallengeTokenizer * challenge,HttpAuth::Target target,const SSLInfo & ssl_info,const NetworkAnonymizationKey & network_anonymization_key,const url::SchemeHostPort & scheme_host_port,const NetLogWithSource & net_log)23*6777b538SAndroid Build Coastguard Worker bool HttpAuthHandler::InitFromChallenge(
24*6777b538SAndroid Build Coastguard Worker HttpAuthChallengeTokenizer* challenge,
25*6777b538SAndroid Build Coastguard Worker HttpAuth::Target target,
26*6777b538SAndroid Build Coastguard Worker const SSLInfo& ssl_info,
27*6777b538SAndroid Build Coastguard Worker const NetworkAnonymizationKey& network_anonymization_key,
28*6777b538SAndroid Build Coastguard Worker const url::SchemeHostPort& scheme_host_port,
29*6777b538SAndroid Build Coastguard Worker const NetLogWithSource& net_log) {
30*6777b538SAndroid Build Coastguard Worker scheme_host_port_ = scheme_host_port;
31*6777b538SAndroid Build Coastguard Worker target_ = target;
32*6777b538SAndroid Build Coastguard Worker score_ = -1;
33*6777b538SAndroid Build Coastguard Worker properties_ = -1;
34*6777b538SAndroid Build Coastguard Worker net_log_ = net_log;
35*6777b538SAndroid Build Coastguard Worker
36*6777b538SAndroid Build Coastguard Worker auth_challenge_ = challenge->challenge_text();
37*6777b538SAndroid Build Coastguard Worker net_log_.BeginEvent(NetLogEventType::AUTH_HANDLER_INIT);
38*6777b538SAndroid Build Coastguard Worker bool ok = Init(challenge, ssl_info, network_anonymization_key);
39*6777b538SAndroid Build Coastguard Worker net_log_.EndEvent(NetLogEventType::AUTH_HANDLER_INIT, [&]() {
40*6777b538SAndroid Build Coastguard Worker base::Value::Dict params;
41*6777b538SAndroid Build Coastguard Worker params.Set("succeeded", ok);
42*6777b538SAndroid Build Coastguard Worker params.Set("allows_default_credentials", AllowsDefaultCredentials());
43*6777b538SAndroid Build Coastguard Worker return params;
44*6777b538SAndroid Build Coastguard Worker });
45*6777b538SAndroid Build Coastguard Worker
46*6777b538SAndroid Build Coastguard Worker // Init() is expected to set the scheme, realm, score, and properties. The
47*6777b538SAndroid Build Coastguard Worker // realm may be empty.
48*6777b538SAndroid Build Coastguard Worker DCHECK(!ok || score_ != -1);
49*6777b538SAndroid Build Coastguard Worker DCHECK(!ok || properties_ != -1);
50*6777b538SAndroid Build Coastguard Worker DCHECK(!ok || auth_scheme_ != HttpAuth::AUTH_SCHEME_MAX);
51*6777b538SAndroid Build Coastguard Worker
52*6777b538SAndroid Build Coastguard Worker return ok;
53*6777b538SAndroid Build Coastguard Worker }
54*6777b538SAndroid Build Coastguard Worker
GenerateAuthToken(const AuthCredentials * credentials,const HttpRequestInfo * request,CompletionOnceCallback callback,std::string * auth_token)55*6777b538SAndroid Build Coastguard Worker int HttpAuthHandler::GenerateAuthToken(const AuthCredentials* credentials,
56*6777b538SAndroid Build Coastguard Worker const HttpRequestInfo* request,
57*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback,
58*6777b538SAndroid Build Coastguard Worker std::string* auth_token) {
59*6777b538SAndroid Build Coastguard Worker DCHECK(!callback.is_null());
60*6777b538SAndroid Build Coastguard Worker DCHECK(request);
61*6777b538SAndroid Build Coastguard Worker DCHECK(credentials != nullptr || AllowsDefaultCredentials());
62*6777b538SAndroid Build Coastguard Worker DCHECK(auth_token != nullptr);
63*6777b538SAndroid Build Coastguard Worker DCHECK(callback_.is_null());
64*6777b538SAndroid Build Coastguard Worker callback_ = std::move(callback);
65*6777b538SAndroid Build Coastguard Worker net_log_.BeginEvent(NetLogEventType::AUTH_GENERATE_TOKEN);
66*6777b538SAndroid Build Coastguard Worker int rv = GenerateAuthTokenImpl(
67*6777b538SAndroid Build Coastguard Worker credentials, request,
68*6777b538SAndroid Build Coastguard Worker base::BindOnce(&HttpAuthHandler::OnGenerateAuthTokenComplete,
69*6777b538SAndroid Build Coastguard Worker base::Unretained(this)),
70*6777b538SAndroid Build Coastguard Worker auth_token);
71*6777b538SAndroid Build Coastguard Worker if (rv != ERR_IO_PENDING)
72*6777b538SAndroid Build Coastguard Worker FinishGenerateAuthToken(rv);
73*6777b538SAndroid Build Coastguard Worker return rv;
74*6777b538SAndroid Build Coastguard Worker }
75*6777b538SAndroid Build Coastguard Worker
NeedsIdentity()76*6777b538SAndroid Build Coastguard Worker bool HttpAuthHandler::NeedsIdentity() {
77*6777b538SAndroid Build Coastguard Worker return true;
78*6777b538SAndroid Build Coastguard Worker }
79*6777b538SAndroid Build Coastguard Worker
AllowsDefaultCredentials()80*6777b538SAndroid Build Coastguard Worker bool HttpAuthHandler::AllowsDefaultCredentials() {
81*6777b538SAndroid Build Coastguard Worker return false;
82*6777b538SAndroid Build Coastguard Worker }
83*6777b538SAndroid Build Coastguard Worker
AllowsExplicitCredentials()84*6777b538SAndroid Build Coastguard Worker bool HttpAuthHandler::AllowsExplicitCredentials() {
85*6777b538SAndroid Build Coastguard Worker return true;
86*6777b538SAndroid Build Coastguard Worker }
87*6777b538SAndroid Build Coastguard Worker
OnGenerateAuthTokenComplete(int rv)88*6777b538SAndroid Build Coastguard Worker void HttpAuthHandler::OnGenerateAuthTokenComplete(int rv) {
89*6777b538SAndroid Build Coastguard Worker CompletionOnceCallback callback = std::move(callback_);
90*6777b538SAndroid Build Coastguard Worker FinishGenerateAuthToken(rv);
91*6777b538SAndroid Build Coastguard Worker DCHECK(!callback.is_null());
92*6777b538SAndroid Build Coastguard Worker std::move(callback).Run(rv);
93*6777b538SAndroid Build Coastguard Worker }
94*6777b538SAndroid Build Coastguard Worker
FinishGenerateAuthToken(int rv)95*6777b538SAndroid Build Coastguard Worker void HttpAuthHandler::FinishGenerateAuthToken(int rv) {
96*6777b538SAndroid Build Coastguard Worker DCHECK_NE(rv, ERR_IO_PENDING);
97*6777b538SAndroid Build Coastguard Worker net_log_.EndEventWithNetErrorCode(NetLogEventType::AUTH_GENERATE_TOKEN, rv);
98*6777b538SAndroid Build Coastguard Worker callback_.Reset();
99*6777b538SAndroid Build Coastguard Worker }
100*6777b538SAndroid Build Coastguard Worker
HandleAnotherChallenge(HttpAuthChallengeTokenizer * challenge)101*6777b538SAndroid Build Coastguard Worker HttpAuth::AuthorizationResult HttpAuthHandler::HandleAnotherChallenge(
102*6777b538SAndroid Build Coastguard Worker HttpAuthChallengeTokenizer* challenge) {
103*6777b538SAndroid Build Coastguard Worker auto authorization_result = HandleAnotherChallengeImpl(challenge);
104*6777b538SAndroid Build Coastguard Worker net_log_.AddEvent(NetLogEventType::AUTH_HANDLE_CHALLENGE, [&] {
105*6777b538SAndroid Build Coastguard Worker return HttpAuth::NetLogAuthorizationResultParams("authorization_result",
106*6777b538SAndroid Build Coastguard Worker authorization_result);
107*6777b538SAndroid Build Coastguard Worker });
108*6777b538SAndroid Build Coastguard Worker return authorization_result;
109*6777b538SAndroid Build Coastguard Worker }
110*6777b538SAndroid Build Coastguard Worker
111*6777b538SAndroid Build Coastguard Worker } // namespace net
112