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