Index: chrome/browser/configuration_policy_provider_win.cc |
diff --git a/chrome/browser/configuration_policy_provider_win.cc b/chrome/browser/configuration_policy_provider_win.cc |
new file mode 100755 |
index 0000000000000000000000000000000000000000..f64ea63865d2b22f3d50bad19287748a51e18eef |
--- /dev/null |
+++ b/chrome/browser/configuration_policy_provider_win.cc |
@@ -0,0 +1,158 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/configuration_policy_provider_win.h" |
+ |
+#include <algorithm> |
+ |
+#include "base/logging.h" |
+#include "base/registry.h" |
+#include "base/scoped_ptr.h" |
+#include "base/sys_string_conversions.h" |
+#include "base/values.h" |
+ |
+const wchar_t WinConfigurationPolicyProvider::kHomepageRegistryValueName[] = |
+ L"Homepage"; |
+const wchar_t WinConfigurationPolicyProvider:: |
+ kHomepageIsNewTabPageRegistryValueName[] = L"HomepageIsNewTabPage"; |
+const wchar_t WinConfigurationPolicyProvider::kCookiesModeRegistryValueName[] = |
+ L"CookiesMode"; |
+ |
+#if defined(GOOGLE_CHROME_BUILD) |
+const wchar_t WinConfigurationPolicyProvider::kPolicyRegistrySubKey[] = |
+ L"SOFTWARE\\Policies\\Google\\Google Chrome"; |
+#else |
+const wchar_t WinConfigurationPolicyProvider::kPolicyRegistrySubKey[] = |
+ L"SOFTWARE\\Policies\\Chromium"; |
+#endif |
+ |
+WinConfigurationPolicyProvider::WinConfigurationPolicyProvider() { |
+} |
+ |
+bool WinConfigurationPolicyProvider::GetRegistryPolicyString( |
+ const wchar_t* value_name, string16* result) { |
+ DWORD value_size = 0; |
+ DWORD key_type = 0; |
+ scoped_array<uint8> buffer; |
+ RegKey hkcu_policy_key(HKEY_LOCAL_MACHINE, kPolicyRegistrySubKey); |
+ if (hkcu_policy_key.ReadValue(value_name, 0, &value_size, &key_type)) { |
+ if (key_type != REG_SZ) |
+ return false; |
+ // According to the Microsoft documentation, the string |
+ // buffer may not be explicitly 0-terminated. Allocate a |
+ // slightly larger buffer and prefill to zeros to guarantee |
+ // the 0-termination. |
+ buffer.reset(new uint8[value_size + 2]); |
+ memset(buffer.get(), 0, value_size + 2); |
+ hkcu_policy_key.ReadValue(value_name, buffer.get(), &value_size); |
+ } else { |
+ RegKey hklm_policy_key(HKEY_CURRENT_USER, kPolicyRegistrySubKey); |
+ if (hklm_policy_key.ReadValue(value_name, 0, &value_size, &key_type)) { |
+ if (key_type != REG_SZ) |
+ return false; |
+ // According to the Microsoft documentation, the string |
+ // buffer may not be explicitly 0-terminated. Allocate a |
+ // slightly larger buffer and prefill to zeros to guarantee |
+ // the 0-termination. |
+ buffer.reset(new uint8[value_size + 2]); |
+ memset(buffer.get(), 0, value_size + 2); |
+ hklm_policy_key.ReadValue(value_name, buffer.get(), &value_size); |
+ } else { |
+ return false; |
+ } |
+ } |
+ |
+ result->assign(reinterpret_cast<const wchar_t*>(buffer.get())); |
+ return true; |
+} |
+ |
+bool WinConfigurationPolicyProvider::GetRegistryPolicyBoolean( |
+ const wchar_t* value_name, bool* result) { |
+ DWORD value; |
+ RegKey hkcu_policy_key(HKEY_LOCAL_MACHINE, kPolicyRegistrySubKey); |
+ if (hkcu_policy_key.ReadValueDW(value_name, &value)) { |
+ *result = value != 0; |
+ return true; |
+ } |
+ |
+ RegKey hklm_policy_key(HKEY_CURRENT_USER, kPolicyRegistrySubKey); |
+ if (hklm_policy_key.ReadValueDW(value_name, &value)) { |
+ *result = value != 0; |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool WinConfigurationPolicyProvider::GetRegistryPolicyInteger( |
+ const wchar_t* value_name, uint32* result) { |
+ DWORD value; |
+ RegKey hkcu_policy_key(HKEY_LOCAL_MACHINE, kPolicyRegistrySubKey); |
+ if (hkcu_policy_key.ReadValueDW(value_name, &value)) { |
+ *result = value; |
+ return true; |
+ } |
+ |
+ RegKey hklm_policy_key(HKEY_CURRENT_USER, kPolicyRegistrySubKey); |
+ if (hklm_policy_key.ReadValueDW(value_name, &value)) { |
+ *result = value; |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+const WinConfigurationPolicyProvider::RegistryPolicyMapEntry |
+ WinConfigurationPolicyProvider::registry_to_policy_map_[] = { |
+ { Value::TYPE_STRING, |
+ ConfigurationPolicyStore::kPolicyHomePage, |
+ kHomepageRegistryValueName }, |
+ { Value::TYPE_BOOLEAN, |
+ ConfigurationPolicyStore::kPolicyHomepageIsNewTabPage, |
+ kHomepageIsNewTabPageRegistryValueName }, |
+ { Value::TYPE_INTEGER, |
+ ConfigurationPolicyStore::kPolicyCookiesMode, |
+ kCookiesModeRegistryValueName }, |
+}; |
+ |
+bool WinConfigurationPolicyProvider::Provide( |
+ ConfigurationPolicyStore* store) { |
+ const RegistryPolicyMapEntry* current; |
+ const RegistryPolicyMapEntry* end = registry_to_policy_map_ + |
+ arraysize(registry_to_policy_map_); |
+ |
+ for (current = registry_to_policy_map_; current != end; ++current) { |
+ std::wstring string_value; |
+ uint32 int_value; |
+ bool bool_value; |
+ switch (current->value_type) { |
+ case Value::TYPE_STRING: |
+ if (GetRegistryPolicyString(current->registry_value_name, |
+ &string_value)) { |
+ store->Apply( |
+ current->policy_type, |
+ Value::CreateStringValueFromUTF16(string_value)); |
+ } |
+ break; |
+ case Value::TYPE_BOOLEAN: |
+ if (GetRegistryPolicyBoolean(current->registry_value_name, |
+ &bool_value)) { |
+ store->Apply(current->policy_type, |
+ Value::CreateBooleanValue(bool_value)); |
+ } |
+ break; |
+ case Value::TYPE_INTEGER: |
+ if (GetRegistryPolicyInteger(current->registry_value_name, |
+ &int_value)) { |
+ store->Apply(current->policy_type, |
+ Value::CreateIntegerValue(int_value)); |
+ } |
+ break; |
+ default: |
+ NOTREACHED(); |
+ return false; |
+ } |
+ } |
+ |
+ return true; |
+} |
+ |