Chromium Code Reviews| Index: content/browser/renderer_host/pepper/pepper_security_helper.cc |
| diff --git a/content/browser/renderer_host/pepper/pepper_security_helper.cc b/content/browser/renderer_host/pepper/pepper_security_helper.cc |
| index 5402823f01e56f68d815fc2a3bd1238e2518f07f..92939bbc9744500cc977957b859963a0e8c5c8c4 100644 |
| --- a/content/browser/renderer_host/pepper/pepper_security_helper.cc |
| +++ b/content/browser/renderer_host/pepper/pepper_security_helper.cc |
| @@ -8,10 +8,22 @@ |
| #include "content/browser/child_process_security_policy_impl.h" |
| #include "ppapi/c/ppb_file_io.h" |
| +#define CALL_MEMBER_FN(ptrToObject, ptrToMember) ((ptrToObject)->*(ptrToMember)) |
|
kinuko
2013/09/06 02:28:55
Hmm... do we need this indirection? It is in gene
tommycli
2013/09/07 00:28:22
Done.
|
| + |
| namespace content { |
| -bool CanOpenWithPepperFlags(int pp_open_flags, int child_id, |
| - const base::FilePath& file) { |
| +namespace { |
| + |
| +template <typename CanRead, typename CanWrite, |
| + typename CanCreate, typename CanCreateWrite, |
| + typename FileID> |
| +bool CanOpenFileWithPepperFlags(CanRead can_read, |
| + CanWrite can_write, |
| + CanCreate can_create, |
| + CanCreateWrite can_create_write, |
| + int pp_open_flags, |
| + int child_id, |
| + const FileID& file) { |
| ChildProcessSecurityPolicyImpl* policy = |
| ChildProcessSecurityPolicyImpl::GetInstance(); |
| @@ -22,33 +34,53 @@ bool CanOpenWithPepperFlags(int pp_open_flags, int child_id, |
| bool pp_exclusive = !!(pp_open_flags & PP_FILEOPENFLAG_EXCLUSIVE); |
| bool pp_append = !!(pp_open_flags & PP_FILEOPENFLAG_APPEND); |
| - if (pp_read && !policy->CanReadFile(child_id, file)) |
| + if (pp_read && !CALL_MEMBER_FN(policy, can_read)(child_id, file)) |
| return false; |
| - if (pp_write && !policy->CanWriteFile(child_id, file)) |
| + if (pp_write && !CALL_MEMBER_FN(policy, can_write)(child_id, file)) |
| return false; |
| - if (pp_append) { |
| - // Given ChildSecurityPolicyImpl's current definition of permissions, |
| - // APPEND is never supported. |
| + // TODO(tommycli): Maybe tighten up required permission. crbug.com/284792 |
| + if (pp_append && !CALL_MEMBER_FN(policy, can_create_write)(child_id, file)) |
| return false; |
| - } |
| if (pp_truncate && !pp_write) |
| return false; |
| if (pp_create) { |
| if (pp_exclusive) { |
| - return policy->CanCreateFile(child_id, file); |
| + return CALL_MEMBER_FN(policy, can_create)(child_id, file); |
| } else { |
| // Asks for too much, but this is the only grant that allows overwrite. |
| - return policy->CanCreateWriteFile(child_id, file); |
| + return CALL_MEMBER_FN(policy, can_create_write)(child_id, file); |
| } |
| } else if (pp_truncate) { |
| - return policy->CanCreateWriteFile(child_id, file); |
| + return CALL_MEMBER_FN(policy, can_create_write)(child_id, file); |
| } |
| return true; |
| } |
| +} |
| + |
| +bool CanOpenWithPepperFlags(int pp_open_flags, int child_id, |
| + const base::FilePath& file) { |
| + return CanOpenFileWithPepperFlags( |
| + &ChildProcessSecurityPolicyImpl::CanReadFile, |
| + &ChildProcessSecurityPolicyImpl::CanWriteFile, |
| + &ChildProcessSecurityPolicyImpl::CanCreateFile, |
| + &ChildProcessSecurityPolicyImpl::CanCreateWriteFile, |
| + pp_open_flags, child_id, file); |
| +} |
| + |
| +bool CanOpenFileSystemURLWithPepperFlags(int pp_open_flags, int child_id, |
| + const fileapi::FileSystemURL& url) { |
| + return CanOpenFileWithPepperFlags( |
| + &ChildProcessSecurityPolicyImpl::CanReadFileSystemFile, |
| + &ChildProcessSecurityPolicyImpl::CanWriteFileSystemFile, |
| + &ChildProcessSecurityPolicyImpl::CanCreateFileSystemFile, |
| + &ChildProcessSecurityPolicyImpl::CanCreateWriteFileSystemFile, |
| + pp_open_flags, child_id, url); |
| +} |
| + |
| } // namespace content |