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

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

Issue 2108053005: Pull ChildProcessSecurityPolicyImpl out to shared subfolder (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
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 // static
322 ChildProcessSecurityPolicy* ChildProcessSecurityPolicy::GetInstance() { 303 ChildProcessSecurityPolicy* ChildProcessSecurityPolicy::GetInstance() {
323 return ChildProcessSecurityPolicyImpl::GetInstance(); 304 return ChildProcessSecurityPolicyHelper::GetInstance();
324 } 305 }
325 306
326 ChildProcessSecurityPolicyImpl* ChildProcessSecurityPolicyImpl::GetInstance() { 307 ChildProcessSecurityPolicyHelper*
327 return base::Singleton<ChildProcessSecurityPolicyImpl>::get(); 308 ChildProcessSecurityPolicyHelper::GetInstance() {
309 return base::Singleton<ChildProcessSecurityPolicyHelper>::get();
328 } 310 }
329 311
330 void ChildProcessSecurityPolicyImpl::Add(int child_id) { 312 void ChildProcessSecurityPolicyHelper::Add(int child_id) {
331 base::AutoLock lock(lock_); 313 base::AutoLock lock(lock_);
332 AddChild(child_id); 314 AddChild(child_id);
333 } 315 }
334 316
335 void ChildProcessSecurityPolicyImpl::AddWorker(int child_id, 317 void ChildProcessSecurityPolicyHelper::AddWorker(int child_id,
336 int main_render_process_id) { 318 int main_render_process_id) {
337 base::AutoLock lock(lock_); 319 base::AutoLock lock(lock_);
338 AddChild(child_id); 320 AddChild(child_id);
339 worker_map_[child_id] = main_render_process_id; 321 worker_map_[child_id] = main_render_process_id;
340 } 322 }
341 323
342 void ChildProcessSecurityPolicyImpl::Remove(int child_id) { 324 void ChildProcessSecurityPolicyHelper::Remove(int child_id) {
343 base::AutoLock lock(lock_); 325 base::AutoLock lock(lock_);
344 SecurityStateMap::iterator it = security_state_.find(child_id); 326 SecurityStateMap::iterator it = security_state_.find(child_id);
345 if (it == security_state_.end()) 327 if (it == security_state_.end())
346 return; // May be called multiple times. 328 return; // May be called multiple times.
347 329
348 delete it->second; 330 delete it->second;
349 security_state_.erase(it); 331 security_state_.erase(it);
350 worker_map_.erase(child_id); 332 worker_map_.erase(child_id);
351 } 333 }
352 334
353 void ChildProcessSecurityPolicyImpl::RegisterWebSafeScheme( 335 void ChildProcessSecurityPolicyHelper::RegisterWebSafeScheme(
354 const std::string& scheme) { 336 const std::string& scheme) {
355 base::AutoLock lock(lock_); 337 base::AutoLock lock(lock_);
356 DCHECK_EQ(0U, web_safe_schemes_.count(scheme)) << "Add schemes at most once."; 338 DCHECK_EQ(0U, web_safe_schemes_.count(scheme)) << "Add schemes at most once.";
357 DCHECK_EQ(0U, pseudo_schemes_.count(scheme)) 339 DCHECK_EQ(0U, pseudo_schemes_.count(scheme))
358 << "Web-safe implies not pseudo."; 340 << "Web-safe implies not pseudo.";
359 341
360 web_safe_schemes_.insert(scheme); 342 web_safe_schemes_.insert(scheme);
361 } 343 }
362 344
363 bool ChildProcessSecurityPolicyImpl::IsWebSafeScheme( 345 bool ChildProcessSecurityPolicyHelper::IsWebSafeScheme(
364 const std::string& scheme) { 346 const std::string& scheme) {
365 base::AutoLock lock(lock_); 347 base::AutoLock lock(lock_);
366 348
367 return ContainsKey(web_safe_schemes_, scheme); 349 return ContainsKey(web_safe_schemes_, scheme);
368 } 350 }
369 351
370 void ChildProcessSecurityPolicyImpl::RegisterPseudoScheme( 352 void ChildProcessSecurityPolicyHelper::RegisterPseudoScheme(
371 const std::string& scheme) { 353 const std::string& scheme) {
372 base::AutoLock lock(lock_); 354 base::AutoLock lock(lock_);
373 DCHECK_EQ(0U, pseudo_schemes_.count(scheme)) << "Add schemes at most once."; 355 DCHECK_EQ(0U, pseudo_schemes_.count(scheme)) << "Add schemes at most once.";
374 DCHECK_EQ(0U, web_safe_schemes_.count(scheme)) 356 DCHECK_EQ(0U, web_safe_schemes_.count(scheme))
375 << "Pseudo implies not web-safe."; 357 << "Pseudo implies not web-safe.";
376 358
377 pseudo_schemes_.insert(scheme); 359 pseudo_schemes_.insert(scheme);
378 } 360 }
379 361
380 bool ChildProcessSecurityPolicyImpl::IsPseudoScheme( 362 bool ChildProcessSecurityPolicyHelper::IsPseudoScheme(
381 const std::string& scheme) { 363 const std::string& scheme) {
382 base::AutoLock lock(lock_); 364 base::AutoLock lock(lock_);
383 365
384 return ContainsKey(pseudo_schemes_, scheme); 366 return ContainsKey(pseudo_schemes_, scheme);
385 } 367 }
386 368
387 void ChildProcessSecurityPolicyImpl::GrantRequestURL( 369 void ChildProcessSecurityPolicyHelper::GrantRequestURL(int child_id,
388 int child_id, const GURL& url) { 370 const GURL& url) {
389
390 if (!url.is_valid()) 371 if (!url.is_valid())
391 return; // Can't grant the capability to request invalid URLs. 372 return; // Can't grant the capability to request invalid URLs.
392 373
393 if (IsWebSafeScheme(url.scheme())) 374 if (IsWebSafeScheme(url.scheme()))
394 return; // The scheme has already been whitelisted for every child process. 375 return; // The scheme has already been whitelisted for every child process.
395 376
396 if (IsPseudoScheme(url.scheme())) { 377 if (IsPseudoScheme(url.scheme())) {
397 return; // Can't grant the capability to request pseudo schemes. 378 return; // Can't grant the capability to request pseudo schemes.
398 } 379 }
399 380
400 { 381 {
401 base::AutoLock lock(lock_); 382 base::AutoLock lock(lock_);
402 SecurityStateMap::iterator state = security_state_.find(child_id); 383 SecurityStateMap::iterator state = security_state_.find(child_id);
403 if (state == security_state_.end()) 384 if (state == security_state_.end())
404 return; 385 return;
405 386
406 // When the child process has been commanded to request this scheme, 387 // When the child process has been commanded to request this scheme,
407 // we grant it the capability to request all URLs of that scheme. 388 // we grant it the capability to request all URLs of that scheme.
408 state->second->GrantScheme(url.scheme()); 389 state->second->GrantScheme(url.scheme());
409 } 390 }
410 } 391 }
411 392
412 void ChildProcessSecurityPolicyImpl::GrantRequestSpecificFileURL( 393 void ChildProcessSecurityPolicyHelper::GrantRequestSpecificFileURL(
413 int child_id, 394 int child_id,
414 const GURL& url) { 395 const GURL& url) {
415 if (!url.SchemeIs(url::kFileScheme)) 396 if (!url.SchemeIs(url::kFileScheme))
416 return; 397 return;
417 398
418 { 399 {
419 base::AutoLock lock(lock_); 400 base::AutoLock lock(lock_);
420 SecurityStateMap::iterator state = security_state_.find(child_id); 401 SecurityStateMap::iterator state = security_state_.find(child_id);
421 if (state == security_state_.end()) 402 if (state == security_state_.end())
422 return; 403 return;
423 404
424 // When the child process has been commanded to request a file:// URL, 405 // When the child process has been commanded to request a file:// URL,
425 // then we grant it the capability for that URL only. 406 // then we grant it the capability for that URL only.
426 base::FilePath path; 407 base::FilePath path;
427 if (net::FileURLToFilePath(url, &path)) 408 if (net::FileURLToFilePath(url, &path))
428 state->second->GrantRequestOfSpecificFile(path); 409 state->second->GrantRequestOfSpecificFile(path);
429 } 410 }
430 } 411 }
431 412
432 void ChildProcessSecurityPolicyImpl::GrantReadFile(int child_id, 413 void ChildProcessSecurityPolicyHelper::GrantReadFile(
433 const base::FilePath& file) { 414 int child_id,
415 const base::FilePath& file) {
434 GrantPermissionsForFile(child_id, file, READ_FILE_GRANT); 416 GrantPermissionsForFile(child_id, file, READ_FILE_GRANT);
435 } 417 }
436 418
437 void ChildProcessSecurityPolicyImpl::GrantCreateReadWriteFile( 419 void ChildProcessSecurityPolicyHelper::GrantCreateReadWriteFile(
438 int child_id, const base::FilePath& file) { 420 int child_id,
421 const base::FilePath& file) {
439 GrantPermissionsForFile(child_id, file, CREATE_READ_WRITE_FILE_GRANT); 422 GrantPermissionsForFile(child_id, file, CREATE_READ_WRITE_FILE_GRANT);
440 } 423 }
441 424
442 void ChildProcessSecurityPolicyImpl::GrantCopyInto(int child_id, 425 void ChildProcessSecurityPolicyHelper::GrantCopyInto(
443 const base::FilePath& dir) { 426 int child_id,
427 const base::FilePath& dir) {
444 GrantPermissionsForFile(child_id, dir, COPY_INTO_FILE_GRANT); 428 GrantPermissionsForFile(child_id, dir, COPY_INTO_FILE_GRANT);
445 } 429 }
446 430
447 void ChildProcessSecurityPolicyImpl::GrantDeleteFrom( 431 void ChildProcessSecurityPolicyHelper::GrantDeleteFrom(
448 int child_id, const base::FilePath& dir) { 432 int child_id,
433 const base::FilePath& dir) {
449 GrantPermissionsForFile(child_id, dir, DELETE_FILE_GRANT); 434 GrantPermissionsForFile(child_id, dir, DELETE_FILE_GRANT);
450 } 435 }
451 436
452 void ChildProcessSecurityPolicyImpl::GrantPermissionsForFile( 437 void ChildProcessSecurityPolicyHelper::GrantPermissionsForFile(
453 int child_id, const base::FilePath& file, int permissions) { 438 int child_id,
439 const base::FilePath& file,
440 int permissions) {
454 base::AutoLock lock(lock_); 441 base::AutoLock lock(lock_);
455 442
456 SecurityStateMap::iterator state = security_state_.find(child_id); 443 SecurityStateMap::iterator state = security_state_.find(child_id);
457 if (state == security_state_.end()) 444 if (state == security_state_.end())
458 return; 445 return;
459 446
460 state->second->GrantPermissionsForFile(file, permissions); 447 state->second->GrantPermissionsForFile(file, permissions);
461 } 448 }
462 449
463 void ChildProcessSecurityPolicyImpl::RevokeAllPermissionsForFile( 450 void ChildProcessSecurityPolicyHelper::RevokeAllPermissionsForFile(
464 int child_id, const base::FilePath& file) { 451 int child_id,
452 const base::FilePath& file) {
465 base::AutoLock lock(lock_); 453 base::AutoLock lock(lock_);
466 454
467 SecurityStateMap::iterator state = security_state_.find(child_id); 455 SecurityStateMap::iterator state = security_state_.find(child_id);
468 if (state == security_state_.end()) 456 if (state == security_state_.end())
469 return; 457 return;
470 458
471 state->second->RevokeAllPermissionsForFile(file); 459 state->second->RevokeAllPermissionsForFile(file);
472 } 460 }
473 461
474 void ChildProcessSecurityPolicyImpl::GrantReadFileSystem( 462 void ChildProcessSecurityPolicyHelper::GrantReadFileSystem(
475 int child_id, const std::string& filesystem_id) { 463 int child_id,
464 const std::string& filesystem_id) {
476 GrantPermissionsForFileSystem(child_id, filesystem_id, READ_FILE_GRANT); 465 GrantPermissionsForFileSystem(child_id, filesystem_id, READ_FILE_GRANT);
477 } 466 }
478 467
479 void ChildProcessSecurityPolicyImpl::GrantWriteFileSystem( 468 void ChildProcessSecurityPolicyHelper::GrantWriteFileSystem(
480 int child_id, const std::string& filesystem_id) { 469 int child_id,
470 const std::string& filesystem_id) {
481 GrantPermissionsForFileSystem(child_id, filesystem_id, WRITE_FILE_GRANT); 471 GrantPermissionsForFileSystem(child_id, filesystem_id, WRITE_FILE_GRANT);
482 } 472 }
483 473
484 void ChildProcessSecurityPolicyImpl::GrantCreateFileForFileSystem( 474 void ChildProcessSecurityPolicyHelper::GrantCreateFileForFileSystem(
485 int child_id, const std::string& filesystem_id) { 475 int child_id,
476 const std::string& filesystem_id) {
486 GrantPermissionsForFileSystem(child_id, filesystem_id, CREATE_NEW_FILE_GRANT); 477 GrantPermissionsForFileSystem(child_id, filesystem_id, CREATE_NEW_FILE_GRANT);
487 } 478 }
488 479
489 void ChildProcessSecurityPolicyImpl::GrantCreateReadWriteFileSystem( 480 void ChildProcessSecurityPolicyHelper::GrantCreateReadWriteFileSystem(
490 int child_id, const std::string& filesystem_id) { 481 int child_id,
491 GrantPermissionsForFileSystem( 482 const std::string& filesystem_id) {
492 child_id, filesystem_id, CREATE_READ_WRITE_FILE_GRANT); 483 GrantPermissionsForFileSystem(child_id, filesystem_id,
484 CREATE_READ_WRITE_FILE_GRANT);
493 } 485 }
494 486
495 void ChildProcessSecurityPolicyImpl::GrantCopyIntoFileSystem( 487 void ChildProcessSecurityPolicyHelper::GrantCopyIntoFileSystem(
496 int child_id, const std::string& filesystem_id) { 488 int child_id,
489 const std::string& filesystem_id) {
497 GrantPermissionsForFileSystem(child_id, filesystem_id, COPY_INTO_FILE_GRANT); 490 GrantPermissionsForFileSystem(child_id, filesystem_id, COPY_INTO_FILE_GRANT);
498 } 491 }
499 492
500 void ChildProcessSecurityPolicyImpl::GrantDeleteFromFileSystem( 493 void ChildProcessSecurityPolicyHelper::GrantDeleteFromFileSystem(
501 int child_id, const std::string& filesystem_id) { 494 int child_id,
495 const std::string& filesystem_id) {
502 GrantPermissionsForFileSystem(child_id, filesystem_id, DELETE_FILE_GRANT); 496 GrantPermissionsForFileSystem(child_id, filesystem_id, DELETE_FILE_GRANT);
503 } 497 }
504 498
505 void ChildProcessSecurityPolicyImpl::GrantSendMidiSysExMessage(int child_id) { 499 void ChildProcessSecurityPolicyHelper::GrantSendMidiSysExMessage(int child_id) {
506 base::AutoLock lock(lock_); 500 base::AutoLock lock(lock_);
507 501
508 SecurityStateMap::iterator state = security_state_.find(child_id); 502 SecurityStateMap::iterator state = security_state_.find(child_id);
509 if (state == security_state_.end()) 503 if (state == security_state_.end())
510 return; 504 return;
511 505
512 state->second->GrantPermissionForMidiSysEx(); 506 state->second->GrantPermissionForMidiSysEx();
513 } 507 }
514 508
515 void ChildProcessSecurityPolicyImpl::GrantOrigin(int child_id, 509 void ChildProcessSecurityPolicyHelper::GrantOrigin(int child_id,
516 const url::Origin& origin) { 510 const url::Origin& origin) {
517 base::AutoLock lock(lock_); 511 base::AutoLock lock(lock_);
518 512
519 SecurityStateMap::iterator state = security_state_.find(child_id); 513 SecurityStateMap::iterator state = security_state_.find(child_id);
520 if (state == security_state_.end()) 514 if (state == security_state_.end())
521 return; 515 return;
522 516
523 state->second->GrantOrigin(origin); 517 state->second->GrantOrigin(origin);
524 } 518 }
525 519
526 void ChildProcessSecurityPolicyImpl::GrantScheme(int child_id, 520 void ChildProcessSecurityPolicyHelper::GrantScheme(int child_id,
527 const std::string& scheme) { 521 const std::string& scheme) {
528 base::AutoLock lock(lock_); 522 base::AutoLock lock(lock_);
529 523
530 SecurityStateMap::iterator state = security_state_.find(child_id); 524 SecurityStateMap::iterator state = security_state_.find(child_id);
531 if (state == security_state_.end()) 525 if (state == security_state_.end())
532 return; 526 return;
533 527
534 state->second->GrantScheme(scheme); 528 state->second->GrantScheme(scheme);
535 } 529 }
536 530
537 void ChildProcessSecurityPolicyImpl::GrantWebUIBindings(int child_id) { 531 void ChildProcessSecurityPolicyHelper::GrantWebUIBindings(int child_id) {
538 base::AutoLock lock(lock_); 532 base::AutoLock lock(lock_);
539 533
540 SecurityStateMap::iterator state = security_state_.find(child_id); 534 SecurityStateMap::iterator state = security_state_.find(child_id);
541 if (state == security_state_.end()) 535 if (state == security_state_.end())
542 return; 536 return;
543 537
544 state->second->GrantBindings(BINDINGS_POLICY_WEB_UI); 538 state->second->GrantBindings(BINDINGS_POLICY_WEB_UI);
545 539
546 // Web UI bindings need the ability to request chrome: URLs. 540 // Web UI bindings need the ability to request chrome: URLs.
547 state->second->GrantScheme(kChromeUIScheme); 541 state->second->GrantScheme(kChromeUIScheme);
548 542
549 // Web UI pages can contain links to file:// URLs. 543 // Web UI pages can contain links to file:// URLs.
550 state->second->GrantScheme(url::kFileScheme); 544 state->second->GrantScheme(url::kFileScheme);
551 } 545 }
552 546
553 void ChildProcessSecurityPolicyImpl::GrantReadRawCookies(int child_id) { 547 void ChildProcessSecurityPolicyHelper::GrantReadRawCookies(int child_id) {
554 base::AutoLock lock(lock_); 548 base::AutoLock lock(lock_);
555 549
556 SecurityStateMap::iterator state = security_state_.find(child_id); 550 SecurityStateMap::iterator state = security_state_.find(child_id);
557 if (state == security_state_.end()) 551 if (state == security_state_.end())
558 return; 552 return;
559 553
560 state->second->GrantReadRawCookies(); 554 state->second->GrantReadRawCookies();
561 } 555 }
562 556
563 void ChildProcessSecurityPolicyImpl::RevokeReadRawCookies(int child_id) { 557 void ChildProcessSecurityPolicyHelper::RevokeReadRawCookies(int child_id) {
564 base::AutoLock lock(lock_); 558 base::AutoLock lock(lock_);
565 559
566 SecurityStateMap::iterator state = security_state_.find(child_id); 560 SecurityStateMap::iterator state = security_state_.find(child_id);
567 if (state == security_state_.end()) 561 if (state == security_state_.end())
568 return; 562 return;
569 563
570 state->second->RevokeReadRawCookies(); 564 state->second->RevokeReadRawCookies();
571 } 565 }
572 566
573 bool ChildProcessSecurityPolicyImpl::CanRequestURL( 567 bool ChildProcessSecurityPolicyHelper::CanRequestURL(int child_id,
574 int child_id, const GURL& url) { 568 const GURL& url) {
575 if (!url.is_valid()) 569 if (!url.is_valid())
576 return false; // Can't request invalid URLs. 570 return false; // Can't request invalid URLs.
577 571
578 if (IsPseudoScheme(url.scheme())) { 572 if (IsPseudoScheme(url.scheme())) {
579 // Every child process can request <about:blank>. 573 // Every child process can request <about:blank>.
580 if (base::LowerCaseEqualsASCII(url.spec(), url::kAboutBlankURL)) 574 if (base::LowerCaseEqualsASCII(url.spec(), url::kAboutBlankURL))
581 return true; 575 return true;
582 // URLs like <about:version>, <about:crash>, <view-source:...> shouldn't be 576 // URLs like <about:version>, <about:crash>, <view-source:...> shouldn't be
583 // requestable by any child process. Also, this case covers 577 // requestable by any child process. Also, this case covers
584 // <javascript:...>, which should be handled internally by the process and 578 // <javascript:...>, which should be handled internally by the process and
585 // not kicked up to the browser. 579 // not kicked up to the browser.
586 return false; 580 return false;
587 } 581 }
588 582
589 // If the process can commit the URL, it can request it. 583 // If the process can commit the URL, it can request it.
590 if (CanCommitURL(child_id, url)) 584 if (CanCommitURL(child_id, url))
591 return true; 585 return true;
592 586
593 // Also allow URLs destined for ShellExecute and not the browser itself. 587 // Also allow URLs destined for ShellExecute and not the browser itself.
594 return !GetContentClient()->browser()->IsHandledURL(url) && 588 return !GetContentClient()->browser()->IsHandledURL(url) &&
595 !net::URLRequest::IsHandledURL(url); 589 !net::URLRequest::IsHandledURL(url);
596 } 590 }
597 591
598 bool ChildProcessSecurityPolicyImpl::CanCommitURL(int child_id, 592 bool ChildProcessSecurityPolicyHelper::CanCommitURL(int child_id,
599 const GURL& url) { 593 const GURL& url) {
600 if (!url.is_valid()) 594 if (!url.is_valid())
601 return false; // Can't commit invalid URLs. 595 return false; // Can't commit invalid URLs.
602 596
603 // Of all the pseudo schemes, only about:blank is allowed to commit. 597 // Of all the pseudo schemes, only about:blank is allowed to commit.
604 if (IsPseudoScheme(url.scheme())) 598 if (IsPseudoScheme(url.scheme()))
605 return base::LowerCaseEqualsASCII(url.spec(), url::kAboutBlankURL); 599 return base::LowerCaseEqualsASCII(url.spec(), url::kAboutBlankURL);
606 600
607 // TODO(creis): Tighten this for Site Isolation, so that a URL from a site 601 // 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. 602 // that is isolated can only be committed in a process dedicated to that site.
609 // CanRequestURL should still allow all web-safe schemes. See 603 // CanRequestURL should still allow all web-safe schemes. See
610 // https://crbug.com/515309. 604 // https://crbug.com/515309.
611 if (IsWebSafeScheme(url.scheme())) 605 if (IsWebSafeScheme(url.scheme()))
612 return true; // The scheme has been white-listed for every child process. 606 return true; // The scheme has been white-listed for every child process.
613 607
614 { 608 {
615 base::AutoLock lock(lock_); 609 base::AutoLock lock(lock_);
616 610
617 SecurityStateMap::iterator state = security_state_.find(child_id); 611 SecurityStateMap::iterator state = security_state_.find(child_id);
618 if (state == security_state_.end()) 612 if (state == security_state_.end())
619 return false; 613 return false;
620 614
621 // Otherwise, we consult the child process's security state to see if it is 615 // Otherwise, we consult the child process's security state to see if it is
622 // allowed to commit the URL. 616 // allowed to commit the URL.
623 return state->second->CanCommitURL(url); 617 return state->second->CanCommitURL(url);
624 } 618 }
625 } 619 }
626 620
627 bool ChildProcessSecurityPolicyImpl::CanReadFile(int child_id, 621 bool ChildProcessSecurityPolicyHelper::CanReadFile(int child_id,
628 const base::FilePath& file) { 622 const base::FilePath& file) {
629 return HasPermissionsForFile(child_id, file, READ_FILE_GRANT); 623 return HasPermissionsForFile(child_id, file, READ_FILE_GRANT);
630 } 624 }
631 625
632 bool ChildProcessSecurityPolicyImpl::CanReadAllFiles( 626 bool ChildProcessSecurityPolicyHelper::CanReadAllFiles(
633 int child_id, 627 int child_id,
634 const std::vector<base::FilePath>& files) { 628 const std::vector<base::FilePath>& files) {
635 return std::all_of(files.begin(), files.end(), 629 return std::all_of(files.begin(), files.end(),
636 [this, child_id](const base::FilePath& file) { 630 [this, child_id](const base::FilePath& file) {
637 return CanReadFile(child_id, file); 631 return CanReadFile(child_id, file);
638 }); 632 });
639 } 633 }
640 634
641 bool ChildProcessSecurityPolicyImpl::CanCreateReadWriteFile( 635 bool ChildProcessSecurityPolicyHelper::CanCreateReadWriteFile(
642 int child_id, 636 int child_id,
643 const base::FilePath& file) { 637 const base::FilePath& file) {
644 return HasPermissionsForFile(child_id, file, CREATE_READ_WRITE_FILE_GRANT); 638 return HasPermissionsForFile(child_id, file, CREATE_READ_WRITE_FILE_GRANT);
645 } 639 }
646 640
647 bool ChildProcessSecurityPolicyImpl::CanReadFileSystem( 641 bool ChildProcessSecurityPolicyHelper::CanReadFileSystem(
648 int child_id, const std::string& filesystem_id) { 642 int child_id,
643 const std::string& filesystem_id) {
649 return HasPermissionsForFileSystem(child_id, filesystem_id, READ_FILE_GRANT); 644 return HasPermissionsForFileSystem(child_id, filesystem_id, READ_FILE_GRANT);
650 } 645 }
651 646
652 bool ChildProcessSecurityPolicyImpl::CanReadWriteFileSystem( 647 bool ChildProcessSecurityPolicyHelper::CanReadWriteFileSystem(
653 int child_id, const std::string& filesystem_id) { 648 int child_id,
649 const std::string& filesystem_id) {
654 return HasPermissionsForFileSystem(child_id, filesystem_id, 650 return HasPermissionsForFileSystem(child_id, filesystem_id,
655 READ_FILE_GRANT | WRITE_FILE_GRANT); 651 READ_FILE_GRANT | WRITE_FILE_GRANT);
656 } 652 }
657 653
658 bool ChildProcessSecurityPolicyImpl::CanCopyIntoFileSystem( 654 bool ChildProcessSecurityPolicyHelper::CanCopyIntoFileSystem(
659 int child_id, const std::string& filesystem_id) { 655 int child_id,
656 const std::string& filesystem_id) {
660 return HasPermissionsForFileSystem(child_id, filesystem_id, 657 return HasPermissionsForFileSystem(child_id, filesystem_id,
661 COPY_INTO_FILE_GRANT); 658 COPY_INTO_FILE_GRANT);
662 } 659 }
663 660
664 bool ChildProcessSecurityPolicyImpl::CanDeleteFromFileSystem( 661 bool ChildProcessSecurityPolicyHelper::CanDeleteFromFileSystem(
665 int child_id, const std::string& filesystem_id) { 662 int child_id,
663 const std::string& filesystem_id) {
666 return HasPermissionsForFileSystem(child_id, filesystem_id, 664 return HasPermissionsForFileSystem(child_id, filesystem_id,
667 DELETE_FILE_GRANT); 665 DELETE_FILE_GRANT);
668 } 666 }
669 667
670 bool ChildProcessSecurityPolicyImpl::HasPermissionsForFile( 668 bool ChildProcessSecurityPolicyHelper::HasPermissionsForFile(
671 int child_id, const base::FilePath& file, int permissions) { 669 int child_id,
670 const base::FilePath& file,
671 int permissions) {
672 base::AutoLock lock(lock_); 672 base::AutoLock lock(lock_);
673 bool result = ChildProcessHasPermissionsForFile(child_id, file, permissions); 673 bool result = ChildProcessHasPermissionsForFile(child_id, file, permissions);
674 if (!result) { 674 if (!result) {
675 // If this is a worker thread that has no access to a given file, 675 // 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. 676 // let's check that its renderer process has access to that file instead.
677 WorkerToMainProcessMap::iterator iter = worker_map_.find(child_id); 677 WorkerToMainProcessMap::iterator iter = worker_map_.find(child_id);
678 if (iter != worker_map_.end() && iter->second != 0) { 678 if (iter != worker_map_.end() && iter->second != 0) {
679 result = ChildProcessHasPermissionsForFile(iter->second, 679 result =
680 file, 680 ChildProcessHasPermissionsForFile(iter->second, file, permissions);
681 permissions);
682 } 681 }
683 } 682 }
684 return result; 683 return result;
685 } 684 }
686 685
687 bool ChildProcessSecurityPolicyImpl::HasPermissionsForFileSystemFile( 686 bool ChildProcessSecurityPolicyHelper::HasPermissionsForFileSystemFile(
688 int child_id, 687 int child_id,
689 const storage::FileSystemURL& url, 688 const storage::FileSystemURL& url,
690 int permissions) { 689 int permissions) {
691 if (!url.is_valid()) 690 if (!url.is_valid())
692 return false; 691 return false;
693 692
694 if (url.path().ReferencesParent()) 693 if (url.path().ReferencesParent())
695 return false; 694 return false;
696 695
697 // Any write access is disallowed on the root path. 696 // Any write access is disallowed on the root path.
698 if (storage::VirtualPath::IsRootPath(url.path()) && 697 if (storage::VirtualPath::IsRootPath(url.path()) &&
699 (permissions & ~READ_FILE_GRANT)) { 698 (permissions & ~READ_FILE_GRANT)) {
700 return false; 699 return false;
701 } 700 }
702 701
703 if (url.mount_type() == storage::kFileSystemTypeIsolated) { 702 if (url.mount_type() == storage::kFileSystemTypeIsolated) {
704 // When Isolated filesystems is overlayed on top of another filesystem, 703 // When Isolated filesystems is overlayed on top of another filesystem,
705 // its per-filesystem permission overrides the underlying filesystem 704 // its per-filesystem permission overrides the underlying filesystem
706 // permissions). 705 // permissions).
707 return HasPermissionsForFileSystem( 706 return HasPermissionsForFileSystem(child_id, url.mount_filesystem_id(),
708 child_id, url.mount_filesystem_id(), permissions); 707 permissions);
709 } 708 }
710 709
711 FileSystemPermissionPolicyMap::iterator found = 710 FileSystemPermissionPolicyMap::iterator found =
712 file_system_policy_map_.find(url.type()); 711 file_system_policy_map_.find(url.type());
713 if (found == file_system_policy_map_.end()) 712 if (found == file_system_policy_map_.end())
714 return false; 713 return false;
715 714
716 if ((found->second & storage::FILE_PERMISSION_READ_ONLY) && 715 if ((found->second & storage::FILE_PERMISSION_READ_ONLY) &&
717 permissions & ~READ_FILE_GRANT) { 716 permissions & ~READ_FILE_GRANT) {
718 return false; 717 return false;
719 } 718 }
720 719
721 if (found->second & storage::FILE_PERMISSION_USE_FILE_PERMISSION) 720 if (found->second & storage::FILE_PERMISSION_USE_FILE_PERMISSION)
722 return HasPermissionsForFile(child_id, url.path(), permissions); 721 return HasPermissionsForFile(child_id, url.path(), permissions);
723 722
724 if (found->second & storage::FILE_PERMISSION_SANDBOX) 723 if (found->second & storage::FILE_PERMISSION_SANDBOX)
725 return true; 724 return true;
726 725
727 return false; 726 return false;
728 } 727 }
729 728
730 bool ChildProcessSecurityPolicyImpl::CanReadFileSystemFile( 729 bool ChildProcessSecurityPolicyHelper::CanReadFileSystemFile(
731 int child_id, 730 int child_id,
732 const storage::FileSystemURL& url) { 731 const storage::FileSystemURL& url) {
733 return HasPermissionsForFileSystemFile(child_id, url, READ_FILE_GRANT); 732 return HasPermissionsForFileSystemFile(child_id, url, READ_FILE_GRANT);
734 } 733 }
735 734
736 bool ChildProcessSecurityPolicyImpl::CanWriteFileSystemFile( 735 bool ChildProcessSecurityPolicyHelper::CanWriteFileSystemFile(
737 int child_id, 736 int child_id,
738 const storage::FileSystemURL& url) { 737 const storage::FileSystemURL& url) {
739 return HasPermissionsForFileSystemFile(child_id, url, WRITE_FILE_GRANT); 738 return HasPermissionsForFileSystemFile(child_id, url, WRITE_FILE_GRANT);
740 } 739 }
741 740
742 bool ChildProcessSecurityPolicyImpl::CanCreateFileSystemFile( 741 bool ChildProcessSecurityPolicyHelper::CanCreateFileSystemFile(
743 int child_id, 742 int child_id,
744 const storage::FileSystemURL& url) { 743 const storage::FileSystemURL& url) {
745 return HasPermissionsForFileSystemFile(child_id, url, CREATE_NEW_FILE_GRANT); 744 return HasPermissionsForFileSystemFile(child_id, url, CREATE_NEW_FILE_GRANT);
746 } 745 }
747 746
748 bool ChildProcessSecurityPolicyImpl::CanCreateReadWriteFileSystemFile( 747 bool ChildProcessSecurityPolicyHelper::CanCreateReadWriteFileSystemFile(
749 int child_id, 748 int child_id,
750 const storage::FileSystemURL& url) { 749 const storage::FileSystemURL& url) {
751 return HasPermissionsForFileSystemFile(child_id, url, 750 return HasPermissionsForFileSystemFile(child_id, url,
752 CREATE_READ_WRITE_FILE_GRANT); 751 CREATE_READ_WRITE_FILE_GRANT);
753 } 752 }
754 753
755 bool ChildProcessSecurityPolicyImpl::CanCopyIntoFileSystemFile( 754 bool ChildProcessSecurityPolicyHelper::CanCopyIntoFileSystemFile(
756 int child_id, 755 int child_id,
757 const storage::FileSystemURL& url) { 756 const storage::FileSystemURL& url) {
758 return HasPermissionsForFileSystemFile(child_id, url, COPY_INTO_FILE_GRANT); 757 return HasPermissionsForFileSystemFile(child_id, url, COPY_INTO_FILE_GRANT);
759 } 758 }
760 759
761 bool ChildProcessSecurityPolicyImpl::CanDeleteFileSystemFile( 760 bool ChildProcessSecurityPolicyHelper::CanDeleteFileSystemFile(
762 int child_id, 761 int child_id,
763 const storage::FileSystemURL& url) { 762 const storage::FileSystemURL& url) {
764 return HasPermissionsForFileSystemFile(child_id, url, DELETE_FILE_GRANT); 763 return HasPermissionsForFileSystemFile(child_id, url, DELETE_FILE_GRANT);
765 } 764 }
766 765
767 bool ChildProcessSecurityPolicyImpl::HasWebUIBindings(int child_id) { 766 bool ChildProcessSecurityPolicyHelper::HasWebUIBindings(int child_id) {
768 base::AutoLock lock(lock_); 767 base::AutoLock lock(lock_);
769 768
770 SecurityStateMap::iterator state = security_state_.find(child_id); 769 SecurityStateMap::iterator state = security_state_.find(child_id);
771 if (state == security_state_.end()) 770 if (state == security_state_.end())
772 return false; 771 return false;
773 772
774 return state->second->has_web_ui_bindings(); 773 return state->second->has_web_ui_bindings();
775 } 774 }
776 775
777 bool ChildProcessSecurityPolicyImpl::CanReadRawCookies(int child_id) { 776 bool ChildProcessSecurityPolicyHelper::CanReadRawCookies(int child_id) {
778 base::AutoLock lock(lock_); 777 base::AutoLock lock(lock_);
779 778
780 SecurityStateMap::iterator state = security_state_.find(child_id); 779 SecurityStateMap::iterator state = security_state_.find(child_id);
781 if (state == security_state_.end()) 780 if (state == security_state_.end())
782 return false; 781 return false;
783 782
784 return state->second->can_read_raw_cookies(); 783 return state->second->can_read_raw_cookies();
785 } 784 }
786 785
787 void ChildProcessSecurityPolicyImpl::AddChild(int child_id) { 786 void ChildProcessSecurityPolicyHelper::AddChild(int child_id) {
788 if (security_state_.count(child_id) != 0) { 787 if (security_state_.count(child_id) != 0) {
789 NOTREACHED() << "Add child process at most once."; 788 NOTREACHED() << "Add child process at most once.";
790 return; 789 return;
791 } 790 }
792 791
793 security_state_[child_id] = new SecurityState(); 792 security_state_[child_id] = new SecurityState();
794 } 793 }
795 794
796 bool ChildProcessSecurityPolicyImpl::ChildProcessHasPermissionsForFile( 795 bool ChildProcessSecurityPolicyHelper::ChildProcessHasPermissionsForFile(
797 int child_id, const base::FilePath& file, int permissions) { 796 int child_id,
797 const base::FilePath& file,
798 int permissions) {
798 SecurityStateMap::iterator state = security_state_.find(child_id); 799 SecurityStateMap::iterator state = security_state_.find(child_id);
799 if (state == security_state_.end()) 800 if (state == security_state_.end())
800 return false; 801 return false;
801 return state->second->HasPermissionsForFile(file, permissions); 802 return state->second->HasPermissionsForFile(file, permissions);
802 } 803 }
803 804
804 bool ChildProcessSecurityPolicyImpl::CanAccessDataForOrigin(int child_id, 805 bool ChildProcessSecurityPolicyHelper::CanAccessDataForOrigin(
805 const GURL& gurl) { 806 int child_id,
807 const GURL& gurl) {
806 base::AutoLock lock(lock_); 808 base::AutoLock lock(lock_);
807 SecurityStateMap::iterator state = security_state_.find(child_id); 809 SecurityStateMap::iterator state = security_state_.find(child_id);
808 if (state == security_state_.end()) { 810 if (state == security_state_.end()) {
809 // TODO(nick): Returning true instead of false here is a temporary 811 // TODO(nick): Returning true instead of false here is a temporary
810 // workaround for https://crbug.com/600441 812 // workaround for https://crbug.com/600441
811 return true; 813 return true;
812 } 814 }
813 return state->second->CanAccessDataForOrigin(gurl); 815 return state->second->CanAccessDataForOrigin(gurl);
814 } 816 }
815 817
816 void ChildProcessSecurityPolicyImpl::LockToOrigin(int child_id, 818 void ChildProcessSecurityPolicyHelper::LockToOrigin(int child_id,
817 const GURL& gurl) { 819 const GURL& gurl) {
818 // "gurl" can be currently empty in some cases, such as file://blah. 820 // "gurl" can be currently empty in some cases, such as file://blah.
819 DCHECK(SiteInstanceImpl::GetSiteForURL(NULL, gurl) == gurl); 821 DCHECK(SiteInstanceImpl::GetSiteForURL(NULL, gurl) == gurl);
820 base::AutoLock lock(lock_); 822 base::AutoLock lock(lock_);
821 SecurityStateMap::iterator state = security_state_.find(child_id); 823 SecurityStateMap::iterator state = security_state_.find(child_id);
822 DCHECK(state != security_state_.end()); 824 DCHECK(state != security_state_.end());
823 state->second->LockToOrigin(gurl); 825 state->second->LockToOrigin(gurl);
824 } 826 }
825 827
826 void ChildProcessSecurityPolicyImpl::GrantPermissionsForFileSystem( 828 void ChildProcessSecurityPolicyHelper::GrantPermissionsForFileSystem(
827 int child_id, 829 int child_id,
828 const std::string& filesystem_id, 830 const std::string& filesystem_id,
829 int permission) { 831 int permission) {
830 base::AutoLock lock(lock_); 832 base::AutoLock lock(lock_);
831 833
832 SecurityStateMap::iterator state = security_state_.find(child_id); 834 SecurityStateMap::iterator state = security_state_.find(child_id);
833 if (state == security_state_.end()) 835 if (state == security_state_.end())
834 return; 836 return;
835 state->second->GrantPermissionsForFileSystem(filesystem_id, permission); 837 state->second->GrantPermissionsForFileSystem(filesystem_id, permission);
836 } 838 }
837 839
838 bool ChildProcessSecurityPolicyImpl::HasPermissionsForFileSystem( 840 bool ChildProcessSecurityPolicyHelper::HasPermissionsForFileSystem(
839 int child_id, 841 int child_id,
840 const std::string& filesystem_id, 842 const std::string& filesystem_id,
841 int permission) { 843 int permission) {
842 base::AutoLock lock(lock_); 844 base::AutoLock lock(lock_);
843 845
844 SecurityStateMap::iterator state = security_state_.find(child_id); 846 SecurityStateMap::iterator state = security_state_.find(child_id);
845 if (state == security_state_.end()) 847 if (state == security_state_.end())
846 return false; 848 return false;
847 return state->second->HasPermissionsForFileSystem(filesystem_id, permission); 849 return state->second->HasPermissionsForFileSystem(filesystem_id, permission);
848 } 850 }
849 851
850 void ChildProcessSecurityPolicyImpl::RegisterFileSystemPermissionPolicy( 852 void ChildProcessSecurityPolicyHelper::RegisterFileSystemPermissionPolicy(
851 storage::FileSystemType type, 853 storage::FileSystemType type,
852 int policy) { 854 int policy) {
853 base::AutoLock lock(lock_); 855 base::AutoLock lock(lock_);
854 file_system_policy_map_[type] = policy; 856 file_system_policy_map_[type] = policy;
855 } 857 }
856 858
857 bool ChildProcessSecurityPolicyImpl::CanSendMidiSysExMessage(int child_id) { 859 bool ChildProcessSecurityPolicyHelper::CanSendMidiSysExMessage(int child_id) {
858 base::AutoLock lock(lock_); 860 base::AutoLock lock(lock_);
859 861
860 SecurityStateMap::iterator state = security_state_.find(child_id); 862 SecurityStateMap::iterator state = security_state_.find(child_id);
861 if (state == security_state_.end()) 863 if (state == security_state_.end())
862 return false; 864 return false;
863 865
864 return state->second->can_send_midi_sysex(); 866 return state->second->can_send_midi_sysex();
865 } 867 }
866 868
867 } // namespace content 869 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/shared/child_process_security_policy_helper.h ('k') | content/browser/site_instance_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698