12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// Use of this source code is governed by a BSD-style license that can be 32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project// found in the LICENSE file. 42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "android_webview/browser/aw_cookie_access_policy.h" 62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "android_webview/browser/aw_contents_io_thread_client.h" 82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "base/logging.h" 102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "base/memory/scoped_ptr.h" 112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "content/public/browser/browser_thread.h" 122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "content/public/browser/resource_request_info.h" 132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "net/base/net_errors.h" 142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectusing base::AutoLock; 162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectusing content::BrowserThread; 172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectusing content::ResourceRequestInfo; 182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectusing net::StaticCookiePolicy; 192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnamespace android_webview { 212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectnamespace { 232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbase::LazyInstance<AwCookieAccessPolicy>::Leaky g_lazy_instance; 242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} // namespace 252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 2653f17a9db278d33517d9888dd77848f554522a38JP AbgrallAwCookieAccessPolicy::~AwCookieAccessPolicy() { 272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectAwCookieAccessPolicy::AwCookieAccessPolicy() 302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project : accept_cookies_(true) { 312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source ProjectAwCookieAccessPolicy* AwCookieAccessPolicy::GetInstance() { 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return g_lazy_instance.Pointer(); 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbool AwCookieAccessPolicy::GetShouldAcceptCookies() { 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project AutoLock lock(lock_); 3953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return accept_cookies_; 4053f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 4153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 4253f17a9db278d33517d9888dd77848f554522a38JP Abgrallvoid AwCookieAccessPolicy::SetShouldAcceptCookies(bool allow) { 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project AutoLock lock(lock_); 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project accept_cookies_ = allow; 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 4653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 4753f17a9db278d33517d9888dd77848f554522a38JP Abgrallbool AwCookieAccessPolicy::GetShouldAcceptThirdPartyCookies( 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int render_process_id, 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int render_frame_id) { 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project scoped_ptr<AwContentsIoThreadClient> io_thread_client = 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project AwContentsIoThreadClient::FromID(render_process_id, render_frame_id); 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!io_thread_client) { 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return false; 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return io_thread_client->ShouldAcceptThirdPartyCookies(); 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbool AwCookieAccessPolicy::GetShouldAcceptThirdPartyCookies( 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const net::URLRequest& request) { 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(&request); 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!info) { 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return false; 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return GetShouldAcceptThirdPartyCookies(info->GetChildID(), 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project info->GetRenderFrameID()); 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbool AwCookieAccessPolicy::OnCanGetCookies(const net::URLRequest& request, 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const net::CookieList& cookie_list) { 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool global = GetShouldAcceptCookies(); 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool thirdParty = GetShouldAcceptThirdPartyCookies(request); 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return AwStaticCookiePolicy(global, thirdParty) 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project .AllowGet(request.url(), request.first_party_for_cookies()); 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbool AwCookieAccessPolicy::OnCanSetCookie(const net::URLRequest& request, 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const std::string& cookie_line, 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project net::CookieOptions* options) { 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool global = GetShouldAcceptCookies(); 8053f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool thirdParty = GetShouldAcceptThirdPartyCookies(request); 8153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return AwStaticCookiePolicy(global, thirdParty) 8253f17a9db278d33517d9888dd77848f554522a38JP Abgrall .AllowSet(request.url(), request.first_party_for_cookies()); 8353f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectbool AwCookieAccessPolicy::AllowGetCookie(const GURL& url, 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project const GURL& first_party, 8753f17a9db278d33517d9888dd77848f554522a38JP Abgrall const net::CookieList& cookie_list, 8853f17a9db278d33517d9888dd77848f554522a38JP Abgrall content::ResourceContext* context, 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int render_process_id, 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int render_frame_id) { 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool global = GetShouldAcceptCookies(); 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project bool thirdParty = 9353f17a9db278d33517d9888dd77848f554522a38JP Abgrall GetShouldAcceptThirdPartyCookies(render_process_id, render_frame_id); 9453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return AwStaticCookiePolicy(global, thirdParty).AllowGet(url, first_party); 9553f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 9653f17a9db278d33517d9888dd77848f554522a38JP Abgrall 9753f17a9db278d33517d9888dd77848f554522a38JP Abgrallbool AwCookieAccessPolicy::AllowSetCookie(const GURL& url, 9853f17a9db278d33517d9888dd77848f554522a38JP Abgrall const GURL& first_party, 9953f17a9db278d33517d9888dd77848f554522a38JP Abgrall const std::string& cookie_line, 10053f17a9db278d33517d9888dd77848f554522a38JP Abgrall content::ResourceContext* context, 10153f17a9db278d33517d9888dd77848f554522a38JP Abgrall int render_process_id, 10253f17a9db278d33517d9888dd77848f554522a38JP Abgrall int render_frame_id, 10353f17a9db278d33517d9888dd77848f554522a38JP Abgrall net::CookieOptions* options) { 10453f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool global = GetShouldAcceptCookies(); 10553f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool thirdParty = 10653f17a9db278d33517d9888dd77848f554522a38JP Abgrall GetShouldAcceptThirdPartyCookies(render_process_id, render_frame_id); 10753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return AwStaticCookiePolicy(global, thirdParty).AllowSet(url, first_party); 10853f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 10953f17a9db278d33517d9888dd77848f554522a38JP Abgrall 11053f17a9db278d33517d9888dd77848f554522a38JP AbgrallAwStaticCookiePolicy::AwStaticCookiePolicy(bool accept_cookies, 11153f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool accept_third_party_cookies) 11253f17a9db278d33517d9888dd77848f554522a38JP Abgrall : accept_cookies_(accept_cookies), 11353f17a9db278d33517d9888dd77848f554522a38JP Abgrall accept_third_party_cookies_(accept_third_party_cookies) { 11453f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 11553f17a9db278d33517d9888dd77848f554522a38JP Abgrall 11653f17a9db278d33517d9888dd77848f554522a38JP AbgrallStaticCookiePolicy::Type AwStaticCookiePolicy::GetPolicy(const GURL& url) 11753f17a9db278d33517d9888dd77848f554522a38JP Abgrall const { 11853f17a9db278d33517d9888dd77848f554522a38JP Abgrall // File URLs are a special case. We want file URLs to be able to set cookies 11953f17a9db278d33517d9888dd77848f554522a38JP Abgrall // but (for the purpose of cookies) Chrome considers different file URLs to 12053f17a9db278d33517d9888dd77848f554522a38JP Abgrall // come from different origins so we use the 'allow all' cookie policy for 12153f17a9db278d33517d9888dd77848f554522a38JP Abgrall // file URLs. 12253f17a9db278d33517d9888dd77848f554522a38JP Abgrall bool isFile = url.SchemeIsFile(); 12353f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (!accept_cookies()) { 12453f17a9db278d33517d9888dd77848f554522a38JP Abgrall return StaticCookiePolicy::BLOCK_ALL_COOKIES; 12553f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 12653f17a9db278d33517d9888dd77848f554522a38JP Abgrall if (accept_third_party_cookies() || isFile) { 12753f17a9db278d33517d9888dd77848f554522a38JP Abgrall return StaticCookiePolicy::ALLOW_ALL_COOKIES; 12853f17a9db278d33517d9888dd77848f554522a38JP Abgrall } 12953f17a9db278d33517d9888dd77848f554522a38JP Abgrall return StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES; 13053f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 13153f17a9db278d33517d9888dd77848f554522a38JP Abgrall 13253f17a9db278d33517d9888dd77848f554522a38JP Abgrallbool AwStaticCookiePolicy::AllowSet(const GURL& url, 13353f17a9db278d33517d9888dd77848f554522a38JP Abgrall const GURL& first_party) const { 13453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 13553f17a9db278d33517d9888dd77848f554522a38JP Abgrall return StaticCookiePolicy(GetPolicy(url)).CanSetCookie(url, first_party) == 13653f17a9db278d33517d9888dd77848f554522a38JP Abgrall net::OK; 13753f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 13853f17a9db278d33517d9888dd77848f554522a38JP Abgrall 13953f17a9db278d33517d9888dd77848f554522a38JP Abgrallbool AwStaticCookiePolicy::AllowGet(const GURL& url, 14053f17a9db278d33517d9888dd77848f554522a38JP Abgrall const GURL& first_party) const { 14153f17a9db278d33517d9888dd77848f554522a38JP Abgrall return StaticCookiePolicy(GetPolicy(url)).CanGetCookies(url, first_party) == 14253f17a9db278d33517d9888dd77848f554522a38JP Abgrall net::OK; 14353f17a9db278d33517d9888dd77848f554522a38JP Abgrall} 14453f17a9db278d33517d9888dd77848f554522a38JP Abgrall 14553f17a9db278d33517d9888dd77848f554522a38JP Abgrall} // namespace android_webview 14653f17a9db278d33517d9888dd77848f554522a38JP Abgrall