1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/net/chrome_cookie_policy.h" 6 7 #include "base/command_line.h" 8 #include "base/string_util.h" 9 #include "chrome/browser/content_settings/host_content_settings_map.h" 10 #include "chrome/browser/ui/browser_list.h" 11 #include "chrome/common/chrome_switches.h" 12 #include "content/browser/browser_thread.h" 13 #include "net/base/net_errors.h" 14 #include "net/base/static_cookie_policy.h" 15 16 // ---------------------------------------------------------------------------- 17 18 ChromeCookiePolicy::ChromeCookiePolicy(HostContentSettingsMap* map) 19 : host_content_settings_map_(map), 20 strict_third_party_blocking_( 21 CommandLine::ForCurrentProcess()->HasSwitch( 22 switches::kBlockReadingThirdPartyCookies)) {} 23 24 ChromeCookiePolicy::~ChromeCookiePolicy() {} 25 26 int ChromeCookiePolicy::CanGetCookies(const GURL& url, 27 const GURL& first_party) const { 28 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 29 30 if (host_content_settings_map_->BlockThirdPartyCookies()) { 31 net::StaticCookiePolicy policy(strict_third_party_blocking_ ? 32 net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES : 33 net::StaticCookiePolicy::BLOCK_SETTING_THIRD_PARTY_COOKIES); 34 int rv = policy.CanGetCookies(url, first_party); 35 DCHECK_NE(net::ERR_IO_PENDING, rv); 36 if (rv != net::OK) 37 return rv; 38 } 39 40 int policy = CheckPolicy(url); 41 if (policy == net::OK_FOR_SESSION_ONLY) 42 policy = net::OK; 43 DCHECK_NE(net::ERR_IO_PENDING, policy); 44 return policy; 45 } 46 47 int ChromeCookiePolicy::CanSetCookie(const GURL& url, 48 const GURL& first_party, 49 const std::string& cookie_line) const { 50 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 51 52 if (host_content_settings_map_->BlockThirdPartyCookies()) { 53 net::StaticCookiePolicy policy(strict_third_party_blocking_ ? 54 net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES : 55 net::StaticCookiePolicy::BLOCK_SETTING_THIRD_PARTY_COOKIES); 56 int rv = policy.CanSetCookie(url, first_party, cookie_line); 57 if (rv != net::OK) 58 return rv; 59 } 60 61 int policy = CheckPolicy(url); 62 DCHECK_NE(net::ERR_IO_PENDING, policy); 63 return policy; 64 } 65 66 int ChromeCookiePolicy::CheckPolicy(const GURL& url) const { 67 ContentSetting setting = host_content_settings_map_->GetContentSetting( 68 url, CONTENT_SETTINGS_TYPE_COOKIES, ""); 69 if (setting == CONTENT_SETTING_BLOCK) 70 return net::ERR_ACCESS_DENIED; 71 if (setting == CONTENT_SETTING_ALLOW) 72 return net::OK; 73 if (setting == CONTENT_SETTING_SESSION_ONLY) 74 return net::OK_FOR_SESSION_ONLY; 75 NOTREACHED(); 76 return net::ERR_ACCESS_DENIED; 77 } 78