add_trustedauthclient_to_urlloaderfactory.patch 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
  2. From: deepak1556 <[email protected]>
  3. Date: Wed, 27 Jan 2021 15:20:01 -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 b35746e2850d7d724fcf3dc09ddbfea1ca56a746..491172c51c2d196573f2e835f7b81df30a33cf2f 100644
  12. --- a/services/network/public/mojom/network_context.mojom
  13. +++ b/services/network/public/mojom/network_context.mojom
  14. @@ -192,6 +192,26 @@ 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. +
  30. +interface TrustedURLLoaderAuthClient {
  31. + // When a new URLLoader is created, this will be called to pass a
  32. + // corresponding |auth_client|.
  33. + OnLoaderCreated(int32 request_id,
  34. + pending_receiver<TrustedAuthClient> auth_client);
  35. +};
  36. +
  37. interface CertVerifierClient {
  38. Verify(
  39. int32 default_error,
  40. @@ -606,6 +626,8 @@ struct URLLoaderFactoryParams {
  41. // impact because of the extra process hops, so use should be minimized.
  42. pending_remote<TrustedURLLoaderHeaderClient>? header_client;
  43. + pending_remote<TrustedURLLoaderAuthClient>? auth_client;
  44. +
  45. // Information used restrict access to identity information (like SameSite
  46. // cookies) and to shard network resources, like the cache. If set, takes
  47. // precedence over ResourceRequest::TrustedParams::IsolationInfo field
  48. diff --git a/services/network/url_loader.cc b/services/network/url_loader.cc
  49. index 136c4ec48412354cbc3d77880dd34ec836694004..f484bb54c59866d13e532cd81ed28ad9f982549a 100644
  50. --- a/services/network/url_loader.cc
  51. +++ b/services/network/url_loader.cc
  52. @@ -465,6 +465,7 @@ URLLoader::URLLoader(
  53. scoped_refptr<ResourceSchedulerClient> resource_scheduler_client,
  54. base::WeakPtr<KeepaliveStatisticsRecorder> keepalive_statistics_recorder,
  55. mojom::TrustedURLLoaderHeaderClient* url_loader_header_client,
  56. + mojom::TrustedURLLoaderAuthClient* url_loader_auth_client,
  57. mojom::OriginPolicyManager* origin_policy_manager,
  58. std::unique_ptr<TrustTokenRequestHelperFactory> trust_token_helper_factory,
  59. const cors::OriginAccessList& origin_access_list,
  60. @@ -533,6 +534,11 @@ URLLoader::URLLoader(
  61. header_client_.set_disconnect_handler(
  62. base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
  63. }
  64. + if (url_loader_auth_client) {
  65. + url_loader_auth_client->OnLoaderCreated(request_id_, auth_client_.BindNewPipeAndPassReceiver());
  66. + auth_client_.set_disconnect_handler(
  67. + base::BindOnce(&URLLoader::OnMojoDisconnect, base::Unretained(this)));
  68. + }
  69. if (want_raw_headers_) {
  70. options_ |= mojom::kURLLoadOptionSendSSLInfoWithResponse |
  71. mojom::kURLLoadOptionSendSSLInfoForCertificateError;
  72. @@ -1198,7 +1204,7 @@ void URLLoader::OnAuthRequired(net::URLRequest* url_request,
  73. return;
  74. }
  75. auto* url_loader_network_observer = GetURLLoaderNetworkServiceObserver();
  76. - if (!url_loader_network_observer) {
  77. + if (!url_loader_network_observer && !auth_client_) {
  78. OnAuthCredentials(base::nullopt);
  79. return;
  80. }
  81. @@ -1210,10 +1216,22 @@ void URLLoader::OnAuthRequired(net::URLRequest* url_request,
  82. DCHECK(!auth_challenge_responder_receiver_.is_bound());
  83. - url_loader_network_observer->OnAuthRequired(
  84. - fetch_window_id_, request_id_, url_request_->url(), first_auth_attempt_,
  85. - auth_info, url_request->response_headers(),
  86. - auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
  87. + auto head = mojom::URLResponseHead::New();
  88. + if (url_request->response_headers())
  89. + head->headers = url_request->response_headers();
  90. + head->auth_challenge_info = auth_info;
  91. + if (auth_client_) {
  92. + auth_client_->OnAuthRequired(
  93. + fetch_window_id_, factory_params_->process_id, render_frame_id_,
  94. + request_id_, url_request_->url(), first_auth_attempt_, auth_info,
  95. + std::move(head),
  96. + auth_challenge_responder_receiver_.BindNewPipeAndPassRemote());
  97. + } else {
  98. + url_loader_network_observer->OnAuthRequired(
  99. + fetch_window_id_, request_id_, url_request_->url(), first_auth_attempt_,
  100. + auth_info, url_request->response_headers(),
  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 f8c6112335ea43912485e76ec48d28b8609fab83..25c17fc78a03ba6a0b1a399e22bbba827e2275fb 100644
  107. --- a/services/network/url_loader.h
  108. +++ b/services/network/url_loader.h
  109. @@ -128,6 +128,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) URLLoader
  110. scoped_refptr<ResourceSchedulerClient> resource_scheduler_client,
  111. base::WeakPtr<KeepaliveStatisticsRecorder> keepalive_statistics_recorder,
  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. @@ -517,6 +518,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 766d343375c24c5746fb442370b544a8cf76d58f..627efb08ed0974f0c7672085e46996048af8c244 100644
  124. --- a/services/network/url_loader_factory.cc
  125. +++ b/services/network/url_loader_factory.cc
  126. @@ -76,6 +76,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. url_loader_network_service_observer_(
  134. @@ -279,6 +280,7 @@ void URLLoaderFactory::CreateLoaderAndStart(
  135. context_->require_network_isolation_key(), resource_scheduler_client_,
  136. std::move(keepalive_statistics_recorder),
  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. context_->cors_origin_access_list(), std::move(cookie_observer),
  141. std::move(url_loader_network_observer), std::move(devtools_observer));
  142. diff --git a/services/network/url_loader_factory.h b/services/network/url_loader_factory.h
  143. index f0e423b245026a06161ab922c1aed44c9152e40a..ebce1dae5a0bceeff8e77595d4cb57166c1d236f 100644
  144. --- a/services/network/url_loader_factory.h
  145. +++ b/services/network/url_loader_factory.h
  146. @@ -79,6 +79,7 @@ class URLLoaderFactory : public mojom::URLLoaderFactory {
  147. scoped_refptr<ResourceSchedulerClient> resource_scheduler_client_;
  148. mojo::Remote<mojom::TrustedURLLoaderHeaderClient> header_client_;
  149. mojo::Remote<mojom::CrossOriginEmbedderPolicyReporter> coep_reporter_;
  150. + mojo::Remote<mojom::TrustedURLLoaderAuthClient> auth_client_;
  151. // |cors_url_loader_factory_| owns this.
  152. cors::CorsURLLoaderFactory* cors_url_loader_factory_;