| OLD | NEW | 
|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "components/policy/core/common/policy_loader_win.h" | 5 #include "components/policy/core/common/policy_loader_win.h" | 
| 6 | 6 | 
| 7 #include <windows.h> | 7 #include <windows.h> | 
| 8 #include <stddef.h> | 8 #include <stddef.h> | 
| 9 #include <stdint.h> | 9 #include <stdint.h> | 
| 10 #include <userenv.h> | 10 #include <userenv.h> | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 65 // are stored as strings), and can only be retrieved if a corresponding schema | 65 // are stored as strings), and can only be retrieved if a corresponding schema | 
| 66 // is written. | 66 // is written. | 
| 67 bool InstallValue(const base::Value& value, | 67 bool InstallValue(const base::Value& value, | 
| 68                   HKEY hive, | 68                   HKEY hive, | 
| 69                   const base::string16& path, | 69                   const base::string16& path, | 
| 70                   const base::string16& name) { | 70                   const base::string16& name) { | 
| 71   // KEY_ALL_ACCESS causes the ctor to create the key if it does not exist yet. | 71   // KEY_ALL_ACCESS causes the ctor to create the key if it does not exist yet. | 
| 72   RegKey key(hive, path.c_str(), KEY_ALL_ACCESS); | 72   RegKey key(hive, path.c_str(), KEY_ALL_ACCESS); | 
| 73   EXPECT_TRUE(key.Valid()); | 73   EXPECT_TRUE(key.Valid()); | 
| 74   switch (value.GetType()) { | 74   switch (value.GetType()) { | 
| 75     case base::Value::TYPE_NULL: | 75     case base::Value::Type::NONE: | 
| 76       return key.WriteValue(name.c_str(), L"") == ERROR_SUCCESS; | 76       return key.WriteValue(name.c_str(), L"") == ERROR_SUCCESS; | 
| 77 | 77 | 
| 78     case base::Value::TYPE_BOOLEAN: { | 78     case base::Value::Type::BOOLEAN: { | 
| 79       bool bool_value; | 79       bool bool_value; | 
| 80       if (!value.GetAsBoolean(&bool_value)) | 80       if (!value.GetAsBoolean(&bool_value)) | 
| 81         return false; | 81         return false; | 
| 82       return key.WriteValue(name.c_str(), bool_value ? 1 : 0) == ERROR_SUCCESS; | 82       return key.WriteValue(name.c_str(), bool_value ? 1 : 0) == ERROR_SUCCESS; | 
| 83     } | 83     } | 
| 84 | 84 | 
| 85     case base::Value::TYPE_INTEGER: { | 85     case base::Value::Type::INTEGER: { | 
| 86       int int_value; | 86       int int_value; | 
| 87       if (!value.GetAsInteger(&int_value)) | 87       if (!value.GetAsInteger(&int_value)) | 
| 88         return false; | 88         return false; | 
| 89       return key.WriteValue(name.c_str(), int_value) == ERROR_SUCCESS; | 89       return key.WriteValue(name.c_str(), int_value) == ERROR_SUCCESS; | 
| 90     } | 90     } | 
| 91 | 91 | 
| 92     case base::Value::TYPE_DOUBLE: { | 92     case base::Value::Type::DOUBLE: { | 
| 93       double double_value; | 93       double double_value; | 
| 94       if (!value.GetAsDouble(&double_value)) | 94       if (!value.GetAsDouble(&double_value)) | 
| 95         return false; | 95         return false; | 
| 96       base::string16 str_value = | 96       base::string16 str_value = | 
| 97           UTF8ToUTF16(base::DoubleToString(double_value)); | 97           UTF8ToUTF16(base::DoubleToString(double_value)); | 
| 98       return key.WriteValue(name.c_str(), str_value.c_str()) == ERROR_SUCCESS; | 98       return key.WriteValue(name.c_str(), str_value.c_str()) == ERROR_SUCCESS; | 
| 99     } | 99     } | 
| 100 | 100 | 
| 101     case base::Value::TYPE_STRING: { | 101     case base::Value::Type::STRING: { | 
| 102       base::string16 str_value; | 102       base::string16 str_value; | 
| 103       if (!value.GetAsString(&str_value)) | 103       if (!value.GetAsString(&str_value)) | 
| 104         return false; | 104         return false; | 
| 105       return key.WriteValue(name.c_str(), str_value.c_str()) == ERROR_SUCCESS; | 105       return key.WriteValue(name.c_str(), str_value.c_str()) == ERROR_SUCCESS; | 
| 106     } | 106     } | 
| 107 | 107 | 
| 108     case base::Value::TYPE_DICTIONARY: { | 108     case base::Value::Type::DICTIONARY: { | 
| 109       const base::DictionaryValue* sub_dict = NULL; | 109       const base::DictionaryValue* sub_dict = NULL; | 
| 110       if (!value.GetAsDictionary(&sub_dict)) | 110       if (!value.GetAsDictionary(&sub_dict)) | 
| 111         return false; | 111         return false; | 
| 112       for (base::DictionaryValue::Iterator it(*sub_dict); | 112       for (base::DictionaryValue::Iterator it(*sub_dict); | 
| 113            !it.IsAtEnd(); it.Advance()) { | 113            !it.IsAtEnd(); it.Advance()) { | 
| 114         if (!InstallValue(it.value(), hive, path + kPathSep + name, | 114         if (!InstallValue(it.value(), hive, path + kPathSep + name, | 
| 115                           UTF8ToUTF16(it.key()))) { | 115                           UTF8ToUTF16(it.key()))) { | 
| 116           return false; | 116           return false; | 
| 117         } | 117         } | 
| 118       } | 118       } | 
| 119       return true; | 119       return true; | 
| 120     } | 120     } | 
| 121 | 121 | 
| 122     case base::Value::TYPE_LIST: { | 122     case base::Value::Type::LIST: { | 
| 123       const base::ListValue* list = NULL; | 123       const base::ListValue* list = NULL; | 
| 124       if (!value.GetAsList(&list)) | 124       if (!value.GetAsList(&list)) | 
| 125         return false; | 125         return false; | 
| 126       for (size_t i = 0; i < list->GetSize(); ++i) { | 126       for (size_t i = 0; i < list->GetSize(); ++i) { | 
| 127         const base::Value* item; | 127         const base::Value* item; | 
| 128         if (!list->Get(i, &item)) | 128         if (!list->Get(i, &item)) | 
| 129           return false; | 129           return false; | 
| 130         if (!InstallValue(*item, hive, path + kPathSep + name, | 130         if (!InstallValue(*item, hive, path + kPathSep + name, | 
| 131                           base::UintToString16(i + 1))) { | 131                           base::UintToString16(i + 1))) { | 
| 132           return false; | 132           return false; | 
| 133         } | 133         } | 
| 134       } | 134       } | 
| 135       return true; | 135       return true; | 
| 136     } | 136     } | 
| 137 | 137 | 
| 138     case base::Value::TYPE_BINARY: | 138     case base::Value::Type::BINARY: | 
| 139       return false; | 139       return false; | 
| 140   } | 140   } | 
| 141   NOTREACHED(); | 141   NOTREACHED(); | 
| 142   return false; | 142   return false; | 
| 143 } | 143 } | 
| 144 | 144 | 
| 145 // This class provides sandboxing and mocking for the parts of the Windows | 145 // This class provides sandboxing and mocking for the parts of the Windows | 
| 146 // Registry implementing Group Policy. It prepares two temporary sandbox keys, | 146 // Registry implementing Group Policy. It prepares two temporary sandbox keys, | 
| 147 // one for HKLM and one for HKCU. A test's calls to the registry are redirected | 147 // one for HKLM and one for HKCU. A test's calls to the registry are redirected | 
| 148 // by Windows to these sandboxes, allowing the tests to manipulate and access | 148 // by Windows to these sandboxes, allowing the tests to manipulate and access | 
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 617   data.push_back(base::ByteSwapToLE16(L'\0')); | 617   data.push_back(base::ByteSwapToLE16(L'\0')); | 
| 618 | 618 | 
| 619   AppendRecordToPRegFile(path, key, REG_SZ, data.size() * sizeof(base::char16), | 619   AppendRecordToPRegFile(path, key, REG_SZ, data.size() * sizeof(base::char16), | 
| 620                          reinterpret_cast<uint8_t*>(data.data())); | 620                          reinterpret_cast<uint8_t*>(data.data())); | 
| 621 } | 621 } | 
| 622 | 622 | 
| 623 void PRegTestHarness::AppendPolicyToPRegFile(const base::string16& path, | 623 void PRegTestHarness::AppendPolicyToPRegFile(const base::string16& path, | 
| 624                                              const std::string& key, | 624                                              const std::string& key, | 
| 625                                              const base::Value* value) { | 625                                              const base::Value* value) { | 
| 626   switch (value->GetType()) { | 626   switch (value->GetType()) { | 
| 627     case base::Value::TYPE_BOOLEAN: { | 627     case base::Value::Type::BOOLEAN: { | 
| 628       bool boolean_value = false; | 628       bool boolean_value = false; | 
| 629       ASSERT_TRUE(value->GetAsBoolean(&boolean_value)); | 629       ASSERT_TRUE(value->GetAsBoolean(&boolean_value)); | 
| 630       AppendDWORDToPRegFile(path, key, boolean_value); | 630       AppendDWORDToPRegFile(path, key, boolean_value); | 
| 631       break; | 631       break; | 
| 632     } | 632     } | 
| 633     case base::Value::TYPE_INTEGER: { | 633     case base::Value::Type::INTEGER: { | 
| 634       int int_value = 0; | 634       int int_value = 0; | 
| 635       ASSERT_TRUE(value->GetAsInteger(&int_value)); | 635       ASSERT_TRUE(value->GetAsInteger(&int_value)); | 
| 636       AppendDWORDToPRegFile(path, key, int_value); | 636       AppendDWORDToPRegFile(path, key, int_value); | 
| 637       break; | 637       break; | 
| 638     } | 638     } | 
| 639     case base::Value::TYPE_DOUBLE: { | 639     case base::Value::Type::DOUBLE: { | 
| 640       double double_value = 0; | 640       double double_value = 0; | 
| 641       ASSERT_TRUE(value->GetAsDouble(&double_value)); | 641       ASSERT_TRUE(value->GetAsDouble(&double_value)); | 
| 642       AppendStringToPRegFile(path, key, base::DoubleToString(double_value)); | 642       AppendStringToPRegFile(path, key, base::DoubleToString(double_value)); | 
| 643       break; | 643       break; | 
| 644     } | 644     } | 
| 645     case base::Value::TYPE_STRING: { | 645     case base::Value::Type::STRING: { | 
| 646       std::string string_value; | 646       std::string string_value; | 
| 647       ASSERT_TRUE(value->GetAsString(&string_value)); | 647       ASSERT_TRUE(value->GetAsString(&string_value)); | 
| 648       AppendStringToPRegFile(path, key, string_value); | 648       AppendStringToPRegFile(path, key, string_value); | 
| 649       break; | 649       break; | 
| 650     } | 650     } | 
| 651     case base::Value::TYPE_DICTIONARY: { | 651     case base::Value::Type::DICTIONARY: { | 
| 652       base::string16 subpath = path + kPathSep + UTF8ToUTF16(key); | 652       base::string16 subpath = path + kPathSep + UTF8ToUTF16(key); | 
| 653       const base::DictionaryValue* dict = NULL; | 653       const base::DictionaryValue* dict = NULL; | 
| 654       ASSERT_TRUE(value->GetAsDictionary(&dict)); | 654       ASSERT_TRUE(value->GetAsDictionary(&dict)); | 
| 655       for (base::DictionaryValue::Iterator entry(*dict); !entry.IsAtEnd(); | 655       for (base::DictionaryValue::Iterator entry(*dict); !entry.IsAtEnd(); | 
| 656            entry.Advance()) { | 656            entry.Advance()) { | 
| 657         AppendPolicyToPRegFile(subpath, entry.key(), &entry.value()); | 657         AppendPolicyToPRegFile(subpath, entry.key(), &entry.value()); | 
| 658       } | 658       } | 
| 659       break; | 659       break; | 
| 660     } | 660     } | 
| 661     case base::Value::TYPE_LIST: { | 661     case base::Value::Type::LIST: { | 
| 662       base::string16 subpath = path + kPathSep + UTF8ToUTF16(key); | 662       base::string16 subpath = path + kPathSep + UTF8ToUTF16(key); | 
| 663       const base::ListValue* list = NULL; | 663       const base::ListValue* list = NULL; | 
| 664       ASSERT_TRUE(value->GetAsList(&list)); | 664       ASSERT_TRUE(value->GetAsList(&list)); | 
| 665       for (size_t i = 0; i < list->GetSize(); ++i) { | 665       for (size_t i = 0; i < list->GetSize(); ++i) { | 
| 666         const base::Value* entry = NULL; | 666         const base::Value* entry = NULL; | 
| 667         ASSERT_TRUE(list->Get(i, &entry)); | 667         ASSERT_TRUE(list->Get(i, &entry)); | 
| 668         AppendPolicyToPRegFile(subpath, base::IntToString(i + 1), entry); | 668         AppendPolicyToPRegFile(subpath, base::IntToString(i + 1), entry); | 
| 669       } | 669       } | 
| 670       break; | 670       break; | 
| 671     } | 671     } | 
| 672     case base::Value::TYPE_BINARY: | 672     case base::Value::Type::BINARY: | 
| 673     case base::Value::TYPE_NULL: { | 673     case base::Value::Type::NONE: { | 
| 674       ADD_FAILURE(); | 674       ADD_FAILURE(); | 
| 675       break; | 675       break; | 
| 676     } | 676     } | 
| 677   } | 677   } | 
| 678 } | 678 } | 
| 679 | 679 | 
| 680 }  // namespace | 680 }  // namespace | 
| 681 | 681 | 
| 682 // Instantiate abstract test case for basic policy reading tests. | 682 // Instantiate abstract test case for basic policy reading tests. | 
| 683 INSTANTIATE_TEST_CASE_P( | 683 INSTANTIATE_TEST_CASE_P( | 
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1185   expected.Get(ns_a).LoadFrom(&expected_a, POLICY_LEVEL_MANDATORY, | 1185   expected.Get(ns_a).LoadFrom(&expected_a, POLICY_LEVEL_MANDATORY, | 
| 1186                               POLICY_SCOPE_MACHINE, POLICY_SOURCE_PLATFORM); | 1186                               POLICY_SCOPE_MACHINE, POLICY_SOURCE_PLATFORM); | 
| 1187   base::DictionaryValue expected_b; | 1187   base::DictionaryValue expected_b; | 
| 1188   expected_b.SetInteger("policy 1", 2); | 1188   expected_b.SetInteger("policy 1", 2); | 
| 1189   expected.Get(ns_b).LoadFrom(&expected_b, POLICY_LEVEL_MANDATORY, | 1189   expected.Get(ns_b).LoadFrom(&expected_b, POLICY_LEVEL_MANDATORY, | 
| 1190                               POLICY_SCOPE_MACHINE, POLICY_SOURCE_PLATFORM); | 1190                               POLICY_SCOPE_MACHINE, POLICY_SOURCE_PLATFORM); | 
| 1191   EXPECT_TRUE(Matches(expected)); | 1191   EXPECT_TRUE(Matches(expected)); | 
| 1192 } | 1192 } | 
| 1193 | 1193 | 
| 1194 }  // namespace policy | 1194 }  // namespace policy | 
| OLD | NEW | 
|---|