Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(667)

Side by Side Diff: extensions/common/permissions/permissions_data.h

Issue 348313003: Create withheld permissions (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Test fix Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef EXTENSIONS_COMMON_PERMISSIONS_PERMISSIONS_DATA_H_ 5 #ifndef EXTENSIONS_COMMON_PERMISSIONS_PERMISSIONS_DATA_H_
6 #define EXTENSIONS_COMMON_PERMISSIONS_PERMISSIONS_DATA_H_ 6 #define EXTENSIONS_COMMON_PERMISSIONS_PERMISSIONS_DATA_H_
7 7
8 #include <map> 8 #include <map>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 17 matching lines...) Expand all
28 class URLPatternSet; 28 class URLPatternSet;
29 class UserScript; 29 class UserScript;
30 30
31 // A container for the active permissions of an extension. 31 // A container for the active permissions of an extension.
32 // TODO(rdevlin.cronin): For the love of everything good, rename this class to 32 // TODO(rdevlin.cronin): For the love of everything good, rename this class to
33 // ActivePermissions. We do *not* need PermissionsParser, PermissionSet, 33 // ActivePermissions. We do *not* need PermissionsParser, PermissionSet,
34 // PermissionInfo, and PermissionsData. No one will be able to keep them 34 // PermissionInfo, and PermissionsData. No one will be able to keep them
35 // straight. 35 // straight.
36 class PermissionsData { 36 class PermissionsData {
37 public: 37 public:
38 // The possible types of access for a given frame.
39 enum AccessType {
40 DENY_ACCESS, // The extension is not allowed to access the given page.
41 ALLOW_ACCESS, // The extension is allowed to access the given page.
42 REQUEST_ACCESS // The browser must determine if the extension can access
not at google - send to devlin 2014/06/27 23:24:34 the concept of "request access" isn't really the c
Devlin 2014/06/30 17:06:10 Done (though sadly we use SCREAMING_STYLE instead
43 // the given page.
44 };
45
38 // Delegate class to allow different contexts (e.g. browser vs renderer) to 46 // Delegate class to allow different contexts (e.g. browser vs renderer) to
39 // have control over policy decisions. 47 // have control over policy decisions.
40 class PolicyDelegate { 48 class PolicyDelegate {
41 public: 49 public:
42 virtual ~PolicyDelegate() {} 50 virtual ~PolicyDelegate() {}
43 51
44 // Returns false if script access should be blocked on this page. 52 // Returns false if script access should be blocked on this page.
45 // Otherwise, default policy should decide. 53 // Otherwise, default policy should decide.
46 virtual bool CanExecuteScriptOnPage(const Extension* extension, 54 virtual bool CanExecuteScriptOnPage(const Extension* extension,
47 const GURL& document_url, 55 const GURL& document_url,
(...skipping 23 matching lines...) Expand all
71 // Returns true if the given |url| is restricted for the given |extension|, 79 // Returns true if the given |url| is restricted for the given |extension|,
72 // as is commonly the case for chrome:// urls. 80 // as is commonly the case for chrome:// urls.
73 // NOTE: You probably want to use CanAccessPage(). 81 // NOTE: You probably want to use CanAccessPage().
74 static bool IsRestrictedUrl(const GURL& document_url, 82 static bool IsRestrictedUrl(const GURL& document_url,
75 const GURL& top_frame_url, 83 const GURL& top_frame_url,
76 const Extension* extension, 84 const Extension* extension,
77 std::string* error); 85 std::string* error);
78 86
79 // Sets the runtime permissions of the given |extension| to |permissions|. 87 // Sets the runtime permissions of the given |extension| to |permissions|.
80 void SetActivePermissions(const PermissionSet* active) const; 88 void SetActivePermissions(const PermissionSet* active) const;
89 // Initializes the withheld/active permissions from |permissions|.
not at google - send to devlin 2014/06/27 23:24:34 blank line above here
Devlin 2014/06/30 17:06:10 Done.
90 void InitializePermissions(const PermissionSet* permissions,
not at google - send to devlin 2014/06/27 23:24:34 it's odd to call this InitializePermissions when i
Devlin 2014/06/30 17:06:10 I don't feel really strongly about the name on thi
Devlin 2014/06/30 20:28:58 Per offline chat, this has basically been moved to
91 const Extension* extension) const;
92
93 // Sets the runtime permissions of the given |extension| to |active| and
94 // |withheld|.
95 // This should only be used as a means of "copying" permissions data, e.g.
96 // to duplicate the information in the renderer.
not at google - send to devlin 2014/06/27 23:24:34 I don't see this method being used that way, like
Devlin 2014/06/30 17:06:10 You're right - I didn't update the comment after t
97 void SetPermissions(const PermissionSet* active,
98 const PermissionSet* withheld) const;
81 99
82 // Updates the tab-specific permissions of |tab_id| to include those from 100 // Updates the tab-specific permissions of |tab_id| to include those from
83 // |permissions|. 101 // |permissions|.
84 void UpdateTabSpecificPermissions( 102 void UpdateTabSpecificPermissions(
85 int tab_id, 103 int tab_id,
86 scoped_refptr<const PermissionSet> permissions) const; 104 scoped_refptr<const PermissionSet> permissions) const;
87 105
88 // Clears the tab-specific permissions of |tab_id|. 106 // Clears the tab-specific permissions of |tab_id|.
89 void ClearTabSpecificPermissions(int tab_id) const; 107 void ClearTabSpecificPermissions(int tab_id) const;
90 108
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
125 PermissionMessages GetPermissionMessages() const; 143 PermissionMessages GetPermissionMessages() const;
126 144
127 // Returns the full list of permission messages that should display at install 145 // Returns the full list of permission messages that should display at install
128 // time as strings. 146 // time as strings.
129 std::vector<base::string16> GetPermissionMessageStrings() const; 147 std::vector<base::string16> GetPermissionMessageStrings() const;
130 148
131 // Returns the full list of permission details for messages that should 149 // Returns the full list of permission details for messages that should
132 // display at install time as strings. 150 // display at install time as strings.
133 std::vector<base::string16> GetPermissionMessageDetailsStrings() const; 151 std::vector<base::string16> GetPermissionMessageDetailsStrings() const;
134 152
153 // The following three functions pertain to (possibly withheld) all-hosts
154 // permissions. Since all-hosts can take many different forms, we have
155 // these functions for them. Any additional withheld permissions should
156 // simply be checked, granted, and withheld via a generic
157 // HasWithheldPermission(), GrantWithheldPermission(), and
158 // WithholdPermission().
159
160 // Returns true if the extension has requested all-hosts permissions (or
161 // something close to it), but has had it withheld.
162 bool HasWithheldAllHosts() const;
not at google - send to devlin 2014/06/30 14:37:03 Why specifically all hosts? The way I was imaginin
Devlin 2014/06/30 17:06:10 See comment in ActiveTabPermissionGranter for why
not at google - send to devlin 2014/07/01 00:28:35 good points. moving this to PermissionsUpdater has
Devlin 2014/07/01 16:27:05 Yep.
163
164 // Grants any withheld all-hosts (or all-hosts-like) permissions.
165 void GrantWithheldAllHosts() const;
166
167 // Revokes any requests all-hosts (or all-hosts-like) permissions.
168 void WithholdAllHosts() const;
169
135 // Returns true if the |extension| has permission to access and interact with 170 // Returns true if the |extension| has permission to access and interact with
136 // the specified page, in order to do things like inject scripts or modify 171 // the specified page, in order to do things like inject scripts or modify
137 // the content. 172 // the content.
138 // If this returns false and |error| is non-NULL, |error| will be popualted 173 // If this returns false and |error| is non-NULL, |error| will be popualted
139 // with the reason the extension cannot access the page. 174 // with the reason the extension cannot access the page.
140 bool CanAccessPage(const Extension* extension, 175 bool CanAccessPage(const Extension* extension,
141 const GURL& document_url, 176 const GURL& document_url,
142 const GURL& top_document_url, 177 const GURL& top_document_url,
143 int tab_id, 178 int tab_id,
144 int process_id, 179 int process_id,
145 std::string* error) const; 180 std::string* error) const;
181 // Like CanAccessPage, but also takes withheld permissions into account.
182 // TODO(rdevlin.cronin) We shouldn't have two functions, but not all callers
183 // know how to wait for permission.
184 AccessType CanAccessPageWithUserConsent(const Extension* extension,
not at google - send to devlin 2014/06/27 23:24:34 in the spirit of the comment at the top of the enu
Devlin 2014/06/30 17:06:10 Shorter to write, yay.
185 const GURL& document_url,
186 const GURL& top_document_url,
187 int tab_id,
188 int process_id,
189 std::string* error) const;
146 190
147 // Returns true if the |extension| has permission to inject a content script 191 // Returns true if the |extension| has permission to inject a content script
148 // on the page. 192 // on the page.
149 // If this returns false and |error| is non-NULL, |error| will be popualted 193 // If this returns false and |error| is non-NULL, |error| will be popualted
150 // with the reason the extension cannot script the page. 194 // with the reason the extension cannot script the page.
151 // NOTE: You almost certainly want to use CanAccessPage() instead of this 195 // NOTE: You almost certainly want to use CanAccessPage() instead of this
152 // method. 196 // method.
153 bool CanRunContentScriptOnPage(const Extension* extension, 197 bool CanRunContentScriptOnPage(const Extension* extension,
154 const GURL& document_url, 198 const GURL& document_url,
155 const GURL& top_document_url, 199 const GURL& top_document_url,
156 int tab_id, 200 int tab_id,
157 int process_id, 201 int process_id,
158 std::string* error) const; 202 std::string* error) const;
203 // Like CanRunContentScriptOnPage, but also takes withheld permissions into
204 // account.
205 // TODO(rdevlin.cronin) We shouldn't have two functions, but not all callers
206 // know how to wait for permission.
207 AccessType CanRunContentScriptOnPageWithUserConsent(
not at google - send to devlin 2014/06/27 23:24:34 likewise, GetContentScriptAccess
Devlin 2014/06/30 17:06:10 Done.
208 const Extension* extension,
209 const GURL& document_url,
210 const GURL& top_document_url,
211 int tab_id,
212 int process_id,
213 std::string* error) const;
159 214
160 // Returns true if extension is allowed to obtain the contents of a page as 215 // Returns true if extension is allowed to obtain the contents of a page as
161 // an image. Since a page may contain sensitive information, this is 216 // an image. Since a page may contain sensitive information, this is
162 // restricted to the extension's host permissions as well as the extension 217 // restricted to the extension's host permissions as well as the extension
163 // page itself. 218 // page itself.
164 bool CanCaptureVisiblePage(int tab_id, std::string* error) const; 219 bool CanCaptureVisiblePage(int tab_id, std::string* error) const;
165 220
166 // Returns true if the user should be alerted that the |extension| is running
167 // a script. If |tab_id| and |url| are included, this also considers tab-
168 // specific permissions.
169 bool RequiresActionForScriptExecution(const Extension* extension) const;
170 bool RequiresActionForScriptExecution(const Extension* extension,
171 int tab_id,
172 const GURL& url) const;
173
174 scoped_refptr<const PermissionSet> active_permissions() const { 221 scoped_refptr<const PermissionSet> active_permissions() const {
175 base::AutoLock auto_lock(runtime_lock_); 222 base::AutoLock auto_lock(runtime_lock_);
176 return active_permissions_unsafe_; 223 return active_permissions_unsafe_;
177 } 224 }
178 225
226 scoped_refptr<const PermissionSet> withheld_permissions() const {
227 base::AutoLock auto_lock(runtime_lock_);
228 return withheld_permissions_unsafe_;
229 }
230
179 #if defined(UNIT_TEST) 231 #if defined(UNIT_TEST)
180 scoped_refptr<const PermissionSet> GetTabSpecificPermissionsForTesting( 232 scoped_refptr<const PermissionSet> GetTabSpecificPermissionsForTesting(
181 int tab_id) const { 233 int tab_id) const {
182 return GetTabSpecificPermissions(tab_id); 234 return GetTabSpecificPermissions(tab_id);
183 } 235 }
184 #endif 236 #endif
185 237
186 private: 238 private:
187 typedef std::map<int, scoped_refptr<const PermissionSet> > TabPermissionsMap; 239 typedef std::map<int, scoped_refptr<const PermissionSet> > TabPermissionsMap;
188 240
189 // Gets the tab-specific host permissions of |tab_id|, or NULL if there 241 // Gets the tab-specific host permissions of |tab_id|, or NULL if there
190 // aren't any. 242 // aren't any.
191 scoped_refptr<const PermissionSet> GetTabSpecificPermissions( 243 scoped_refptr<const PermissionSet> GetTabSpecificPermissions(
192 int tab_id) const; 244 int tab_id) const;
193 245
194 // Returns true if the |extension| has tab-specific permission to operate on 246 // Returns true if the |extension| has tab-specific permission to operate on
195 // the tab specified by |tab_id| with the given |url|. 247 // the tab specified by |tab_id| with the given |url|.
196 // Note that if this returns false, it doesn't mean the extension can't run on 248 // Note that if this returns false, it doesn't mean the extension can't run on
197 // the given tab, only that it does not have tab-specific permission to do so. 249 // the given tab, only that it does not have tab-specific permission to do so.
198 bool HasTabSpecificPermissionToExecuteScript(int tab_id, 250 bool HasTabSpecificPermissionToExecuteScript(int tab_id,
199 const GURL& url) const; 251 const GURL& url) const;
200 252
201 // Returns true if the extension is permitted to run on the given page, 253 // Returns whether or not the extension is permitted to run on the given page,
202 // checking against |permitted_url_patterns| in addition to blocking special 254 // checking against |permitted_url_patterns| in addition to blocking special
203 // sites (like the webstore or chrome:// urls). 255 // sites (like the webstore or chrome:// urls).
204 bool CanRunOnPage(const Extension* extension, 256 AccessType CanRunOnPage(const Extension* extension,
205 const GURL& document_url, 257 const GURL& document_url,
206 const GURL& top_document_url, 258 const GURL& top_document_url,
207 int tab_id, 259 int tab_id,
208 int process_id, 260 int process_id,
209 const URLPatternSet& permitted_url_patterns, 261 const URLPatternSet& permitted_url_patterns,
210 std::string* error) const; 262 const URLPatternSet& withheld_url_patterns,
263 std::string* error) const;
211 264
212 // The associated extension's id. 265 // The associated extension's id.
213 std::string extension_id_; 266 std::string extension_id_;
214 267
215 // The associated extension's manifest type. 268 // The associated extension's manifest type.
216 Manifest::Type manifest_type_; 269 Manifest::Type manifest_type_;
217 270
218 mutable base::Lock runtime_lock_; 271 mutable base::Lock runtime_lock_;
219 272
220 // The permission's which are currently active on the extension during 273 // The permission's which are currently active on the extension during
221 // runtime. 274 // runtime.
222 // Unsafe indicates that we must lock anytime this is directly accessed. 275 // Unsafe indicates that we must lock anytime this is directly accessed.
223 // Unless you need to change |active_permissions_unsafe_|, use the (safe) 276 // Unless you need to change |active_permissions_unsafe_|, use the (safe)
224 // active_permissions() accessor. 277 // active_permissions() accessor.
225 mutable scoped_refptr<const PermissionSet> active_permissions_unsafe_; 278 mutable scoped_refptr<const PermissionSet> active_permissions_unsafe_;
226 279
280 // The permissions the extension requested, but was not granted due because
281 // they are too powerful. This includes things like all_hosts.
282 // Unsafe indicates that we must lock anytime this is directly accessed.
283 // Unless you need to change |withheld_permissions_unsafe_|, use the (safe)
284 // withheld_permissions() accessor.
285 mutable scoped_refptr<const PermissionSet> withheld_permissions_unsafe_;
286
227 mutable TabPermissionsMap tab_specific_permissions_; 287 mutable TabPermissionsMap tab_specific_permissions_;
228 288
229 DISALLOW_COPY_AND_ASSIGN(PermissionsData); 289 DISALLOW_COPY_AND_ASSIGN(PermissionsData);
230 }; 290 };
231 291
232 } // namespace extensions 292 } // namespace extensions
233 293
234 #endif // EXTENSIONS_COMMON_PERMISSIONS_PERMISSIONS_DATA_H_ 294 #endif // EXTENSIONS_COMMON_PERMISSIONS_PERMISSIONS_DATA_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698