Index: ppapi/proxy/interface_list.cc |
diff --git a/ppapi/proxy/interface_list.cc b/ppapi/proxy/interface_list.cc |
index 99b846f14629e6f2db9ae1c2079bf89fb1b318ad..5d94635e9bb4a72fc8d8fb52b124e74605073a8a 100644 |
--- a/ppapi/proxy/interface_list.cc |
+++ b/ppapi/proxy/interface_list.cc |
@@ -4,6 +4,7 @@ |
#include "ppapi/proxy/interface_list.h" |
+#include "base/lazy_instance.h" |
#include "base/memory/singleton.h" |
#include "ppapi/c/dev/ppb_audio_input_dev.h" |
#include "ppapi/c/dev/ppb_buffer_dev.h" |
@@ -157,6 +158,8 @@ InterfaceProxy* ProxyFactory(Dispatcher* dispatcher) { |
return new ProxyClass(dispatcher); |
} |
+base::LazyInstance<PpapiPermissions> g_process_global_permissions; |
+ |
} // namespace |
InterfaceList::InterfaceList() { |
@@ -168,19 +171,34 @@ InterfaceList::InterfaceList() { |
AddProxy(PROXY_API_ID(api_name), &PROXY_FACTORY_NAME(api_name)); |
// Register each proxied interface by calling AddPPB for each supported |
- // interface. |
+ // interface. Set current_required_permission to the appropriate value for |
+ // the value you want expanded by this macro. |
#define PROXIED_IFACE(api_name, iface_str, iface_struct) \ |
AddPPB(iface_str, PROXY_API_ID(api_name), \ |
- INTERFACE_THUNK_NAME(iface_struct)()); |
+ INTERFACE_THUNK_NAME(iface_struct)(), \ |
+ current_required_permission); |
+ |
+ { |
+ Permission current_required_permission = PERMISSION_NONE; |
+ #include "ppapi/thunk/interfaces_ppb_public_stable.h" |
+ } |
- #include "ppapi/thunk/interfaces_ppb_public_stable.h" |
#if !defined(OS_NACL) |
- #include "ppapi/thunk/interfaces_ppb_public_dev.h" |
- #include "ppapi/thunk/interfaces_ppb_private.h" |
+ { |
+ Permission current_required_permission = PERMISSION_DEV; |
+ #include "ppapi/thunk/interfaces_ppb_public_dev.h" |
+ } |
+ { |
+ Permission current_required_permission = PERMISSION_PRIVATE; |
+ #include "ppapi/thunk/interfaces_ppb_private.h" |
+ } |
#endif |
#if !defined(OS_NACL) |
- #include "ppapi/thunk/interfaces_ppb_private_flash.h" |
+ { |
+ Permission current_required_permission = PERMISSION_FLASH; |
+ #include "ppapi/thunk/interfaces_ppb_private_flash.h" |
+ } |
#endif |
#undef PROXIED_API |
@@ -193,44 +211,48 @@ InterfaceList::InterfaceList() { |
AddProxy(API_ID_RESOURCE_CREATION, &ResourceCreationProxy::Create); |
AddProxy(API_ID_PPP_CLASS, &PPP_Class_Proxy::Create); |
AddPPB(PPB_CORE_INTERFACE_1_0, API_ID_PPB_CORE, |
- PPB_Core_Proxy::GetPPB_Core_Interface()); |
+ PPB_Core_Proxy::GetPPB_Core_Interface(), PERMISSION_NONE); |
AddPPB(PPB_MESSAGELOOP_DEV_INTERFACE_0_1, API_ID_NONE, |
- PPB_MessageLoop_Proxy::GetInterface()); |
+ PPB_MessageLoop_Proxy::GetInterface(), PERMISSION_DEV); |
AddPPB(PPB_OPENGLES2_INTERFACE_1_0, API_ID_NONE, |
- PPB_OpenGLES2_Shared::GetInterface()); |
+ PPB_OpenGLES2_Shared::GetInterface(), PERMISSION_NONE); |
AddPPB(PPB_OPENGLES2_INSTANCEDARRAYS_INTERFACE_1_0, API_ID_NONE, |
- PPB_OpenGLES2_Shared::GetInstancedArraysInterface()); |
+ PPB_OpenGLES2_Shared::GetInstancedArraysInterface(), PERMISSION_NONE); |
AddPPB(PPB_OPENGLES2_FRAMEBUFFERBLIT_INTERFACE_1_0, API_ID_NONE, |
- PPB_OpenGLES2_Shared::GetFramebufferBlitInterface()); |
+ PPB_OpenGLES2_Shared::GetFramebufferBlitInterface(), PERMISSION_NONE); |
AddPPB(PPB_OPENGLES2_FRAMEBUFFERMULTISAMPLE_INTERFACE_1_0, API_ID_NONE, |
- PPB_OpenGLES2_Shared::GetFramebufferMultisampleInterface()); |
+ PPB_OpenGLES2_Shared::GetFramebufferMultisampleInterface(), |
+ PERMISSION_NONE); |
AddPPB(PPB_OPENGLES2_CHROMIUMENABLEFEATURE_INTERFACE_1_0, API_ID_NONE, |
- PPB_OpenGLES2_Shared::GetChromiumEnableFeatureInterface()); |
+ PPB_OpenGLES2_Shared::GetChromiumEnableFeatureInterface(), |
+ PERMISSION_NONE); |
AddPPB(PPB_OPENGLES2_CHROMIUMMAPSUB_INTERFACE_1_0, API_ID_NONE, |
- PPB_OpenGLES2_Shared::GetChromiumMapSubInterface()); |
+ PPB_OpenGLES2_Shared::GetChromiumMapSubInterface(), PERMISSION_NONE); |
AddPPB(PPB_OPENGLES2_CHROMIUMMAPSUB_DEV_INTERFACE_1_0, API_ID_NONE, |
- PPB_OpenGLES2_Shared::GetChromiumMapSubInterface()); |
+ PPB_OpenGLES2_Shared::GetChromiumMapSubInterface(), PERMISSION_NONE); |
AddPPB(PPB_OPENGLES2_QUERY_INTERFACE_1_0, API_ID_NONE, |
- PPB_OpenGLES2_Shared::GetQueryInterface()); |
+ PPB_OpenGLES2_Shared::GetQueryInterface(), PERMISSION_NONE); |
#if !defined(OS_NACL) |
AddPPB(PPB_FLASH_PRINT_INTERFACE_1_0, API_ID_PPB_FLASH, |
- PPB_Flash_Proxy::GetFlashPrintInterface()); |
+ PPB_Flash_Proxy::GetFlashPrintInterface(), |
+ PERMISSION_FLASH); |
#endif |
AddPPB(PPB_VAR_ARRAY_BUFFER_INTERFACE_1_0, API_ID_NONE, |
- PPB_Var_Shared::GetVarArrayBufferInterface1_0()); |
+ PPB_Var_Shared::GetVarArrayBufferInterface1_0(), |
+ PERMISSION_DEV); |
AddPPB(PPB_VAR_INTERFACE_1_1, API_ID_NONE, |
- PPB_Var_Shared::GetVarInterface1_1()); |
+ PPB_Var_Shared::GetVarInterface1_1(), PERMISSION_NONE); |
AddPPB(PPB_VAR_INTERFACE_1_0, API_ID_NONE, |
- PPB_Var_Shared::GetVarInterface1_0()); |
+ PPB_Var_Shared::GetVarInterface1_0(), PERMISSION_NONE); |
#if !defined(OS_NACL) |
// PPB (browser) interfaces. |
// Do not add more stuff here, they should be added to interface_list*.h |
// TODO(brettw) remove these. |
- AddPPB(PPB_Instance_Proxy::GetInfoPrivate()); |
- AddPPB(PPB_PDF_Proxy::GetInfo()); |
- AddPPB(PPB_URLLoader_Proxy::GetTrustedInfo()); |
- AddPPB(PPB_Var_Deprecated_Proxy::GetInfo()); |
+ AddPPB(PPB_Instance_Proxy::GetInfoPrivate(), PERMISSION_PRIVATE); |
+ AddPPB(PPB_PDF_Proxy::GetInfo(), PERMISSION_PRIVATE); |
+ AddPPB(PPB_URLLoader_Proxy::GetTrustedInfo(), PERMISSION_PRIVATE); |
+ AddPPB(PPB_Var_Deprecated_Proxy::GetInfo(), PERMISSION_DEV); |
// TODO(tomfinegan): Figure out where to put these once we refactor things |
// to load the PPP interface struct from the PPB interface. |
@@ -240,7 +262,7 @@ InterfaceList::InterfaceList() { |
API_ID_PPP_CONTENT_DECRYPTOR_PRIVATE, |
PPP_ContentDecryptor_Private_Proxy::GetProxyInterface()); |
#endif |
- AddPPB(PPB_Testing_Proxy::GetInfo()); |
+ AddPPB(PPB_Testing_Proxy::GetInfo(), PERMISSION_TESTING); |
// PPP (plugin) interfaces. |
// TODO(brettw) move these to interface_list*.h |
@@ -276,6 +298,12 @@ InterfaceList* InterfaceList::GetInstance() { |
return Singleton<InterfaceList>::get(); |
} |
+// static |
+void InterfaceList::SetProcessGlobalPermissions( |
+ const PpapiPermissions& permissions) { |
+ g_process_global_permissions.Get() = permissions; |
+} |
+ |
ApiID InterfaceList::GetIDForPPBInterface(const std::string& name) const { |
NameToInterfaceInfoMap::const_iterator found = |
name_to_browser_info_.find(name); |
@@ -305,7 +333,11 @@ const void* InterfaceList::GetInterfaceForPPB(const std::string& name) const { |
name_to_browser_info_.find(name); |
if (found == name_to_browser_info_.end()) |
return NULL; |
- return found->second.iface; |
+ |
+ if (g_process_global_permissions.Get().HasPermission( |
+ found->second.required_permission)) |
+ return found->second.iface; |
+ return NULL; |
} |
const void* InterfaceList::GetInterfaceForPPP(const std::string& name) const { |
@@ -334,21 +366,22 @@ void InterfaceList::AddProxy(ApiID id, |
void InterfaceList::AddPPB(const char* name, |
ApiID id, |
- const void* iface) { |
+ const void* iface, |
+ Permission perm) { |
DCHECK(name_to_browser_info_.find(name) == name_to_browser_info_.end()); |
- name_to_browser_info_[name] = InterfaceInfo(id, iface); |
+ name_to_browser_info_[name] = InterfaceInfo(id, iface, perm); |
} |
void InterfaceList::AddPPP(const char* name, |
ApiID id, |
const void* iface) { |
DCHECK(name_to_plugin_info_.find(name) == name_to_plugin_info_.end()); |
- name_to_plugin_info_[name] = InterfaceInfo(id, iface); |
+ name_to_plugin_info_[name] = InterfaceInfo(id, iface, PERMISSION_NONE); |
} |
-void InterfaceList::AddPPB(const InterfaceProxy::Info* info) { |
+void InterfaceList::AddPPB(const InterfaceProxy::Info* info, Permission perm) { |
AddProxy(info->id, info->create_proxy); |
- AddPPB(info->name, info->id, info->interface_ptr); |
+ AddPPB(info->name, info->id, info->interface_ptr, perm); |
} |
void InterfaceList::AddPPP(const InterfaceProxy::Info* info) { |