1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be
3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file.
4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/extensions/extension_special_storage_policy.h"
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/logging.h"
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/extensions/extension.h"
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/common/url_constants.h"
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
11dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenExtensionSpecialStoragePolicy::ExtensionSpecialStoragePolicy() {}
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
13dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenExtensionSpecialStoragePolicy::~ExtensionSpecialStoragePolicy() {}
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool ExtensionSpecialStoragePolicy::IsStorageProtected(const GURL& origin) {
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (origin.SchemeIs(chrome::kExtensionScheme))
17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return true;
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::AutoLock locker(lock_);
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return protected_apps_.Contains(origin);
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool ExtensionSpecialStoragePolicy::IsStorageUnlimited(const GURL& origin) {
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::AutoLock locker(lock_);
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return unlimited_extensions_.Contains(origin);
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
27ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ExtensionSpecialStoragePolicy::IsFileHandler(
28ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::string& extension_id) {
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  base::AutoLock locker(lock_);
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return file_handler_extensions_.ContainsExtension(extension_id);
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ExtensionSpecialStoragePolicy::GrantRightsForExtension(
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const Extension* extension) {
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(extension);
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!extension->is_hosted_app() &&
37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !extension->HasApiPermission(Extension::kUnlimitedStoragePermission) &&
38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !extension->HasApiPermission(Extension::kFileBrowserHandlerPermission)) {
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::AutoLock locker(lock_);
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (extension->is_hosted_app())
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    protected_apps_.Add(extension);
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (extension->HasApiPermission(Extension::kUnlimitedStoragePermission))
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    unlimited_extensions_.Add(extension);
46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (extension->HasApiPermission(Extension::kFileBrowserHandlerPermission))
47ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    file_handler_extensions_.Add(extension);
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ExtensionSpecialStoragePolicy::RevokeRightsForExtension(
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const Extension* extension) {
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  DCHECK(extension);
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (!extension->is_hosted_app() &&
54ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !extension->HasApiPermission(Extension::kUnlimitedStoragePermission) &&
55ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      !extension->HasApiPermission(Extension::kFileBrowserHandlerPermission)) {
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::AutoLock locker(lock_);
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (extension->is_hosted_app())
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    protected_apps_.Remove(extension);
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (extension->HasApiPermission(Extension::kUnlimitedStoragePermission))
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    unlimited_extensions_.Remove(extension);
63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (extension->HasApiPermission(Extension::kFileBrowserHandlerPermission))
64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    file_handler_extensions_.Remove(extension);
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ExtensionSpecialStoragePolicy::RevokeRightsForAllExtensions() {
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  base::AutoLock locker(lock_);
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  protected_apps_.Clear();
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  unlimited_extensions_.Clear();
71ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  file_handler_extensions_.Clear();
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//-----------------------------------------------------------------------------
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// SpecialCollection helper class
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen//-----------------------------------------------------------------------------
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
78dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenExtensionSpecialStoragePolicy::SpecialCollection::SpecialCollection() {}
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
80dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenExtensionSpecialStoragePolicy::SpecialCollection::~SpecialCollection() {}
81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenbool ExtensionSpecialStoragePolicy::SpecialCollection::Contains(
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const GURL& origin) {
84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  CachedResults::const_iterator found = cached_results_.find(origin);
85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  if (found != cached_results_.end())
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return found->second;
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (Extensions::const_iterator iter = extensions_.begin();
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen       iter != extensions_.end(); ++iter) {
90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    if (iter->second->OverlapsWithOrigin(origin)) {
91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen      cached_results_[origin] = true;
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return true;
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  cached_results_[origin] = false;
96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return false;
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenbool ExtensionSpecialStoragePolicy::SpecialCollection::ContainsExtension(
100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    const std::string& extension_id) {
101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  return extensions_.find(extension_id) != extensions_.end();
102ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
103ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ExtensionSpecialStoragePolicy::SpecialCollection::Add(
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const Extension* extension) {
106ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  cached_results_.clear();
107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extensions_[extension->id()] = extension;
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ExtensionSpecialStoragePolicy::SpecialCollection::Remove(
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    const Extension* extension) {
112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  cached_results_.clear();
113ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  extensions_.erase(extension->id());
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvoid ExtensionSpecialStoragePolicy::SpecialCollection::Clear() {
117ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  cached_results_.clear();
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  extensions_.clear();
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
120