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