Home | History | Annotate | Download | only in extensions
      1 // Copyright 2013 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 "base/prefs/pref_value_map.h"
      6 #include "chrome/browser/extensions/external_policy_loader.h"
      7 #include "chrome/browser/extensions/policy_handlers.h"
      8 #include "chrome/common/pref_names.h"
      9 #include "components/policy/core/browser/policy_error_map.h"
     10 #include "components/policy/core/common/policy_map.h"
     11 #include "policy/policy_constants.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 
     14 namespace extensions {
     15 
     16 const char kTestPref[] = "unit_test.test_pref";
     17 
     18 TEST(ExtensionListPolicyHandlerTest, CheckPolicySettings) {
     19   base::ListValue list;
     20   policy::PolicyMap policy_map;
     21   policy::PolicyErrorMap errors;
     22   ExtensionListPolicyHandler handler(
     23       policy::key::kExtensionInstallBlacklist, kTestPref, true);
     24 
     25   policy_map.Set(policy::key::kExtensionInstallBlacklist,
     26                  policy::POLICY_LEVEL_MANDATORY,
     27                  policy::POLICY_SCOPE_USER,
     28                  list.DeepCopy(),
     29                  NULL);
     30   errors.Clear();
     31   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
     32   EXPECT_TRUE(errors.empty());
     33 
     34   list.Append(Value::CreateStringValue("abcdefghijklmnopabcdefghijklmnop"));
     35   policy_map.Set(policy::key::kExtensionInstallBlacklist,
     36                  policy::POLICY_LEVEL_MANDATORY,
     37                  policy::POLICY_SCOPE_USER,
     38                  list.DeepCopy(),
     39                  NULL);
     40   errors.Clear();
     41   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
     42   EXPECT_TRUE(errors.empty());
     43 
     44   list.Append(Value::CreateStringValue("*"));
     45   policy_map.Set(policy::key::kExtensionInstallBlacklist,
     46                  policy::POLICY_LEVEL_MANDATORY,
     47                  policy::POLICY_SCOPE_USER,
     48                  list.DeepCopy(),
     49                  NULL);
     50   errors.Clear();
     51   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
     52   EXPECT_TRUE(errors.empty());
     53 
     54   list.Append(Value::CreateStringValue("invalid"));
     55   policy_map.Set(policy::key::kExtensionInstallBlacklist,
     56                  policy::POLICY_LEVEL_MANDATORY,
     57                  policy::POLICY_SCOPE_USER,
     58                  list.DeepCopy(),
     59                  NULL);
     60   errors.Clear();
     61   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
     62   EXPECT_FALSE(errors.empty());
     63   EXPECT_FALSE(
     64       errors.GetErrors(policy::key::kExtensionInstallBlacklist).empty());
     65 }
     66 
     67 TEST(ExtensionListPolicyHandlerTest, ApplyPolicySettings) {
     68   base::ListValue policy;
     69   base::ListValue expected;
     70   policy::PolicyMap policy_map;
     71   PrefValueMap prefs;
     72   base::Value* value = NULL;
     73   ExtensionListPolicyHandler handler(
     74       policy::key::kExtensionInstallBlacklist, kTestPref, false);
     75 
     76   policy.Append(Value::CreateStringValue("abcdefghijklmnopabcdefghijklmnop"));
     77   expected.Append(Value::CreateStringValue("abcdefghijklmnopabcdefghijklmnop"));
     78 
     79   policy_map.Set(policy::key::kExtensionInstallBlacklist,
     80                  policy::POLICY_LEVEL_MANDATORY,
     81                  policy::POLICY_SCOPE_USER,
     82                  policy.DeepCopy(),
     83                  NULL);
     84   handler.ApplyPolicySettings(policy_map, &prefs);
     85   EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
     86   EXPECT_TRUE(base::Value::Equals(&expected, value));
     87 
     88   policy.Append(Value::CreateStringValue("invalid"));
     89   policy_map.Set(policy::key::kExtensionInstallBlacklist,
     90                  policy::POLICY_LEVEL_MANDATORY,
     91                  policy::POLICY_SCOPE_USER,
     92                  policy.DeepCopy(),
     93                  NULL);
     94   handler.ApplyPolicySettings(policy_map, &prefs);
     95   EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
     96   EXPECT_TRUE(base::Value::Equals(&expected, value));
     97 }
     98 
     99 TEST(ExtensionInstallForcelistPolicyHandlerTest, CheckPolicySettings) {
    100   base::ListValue list;
    101   policy::PolicyMap policy_map;
    102   policy::PolicyErrorMap errors;
    103   ExtensionInstallForcelistPolicyHandler handler;
    104 
    105   policy_map.Set(policy::key::kExtensionInstallForcelist,
    106                  policy::POLICY_LEVEL_MANDATORY,
    107                  policy::POLICY_SCOPE_USER,
    108                  list.DeepCopy(),
    109                  NULL);
    110   errors.Clear();
    111   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
    112   EXPECT_TRUE(errors.empty());
    113 
    114   list.AppendString("abcdefghijklmnopabcdefghijklmnop;http://example.com");
    115   policy_map.Set(policy::key::kExtensionInstallForcelist,
    116                  policy::POLICY_LEVEL_MANDATORY,
    117                  policy::POLICY_SCOPE_USER,
    118                  list.DeepCopy(),
    119                  NULL);
    120   errors.Clear();
    121   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
    122   EXPECT_TRUE(errors.empty());
    123 
    124   // Add an erroneous entry. This should generate an error, but the good
    125   // entry should still be translated successfully.
    126   list.AppendString("adfasdf;http://example.com");
    127   policy_map.Set(policy::key::kExtensionInstallForcelist,
    128                  policy::POLICY_LEVEL_MANDATORY,
    129                  policy::POLICY_SCOPE_USER,
    130                  list.DeepCopy(),
    131                  NULL);
    132   errors.Clear();
    133   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
    134   EXPECT_EQ(1U, errors.size());
    135 
    136   // Add an entry with bad URL, which should generate another error.
    137   list.AppendString("abcdefghijklmnopabcdefghijklmnop;nourl");
    138   policy_map.Set(policy::key::kExtensionInstallForcelist,
    139                  policy::POLICY_LEVEL_MANDATORY,
    140                  policy::POLICY_SCOPE_USER,
    141                  list.DeepCopy(),
    142                  NULL);
    143   errors.Clear();
    144   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
    145   EXPECT_EQ(2U, errors.size());
    146 
    147   // Just an extension ID should also generate an error.
    148   list.AppendString("abcdefghijklmnopabcdefghijklmnop");
    149   policy_map.Set(policy::key::kExtensionInstallForcelist,
    150                  policy::POLICY_LEVEL_MANDATORY,
    151                  policy::POLICY_SCOPE_USER,
    152                  list.DeepCopy(),
    153                  NULL);
    154   errors.Clear();
    155   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
    156   EXPECT_EQ(3U, errors.size());
    157 }
    158 
    159 TEST(ExtensionInstallForcelistPolicyHandlerTest, ApplyPolicySettings) {
    160   base::ListValue policy;
    161   base::DictionaryValue expected;
    162   policy::PolicyMap policy_map;
    163   PrefValueMap prefs;
    164   base::Value* value = NULL;
    165   ExtensionInstallForcelistPolicyHandler handler;
    166 
    167   handler.ApplyPolicySettings(policy_map, &prefs);
    168   EXPECT_FALSE(prefs.GetValue(prefs::kExtensionInstallForceList, &value));
    169   EXPECT_FALSE(value);
    170 
    171   policy_map.Set(policy::key::kExtensionInstallForcelist,
    172                  policy::POLICY_LEVEL_MANDATORY,
    173                  policy::POLICY_SCOPE_USER,
    174                  policy.DeepCopy(),
    175                  NULL);
    176   handler.ApplyPolicySettings(policy_map, &prefs);
    177   EXPECT_TRUE(prefs.GetValue(prefs::kExtensionInstallForceList, &value));
    178   EXPECT_TRUE(base::Value::Equals(&expected, value));
    179 
    180   policy.AppendString("abcdefghijklmnopabcdefghijklmnop;http://example.com");
    181   extensions::ExternalPolicyLoader::AddExtension(
    182       &expected, "abcdefghijklmnopabcdefghijklmnop", "http://example.com");
    183   policy_map.Set(policy::key::kExtensionInstallForcelist,
    184                  policy::POLICY_LEVEL_MANDATORY,
    185                  policy::POLICY_SCOPE_USER,
    186                  policy.DeepCopy(),
    187                  NULL);
    188   handler.ApplyPolicySettings(policy_map, &prefs);
    189   EXPECT_TRUE(prefs.GetValue(prefs::kExtensionInstallForceList, &value));
    190   EXPECT_TRUE(base::Value::Equals(&expected, value));
    191 
    192   policy.AppendString("invalid");
    193   policy_map.Set(policy::key::kExtensionInstallForcelist,
    194                  policy::POLICY_LEVEL_MANDATORY,
    195                  policy::POLICY_SCOPE_USER,
    196                  policy.DeepCopy(),
    197                  NULL);
    198   handler.ApplyPolicySettings(policy_map, &prefs);
    199   EXPECT_TRUE(prefs.GetValue(prefs::kExtensionInstallForceList, &value));
    200   EXPECT_TRUE(base::Value::Equals(&expected, value));
    201 }
    202 
    203 TEST(ExtensionURLPatternListPolicyHandlerTest, CheckPolicySettings) {
    204   base::ListValue list;
    205   policy::PolicyMap policy_map;
    206   policy::PolicyErrorMap errors;
    207   ExtensionURLPatternListPolicyHandler handler(
    208       policy::key::kExtensionInstallSources, kTestPref);
    209 
    210   policy_map.Set(policy::key::kExtensionInstallSources,
    211                  policy::POLICY_LEVEL_MANDATORY,
    212                  policy::POLICY_SCOPE_USER,
    213                  list.DeepCopy(),
    214                  NULL);
    215   errors.Clear();
    216   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
    217   EXPECT_TRUE(errors.empty());
    218 
    219   list.Append(Value::CreateStringValue("http://*.google.com/*"));
    220   policy_map.Set(policy::key::kExtensionInstallSources,
    221                  policy::POLICY_LEVEL_MANDATORY,
    222                  policy::POLICY_SCOPE_USER,
    223                  list.DeepCopy(),
    224                  NULL);
    225   errors.Clear();
    226   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
    227   EXPECT_TRUE(errors.empty());
    228 
    229   list.Append(Value::CreateStringValue("<all_urls>"));
    230   policy_map.Set(policy::key::kExtensionInstallSources,
    231                  policy::POLICY_LEVEL_MANDATORY,
    232                  policy::POLICY_SCOPE_USER,
    233                  list.DeepCopy(),
    234                  NULL);
    235   errors.Clear();
    236   EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
    237   EXPECT_TRUE(errors.empty());
    238 
    239   list.Append(Value::CreateStringValue("invalid"));
    240   policy_map.Set(policy::key::kExtensionInstallSources,
    241                  policy::POLICY_LEVEL_MANDATORY,
    242                  policy::POLICY_SCOPE_USER,
    243                  list.DeepCopy(),
    244                  NULL);
    245   errors.Clear();
    246   EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
    247   EXPECT_FALSE(errors.empty());
    248   EXPECT_FALSE(errors.GetErrors(policy::key::kExtensionInstallSources).empty());
    249 
    250   // URLPattern syntax has a different way to express 'all urls'. Though '*'
    251   // would be compatible today, it would be brittle, so we disallow.
    252   list.Append(Value::CreateStringValue("*"));
    253   policy_map.Set(policy::key::kExtensionInstallSources,
    254                  policy::POLICY_LEVEL_MANDATORY,
    255                  policy::POLICY_SCOPE_USER,
    256                  list.DeepCopy(),
    257                  NULL);
    258   errors.Clear();
    259   EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
    260   EXPECT_FALSE(errors.empty());
    261   EXPECT_FALSE(errors.GetErrors(policy::key::kExtensionInstallSources).empty());
    262 }
    263 
    264 TEST(ExtensionURLPatternListPolicyHandlerTest, ApplyPolicySettings) {
    265   base::ListValue list;
    266   policy::PolicyMap policy_map;
    267   PrefValueMap prefs;
    268   base::Value* value = NULL;
    269   ExtensionURLPatternListPolicyHandler handler(
    270       policy::key::kExtensionInstallSources, kTestPref);
    271 
    272   list.Append(Value::CreateStringValue("https://corp.monkey.net/*"));
    273   policy_map.Set(policy::key::kExtensionInstallSources,
    274                  policy::POLICY_LEVEL_MANDATORY,
    275                  policy::POLICY_SCOPE_USER,
    276                  list.DeepCopy(),
    277                  NULL);
    278   handler.ApplyPolicySettings(policy_map, &prefs);
    279   ASSERT_TRUE(prefs.GetValue(kTestPref, &value));
    280   EXPECT_TRUE(base::Value::Equals(&list, value));
    281 }
    282 
    283 }  // namespace extensions
    284