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