123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
- From: Jeremy Apthorp <[email protected]>
- Date: Tue, 12 Nov 2019 11:50:16 -0800
- Subject: add TrustedAuthClient to URLLoaderFactory
- This allows intercepting authentication requests for the 'net' module.
- Without this, the 'login' event for electron.net.ClientRequest can't be
- implemented, because the existing path checks for the presence of a
- WebContents, and cancels the authentication if there's no WebContents
- available, which there isn't in the case of the 'net' module.
- diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
- index ccac671f0e7e56c731cb9bd92bad788271419a7f..cfea0e5dbc28f1a4cdfea36372ce7f34f15c4de7 100644
- --- a/services/network/public/mojom/network_context.mojom
- +++ b/services/network/public/mojom/network_context.mojom
- @@ -214,6 +214,25 @@ struct CTPolicy {
- array<string> excluded_legacy_spkis;
- };
-
- +interface TrustedAuthClient {
- + OnAuthRequired(
- + mojo_base.mojom.UnguessableToken? window_id,
- + uint32 process_id,
- + uint32 routing_id,
- + uint32 request_id,
- + url.mojom.Url url,
- + bool first_auth_attempt,
- + AuthChallengeInfo auth_info,
- + URLResponseHead? head,
- + pending_remote<AuthChallengeResponder> auth_challenge_responder);
- +};
- +interface TrustedURLLoaderAuthClient {
- + // When a new URLLoader is created, this will be called to pass a
- + // corresponding |auth_client|.
- + OnLoaderCreated(int32 request_id,
- + pending_receiver<TrustedAuthClient> auth_client);
- +};
- +
- interface CertVerifierClient {
- Verify(
- int32 default_error,
- @@ -640,6 +659,8 @@ struct URLLoaderFactoryParams {
- // impact because of the extra process hops, so use should be minimized.
- pending_remote<TrustedURLLoaderHeaderClient>? header_client;
-
- + pending_remote<TrustedURLLoaderAuthClient>? auth_client;
- +
- // |factory_bound_access_patterns| are used for CORS checks in addition to
- // the per-context allow patterns that is managed via NetworkContext
- // interface. This still respects the per-context block lists.
- diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
- index 1fa9021a62385fd5c0dadbb8a4a046cd72039915..2b0e4841d009df2f7bb310efca74d2ff79d29b36 100644
- --- a/services/network/url_loader.cc
- +++ b/services/network/url_loader.cc
- @@ -471,6 +471,7 @@ URLLoader::URLLoader(
- base::WeakPtr<KeepaliveStatisticsRecorder> keepalive_statistics_recorder,
- base::WeakPtr<NetworkUsageAccumulator> network_usage_accumulator,
- mojom::TrustedURLLoaderHeaderClient* url_loader_header_client,
- + mojom::TrustedURLLoaderAuthClient* url_loader_auth_client,
- mojom::OriginPolicyManager* origin_policy_manager,
- std::unique_ptr<TrustTokenRequestHelperFactory> trust_token_helper_factory,
- mojo::PendingRemote<mojom::CookieAccessObserver> cookie_observer)
- @@ -534,6 +535,11 @@ URLLoader::URLLoader(
- header_client_.set_disconnect_handler(
- base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
- }
- + if (url_loader_auth_client) {
- + url_loader_auth_client->OnLoaderCreated(request_id_, auth_client_.BindNewPipeAndPassReceiver());
- + auth_client_.set_disconnect_handler(
- + base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
- + }
- if (want_raw_headers_) {
- options_ |= mojom::kURLLoadOptionSendSSLInfoWithResponse |
- mojom::kURLLoadOptionSendSSLInfoForCertificateError;
- @@ -1061,7 +1067,7 @@ void URLLoader::OnAuthRequired(net::URLRequest* url_request,
- // |this| may have been deleted.
- return;
- }
- - if (!network_context_client_) {
- + if (!network_context_client_ && !auth_client_) {
- OnAuthCredentials(base::nullopt);
- return;
- }
- @@ -1077,11 +1083,20 @@ void URLLoader::OnAuthRequired(net::URLRequest* url_request,
- if (url_request->response_headers())
- head->headers = url_request->response_headers();
- head->auth_challenge_info = auth_info;
- - network_context_client_->OnAuthRequired(
- - fetch_window_id_, factory_params_->process_id, render_frame_id_,
- - request_id_, url_request_->url(), first_auth_attempt_, auth_info,
- - std::move(head),
- - auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
- +
- + if (auth_client_) {
- + auth_client_->OnAuthRequired(
- + fetch_window_id_, factory_params_->process_id, render_frame_id_,
- + request_id_, url_request_->url(), first_auth_attempt_, auth_info,
- + std::move(head),
- + auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
- + } else {
- + network_context_client_->OnAuthRequired(
- + fetch_window_id_, factory_params_->process_id, render_frame_id_,
- + request_id_, url_request_->url(), first_auth_attempt_, auth_info,
- + std::move(head),
- + auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
- + }
-
- auth_challenge_responder_receiver_.set_disconnect_handler(
- base::BindOnce(&URLLoader::DeleteSelf, base::Unretained(this)));
- diff --git a/services/network/url_loader.h b/services/network/url_loader.h
- index 1c8a9ce4ba5f41cb7a4d415337ff087894fee3df..1ea5d86177ff568a13e3d10767316ae496298d10 100644
- --- a/services/network/url_loader.h
- +++ b/services/network/url_loader.h
- @@ -115,6 +115,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) URLLoader
- base::WeakPtr<KeepaliveStatisticsRecorder> keepalive_statistics_recorder,
- base::WeakPtr<NetworkUsageAccumulator> network_usage_accumulator,
- mojom::TrustedURLLoaderHeaderClient* url_loader_header_client,
- + mojom::TrustedURLLoaderAuthClient* url_loader_auth_client,
- mojom::OriginPolicyManager* origin_policy_manager,
- std::unique_ptr<TrustTokenRequestHelperFactory>
- trust_token_helper_factory,
- @@ -456,6 +457,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) URLLoader
- base::Optional<base::UnguessableToken> fetch_window_id_;
-
- mojo::Remote<mojom::TrustedHeaderClient> header_client_;
- + mojo::Remote<mojom::TrustedAuthClient> auth_client_;
-
- std::unique_ptr<FileOpenerForUpload> file_opener_for_upload_;
-
- diff --git a/services/network/url_loader_factory.cc b/services/network/url_loader_factory.cc
- index 75ae8488efa7e5acfda0b21029657b525fa95f86..5dce71ee5efc97f9f63d0b5f236dccdfb05cfc79 100644
- --- a/services/network/url_loader_factory.cc
- +++ b/services/network/url_loader_factory.cc
- @@ -75,6 +75,7 @@ URLLoaderFactory::URLLoaderFactory(
- resource_scheduler_client_(std::move(resource_scheduler_client)),
- header_client_(std::move(params_->header_client)),
- coep_reporter_(std::move(params_->coep_reporter)),
- + auth_client_(std::move(params_->auth_client)),
- cors_url_loader_factory_(cors_url_loader_factory),
- cookie_observer_(std::move(params_->cookie_observer)) {
- DCHECK(context);
- @@ -254,6 +255,7 @@ void URLLoaderFactory::CreateLoaderAndStart(
- std::move(keepalive_statistics_recorder),
- std::move(network_usage_accumulator),
- header_client_.is_bound() ? header_client_.get() : nullptr,
- + auth_client_.is_bound() ? auth_client_.get() : nullptr,
- context_->origin_policy_manager(), std::move(trust_token_factory),
- std::move(cookie_observer));
-
- diff --git a/services/network/url_loader_factory.h b/services/network/url_loader_factory.h
- index 8b29b67a5b0663778df3169e09bf818e6bbcec3f..e504fa3d41066907a3fbc41e69daac968415dfa6 100644
- --- a/services/network/url_loader_factory.h
- +++ b/services/network/url_loader_factory.h
- @@ -75,6 +75,7 @@ class URLLoaderFactory : public mojom::URLLoaderFactory {
- scoped_refptr<ResourceSchedulerClient> resource_scheduler_client_;
- mojo::Remote<mojom::TrustedURLLoaderHeaderClient> header_client_;
- mojo::Remote<mojom::CrossOriginEmbedderPolicyReporter> coep_reporter_;
- + mojo::Remote<mojom::TrustedURLLoaderAuthClient> auth_client_;
-
- // |cors_url_loader_factory_| owns this.
- cors::CorsURLLoaderFactory* cors_url_loader_factory_;
|