15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_PLUGINS_CHROME_PLUGIN_SERVICE_FILTER_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_PLUGINS_CHROME_PLUGIN_SERVICE_FILTER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map> 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <set> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/containers/hash_tables.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/lock.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service_filter.h" 20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h" 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "url/gurl.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PluginPrefs; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content { 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class WebContents; 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class must be created (by calling the |GetInstance| method) on the UI 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// thread, but is safe to use on any thread after that. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromePluginServiceFilter : public content::PluginServiceFilter, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver { 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ChromePluginServiceFilter* GetInstance(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method should be called on the UI thread. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RegisterResourceContext(PluginPrefs* plugin_prefs, const void* context); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnregisterResourceContext(const void* context); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Overrides the plugin lookup mechanism for a given tab and object URL to use 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a specifc plugin. 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OverridePluginForFrame(int render_process_id, 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int render_frame_id, 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const GURL& url, 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const content::WebPluginInfo& plugin); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Restricts the given plugin to the given profile and origin of the given 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // URL. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void RestrictPluginToProfileAndOrigin(const base::FilePath& plugin_path, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Lifts a restriction on a plug-in. 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UnrestrictPlugin(const base::FilePath& plugin_path); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Authorizes a given plug-in for a given process. 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AuthorizePlugin(int render_process_id, 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& plugin_path); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Authorizes all plug-ins for a given WebContents. If |load_blocked| is true, 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // then the renderer is told to load the plugin with given |identifier| (or 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // pllugins if |identifier| is empty). 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This method can only be called on the UI thread. 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void AuthorizeAllPlugins(content::WebContents* web_contents, 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool load_blocked, 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& identifier); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Returns whether the plugin is found in restricted_plugins_. 718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool IsPluginRestricted(const base::FilePath& plugin_path); 728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // PluginServiceFilter implementation: 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsPluginAvailable( 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int render_process_id, 76a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int render_frame_id, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const void* context, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& policy_url, 80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content::WebPluginInfo* plugin) OVERRIDE; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CanLoadPlugin always grants permission to the browser 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // (render_process_id == 0) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CanLoadPlugin( 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int render_process_id, 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) OVERRIDE; 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend struct DefaultSingletonTraits<ChromePluginServiceFilter>; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct OverriddenPlugin { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OverriddenPlugin(); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~OverriddenPlugin(); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int render_frame_id; 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GURL url; // If empty, the override applies to all urls in render_frame. 97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content::WebPluginInfo plugin; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) struct ProcessDetails { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProcessDetails(); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~ProcessDetails(); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::vector<OverriddenPlugin> overridden_plugins; 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::set<base::FilePath> authorized_plugins; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ChromePluginServiceFilter(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ChromePluginServiceFilter(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver implementation: 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ProcessDetails* GetOrRegisterProcess(int render_process_id); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ProcessDetails* GetProcess(int render_process_id) const; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Lock lock_; // Guards access to member variables. 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Map of plugin paths to the origin they are restricted to. 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::pair<const void*, GURL> RestrictedPluginPair; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef base::hash_map<base::FilePath, 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RestrictedPluginPair> RestrictedPluginMap; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RestrictedPluginMap restricted_plugins_; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::map<const void*, scoped_refptr<PluginPrefs> > ResourceContextMap; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ResourceContextMap resource_context_map_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::map<int, ProcessDetails> plugin_details_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CHROME_BROWSER_PLUGINS_CHROME_PLUGIN_SERVICE_FILTER_H_ 134