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