Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } | |
| OLD | NEW |