15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "android_webview/browser/aw_cookie_access_policy.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "android_webview/browser/aw_contents_io_thread_client.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/browser/resource_request_info.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "net/base/net_errors.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::AutoLock; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)using content::ResourceRequestInfo; 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing net::StaticCookiePolicy; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace android_webview { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<AwCookieAccessPolicy>::Leaky g_lazy_instance; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AwCookieAccessPolicy::~AwCookieAccessPolicy() { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AwCookieAccessPolicy::AwCookieAccessPolicy() 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : accept_cookies_(true) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)AwCookieAccessPolicy* AwCookieAccessPolicy::GetInstance() { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_lazy_instance.Pointer(); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AwCookieAccessPolicy::GetShouldAcceptCookies() { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoLock lock(lock_); 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return accept_cookies_; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AwCookieAccessPolicy::SetShouldAcceptCookies(bool allow) { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AutoLock lock(lock_); 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) accept_cookies_ = allow; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AwCookieAccessPolicy::GetShouldAcceptThirdPartyCookies( 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int render_process_id, 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int render_frame_id) { 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<AwContentsIoThreadClient> io_thread_client = 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AwContentsIoThreadClient::FromID(render_process_id, render_frame_id); 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!io_thread_client) { 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return io_thread_client->ShouldAcceptThirdPartyCookies(); 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AwCookieAccessPolicy::GetShouldAcceptThirdPartyCookies( 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const net::URLRequest& request) { 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(&request); 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!info) { 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetShouldAcceptThirdPartyCookies(info->GetChildID(), 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) info->GetRenderFrameID()); 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AwCookieAccessPolicy::OnCanGetCookies(const net::URLRequest& request, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& cookie_list) { 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool global = GetShouldAcceptCookies(); 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool thirdParty = GetShouldAcceptThirdPartyCookies(request); 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return AwStaticCookiePolicy(global, thirdParty) 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) .AllowGet(request.url(), request.first_party_for_cookies()); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AwCookieAccessPolicy::OnCanSetCookie(const net::URLRequest& request, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieOptions* options) { 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool global = GetShouldAcceptCookies(); 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool thirdParty = GetShouldAcceptThirdPartyCookies(request); 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return AwStaticCookiePolicy(global, thirdParty) 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) .AllowSet(request.url(), request.first_party_for_cookies()); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AwCookieAccessPolicy::AllowGetCookie(const GURL& url, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CookieList& cookie_list, 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id) { 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool global = GetShouldAcceptCookies(); 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool thirdParty = 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetShouldAcceptThirdPartyCookies(render_process_id, render_frame_id); 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return AwStaticCookiePolicy(global, thirdParty).AllowGet(url, first_party); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool AwCookieAccessPolicy::AllowSetCookie(const GURL& url, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& first_party, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& cookie_line, 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::ResourceContext* context, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CookieOptions* options) { 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool global = GetShouldAcceptCookies(); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool thirdParty = 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetShouldAcceptThirdPartyCookies(render_process_id, render_frame_id); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return AwStaticCookiePolicy(global, thirdParty).AllowSet(url, first_party); 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AwStaticCookiePolicy::AwStaticCookiePolicy(bool accept_cookies, 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool accept_third_party_cookies) 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : accept_cookies_(accept_cookies), 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) accept_third_party_cookies_(accept_third_party_cookies) { 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 116bee9932bab44713b74b422b4b759b49f5a222977Bo LiuStaticCookiePolicy::Type AwStaticCookiePolicy::GetPolicy(const GURL& url) 117bee9932bab44713b74b422b4b759b49f5a222977Bo Liu const { 118bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // File URLs are a special case. We want file URLs to be able to set cookies 119bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // but (for the purpose of cookies) Chrome considers different file URLs to 120bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // come from different origins so we use the 'allow all' cookie policy for 121bee9932bab44713b74b422b4b759b49f5a222977Bo Liu // file URLs. 122bee9932bab44713b74b422b4b759b49f5a222977Bo Liu bool isFile = url.SchemeIsFile(); 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!accept_cookies()) { 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return StaticCookiePolicy::BLOCK_ALL_COOKIES; 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 126bee9932bab44713b74b422b4b759b49f5a222977Bo Liu if (accept_third_party_cookies() || isFile) { 127bee9932bab44713b74b422b4b759b49f5a222977Bo Liu return StaticCookiePolicy::ALLOW_ALL_COOKIES; 128bee9932bab44713b74b422b4b759b49f5a222977Bo Liu } 129bee9932bab44713b74b422b4b759b49f5a222977Bo Liu return StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES; 1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AwStaticCookiePolicy::AllowSet(const GURL& url, 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& first_party) const { 134bee9932bab44713b74b422b4b759b49f5a222977Bo Liu 135bee9932bab44713b74b422b4b759b49f5a222977Bo Liu return StaticCookiePolicy(GetPolicy(url)).CanSetCookie(url, first_party) == 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::OK; 1375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AwStaticCookiePolicy::AllowGet(const GURL& url, 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& first_party) const { 141bee9932bab44713b74b422b4b759b49f5a222977Bo Liu return StaticCookiePolicy(GetPolicy(url)).CanGetCookies(url, first_party) == 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) net::OK; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace android_webview 146