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/debug/dump_without_crashing.h" | 11 #include "base/debug/dump_without_crashing.h" |
12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
13 #include "base/logging.h" | 13 #include "base/logging.h" |
14 #include "base/macros.h" | 14 #include "base/macros.h" |
15 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
16 #include "base/metrics/histogram_macros.h" | 16 #include "base/metrics/histogram_macros.h" |
| 17 #include "base/strings/string_split.h" |
17 #include "base/strings/string_util.h" | 18 #include "base/strings/string_util.h" |
18 #include "build/build_config.h" | 19 #include "build/build_config.h" |
19 #include "content/browser/site_instance_impl.h" | 20 #include "content/browser/site_instance_impl.h" |
20 #include "content/common/site_isolation_policy.h" | 21 #include "content/common/site_isolation_policy.h" |
21 #include "content/public/browser/child_process_data.h" | 22 #include "content/public/browser/child_process_data.h" |
22 #include "content/public/browser/content_browser_client.h" | 23 #include "content/public/browser/content_browser_client.h" |
23 #include "content/public/browser/render_process_host.h" | 24 #include "content/public/browser/render_process_host.h" |
24 #include "content/public/common/bindings_policy.h" | 25 #include "content/public/common/bindings_policy.h" |
25 #include "content/public/common/url_constants.h" | 26 #include "content/public/common/url_constants.h" |
26 #include "net/base/filename_util.h" | 27 #include "net/base/filename_util.h" |
(...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 if (it != file_permissions_.end()) | 246 if (it != file_permissions_.end()) |
246 return (it->second & permissions) == permissions; | 247 return (it->second & permissions) == permissions; |
247 } | 248 } |
248 last_path = current_path; | 249 last_path = current_path; |
249 current_path = current_path.DirName(); | 250 current_path = current_path.DirName(); |
250 } | 251 } |
251 | 252 |
252 return false; | 253 return false; |
253 } | 254 } |
254 | 255 |
255 bool CanAccessDataForOrigin(const GURL& gurl) { | 256 bool CanAccessDataForOrigin(const GURL& site_url) { |
256 if (origin_lock_.is_empty()) | 257 if (origin_lock_.is_empty()) |
257 return true; | 258 return true; |
258 // TODO(creis): We must pass the valid browser_context to convert hosted | 259 return origin_lock_ == site_url; |
259 // apps URLs. Currently, hosted apps cannot set cookies in this mode. | |
260 // See http://crbug.com/160576. | |
261 GURL site_gurl = SiteInstanceImpl::GetSiteForURL(NULL, gurl); | |
262 return origin_lock_ == site_gurl; | |
263 } | 260 } |
264 | 261 |
265 void LockToOrigin(const GURL& gurl) { | 262 void LockToOrigin(const GURL& gurl) { |
266 origin_lock_ = gurl; | 263 origin_lock_ = gurl; |
267 } | 264 } |
268 | 265 |
269 bool has_web_ui_bindings() const { | 266 bool has_web_ui_bindings() const { |
270 return enabled_bindings_ & BINDINGS_POLICY_WEB_UI; | 267 return enabled_bindings_ & BINDINGS_POLICY_WEB_UI; |
271 } | 268 } |
272 | 269 |
(...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
914 | 911 |
915 bool ChildProcessSecurityPolicyImpl::ChildProcessHasPermissionsForFile( | 912 bool ChildProcessSecurityPolicyImpl::ChildProcessHasPermissionsForFile( |
916 int child_id, const base::FilePath& file, int permissions) { | 913 int child_id, const base::FilePath& file, int permissions) { |
917 SecurityStateMap::iterator state = security_state_.find(child_id); | 914 SecurityStateMap::iterator state = security_state_.find(child_id); |
918 if (state == security_state_.end()) | 915 if (state == security_state_.end()) |
919 return false; | 916 return false; |
920 return state->second->HasPermissionsForFile(file, permissions); | 917 return state->second->HasPermissionsForFile(file, permissions); |
921 } | 918 } |
922 | 919 |
923 bool ChildProcessSecurityPolicyImpl::CanAccessDataForOrigin(int child_id, | 920 bool ChildProcessSecurityPolicyImpl::CanAccessDataForOrigin(int child_id, |
924 const GURL& gurl) { | 921 const GURL& url) { |
| 922 // It's important to call GetSiteForURL before acquiring |lock_|, since |
| 923 // GetSiteForURL consults IsIsolatedOrigin, which needs to grab the same |
| 924 // lock. |
| 925 // |
| 926 // TODO(creis): We must pass the valid browser_context to convert hosted apps |
| 927 // URLs. Currently, hosted apps cannot set cookies in this mode. See |
| 928 // http://crbug.com/160576. |
| 929 GURL site_url = SiteInstanceImpl::GetSiteForURL(NULL, url); |
| 930 |
925 base::AutoLock lock(lock_); | 931 base::AutoLock lock(lock_); |
926 SecurityStateMap::iterator state = security_state_.find(child_id); | 932 SecurityStateMap::iterator state = security_state_.find(child_id); |
927 if (state == security_state_.end()) { | 933 if (state == security_state_.end()) { |
928 // TODO(nick): Returning true instead of false here is a temporary | 934 // TODO(nick): Returning true instead of false here is a temporary |
929 // workaround for https://crbug.com/600441 | 935 // workaround for https://crbug.com/600441 |
930 return true; | 936 return true; |
931 } | 937 } |
932 return state->second->CanAccessDataForOrigin(gurl); | 938 return state->second->CanAccessDataForOrigin(site_url); |
933 } | 939 } |
934 | 940 |
935 bool ChildProcessSecurityPolicyImpl::HasSpecificPermissionForOrigin( | 941 bool ChildProcessSecurityPolicyImpl::HasSpecificPermissionForOrigin( |
936 int child_id, | 942 int child_id, |
937 const url::Origin& origin) { | 943 const url::Origin& origin) { |
938 base::AutoLock lock(lock_); | 944 base::AutoLock lock(lock_); |
939 SecurityStateMap::iterator state = security_state_.find(child_id); | 945 SecurityStateMap::iterator state = security_state_.find(child_id); |
940 if (state == security_state_.end()) | 946 if (state == security_state_.end()) |
941 return false; | 947 return false; |
942 return state->second->CanCommitOrigin(origin); | 948 return state->second->CanCommitOrigin(origin); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 bool ChildProcessSecurityPolicyImpl::CanSendMidiSysExMessage(int child_id) { | 992 bool ChildProcessSecurityPolicyImpl::CanSendMidiSysExMessage(int child_id) { |
987 base::AutoLock lock(lock_); | 993 base::AutoLock lock(lock_); |
988 | 994 |
989 SecurityStateMap::iterator state = security_state_.find(child_id); | 995 SecurityStateMap::iterator state = security_state_.find(child_id); |
990 if (state == security_state_.end()) | 996 if (state == security_state_.end()) |
991 return false; | 997 return false; |
992 | 998 |
993 return state->second->can_send_midi_sysex(); | 999 return state->second->can_send_midi_sysex(); |
994 } | 1000 } |
995 | 1001 |
| 1002 void ChildProcessSecurityPolicyImpl::AddIsolatedOrigin( |
| 1003 const url::Origin& origin) { |
| 1004 CHECK(!origin.unique()) |
| 1005 << "Cannot register a unique origin as an isolated origin."; |
| 1006 CHECK(!IsIsolatedOrigin(origin)) |
| 1007 << "Duplicate isolated origin: " << origin.Serialize(); |
| 1008 |
| 1009 base::AutoLock lock(lock_); |
| 1010 isolated_origins_.insert(origin); |
| 1011 } |
| 1012 |
| 1013 void ChildProcessSecurityPolicyImpl::AddIsolatedOriginsFromCommandLine( |
| 1014 const std::string& origin_list) { |
| 1015 for (const base::StringPiece& origin_piece : |
| 1016 base::SplitStringPiece(origin_list, ",", base::TRIM_WHITESPACE, |
| 1017 base::SPLIT_WANT_NONEMPTY)) { |
| 1018 url::Origin origin((GURL(origin_piece))); |
| 1019 if (!origin.unique()) |
| 1020 AddIsolatedOrigin(origin); |
| 1021 } |
| 1022 } |
| 1023 |
| 1024 bool ChildProcessSecurityPolicyImpl::IsIsolatedOrigin( |
| 1025 const url::Origin& origin) { |
| 1026 base::AutoLock lock(lock_); |
| 1027 return isolated_origins_.find(origin) != isolated_origins_.end(); |
| 1028 } |
| 1029 |
996 } // namespace content | 1030 } // namespace content |
OLD | NEW |