OLD | NEW |
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/child_process_security_policy_impl.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/memory/ptr_util.h" |
14 #include "base/metrics/histogram.h" | 15 #include "base/metrics/histogram.h" |
15 #include "base/stl_util.h" | |
16 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
17 #include "build/build_config.h" | 17 #include "build/build_config.h" |
18 #include "content/browser/site_instance_impl.h" | 18 #include "content/browser/site_instance_impl.h" |
19 #include "content/common/site_isolation_policy.h" | 19 #include "content/common/site_isolation_policy.h" |
20 #include "content/public/browser/child_process_data.h" | 20 #include "content/public/browser/child_process_data.h" |
21 #include "content/public/browser/content_browser_client.h" | 21 #include "content/public/browser/content_browser_client.h" |
22 #include "content/public/browser/render_process_host.h" | 22 #include "content/public/browser/render_process_host.h" |
23 #include "content/public/common/bindings_policy.h" | 23 #include "content/public/common/bindings_policy.h" |
24 #include "content/public/common/url_constants.h" | 24 #include "content/public/common/url_constants.h" |
25 #include "net/base/filename_util.h" | 25 #include "net/base/filename_util.h" |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 | 306 |
307 // We know about the following pseudo schemes and treat them specially. | 307 // We know about the following pseudo schemes and treat them specially. |
308 RegisterPseudoScheme(url::kAboutScheme); | 308 RegisterPseudoScheme(url::kAboutScheme); |
309 RegisterPseudoScheme(url::kJavaScriptScheme); | 309 RegisterPseudoScheme(url::kJavaScriptScheme); |
310 RegisterPseudoScheme(kViewSourceScheme); | 310 RegisterPseudoScheme(kViewSourceScheme); |
311 } | 311 } |
312 | 312 |
313 ChildProcessSecurityPolicyImpl::~ChildProcessSecurityPolicyImpl() { | 313 ChildProcessSecurityPolicyImpl::~ChildProcessSecurityPolicyImpl() { |
314 web_safe_schemes_.clear(); | 314 web_safe_schemes_.clear(); |
315 pseudo_schemes_.clear(); | 315 pseudo_schemes_.clear(); |
316 base::STLDeleteContainerPairSecondPointers(security_state_.begin(), | |
317 security_state_.end()); | |
318 security_state_.clear(); | 316 security_state_.clear(); |
319 } | 317 } |
320 | 318 |
321 // static | 319 // static |
322 ChildProcessSecurityPolicy* ChildProcessSecurityPolicy::GetInstance() { | 320 ChildProcessSecurityPolicy* ChildProcessSecurityPolicy::GetInstance() { |
323 return ChildProcessSecurityPolicyImpl::GetInstance(); | 321 return ChildProcessSecurityPolicyImpl::GetInstance(); |
324 } | 322 } |
325 | 323 |
326 ChildProcessSecurityPolicyImpl* ChildProcessSecurityPolicyImpl::GetInstance() { | 324 ChildProcessSecurityPolicyImpl* ChildProcessSecurityPolicyImpl::GetInstance() { |
327 return base::Singleton<ChildProcessSecurityPolicyImpl>::get(); | 325 return base::Singleton<ChildProcessSecurityPolicyImpl>::get(); |
328 } | 326 } |
329 | 327 |
330 void ChildProcessSecurityPolicyImpl::Add(int child_id) { | 328 void ChildProcessSecurityPolicyImpl::Add(int child_id) { |
331 base::AutoLock lock(lock_); | 329 base::AutoLock lock(lock_); |
332 AddChild(child_id); | 330 AddChild(child_id); |
333 } | 331 } |
334 | 332 |
335 void ChildProcessSecurityPolicyImpl::AddWorker(int child_id, | 333 void ChildProcessSecurityPolicyImpl::AddWorker(int child_id, |
336 int main_render_process_id) { | 334 int main_render_process_id) { |
337 base::AutoLock lock(lock_); | 335 base::AutoLock lock(lock_); |
338 AddChild(child_id); | 336 AddChild(child_id); |
339 worker_map_[child_id] = main_render_process_id; | 337 worker_map_[child_id] = main_render_process_id; |
340 } | 338 } |
341 | 339 |
342 void ChildProcessSecurityPolicyImpl::Remove(int child_id) { | 340 void ChildProcessSecurityPolicyImpl::Remove(int child_id) { |
343 base::AutoLock lock(lock_); | 341 base::AutoLock lock(lock_); |
344 SecurityStateMap::iterator it = security_state_.find(child_id); | 342 security_state_.erase(child_id); |
345 if (it == security_state_.end()) | |
346 return; // May be called multiple times. | |
347 | |
348 delete it->second; | |
349 security_state_.erase(it); | |
350 worker_map_.erase(child_id); | 343 worker_map_.erase(child_id); |
351 } | 344 } |
352 | 345 |
353 void ChildProcessSecurityPolicyImpl::RegisterWebSafeScheme( | 346 void ChildProcessSecurityPolicyImpl::RegisterWebSafeScheme( |
354 const std::string& scheme) { | 347 const std::string& scheme) { |
355 base::AutoLock lock(lock_); | 348 base::AutoLock lock(lock_); |
356 DCHECK_EQ(0U, web_safe_schemes_.count(scheme)) << "Add schemes at most once."; | 349 DCHECK_EQ(0U, web_safe_schemes_.count(scheme)) << "Add schemes at most once."; |
357 DCHECK_EQ(0U, pseudo_schemes_.count(scheme)) | 350 DCHECK_EQ(0U, pseudo_schemes_.count(scheme)) |
358 << "Web-safe implies not pseudo."; | 351 << "Web-safe implies not pseudo."; |
359 | 352 |
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 | 776 |
784 return state->second->can_read_raw_cookies(); | 777 return state->second->can_read_raw_cookies(); |
785 } | 778 } |
786 | 779 |
787 void ChildProcessSecurityPolicyImpl::AddChild(int child_id) { | 780 void ChildProcessSecurityPolicyImpl::AddChild(int child_id) { |
788 if (security_state_.count(child_id) != 0) { | 781 if (security_state_.count(child_id) != 0) { |
789 NOTREACHED() << "Add child process at most once."; | 782 NOTREACHED() << "Add child process at most once."; |
790 return; | 783 return; |
791 } | 784 } |
792 | 785 |
793 security_state_[child_id] = new SecurityState(); | 786 security_state_[child_id] = base::MakeUnique<SecurityState>(); |
794 } | 787 } |
795 | 788 |
796 bool ChildProcessSecurityPolicyImpl::ChildProcessHasPermissionsForFile( | 789 bool ChildProcessSecurityPolicyImpl::ChildProcessHasPermissionsForFile( |
797 int child_id, const base::FilePath& file, int permissions) { | 790 int child_id, const base::FilePath& file, int permissions) { |
798 SecurityStateMap::iterator state = security_state_.find(child_id); | 791 SecurityStateMap::iterator state = security_state_.find(child_id); |
799 if (state == security_state_.end()) | 792 if (state == security_state_.end()) |
800 return false; | 793 return false; |
801 return state->second->HasPermissionsForFile(file, permissions); | 794 return state->second->HasPermissionsForFile(file, permissions); |
802 } | 795 } |
803 | 796 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
858 base::AutoLock lock(lock_); | 851 base::AutoLock lock(lock_); |
859 | 852 |
860 SecurityStateMap::iterator state = security_state_.find(child_id); | 853 SecurityStateMap::iterator state = security_state_.find(child_id); |
861 if (state == security_state_.end()) | 854 if (state == security_state_.end()) |
862 return false; | 855 return false; |
863 | 856 |
864 return state->second->can_send_midi_sysex(); | 857 return state->second->can_send_midi_sysex(); |
865 } | 858 } |
866 | 859 |
867 } // namespace content | 860 } // namespace content |
OLD | NEW |