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

Side by Side Diff: content/browser/shared/child_process_security_policy_helper.cc

Issue 2111343002: Move implementation of ChildProcessSecurityPolicyImpl to c/b/shared, and wrap in c/b (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mffr-win
Patch Set: . Created 4 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "content/browser/child_process_security_policy_impl.h" 5 #include "content/browser/shared/child_process_security_policy_helper.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/files/file_path.h" 11 #include "base/files/file_path.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/macros.h" 13 #include "base/macros.h"
14 #include "base/metrics/histogram.h" 14 #include "base/metrics/histogram.h"
15 #include "base/stl_util.h" 15 #include "base/stl_util.h"
(...skipping 14 matching lines...) Expand all
30 #include "storage/common/fileapi/file_system_util.h" 30 #include "storage/common/fileapi/file_system_util.h"
31 #include "url/gurl.h" 31 #include "url/gurl.h"
32 32
33 namespace content { 33 namespace content {
34 34
35 namespace { 35 namespace {
36 36
37 // Used internally only. These bit positions have no relationship to any 37 // Used internally only. These bit positions have no relationship to any
38 // underlying OS and can be changed to accommodate finer-grained permissions. 38 // underlying OS and can be changed to accommodate finer-grained permissions.
39 enum ChildProcessSecurityPermissions { 39 enum ChildProcessSecurityPermissions {
40 READ_FILE_PERMISSION = 1 << 0, 40 READ_FILE_PERMISSION = 1 << 0,
41 WRITE_FILE_PERMISSION = 1 << 1, 41 WRITE_FILE_PERMISSION = 1 << 1,
42 CREATE_NEW_FILE_PERMISSION = 1 << 2, 42 CREATE_NEW_FILE_PERMISSION = 1 << 2,
43 CREATE_OVERWRITE_FILE_PERMISSION = 1 << 3, 43 CREATE_OVERWRITE_FILE_PERMISSION = 1 << 3,
44 DELETE_FILE_PERMISSION = 1 << 4, 44 DELETE_FILE_PERMISSION = 1 << 4,
45 45
46 // Used by Media Galleries API 46 // Used by Media Galleries API
47 COPY_INTO_FILE_PERMISSION = 1 << 5, 47 COPY_INTO_FILE_PERMISSION = 1 << 5,
48 }; 48 };
49 49
50 // Used internally only. Bitmasks that are actually used by the Grant* and Can* 50 // Used internally only. Bitmasks that are actually used by the Grant* and Can*
51 // methods. These contain one or more ChildProcessSecurityPermissions. 51 // methods. These contain one or more ChildProcessSecurityPermissions.
52 enum ChildProcessSecurityGrants { 52 enum ChildProcessSecurityGrants {
53 READ_FILE_GRANT = READ_FILE_PERMISSION, 53 READ_FILE_GRANT = READ_FILE_PERMISSION,
54 WRITE_FILE_GRANT = WRITE_FILE_PERMISSION, 54 WRITE_FILE_GRANT = WRITE_FILE_PERMISSION,
55 55
56 CREATE_NEW_FILE_GRANT = CREATE_NEW_FILE_PERMISSION | 56 CREATE_NEW_FILE_GRANT =
57 COPY_INTO_FILE_PERMISSION, 57 CREATE_NEW_FILE_PERMISSION | COPY_INTO_FILE_PERMISSION,
58 58
59 CREATE_READ_WRITE_FILE_GRANT = CREATE_NEW_FILE_PERMISSION | 59 CREATE_READ_WRITE_FILE_GRANT = CREATE_NEW_FILE_PERMISSION |
60 CREATE_OVERWRITE_FILE_PERMISSION | 60 CREATE_OVERWRITE_FILE_PERMISSION |
61 READ_FILE_PERMISSION | 61 READ_FILE_PERMISSION |
62 WRITE_FILE_PERMISSION | 62 WRITE_FILE_PERMISSION |
63 COPY_INTO_FILE_PERMISSION | 63 COPY_INTO_FILE_PERMISSION |
64 DELETE_FILE_PERMISSION, 64 DELETE_FILE_PERMISSION,
65 65
66 COPY_INTO_FILE_GRANT = COPY_INTO_FILE_PERMISSION, 66 COPY_INTO_FILE_GRANT = COPY_INTO_FILE_PERMISSION,
67 DELETE_FILE_GRANT = DELETE_FILE_PERMISSION, 67 DELETE_FILE_GRANT = DELETE_FILE_PERMISSION,
68 }; 68 };
69 69
70 } // namespace 70 } // namespace
71 71
72 // The SecurityState class is used to maintain per-child process security state 72 // The SecurityState class is used to maintain per-child process security state
73 // information. 73 // information.
74 class ChildProcessSecurityPolicyImpl::SecurityState { 74 class ChildProcessSecurityPolicyHelper::SecurityState {
75 public: 75 public:
76 SecurityState() 76 SecurityState()
77 : enabled_bindings_(0), 77 : enabled_bindings_(0),
78 can_read_raw_cookies_(false), 78 can_read_raw_cookies_(false),
79 can_send_midi_sysex_(false) { } 79 can_send_midi_sysex_(false) {}
80 80
81 ~SecurityState() { 81 ~SecurityState() {
82 scheme_policy_.clear(); 82 scheme_policy_.clear();
83 storage::IsolatedContext* isolated_context = 83 storage::IsolatedContext* isolated_context =
84 storage::IsolatedContext::GetInstance(); 84 storage::IsolatedContext::GetInstance();
85 for (FileSystemMap::iterator iter = filesystem_permissions_.begin(); 85 for (FileSystemMap::iterator iter = filesystem_permissions_.begin();
86 iter != filesystem_permissions_.end(); 86 iter != filesystem_permissions_.end(); ++iter) {
87 ++iter) {
88 isolated_context->RemoveReference(iter->first); 87 isolated_context->RemoveReference(iter->first);
89 } 88 }
90 UMA_HISTOGRAM_COUNTS("ChildProcessSecurityPolicy.PerChildFilePermissions", 89 UMA_HISTOGRAM_COUNTS("ChildProcessSecurityPolicy.PerChildFilePermissions",
91 file_permissions_.size()); 90 file_permissions_.size());
92 } 91 }
93 92
94 // Grant permission to request URLs with the specified origin. 93 // Grant permission to request URLs with the specified origin.
95 void GrantOrigin(const url::Origin& origin) { 94 void GrantOrigin(const url::Origin& origin) { origin_set_.insert(origin); }
96 origin_set_.insert(origin);
97 }
98 95
99 // Grant permission to request URLs with the specified scheme. 96 // Grant permission to request URLs with the specified scheme.
100 void GrantScheme(const std::string& scheme) { 97 void GrantScheme(const std::string& scheme) { scheme_policy_[scheme] = true; }
101 scheme_policy_[scheme] = true;
102 }
103 98
104 // Revoke permission to request URLs with the specified scheme. 99 // Revoke permission to request URLs with the specified scheme.
105 void RevokeScheme(const std::string& scheme) { 100 void RevokeScheme(const std::string& scheme) {
106 scheme_policy_[scheme] = false; 101 scheme_policy_[scheme] = false;
107 } 102 }
108 103
109 // Grant certain permissions to a file. 104 // Grant certain permissions to a file.
110 void GrantPermissionsForFile(const base::FilePath& file, int permissions) { 105 void GrantPermissionsForFile(const base::FilePath& file, int permissions) {
111 base::FilePath stripped = file.StripTrailingSeparators(); 106 base::FilePath stripped = file.StripTrailingSeparators();
112 file_permissions_[stripped] |= permissions; 107 file_permissions_[stripped] |= permissions;
113 UMA_HISTOGRAM_COUNTS("ChildProcessSecurityPolicy.FilePermissionPathLength", 108 UMA_HISTOGRAM_COUNTS("ChildProcessSecurityPolicy.FilePermissionPathLength",
114 stripped.value().size()); 109 stripped.value().size());
115 } 110 }
116 111
117 // Grant navigation to a file but not the file:// scheme in general. 112 // Grant navigation to a file but not the file:// scheme in general.
118 void GrantRequestOfSpecificFile(const base::FilePath &file) { 113 void GrantRequestOfSpecificFile(const base::FilePath& file) {
119 request_file_set_.insert(file.StripTrailingSeparators()); 114 request_file_set_.insert(file.StripTrailingSeparators());
120 } 115 }
121 116
122 // Revokes all permissions granted to a file. 117 // Revokes all permissions granted to a file.
123 void RevokeAllPermissionsForFile(const base::FilePath& file) { 118 void RevokeAllPermissionsForFile(const base::FilePath& file) {
124 base::FilePath stripped = file.StripTrailingSeparators(); 119 base::FilePath stripped = file.StripTrailingSeparators();
125 file_permissions_.erase(stripped); 120 file_permissions_.erase(stripped);
126 request_file_set_.erase(stripped); 121 request_file_set_.erase(stripped);
127 } 122 }
128 123
(...skipping 23 matching lines...) Expand all
152 if (!permissions) 147 if (!permissions)
153 return false; 148 return false;
154 base::FilePath file_path = file.StripTrailingSeparators(); 149 base::FilePath file_path = file.StripTrailingSeparators();
155 FileMap::const_iterator it = file_permissions_.find(file_path); 150 FileMap::const_iterator it = file_permissions_.find(file_path);
156 if (it != file_permissions_.end()) 151 if (it != file_permissions_.end())
157 return (it->second & permissions) == permissions; 152 return (it->second & permissions) == permissions;
158 return false; 153 return false;
159 } 154 }
160 #endif 155 #endif
161 156
162 void GrantBindings(int bindings) { 157 void GrantBindings(int bindings) { enabled_bindings_ |= bindings; }
163 enabled_bindings_ |= bindings;
164 }
165 158
166 void GrantReadRawCookies() { 159 void GrantReadRawCookies() { can_read_raw_cookies_ = true; }
167 can_read_raw_cookies_ = true;
168 }
169 160
170 void RevokeReadRawCookies() { 161 void RevokeReadRawCookies() { can_read_raw_cookies_ = false; }
171 can_read_raw_cookies_ = false;
172 }
173 162
174 void GrantPermissionForMidiSysEx() { 163 void GrantPermissionForMidiSysEx() { can_send_midi_sysex_ = true; }
175 can_send_midi_sysex_ = true;
176 }
177 164
178 // Determine whether permission has been granted to commit |url|. 165 // Determine whether permission has been granted to commit |url|.
179 bool CanCommitURL(const GURL& url) { 166 bool CanCommitURL(const GURL& url) {
180 // Having permission to a scheme implies permission to all of its URLs. 167 // Having permission to a scheme implies permission to all of its URLs.
181 SchemeMap::const_iterator scheme_judgment( 168 SchemeMap::const_iterator scheme_judgment(
182 scheme_policy_.find(url.scheme())); 169 scheme_policy_.find(url.scheme()));
183 if (scheme_judgment != scheme_policy_.end()) 170 if (scheme_judgment != scheme_policy_.end())
184 return scheme_judgment->second; 171 return scheme_judgment->second;
185 172
186 // Otherwise, check for permission for specific origin. 173 // Otherwise, check for permission for specific origin.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 bool CanAccessDataForOrigin(const GURL& gurl) { 218 bool CanAccessDataForOrigin(const GURL& gurl) {
232 if (origin_lock_.is_empty()) 219 if (origin_lock_.is_empty())
233 return true; 220 return true;
234 // TODO(creis): We must pass the valid browser_context to convert hosted 221 // TODO(creis): We must pass the valid browser_context to convert hosted
235 // apps URLs. Currently, hosted apps cannot set cookies in this mode. 222 // apps URLs. Currently, hosted apps cannot set cookies in this mode.
236 // See http://crbug.com/160576. 223 // See http://crbug.com/160576.
237 GURL site_gurl = SiteInstanceImpl::GetSiteForURL(NULL, gurl); 224 GURL site_gurl = SiteInstanceImpl::GetSiteForURL(NULL, gurl);
238 return origin_lock_ == site_gurl; 225 return origin_lock_ == site_gurl;
239 } 226 }
240 227
241 void LockToOrigin(const GURL& gurl) { 228 void LockToOrigin(const GURL& gurl) { origin_lock_ = gurl; }
242 origin_lock_ = gurl;
243 }
244 229
245 bool has_web_ui_bindings() const { 230 bool has_web_ui_bindings() const {
246 return enabled_bindings_ & BINDINGS_POLICY_WEB_UI; 231 return enabled_bindings_ & BINDINGS_POLICY_WEB_UI;
247 } 232 }
248 233
249 bool can_read_raw_cookies() const { 234 bool can_read_raw_cookies() const { return can_read_raw_cookies_; }
250 return can_read_raw_cookies_;
251 }
252 235
253 bool can_send_midi_sysex() const { 236 bool can_send_midi_sysex() const { return can_send_midi_sysex_; }
254 return can_send_midi_sysex_;
255 }
256 237
257 private: 238 private:
258 typedef std::map<std::string, bool> SchemeMap; 239 typedef std::map<std::string, bool> SchemeMap;
259 typedef std::set<url::Origin> OriginSet; 240 typedef std::set<url::Origin> OriginSet;
260 241
261 typedef int FilePermissionFlags; // bit-set of base::File::Flags 242 typedef int FilePermissionFlags; // bit-set of base::File::Flags
262 typedef std::map<base::FilePath, FilePermissionFlags> FileMap; 243 typedef std::map<base::FilePath, FilePermissionFlags> FileMap;
263 typedef std::map<std::string, FilePermissionFlags> FileSystemMap; 244 typedef std::map<std::string, FilePermissionFlags> FileSystemMap;
264 typedef std::set<base::FilePath> FileSet; 245 typedef std::set<base::FilePath> FileSet;
265 246
(...skipping 21 matching lines...) Expand all
287 bool can_send_midi_sysex_; 268 bool can_send_midi_sysex_;
288 269
289 GURL origin_lock_; 270 GURL origin_lock_;
290 271
291 // The set of isolated filesystems the child process is permitted to access. 272 // The set of isolated filesystems the child process is permitted to access.
292 FileSystemMap filesystem_permissions_; 273 FileSystemMap filesystem_permissions_;
293 274
294 DISALLOW_COPY_AND_ASSIGN(SecurityState); 275 DISALLOW_COPY_AND_ASSIGN(SecurityState);
295 }; 276 };
296 277
297 ChildProcessSecurityPolicyImpl::ChildProcessSecurityPolicyImpl() { 278 ChildProcessSecurityPolicyHelper::ChildProcessSecurityPolicyHelper() {
298 // We know about these schemes and believe them to be safe. 279 // We know about these schemes and believe them to be safe.
299 RegisterWebSafeScheme(url::kHttpScheme); 280 RegisterWebSafeScheme(url::kHttpScheme);
300 RegisterWebSafeScheme(url::kHttpsScheme); 281 RegisterWebSafeScheme(url::kHttpsScheme);
301 RegisterWebSafeScheme(url::kFtpScheme); 282 RegisterWebSafeScheme(url::kFtpScheme);
302 RegisterWebSafeScheme(url::kDataScheme); 283 RegisterWebSafeScheme(url::kDataScheme);
303 RegisterWebSafeScheme("feed"); 284 RegisterWebSafeScheme("feed");
304 RegisterWebSafeScheme(url::kBlobScheme); 285 RegisterWebSafeScheme(url::kBlobScheme);
305 RegisterWebSafeScheme(url::kFileSystemScheme); 286 RegisterWebSafeScheme(url::kFileSystemScheme);
306 287
307 // We know about the following pseudo schemes and treat them specially. 288 // We know about the following pseudo schemes and treat them specially.
308 RegisterPseudoScheme(url::kAboutScheme); 289 RegisterPseudoScheme(url::kAboutScheme);
309 RegisterPseudoScheme(url::kJavaScriptScheme); 290 RegisterPseudoScheme(url::kJavaScriptScheme);
310 RegisterPseudoScheme(kViewSourceScheme); 291 RegisterPseudoScheme(kViewSourceScheme);
311 } 292 }
312 293
313 ChildProcessSecurityPolicyImpl::~ChildProcessSecurityPolicyImpl() { 294 ChildProcessSecurityPolicyHelper::~ChildProcessSecurityPolicyHelper() {
314 web_safe_schemes_.clear(); 295 web_safe_schemes_.clear();
315 pseudo_schemes_.clear(); 296 pseudo_schemes_.clear();
316 STLDeleteContainerPairSecondPointers(security_state_.begin(), 297 STLDeleteContainerPairSecondPointers(security_state_.begin(),
317 security_state_.end()); 298 security_state_.end());
318 security_state_.clear(); 299 security_state_.clear();
319 } 300 }
320 301
321 // static 302 ChildProcessSecurityPolicyHelper*
322 ChildProcessSecurityPolicy* ChildProcessSecurityPolicy::GetInstance() { 303 ChildProcessSecurityPolicyHelper::GetInstance() {
323 return ChildProcessSecurityPolicyImpl::GetInstance(); 304 return base::Singleton<ChildProcessSecurityPolicyHelper>::get();
324 } 305 }
325 306
326 ChildProcessSecurityPolicyImpl* ChildProcessSecurityPolicyImpl::GetInstance() { 307 void ChildProcessSecurityPolicyHelper::Add(int child_id) {
327 return base::Singleton<ChildProcessSecurityPolicyImpl>::get();
328 }
329
330 void ChildProcessSecurityPolicyImpl::Add(int child_id) {
331 base::AutoLock lock(lock_); 308 base::AutoLock lock(lock_);
332 AddChild(child_id); 309 AddChild(child_id);
333 } 310 }
334 311
335 void ChildProcessSecurityPolicyImpl::AddWorker(int child_id, 312 void ChildProcessSecurityPolicyHelper::AddWorker(int child_id,
336 int main_render_process_id) { 313 int main_render_process_id) {
337 base::AutoLock lock(lock_); 314 base::AutoLock lock(lock_);
338 AddChild(child_id); 315 AddChild(child_id);
339 worker_map_[child_id] = main_render_process_id; 316 worker_map_[child_id] = main_render_process_id;
340 } 317 }
341 318
342 void ChildProcessSecurityPolicyImpl::Remove(int child_id) { 319 void ChildProcessSecurityPolicyHelper::Remove(int child_id) {
343 base::AutoLock lock(lock_); 320 base::AutoLock lock(lock_);
344 SecurityStateMap::iterator it = security_state_.find(child_id); 321 SecurityStateMap::iterator it = security_state_.find(child_id);
345 if (it == security_state_.end()) 322 if (it == security_state_.end())
346 return; // May be called multiple times. 323 return; // May be called multiple times.
347 324
348 delete it->second; 325 delete it->second;
349 security_state_.erase(it); 326 security_state_.erase(it);
350 worker_map_.erase(child_id); 327 worker_map_.erase(child_id);
351 } 328 }
352 329
353 void ChildProcessSecurityPolicyImpl::RegisterWebSafeScheme( 330 void ChildProcessSecurityPolicyHelper::RegisterWebSafeScheme(
354 const std::string& scheme) { 331 const std::string& scheme) {
355 base::AutoLock lock(lock_); 332 base::AutoLock lock(lock_);
356 DCHECK_EQ(0U, web_safe_schemes_.count(scheme)) << "Add schemes at most once."; 333 DCHECK_EQ(0U, web_safe_schemes_.count(scheme)) << "Add schemes at most once.";
357 DCHECK_EQ(0U, pseudo_schemes_.count(scheme)) 334 DCHECK_EQ(0U, pseudo_schemes_.count(scheme))
358 << "Web-safe implies not pseudo."; 335 << "Web-safe implies not pseudo.";
359 336
360 web_safe_schemes_.insert(scheme); 337 web_safe_schemes_.insert(scheme);
361 } 338 }
362 339
363 bool ChildProcessSecurityPolicyImpl::IsWebSafeScheme( 340 bool ChildProcessSecurityPolicyHelper::IsWebSafeScheme(
364 const std::string& scheme) { 341 const std::string& scheme) {
365 base::AutoLock lock(lock_); 342 base::AutoLock lock(lock_);
366 343
367 return ContainsKey(web_safe_schemes_, scheme); 344 return ContainsKey(web_safe_schemes_, scheme);
368 } 345 }
369 346
370 void ChildProcessSecurityPolicyImpl::RegisterPseudoScheme( 347 void ChildProcessSecurityPolicyHelper::RegisterPseudoScheme(
371 const std::string& scheme) { 348 const std::string& scheme) {
372 base::AutoLock lock(lock_); 349 base::AutoLock lock(lock_);
373 DCHECK_EQ(0U, pseudo_schemes_.count(scheme)) << "Add schemes at most once."; 350 DCHECK_EQ(0U, pseudo_schemes_.count(scheme)) << "Add schemes at most once.";
374 DCHECK_EQ(0U, web_safe_schemes_.count(scheme)) 351 DCHECK_EQ(0U, web_safe_schemes_.count(scheme))
375 << "Pseudo implies not web-safe."; 352 << "Pseudo implies not web-safe.";
376 353
377 pseudo_schemes_.insert(scheme); 354 pseudo_schemes_.insert(scheme);
378 } 355 }
379 356
380 bool ChildProcessSecurityPolicyImpl::IsPseudoScheme( 357 bool ChildProcessSecurityPolicyHelper::IsPseudoScheme(
381 const std::string& scheme) { 358 const std::string& scheme) {
382 base::AutoLock lock(lock_); 359 base::AutoLock lock(lock_);
383 360
384 return ContainsKey(pseudo_schemes_, scheme); 361 return ContainsKey(pseudo_schemes_, scheme);
385 } 362 }
386 363
387 void ChildProcessSecurityPolicyImpl::GrantRequestURL( 364 void ChildProcessSecurityPolicyHelper::GrantRequestURL(int child_id,
388 int child_id, const GURL& url) { 365 const GURL& url) {
389
390 if (!url.is_valid()) 366 if (!url.is_valid())
391 return; // Can't grant the capability to request invalid URLs. 367 return; // Can't grant the capability to request invalid URLs.
392 368
393 if (IsWebSafeScheme(url.scheme())) 369 if (IsWebSafeScheme(url.scheme()))
394 return; // The scheme has already been whitelisted for every child process. 370 return; // The scheme has already been whitelisted for every child process.
395 371
396 if (IsPseudoScheme(url.scheme())) { 372 if (IsPseudoScheme(url.scheme())) {
397 return; // Can't grant the capability to request pseudo schemes. 373 return; // Can't grant the capability to request pseudo schemes.
398 } 374 }
399 375
400 { 376 {
401 base::AutoLock lock(lock_); 377 base::AutoLock lock(lock_);
402 SecurityStateMap::iterator state = security_state_.find(child_id); 378 SecurityStateMap::iterator state = security_state_.find(child_id);
403 if (state == security_state_.end()) 379 if (state == security_state_.end())
404 return; 380 return;
405 381
406 // When the child process has been commanded to request this scheme, 382 // When the child process has been commanded to request this scheme,
407 // we grant it the capability to request all URLs of that scheme. 383 // we grant it the capability to request all URLs of that scheme.
408 state->second->GrantScheme(url.scheme()); 384 state->second->GrantScheme(url.scheme());
409 } 385 }
410 } 386 }
411 387
412 void ChildProcessSecurityPolicyImpl::GrantRequestSpecificFileURL( 388 void ChildProcessSecurityPolicyHelper::GrantRequestSpecificFileURL(
413 int child_id, 389 int child_id,
414 const GURL& url) { 390 const GURL& url) {
415 if (!url.SchemeIs(url::kFileScheme)) 391 if (!url.SchemeIs(url::kFileScheme))
416 return; 392 return;
417 393
418 { 394 {
419 base::AutoLock lock(lock_); 395 base::AutoLock lock(lock_);
420 SecurityStateMap::iterator state = security_state_.find(child_id); 396 SecurityStateMap::iterator state = security_state_.find(child_id);
421 if (state == security_state_.end()) 397 if (state == security_state_.end())
422 return; 398 return;
423 399
424 // When the child process has been commanded to request a file:// URL, 400 // When the child process has been commanded to request a file:// URL,
425 // then we grant it the capability for that URL only. 401 // then we grant it the capability for that URL only.
426 base::FilePath path; 402 base::FilePath path;
427 if (net::FileURLToFilePath(url, &path)) 403 if (net::FileURLToFilePath(url, &path))
428 state->second->GrantRequestOfSpecificFile(path); 404 state->second->GrantRequestOfSpecificFile(path);
429 } 405 }
430 } 406 }
431 407
432 void ChildProcessSecurityPolicyImpl::GrantReadFile(int child_id, 408 void ChildProcessSecurityPolicyHelper::GrantReadFile(
433 const base::FilePath& file) { 409 int child_id,
410 const base::FilePath& file) {
434 GrantPermissionsForFile(child_id, file, READ_FILE_GRANT); 411 GrantPermissionsForFile(child_id, file, READ_FILE_GRANT);
435 } 412 }
436 413
437 void ChildProcessSecurityPolicyImpl::GrantCreateReadWriteFile( 414 void ChildProcessSecurityPolicyHelper::GrantCreateReadWriteFile(
438 int child_id, const base::FilePath& file) { 415 int child_id,
416 const base::FilePath& file) {
439 GrantPermissionsForFile(child_id, file, CREATE_READ_WRITE_FILE_GRANT); 417 GrantPermissionsForFile(child_id, file, CREATE_READ_WRITE_FILE_GRANT);
440 } 418 }
441 419
442 void ChildProcessSecurityPolicyImpl::GrantCopyInto(int child_id, 420 void ChildProcessSecurityPolicyHelper::GrantCopyInto(
443 const base::FilePath& dir) { 421 int child_id,
422 const base::FilePath& dir) {
444 GrantPermissionsForFile(child_id, dir, COPY_INTO_FILE_GRANT); 423 GrantPermissionsForFile(child_id, dir, COPY_INTO_FILE_GRANT);
445 } 424 }
446 425
447 void ChildProcessSecurityPolicyImpl::GrantDeleteFrom( 426 void ChildProcessSecurityPolicyHelper::GrantDeleteFrom(
448 int child_id, const base::FilePath& dir) { 427 int child_id,
428 const base::FilePath& dir) {
449 GrantPermissionsForFile(child_id, dir, DELETE_FILE_GRANT); 429 GrantPermissionsForFile(child_id, dir, DELETE_FILE_GRANT);
450 } 430 }
451 431
452 void ChildProcessSecurityPolicyImpl::GrantPermissionsForFile( 432 void ChildProcessSecurityPolicyHelper::GrantPermissionsForFile(
453 int child_id, const base::FilePath& file, int permissions) { 433 int child_id,
434 const base::FilePath& file,
435 int permissions) {
454 base::AutoLock lock(lock_); 436 base::AutoLock lock(lock_);
455 437
456 SecurityStateMap::iterator state = security_state_.find(child_id); 438 SecurityStateMap::iterator state = security_state_.find(child_id);
457 if (state == security_state_.end()) 439 if (state == security_state_.end())
458 return; 440 return;
459 441
460 state->second->GrantPermissionsForFile(file, permissions); 442 state->second->GrantPermissionsForFile(file, permissions);
461 } 443 }
462 444
463 void ChildProcessSecurityPolicyImpl::RevokeAllPermissionsForFile( 445 void ChildProcessSecurityPolicyHelper::RevokeAllPermissionsForFile(
464 int child_id, const base::FilePath& file) { 446 int child_id,
447 const base::FilePath& file) {
465 base::AutoLock lock(lock_); 448 base::AutoLock lock(lock_);
466 449
467 SecurityStateMap::iterator state = security_state_.find(child_id); 450 SecurityStateMap::iterator state = security_state_.find(child_id);
468 if (state == security_state_.end()) 451 if (state == security_state_.end())
469 return; 452 return;
470 453
471 state->second->RevokeAllPermissionsForFile(file); 454 state->second->RevokeAllPermissionsForFile(file);
472 } 455 }
473 456
474 void ChildProcessSecurityPolicyImpl::GrantReadFileSystem( 457 void ChildProcessSecurityPolicyHelper::GrantReadFileSystem(
475 int child_id, const std::string& filesystem_id) { 458 int child_id,
459 const std::string& filesystem_id) {
476 GrantPermissionsForFileSystem(child_id, filesystem_id, READ_FILE_GRANT); 460 GrantPermissionsForFileSystem(child_id, filesystem_id, READ_FILE_GRANT);
477 } 461 }
478 462
479 void ChildProcessSecurityPolicyImpl::GrantWriteFileSystem( 463 void ChildProcessSecurityPolicyHelper::GrantWriteFileSystem(
480 int child_id, const std::string& filesystem_id) { 464 int child_id,
465 const std::string& filesystem_id) {
481 GrantPermissionsForFileSystem(child_id, filesystem_id, WRITE_FILE_GRANT); 466 GrantPermissionsForFileSystem(child_id, filesystem_id, WRITE_FILE_GRANT);
482 } 467 }
483 468
484 void ChildProcessSecurityPolicyImpl::GrantCreateFileForFileSystem( 469 void ChildProcessSecurityPolicyHelper::GrantCreateFileForFileSystem(
485 int child_id, const std::string& filesystem_id) { 470 int child_id,
471 const std::string& filesystem_id) {
486 GrantPermissionsForFileSystem(child_id, filesystem_id, CREATE_NEW_FILE_GRANT); 472 GrantPermissionsForFileSystem(child_id, filesystem_id, CREATE_NEW_FILE_GRANT);
487 } 473 }
488 474
489 void ChildProcessSecurityPolicyImpl::GrantCreateReadWriteFileSystem( 475 void ChildProcessSecurityPolicyHelper::GrantCreateReadWriteFileSystem(
490 int child_id, const std::string& filesystem_id) { 476 int child_id,
491 GrantPermissionsForFileSystem( 477 const std::string& filesystem_id) {
492 child_id, filesystem_id, CREATE_READ_WRITE_FILE_GRANT); 478 GrantPermissionsForFileSystem(child_id, filesystem_id,
479 CREATE_READ_WRITE_FILE_GRANT);
493 } 480 }
494 481
495 void ChildProcessSecurityPolicyImpl::GrantCopyIntoFileSystem( 482 void ChildProcessSecurityPolicyHelper::GrantCopyIntoFileSystem(
496 int child_id, const std::string& filesystem_id) { 483 int child_id,
484 const std::string& filesystem_id) {
497 GrantPermissionsForFileSystem(child_id, filesystem_id, COPY_INTO_FILE_GRANT); 485 GrantPermissionsForFileSystem(child_id, filesystem_id, COPY_INTO_FILE_GRANT);
498 } 486 }
499 487
500 void ChildProcessSecurityPolicyImpl::GrantDeleteFromFileSystem( 488 void ChildProcessSecurityPolicyHelper::GrantDeleteFromFileSystem(
501 int child_id, const std::string& filesystem_id) { 489 int child_id,
490 const std::string& filesystem_id) {
502 GrantPermissionsForFileSystem(child_id, filesystem_id, DELETE_FILE_GRANT); 491 GrantPermissionsForFileSystem(child_id, filesystem_id, DELETE_FILE_GRANT);
503 } 492 }
504 493
505 void ChildProcessSecurityPolicyImpl::GrantSendMidiSysExMessage(int child_id) { 494 void ChildProcessSecurityPolicyHelper::GrantSendMidiSysExMessage(int child_id) {
506 base::AutoLock lock(lock_); 495 base::AutoLock lock(lock_);
507 496
508 SecurityStateMap::iterator state = security_state_.find(child_id); 497 SecurityStateMap::iterator state = security_state_.find(child_id);
509 if (state == security_state_.end()) 498 if (state == security_state_.end())
510 return; 499 return;
511 500
512 state->second->GrantPermissionForMidiSysEx(); 501 state->second->GrantPermissionForMidiSysEx();
513 } 502 }
514 503
515 void ChildProcessSecurityPolicyImpl::GrantOrigin(int child_id, 504 void ChildProcessSecurityPolicyHelper::GrantOrigin(int child_id,
516 const url::Origin& origin) { 505 const url::Origin& origin) {
517 base::AutoLock lock(lock_); 506 base::AutoLock lock(lock_);
518 507
519 SecurityStateMap::iterator state = security_state_.find(child_id); 508 SecurityStateMap::iterator state = security_state_.find(child_id);
520 if (state == security_state_.end()) 509 if (state == security_state_.end())
521 return; 510 return;
522 511
523 state->second->GrantOrigin(origin); 512 state->second->GrantOrigin(origin);
524 } 513 }
525 514
526 void ChildProcessSecurityPolicyImpl::GrantScheme(int child_id, 515 void ChildProcessSecurityPolicyHelper::GrantScheme(int child_id,
527 const std::string& scheme) { 516 const std::string& scheme) {
528 base::AutoLock lock(lock_); 517 base::AutoLock lock(lock_);
529 518
530 SecurityStateMap::iterator state = security_state_.find(child_id); 519 SecurityStateMap::iterator state = security_state_.find(child_id);
531 if (state == security_state_.end()) 520 if (state == security_state_.end())
532 return; 521 return;
533 522
534 state->second->GrantScheme(scheme); 523 state->second->GrantScheme(scheme);
535 } 524 }
536 525
537 void ChildProcessSecurityPolicyImpl::GrantWebUIBindings(int child_id) { 526 void ChildProcessSecurityPolicyHelper::GrantWebUIBindings(int child_id) {
538 base::AutoLock lock(lock_); 527 base::AutoLock lock(lock_);
539 528
540 SecurityStateMap::iterator state = security_state_.find(child_id); 529 SecurityStateMap::iterator state = security_state_.find(child_id);
541 if (state == security_state_.end()) 530 if (state == security_state_.end())
542 return; 531 return;
543 532
544 state->second->GrantBindings(BINDINGS_POLICY_WEB_UI); 533 state->second->GrantBindings(BINDINGS_POLICY_WEB_UI);
545 534
546 // Web UI bindings need the ability to request chrome: URLs. 535 // Web UI bindings need the ability to request chrome: URLs.
547 state->second->GrantScheme(kChromeUIScheme); 536 state->second->GrantScheme(kChromeUIScheme);
548 537
549 // Web UI pages can contain links to file:// URLs. 538 // Web UI pages can contain links to file:// URLs.
550 state->second->GrantScheme(url::kFileScheme); 539 state->second->GrantScheme(url::kFileScheme);
551 } 540 }
552 541
553 void ChildProcessSecurityPolicyImpl::GrantReadRawCookies(int child_id) { 542 void ChildProcessSecurityPolicyHelper::GrantReadRawCookies(int child_id) {
554 base::AutoLock lock(lock_); 543 base::AutoLock lock(lock_);
555 544
556 SecurityStateMap::iterator state = security_state_.find(child_id); 545 SecurityStateMap::iterator state = security_state_.find(child_id);
557 if (state == security_state_.end()) 546 if (state == security_state_.end())
558 return; 547 return;
559 548
560 state->second->GrantReadRawCookies(); 549 state->second->GrantReadRawCookies();
561 } 550 }
562 551
563 void ChildProcessSecurityPolicyImpl::RevokeReadRawCookies(int child_id) { 552 void ChildProcessSecurityPolicyHelper::RevokeReadRawCookies(int child_id) {
564 base::AutoLock lock(lock_); 553 base::AutoLock lock(lock_);
565 554
566 SecurityStateMap::iterator state = security_state_.find(child_id); 555 SecurityStateMap::iterator state = security_state_.find(child_id);
567 if (state == security_state_.end()) 556 if (state == security_state_.end())
568 return; 557 return;
569 558
570 state->second->RevokeReadRawCookies(); 559 state->second->RevokeReadRawCookies();
571 } 560 }
572 561
573 bool ChildProcessSecurityPolicyImpl::CanRequestURL( 562 bool ChildProcessSecurityPolicyHelper::CanRequestURL(int child_id,
574 int child_id, const GURL& url) { 563 const GURL& url) {
575 if (!url.is_valid()) 564 if (!url.is_valid())
576 return false; // Can't request invalid URLs. 565 return false; // Can't request invalid URLs.
577 566
578 if (IsPseudoScheme(url.scheme())) { 567 if (IsPseudoScheme(url.scheme())) {
579 // Every child process can request <about:blank>. 568 // Every child process can request <about:blank>.
580 if (base::LowerCaseEqualsASCII(url.spec(), url::kAboutBlankURL)) 569 if (base::LowerCaseEqualsASCII(url.spec(), url::kAboutBlankURL))
581 return true; 570 return true;
582 // URLs like <about:version>, <about:crash>, <view-source:...> shouldn't be 571 // URLs like <about:version>, <about:crash>, <view-source:...> shouldn't be
583 // requestable by any child process. Also, this case covers 572 // requestable by any child process. Also, this case covers
584 // <javascript:...>, which should be handled internally by the process and 573 // <javascript:...>, which should be handled internally by the process and
585 // not kicked up to the browser. 574 // not kicked up to the browser.
586 return false; 575 return false;
587 } 576 }
588 577
589 // If the process can commit the URL, it can request it. 578 // If the process can commit the URL, it can request it.
590 if (CanCommitURL(child_id, url)) 579 if (CanCommitURL(child_id, url))
591 return true; 580 return true;
592 581
593 // Also allow URLs destined for ShellExecute and not the browser itself. 582 // Also allow URLs destined for ShellExecute and not the browser itself.
594 return !GetContentClient()->browser()->IsHandledURL(url) && 583 return !GetContentClient()->browser()->IsHandledURL(url) &&
595 !net::URLRequest::IsHandledURL(url); 584 !net::URLRequest::IsHandledURL(url);
596 } 585 }
597 586
598 bool ChildProcessSecurityPolicyImpl::CanCommitURL(int child_id, 587 bool ChildProcessSecurityPolicyHelper::CanCommitURL(int child_id,
599 const GURL& url) { 588 const GURL& url) {
600 if (!url.is_valid()) 589 if (!url.is_valid())
601 return false; // Can't commit invalid URLs. 590 return false; // Can't commit invalid URLs.
602 591
603 // Of all the pseudo schemes, only about:blank is allowed to commit. 592 // Of all the pseudo schemes, only about:blank is allowed to commit.
604 if (IsPseudoScheme(url.scheme())) 593 if (IsPseudoScheme(url.scheme()))
605 return base::LowerCaseEqualsASCII(url.spec(), url::kAboutBlankURL); 594 return base::LowerCaseEqualsASCII(url.spec(), url::kAboutBlankURL);
606 595
607 // TODO(creis): Tighten this for Site Isolation, so that a URL from a site 596 // TODO(creis): Tighten this for Site Isolation, so that a URL from a site
608 // that is isolated can only be committed in a process dedicated to that site. 597 // that is isolated can only be committed in a process dedicated to that site.
609 // CanRequestURL should still allow all web-safe schemes. See 598 // CanRequestURL should still allow all web-safe schemes. See
610 // https://crbug.com/515309. 599 // https://crbug.com/515309.
611 if (IsWebSafeScheme(url.scheme())) 600 if (IsWebSafeScheme(url.scheme()))
612 return true; // The scheme has been white-listed for every child process. 601 return true; // The scheme has been white-listed for every child process.
613 602
614 { 603 {
615 base::AutoLock lock(lock_); 604 base::AutoLock lock(lock_);
616 605
617 SecurityStateMap::iterator state = security_state_.find(child_id); 606 SecurityStateMap::iterator state = security_state_.find(child_id);
618 if (state == security_state_.end()) 607 if (state == security_state_.end())
619 return false; 608 return false;
620 609
621 // Otherwise, we consult the child process's security state to see if it is 610 // Otherwise, we consult the child process's security state to see if it is
622 // allowed to commit the URL. 611 // allowed to commit the URL.
623 return state->second->CanCommitURL(url); 612 return state->second->CanCommitURL(url);
624 } 613 }
625 } 614 }
626 615
627 bool ChildProcessSecurityPolicyImpl::CanReadFile(int child_id, 616 bool ChildProcessSecurityPolicyHelper::CanReadFile(int child_id,
628 const base::FilePath& file) { 617 const base::FilePath& file) {
629 return HasPermissionsForFile(child_id, file, READ_FILE_GRANT); 618 return HasPermissionsForFile(child_id, file, READ_FILE_GRANT);
630 } 619 }
631 620
632 bool ChildProcessSecurityPolicyImpl::CanReadAllFiles( 621 bool ChildProcessSecurityPolicyHelper::CanReadAllFiles(
633 int child_id, 622 int child_id,
634 const std::vector<base::FilePath>& files) { 623 const std::vector<base::FilePath>& files) {
635 return std::all_of(files.begin(), files.end(), 624 return std::all_of(files.begin(), files.end(),
636 [this, child_id](const base::FilePath& file) { 625 [this, child_id](const base::FilePath& file) {
637 return CanReadFile(child_id, file); 626 return CanReadFile(child_id, file);
638 }); 627 });
639 } 628 }
640 629
641 bool ChildProcessSecurityPolicyImpl::CanCreateReadWriteFile( 630 bool ChildProcessSecurityPolicyHelper::CanCreateReadWriteFile(
642 int child_id, 631 int child_id,
643 const base::FilePath& file) { 632 const base::FilePath& file) {
644 return HasPermissionsForFile(child_id, file, CREATE_READ_WRITE_FILE_GRANT); 633 return HasPermissionsForFile(child_id, file, CREATE_READ_WRITE_FILE_GRANT);
645 } 634 }
646 635
647 bool ChildProcessSecurityPolicyImpl::CanReadFileSystem( 636 bool ChildProcessSecurityPolicyHelper::CanReadFileSystem(
648 int child_id, const std::string& filesystem_id) { 637 int child_id,
638 const std::string& filesystem_id) {
649 return HasPermissionsForFileSystem(child_id, filesystem_id, READ_FILE_GRANT); 639 return HasPermissionsForFileSystem(child_id, filesystem_id, READ_FILE_GRANT);
650 } 640 }
651 641
652 bool ChildProcessSecurityPolicyImpl::CanReadWriteFileSystem( 642 bool ChildProcessSecurityPolicyHelper::CanReadWriteFileSystem(
653 int child_id, const std::string& filesystem_id) { 643 int child_id,
644 const std::string& filesystem_id) {
654 return HasPermissionsForFileSystem(child_id, filesystem_id, 645 return HasPermissionsForFileSystem(child_id, filesystem_id,
655 READ_FILE_GRANT | WRITE_FILE_GRANT); 646 READ_FILE_GRANT | WRITE_FILE_GRANT);
656 } 647 }
657 648
658 bool ChildProcessSecurityPolicyImpl::CanCopyIntoFileSystem( 649 bool ChildProcessSecurityPolicyHelper::CanCopyIntoFileSystem(
659 int child_id, const std::string& filesystem_id) { 650 int child_id,
651 const std::string& filesystem_id) {
660 return HasPermissionsForFileSystem(child_id, filesystem_id, 652 return HasPermissionsForFileSystem(child_id, filesystem_id,
661 COPY_INTO_FILE_GRANT); 653 COPY_INTO_FILE_GRANT);
662 } 654 }
663 655
664 bool ChildProcessSecurityPolicyImpl::CanDeleteFromFileSystem( 656 bool ChildProcessSecurityPolicyHelper::CanDeleteFromFileSystem(
665 int child_id, const std::string& filesystem_id) { 657 int child_id,
658 const std::string& filesystem_id) {
666 return HasPermissionsForFileSystem(child_id, filesystem_id, 659 return HasPermissionsForFileSystem(child_id, filesystem_id,
667 DELETE_FILE_GRANT); 660 DELETE_FILE_GRANT);
668 } 661 }
669 662
670 bool ChildProcessSecurityPolicyImpl::HasPermissionsForFile( 663 bool ChildProcessSecurityPolicyHelper::HasPermissionsForFile(
671 int child_id, const base::FilePath& file, int permissions) { 664 int child_id,
665 const base::FilePath& file,
666 int permissions) {
672 base::AutoLock lock(lock_); 667 base::AutoLock lock(lock_);
673 bool result = ChildProcessHasPermissionsForFile(child_id, file, permissions); 668 bool result = ChildProcessHasPermissionsForFile(child_id, file, permissions);
674 if (!result) { 669 if (!result) {
675 // If this is a worker thread that has no access to a given file, 670 // If this is a worker thread that has no access to a given file,
676 // let's check that its renderer process has access to that file instead. 671 // let's check that its renderer process has access to that file instead.
677 WorkerToMainProcessMap::iterator iter = worker_map_.find(child_id); 672 WorkerToMainProcessMap::iterator iter = worker_map_.find(child_id);
678 if (iter != worker_map_.end() && iter->second != 0) { 673 if (iter != worker_map_.end() && iter->second != 0) {
679 result = ChildProcessHasPermissionsForFile(iter->second, 674 result =
680 file, 675 ChildProcessHasPermissionsForFile(iter->second, file, permissions);
681 permissions);
682 } 676 }
683 } 677 }
684 return result; 678 return result;
685 } 679 }
686 680
687 bool ChildProcessSecurityPolicyImpl::HasPermissionsForFileSystemFile( 681 bool ChildProcessSecurityPolicyHelper::HasPermissionsForFileSystemFile(
688 int child_id, 682 int child_id,
689 const storage::FileSystemURL& url, 683 const storage::FileSystemURL& url,
690 int permissions) { 684 int permissions) {
691 if (!url.is_valid()) 685 if (!url.is_valid())
692 return false; 686 return false;
693 687
694 if (url.path().ReferencesParent()) 688 if (url.path().ReferencesParent())
695 return false; 689 return false;
696 690
697 // Any write access is disallowed on the root path. 691 // Any write access is disallowed on the root path.
698 if (storage::VirtualPath::IsRootPath(url.path()) && 692 if (storage::VirtualPath::IsRootPath(url.path()) &&
699 (permissions & ~READ_FILE_GRANT)) { 693 (permissions & ~READ_FILE_GRANT)) {
700 return false; 694 return false;
701 } 695 }
702 696
703 if (url.mount_type() == storage::kFileSystemTypeIsolated) { 697 if (url.mount_type() == storage::kFileSystemTypeIsolated) {
704 // When Isolated filesystems is overlayed on top of another filesystem, 698 // When Isolated filesystems is overlayed on top of another filesystem,
705 // its per-filesystem permission overrides the underlying filesystem 699 // its per-filesystem permission overrides the underlying filesystem
706 // permissions). 700 // permissions).
707 return HasPermissionsForFileSystem( 701 return HasPermissionsForFileSystem(child_id, url.mount_filesystem_id(),
708 child_id, url.mount_filesystem_id(), permissions); 702 permissions);
709 } 703 }
710 704
711 FileSystemPermissionPolicyMap::iterator found = 705 FileSystemPermissionPolicyMap::iterator found =
712 file_system_policy_map_.find(url.type()); 706 file_system_policy_map_.find(url.type());
713 if (found == file_system_policy_map_.end()) 707 if (found == file_system_policy_map_.end())
714 return false; 708 return false;
715 709
716 if ((found->second & storage::FILE_PERMISSION_READ_ONLY) && 710 if ((found->second & storage::FILE_PERMISSION_READ_ONLY) &&
717 permissions & ~READ_FILE_GRANT) { 711 permissions & ~READ_FILE_GRANT) {
718 return false; 712 return false;
719 } 713 }
720 714
721 if (found->second & storage::FILE_PERMISSION_USE_FILE_PERMISSION) 715 if (found->second & storage::FILE_PERMISSION_USE_FILE_PERMISSION)
722 return HasPermissionsForFile(child_id, url.path(), permissions); 716 return HasPermissionsForFile(child_id, url.path(), permissions);
723 717
724 if (found->second & storage::FILE_PERMISSION_SANDBOX) 718 if (found->second & storage::FILE_PERMISSION_SANDBOX)
725 return true; 719 return true;
726 720
727 return false; 721 return false;
728 } 722 }
729 723
730 bool ChildProcessSecurityPolicyImpl::CanReadFileSystemFile( 724 bool ChildProcessSecurityPolicyHelper::CanReadFileSystemFile(
731 int child_id, 725 int child_id,
732 const storage::FileSystemURL& url) { 726 const storage::FileSystemURL& url) {
733 return HasPermissionsForFileSystemFile(child_id, url, READ_FILE_GRANT); 727 return HasPermissionsForFileSystemFile(child_id, url, READ_FILE_GRANT);
734 } 728 }
735 729
736 bool ChildProcessSecurityPolicyImpl::CanWriteFileSystemFile( 730 bool ChildProcessSecurityPolicyHelper::CanWriteFileSystemFile(
737 int child_id, 731 int child_id,
738 const storage::FileSystemURL& url) { 732 const storage::FileSystemURL& url) {
739 return HasPermissionsForFileSystemFile(child_id, url, WRITE_FILE_GRANT); 733 return HasPermissionsForFileSystemFile(child_id, url, WRITE_FILE_GRANT);
740 } 734 }
741 735
742 bool ChildProcessSecurityPolicyImpl::CanCreateFileSystemFile( 736 bool ChildProcessSecurityPolicyHelper::CanCreateFileSystemFile(
743 int child_id, 737 int child_id,
744 const storage::FileSystemURL& url) { 738 const storage::FileSystemURL& url) {
745 return HasPermissionsForFileSystemFile(child_id, url, CREATE_NEW_FILE_GRANT); 739 return HasPermissionsForFileSystemFile(child_id, url, CREATE_NEW_FILE_GRANT);
746 } 740 }
747 741
748 bool ChildProcessSecurityPolicyImpl::CanCreateReadWriteFileSystemFile( 742 bool ChildProcessSecurityPolicyHelper::CanCreateReadWriteFileSystemFile(
749 int child_id, 743 int child_id,
750 const storage::FileSystemURL& url) { 744 const storage::FileSystemURL& url) {
751 return HasPermissionsForFileSystemFile(child_id, url, 745 return HasPermissionsForFileSystemFile(child_id, url,
752 CREATE_READ_WRITE_FILE_GRANT); 746 CREATE_READ_WRITE_FILE_GRANT);
753 } 747 }
754 748
755 bool ChildProcessSecurityPolicyImpl::CanCopyIntoFileSystemFile( 749 bool ChildProcessSecurityPolicyHelper::CanCopyIntoFileSystemFile(
756 int child_id, 750 int child_id,
757 const storage::FileSystemURL& url) { 751 const storage::FileSystemURL& url) {
758 return HasPermissionsForFileSystemFile(child_id, url, COPY_INTO_FILE_GRANT); 752 return HasPermissionsForFileSystemFile(child_id, url, COPY_INTO_FILE_GRANT);
759 } 753 }
760 754
761 bool ChildProcessSecurityPolicyImpl::CanDeleteFileSystemFile( 755 bool ChildProcessSecurityPolicyHelper::CanDeleteFileSystemFile(
762 int child_id, 756 int child_id,
763 const storage::FileSystemURL& url) { 757 const storage::FileSystemURL& url) {
764 return HasPermissionsForFileSystemFile(child_id, url, DELETE_FILE_GRANT); 758 return HasPermissionsForFileSystemFile(child_id, url, DELETE_FILE_GRANT);
765 } 759 }
766 760
767 bool ChildProcessSecurityPolicyImpl::HasWebUIBindings(int child_id) { 761 bool ChildProcessSecurityPolicyHelper::HasWebUIBindings(int child_id) {
768 base::AutoLock lock(lock_); 762 base::AutoLock lock(lock_);
769 763
770 SecurityStateMap::iterator state = security_state_.find(child_id); 764 SecurityStateMap::iterator state = security_state_.find(child_id);
771 if (state == security_state_.end()) 765 if (state == security_state_.end())
772 return false; 766 return false;
773 767
774 return state->second->has_web_ui_bindings(); 768 return state->second->has_web_ui_bindings();
775 } 769 }
776 770
777 bool ChildProcessSecurityPolicyImpl::CanReadRawCookies(int child_id) { 771 bool ChildProcessSecurityPolicyHelper::CanReadRawCookies(int child_id) {
778 base::AutoLock lock(lock_); 772 base::AutoLock lock(lock_);
779 773
780 SecurityStateMap::iterator state = security_state_.find(child_id); 774 SecurityStateMap::iterator state = security_state_.find(child_id);
781 if (state == security_state_.end()) 775 if (state == security_state_.end())
782 return false; 776 return false;
783 777
784 return state->second->can_read_raw_cookies(); 778 return state->second->can_read_raw_cookies();
785 } 779 }
786 780
787 void ChildProcessSecurityPolicyImpl::AddChild(int child_id) { 781 void ChildProcessSecurityPolicyHelper::AddChild(int child_id) {
788 if (security_state_.count(child_id) != 0) { 782 if (security_state_.count(child_id) != 0) {
789 NOTREACHED() << "Add child process at most once."; 783 NOTREACHED() << "Add child process at most once.";
790 return; 784 return;
791 } 785 }
792 786
793 security_state_[child_id] = new SecurityState(); 787 security_state_[child_id] = new SecurityState();
794 } 788 }
795 789
796 bool ChildProcessSecurityPolicyImpl::ChildProcessHasPermissionsForFile( 790 bool ChildProcessSecurityPolicyHelper::ChildProcessHasPermissionsForFile(
797 int child_id, const base::FilePath& file, int permissions) { 791 int child_id,
792 const base::FilePath& file,
793 int permissions) {
798 SecurityStateMap::iterator state = security_state_.find(child_id); 794 SecurityStateMap::iterator state = security_state_.find(child_id);
799 if (state == security_state_.end()) 795 if (state == security_state_.end())
800 return false; 796 return false;
801 return state->second->HasPermissionsForFile(file, permissions); 797 return state->second->HasPermissionsForFile(file, permissions);
802 } 798 }
803 799
804 bool ChildProcessSecurityPolicyImpl::CanAccessDataForOrigin(int child_id, 800 bool ChildProcessSecurityPolicyHelper::CanAccessDataForOrigin(
805 const GURL& gurl) { 801 int child_id,
802 const GURL& gurl) {
806 base::AutoLock lock(lock_); 803 base::AutoLock lock(lock_);
807 SecurityStateMap::iterator state = security_state_.find(child_id); 804 SecurityStateMap::iterator state = security_state_.find(child_id);
808 if (state == security_state_.end()) { 805 if (state == security_state_.end()) {
809 // TODO(nick): Returning true instead of false here is a temporary 806 // TODO(nick): Returning true instead of false here is a temporary
810 // workaround for https://crbug.com/600441 807 // workaround for https://crbug.com/600441
811 return true; 808 return true;
812 } 809 }
813 return state->second->CanAccessDataForOrigin(gurl); 810 return state->second->CanAccessDataForOrigin(gurl);
814 } 811 }
815 812
816 void ChildProcessSecurityPolicyImpl::LockToOrigin(int child_id, 813 void ChildProcessSecurityPolicyHelper::LockToOrigin(int child_id,
817 const GURL& gurl) { 814 const GURL& gurl) {
818 // "gurl" can be currently empty in some cases, such as file://blah. 815 // "gurl" can be currently empty in some cases, such as file://blah.
819 DCHECK(SiteInstanceImpl::GetSiteForURL(NULL, gurl) == gurl); 816 DCHECK(SiteInstanceImpl::GetSiteForURL(NULL, gurl) == gurl);
820 base::AutoLock lock(lock_); 817 base::AutoLock lock(lock_);
821 SecurityStateMap::iterator state = security_state_.find(child_id); 818 SecurityStateMap::iterator state = security_state_.find(child_id);
822 DCHECK(state != security_state_.end()); 819 DCHECK(state != security_state_.end());
823 state->second->LockToOrigin(gurl); 820 state->second->LockToOrigin(gurl);
824 } 821 }
825 822
826 void ChildProcessSecurityPolicyImpl::GrantPermissionsForFileSystem( 823 void ChildProcessSecurityPolicyHelper::GrantPermissionsForFileSystem(
827 int child_id, 824 int child_id,
828 const std::string& filesystem_id, 825 const std::string& filesystem_id,
829 int permission) { 826 int permission) {
830 base::AutoLock lock(lock_); 827 base::AutoLock lock(lock_);
831 828
832 SecurityStateMap::iterator state = security_state_.find(child_id); 829 SecurityStateMap::iterator state = security_state_.find(child_id);
833 if (state == security_state_.end()) 830 if (state == security_state_.end())
834 return; 831 return;
835 state->second->GrantPermissionsForFileSystem(filesystem_id, permission); 832 state->second->GrantPermissionsForFileSystem(filesystem_id, permission);
836 } 833 }
837 834
838 bool ChildProcessSecurityPolicyImpl::HasPermissionsForFileSystem( 835 bool ChildProcessSecurityPolicyHelper::HasPermissionsForFileSystem(
839 int child_id, 836 int child_id,
840 const std::string& filesystem_id, 837 const std::string& filesystem_id,
841 int permission) { 838 int permission) {
842 base::AutoLock lock(lock_); 839 base::AutoLock lock(lock_);
843 840
844 SecurityStateMap::iterator state = security_state_.find(child_id); 841 SecurityStateMap::iterator state = security_state_.find(child_id);
845 if (state == security_state_.end()) 842 if (state == security_state_.end())
846 return false; 843 return false;
847 return state->second->HasPermissionsForFileSystem(filesystem_id, permission); 844 return state->second->HasPermissionsForFileSystem(filesystem_id, permission);
848 } 845 }
849 846
850 void ChildProcessSecurityPolicyImpl::RegisterFileSystemPermissionPolicy( 847 void ChildProcessSecurityPolicyHelper::RegisterFileSystemPermissionPolicy(
851 storage::FileSystemType type, 848 storage::FileSystemType type,
852 int policy) { 849 int policy) {
853 base::AutoLock lock(lock_); 850 base::AutoLock lock(lock_);
854 file_system_policy_map_[type] = policy; 851 file_system_policy_map_[type] = policy;
855 } 852 }
856 853
857 bool ChildProcessSecurityPolicyImpl::CanSendMidiSysExMessage(int child_id) { 854 bool ChildProcessSecurityPolicyHelper::CanSendMidiSysExMessage(int child_id) {
858 base::AutoLock lock(lock_); 855 base::AutoLock lock(lock_);
859 856
860 SecurityStateMap::iterator state = security_state_.find(child_id); 857 SecurityStateMap::iterator state = security_state_.find(child_id);
861 if (state == security_state_.end()) 858 if (state == security_state_.end())
862 return false; 859 return false;
863 860
864 return state->second->can_send_midi_sysex(); 861 return state->second->can_send_midi_sysex();
865 } 862 }
866 863
867 } // namespace content 864 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698