xref: /aosp_15_r20/external/cronet/net/http/http_auth_handler.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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