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