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