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