add_trustedauthclient_to_urlloaderfactory.patch 7.8 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 ccac671f0e7e56c731cb9bd92bad788271419a7f..cfea0e5dbc28f1a4cdfea36372ce7f34f15c4de7 100644
  12. --- a/services/network/public/mojom/network_context.mojom
  13. +++ b/services/network/public/mojom/network_context.mojom
  14. @@ -214,6 +214,25 @@ struct CTPolicy {
  15. array<string> excluded_legacy_spkis;
  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. @@ -640,6 +659,8 @@ struct URLLoaderFactoryParams {
  40. // impact because of the extra process hops, so use should be minimized.
  41. pending_remote<TrustedURLLoaderHeaderClient>? header_client;
  42. + pending_remote<TrustedURLLoaderAuthClient>? auth_client;
  43. +
  44. // |factory_bound_access_patterns| are used for CORS checks in addition to
  45. // the per-context allow patterns that is managed via NetworkContext
  46. // interface. This still respects the per-context block lists.
  47. diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
  48. index 1fa9021a62385fd5c0dadbb8a4a046cd72039915..2b0e4841d009df2f7bb310efca74d2ff79d29b36 100644
  49. --- a/services/network/url_loader.cc
  50. +++ b/services/network/url_loader.cc
  51. @@ -471,6 +471,7 @@ URLLoader::URLLoader(
  52. base::WeakPtr<KeepaliveStatisticsRecorder> keepalive_statistics_recorder,
  53. base::WeakPtr<NetworkUsageAccumulator> network_usage_accumulator,
  54. mojom::TrustedURLLoaderHeaderClient* url_loader_header_client,
  55. + mojom::TrustedURLLoaderAuthClient* url_loader_auth_client,
  56. mojom::OriginPolicyManager* origin_policy_manager,
  57. std::unique_ptr<TrustTokenRequestHelperFactory> trust_token_helper_factory,
  58. mojo::PendingRemote<mojom::CookieAccessObserver> cookie_observer)
  59. @@ -534,6 +535,11 @@ URLLoader::URLLoader(
  60. header_client_.set_disconnect_handler(
  61. base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
  62. }
  63. + if (url_loader_auth_client) {
  64. + url_loader_auth_client->OnLoaderCreated(request_id_, auth_client_.BindNewPipeAndPassReceiver());
  65. + auth_client_.set_disconnect_handler(
  66. + base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
  67. + }
  68. if (want_raw_headers_) {
  69. options_ |= mojom::kURLLoadOptionSendSSLInfoWithResponse |
  70. mojom::kURLLoadOptionSendSSLInfoForCertificateError;
  71. @@ -1061,7 +1067,7 @@ void URLLoader::OnAuthRequired(net::URLRequest* url_request,
  72. // |this| may have been deleted.
  73. return;
  74. }
  75. - if (!network_context_client_) {
  76. + if (!network_context_client_ && !auth_client_) {
  77. OnAuthCredentials(base::nullopt);
  78. return;
  79. }
  80. @@ -1077,11 +1083,20 @@ void URLLoader::OnAuthRequired(net::URLRequest* url_request,
  81. if (url_request->response_headers())
  82. head->headers = url_request->response_headers();
  83. head->auth_challenge_info = auth_info;
  84. - network_context_client_->OnAuthRequired(
  85. - fetch_window_id_, factory_params_->process_id, render_frame_id_,
  86. - request_id_, url_request_->url(), first_auth_attempt_, auth_info,
  87. - std::move(head),
  88. - auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
  89. +
  90. + if (auth_client_) {
  91. + auth_client_->OnAuthRequired(
  92. + fetch_window_id_, factory_params_->process_id, render_frame_id_,
  93. + request_id_, url_request_->url(), first_auth_attempt_, auth_info,
  94. + std::move(head),
  95. + auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
  96. + } else {
  97. + network_context_client_->OnAuthRequired(
  98. + fetch_window_id_, factory_params_->process_id, render_frame_id_,
  99. + request_id_, url_request_->url(), first_auth_attempt_, auth_info,
  100. + std::move(head),
  101. + auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
  102. + }
  103. auth_challenge_responder_receiver_.set_disconnect_handler(
  104. base::BindOnce(&URLLoader::DeleteSelf, base::Unretained(this)));
  105. diff --git a/services/network/url_loader.h b/services/network/url_loader.h
  106. index 1c8a9ce4ba5f41cb7a4d415337ff087894fee3df..1ea5d86177ff568a13e3d10767316ae496298d10 100644
  107. --- a/services/network/url_loader.h
  108. +++ b/services/network/url_loader.h
  109. @@ -115,6 +115,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) URLLoader
  110. base::WeakPtr<KeepaliveStatisticsRecorder> keepalive_statistics_recorder,
  111. base::WeakPtr<NetworkUsageAccumulator> network_usage_accumulator,
  112. mojom::TrustedURLLoaderHeaderClient* url_loader_header_client,
  113. + mojom::TrustedURLLoaderAuthClient* url_loader_auth_client,
  114. mojom::OriginPolicyManager* origin_policy_manager,
  115. std::unique_ptr<TrustTokenRequestHelperFactory>
  116. trust_token_helper_factory,
  117. @@ -456,6 +457,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) URLLoader
  118. base::Optional<base::UnguessableToken> fetch_window_id_;
  119. mojo::Remote<mojom::TrustedHeaderClient> header_client_;
  120. + mojo::Remote<mojom::TrustedAuthClient> auth_client_;
  121. std::unique_ptr<FileOpenerForUpload> file_opener_for_upload_;
  122. diff --git a/services/network/url_loader_factory.cc b/services/network/url_loader_factory.cc
  123. index 75ae8488efa7e5acfda0b21029657b525fa95f86..5dce71ee5efc97f9f63d0b5f236dccdfb05cfc79 100644
  124. --- a/services/network/url_loader_factory.cc
  125. +++ b/services/network/url_loader_factory.cc
  126. @@ -75,6 +75,7 @@ URLLoaderFactory::URLLoaderFactory(
  127. resource_scheduler_client_(std::move(resource_scheduler_client)),
  128. header_client_(std::move(params_->header_client)),
  129. coep_reporter_(std::move(params_->coep_reporter)),
  130. + auth_client_(std::move(params_->auth_client)),
  131. cors_url_loader_factory_(cors_url_loader_factory),
  132. cookie_observer_(std::move(params_->cookie_observer)) {
  133. DCHECK(context);
  134. @@ -254,6 +255,7 @@ void URLLoaderFactory::CreateLoaderAndStart(
  135. std::move(keepalive_statistics_recorder),
  136. std::move(network_usage_accumulator),
  137. header_client_.is_bound() ? header_client_.get() : nullptr,
  138. + auth_client_.is_bound() ? auth_client_.get() : nullptr,
  139. context_->origin_policy_manager(), std::move(trust_token_factory),
  140. std::move(cookie_observer));
  141. diff --git a/services/network/url_loader_factory.h b/services/network/url_loader_factory.h
  142. index 8b29b67a5b0663778df3169e09bf818e6bbcec3f..e504fa3d41066907a3fbc41e69daac968415dfa6 100644
  143. --- a/services/network/url_loader_factory.h
  144. +++ b/services/network/url_loader_factory.h
  145. @@ -75,6 +75,7 @@ class URLLoaderFactory : public mojom::URLLoaderFactory {
  146. scoped_refptr<ResourceSchedulerClient> resource_scheduler_client_;
  147. mojo::Remote<mojom::TrustedURLLoaderHeaderClient> header_client_;
  148. mojo::Remote<mojom::CrossOriginEmbedderPolicyReporter> coep_reporter_;
  149. + mojo::Remote<mojom::TrustedURLLoaderAuthClient> auth_client_;
  150. // |cors_url_loader_factory_| owns this.
  151. cors::CorsURLLoaderFactory* cors_url_loader_factory_;