• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/chromeos/plugin_selection_policy.h"
6 
7 #include <string>
8 #include <vector>
9 
10 #include "base/file_path.h"
11 #include "base/file_util.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_temp_dir.h"
14 #include "content/browser/browser_thread.h"
15 #include "googleurl/src/gurl.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "testing/platform_test.h"
18 
19 using std::string;
20 using std::vector;
21 
22 #if !defined(OS_CHROMEOS)
23 #error This file is meant to be compiled on ChromeOS only.
24 #endif
25 
26 namespace chromeos {
27 
28 const char kBasicPolicy[] = "# This is a basic policy\n"
29                             "plugin test.so\n"
30                             "allow foo.com\n"
31                             "deny bar.com\n";
32 
33 const char kNoPluginPolicy[] = "# This is a policy with missing plugin.\n"
34                                "# Missing plugin test.so\n"
35                                "allow foo.com\n"
36                                "deny bar.com\n";
37 const char kNoRulesPolicy[] = "# This is a policy with no rules\n"
38                               "plugin test.so\n";
39 
40 const char kEmptyPolicy[] = "# This is an empty policy\n";
41 
42 const char kGlobalPolicy[] = "# This is a test with global deny/allow\n"
43                              "plugin test.so\n"
44                              "deny\n"
45                              "plugin test1.so\n"
46                              "allow\n";
47 
48 const char kCommentTestPolicy[] = "# This is a policy with inline comments.\n"
49                                   "plugin test.so# like this\n"
50                                   "allow foo.com # and this\n"
51                                   "deny bar.com  # and this\n";
52 
53 const char kMultiPluginTestPolicy[] =
54     "# This is a policy with multiple plugins.\n"
55     "plugin allow_foo.so\n"
56     "allow foo.com\n"
57     "deny bar.com\n"
58     "plugin allow_baz_bim1.so\n"
59     "deny google.com\n"
60     "allow baz.com\n"
61     "allow bim.com\n"
62     "plugin allow_baz_bim2.so\n"
63     "deny google.com\n"
64     "allow baz.com\n"
65     "allow bim.com\n";
66 
67 const char kWhitespaceTestPolicy[] = "# This is a policy with odd whitespace.\n"
68                                      "  plugin\ttest.so# like this\n"
69                                      "\n\n \n   allow\t\tfoo.com # and this\n"
70                                      "\tdeny     bar.com\t\t\t# and this    \n";
71 
72 class PluginSelectionPolicyTest : public PlatformTest {
73  public:
PluginSelectionPolicyTest()74   PluginSelectionPolicyTest()
75       : loop_(MessageLoop::TYPE_DEFAULT),
76         file_thread_(BrowserThread::FILE, &loop_) {}
77 
SetUp()78   virtual void SetUp() {
79     PlatformTest::SetUp();
80     // Create a policy file to test with.
81     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
82   }
83 
84  protected:
CreatePolicy(const std::string & name,const std::string & contents,FilePath * path)85   bool CreatePolicy(const std::string& name,
86                     const std::string& contents,
87                     FilePath* path) {
88     FilePath policy_file = GetPolicyPath(name);
89     size_t bytes_written = file_util::WriteFile(policy_file,
90                                                 contents.c_str(),
91                                                 contents.size());
92     if (path)
93       *path = policy_file;
94 
95     return bytes_written == contents.size();
96   }
97 
GetPolicyPath(const std::string & name)98   FilePath GetPolicyPath(const std::string& name) {
99     FilePath policy_file(temp_dir_.path());
100     return policy_file.Append(FilePath(name));
101   }
102 
103  private:
104   ScopedTempDir temp_dir_;
105   MessageLoop loop_;
106   BrowserThread file_thread_;
107 };
108 
TEST_F(PluginSelectionPolicyTest,Basic)109 TEST_F(PluginSelectionPolicyTest, Basic) {
110   FilePath path;
111   ASSERT_TRUE(CreatePolicy("basic", kBasicPolicy, &path));
112   scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
113   EXPECT_TRUE(policy->InitFromFile(path));
114 }
115 
TEST_F(PluginSelectionPolicyTest,InitFromFile)116 TEST_F(PluginSelectionPolicyTest, InitFromFile) {
117   {
118     FilePath path;
119     ASSERT_TRUE(CreatePolicy("basic", kBasicPolicy, &path));
120     scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
121     EXPECT_TRUE(policy->InitFromFile(path));
122   }
123 
124   {
125     FilePath path;
126     ASSERT_TRUE(CreatePolicy("no_plugin", kNoPluginPolicy, &path));
127     scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
128     EXPECT_FALSE(policy->InitFromFile(path));
129   }
130 
131   {
132     FilePath path;
133     ASSERT_TRUE(CreatePolicy("no_rules", kNoRulesPolicy, &path));
134     scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
135     EXPECT_TRUE(policy->InitFromFile(path));
136   }
137 
138   {
139     FilePath path;
140     ASSERT_TRUE(CreatePolicy("empty", kEmptyPolicy, &path));
141     scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
142     EXPECT_TRUE(policy->InitFromFile(path));
143   }
144 
145   {
146     FilePath path;
147     ASSERT_TRUE(CreatePolicy("global", kGlobalPolicy, &path));
148     scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
149     EXPECT_TRUE(policy->InitFromFile(path));
150   }
151 
152   {
153     FilePath path;
154     ASSERT_TRUE(CreatePolicy("comment", kCommentTestPolicy, &path));
155     scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
156     EXPECT_TRUE(policy->InitFromFile(path));
157   }
158 
159   {
160     FilePath path;
161     ASSERT_TRUE(CreatePolicy("multi_plugin", kMultiPluginTestPolicy, &path));
162     scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
163     EXPECT_TRUE(policy->InitFromFile(path));
164   }
165 
166   {
167     FilePath path;
168     ASSERT_TRUE(CreatePolicy("whitespace", kWhitespaceTestPolicy, &path));
169     scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
170     EXPECT_TRUE(policy->InitFromFile(path));
171   }
172 }
173 
TEST_F(PluginSelectionPolicyTest,IsAllowed)174 TEST_F(PluginSelectionPolicyTest, IsAllowed) {
175   FilePath path;
176   ASSERT_TRUE(CreatePolicy("basic", kBasicPolicy, &path));
177 
178   scoped_refptr<PluginSelectionPolicy> policy1 = new PluginSelectionPolicy;
179   ASSERT_TRUE(policy1->InitFromFile(path));
180   EXPECT_TRUE(policy1->IsAllowed(GURL("http://www.foo.com/blah.html"),
181                                  FilePath("/usr/local/bin/test.so")));
182   EXPECT_FALSE(policy1->IsAllowed(GURL("http://www.bar.com/blah.html"),
183                                   FilePath("/usr/local/bin/test.so")));
184   EXPECT_FALSE(policy1->IsAllowed(GURL("http://www.baz.com/blah.html"),
185                                   FilePath("/usr/local/bin/test.so")));
186   EXPECT_TRUE(policy1->IsAllowed(GURL("http://www.baz.com/blah.html"),
187                                  FilePath("/usr/local/bin/real.so")));
188 
189   scoped_refptr<PluginSelectionPolicy> policy2 = new PluginSelectionPolicy;
190   ASSERT_TRUE(CreatePolicy("no_rules", kNoRulesPolicy, &path));
191   ASSERT_TRUE(policy2->InitFromFile(path));
192   EXPECT_FALSE(policy2->IsAllowed(GURL("http://www.foo.com/blah.html"),
193                                   FilePath("/usr/local/bin/test.so")));
194   EXPECT_FALSE(policy2->IsAllowed(GURL("http://www.bar.com/blah.html"),
195                                   FilePath("/usr/local/bin/test.so")));
196   EXPECT_FALSE(policy2->IsAllowed(GURL("http://www.baz.com/blah.html"),
197                                   FilePath("/usr/local/bin/test.so")));
198   EXPECT_TRUE(policy2->IsAllowed(GURL("http://www.baz.com/blah.html"),
199                                  FilePath("/usr/local/bin/real.so")));
200 
201   scoped_refptr<PluginSelectionPolicy> policy3 = new PluginSelectionPolicy;
202   ASSERT_TRUE(CreatePolicy("empty", kEmptyPolicy, &path));
203   ASSERT_TRUE(policy3->InitFromFile(path));
204   EXPECT_TRUE(policy3->IsAllowed(GURL("http://www.foo.com/blah.html"),
205                                  FilePath("/usr/local/bin/test.so")));
206   EXPECT_TRUE(policy3->IsAllowed(GURL("http://www.bar.com/blah.html"),
207                                  FilePath("/usr/local/bin/test.so")));
208   EXPECT_TRUE(policy3->IsAllowed(GURL("http://www.baz.com/blah.html"),
209                                  FilePath("/usr/local/bin/test.so")));
210   EXPECT_TRUE(policy3->IsAllowed(GURL("http://www.baz.com/blah.html"),
211                                  FilePath("/usr/local/bin/real.so")));
212 }
213 
TEST_F(PluginSelectionPolicyTest,MissingFile)214 TEST_F(PluginSelectionPolicyTest, MissingFile) {
215   // Don't create any policy file, just get the path to one.
216   FilePath path = GetPolicyPath("missing_file");
217   scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
218   ASSERT_FALSE(policy->InitFromFile(path));
219   EXPECT_TRUE(policy->IsAllowed(GURL("http://www.foo.com/blah.html"),
220                                 FilePath("/usr/local/bin/allow_foo.so")));
221   EXPECT_TRUE(policy->IsAllowed(GURL("http://www.bar.com/blah.html"),
222                                 FilePath("/usr/local/bin/allow_foo.so")));
223 }
224 
TEST_F(PluginSelectionPolicyTest,FindFirstAllowed)225 TEST_F(PluginSelectionPolicyTest, FindFirstAllowed) {
226   FilePath path;
227   ASSERT_TRUE(CreatePolicy("multi", kMultiPluginTestPolicy, &path));
228   scoped_refptr<PluginSelectionPolicy> policy = new PluginSelectionPolicy;
229   ASSERT_TRUE(policy->InitFromFile(path));
230   EXPECT_TRUE(policy->IsAllowed(GURL("http://www.foo.com/blah.html"),
231                                 FilePath("/usr/local/bin/allow_foo.so")));
232   EXPECT_FALSE(policy->IsAllowed(GURL("http://www.bar.com/blah.html"),
233                                  FilePath("/usr/local/bin/allow_foo.so")));
234   EXPECT_FALSE(policy->IsAllowed(GURL("http://www.baz.com/blah.html"),
235                                  FilePath("/usr/local/bin/allow_foo.so")));
236   EXPECT_FALSE(policy->IsAllowed(GURL("http://www.bim.com/blah.html"),
237                                  FilePath("/usr/local/bin/allow_foo.so")));
238   EXPECT_FALSE(policy->IsAllowed(GURL("http://www.foo.com/blah.html"),
239                                  FilePath("/usr/local/bin/allow_baz_bim1.so")));
240   EXPECT_FALSE(policy->IsAllowed(GURL("http://www.bar.com/blah.html"),
241                                  FilePath("/usr/local/bin/allow_baz_bim1.so")));
242   EXPECT_TRUE(policy->IsAllowed(GURL("http://www.baz.com/blah.html"),
243                                 FilePath("/usr/local/bin/allow_baz_bim1.so")));
244   EXPECT_TRUE(policy->IsAllowed(GURL("http://www.bim.com/blah.html"),
245                                 FilePath("/usr/local/bin/allow_baz_bim1.so")));
246   EXPECT_FALSE(policy->IsAllowed(GURL("http://www.google.com/blah.html"),
247                                  FilePath("/usr/local/bin/allow_baz_bim1.so")));
248   EXPECT_FALSE(policy->IsAllowed(GURL("http://www.foo.com/blah.html"),
249                                  FilePath("/usr/local/bin/allow_baz_bim2.so")));
250   EXPECT_FALSE(policy->IsAllowed(GURL("http://www.bar.com/blah.html"),
251                                  FilePath("/usr/local/bin/allow_baz_bim2.so")));
252   EXPECT_TRUE(policy->IsAllowed(GURL("http://www.baz.com/blah.html"),
253                                 FilePath("/usr/local/bin/allow_baz_bim2.so")));
254   EXPECT_TRUE(policy->IsAllowed(GURL("http://www.bim.com/blah.html"),
255                                 FilePath("/usr/local/bin/allow_baz_bim2.so")));
256   EXPECT_FALSE(policy->IsAllowed(GURL("http://www.google.com/blah.html"),
257                                  FilePath("/usr/local/bin/allow_baz_bim2.so")));
258   std::vector<webkit::npapi::WebPluginInfo> info_vector;
259   webkit::npapi::WebPluginInfo info;
260   // First we test that the one without any policy gets
261   // selected for all if it's first.
262   info.path = FilePath("/usr/local/bin/no_policy.so");
263   info_vector.push_back(info);
264   info.path = FilePath("/usr/local/bin/allow_foo.so");
265   info_vector.push_back(info);
266   info.path = FilePath("/usr/local/bin/allow_baz_bim1.so");
267   info_vector.push_back(info);
268   info.path = FilePath("/usr/local/bin/allow_baz_bim2.so");
269   info_vector.push_back(info);
270   EXPECT_EQ(0, policy->FindFirstAllowed(GURL("http://www.baz.com/blah.html"),
271                                         info_vector));
272   EXPECT_EQ(0, policy->FindFirstAllowed(GURL("http://www.foo.com/blah.html"),
273                                         info_vector));
274   EXPECT_EQ(0, policy->FindFirstAllowed(GURL("http://www.bling.com/blah.html"),
275                                         info_vector));
276   EXPECT_EQ(0, policy->FindFirstAllowed(GURL("http://www.google.com/blah.html"),
277                                         info_vector));
278 
279   // Now move the plugin without any policy to the end.
280   info_vector.clear();
281   info.path = FilePath("/usr/local/bin/allow_foo.so");
282   info_vector.push_back(info);
283   info.path = FilePath("/usr/local/bin/allow_baz_bim1.so");
284   info_vector.push_back(info);
285   info.path = FilePath("/usr/local/bin/allow_baz_bim2.so");
286   info_vector.push_back(info);
287   info.path = FilePath("/usr/local/bin/no_policy.so");
288   info_vector.push_back(info);
289   EXPECT_EQ(1, policy->FindFirstAllowed(GURL("http://www.baz.com/blah.html"),
290                                         info_vector));
291   EXPECT_EQ(0, policy->FindFirstAllowed(GURL("http://www.foo.com/blah.html"),
292                                         info_vector));
293   EXPECT_EQ(3, policy->FindFirstAllowed(GURL("http://www.bling.com/blah.html"),
294                                         info_vector));
295   EXPECT_EQ(3, policy->FindFirstAllowed(GURL("http://www.google.com/blah.html"),
296                                         info_vector));
297 }
298 
299 }  // namespace chromeos
300