Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(671)

Unified Diff: chrome/browser/chromeos/plugin_selection_policy.cc

Issue 3717005: This adds a plugin selection policy for selecting allowed plugins (Closed)
Patch Set: fix win build Created 10 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/chromeos/plugin_selection_policy.cc
diff --git a/chrome/browser/chromeos/plugin_selection_policy.cc b/chrome/browser/chromeos/plugin_selection_policy.cc
new file mode 100644
index 0000000000000000000000000000000000000000..de55d92e5788bb27e56f6aa5db8365395bc8c24a
--- /dev/null
+++ b/chrome/browser/chromeos/plugin_selection_policy.cc
@@ -0,0 +1,163 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/chromeos/plugin_selection_policy.h"
+
+#include <algorithm>
+#include <iostream>
+#include <map>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "base/file_path.h"
+#include "base/file_util.h"
+#include "base/logging.h"
+#include "base/string_util.h"
+#include "chrome/browser/browser_thread.h"
+#include "googleurl/src/gurl.h"
+
+#if !defined(OS_CHROMEOS)
+#error This file is meant to be compiled on ChromeOS only.
+#endif
+
+using std::vector;
+using std::string;
+using std::pair;
+using std::map;
+
+namespace chromeos {
+
+static const char kPluginSelectionPolicyFile[] =
+ "/usr/share/chromeos-assets/flash/plugin_policy";
+
+PluginSelectionPolicy::PluginSelectionPolicy() : initialized_(false) {
+}
+
+void PluginSelectionPolicy::StartInit() {
+ // Initialize the policy on the FILE thread, since it reads from a
+ // policy file.
+ BrowserThread::PostTask(
+ BrowserThread::FILE, FROM_HERE,
+ NewRunnableMethod(this, &chromeos::PluginSelectionPolicy::Init));
+}
+
+bool PluginSelectionPolicy::Init() {
+ return InitFromFile(FilePath(kPluginSelectionPolicyFile));
+}
+
+bool PluginSelectionPolicy::InitFromFile(const FilePath& policy_file) {
+ // This must always be called from the FILE thread.
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+
+ string data;
+ // This should be a really small file, so we're OK with just
+ // slurping it.
+ if (!file_util::ReadFileToString(policy_file, &data)) {
+ LOG(ERROR) << "Unable to read plugin policy file \""
+ << policy_file.value() << "\".";
+ return false;
+ }
+
+ std::istringstream input_stream(data);
+ string line;
+ map<string, Policy> policies;
+ Policy policy;
+ string last_plugin;
+
+ while (std::getline(input_stream, line)) {
+ // Strip comments.
+ string::size_type pos = line.find("#");
+ if (pos != string::npos) {
+ line = line.substr(0, pos);
+ }
+ TrimWhitespaceASCII(line, TRIM_ALL, &line);
+ if (line.find("allow") == 0) {
+ // Has to be preceeded by a "plugin" statement.
+ if (last_plugin.empty()) {
+ LOG(ERROR) << "Plugin policy file error: 'allow' out of context.";
+ return false;
+ }
+ line = line.substr(6);
+ TrimWhitespaceASCII(line, TRIM_ALL, &line);
+ line = StringToLowerASCII(line);
+ policy.push_back(make_pair(true, line));
+ }
+ if (line.find("deny") == 0) {
+ // Has to be preceeded by a "plugin" statement.
+ if (last_plugin.empty()) {
+ LOG(ERROR) << "Plugin policy file error: 'deny' out of context.";
+ return false;
+ }
+ line = line.substr(5);
+ TrimWhitespaceASCII(line, TRIM_ALL, &line);
+ line = StringToLowerASCII(line);
+ policy.push_back(make_pair(false, line));
+ }
+ if (line.find("plugin") == 0) {
+ line = line.substr(7);
+ TrimWhitespaceASCII(line, TRIM_ALL, &line);
+ if (!policy.empty() && !last_plugin.empty())
+ policies.insert(make_pair(last_plugin, policy));
+ last_plugin = line;
+ policy.clear();
+ }
+ }
+
+ if (!last_plugin.empty())
+ policies.insert(make_pair(last_plugin, policy));
+
+ policies_.swap(policies);
+ initialized_ = true;
+ return true;
+}
+
+int PluginSelectionPolicy::FindFirstAllowed(
+ const GURL& url,
+ const std::vector<WebPluginInfo>& info) {
+ for (std::vector<WebPluginInfo>::size_type i = 0; i < info.size(); ++i) {
+ if (IsAllowed(url, info[i].path))
+ return i;
+ }
+ return -1;
+}
+
+bool PluginSelectionPolicy::IsAllowed(const GURL& url,
+ const FilePath& path) {
+ // This must always be called from the FILE thread, to be sure
+ // initialization doesn't happen at the same time.
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
+
+ // Make sure that we notice if this starts being called before
+ // initialization is complete. Right now it is guaranteed only by
+ // the startup order and the fact that InitFromFile runs on the FILE
+ // thread too.
+ DCHECK(initialized_) << "Tried to check policy before policy is initialized.";
+
+ string name = path.BaseName().value();
+
+ PolicyMap::iterator policy_iter = policies_.find(name);
+ if (policy_iter != policies_.end()) {
+ Policy& policy(policy_iter->second);
+
+ // We deny by default. (equivalent to "deny" at the top of the section)
+ bool allow = false;
+
+ for (Policy::iterator iter = policy.begin(); iter != policy.end(); ++iter) {
+ bool policy_allow = iter->first;
+ string& policy_domain = iter->second;
+ if (policy_domain.empty() || url.DomainIs(policy_domain.c_str(),
+ policy_domain.size())) {
+ allow = policy_allow;
+ }
+ }
+ return allow;
+ }
+
+ // If it's not in the policy file, then we assume it's OK to allow
+ // it.
+ return true;
+}
+
+} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698