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 |
deleted file mode 100644 |
index 0def4b57ad00d5633e426246ec2b46e29c3159ae..0000000000000000000000000000000000000000 |
--- a/content/browser/child_process_security_policy_impl.cc |
+++ /dev/null |
@@ -1,867 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/browser/child_process_security_policy_impl.h" |
- |
-#include <algorithm> |
-#include <utility> |
- |
-#include "base/command_line.h" |
-#include "base/files/file_path.h" |
-#include "base/logging.h" |
-#include "base/macros.h" |
-#include "base/metrics/histogram.h" |
-#include "base/stl_util.h" |
-#include "base/strings/string_util.h" |
-#include "build/build_config.h" |
-#include "content/browser/site_instance_impl.h" |
-#include "content/common/site_isolation_policy.h" |
-#include "content/public/browser/child_process_data.h" |
-#include "content/public/browser/content_browser_client.h" |
-#include "content/public/browser/render_process_host.h" |
-#include "content/public/common/bindings_policy.h" |
-#include "content/public/common/url_constants.h" |
-#include "net/base/filename_util.h" |
-#include "net/url_request/url_request.h" |
-#include "storage/browser/fileapi/file_permission_policy.h" |
-#include "storage/browser/fileapi/file_system_url.h" |
-#include "storage/browser/fileapi/isolated_context.h" |
-#include "storage/common/fileapi/file_system_util.h" |
-#include "url/gurl.h" |
- |
-namespace content { |
- |
-namespace { |
- |
-// Used internally only. These bit positions have no relationship to any |
-// underlying OS and can be changed to accommodate finer-grained permissions. |
-enum ChildProcessSecurityPermissions { |
- READ_FILE_PERMISSION = 1 << 0, |
- WRITE_FILE_PERMISSION = 1 << 1, |
- CREATE_NEW_FILE_PERMISSION = 1 << 2, |
- CREATE_OVERWRITE_FILE_PERMISSION = 1 << 3, |
- DELETE_FILE_PERMISSION = 1 << 4, |
- |
- // Used by Media Galleries API |
- COPY_INTO_FILE_PERMISSION = 1 << 5, |
-}; |
- |
-// Used internally only. Bitmasks that are actually used by the Grant* and Can* |
-// methods. These contain one or more ChildProcessSecurityPermissions. |
-enum ChildProcessSecurityGrants { |
- READ_FILE_GRANT = READ_FILE_PERMISSION, |
- WRITE_FILE_GRANT = WRITE_FILE_PERMISSION, |
- |
- CREATE_NEW_FILE_GRANT = CREATE_NEW_FILE_PERMISSION | |
- COPY_INTO_FILE_PERMISSION, |
- |
- CREATE_READ_WRITE_FILE_GRANT = CREATE_NEW_FILE_PERMISSION | |
- CREATE_OVERWRITE_FILE_PERMISSION | |
- READ_FILE_PERMISSION | |
- WRITE_FILE_PERMISSION | |
- COPY_INTO_FILE_PERMISSION | |
- DELETE_FILE_PERMISSION, |
- |
- COPY_INTO_FILE_GRANT = COPY_INTO_FILE_PERMISSION, |
- DELETE_FILE_GRANT = DELETE_FILE_PERMISSION, |
-}; |
- |
-} // namespace |
- |
-// The SecurityState class is used to maintain per-child process security state |
-// information. |
-class ChildProcessSecurityPolicyImpl::SecurityState { |
- public: |
- SecurityState() |
- : enabled_bindings_(0), |
- can_read_raw_cookies_(false), |
- can_send_midi_sysex_(false) { } |
- |
- ~SecurityState() { |
- scheme_policy_.clear(); |
- storage::IsolatedContext* isolated_context = |
- storage::IsolatedContext::GetInstance(); |
- for (FileSystemMap::iterator iter = filesystem_permissions_.begin(); |
- iter != filesystem_permissions_.end(); |
- ++iter) { |
- isolated_context->RemoveReference(iter->first); |
- } |
- UMA_HISTOGRAM_COUNTS("ChildProcessSecurityPolicy.PerChildFilePermissions", |
- 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; |
- } |
- |
- // Revoke permission to request URLs with the specified scheme. |
- void RevokeScheme(const std::string& scheme) { |
- scheme_policy_[scheme] = false; |
- } |
- |
- // Grant certain permissions to a file. |
- void GrantPermissionsForFile(const base::FilePath& file, int permissions) { |
- base::FilePath stripped = file.StripTrailingSeparators(); |
- file_permissions_[stripped] |= permissions; |
- UMA_HISTOGRAM_COUNTS("ChildProcessSecurityPolicy.FilePermissionPathLength", |
- stripped.value().size()); |
- } |
- |
- // Grant navigation to a file but not the file:// scheme in general. |
- void GrantRequestOfSpecificFile(const base::FilePath &file) { |
- request_file_set_.insert(file.StripTrailingSeparators()); |
- } |
- |
- // Revokes all permissions granted to a file. |
- void RevokeAllPermissionsForFile(const base::FilePath& file) { |
- base::FilePath stripped = file.StripTrailingSeparators(); |
- file_permissions_.erase(stripped); |
- request_file_set_.erase(stripped); |
- } |
- |
- // Grant certain permissions to a file. |
- void GrantPermissionsForFileSystem(const std::string& filesystem_id, |
- int permissions) { |
- if (!ContainsKey(filesystem_permissions_, filesystem_id)) |
- storage::IsolatedContext::GetInstance()->AddReference(filesystem_id); |
- filesystem_permissions_[filesystem_id] |= permissions; |
- } |
- |
- bool HasPermissionsForFileSystem(const std::string& filesystem_id, |
- int permissions) { |
- FileSystemMap::const_iterator it = |
- filesystem_permissions_.find(filesystem_id); |
- if (it == filesystem_permissions_.end()) |
- return false; |
- return (it->second & permissions) == permissions; |
- } |
- |
-#if defined(OS_ANDROID) |
- // Determine if the certain permissions have been granted to a content URI. |
- bool HasPermissionsForContentUri(const base::FilePath& file, |
- int permissions) { |
- DCHECK(!file.empty()); |
- DCHECK(file.IsContentUri()); |
- if (!permissions) |
- return false; |
- base::FilePath file_path = file.StripTrailingSeparators(); |
- FileMap::const_iterator it = file_permissions_.find(file_path); |
- if (it != file_permissions_.end()) |
- return (it->second & permissions) == permissions; |
- return false; |
- } |
-#endif |
- |
- void GrantBindings(int bindings) { |
- enabled_bindings_ |= bindings; |
- } |
- |
- void GrantReadRawCookies() { |
- can_read_raw_cookies_ = true; |
- } |
- |
- void RevokeReadRawCookies() { |
- can_read_raw_cookies_ = false; |
- } |
- |
- void GrantPermissionForMidiSysEx() { |
- can_send_midi_sysex_ = true; |
- } |
- |
- // Determine whether permission has been granted to commit |url|. |
- bool CanCommitURL(const GURL& url) { |
- // 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. |
- if (url.SchemeIs(url::kFileScheme)) { |
- base::FilePath path; |
- if (net::FileURLToFilePath(url, &path)) |
- return ContainsKey(request_file_set_, path); |
- } |
- |
- return false; // Unmentioned schemes are disallowed. |
- } |
- |
- // Determine if the certain permissions have been granted to a file. |
- bool HasPermissionsForFile(const base::FilePath& file, int permissions) { |
-#if defined(OS_ANDROID) |
- if (file.IsContentUri()) |
- return HasPermissionsForContentUri(file, permissions); |
-#endif |
- if (!permissions || file.empty() || !file.IsAbsolute()) |
- return false; |
- base::FilePath current_path = file.StripTrailingSeparators(); |
- base::FilePath last_path; |
- int skip = 0; |
- while (current_path != last_path) { |
- base::FilePath base_name = current_path.BaseName(); |
- if (base_name.value() == base::FilePath::kParentDirectory) { |
- ++skip; |
- } else if (skip > 0) { |
- if (base_name.value() != base::FilePath::kCurrentDirectory) |
- --skip; |
- } else { |
- FileMap::const_iterator it = file_permissions_.find(current_path); |
- if (it != file_permissions_.end()) |
- return (it->second & permissions) == permissions; |
- } |
- last_path = current_path; |
- current_path = current_path.DirName(); |
- } |
- |
- return false; |
- } |
- |
- bool CanAccessDataForOrigin(const GURL& gurl) { |
- if (origin_lock_.is_empty()) |
- return true; |
- // TODO(creis): We must pass the valid browser_context to convert hosted |
- // apps URLs. Currently, hosted apps cannot set cookies in this mode. |
- // See http://crbug.com/160576. |
- GURL site_gurl = SiteInstanceImpl::GetSiteForURL(NULL, gurl); |
- return origin_lock_ == site_gurl; |
- } |
- |
- void LockToOrigin(const GURL& gurl) { |
- origin_lock_ = gurl; |
- } |
- |
- bool has_web_ui_bindings() const { |
- return enabled_bindings_ & BINDINGS_POLICY_WEB_UI; |
- } |
- |
- bool can_read_raw_cookies() const { |
- return can_read_raw_cookies_; |
- } |
- |
- bool can_send_midi_sysex() const { |
- return can_send_midi_sysex_; |
- } |
- |
- 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; |
- typedef std::map<std::string, FilePermissionFlags> FileSystemMap; |
- typedef std::set<base::FilePath> FileSet; |
- |
- // Maps URL schemes to whether permission has been granted or revoked: |
- // |true| means the scheme has been granted. |
- // |false| means the scheme has been revoked. |
- // If a scheme is not present in the map, then it has never been granted |
- // 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_; |
- |
- // The set of files the child process is permitted to load. |
- FileSet request_file_set_; |
- |
- int enabled_bindings_; |
- |
- bool can_read_raw_cookies_; |
- |
- bool can_send_midi_sysex_; |
- |
- GURL origin_lock_; |
- |
- // The set of isolated filesystems the child process is permitted to access. |
- FileSystemMap filesystem_permissions_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SecurityState); |
-}; |
- |
-ChildProcessSecurityPolicyImpl::ChildProcessSecurityPolicyImpl() { |
- // We know about these schemes and believe them to be safe. |
- RegisterWebSafeScheme(url::kHttpScheme); |
- RegisterWebSafeScheme(url::kHttpsScheme); |
- RegisterWebSafeScheme(url::kFtpScheme); |
- RegisterWebSafeScheme(url::kDataScheme); |
- RegisterWebSafeScheme("feed"); |
- RegisterWebSafeScheme(url::kBlobScheme); |
- RegisterWebSafeScheme(url::kFileSystemScheme); |
- |
- // We know about the following pseudo schemes and treat them specially. |
- RegisterPseudoScheme(url::kAboutScheme); |
- RegisterPseudoScheme(url::kJavaScriptScheme); |
- RegisterPseudoScheme(kViewSourceScheme); |
-} |
- |
-ChildProcessSecurityPolicyImpl::~ChildProcessSecurityPolicyImpl() { |
- web_safe_schemes_.clear(); |
- pseudo_schemes_.clear(); |
- STLDeleteContainerPairSecondPointers(security_state_.begin(), |
- security_state_.end()); |
- security_state_.clear(); |
-} |
- |
-// static |
-ChildProcessSecurityPolicy* ChildProcessSecurityPolicy::GetInstance() { |
- return ChildProcessSecurityPolicyImpl::GetInstance(); |
-} |
- |
-ChildProcessSecurityPolicyImpl* ChildProcessSecurityPolicyImpl::GetInstance() { |
- return base::Singleton<ChildProcessSecurityPolicyImpl>::get(); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::Add(int child_id) { |
- base::AutoLock lock(lock_); |
- AddChild(child_id); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::AddWorker(int child_id, |
- int main_render_process_id) { |
- base::AutoLock lock(lock_); |
- AddChild(child_id); |
- worker_map_[child_id] = main_render_process_id; |
-} |
- |
-void ChildProcessSecurityPolicyImpl::Remove(int child_id) { |
- base::AutoLock lock(lock_); |
- SecurityStateMap::iterator it = security_state_.find(child_id); |
- if (it == security_state_.end()) |
- return; // May be called multiple times. |
- |
- delete it->second; |
- security_state_.erase(it); |
- worker_map_.erase(child_id); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::RegisterWebSafeScheme( |
- const std::string& scheme) { |
- base::AutoLock lock(lock_); |
- DCHECK_EQ(0U, web_safe_schemes_.count(scheme)) << "Add schemes at most once."; |
- DCHECK_EQ(0U, pseudo_schemes_.count(scheme)) |
- << "Web-safe implies not pseudo."; |
- |
- web_safe_schemes_.insert(scheme); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::IsWebSafeScheme( |
- const std::string& scheme) { |
- base::AutoLock lock(lock_); |
- |
- return ContainsKey(web_safe_schemes_, scheme); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::RegisterPseudoScheme( |
- const std::string& scheme) { |
- base::AutoLock lock(lock_); |
- DCHECK_EQ(0U, pseudo_schemes_.count(scheme)) << "Add schemes at most once."; |
- DCHECK_EQ(0U, web_safe_schemes_.count(scheme)) |
- << "Pseudo implies not web-safe."; |
- |
- pseudo_schemes_.insert(scheme); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::IsPseudoScheme( |
- const std::string& scheme) { |
- base::AutoLock lock(lock_); |
- |
- return ContainsKey(pseudo_schemes_, scheme); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantRequestURL( |
- int child_id, const GURL& url) { |
- |
- if (!url.is_valid()) |
- return; // Can't grant the capability to request invalid URLs. |
- |
- if (IsWebSafeScheme(url.scheme())) |
- return; // The scheme has already been whitelisted for every child process. |
- |
- if (IsPseudoScheme(url.scheme())) { |
- return; // Can't grant the capability to request pseudo schemes. |
- } |
- |
- { |
- base::AutoLock lock(lock_); |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return; |
- |
- // When the child process has been commanded to request this scheme, |
- // we grant it the capability to request all URLs of that scheme. |
- state->second->GrantScheme(url.scheme()); |
- } |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantRequestSpecificFileURL( |
- int child_id, |
- const GURL& url) { |
- if (!url.SchemeIs(url::kFileScheme)) |
- return; |
- |
- { |
- base::AutoLock lock(lock_); |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return; |
- |
- // When the child process has been commanded to request a file:// URL, |
- // then we grant it the capability for that URL only. |
- base::FilePath path; |
- if (net::FileURLToFilePath(url, &path)) |
- state->second->GrantRequestOfSpecificFile(path); |
- } |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantReadFile(int child_id, |
- const base::FilePath& file) { |
- GrantPermissionsForFile(child_id, file, READ_FILE_GRANT); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantCreateReadWriteFile( |
- int child_id, const base::FilePath& file) { |
- GrantPermissionsForFile(child_id, file, CREATE_READ_WRITE_FILE_GRANT); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantCopyInto(int child_id, |
- const base::FilePath& dir) { |
- GrantPermissionsForFile(child_id, dir, COPY_INTO_FILE_GRANT); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantDeleteFrom( |
- int child_id, const base::FilePath& dir) { |
- GrantPermissionsForFile(child_id, dir, DELETE_FILE_GRANT); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantPermissionsForFile( |
- int child_id, const base::FilePath& file, int permissions) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return; |
- |
- state->second->GrantPermissionsForFile(file, permissions); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::RevokeAllPermissionsForFile( |
- int child_id, const base::FilePath& file) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return; |
- |
- state->second->RevokeAllPermissionsForFile(file); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantReadFileSystem( |
- int child_id, const std::string& filesystem_id) { |
- GrantPermissionsForFileSystem(child_id, filesystem_id, READ_FILE_GRANT); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantWriteFileSystem( |
- int child_id, const std::string& filesystem_id) { |
- GrantPermissionsForFileSystem(child_id, filesystem_id, WRITE_FILE_GRANT); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantCreateFileForFileSystem( |
- int child_id, const std::string& filesystem_id) { |
- GrantPermissionsForFileSystem(child_id, filesystem_id, CREATE_NEW_FILE_GRANT); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantCreateReadWriteFileSystem( |
- int child_id, const std::string& filesystem_id) { |
- GrantPermissionsForFileSystem( |
- child_id, filesystem_id, CREATE_READ_WRITE_FILE_GRANT); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantCopyIntoFileSystem( |
- int child_id, const std::string& filesystem_id) { |
- GrantPermissionsForFileSystem(child_id, filesystem_id, COPY_INTO_FILE_GRANT); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantDeleteFromFileSystem( |
- int child_id, const std::string& filesystem_id) { |
- GrantPermissionsForFileSystem(child_id, filesystem_id, DELETE_FILE_GRANT); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantSendMidiSysExMessage(int child_id) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return; |
- |
- 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_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return; |
- |
- state->second->GrantScheme(scheme); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantWebUIBindings(int child_id) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return; |
- |
- state->second->GrantBindings(BINDINGS_POLICY_WEB_UI); |
- |
- // Web UI bindings need the ability to request chrome: URLs. |
- state->second->GrantScheme(kChromeUIScheme); |
- |
- // Web UI pages can contain links to file:// URLs. |
- state->second->GrantScheme(url::kFileScheme); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantReadRawCookies(int child_id) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return; |
- |
- state->second->GrantReadRawCookies(); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::RevokeReadRawCookies(int child_id) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return; |
- |
- state->second->RevokeReadRawCookies(); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanRequestURL( |
- int child_id, const GURL& url) { |
- if (!url.is_valid()) |
- return false; // Can't request invalid URLs. |
- |
- if (IsPseudoScheme(url.scheme())) { |
- // Every child process can request <about:blank>. |
- if (base::LowerCaseEqualsASCII(url.spec(), url::kAboutBlankURL)) |
- return true; |
- // URLs like <about:version>, <about:crash>, <view-source:...> shouldn't be |
- // requestable by any child process. Also, this case covers |
- // <javascript:...>, which should be handled internally by the process and |
- // not kicked up to the browser. |
- return false; |
- } |
- |
- // If the process can commit the URL, it can request it. |
- if (CanCommitURL(child_id, url)) |
- return true; |
- |
- // Also allow URLs destined for ShellExecute and not the browser itself. |
- return !GetContentClient()->browser()->IsHandledURL(url) && |
- !net::URLRequest::IsHandledURL(url); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanCommitURL(int child_id, |
- const GURL& url) { |
- if (!url.is_valid()) |
- return false; // Can't commit invalid URLs. |
- |
- // Of all the pseudo schemes, only about:blank is allowed to commit. |
- if (IsPseudoScheme(url.scheme())) |
- return base::LowerCaseEqualsASCII(url.spec(), url::kAboutBlankURL); |
- |
- // TODO(creis): Tighten this for Site Isolation, so that a URL from a site |
- // that is isolated can only be committed in a process dedicated to that site. |
- // CanRequestURL should still allow all web-safe schemes. See |
- // https://crbug.com/515309. |
- if (IsWebSafeScheme(url.scheme())) |
- return true; // The scheme has been white-listed for every child process. |
- |
- { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return false; |
- |
- // Otherwise, we consult the child process's security state to see if it is |
- // allowed to commit the URL. |
- return state->second->CanCommitURL(url); |
- } |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanReadFile(int child_id, |
- const base::FilePath& file) { |
- return HasPermissionsForFile(child_id, file, READ_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanReadAllFiles( |
- int child_id, |
- const std::vector<base::FilePath>& files) { |
- return std::all_of(files.begin(), files.end(), |
- [this, child_id](const base::FilePath& file) { |
- return CanReadFile(child_id, file); |
- }); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanCreateReadWriteFile( |
- int child_id, |
- const base::FilePath& file) { |
- return HasPermissionsForFile(child_id, file, CREATE_READ_WRITE_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanReadFileSystem( |
- int child_id, const std::string& filesystem_id) { |
- return HasPermissionsForFileSystem(child_id, filesystem_id, READ_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanReadWriteFileSystem( |
- int child_id, const std::string& filesystem_id) { |
- return HasPermissionsForFileSystem(child_id, filesystem_id, |
- READ_FILE_GRANT | WRITE_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanCopyIntoFileSystem( |
- int child_id, const std::string& filesystem_id) { |
- return HasPermissionsForFileSystem(child_id, filesystem_id, |
- COPY_INTO_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanDeleteFromFileSystem( |
- int child_id, const std::string& filesystem_id) { |
- return HasPermissionsForFileSystem(child_id, filesystem_id, |
- DELETE_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::HasPermissionsForFile( |
- int child_id, const base::FilePath& file, int permissions) { |
- base::AutoLock lock(lock_); |
- bool result = ChildProcessHasPermissionsForFile(child_id, file, permissions); |
- if (!result) { |
- // If this is a worker thread that has no access to a given file, |
- // let's check that its renderer process has access to that file instead. |
- WorkerToMainProcessMap::iterator iter = worker_map_.find(child_id); |
- if (iter != worker_map_.end() && iter->second != 0) { |
- result = ChildProcessHasPermissionsForFile(iter->second, |
- file, |
- permissions); |
- } |
- } |
- return result; |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::HasPermissionsForFileSystemFile( |
- int child_id, |
- const storage::FileSystemURL& url, |
- int permissions) { |
- if (!url.is_valid()) |
- return false; |
- |
- if (url.path().ReferencesParent()) |
- return false; |
- |
- // Any write access is disallowed on the root path. |
- if (storage::VirtualPath::IsRootPath(url.path()) && |
- (permissions & ~READ_FILE_GRANT)) { |
- return false; |
- } |
- |
- if (url.mount_type() == storage::kFileSystemTypeIsolated) { |
- // When Isolated filesystems is overlayed on top of another filesystem, |
- // its per-filesystem permission overrides the underlying filesystem |
- // permissions). |
- return HasPermissionsForFileSystem( |
- child_id, url.mount_filesystem_id(), permissions); |
- } |
- |
- FileSystemPermissionPolicyMap::iterator found = |
- file_system_policy_map_.find(url.type()); |
- if (found == file_system_policy_map_.end()) |
- return false; |
- |
- if ((found->second & storage::FILE_PERMISSION_READ_ONLY) && |
- permissions & ~READ_FILE_GRANT) { |
- return false; |
- } |
- |
- if (found->second & storage::FILE_PERMISSION_USE_FILE_PERMISSION) |
- return HasPermissionsForFile(child_id, url.path(), permissions); |
- |
- if (found->second & storage::FILE_PERMISSION_SANDBOX) |
- return true; |
- |
- return false; |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanReadFileSystemFile( |
- int child_id, |
- const storage::FileSystemURL& url) { |
- return HasPermissionsForFileSystemFile(child_id, url, READ_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanWriteFileSystemFile( |
- int child_id, |
- const storage::FileSystemURL& url) { |
- return HasPermissionsForFileSystemFile(child_id, url, WRITE_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanCreateFileSystemFile( |
- int child_id, |
- const storage::FileSystemURL& url) { |
- return HasPermissionsForFileSystemFile(child_id, url, CREATE_NEW_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanCreateReadWriteFileSystemFile( |
- int child_id, |
- const storage::FileSystemURL& url) { |
- return HasPermissionsForFileSystemFile(child_id, url, |
- CREATE_READ_WRITE_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanCopyIntoFileSystemFile( |
- int child_id, |
- const storage::FileSystemURL& url) { |
- return HasPermissionsForFileSystemFile(child_id, url, COPY_INTO_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanDeleteFileSystemFile( |
- int child_id, |
- const storage::FileSystemURL& url) { |
- return HasPermissionsForFileSystemFile(child_id, url, DELETE_FILE_GRANT); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::HasWebUIBindings(int child_id) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return false; |
- |
- return state->second->has_web_ui_bindings(); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanReadRawCookies(int child_id) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return false; |
- |
- return state->second->can_read_raw_cookies(); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::AddChild(int child_id) { |
- if (security_state_.count(child_id) != 0) { |
- NOTREACHED() << "Add child process at most once."; |
- return; |
- } |
- |
- security_state_[child_id] = new SecurityState(); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::ChildProcessHasPermissionsForFile( |
- int child_id, const base::FilePath& file, int permissions) { |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return false; |
- return state->second->HasPermissionsForFile(file, permissions); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanAccessDataForOrigin(int child_id, |
- const GURL& gurl) { |
- base::AutoLock lock(lock_); |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) { |
- // TODO(nick): Returning true instead of false here is a temporary |
- // workaround for https://crbug.com/600441 |
- return true; |
- } |
- return state->second->CanAccessDataForOrigin(gurl); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::LockToOrigin(int child_id, |
- const GURL& gurl) { |
- // "gurl" can be currently empty in some cases, such as file://blah. |
- DCHECK(SiteInstanceImpl::GetSiteForURL(NULL, gurl) == gurl); |
- base::AutoLock lock(lock_); |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- DCHECK(state != security_state_.end()); |
- state->second->LockToOrigin(gurl); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::GrantPermissionsForFileSystem( |
- int child_id, |
- const std::string& filesystem_id, |
- int permission) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return; |
- state->second->GrantPermissionsForFileSystem(filesystem_id, permission); |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::HasPermissionsForFileSystem( |
- int child_id, |
- const std::string& filesystem_id, |
- int permission) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return false; |
- return state->second->HasPermissionsForFileSystem(filesystem_id, permission); |
-} |
- |
-void ChildProcessSecurityPolicyImpl::RegisterFileSystemPermissionPolicy( |
- storage::FileSystemType type, |
- int policy) { |
- base::AutoLock lock(lock_); |
- file_system_policy_map_[type] = policy; |
-} |
- |
-bool ChildProcessSecurityPolicyImpl::CanSendMidiSysExMessage(int child_id) { |
- base::AutoLock lock(lock_); |
- |
- SecurityStateMap::iterator state = security_state_.find(child_id); |
- if (state == security_state_.end()) |
- return false; |
- |
- return state->second->can_send_midi_sysex(); |
-} |
- |
-} // namespace content |