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 6d15b6b5ff7b36b85f6b8200b76a32b285f0e675..c21234572976a6de7db5b0f2f7f44ec770832178 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 80dc1f91fd4051dc054f1c9e9a5ab0087c4d66fd..4eec90182ae4944f219e12ff2673d0fbd24e112d 100644
  49. --- a/services/network/url_loader.cc
  50. +++ b/services/network/url_loader.cc
  51. @@ -437,6 +437,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. @@ -497,6 +498,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. @@ -1016,7 +1022,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. @@ -1032,11 +1038,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 f5436f10a312c713e95fac4670eab3edf048a742..02212de14459ee6cd15492e7b35cd2791f48205c 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 c8f02a3760f938c772c9e81afff8b37e49a73cbd..7e5bb5d1384488de2dee3672f933eba643dc14f7 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. @@ -270,6 +271,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_;