add_trustedauthclient_to_urlloaderfactory.patch 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: Jeremy Apthorp <[email protected]>
  3. Date: Tue, 12 Nov 2019 11:50:16 -0800
  4. Subject: add TrustedAuthClient to URLLoaderFactory
  5. This allows intercepting authentication requests for the 'net' module.
  6. Without this, the 'login' event for electron.net.ClientRequest can't be
  7. implemented, because the existing path checks for the presence of a
  8. WebContents, and cancels the authentication if there's no WebContents
  9. available, which there isn't in the case of the 'net' module.
  10. diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom
  11. index 541d8017d38cbede3199e0028f3b1b260bd61b34..ec2e6d52d247fbcc9f07c54518f860d1a30822f4 100644
  12. --- a/services/network/public/mojom/network_context.mojom
  13. +++ b/services/network/public/mojom/network_context.mojom
  14. @@ -191,6 +191,25 @@ struct HttpAuthStaticNetworkContextParams {
  15. = DefaultCredentials.ALLOW_DEFAULT_CREDENTIALS;
  16. };
  17. +interface TrustedAuthClient {
  18. + OnAuthRequired(
  19. + mojo_base.mojom.UnguessableToken? window_id,
  20. + uint32 process_id,
  21. + uint32 routing_id,
  22. + uint32 request_id,
  23. + url.mojom.Url url,
  24. + bool first_auth_attempt,
  25. + AuthChallengeInfo auth_info,
  26. + URLResponseHead? head,
  27. + pending_remote<AuthChallengeResponder> auth_challenge_responder);
  28. +};
  29. +interface TrustedURLLoaderAuthClient {
  30. + // When a new URLLoader is created, this will be called to pass a
  31. + // corresponding |auth_client|.
  32. + OnLoaderCreated(int32 request_id,
  33. + pending_receiver<TrustedAuthClient> auth_client);
  34. +};
  35. +
  36. interface CertVerifierClient {
  37. Verify(
  38. int32 default_error,
  39. @@ -603,6 +622,8 @@ struct URLLoaderFactoryParams {
  40. // interface. This still respects the per-context block lists.
  41. CorsOriginAccessPatterns? factory_bound_access_patterns;
  42. + pending_remote<TrustedURLLoaderAuthClient>? auth_client;
  43. +
  44. // Key used to isolate shared network resources like the cache.
  45. NetworkIsolationKey? network_isolation_key;
  46. diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
  47. index 6f69ca035500a7af795ccd93b689bcc3b376576e..bf112361de669c22532d269b5871c9b23ca7b694 100644
  48. --- a/services/network/url_loader.cc
  49. +++ b/services/network/url_loader.cc
  50. @@ -338,6 +338,7 @@ URLLoader::URLLoader(
  51. base::WeakPtr<KeepaliveStatisticsRecorder> keepalive_statistics_recorder,
  52. base::WeakPtr<NetworkUsageAccumulator> network_usage_accumulator,
  53. mojom::TrustedURLLoaderHeaderClient* url_loader_header_client,
  54. + mojom::TrustedURLLoaderAuthClient* url_loader_auth_client,
  55. mojom::OriginPolicyManager* origin_policy_manager)
  56. : url_request_context_(url_request_context),
  57. network_service_client_(network_service_client),
  58. @@ -396,6 +397,11 @@ URLLoader::URLLoader(
  59. header_client_.set_disconnect_handler(
  60. base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
  61. }
  62. + if (url_loader_auth_client) {
  63. + url_loader_auth_client->OnLoaderCreated(request_id_, auth_client_.BindNewPipeAndPassReceiver());
  64. + auth_client_.set_disconnect_handler(
  65. + base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
  66. + }
  67. if (want_raw_headers_) {
  68. options_ |= mojom::kURLLoadOptionSendSSLInfoWithResponse |
  69. mojom::kURLLoadOptionSendSSLInfoForCertificateError;
  70. @@ -830,7 +836,7 @@ void URLLoader::OnReceivedRedirect(net::URLRequest* url_request,
  71. void URLLoader::OnAuthRequired(net::URLRequest* url_request,
  72. const net::AuthChallengeInfo& auth_info) {
  73. - if (!network_context_client_) {
  74. + if (!network_context_client_ && !auth_client_) {
  75. OnAuthCredentials(base::nullopt);
  76. return;
  77. }
  78. @@ -846,11 +852,20 @@ void URLLoader::OnAuthRequired(net::URLRequest* url_request,
  79. if (url_request->response_headers())
  80. head->headers = url_request->response_headers();
  81. head->auth_challenge_info = auth_info;
  82. - network_context_client_->OnAuthRequired(
  83. - fetch_window_id_, factory_params_->process_id, render_frame_id_,
  84. - request_id_, url_request_->url(), first_auth_attempt_, auth_info,
  85. - std::move(head),
  86. - auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
  87. +
  88. + if (auth_client_) {
  89. + auth_client_->OnAuthRequired(
  90. + fetch_window_id_, factory_params_->process_id, render_frame_id_,
  91. + request_id_, url_request_->url(), first_auth_attempt_, auth_info,
  92. + std::move(head),
  93. + auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
  94. + } else {
  95. + network_context_client_->OnAuthRequired(
  96. + fetch_window_id_, factory_params_->process_id, render_frame_id_,
  97. + request_id_, url_request_->url(), first_auth_attempt_, auth_info,
  98. + std::move(head),
  99. + auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
  100. + }
  101. auth_challenge_responder_receiver_.set_disconnect_handler(
  102. base::BindOnce(&URLLoader::DeleteSelf, base::Unretained(this)));
  103. diff --git a/services/network/url_loader.h b/services/network/url_loader.h
  104. index 532ecdc0a9b386eb9ea04a480b18aeb1ac32a059..b3ad0f42ab9c2f513d8c4a06683d1af6f0219a56 100644
  105. --- a/services/network/url_loader.h
  106. +++ b/services/network/url_loader.h
  107. @@ -85,6 +85,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) URLLoader
  108. base::WeakPtr<KeepaliveStatisticsRecorder> keepalive_statistics_recorder,
  109. base::WeakPtr<NetworkUsageAccumulator> network_usage_accumulator,
  110. mojom::TrustedURLLoaderHeaderClient* url_loader_header_client,
  111. + mojom::TrustedURLLoaderAuthClient* url_loader_auth_client,
  112. mojom::OriginPolicyManager* origin_policy_manager);
  113. ~URLLoader() override;
  114. @@ -384,6 +385,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) URLLoader
  115. base::Optional<base::UnguessableToken> fetch_window_id_;
  116. mojo::Remote<mojom::TrustedHeaderClient> header_client_;
  117. + mojo::Remote<mojom::TrustedAuthClient> auth_client_;
  118. std::unique_ptr<FileOpenerForUpload> file_opener_for_upload_;
  119. diff --git a/services/network/url_loader_factory.cc b/services/network/url_loader_factory.cc
  120. index 9e9baaf8ecd33e6416027014361edc332ab71e3c..cc2c59828f56988d43b680588d4625d9864aa9b6 100644
  121. --- a/services/network/url_loader_factory.cc
  122. +++ b/services/network/url_loader_factory.cc
  123. @@ -65,6 +65,7 @@ URLLoaderFactory::URLLoaderFactory(
  124. params_(std::move(params)),
  125. resource_scheduler_client_(std::move(resource_scheduler_client)),
  126. header_client_(std::move(params_->header_client)),
  127. + auth_client_(std::move(params_->auth_client)),
  128. cors_url_loader_factory_(cors_url_loader_factory) {
  129. DCHECK(context);
  130. DCHECK_NE(mojom::kInvalidProcessId, params_->process_id);
  131. @@ -207,6 +208,7 @@ void URLLoaderFactory::CreateLoaderAndStart(
  132. resource_scheduler_client_, std::move(keepalive_statistics_recorder),
  133. std::move(network_usage_accumulator),
  134. header_client_.is_bound() ? header_client_.get() : nullptr,
  135. + auth_client_.is_bound() ? auth_client_.get() : nullptr,
  136. context_->origin_policy_manager());
  137. cors_url_loader_factory_->OnLoaderCreated(std::move(loader));
  138. }
  139. diff --git a/services/network/url_loader_factory.h b/services/network/url_loader_factory.h
  140. index 7d13494649c43be52b06774f2cf5763ebe9129c0..d4b19342c44f86c685f700e4260475ff2235b298 100644
  141. --- a/services/network/url_loader_factory.h
  142. +++ b/services/network/url_loader_factory.h
  143. @@ -72,6 +72,7 @@ class URLLoaderFactory : public mojom::URLLoaderFactory {
  144. mojom::URLLoaderFactoryParamsPtr params_;
  145. scoped_refptr<ResourceSchedulerClient> resource_scheduler_client_;
  146. mojo::Remote<mojom::TrustedURLLoaderHeaderClient> header_client_;
  147. + mojo::Remote<mojom::TrustedURLLoaderAuthClient> auth_client_;
  148. // |cors_url_loader_factory_| owns this.
  149. cors::CorsURLLoaderFactory* cors_url_loader_factory_;