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 6e5ef680a848a22c597e5e8a25fe8ab5dc098773..f33f33368db50c79e20b9e02d21891cf0a3dfbcc 100644 |
--- a/content/browser/child_process_security_policy_impl.cc |
+++ b/content/browser/child_process_security_policy_impl.cc |
@@ -135,6 +135,24 @@ class ChildProcessSecurityPolicyImpl::SecurityState { |
return (it->second & permissions) == permissions; |
} |
+#if defined(OS_ANDROID) |
+ // Grant certain permissions to a file. |
+ void GrantPermissionsForContentUrl(const GURL& content_url, |
+ int permissions) { |
+ content_url_permissions_[content_url] |= permissions; |
+ } |
+ |
+ bool HasPermissionsForContentUrl(const GURL& content_url, |
+ int permissions) { |
+ if (content_url_permissions_.find(content_url) == |
+ content_url_permissions_.end()) { |
+ return false; |
+ } |
+ return (content_url_permissions_[content_url] & permissions) == |
+ permissions; |
+ } |
+#endif |
+ |
void GrantBindings(int bindings) { |
enabled_bindings_ |= bindings; |
} |
@@ -258,6 +276,9 @@ class ChildProcessSecurityPolicyImpl::SecurityState { |
typedef std::map<base::FilePath, FilePermissionFlags> FileMap; |
typedef std::map<std::string, FilePermissionFlags> FileSystemMap; |
typedef std::set<base::FilePath> FileSet; |
+#if defined(OS_ANDROID) |
+ typedef std::map<GURL, FilePermissionFlags> ContentUrlMap; |
+#endif |
// Maps URL schemes to whether permission has been granted or revoked: |
// |true| means the scheme has been granted. |
@@ -283,6 +304,11 @@ class ChildProcessSecurityPolicyImpl::SecurityState { |
// The set of isolated filesystems the child process is permitted to access. |
FileSystemMap filesystem_permissions_; |
+#if defined(OS_ANDROID) |
+ // The set of content urls the child process is permited to upload to the web. |
+ ContentUrlMap content_url_permissions_; |
+#endif |
+ |
DISALLOW_COPY_AND_ASSIGN(SecurityState); |
}; |
@@ -643,6 +669,49 @@ bool ChildProcessSecurityPolicyImpl::CanDeleteFromFileSystem( |
DELETE_FILE_GRANT); |
} |
+#if defined(OS_ANDROID) |
+void ChildProcessSecurityPolicyImpl::GrantReadContentUrl( |
+ int child_id, const GURL& content_url) { |
+ GrantPermissionsForContentUrl(child_id, content_url, READ_FILE_GRANT); |
+} |
+ |
+bool ChildProcessSecurityPolicyImpl::CanReadContentUrl( |
+ int child_id, const GURL& content_url) { |
+ if (!content_url.SchemeIsContent()) |
+ return false; |
+ base::AutoLock lock(lock_); |
+ bool result = ChildProcessHasPermissionsForContentUrl( |
+ child_id, content_url, READ_FILE_GRANT); |
+ if (!result) { |
+ WorkerToMainProcessMap::iterator iter = worker_map_.find(child_id); |
+ if (iter != worker_map_.end() && iter->second != 0) { |
+ result = ChildProcessHasPermissionsForContentUrl(iter->second, |
+ content_url, |
+ READ_FILE_GRANT); |
+ } |
+ } |
+ return result; |
+} |
+ |
+void ChildProcessSecurityPolicyImpl::GrantPermissionsForContentUrl( |
+ int child_id, const GURL& content_url, int permissions) { |
+ base::AutoLock lock(lock_); |
+ |
+ SecurityStateMap::iterator state = security_state_.find(child_id); |
+ if (state == security_state_.end()) |
+ return; |
+ state->second->GrantPermissionsForContentUrl(content_url, READ_FILE_GRANT); |
+} |
+ |
+bool ChildProcessSecurityPolicyImpl::ChildProcessHasPermissionsForContentUrl( |
+ int child_id, const GURL& content_url, int permissions) { |
+ SecurityStateMap::iterator state = security_state_.find(child_id); |
+ if (state == security_state_.end()) |
+ return false; |
+ return state->second->HasPermissionsForContentUrl(content_url, permissions); |
+} |
+#endif |
+ |
bool ChildProcessSecurityPolicyImpl::HasPermissionsForFile( |
int child_id, const base::FilePath& file, int permissions) { |
base::AutoLock lock(lock_); |