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 541d8017d38cbede3199e0028f3b1b260bd61b34..ec2e6d52d247fbcc9f07c54518f860d1a30822f4 100644
- --- a/services/network/public/mojom/network_context.mojom
- +++ b/services/network/public/mojom/network_context.mojom
- @@ -191,6 +191,25 @@ struct HttpAuthStaticNetworkContextParams {
- = DefaultCredentials.ALLOW_DEFAULT_CREDENTIALS;
- };
-
- +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,
- @@ -603,6 +622,8 @@ struct URLLoaderFactoryParams {
- // interface. This still respects the per-context block lists.
- CorsOriginAccessPatterns? factory_bound_access_patterns;
-
- + pending_remote<TrustedURLLoaderAuthClient>? auth_client;
- +
- // Key used to isolate shared network resources like the cache.
- NetworkIsolationKey? network_isolation_key;
-
- diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
- index 6f69ca035500a7af795ccd93b689bcc3b376576e..bf112361de669c22532d269b5871c9b23ca7b694 100644
- --- a/services/network/url_loader.cc
- +++ b/services/network/url_loader.cc
- @@ -338,6 +338,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)
- : url_request_context_(url_request_context),
- network_service_client_(network_service_client),
- @@ -396,6 +397,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;
- @@ -830,7 +836,7 @@ void URLLoader::OnReceivedRedirect(net::URLRequest* url_request,
-
- void URLLoader::OnAuthRequired(net::URLRequest* url_request,
- const net::AuthChallengeInfo& auth_info) {
- - if (!network_context_client_) {
- + if (!network_context_client_ && !auth_client_) {
- OnAuthCredentials(base::nullopt);
- return;
- }
- @@ -846,11 +852,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 532ecdc0a9b386eb9ea04a480b18aeb1ac32a059..b3ad0f42ab9c2f513d8c4a06683d1af6f0219a56 100644
- --- a/services/network/url_loader.h
- +++ b/services/network/url_loader.h
- @@ -85,6 +85,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);
- ~URLLoader() override;
-
- @@ -384,6 +385,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 9e9baaf8ecd33e6416027014361edc332ab71e3c..cc2c59828f56988d43b680588d4625d9864aa9b6 100644
- --- a/services/network/url_loader_factory.cc
- +++ b/services/network/url_loader_factory.cc
- @@ -65,6 +65,7 @@ URLLoaderFactory::URLLoaderFactory(
- params_(std::move(params)),
- resource_scheduler_client_(std::move(resource_scheduler_client)),
- header_client_(std::move(params_->header_client)),
- + auth_client_(std::move(params_->auth_client)),
- cors_url_loader_factory_(cors_url_loader_factory) {
- DCHECK(context);
- DCHECK_NE(mojom::kInvalidProcessId, params_->process_id);
- @@ -207,6 +208,7 @@ void URLLoaderFactory::CreateLoaderAndStart(
- resource_scheduler_client_, 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());
- cors_url_loader_factory_->OnLoaderCreated(std::move(loader));
- }
- diff --git a/services/network/url_loader_factory.h b/services/network/url_loader_factory.h
- index 7d13494649c43be52b06774f2cf5763ebe9129c0..d4b19342c44f86c685f700e4260475ff2235b298 100644
- --- a/services/network/url_loader_factory.h
- +++ b/services/network/url_loader_factory.h
- @@ -72,6 +72,7 @@ class URLLoaderFactory : public mojom::URLLoaderFactory {
- mojom::URLLoaderFactoryParamsPtr params_;
- scoped_refptr<ResourceSchedulerClient> resource_scheduler_client_;
- mojo::Remote<mojom::TrustedURLLoaderHeaderClient> header_client_;
- + mojo::Remote<mojom::TrustedURLLoaderAuthClient> auth_client_;
-
- // |cors_url_loader_factory_| owns this.
- cors::CorsURLLoaderFactory* cors_url_loader_factory_;
|