| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2013 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 #ifndef CHROME_COMMON_EXTENSIONS_PERMISSIONS_PERMISSIONS_DATA_H_ | |
| 6 #define CHROME_COMMON_EXTENSIONS_PERMISSIONS_PERMISSIONS_DATA_H_ | |
| 7 | |
| 8 #include <map> | |
| 9 #include <vector> | |
| 10 | |
| 11 #include "base/memory/ref_counted.h" | |
| 12 #include "base/memory/scoped_ptr.h" | |
| 13 #include "base/strings/string16.h" | |
| 14 #include "base/synchronization/lock.h" | |
| 15 #include "extensions/common/permissions/api_permission.h" | |
| 16 #include "extensions/common/permissions/permission_message.h" | |
| 17 | |
| 18 class GURL; | |
| 19 | |
| 20 namespace extensions { | |
| 21 | |
| 22 class PermissionSet; | |
| 23 class APIPermissionSet; | |
| 24 class Extension; | |
| 25 class ManifestPermissionSet; | |
| 26 class URLPatternSet; | |
| 27 class UserScript; | |
| 28 | |
| 29 // A container for the permissions data of the extension; also responsible for | |
| 30 // parsing the "permissions" and "optional_permissions" manifest keys. This | |
| 31 // class also contains the active (runtime) permissions for the extension. | |
| 32 class PermissionsData { | |
| 33 public: | |
| 34 PermissionsData(); | |
| 35 ~PermissionsData(); | |
| 36 | |
| 37 // Delegate class to allow different contexts (e.g. browser vs renderer) to | |
| 38 // have control over policy decisions. | |
| 39 class PolicyDelegate { | |
| 40 public: | |
| 41 virtual ~PolicyDelegate() {} | |
| 42 | |
| 43 // Returns false if script access should be blocked on this page. | |
| 44 // Otherwise, default policy should decide. | |
| 45 virtual bool CanExecuteScriptOnPage(const Extension* extension, | |
| 46 const GURL& document_url, | |
| 47 const GURL& top_document_url, | |
| 48 int tab_id, | |
| 49 const UserScript* script, | |
| 50 int process_id, | |
| 51 std::string* error) = 0; | |
| 52 }; | |
| 53 | |
| 54 static void SetPolicyDelegate(PolicyDelegate* delegate); | |
| 55 | |
| 56 // Return the optional or required permission set for the given |extension|. | |
| 57 static const PermissionSet* GetOptionalPermissions( | |
| 58 const Extension* extension); | |
| 59 static const PermissionSet* GetRequiredPermissions( | |
| 60 const Extension* extension); | |
| 61 | |
| 62 // Return the temporary API permission set which is used during extension | |
| 63 // initialization. Once initialization completes, this is NULL. | |
| 64 static const APIPermissionSet* GetInitialAPIPermissions( | |
| 65 const Extension* extension); | |
| 66 static APIPermissionSet* GetInitialAPIPermissions(Extension* extension); | |
| 67 | |
| 68 // Set the scriptable hosts for the given |extension| during initialization. | |
| 69 static void SetInitialScriptableHosts(Extension* extension, | |
| 70 const URLPatternSet& scriptable_hosts); | |
| 71 | |
| 72 // Return the active (runtime) permissions for the given |extension|. | |
| 73 static scoped_refptr<const PermissionSet> GetActivePermissions( | |
| 74 const Extension* extension); | |
| 75 // Sets the runtime permissions of the given |extension| to |permissions|. | |
| 76 static void SetActivePermissions(const Extension* extension, | |
| 77 const PermissionSet* active); | |
| 78 | |
| 79 // Gets the tab-specific host permissions of |tab_id|, or NULL if there | |
| 80 // aren't any. | |
| 81 static scoped_refptr<const PermissionSet> GetTabSpecificPermissions( | |
| 82 const Extension* extension, | |
| 83 int tab_id); | |
| 84 // Updates the tab-specific permissions of |tab_id| to include those from | |
| 85 // |permissions|. | |
| 86 static void UpdateTabSpecificPermissions( | |
| 87 const Extension* extension, | |
| 88 int tab_id, | |
| 89 scoped_refptr<const PermissionSet> permissions); | |
| 90 // Clears the tab-specific permissions of |tab_id|. | |
| 91 static void ClearTabSpecificPermissions(const Extension* extension, | |
| 92 int tab_id); | |
| 93 | |
| 94 // Returns true if the |extension| has the given |permission|. Prefer | |
| 95 // IsExtensionWithPermissionOrSuggestInConsole when developers may be using an | |
| 96 // api that requires a permission they didn't know about, e.g. open web apis. | |
| 97 // Note this does not include APIs with no corresponding permission, like | |
| 98 // "runtime" or "browserAction". | |
| 99 // TODO(mpcomplete): drop the "API" from these names, it's confusing. | |
| 100 static bool HasAPIPermission(const Extension* extension, | |
| 101 APIPermission::ID permission); | |
| 102 static bool HasAPIPermission(const Extension* extension, | |
| 103 const std::string& permission_name); | |
| 104 static bool HasAPIPermissionForTab(const Extension* extension, | |
| 105 int tab_id, | |
| 106 APIPermission::ID permission); | |
| 107 | |
| 108 static bool CheckAPIPermissionWithParam( | |
| 109 const Extension* extension, | |
| 110 APIPermission::ID permission, | |
| 111 const APIPermission::CheckParam* param); | |
| 112 | |
| 113 static const URLPatternSet& GetEffectiveHostPermissions( | |
| 114 const Extension* extension); | |
| 115 | |
| 116 // Returns true if the |extension| can silently increase its permission level. | |
| 117 // Users must approve permissions for unpacked and packed extensions in the | |
| 118 // following situations: | |
| 119 // - when installing or upgrading packed extensions | |
| 120 // - when installing unpacked extensions that have NPAPI plugins | |
| 121 // - when either type of extension requests optional permissions | |
| 122 static bool CanSilentlyIncreasePermissions(const Extension* extension); | |
| 123 | |
| 124 // Returns true if the extension does not require permission warnings | |
| 125 // to be displayed at install time. | |
| 126 static bool ShouldSkipPermissionWarnings(const Extension* extension); | |
| 127 | |
| 128 // Whether the |extension| has access to the given |url|. | |
| 129 static bool HasHostPermission(const Extension* extension, const GURL& url); | |
| 130 | |
| 131 // Whether the |extension| has effective access to all hosts. This is true if | |
| 132 // there is a content script that matches all hosts, if there is a host | |
| 133 // permission grants access to all hosts (like <all_urls>) or an api | |
| 134 // permission that effectively grants access to all hosts (e.g. proxy, | |
| 135 // network, etc.) | |
| 136 static bool HasEffectiveAccessToAllHosts(const Extension* extension); | |
| 137 | |
| 138 // Returns the full list of permission messages that the given |extension| | |
| 139 // should display at install time. | |
| 140 static PermissionMessages GetPermissionMessages(const Extension* extension); | |
| 141 // Returns the full list of permission messages that the given |extension| | |
| 142 // should display at install time. The messages are returned as strings | |
| 143 // for convenience. | |
| 144 static std::vector<string16> GetPermissionMessageStrings( | |
| 145 const Extension* extension); | |
| 146 | |
| 147 // Returns the full list of permission details for messages that the given | |
| 148 // |extension| should display at install time. The messages are returned as | |
| 149 // strings for convenience. | |
| 150 static std::vector<string16> GetPermissionMessageDetailsStrings( | |
| 151 const Extension* extension); | |
| 152 | |
| 153 // Returns true if the given |extension| can execute script on a page. If a | |
| 154 // UserScript object is passed, permission to run that specific script is | |
| 155 // checked (using its matches list). Otherwise, permission to execute script | |
| 156 // programmatically is checked (using the extension's host permission). | |
| 157 // | |
| 158 // This method is also aware of certain special pages that extensions are | |
| 159 // usually not allowed to run script on. | |
| 160 static bool CanExecuteScriptOnPage(const Extension* extension, | |
| 161 const GURL& document_url, | |
| 162 const GURL& top_document_url, | |
| 163 int tab_id, | |
| 164 const UserScript* script, | |
| 165 int process_id, | |
| 166 std::string* error); | |
| 167 | |
| 168 // Returns true if the given |extension| is a COMPONENT extension, or if it is | |
| 169 // on the whitelist of extensions that can script all pages. | |
| 170 static bool CanExecuteScriptEverywhere(const Extension* extension); | |
| 171 | |
| 172 // Returns true if the |extension| is allowed to obtain the contents of a | |
| 173 // page as an image. Since a page may contain sensitive information, this | |
| 174 // is restricted to the extension's host permissions as well as the | |
| 175 // extension page itself. | |
| 176 static bool CanCaptureVisiblePage(const Extension* extension, | |
| 177 const GURL& page_url, | |
| 178 int tab_id, | |
| 179 std::string* error); | |
| 180 | |
| 181 // Parse the permissions of a given extension in the initialization process. | |
| 182 bool ParsePermissions(Extension* extension, string16* error); | |
| 183 | |
| 184 // Ensure manifest handlers provide their custom manifest permissions. | |
| 185 void InitializeManifestPermissions(Extension* extension); | |
| 186 | |
| 187 // Finalize permissions after the initialization process completes. | |
| 188 void FinalizePermissions(Extension* extension); | |
| 189 | |
| 190 private: | |
| 191 struct InitialPermissions; | |
| 192 typedef std::map<int, scoped_refptr<const PermissionSet> > TabPermissionsMap; | |
| 193 | |
| 194 // Temporary permissions during the initialization process; NULL after | |
| 195 // initialization completes. | |
| 196 scoped_ptr<InitialPermissions> initial_required_permissions_; | |
| 197 scoped_ptr<InitialPermissions> initial_optional_permissions_; | |
| 198 | |
| 199 // The set of permissions the extension can request at runtime. | |
| 200 scoped_refptr<const PermissionSet> optional_permission_set_; | |
| 201 | |
| 202 // The extension's required / default set of permissions. | |
| 203 scoped_refptr<const PermissionSet> required_permission_set_; | |
| 204 | |
| 205 mutable base::Lock runtime_lock_; | |
| 206 | |
| 207 // The permission's which are currently active on the extension during | |
| 208 // runtime. | |
| 209 mutable scoped_refptr<const PermissionSet> active_permissions_; | |
| 210 | |
| 211 mutable TabPermissionsMap tab_specific_permissions_; | |
| 212 | |
| 213 DISALLOW_COPY_AND_ASSIGN(PermissionsData); | |
| 214 }; | |
| 215 | |
| 216 } // namespace extensions | |
| 217 | |
| 218 #endif // CHROME_COMMON_EXTENSIONS_PERMISSIONS_PERMISSIONS_DATA_H_ | |
| OLD | NEW |