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: 74 PluginSelectionPolicyTest() 75 : loop_(MessageLoop::TYPE_DEFAULT), 76 file_thread_(BrowserThread::FILE, &loop_) {} 77 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: 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 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 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 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 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 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 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