Commit 8420d58c authored by Clark DuVall's avatar Clark DuVall Committed by Commit Bot

Unify ChromeNetworkDelegate and NetworkServiceNetworkDelegate cookie logic

This was suggested in crbug.com/789636 so this logic can run in
production before the launch of the network service.

Had to keep the tab notification logic in each delegate, since the
way NetworkServiceNetworkDelegate maps the request back to the
original tab (using the URLLoader set as user data on the request)
does not work if network service is disabled.

Bug: 789636, 789632
Cq-Include-Trybots: luci.chromium.try:ios-simulator-full-configs;luci.chromium.try:linux_mojo;master.tryserver.chromium.android:android_cronet_tester;master.tryserver.chromium.mac:ios-simulator-cronet
Change-Id: I22395f914639d8ce83457a63062927e876caeaa9
Reviewed-on: https://chromium-review.googlesource.com/1113903Reviewed-by: default avatarMatt Menke <mmenke@chromium.org>
Reviewed-by: default avatarJohn Abd-El-Malek <jam@chromium.org>
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#570877}
parent d665ffc9
...@@ -89,15 +89,19 @@ int AwNetworkDelegate::OnHeadersReceived( ...@@ -89,15 +89,19 @@ int AwNetworkDelegate::OnHeadersReceived(
} }
bool AwNetworkDelegate::OnCanGetCookies(const net::URLRequest& request, bool AwNetworkDelegate::OnCanGetCookies(const net::URLRequest& request,
const net::CookieList& cookie_list) { const net::CookieList& cookie_list,
return AwCookieAccessPolicy::GetInstance()->OnCanGetCookies(request, bool allow_from_caller) {
return allow_from_caller &&
AwCookieAccessPolicy::GetInstance()->OnCanGetCookies(request,
cookie_list); cookie_list);
} }
bool AwNetworkDelegate::OnCanSetCookie(const net::URLRequest& request, bool AwNetworkDelegate::OnCanSetCookie(const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) { net::CookieOptions* options,
return AwCookieAccessPolicy::GetInstance()->OnCanSetCookie(request, cookie, bool allow_from_caller) {
return allow_from_caller &&
AwCookieAccessPolicy::GetInstance()->OnCanSetCookie(request, cookie,
options); options);
} }
......
...@@ -34,10 +34,12 @@ class AwNetworkDelegate : public net::NetworkDelegateImpl { ...@@ -34,10 +34,12 @@ class AwNetworkDelegate : public net::NetworkDelegateImpl {
scoped_refptr<net::HttpResponseHeaders>* override_response_headers, scoped_refptr<net::HttpResponseHeaders>* override_response_headers,
GURL* allowed_unsafe_redirect_url) override; GURL* allowed_unsafe_redirect_url) override;
bool OnCanGetCookies(const net::URLRequest& request, bool OnCanGetCookies(const net::URLRequest& request,
const net::CookieList& cookie_list) override; const net::CookieList& cookie_list,
bool allow_from_caller) override;
bool OnCanSetCookie(const net::URLRequest& request, bool OnCanSetCookie(const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) override; net::CookieOptions* options,
bool allow_from_caller) override;
bool OnCanAccessFile(const net::URLRequest& request, bool OnCanAccessFile(const net::URLRequest& request,
const base::FilePath& original_path, const base::FilePath& original_path,
const base::FilePath& absolute_path) const override; const base::FilePath& absolute_path) const override;
......
...@@ -73,8 +73,9 @@ const char* InterceptDownloadResourceThrottle::GetNameForLogging() const { ...@@ -73,8 +73,9 @@ const char* InterceptDownloadResourceThrottle::GetNameForLogging() const {
void InterceptDownloadResourceThrottle::CheckCookiePolicy( void InterceptDownloadResourceThrottle::CheckCookiePolicy(
const net::CookieList& cookie_list) { const net::CookieList& cookie_list) {
DownloadInfo info(request_); DownloadInfo info(request_);
if (request_->context()->network_delegate()->CanGetCookies(*request_, if (request_->context()->network_delegate()->CanGetCookies(
cookie_list)) { *request_, cookie_list,
/*allowed_from_caller=*/true)) {
std::string cookie = net::CanonicalCookie::BuildCookieLine(cookie_list); std::string cookie = net::CanonicalCookie::BuildCookieLine(cookie_list);
if (!cookie.empty()) if (!cookie.empty())
info.cookie = cookie; info.cookie = cookie;
......
...@@ -357,48 +357,35 @@ ChromeNetworkDelegate::OnAuthRequired(net::URLRequest* request, ...@@ -357,48 +357,35 @@ ChromeNetworkDelegate::OnAuthRequired(net::URLRequest* request,
request, auth_info, std::move(callback), credentials); request, auth_info, std::move(callback), credentials);
} }
bool ChromeNetworkDelegate::OnCanGetCookies( bool ChromeNetworkDelegate::OnCanGetCookies(const net::URLRequest& request,
const net::URLRequest& request, const net::CookieList& cookie_list,
const net::CookieList& cookie_list) { bool allowed_from_caller) {
// nullptr during tests, or when we're running in the system context.
if (!cookie_settings_.get())
return true;
bool allow = cookie_settings_->IsCookieAccessAllowed(
request.url(), request.site_for_cookies());
const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(&request); const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(&request);
if (info) { if (info) {
BrowserThread::PostTask( BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE, BrowserThread::UI, FROM_HERE,
base::BindOnce(&TabSpecificContentSettings::CookiesRead, base::BindOnce(&TabSpecificContentSettings::CookiesRead,
info->GetWebContentsGetterForRequest(), request.url(), info->GetWebContentsGetterForRequest(), request.url(),
request.site_for_cookies(), cookie_list, !allow)); request.site_for_cookies(), cookie_list,
!allowed_from_caller));
} }
return allowed_from_caller;
return allow;
} }
bool ChromeNetworkDelegate::OnCanSetCookie(const net::URLRequest& request, bool ChromeNetworkDelegate::OnCanSetCookie(const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) { net::CookieOptions* options,
// nullptr during tests, or when we're running in the system context. bool allowed_from_caller) {
if (!cookie_settings_.get())
return true;
bool allow = cookie_settings_->IsCookieAccessAllowed(
request.url(), request.site_for_cookies());
const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(&request); const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(&request);
if (info) { if (info) {
BrowserThread::PostTask( BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE, BrowserThread::UI, FROM_HERE,
base::BindOnce(&TabSpecificContentSettings::CookieChanged, base::BindOnce(&TabSpecificContentSettings::CookieChanged,
info->GetWebContentsGetterForRequest(), request.url(), info->GetWebContentsGetterForRequest(), request.url(),
request.site_for_cookies(), cookie, !allow)); request.site_for_cookies(), cookie,
!allowed_from_caller));
} }
return allowed_from_caller;
return allow;
} }
bool ChromeNetworkDelegate::OnCanAccessFile( bool ChromeNetworkDelegate::OnCanAccessFile(
...@@ -437,16 +424,6 @@ void ChromeNetworkDelegate::EnableAccessToAllFilesForTesting(bool enabled) { ...@@ -437,16 +424,6 @@ void ChromeNetworkDelegate::EnableAccessToAllFilesForTesting(bool enabled) {
g_access_to_all_files_enabled = enabled; g_access_to_all_files_enabled = enabled;
} }
bool ChromeNetworkDelegate::OnCanEnablePrivacyMode(
const GURL& url,
const GURL& site_for_cookies) const {
// nullptr during tests, or when we're running in the system context.
if (!cookie_settings_.get())
return false;
return !cookie_settings_->IsCookieAccessAllowed(url, site_for_cookies);
}
bool ChromeNetworkDelegate::OnAreExperimentalCookieFeaturesEnabled() const { bool ChromeNetworkDelegate::OnAreExperimentalCookieFeaturesEnabled() const {
return experimental_web_platform_features_enabled_; return experimental_web_platform_features_enabled_;
} }
......
...@@ -180,15 +180,15 @@ class ChromeNetworkDelegate : public net::NetworkDelegateImpl { ...@@ -180,15 +180,15 @@ class ChromeNetworkDelegate : public net::NetworkDelegateImpl {
AuthCallback callback, AuthCallback callback,
net::AuthCredentials* credentials) override; net::AuthCredentials* credentials) override;
bool OnCanGetCookies(const net::URLRequest& request, bool OnCanGetCookies(const net::URLRequest& request,
const net::CookieList& cookie_list) override; const net::CookieList& cookie_list,
bool allowed_from_caller) override;
bool OnCanSetCookie(const net::URLRequest& request, bool OnCanSetCookie(const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) override; net::CookieOptions* options,
bool allowed_from_caller) override;
bool OnCanAccessFile(const net::URLRequest& request, bool OnCanAccessFile(const net::URLRequest& request,
const base::FilePath& original_path, const base::FilePath& original_path,
const base::FilePath& absolute_path) const override; const base::FilePath& absolute_path) const override;
bool OnCanEnablePrivacyMode(const GURL& url,
const GURL& site_for_cookies) const override;
bool OnAreExperimentalCookieFeaturesEnabled() const override; bool OnAreExperimentalCookieFeaturesEnabled() const override;
bool OnCancelURLRequestWithPolicyViolatingReferrerHeader( bool OnCancelURLRequestWithPolicyViolatingReferrerHeader(
const net::URLRequest& request, const net::URLRequest& request,
......
...@@ -482,57 +482,6 @@ class ChromeNetworkDelegatePrivacyModeTest : public testing::Test { ...@@ -482,57 +482,6 @@ class ChromeNetworkDelegatePrivacyModeTest : public testing::Test {
const GURL kBlockedFirstPartySite; const GURL kBlockedFirstPartySite;
}; };
TEST_F(ChromeNetworkDelegatePrivacyModeTest, DisablePrivacyIfCookiesAllowed) {
std::unique_ptr<ChromeNetworkDelegate> delegate(CreateNetworkDelegate());
SetDelegate(delegate.get());
EXPECT_FALSE(network_delegate_->CanEnablePrivacyMode(kAllowedSite,
kEmptyFirstPartySite));
}
TEST_F(ChromeNetworkDelegatePrivacyModeTest, EnablePrivacyIfCookiesBlocked) {
std::unique_ptr<ChromeNetworkDelegate> delegate(CreateNetworkDelegate());
SetDelegate(delegate.get());
EXPECT_FALSE(network_delegate_->CanEnablePrivacyMode(kBlockedSite,
kEmptyFirstPartySite));
cookie_settings_->SetCookieSetting(kBlockedSite, CONTENT_SETTING_BLOCK);
EXPECT_TRUE(network_delegate_->CanEnablePrivacyMode(kBlockedSite,
kEmptyFirstPartySite));
}
TEST_F(ChromeNetworkDelegatePrivacyModeTest, EnablePrivacyIfThirdPartyBlocked) {
std::unique_ptr<ChromeNetworkDelegate> delegate(CreateNetworkDelegate());
SetDelegate(delegate.get());
EXPECT_FALSE(network_delegate_->CanEnablePrivacyMode(kAllowedSite,
kFirstPartySite));
profile_.GetPrefs()->SetBoolean(prefs::kBlockThirdPartyCookies, true);
EXPECT_TRUE(network_delegate_->CanEnablePrivacyMode(kAllowedSite,
kFirstPartySite));
profile_.GetPrefs()->SetBoolean(prefs::kBlockThirdPartyCookies, false);
EXPECT_FALSE(network_delegate_->CanEnablePrivacyMode(kAllowedSite,
kFirstPartySite));
}
TEST_F(ChromeNetworkDelegatePrivacyModeTest,
DisablePrivacyIfOnlyFirstPartyBlocked) {
std::unique_ptr<ChromeNetworkDelegate> delegate(CreateNetworkDelegate());
SetDelegate(delegate.get());
EXPECT_FALSE(network_delegate_->CanEnablePrivacyMode(kAllowedSite,
kBlockedFirstPartySite));
cookie_settings_->SetCookieSetting(kBlockedFirstPartySite,
CONTENT_SETTING_BLOCK);
// Privacy mode is disabled as kAllowedSite is still getting cookies
EXPECT_FALSE(network_delegate_->CanEnablePrivacyMode(kAllowedSite,
kBlockedFirstPartySite));
}
TEST(ChromeNetworkDelegateStaticTest, IsAccessAllowed) { TEST(ChromeNetworkDelegateStaticTest, IsAccessAllowed) {
#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID)
// Platforms other than Chrome OS and Android have access to any files. // Platforms other than Chrome OS and Android have access to any files.
......
...@@ -103,14 +103,16 @@ class BasicNetworkDelegate : public net::NetworkDelegateImpl { ...@@ -103,14 +103,16 @@ class BasicNetworkDelegate : public net::NetworkDelegateImpl {
private: private:
// net::NetworkDelegate implementation. // net::NetworkDelegate implementation.
bool OnCanGetCookies(const net::URLRequest& request, bool OnCanGetCookies(const net::URLRequest& request,
const net::CookieList& cookie_list) override { const net::CookieList& cookie_list,
bool allowed_from_caller) override {
// Disallow sending cookies by default. // Disallow sending cookies by default.
return false; return false;
} }
bool OnCanSetCookie(const net::URLRequest& request, bool OnCanSetCookie(const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) override { net::CookieOptions* options,
bool allowed_from_caller) override {
// Disallow saving cookies by default. // Disallow saving cookies by default.
return false; return false;
} }
......
...@@ -34,24 +34,26 @@ void ShellNetworkDelegate::SetCancelURLRequestWithPolicyViolatingReferrerHeader( ...@@ -34,24 +34,26 @@ void ShellNetworkDelegate::SetCancelURLRequestWithPolicyViolatingReferrerHeader(
} }
bool ShellNetworkDelegate::OnCanGetCookies(const net::URLRequest& request, bool ShellNetworkDelegate::OnCanGetCookies(const net::URLRequest& request,
const net::CookieList& cookie_list) { const net::CookieList& cookie_list,
bool allowed_from_caller) {
net::StaticCookiePolicy::Type policy_type = g_block_third_party_cookies ? net::StaticCookiePolicy::Type policy_type = g_block_third_party_cookies ?
net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES : net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES :
net::StaticCookiePolicy::ALLOW_ALL_COOKIES; net::StaticCookiePolicy::ALLOW_ALL_COOKIES;
net::StaticCookiePolicy policy(policy_type); net::StaticCookiePolicy policy(policy_type);
int rv = policy.CanAccessCookies(request.url(), request.site_for_cookies()); int rv = policy.CanAccessCookies(request.url(), request.site_for_cookies());
return rv == net::OK; return allowed_from_caller && rv == net::OK;
} }
bool ShellNetworkDelegate::OnCanSetCookie(const net::URLRequest& request, bool ShellNetworkDelegate::OnCanSetCookie(const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) { net::CookieOptions* options,
bool allowed_from_caller) {
net::StaticCookiePolicy::Type policy_type = g_block_third_party_cookies ? net::StaticCookiePolicy::Type policy_type = g_block_third_party_cookies ?
net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES : net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES :
net::StaticCookiePolicy::ALLOW_ALL_COOKIES; net::StaticCookiePolicy::ALLOW_ALL_COOKIES;
net::StaticCookiePolicy policy(policy_type); net::StaticCookiePolicy policy(policy_type);
int rv = policy.CanAccessCookies(request.url(), request.site_for_cookies()); int rv = policy.CanAccessCookies(request.url(), request.site_for_cookies());
return rv == net::OK; return allowed_from_caller && rv == net::OK;
} }
bool ShellNetworkDelegate::OnCanAccessFile( bool ShellNetworkDelegate::OnCanAccessFile(
......
...@@ -22,10 +22,12 @@ class ShellNetworkDelegate : public net::NetworkDelegateImpl { ...@@ -22,10 +22,12 @@ class ShellNetworkDelegate : public net::NetworkDelegateImpl {
private: private:
// net::NetworkDelegate implementation. // net::NetworkDelegate implementation.
bool OnCanGetCookies(const net::URLRequest& request, bool OnCanGetCookies(const net::URLRequest& request,
const net::CookieList& cookie_list) override; const net::CookieList& cookie_list,
bool allowed_from_caller) override;
bool OnCanSetCookie(const net::URLRequest& request, bool OnCanSetCookie(const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) override; net::CookieOptions* options,
bool allowed_from_caller) override;
bool OnCanAccessFile(const net::URLRequest& request, bool OnCanAccessFile(const net::URLRequest& request,
const base::FilePath& original_path, const base::FilePath& original_path,
const base::FilePath& absolute_path) const override; const base::FilePath& absolute_path) const override;
......
...@@ -90,25 +90,27 @@ void IOSChromeNetworkDelegate::OnCompleted(net::URLRequest* request, ...@@ -90,25 +90,27 @@ void IOSChromeNetworkDelegate::OnCompleted(net::URLRequest* request,
bool IOSChromeNetworkDelegate::OnCanGetCookies( bool IOSChromeNetworkDelegate::OnCanGetCookies(
const net::URLRequest& request, const net::URLRequest& request,
const net::CookieList& cookie_list) { const net::CookieList& cookie_list,
bool allowed_from_caller) {
// Null during tests, or when we're running in the system context. // Null during tests, or when we're running in the system context.
if (!cookie_settings_) if (!cookie_settings_)
return true; return allowed_from_caller;
return cookie_settings_->IsCookieAccessAllowed(request.url(), return allowed_from_caller && cookie_settings_->IsCookieAccessAllowed(
request.site_for_cookies()); request.url(), request.site_for_cookies());
} }
bool IOSChromeNetworkDelegate::OnCanSetCookie( bool IOSChromeNetworkDelegate::OnCanSetCookie(
const net::URLRequest& request, const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) { net::CookieOptions* options,
bool allowed_from_caller) {
// Null during tests, or when we're running in the system context. // Null during tests, or when we're running in the system context.
if (!cookie_settings_) if (!cookie_settings_)
return true; return allowed_from_caller;
return cookie_settings_->IsCookieAccessAllowed(request.url(), return allowed_from_caller && cookie_settings_->IsCookieAccessAllowed(
request.site_for_cookies()); request.url(), request.site_for_cookies());
} }
bool IOSChromeNetworkDelegate::OnCanAccessFile( bool IOSChromeNetworkDelegate::OnCanAccessFile(
......
...@@ -54,10 +54,12 @@ class IOSChromeNetworkDelegate : public net::NetworkDelegateImpl { ...@@ -54,10 +54,12 @@ class IOSChromeNetworkDelegate : public net::NetworkDelegateImpl {
bool started, bool started,
int net_error) override; int net_error) override;
bool OnCanGetCookies(const net::URLRequest& request, bool OnCanGetCookies(const net::URLRequest& request,
const net::CookieList& cookie_list) override; const net::CookieList& cookie_list,
bool allowed_from_caller) override;
bool OnCanSetCookie(const net::URLRequest& request, bool OnCanSetCookie(const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) override; net::CookieOptions* options,
bool allowed_from_caller) override;
bool OnCanAccessFile(const net::URLRequest& request, bool OnCanAccessFile(const net::URLRequest& request,
const base::FilePath& original_path, const base::FilePath& original_path,
const base::FilePath& absolute_path) const override; const base::FilePath& absolute_path) const override;
......
...@@ -172,27 +172,36 @@ void LayeredNetworkDelegate::OnAuthRequiredInternal( ...@@ -172,27 +172,36 @@ void LayeredNetworkDelegate::OnAuthRequiredInternal(
AuthCredentials* credentials) {} AuthCredentials* credentials) {}
bool LayeredNetworkDelegate::OnCanGetCookies(const URLRequest& request, bool LayeredNetworkDelegate::OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) { const CookieList& cookie_list,
OnCanGetCookiesInternal(request, cookie_list); bool allowed_from_caller) {
return nested_network_delegate_->CanGetCookies(request, cookie_list); return nested_network_delegate_->CanGetCookies(
request, cookie_list,
OnCanGetCookiesInternal(request, cookie_list, allowed_from_caller));
} }
void LayeredNetworkDelegate::OnCanGetCookiesInternal( bool LayeredNetworkDelegate::OnCanGetCookiesInternal(
const URLRequest& request, const URLRequest& request,
const CookieList& cookie_list) { const CookieList& cookie_list,
bool allowed_from_caller) {
return allowed_from_caller;
} }
bool LayeredNetworkDelegate::OnCanSetCookie(const URLRequest& request, bool LayeredNetworkDelegate::OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) { CookieOptions* options,
OnCanSetCookieInternal(request, cookie, options); bool allowed_from_caller) {
return nested_network_delegate_->CanSetCookie(request, cookie, options); return nested_network_delegate_->CanSetCookie(
request, cookie, options,
OnCanSetCookieInternal(request, cookie, options, allowed_from_caller));
} }
void LayeredNetworkDelegate::OnCanSetCookieInternal( bool LayeredNetworkDelegate::OnCanSetCookieInternal(
const URLRequest& request, const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) {} CookieOptions* options,
bool allowed_from_caller) {
return allowed_from_caller;
}
bool LayeredNetworkDelegate::OnCanAccessFile( bool LayeredNetworkDelegate::OnCanAccessFile(
const URLRequest& request, const URLRequest& request,
...@@ -211,13 +220,15 @@ void LayeredNetworkDelegate::OnCanAccessFileInternal( ...@@ -211,13 +220,15 @@ void LayeredNetworkDelegate::OnCanAccessFileInternal(
bool LayeredNetworkDelegate::OnCanEnablePrivacyMode( bool LayeredNetworkDelegate::OnCanEnablePrivacyMode(
const GURL& url, const GURL& url,
const GURL& site_for_cookies) const { const GURL& site_for_cookies) const {
OnCanEnablePrivacyModeInternal(url, site_for_cookies); return OnCanEnablePrivacyModeInternal(url, site_for_cookies) ||
return nested_network_delegate_->CanEnablePrivacyMode(url, site_for_cookies); nested_network_delegate_->CanEnablePrivacyMode(url, site_for_cookies);
} }
void LayeredNetworkDelegate::OnCanEnablePrivacyModeInternal( bool LayeredNetworkDelegate::OnCanEnablePrivacyModeInternal(
const GURL& url, const GURL& url,
const GURL& site_for_cookies) const {} const GURL& site_for_cookies) const {
return false;
}
bool LayeredNetworkDelegate::OnAreExperimentalCookieFeaturesEnabled() const { bool LayeredNetworkDelegate::OnAreExperimentalCookieFeaturesEnabled() const {
OnAreExperimentalCookieFeaturesEnabledInternal(); OnAreExperimentalCookieFeaturesEnabledInternal();
......
...@@ -74,10 +74,12 @@ class NET_EXPORT LayeredNetworkDelegate : public NetworkDelegate { ...@@ -74,10 +74,12 @@ class NET_EXPORT LayeredNetworkDelegate : public NetworkDelegate {
AuthCallback callback, AuthCallback callback,
AuthCredentials* credentials) final; AuthCredentials* credentials) final;
bool OnCanGetCookies(const URLRequest& request, bool OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) final; const CookieList& cookie_list,
bool allowed_from_caller) final;
bool OnCanSetCookie(const URLRequest& request, bool OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) final; CookieOptions* options,
bool allowed_from_caller) final;
bool OnCanAccessFile(const URLRequest& request, bool OnCanAccessFile(const URLRequest& request,
const base::FilePath& original_path, const base::FilePath& original_path,
const base::FilePath& absolute_path) const final; const base::FilePath& absolute_path) const final;
...@@ -143,12 +145,14 @@ class NET_EXPORT LayeredNetworkDelegate : public NetworkDelegate { ...@@ -143,12 +145,14 @@ class NET_EXPORT LayeredNetworkDelegate : public NetworkDelegate {
virtual void OnPACScriptErrorInternal(int line_number, virtual void OnPACScriptErrorInternal(int line_number,
const base::string16& error); const base::string16& error);
virtual void OnCanGetCookiesInternal(const URLRequest& request, virtual bool OnCanGetCookiesInternal(const URLRequest& request,
const CookieList& cookie_list); const CookieList& cookie_list,
bool allowed_from_caller);
virtual void OnCanSetCookieInternal(const URLRequest& request, virtual bool OnCanSetCookieInternal(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options); CookieOptions* options,
bool allowed_from_caller);
virtual void OnAuthRequiredInternal(URLRequest* request, virtual void OnAuthRequiredInternal(URLRequest* request,
const AuthChallengeInfo& auth_info, const AuthChallengeInfo& auth_info,
...@@ -159,7 +163,9 @@ class NET_EXPORT LayeredNetworkDelegate : public NetworkDelegate { ...@@ -159,7 +163,9 @@ class NET_EXPORT LayeredNetworkDelegate : public NetworkDelegate {
const base::FilePath& original_path, const base::FilePath& original_path,
const base::FilePath& absolute_path) const; const base::FilePath& absolute_path) const;
virtual void OnCanEnablePrivacyModeInternal( // If this returns false, it short circuits the corresponding call in any
// nested NetworkDelegates.
virtual bool OnCanEnablePrivacyModeInternal(
const GURL& url, const GURL& url,
const GURL& site_for_cookies) const; const GURL& site_for_cookies) const;
......
...@@ -116,14 +116,16 @@ class TestNetworkDelegateImpl : public NetworkDelegateImpl { ...@@ -116,14 +116,16 @@ class TestNetworkDelegateImpl : public NetworkDelegateImpl {
} }
bool OnCanGetCookies(const URLRequest& request, bool OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) override { const CookieList& cookie_list,
bool allowed_from_caller) override {
IncrementAndCompareCounter("on_can_get_cookies_count"); IncrementAndCompareCounter("on_can_get_cookies_count");
return false; return false;
} }
bool OnCanSetCookie(const URLRequest& request, bool OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) override { CookieOptions* options,
bool allowed_from_caller) override {
IncrementAndCompareCounter("on_can_set_cookie_count"); IncrementAndCompareCounter("on_can_set_cookie_count");
return false; return false;
} }
...@@ -204,8 +206,8 @@ class TestLayeredNetworkDelegate : public LayeredNetworkDelegate { ...@@ -204,8 +206,8 @@ class TestLayeredNetworkDelegate : public LayeredNetworkDelegate {
EXPECT_EQ( EXPECT_EQ(
NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION, NetworkDelegate::AUTH_REQUIRED_RESPONSE_NO_ACTION,
OnAuthRequired(request.get(), *auth_challenge, AuthCallback(), NULL)); OnAuthRequired(request.get(), *auth_challenge, AuthCallback(), NULL));
EXPECT_FALSE(OnCanGetCookies(*request, CookieList())); EXPECT_FALSE(OnCanGetCookies(*request, CookieList(), true));
EXPECT_FALSE(OnCanSetCookie(*request, net::CanonicalCookie(), NULL)); EXPECT_FALSE(OnCanSetCookie(*request, net::CanonicalCookie(), NULL, true));
EXPECT_FALSE(OnCanAccessFile(*request, base::FilePath(), base::FilePath())); EXPECT_FALSE(OnCanAccessFile(*request, base::FilePath(), base::FilePath()));
EXPECT_FALSE(OnCanEnablePrivacyMode(GURL(), GURL())); EXPECT_FALSE(OnCanEnablePrivacyMode(GURL(), GURL()));
EXPECT_FALSE(OnCancelURLRequestWithPolicyViolatingReferrerHeader( EXPECT_FALSE(OnCancelURLRequestWithPolicyViolatingReferrerHeader(
...@@ -296,17 +298,21 @@ class TestLayeredNetworkDelegate : public LayeredNetworkDelegate { ...@@ -296,17 +298,21 @@ class TestLayeredNetworkDelegate : public LayeredNetworkDelegate {
EXPECT_EQ(1, (*counters_)["on_auth_required_count"]); EXPECT_EQ(1, (*counters_)["on_auth_required_count"]);
} }
void OnCanGetCookiesInternal(const URLRequest& request, bool OnCanGetCookiesInternal(const URLRequest& request,
const CookieList& cookie_list) override { const CookieList& cookie_list,
bool allowed_from_caller) override {
++(*counters_)["on_can_get_cookies_count"]; ++(*counters_)["on_can_get_cookies_count"];
EXPECT_EQ(1, (*counters_)["on_can_get_cookies_count"]); EXPECT_EQ(1, (*counters_)["on_can_get_cookies_count"]);
return allowed_from_caller;
} }
void OnCanSetCookieInternal(const URLRequest& request, bool OnCanSetCookieInternal(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) override { CookieOptions* options,
bool allowed_from_caller) override {
++(*counters_)["on_can_set_cookie_count"]; ++(*counters_)["on_can_set_cookie_count"];
EXPECT_EQ(1, (*counters_)["on_can_set_cookie_count"]); EXPECT_EQ(1, (*counters_)["on_can_set_cookie_count"]);
return allowed_from_caller;
} }
void OnCanAccessFileInternal( void OnCanAccessFileInternal(
...@@ -317,11 +323,12 @@ class TestLayeredNetworkDelegate : public LayeredNetworkDelegate { ...@@ -317,11 +323,12 @@ class TestLayeredNetworkDelegate : public LayeredNetworkDelegate {
EXPECT_EQ(1, (*counters_)["on_can_access_file_count"]); EXPECT_EQ(1, (*counters_)["on_can_access_file_count"]);
} }
void OnCanEnablePrivacyModeInternal( bool OnCanEnablePrivacyModeInternal(
const GURL& url, const GURL& url,
const GURL& site_for_cookies) const override { const GURL& site_for_cookies) const override {
++(*counters_)["on_can_enable_privacy_mode_count"]; ++(*counters_)["on_can_enable_privacy_mode_count"];
EXPECT_EQ(1, (*counters_)["on_can_enable_privacy_mode_count"]); EXPECT_EQ(1, (*counters_)["on_can_enable_privacy_mode_count"]);
return false;
} }
bool OnCancelURLRequestWithPolicyViolatingReferrerHeaderInternal( bool OnCancelURLRequestWithPolicyViolatingReferrerHeaderInternal(
......
...@@ -142,18 +142,20 @@ NetworkDelegate::AuthRequiredResponse NetworkDelegate::NotifyAuthRequired( ...@@ -142,18 +142,20 @@ NetworkDelegate::AuthRequiredResponse NetworkDelegate::NotifyAuthRequired(
} }
bool NetworkDelegate::CanGetCookies(const URLRequest& request, bool NetworkDelegate::CanGetCookies(const URLRequest& request,
const CookieList& cookie_list) { const CookieList& cookie_list,
bool allowed_from_caller) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!(request.load_flags() & LOAD_DO_NOT_SEND_COOKIES)); DCHECK(!(request.load_flags() & LOAD_DO_NOT_SEND_COOKIES));
return OnCanGetCookies(request, cookie_list); return OnCanGetCookies(request, cookie_list, allowed_from_caller);
} }
bool NetworkDelegate::CanSetCookie(const URLRequest& request, bool NetworkDelegate::CanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const CanonicalCookie& cookie,
CookieOptions* options) { CookieOptions* options,
bool allowed_from_caller) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
DCHECK(!(request.load_flags() & LOAD_DO_NOT_SAVE_COOKIES)); DCHECK(!(request.load_flags() & LOAD_DO_NOT_SAVE_COOKIES));
return OnCanSetCookie(request, cookie, options); return OnCanSetCookie(request, cookie, options, allowed_from_caller);
} }
bool NetworkDelegate::CanAccessFile(const URLRequest& request, bool NetworkDelegate::CanAccessFile(const URLRequest& request,
......
...@@ -97,10 +97,12 @@ class NET_EXPORT NetworkDelegate { ...@@ -97,10 +97,12 @@ class NET_EXPORT NetworkDelegate {
AuthCallback callback, AuthCallback callback,
AuthCredentials* credentials); AuthCredentials* credentials);
bool CanGetCookies(const URLRequest& request, bool CanGetCookies(const URLRequest& request,
const CookieList& cookie_list); const CookieList& cookie_list,
bool allowed_from_caller);
bool CanSetCookie(const URLRequest& request, bool CanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options); CookieOptions* options,
bool allowed_from_caller);
bool CanAccessFile(const URLRequest& request, bool CanAccessFile(const URLRequest& request,
const base::FilePath& original_path, const base::FilePath& original_path,
const base::FilePath& absolute_path) const; const base::FilePath& absolute_path) const;
...@@ -287,15 +289,23 @@ class NET_EXPORT NetworkDelegate { ...@@ -287,15 +289,23 @@ class NET_EXPORT NetworkDelegate {
// Called when reading cookies to allow the network delegate to block access // Called when reading cookies to allow the network delegate to block access
// to the cookie. This method will never be invoked when // to the cookie. This method will never be invoked when
// LOAD_DO_NOT_SEND_COOKIES is specified. // LOAD_DO_NOT_SEND_COOKIES is specified.
// The |allowed_from_caller| param is used to pass whether this operation is
// allowed from any higher level delegates (for example, in a
// LayeredNetworkDelegate). Any custom logic should be ANDed with this bool.
virtual bool OnCanGetCookies(const URLRequest& request, virtual bool OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) = 0; const CookieList& cookie_list,
bool allowed_from_caller) = 0;
// Called when a cookie is set to allow the network delegate to block access // Called when a cookie is set to allow the network delegate to block access
// to the cookie. This method will never be invoked when // to the cookie. This method will never be invoked when
// LOAD_DO_NOT_SAVE_COOKIES is specified. // LOAD_DO_NOT_SAVE_COOKIES is specified.
// The |allowed_from_caller| param is used to pass whether this operation is
// allowed from any higher level delegates (for example, in a
// LayeredNetworkDelegate). Any custom logic should be ANDed with this bool.
virtual bool OnCanSetCookie(const URLRequest& request, virtual bool OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const CanonicalCookie& cookie,
CookieOptions* options) = 0; CookieOptions* options,
bool allowed_from_caller) = 0;
// Called when a file access is attempted to allow the network delegate to // Called when a file access is attempted to allow the network delegate to
// allow or block access to the given file path, provided in the original // allow or block access to the given file path, provided in the original
......
...@@ -72,14 +72,16 @@ NetworkDelegate::AuthRequiredResponse NetworkDelegateImpl::OnAuthRequired( ...@@ -72,14 +72,16 @@ NetworkDelegate::AuthRequiredResponse NetworkDelegateImpl::OnAuthRequired(
} }
bool NetworkDelegateImpl::OnCanGetCookies(const URLRequest& request, bool NetworkDelegateImpl::OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) { const CookieList& cookie_list,
return true; bool allowed_from_caller) {
return allowed_from_caller;
} }
bool NetworkDelegateImpl::OnCanSetCookie(const URLRequest& request, bool NetworkDelegateImpl::OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) { CookieOptions* options,
return true; bool allowed_from_caller) {
return allowed_from_caller;
} }
bool NetworkDelegateImpl::OnCanAccessFile( bool NetworkDelegateImpl::OnCanAccessFile(
......
...@@ -83,11 +83,13 @@ class NET_EXPORT NetworkDelegateImpl : public NetworkDelegate { ...@@ -83,11 +83,13 @@ class NET_EXPORT NetworkDelegateImpl : public NetworkDelegate {
AuthCredentials* credentials) override; AuthCredentials* credentials) override;
bool OnCanGetCookies(const URLRequest& request, bool OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) override; const CookieList& cookie_list,
bool allowed_from_caller) override;
bool OnCanSetCookie(const URLRequest& request, bool OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) override; CookieOptions* options,
bool allowed_from_caller) override;
bool OnCanAccessFile(const URLRequest& request, bool OnCanAccessFile(const URLRequest& request,
const base::FilePath& original_path, const base::FilePath& original_path,
......
...@@ -66,13 +66,15 @@ class TestNetworkDelegate : public NetworkDelegateImpl { ...@@ -66,13 +66,15 @@ class TestNetworkDelegate : public NetworkDelegateImpl {
return AUTH_REQUIRED_RESPONSE_NO_ACTION; return AUTH_REQUIRED_RESPONSE_NO_ACTION;
} }
bool OnCanGetCookies(const URLRequest& request, bool OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) override { const CookieList& cookie_list,
return true; bool allowed_from_caller) override {
return allowed_from_caller;
} }
bool OnCanSetCookie(const URLRequest& request, bool OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) override { CookieOptions* options,
return true; bool allowed_from_caller) override {
return allowed_from_caller;
} }
bool OnCanAccessFile(const URLRequest& request, bool OnCanAccessFile(const URLRequest& request,
const base::FilePath& original_path, const base::FilePath& original_path,
......
...@@ -198,14 +198,16 @@ class BasicNetworkDelegate : public NetworkDelegateImpl { ...@@ -198,14 +198,16 @@ class BasicNetworkDelegate : public NetworkDelegateImpl {
} }
bool OnCanGetCookies(const URLRequest& request, bool OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) override { const CookieList& cookie_list,
return true; bool allowed_from_caller) override {
return allowed_from_caller;
} }
bool OnCanSetCookie(const URLRequest& request, bool OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) override { CookieOptions* options,
return true; bool allowed_from_caller) override {
return allowed_from_caller;
} }
bool OnCanAccessFile(const URLRequest& request, bool OnCanAccessFile(const URLRequest& request,
......
...@@ -1064,7 +1064,8 @@ void URLRequest::NotifySSLCertificateError(const SSLInfo& ssl_info, ...@@ -1064,7 +1064,8 @@ void URLRequest::NotifySSLCertificateError(const SSLInfo& ssl_info,
bool URLRequest::CanGetCookies(const CookieList& cookie_list) const { bool URLRequest::CanGetCookies(const CookieList& cookie_list) const {
DCHECK(!(load_flags_ & LOAD_DO_NOT_SEND_COOKIES)); DCHECK(!(load_flags_ & LOAD_DO_NOT_SEND_COOKIES));
if (network_delegate_) { if (network_delegate_) {
return network_delegate_->CanGetCookies(*this, cookie_list); return network_delegate_->CanGetCookies(*this, cookie_list,
/*allowed_from_caller=*/true);
} }
return g_default_can_use_cookies; return g_default_can_use_cookies;
} }
...@@ -1073,7 +1074,8 @@ bool URLRequest::CanSetCookie(const net::CanonicalCookie& cookie, ...@@ -1073,7 +1074,8 @@ bool URLRequest::CanSetCookie(const net::CanonicalCookie& cookie,
CookieOptions* options) const { CookieOptions* options) const {
DCHECK(!(load_flags_ & LOAD_DO_NOT_SAVE_COOKIES)); DCHECK(!(load_flags_ & LOAD_DO_NOT_SAVE_COOKIES));
if (network_delegate_) { if (network_delegate_) {
return network_delegate_->CanSetCookie(*this, cookie, options); return network_delegate_->CanSetCookie(*this, cookie, options,
/*allowed_from_caller=*/true);
} }
return g_default_can_use_cookies; return g_default_can_use_cookies;
} }
......
...@@ -119,14 +119,16 @@ class BasicNetworkDelegate : public NetworkDelegateImpl { ...@@ -119,14 +119,16 @@ class BasicNetworkDelegate : public NetworkDelegateImpl {
} }
bool OnCanGetCookies(const URLRequest& request, bool OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) override { const CookieList& cookie_list,
return true; bool allowed_from_caller) override {
return allowed_from_caller;
} }
bool OnCanSetCookie(const URLRequest& request, bool OnCanSetCookie(const URLRequest& request,
const CanonicalCookie& cookie, const CanonicalCookie& cookie,
CookieOptions* options) override { CookieOptions* options,
return true; bool allowed_from_caller) override {
return allowed_from_caller;
} }
bool OnCanAccessFile(const URLRequest& request, bool OnCanAccessFile(const URLRequest& request,
......
...@@ -648,8 +648,9 @@ NetworkDelegate::AuthRequiredResponse TestNetworkDelegate::OnAuthRequired( ...@@ -648,8 +648,9 @@ NetworkDelegate::AuthRequiredResponse TestNetworkDelegate::OnAuthRequired(
} }
bool TestNetworkDelegate::OnCanGetCookies(const URLRequest& request, bool TestNetworkDelegate::OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) { const CookieList& cookie_list,
bool allow = true; bool allowed_from_caller) {
bool allow = allowed_from_caller;
if (cookie_options_bit_mask_ & NO_GET_COOKIES) if (cookie_options_bit_mask_ & NO_GET_COOKIES)
allow = false; allow = false;
...@@ -662,8 +663,9 @@ bool TestNetworkDelegate::OnCanGetCookies(const URLRequest& request, ...@@ -662,8 +663,9 @@ bool TestNetworkDelegate::OnCanGetCookies(const URLRequest& request,
bool TestNetworkDelegate::OnCanSetCookie(const URLRequest& request, bool TestNetworkDelegate::OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) { CookieOptions* options,
bool allow = true; bool allowed_from_caller) {
bool allow = allowed_from_caller;
if (cookie_options_bit_mask_ & NO_SET_COOKIE) if (cookie_options_bit_mask_ & NO_SET_COOKIE)
allow = false; allow = false;
......
...@@ -383,10 +383,12 @@ class TestNetworkDelegate : public NetworkDelegateImpl { ...@@ -383,10 +383,12 @@ class TestNetworkDelegate : public NetworkDelegateImpl {
AuthCallback callback, AuthCallback callback,
AuthCredentials* credentials) override; AuthCredentials* credentials) override;
bool OnCanGetCookies(const URLRequest& request, bool OnCanGetCookies(const URLRequest& request,
const CookieList& cookie_list) override; const CookieList& cookie_list,
bool allowed_from_caller) override;
bool OnCanSetCookie(const URLRequest& request, bool OnCanSetCookie(const URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
CookieOptions* options) override; CookieOptions* options,
bool allowed_from_caller) override;
bool OnCanAccessFile(const URLRequest& request, bool OnCanAccessFile(const URLRequest& request,
const base::FilePath& original_path, const base::FilePath& original_path,
const base::FilePath& absolute_path) const override; const base::FilePath& absolute_path) const override;
......
...@@ -203,7 +203,6 @@ source_set("tests") { ...@@ -203,7 +203,6 @@ source_set("tests") {
"keepalive_statistics_recorder_unittest.cc", "keepalive_statistics_recorder_unittest.cc",
"network_change_manager_unittest.cc", "network_change_manager_unittest.cc",
"network_context_unittest.cc", "network_context_unittest.cc",
"network_service_network_delegate_unittest.cc",
"network_service_unittest.cc", "network_service_unittest.cc",
"network_usage_accumulator_unittest.cc", "network_usage_accumulator_unittest.cc",
"proxy_config_service_mojo_unittest.cc", "proxy_config_service_mojo_unittest.cc",
......
...@@ -228,11 +228,13 @@ class NetworkContext::ContextNetworkDelegate ...@@ -228,11 +228,13 @@ class NetworkContext::ContextNetworkDelegate
ContextNetworkDelegate( ContextNetworkDelegate(
std::unique_ptr<net::NetworkDelegate> nested_network_delegate, std::unique_ptr<net::NetworkDelegate> nested_network_delegate,
bool enable_referrers, bool enable_referrers,
bool validate_referrer_policy_on_initial_request) bool validate_referrer_policy_on_initial_request,
NetworkContext* network_context)
: LayeredNetworkDelegate(std::move(nested_network_delegate)), : LayeredNetworkDelegate(std::move(nested_network_delegate)),
enable_referrers_(enable_referrers), enable_referrers_(enable_referrers),
validate_referrer_policy_on_initial_request_( validate_referrer_policy_on_initial_request_(
validate_referrer_policy_on_initial_request) {} validate_referrer_policy_on_initial_request),
network_context_(network_context) {}
~ContextNetworkDelegate() override {} ~ContextNetworkDelegate() override {}
...@@ -287,6 +289,35 @@ class NetworkContext::ContextNetworkDelegate ...@@ -287,6 +289,35 @@ class NetworkContext::ContextNetworkDelegate
return true; return true;
} }
bool OnCanGetCookiesInternal(const net::URLRequest& request,
const net::CookieList& cookie_list,
bool allowed_from_caller) override {
return allowed_from_caller &&
network_context_->cookie_manager()
->cookie_settings()
.IsCookieAccessAllowed(request.url(),
request.site_for_cookies());
}
bool OnCanSetCookieInternal(const net::URLRequest& request,
const net::CanonicalCookie& cookie,
net::CookieOptions* options,
bool allowed_from_caller) override {
return allowed_from_caller &&
network_context_->cookie_manager()
->cookie_settings()
.IsCookieAccessAllowed(request.url(),
request.site_for_cookies());
}
bool OnCanEnablePrivacyModeInternal(
const GURL& url,
const GURL& site_for_cookies) const override {
return !network_context_->cookie_manager()
->cookie_settings()
.IsCookieAccessAllowed(url, site_for_cookies);
}
void set_enable_referrers(bool enable_referrers) { void set_enable_referrers(bool enable_referrers) {
enable_referrers_ = enable_referrers; enable_referrers_ = enable_referrers;
} }
...@@ -294,6 +325,7 @@ class NetworkContext::ContextNetworkDelegate ...@@ -294,6 +325,7 @@ class NetworkContext::ContextNetworkDelegate
private: private:
bool enable_referrers_; bool enable_referrers_;
bool validate_referrer_policy_on_initial_request_; bool validate_referrer_policy_on_initial_request_;
NetworkContext* network_context_;
DISALLOW_COPY_AND_ASSIGN(ContextNetworkDelegate); DISALLOW_COPY_AND_ASSIGN(ContextNetworkDelegate);
}; };
...@@ -909,6 +941,7 @@ URLRequestContextOwner NetworkContext::ApplyContextParamsToBuilder( ...@@ -909,6 +941,7 @@ URLRequestContextOwner NetworkContext::ApplyContextParamsToBuilder(
builder->SetCreateLayeredNetworkDelegateCallback(base::BindOnce( builder->SetCreateLayeredNetworkDelegateCallback(base::BindOnce(
[](mojom::NetworkContextParams* network_context_params, [](mojom::NetworkContextParams* network_context_params,
ContextNetworkDelegate** out_context_network_delegate, ContextNetworkDelegate** out_context_network_delegate,
NetworkContext* network_context,
std::unique_ptr<net::NetworkDelegate> nested_network_delegate) std::unique_ptr<net::NetworkDelegate> nested_network_delegate)
-> std::unique_ptr<net::NetworkDelegate> { -> std::unique_ptr<net::NetworkDelegate> {
std::unique_ptr<ContextNetworkDelegate> context_network_delegate = std::unique_ptr<ContextNetworkDelegate> context_network_delegate =
...@@ -916,12 +949,13 @@ URLRequestContextOwner NetworkContext::ApplyContextParamsToBuilder( ...@@ -916,12 +949,13 @@ URLRequestContextOwner NetworkContext::ApplyContextParamsToBuilder(
std::move(nested_network_delegate), std::move(nested_network_delegate),
network_context_params->enable_referrers, network_context_params->enable_referrers,
network_context_params network_context_params
->validate_referrer_policy_on_initial_request); ->validate_referrer_policy_on_initial_request,
network_context);
if (out_context_network_delegate) if (out_context_network_delegate)
*out_context_network_delegate = context_network_delegate.get(); *out_context_network_delegate = context_network_delegate.get();
return context_network_delegate; return context_network_delegate;
}, },
params_.get(), &context_network_delegate_)); params_.get(), &context_network_delegate_, this));
std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs; std::vector<scoped_refptr<const net::CTLogVerifier>> ct_logs;
if (!params_->ct_logs.empty()) { if (!params_->ct_logs.empty()) {
......
...@@ -95,6 +95,9 @@ namespace network { ...@@ -95,6 +95,9 @@ namespace network {
namespace { namespace {
const GURL kURL("http://foo.com");
const GURL kOtherURL("http://other.com");
// Sends an HttpResponse for requests for "/" that result in sending an HPKP // Sends an HttpResponse for requests for "/" that result in sending an HPKP
// report. Ignores other paths to avoid catching the subsequent favicon // report. Ignores other paths to avoid catching the subsequent favicon
// request. // request.
...@@ -125,6 +128,26 @@ mojom::NetworkContextParamsPtr CreateContextParams() { ...@@ -125,6 +128,26 @@ mojom::NetworkContextParamsPtr CreateContextParams() {
return params; return params;
} }
void SetContentSetting(const GURL& primary_pattern,
const GURL& secondary_pattern,
ContentSetting setting,
NetworkContext* network_context) {
network_context->cookie_manager()->SetContentSettings(
{ContentSettingPatternSource(
ContentSettingsPattern::FromURL(primary_pattern),
ContentSettingsPattern::FromURL(secondary_pattern),
base::Value(setting), std::string(), false)});
}
void SetDefaultContentSetting(ContentSetting setting,
NetworkContext* network_context) {
network_context->cookie_manager()->SetContentSettings(
{ContentSettingPatternSource(ContentSettingsPattern::Wildcard(),
ContentSettingsPattern::Wildcard(),
base::Value(setting), std::string(),
false)});
}
class NetworkContextTest : public testing::Test, class NetworkContextTest : public testing::Test,
public net::SSLConfigService::Observer { public net::SSLConfigService::Observer {
public: public:
...@@ -2282,6 +2305,133 @@ TEST_F(NetworkContextTest, DestroyNetLogExporterWhileCreatingScratchDir) { ...@@ -2282,6 +2305,133 @@ TEST_F(NetworkContextTest, DestroyNetLogExporterWhileCreatingScratchDir) {
base::DeleteFile(temp_path, false); base::DeleteFile(temp_path, false);
} }
TEST_F(NetworkContextTest, PrivacyModeDisabledByDefault) {
std::unique_ptr<NetworkContext> network_context =
CreateContextWithParams(CreateContextParams());
EXPECT_FALSE(network_context->url_request_context()
->network_delegate()
->CanEnablePrivacyMode(kURL, kOtherURL));
}
TEST_F(NetworkContextTest, PrivacyModeEnabledIfCookiesBlocked) {
std::unique_ptr<NetworkContext> network_context =
CreateContextWithParams(CreateContextParams());
SetContentSetting(kURL, kOtherURL, CONTENT_SETTING_BLOCK,
network_context.get());
EXPECT_TRUE(network_context->url_request_context()
->network_delegate()
->CanEnablePrivacyMode(kURL, kOtherURL));
EXPECT_FALSE(network_context->url_request_context()
->network_delegate()
->CanEnablePrivacyMode(kOtherURL, kURL));
}
TEST_F(NetworkContextTest, PrivacyModeDisabledIfCookiesAllowed) {
std::unique_ptr<NetworkContext> network_context =
CreateContextWithParams(CreateContextParams());
SetContentSetting(kURL, kOtherURL, CONTENT_SETTING_ALLOW,
network_context.get());
EXPECT_FALSE(network_context->url_request_context()
->network_delegate()
->CanEnablePrivacyMode(kURL, kOtherURL));
}
TEST_F(NetworkContextTest, PrivacyModeDisabledIfCookiesSettingForOtherURL) {
std::unique_ptr<NetworkContext> network_context =
CreateContextWithParams(CreateContextParams());
// URLs are switched so setting should not apply.
SetContentSetting(kOtherURL, kURL, CONTENT_SETTING_BLOCK,
network_context.get());
EXPECT_FALSE(network_context->url_request_context()
->network_delegate()
->CanEnablePrivacyMode(kURL, kOtherURL));
}
TEST_F(NetworkContextTest, PrivacyModeEnabledIfThirdPartyCookiesBlocked) {
std::unique_ptr<NetworkContext> network_context =
CreateContextWithParams(CreateContextParams());
net::NetworkDelegate* delegate =
network_context->url_request_context()->network_delegate();
network_context->cookie_manager()->BlockThirdPartyCookies(true);
EXPECT_TRUE(delegate->CanEnablePrivacyMode(kURL, kOtherURL));
EXPECT_FALSE(delegate->CanEnablePrivacyMode(kURL, kURL));
network_context->cookie_manager()->BlockThirdPartyCookies(false);
EXPECT_FALSE(delegate->CanEnablePrivacyMode(kURL, kOtherURL));
EXPECT_FALSE(delegate->CanEnablePrivacyMode(kURL, kURL));
}
TEST_F(NetworkContextTest, CanSetCookieFalseIfCookiesBlocked) {
std::unique_ptr<NetworkContext> network_context =
CreateContextWithParams(CreateContextParams());
net::URLRequestContext context;
std::unique_ptr<net::URLRequest> request = context.CreateRequest(
kURL, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS);
net::CanonicalCookie cookie("TestCookie", "1", "www.test.com", "/",
base::Time(), base::Time(), base::Time(), false,
false, net::CookieSameSite::NO_RESTRICTION,
net::COOKIE_PRIORITY_LOW);
EXPECT_TRUE(
network_context->url_request_context()->network_delegate()->CanSetCookie(
*request, cookie, nullptr, true));
SetDefaultContentSetting(CONTENT_SETTING_BLOCK, network_context.get());
EXPECT_FALSE(
network_context->url_request_context()->network_delegate()->CanSetCookie(
*request, cookie, nullptr, true));
}
TEST_F(NetworkContextTest, CanSetCookieTrueIfCookiesAllowed) {
std::unique_ptr<NetworkContext> network_context =
CreateContextWithParams(CreateContextParams());
net::URLRequestContext context;
std::unique_ptr<net::URLRequest> request = context.CreateRequest(
kURL, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS);
net::CanonicalCookie cookie("TestCookie", "1", "www.test.com", "/",
base::Time(), base::Time(), base::Time(), false,
false, net::CookieSameSite::NO_RESTRICTION,
net::COOKIE_PRIORITY_LOW);
SetDefaultContentSetting(CONTENT_SETTING_ALLOW, network_context.get());
EXPECT_TRUE(
network_context->url_request_context()->network_delegate()->CanSetCookie(
*request, cookie, nullptr, true));
}
TEST_F(NetworkContextTest, CanGetCookiesFalseIfCookiesBlocked) {
std::unique_ptr<NetworkContext> network_context =
CreateContextWithParams(CreateContextParams());
net::URLRequestContext context;
std::unique_ptr<net::URLRequest> request = context.CreateRequest(
kURL, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS);
EXPECT_TRUE(
network_context->url_request_context()->network_delegate()->CanGetCookies(
*request, {}, true));
SetDefaultContentSetting(CONTENT_SETTING_BLOCK, network_context.get());
EXPECT_FALSE(
network_context->url_request_context()->network_delegate()->CanGetCookies(
*request, {}, true));
}
TEST_F(NetworkContextTest, CanGetCookiesTrueIfCookiesAllowed) {
std::unique_ptr<NetworkContext> network_context =
CreateContextWithParams(CreateContextParams());
net::URLRequestContext context;
std::unique_ptr<net::URLRequest> request = context.CreateRequest(
kURL, net::DEFAULT_PRIORITY, nullptr, TRAFFIC_ANNOTATION_FOR_TESTS);
SetDefaultContentSetting(CONTENT_SETTING_ALLOW, network_context.get());
EXPECT_TRUE(
network_context->url_request_context()->network_delegate()->CanGetCookies(
*request, {}, true));
}
} // namespace } // namespace
} // namespace network } // namespace network
...@@ -16,35 +16,31 @@ NetworkServiceNetworkDelegate::NetworkServiceNetworkDelegate( ...@@ -16,35 +16,31 @@ NetworkServiceNetworkDelegate::NetworkServiceNetworkDelegate(
bool NetworkServiceNetworkDelegate::OnCanGetCookies( bool NetworkServiceNetworkDelegate::OnCanGetCookies(
const net::URLRequest& request, const net::URLRequest& request,
const net::CookieList& cookie_list) { const net::CookieList& cookie_list,
bool allow = bool allowed_from_caller) {
network_context_->cookie_manager()
->cookie_settings()
.IsCookieAccessAllowed(request.url(), request.site_for_cookies());
URLLoader* url_loader = URLLoader::ForRequest(request); URLLoader* url_loader = URLLoader::ForRequest(request);
if (url_loader) { if (url_loader) {
network_context_->network_service()->client()->OnCookiesRead( network_context_->network_service()->client()->OnCookiesRead(
url_loader->GetProcessId(), url_loader->GetRenderFrameId(), url_loader->GetProcessId(), url_loader->GetRenderFrameId(),
request.url(), request.site_for_cookies(), cookie_list, !allow); request.url(), request.site_for_cookies(), cookie_list,
!allowed_from_caller);
} }
return allow; return allowed_from_caller;
} }
bool NetworkServiceNetworkDelegate::OnCanSetCookie( bool NetworkServiceNetworkDelegate::OnCanSetCookie(
const net::URLRequest& request, const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) { net::CookieOptions* options,
bool allow = bool allowed_from_caller) {
network_context_->cookie_manager()
->cookie_settings()
.IsCookieAccessAllowed(request.url(), request.site_for_cookies());
URLLoader* url_loader = URLLoader::ForRequest(request); URLLoader* url_loader = URLLoader::ForRequest(request);
if (url_loader) { if (url_loader) {
network_context_->network_service()->client()->OnCookieChange( network_context_->network_service()->client()->OnCookieChange(
url_loader->GetProcessId(), url_loader->GetRenderFrameId(), url_loader->GetProcessId(), url_loader->GetRenderFrameId(),
request.url(), request.site_for_cookies(), cookie, !allow); request.url(), request.site_for_cookies(), cookie,
!allowed_from_caller);
} }
return allow; return allowed_from_caller;
} }
bool NetworkServiceNetworkDelegate::OnCanAccessFile( bool NetworkServiceNetworkDelegate::OnCanAccessFile(
...@@ -56,12 +52,4 @@ bool NetworkServiceNetworkDelegate::OnCanAccessFile( ...@@ -56,12 +52,4 @@ bool NetworkServiceNetworkDelegate::OnCanAccessFile(
return true; return true;
} }
bool NetworkServiceNetworkDelegate::OnCanEnablePrivacyMode(
const GURL& url,
const GURL& site_for_cookies) const {
return !network_context_->cookie_manager()
->cookie_settings()
.IsCookieAccessAllowed(url, site_for_cookies);
}
} // namespace network } // namespace network
...@@ -22,15 +22,15 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkServiceNetworkDelegate ...@@ -22,15 +22,15 @@ class COMPONENT_EXPORT(NETWORK_SERVICE) NetworkServiceNetworkDelegate
private: private:
// net::NetworkDelegateImpl implementation. // net::NetworkDelegateImpl implementation.
bool OnCanGetCookies(const net::URLRequest& request, bool OnCanGetCookies(const net::URLRequest& request,
const net::CookieList& cookie_list) override; const net::CookieList& cookie_list,
bool allowed_from_caller) override;
bool OnCanSetCookie(const net::URLRequest& request, bool OnCanSetCookie(const net::URLRequest& request,
const net::CanonicalCookie& cookie, const net::CanonicalCookie& cookie,
net::CookieOptions* options) override; net::CookieOptions* options,
bool allowed_from_caller) override;
bool OnCanAccessFile(const net::URLRequest& request, bool OnCanAccessFile(const net::URLRequest& request,
const base::FilePath& original_path, const base::FilePath& original_path,
const base::FilePath& absolute_path) const override; const base::FilePath& absolute_path) const override;
bool OnCanEnablePrivacyMode(const GURL& url,
const GURL& site_for_cookies) const override;
NetworkContext* network_context_; NetworkContext* network_context_;
......
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "services/network/network_service_network_delegate.h"
#include "base/test/scoped_task_environment.h"
#include "services/network/network_context.h"
#include "services/network/network_service.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace network {
namespace {
const GURL kURL("http://foo.com");
const GURL kOtherURL("http://other.com");
class NetworkServiceNetworkDelegateTest : public testing::Test {
public:
NetworkServiceNetworkDelegateTest()
: network_service_(NetworkService::CreateForTesting()) {
mojom::NetworkContextPtr network_context_ptr;
network_context_ = std::make_unique<NetworkContext>(
network_service_.get(), mojo::MakeRequest(&network_context_ptr),
mojom::NetworkContextParams::New());
}
void SetContentSetting(const GURL& primary_pattern,
const GURL& secondary_pattern,
ContentSetting setting) {
network_context_->cookie_manager()->SetContentSettings(
{ContentSettingPatternSource(
ContentSettingsPattern::FromURL(primary_pattern),
ContentSettingsPattern::FromURL(secondary_pattern),
base::Value(setting), std::string(), false)});
}
void SetBlockThirdParty(bool block) {
network_context_->cookie_manager()->BlockThirdPartyCookies(block);
}
NetworkContext* network_context() const { return network_context_.get(); }
private:
base::test::ScopedTaskEnvironment scoped_task_environment_;
std::unique_ptr<NetworkService> network_service_;
std::unique_ptr<NetworkContext> network_context_;
};
TEST_F(NetworkServiceNetworkDelegateTest, PrivacyModeDisabledByDefault) {
NetworkServiceNetworkDelegate delegate(network_context());
EXPECT_FALSE(delegate.CanEnablePrivacyMode(kURL, kOtherURL));
}
TEST_F(NetworkServiceNetworkDelegateTest, PrivacyModeEnabledIfCookiesBlocked) {
NetworkServiceNetworkDelegate delegate(network_context());
SetContentSetting(kURL, kOtherURL, CONTENT_SETTING_BLOCK);
EXPECT_TRUE(delegate.CanEnablePrivacyMode(kURL, kOtherURL));
}
TEST_F(NetworkServiceNetworkDelegateTest, PrivacyModeDisabledIfCookiesAllowed) {
NetworkServiceNetworkDelegate delegate(network_context());
SetContentSetting(kURL, kOtherURL, CONTENT_SETTING_ALLOW);
EXPECT_FALSE(delegate.CanEnablePrivacyMode(kURL, kOtherURL));
}
TEST_F(NetworkServiceNetworkDelegateTest,
PrivacyModeDisabledIfCookiesSettingForOtherURL) {
NetworkServiceNetworkDelegate delegate(network_context());
// URLs are switched so setting should not apply.
SetContentSetting(kOtherURL, kURL, CONTENT_SETTING_BLOCK);
EXPECT_FALSE(delegate.CanEnablePrivacyMode(kURL, kOtherURL));
}
TEST_F(NetworkServiceNetworkDelegateTest,
PrivacyModeEnabledIfThirdPartyCookiesBlocked) {
NetworkServiceNetworkDelegate delegate(network_context());
SetBlockThirdParty(true);
EXPECT_TRUE(delegate.CanEnablePrivacyMode(kURL, kOtherURL));
EXPECT_FALSE(delegate.CanEnablePrivacyMode(kURL, kURL));
SetBlockThirdParty(false);
EXPECT_FALSE(delegate.CanEnablePrivacyMode(kURL, kOtherURL));
EXPECT_FALSE(delegate.CanEnablePrivacyMode(kURL, kURL));
}
} // namespace
} // namespace network
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