Commit c44992ab authored by John Abd-El-Malek's avatar John Abd-El-Malek

Fix Reporting API permission checks with network service.

Bug: 845559
Cq-Include-Trybots: luci.chromium.try:linux_mojo
Change-Id: Ibcaa434f5ffb1c43363190d4030ddb70f9449bf9
Reviewed-on: https://chromium-review.googlesource.com/1213275
Commit-Queue: John Abd-El-Malek <jam@chromium.org>
Reviewed-by: default avatarRobert Sesek <rsesek@chromium.org>
Cr-Commit-Position: refs/heads/master@{#589953}
parent 059c98bc
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include "content/public/browser/indexed_db_context.h" #include "content/public/browser/indexed_db_context.h"
#include "content/public/browser/local_storage_usage_info.h" #include "content/public/browser/local_storage_usage_info.h"
#include "content/public/browser/network_service_instance.h" #include "content/public/browser/network_service_instance.h"
#include "content/public/browser/permission_controller.h"
#include "content/public/browser/session_storage_usage_info.h" #include "content/public/browser/session_storage_usage_info.h"
#include "content/public/common/content_client.h" #include "content/public/common/content_client.h"
#include "content/public/common/content_features.h" #include "content/public/common/content_features.h"
...@@ -494,6 +495,7 @@ StoragePartitionImpl::StoragePartitionImpl( ...@@ -494,6 +495,7 @@ StoragePartitionImpl::StoragePartitionImpl(
storage::SpecialStoragePolicy* special_storage_policy) storage::SpecialStoragePolicy* special_storage_policy)
: partition_path_(partition_path), : partition_path_(partition_path),
special_storage_policy_(special_storage_policy), special_storage_policy_(special_storage_policy),
network_context_client_binding_(this),
browser_context_(browser_context), browser_context_(browser_context),
deletion_helpers_running_(0), deletion_helpers_running_(0),
weak_factory_(this) {} weak_factory_(this) {}
...@@ -875,6 +877,26 @@ void StoragePartitionImpl::OpenSessionStorage( ...@@ -875,6 +877,26 @@ void StoragePartitionImpl::OpenSessionStorage(
std::move(request)); std::move(request));
} }
void StoragePartitionImpl::OnCanSendReportingReports(
const std::vector<url::Origin>& origins,
OnCanSendReportingReportsCallback callback) {
PermissionController* permission_controller =
BrowserContext::GetPermissionController(browser_context_);
DCHECK(permission_controller);
std::vector<url::Origin> origins_out;
for (auto& origin : origins) {
GURL origin_url = origin.GetURL();
bool allowed = permission_controller->GetPermissionStatus(
PermissionType::BACKGROUND_SYNC, origin_url,
origin_url) == blink::mojom::PermissionStatus::GRANTED;
if (allowed)
origins_out.push_back(origin);
}
std::move(callback).Run(origins_out);
}
void StoragePartitionImpl::ClearDataImpl( void StoragePartitionImpl::ClearDataImpl(
uint32_t remove_mask, uint32_t remove_mask,
uint32_t quota_storage_remove_mask, uint32_t quota_storage_remove_mask,
...@@ -1281,6 +1303,10 @@ void StoragePartitionImpl::InitNetworkContext() { ...@@ -1281,6 +1303,10 @@ void StoragePartitionImpl::InitNetworkContext() {
base::Unretained(network_context_owner_.get()), base::Unretained(network_context_owner_.get()),
MakeRequest(&network_context_), url_request_context_)); MakeRequest(&network_context_), url_request_context_));
} }
network::mojom::NetworkContextClientPtr client_ptr;
network_context_client_binding_.Close();
network_context_client_binding_.Bind(mojo::MakeRequest(&client_ptr));
network_context_->SetClient(std::move(client_ptr));
network_context_.set_connection_error_handler(base::BindOnce( network_context_.set_connection_error_handler(base::BindOnce(
&StoragePartitionImpl::InitNetworkContext, weak_factory_.GetWeakPtr())); &StoragePartitionImpl::InitNetworkContext, weak_factory_.GetWeakPtr()));
} }
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include "content/public/browser/storage_partition.h" #include "content/public/browser/storage_partition.h"
#include "mojo/public/cpp/bindings/binding_set.h" #include "mojo/public/cpp/bindings/binding_set.h"
#include "services/network/public/mojom/cookie_manager.mojom.h" #include "services/network/public/mojom/cookie_manager.mojom.h"
#include "services/network/public/mojom/network_context.mojom.h"
#include "services/network/public/mojom/network_service.mojom.h" #include "services/network/public/mojom/network_service.mojom.h"
#include "storage/browser/quota/special_storage_policy.h" #include "storage/browser/quota/special_storage_policy.h"
#include "third_party/blink/public/mojom/dom_storage/storage_partition_service.mojom.h" #include "third_party/blink/public/mojom/dom_storage/storage_partition_service.mojom.h"
...@@ -53,7 +54,8 @@ class GeneratedCodeCacheContext; ...@@ -53,7 +54,8 @@ class GeneratedCodeCacheContext;
class CONTENT_EXPORT StoragePartitionImpl class CONTENT_EXPORT StoragePartitionImpl
: public StoragePartition, : public StoragePartition,
public blink::mojom::StoragePartitionService { public blink::mojom::StoragePartitionService,
public network::mojom::NetworkContextClient {
public: public:
// It is guaranteed that storage partitions are destructed before the // It is guaranteed that storage partitions are destructed before the
// browser context starts shutting down its corresponding IO thread residents // browser context starts shutting down its corresponding IO thread residents
...@@ -152,6 +154,11 @@ class CONTENT_EXPORT StoragePartitionImpl ...@@ -152,6 +154,11 @@ class CONTENT_EXPORT StoragePartitionImpl
const std::string& namespace_id, const std::string& namespace_id,
blink::mojom::SessionStorageNamespaceRequest request) override; blink::mojom::SessionStorageNamespaceRequest request) override;
// network::mojom::NetworkContextClient interface.
void OnCanSendReportingReports(
const std::vector<url::Origin>& origins,
OnCanSendReportingReportsCallback callback) override;
scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter() { scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter() {
return url_loader_factory_getter_; return url_loader_factory_getter_;
} }
...@@ -332,6 +339,9 @@ class CONTENT_EXPORT StoragePartitionImpl ...@@ -332,6 +339,9 @@ class CONTENT_EXPORT StoragePartitionImpl
// by |network_context_owner_|. // by |network_context_owner_|.
network::mojom::NetworkContextPtr network_context_; network::mojom::NetworkContextPtr network_context_;
mojo::Binding<network::mojom::NetworkContextClient>
network_context_client_binding_;
scoped_refptr<URLLoaderFactoryForBrowserProcess> scoped_refptr<URLLoaderFactoryForBrowserProcess>
shared_url_loader_factory_for_browser_process_; shared_url_loader_factory_for_browser_process_;
......
...@@ -524,6 +524,10 @@ void NetworkContext::CreateURLLoaderFactory( ...@@ -524,6 +524,10 @@ void NetworkContext::CreateURLLoaderFactory(
std::move(request), nullptr)); std::move(request), nullptr));
} }
void NetworkContext::SetClient(mojom::NetworkContextClientPtr client) {
client_ = std::move(client);
}
void NetworkContext::CreateURLLoaderFactory( void NetworkContext::CreateURLLoaderFactory(
mojom::URLLoaderFactoryRequest request, mojom::URLLoaderFactoryRequest request,
mojom::URLLoaderFactoryParamsPtr params) { mojom::URLLoaderFactoryParamsPtr params) {
......
...@@ -128,6 +128,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext ...@@ -128,6 +128,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext
NetworkService* network_service() { return network_service_; } NetworkService* network_service() { return network_service_; }
mojom::NetworkContextClient* client() { return client_.get(); }
ResourceScheduler* resource_scheduler() { return resource_scheduler_.get(); } ResourceScheduler* resource_scheduler() { return resource_scheduler_.get(); }
CookieManager* cookie_manager() { return cookie_manager_.get(); } CookieManager* cookie_manager() { return cookie_manager_.get(); }
...@@ -141,6 +143,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext ...@@ -141,6 +143,7 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext
scoped_refptr<ResourceSchedulerClient> resource_scheduler_client); scoped_refptr<ResourceSchedulerClient> resource_scheduler_client);
// mojom::NetworkContext implementation: // mojom::NetworkContext implementation:
void SetClient(mojom::NetworkContextClientPtr client) override;
void CreateURLLoaderFactory(mojom::URLLoaderFactoryRequest request, void CreateURLLoaderFactory(mojom::URLLoaderFactoryRequest request,
mojom::URLLoaderFactoryParamsPtr params) override; mojom::URLLoaderFactoryParamsPtr params) override;
void GetCookieManager(mojom::CookieManagerRequest request) override; void GetCookieManager(mojom::CookieManagerRequest request) override;
...@@ -297,6 +300,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext ...@@ -297,6 +300,8 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkContext
NetworkService* const network_service_; NetworkService* const network_service_;
mojom::NetworkContextClientPtr client_;
std::unique_ptr<ResourceScheduler> resource_scheduler_; std::unique_ptr<ResourceScheduler> resource_scheduler_;
// Holds owning pointer to |url_request_context_|. Will contain a nullptr for // Holds owning pointer to |url_request_context_|. Will contain a nullptr for
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "services/network/network_service_network_delegate.h" #include "services/network/network_service_network_delegate.h"
#include "services/network/cookie_manager.h"
#include "services/network/network_context.h" #include "services/network/network_context.h"
#include "services/network/network_service.h" #include "services/network/network_service.h"
#include "services/network/public/cpp/features.h" #include "services/network/public/cpp/features.h"
...@@ -77,34 +78,44 @@ bool NetworkServiceNetworkDelegate::OnCanAccessFile( ...@@ -77,34 +78,44 @@ bool NetworkServiceNetworkDelegate::OnCanAccessFile(
bool NetworkServiceNetworkDelegate::OnCanQueueReportingReport( bool NetworkServiceNetworkDelegate::OnCanQueueReportingReport(
const url::Origin& origin) const { const url::Origin& origin) const {
// TODO(crbug.com/845559): Disable all Reporting uploads until we can perform return network_context_->cookie_manager()
// a BACKGROUND_SYNC permissions check across service boundaries. ->cookie_settings()
return false; .IsCookieAccessAllowed(origin.GetURL(), origin.GetURL());
} }
void NetworkServiceNetworkDelegate::OnCanSendReportingReports( void NetworkServiceNetworkDelegate::OnCanSendReportingReports(
std::set<url::Origin> origins, std::set<url::Origin> origins,
base::OnceCallback<void(std::set<url::Origin>)> result_callback) const { base::OnceCallback<void(std::set<url::Origin>)> result_callback) const {
// TODO(crbug.com/845559): Disable all Reporting uploads until we can perform auto* client = network_context_->client();
// a BACKGROUND_SYNC permissions check across service boundaries. if (!client) {
origins.clear(); origins.clear();
std::move(result_callback).Run(std::move(origins)); std::move(result_callback).Run(std::move(origins));
return;
}
std::vector<url::Origin> origin_vector;
std::copy(origins.begin(), origins.end(), std::back_inserter(origin_vector));
client->OnCanSendReportingReports(
origin_vector,
base::BindOnce(
&NetworkServiceNetworkDelegate::FinishedCanSendReportingReports,
weak_ptr_factory_.GetWeakPtr(), std::move(result_callback)));
} }
bool NetworkServiceNetworkDelegate::OnCanSetReportingClient( bool NetworkServiceNetworkDelegate::OnCanSetReportingClient(
const url::Origin& origin, const url::Origin& origin,
const GURL& endpoint) const { const GURL& endpoint) const {
// TODO(crbug.com/845559): Disable all Reporting uploads until we can perform return network_context_->cookie_manager()
// a BACKGROUND_SYNC permissions check across service boundaries. ->cookie_settings()
return false; .IsCookieAccessAllowed(origin.GetURL(), origin.GetURL());
} }
bool NetworkServiceNetworkDelegate::OnCanUseReportingClient( bool NetworkServiceNetworkDelegate::OnCanUseReportingClient(
const url::Origin& origin, const url::Origin& origin,
const GURL& endpoint) const { const GURL& endpoint) const {
// TODO(crbug.com/845559): Disable all Reporting uploads until we can perform return network_context_->cookie_manager()
// a BACKGROUND_SYNC permissions check across service boundaries. ->cookie_settings()
return false; .IsCookieAccessAllowed(origin.GetURL(), origin.GetURL());
} }
int NetworkServiceNetworkDelegate::HandleClearSiteDataHeader( int NetworkServiceNetworkDelegate::HandleClearSiteDataHeader(
...@@ -143,4 +154,11 @@ void NetworkServiceNetworkDelegate::FinishedClearSiteData( ...@@ -143,4 +154,11 @@ void NetworkServiceNetworkDelegate::FinishedClearSiteData(
std::move(callback).Run(net::OK); std::move(callback).Run(net::OK);
} }
void NetworkServiceNetworkDelegate::FinishedCanSendReportingReports(
base::OnceCallback<void(std::set<url::Origin>)> result_callback,
const std::vector<url::Origin>& origins) {
std::set<url::Origin> origin_set(origins.begin(), origins.end());
std::move(result_callback).Run(origin_set);
}
} // namespace network } // namespace network
...@@ -55,10 +55,13 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkServiceNetworkDelegate ...@@ -55,10 +55,13 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkServiceNetworkDelegate
void FinishedClearSiteData(base::WeakPtr<net::URLRequest> request, void FinishedClearSiteData(base::WeakPtr<net::URLRequest> request,
net::CompletionOnceCallback callback); net::CompletionOnceCallback callback);
void FinishedCanSendReportingReports(
base::OnceCallback<void(std::set<url::Origin>)> result_callback,
const std::vector<url::Origin>& origins);
NetworkContext* network_context_; NetworkContext* network_context_;
base::WeakPtrFactory<NetworkServiceNetworkDelegate> weak_ptr_factory_; mutable base::WeakPtrFactory<NetworkServiceNetworkDelegate> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(NetworkServiceNetworkDelegate); DISALLOW_COPY_AND_ASSIGN(NetworkServiceNetworkDelegate);
}; };
......
...@@ -330,9 +330,22 @@ struct URLLoaderFactoryParams { ...@@ -330,9 +330,22 @@ struct URLLoaderFactoryParams {
bool disable_web_security = false; bool disable_web_security = false;
}; };
// Callback interface for NetworkContext when routing identifiers aren't
// available. Otherwise generally callbacks from the network service go on
// NetworkServiceClient.
interface NetworkContextClient {
// Checks if network error reports could be sent for the given origins.
// Replies with the origins that are allowed.
OnCanSendReportingReports(array<url.mojom.Origin> origins) =>
(array<url.mojom.Origin> origins);
};
// Represents a distinct context for making network requests, with its own // Represents a distinct context for making network requests, with its own
// storage (e.g. cookies and cache). // storage (e.g. cookies and cache).
interface NetworkContext { interface NetworkContext {
// Sets a client for this network context.
SetClient(NetworkContextClient client);
// Creates a new URLLoaderFactory with the given |params|. // Creates a new URLLoaderFactory with the given |params|.
CreateURLLoaderFactory(URLLoaderFactory& url_loader_factory, CreateURLLoaderFactory(URLLoaderFactory& url_loader_factory,
URLLoaderFactoryParams params); URLLoaderFactoryParams params);
......
...@@ -35,6 +35,7 @@ class TestNetworkContext : public mojom::NetworkContext { ...@@ -35,6 +35,7 @@ class TestNetworkContext : public mojom::NetworkContext {
TestNetworkContext() = default; TestNetworkContext() = default;
~TestNetworkContext() override = default; ~TestNetworkContext() override = default;
void SetClient(mojom::NetworkContextClientPtr client) override {}
void CreateURLLoaderFactory( void CreateURLLoaderFactory(
mojom::URLLoaderFactoryRequest request, mojom::URLLoaderFactoryRequest request,
mojom::URLLoaderFactoryParamsPtr params) override {} mojom::URLLoaderFactoryParamsPtr params) override {}
......
...@@ -107,11 +107,6 @@ ...@@ -107,11 +107,6 @@
-NativeBindings/ExternallyConnectableMessagingTest.WebConnectableWithNonEmptyTlsChannelId/0 -NativeBindings/ExternallyConnectableMessagingTest.WebConnectableWithNonEmptyTlsChannelId/0
-NativeBindings/MessagingApiTest.DifferentStoragePartitionTLSChannelID/0 -NativeBindings/MessagingApiTest.DifferentStoragePartitionTLSChannelID/0
# https://crbug.com/845559
# Reporting needs to check BACKGROUND_SYNC permission before uploading reports
# about an origin.
-ReportingBrowserTest.TestReportingHeadersProcessed
# https://crbug.com/721403 # https://crbug.com/721403
-ContextMenuBrowserTest.DataSaverOpenOrigImageInNewTab -ContextMenuBrowserTest.DataSaverOpenOrigImageInNewTab
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment