| Index: content/browser/child_process_security_policy_impl.cc
|
| diff --git a/content/browser/child_process_security_policy_impl.cc b/content/browser/child_process_security_policy_impl.cc
|
| index b748a72fe73236016d23c5a514b2b828f8b26779..9e94f34602d5e56fd450224bf33110e05da68293 100644
|
| --- a/content/browser/child_process_security_policy_impl.cc
|
| +++ b/content/browser/child_process_security_policy_impl.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "content/browser/child_process_security_policy_impl.h"
|
|
|
| +#include <utility>
|
| +
|
| #include "base/command_line.h"
|
| #include "base/files/file_path.h"
|
| #include "base/logging.h"
|
| @@ -87,6 +89,11 @@ class ChildProcessSecurityPolicyImpl::SecurityState {
|
| file_permissions_.size());
|
| }
|
|
|
| + // Grant permission to request URLs with the specified origin.
|
| + void GrantOrigin(const url::Origin& origin) {
|
| + origin_set_.insert(origin);
|
| + }
|
| +
|
| // Grant permission to request URLs with the specified scheme.
|
| void GrantScheme(const std::string& scheme) {
|
| scheme_policy_[scheme] = true;
|
| @@ -168,10 +175,15 @@ class ChildProcessSecurityPolicyImpl::SecurityState {
|
|
|
| // Determine whether permission has been granted to commit |url|.
|
| bool CanCommitURL(const GURL& url) {
|
| - // Having permission to a scheme implies permssion to all of its URLs.
|
| - SchemeMap::const_iterator judgment(scheme_policy_.find(url.scheme()));
|
| - if (judgment != scheme_policy_.end())
|
| - return judgment->second;
|
| + // Having permission to a scheme implies permission to all of its URLs.
|
| + SchemeMap::const_iterator scheme_judgment(
|
| + scheme_policy_.find(url.scheme()));
|
| + if (scheme_judgment != scheme_policy_.end())
|
| + return scheme_judgment->second;
|
| +
|
| + // Otherwise, check for permission for specific origin.
|
| + if (ContainsKey(origin_set_, url::Origin(url)))
|
| + return true;
|
|
|
| // file:// URLs are more granular. The child may have been given
|
| // permission to a specific file but not the file:// scheme in general.
|
| @@ -242,6 +254,7 @@ class ChildProcessSecurityPolicyImpl::SecurityState {
|
|
|
| private:
|
| typedef std::map<std::string, bool> SchemeMap;
|
| + typedef std::set<url::Origin> OriginSet;
|
|
|
| typedef int FilePermissionFlags; // bit-set of base::File::Flags
|
| typedef std::map<base::FilePath, FilePermissionFlags> FileMap;
|
| @@ -255,6 +268,10 @@ class ChildProcessSecurityPolicyImpl::SecurityState {
|
| // or revoked.
|
| SchemeMap scheme_policy_;
|
|
|
| + // The set of URL origins to which the child process has been granted
|
| + // permission.
|
| + OriginSet origin_set_;
|
| +
|
| // The set of files the child process is permited to upload to the web.
|
| FileMap file_permissions_;
|
|
|
| @@ -503,6 +520,17 @@ void ChildProcessSecurityPolicyImpl::GrantSendMidiSysExMessage(int child_id) {
|
| state->second->GrantPermissionForMidiSysEx();
|
| }
|
|
|
| +void ChildProcessSecurityPolicyImpl::GrantOrigin(int child_id,
|
| + const url::Origin& origin) {
|
| + base::AutoLock lock(lock_);
|
| +
|
| + SecurityStateMap::iterator state = security_state_.find(child_id);
|
| + if (state == security_state_.end())
|
| + return;
|
| +
|
| + state->second->GrantOrigin(origin);
|
| +}
|
| +
|
| void ChildProcessSecurityPolicyImpl::GrantScheme(int child_id,
|
| const std::string& scheme) {
|
| base::AutoLock lock(lock_);
|
|
|