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

Side by Side Diff: content/browser/child_process_security_policy.cc

Issue 6893145: Ensured that worker thread renderer process file permissions are inherited from its main thread r... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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.h" 5 #include "content/browser/child_process_security_policy.h"
6 6
7 #include "base/file_path.h" 7 #include "base/file_path.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/platform_file.h" 9 #include "base/platform_file.h"
10 #include "base/stl_util-inl.h" 10 #include "base/stl_util-inl.h"
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 security_state_.clear(); 150 security_state_.clear();
151 } 151 }
152 152
153 // static 153 // static
154 ChildProcessSecurityPolicy* ChildProcessSecurityPolicy::GetInstance() { 154 ChildProcessSecurityPolicy* ChildProcessSecurityPolicy::GetInstance() {
155 return Singleton<ChildProcessSecurityPolicy>::get(); 155 return Singleton<ChildProcessSecurityPolicy>::get();
156 } 156 }
157 157
158 void ChildProcessSecurityPolicy::Add(int child_id) { 158 void ChildProcessSecurityPolicy::Add(int child_id) {
159 base::AutoLock lock(lock_); 159 base::AutoLock lock(lock_);
160 if (security_state_.count(child_id) != 0) { 160 AddChild(child_id);
161 NOTREACHED() << "Add child process at most once."; 161 }
162 return;
163 }
164 162
165 security_state_[child_id] = new SecurityState(); 163 void ChildProcessSecurityPolicy::AddWorker(int child_id,
164 int main_render_process_id) {
165 base::AutoLock lock(lock_);
166 AddChild(child_id);
167 worker_map_.insert(WorkerToMainProcessMap::value_type(child_id,
168 main_render_process_id));
jam 2011/05/02 17:17:53 nit: seems simpler to read if it's just worker_ma
zel 2011/05/02 18:16:11 Done.
166 } 169 }
167 170
168 void ChildProcessSecurityPolicy::Remove(int child_id) { 171 void ChildProcessSecurityPolicy::Remove(int child_id) {
169 base::AutoLock lock(lock_); 172 base::AutoLock lock(lock_);
170 if (!security_state_.count(child_id)) 173 if (!security_state_.count(child_id))
171 return; // May be called multiple times. 174 return; // May be called multiple times.
172 175
173 delete security_state_[child_id]; 176 delete security_state_[child_id];
174 security_state_.erase(child_id); 177 security_state_.erase(child_id);
178 worker_map_.erase(child_id);
175 } 179 }
176 180
177 void ChildProcessSecurityPolicy::RegisterWebSafeScheme( 181 void ChildProcessSecurityPolicy::RegisterWebSafeScheme(
178 const std::string& scheme) { 182 const std::string& scheme) {
179 base::AutoLock lock(lock_); 183 base::AutoLock lock(lock_);
180 DCHECK(web_safe_schemes_.count(scheme) == 0) << "Add schemes at most once."; 184 DCHECK(web_safe_schemes_.count(scheme) == 0) << "Add schemes at most once.";
181 DCHECK(pseudo_schemes_.count(scheme) == 0) << "Web-safe implies not pseudo."; 185 DCHECK(pseudo_schemes_.count(scheme) == 0) << "Web-safe implies not pseudo.";
182 186
183 web_safe_schemes_.insert(scheme); 187 web_safe_schemes_.insert(scheme);
184 } 188 }
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
398 bool ChildProcessSecurityPolicy::CanReadDirectory(int child_id, 402 bool ChildProcessSecurityPolicy::CanReadDirectory(int child_id,
399 const FilePath& directory) { 403 const FilePath& directory) {
400 return HasPermissionsForFile(child_id, 404 return HasPermissionsForFile(child_id,
401 directory, 405 directory,
402 kEnumerateDirectoryPermissions); 406 kEnumerateDirectoryPermissions);
403 } 407 }
404 408
405 bool ChildProcessSecurityPolicy::HasPermissionsForFile( 409 bool ChildProcessSecurityPolicy::HasPermissionsForFile(
406 int child_id, const FilePath& file, int permissions) { 410 int child_id, const FilePath& file, int permissions) {
407 base::AutoLock lock(lock_); 411 base::AutoLock lock(lock_);
408 412 bool result = ChildProcessHasPermissionsForFile(child_id, file, permissions);
409 SecurityStateMap::iterator state = security_state_.find(child_id); 413 if (!result) {
410 if (state == security_state_.end()) 414 // If this is a worker thread that has no access to a given file,
411 return false; 415 // let's check that its main thread renderer process has access to that
jam 2011/05/02 17:17:53 nit "main thread" seems redundant. "its renderer
zel 2011/05/02 18:16:11 Done.
412 416 // file instead.
413 return state->second->HasPermissionsForFile(file, permissions); 417 WorkerToMainProcessMap::iterator iter = worker_map_.find(child_id);
418 if (iter != worker_map_.end() && iter->second != 0) {
419 result = ChildProcessHasPermissionsForFile(iter->second,
420 file,
421 permissions);
422 }
423 }
424 return result;
414 } 425 }
415 426
416 bool ChildProcessSecurityPolicy::HasWebUIBindings(int child_id) { 427 bool ChildProcessSecurityPolicy::HasWebUIBindings(int child_id) {
417 base::AutoLock lock(lock_); 428 base::AutoLock lock(lock_);
418 429
419 SecurityStateMap::iterator state = security_state_.find(child_id); 430 SecurityStateMap::iterator state = security_state_.find(child_id);
420 if (state == security_state_.end()) 431 if (state == security_state_.end())
421 return false; 432 return false;
422 433
423 return state->second->has_web_ui_bindings(); 434 return state->second->has_web_ui_bindings();
(...skipping 11 matching lines...) Expand all
435 446
436 bool ChildProcessSecurityPolicy::CanReadRawCookies(int child_id) { 447 bool ChildProcessSecurityPolicy::CanReadRawCookies(int child_id) {
437 base::AutoLock lock(lock_); 448 base::AutoLock lock(lock_);
438 449
439 SecurityStateMap::iterator state = security_state_.find(child_id); 450 SecurityStateMap::iterator state = security_state_.find(child_id);
440 if (state == security_state_.end()) 451 if (state == security_state_.end())
441 return false; 452 return false;
442 453
443 return state->second->can_read_raw_cookies(); 454 return state->second->can_read_raw_cookies();
444 } 455 }
456
457 void ChildProcessSecurityPolicy::AddChild(int child_id) {
458 if (security_state_.count(child_id) != 0) {
459 NOTREACHED() << "Add child process at most once.";
460 return;
461 }
462
463 security_state_[child_id] = new SecurityState();
464 }
465
466 bool ChildProcessSecurityPolicy::ChildProcessHasPermissionsForFile(
467 int child_id, const FilePath& file, int permissions) {
468 SecurityStateMap::iterator state = security_state_.find(child_id);
469 if (state == security_state_.end())
470 return false;
471 return state->second->HasPermissionsForFile(file, permissions);
472 }
OLDNEW
« no previous file with comments | « content/browser/child_process_security_policy.h ('k') | content/browser/child_process_security_policy_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698