summaryrefslogtreecommitdiffstats
path: root/chrome/installer/util/google_update_settings.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/installer/util/google_update_settings.cc')
-rw-r--r--chrome/installer/util/google_update_settings.cc70
1 files changed, 70 insertions, 0 deletions
diff --git a/chrome/installer/util/google_update_settings.cc b/chrome/installer/util/google_update_settings.cc
index e0947d1..a1cd48e 100644
--- a/chrome/installer/util/google_update_settings.cc
+++ b/chrome/installer/util/google_update_settings.cc
@@ -26,6 +26,17 @@ using installer::InstallerState;
namespace {
+const wchar_t kGoogleUpdatePoliciesKey[] =
+ L"SOFTWARE\\Policies\\Google\\Update";
+const wchar_t kGoogleUpdateUpdatePolicyValue[] = L"UpdateDefault";
+const wchar_t kGoogleUpdateUpdateOverrideValuePrefix[] = L"Update";
+const GoogleUpdateSettings::UpdatePolicy kGoogleUpdateDefaultUpdatePolicy =
+#if defined(GOOGLE_CHROME_BUILD)
+ GoogleUpdateSettings::AUTOMATIC_UPDATES;
+#else
+ GoogleUpdateSettings::UPDATES_DISABLED;
+#endif
+
// An list of search results in increasing order of desirability.
enum EulaSearchResult {
NO_SETTING,
@@ -143,6 +154,24 @@ bool GetChromeChannelInternal(bool system_install,
return true;
}
+// Populates |update_policy| with the UpdatePolicy enum value corresponding to a
+// DWORD read from the registry and returns true if |value| is within range.
+// If |value| is out of range, returns false without modifying |update_policy|.
+bool GetUpdatePolicyFromDword(
+ const DWORD value,
+ GoogleUpdateSettings::UpdatePolicy* update_policy) {
+ switch (value) {
+ case GoogleUpdateSettings::UPDATES_DISABLED:
+ case GoogleUpdateSettings::AUTOMATIC_UPDATES:
+ case GoogleUpdateSettings::MANUAL_UPDATES_ONLY:
+ *update_policy = static_cast<GoogleUpdateSettings::UpdatePolicy>(value);
+ return true;
+ default:
+ LOG(WARNING) << "Unexpected update policy override value: " << value;
+ }
+ return false;
+}
+
} // namespace
// Older versions of Chrome unconditionally read from HKCU\...\ClientState\...
@@ -486,3 +515,44 @@ bool GoogleUpdateSettings::IsOrganicFirstRun(const std::wstring& brand) {
return (StartsWith(brand, L"GG", true) || StartsWith(brand, L"EU", true));
}
+
+GoogleUpdateSettings::UpdatePolicy GoogleUpdateSettings::GetAppUpdatePolicy(
+ const std::wstring& app_guid,
+ bool* is_overridden) {
+ bool found_override = false;
+ UpdatePolicy update_policy = kGoogleUpdateDefaultUpdatePolicy;
+
+#if defined(GOOGLE_CHROME_BUILD)
+ DCHECK(!app_guid.empty());
+ RegKey policy_key;
+
+ // Google Update Group Policy settings are always in HKLM.
+ if (policy_key.Open(HKEY_LOCAL_MACHINE, kGoogleUpdatePoliciesKey,
+ KEY_QUERY_VALUE) == ERROR_SUCCESS) {
+ static const size_t kPrefixLen =
+ arraysize(kGoogleUpdateUpdateOverrideValuePrefix) - 1;
+ DWORD value;
+ std::wstring app_update_override;
+ app_update_override.reserve(kPrefixLen + app_guid.size());
+ app_update_override.append(kGoogleUpdateUpdateOverrideValuePrefix,
+ kPrefixLen);
+ app_update_override.append(app_guid);
+ // First try to read and comprehend the app-specific override.
+ found_override = (policy_key.ReadValueDW(app_update_override.c_str(),
+ &value) == ERROR_SUCCESS &&
+ GetUpdatePolicyFromDword(value, &update_policy));
+
+ // Failing that, try to read and comprehend the default override.
+ if (!found_override &&
+ policy_key.ReadValueDW(kGoogleUpdateUpdatePolicyValue,
+ &value) == ERROR_SUCCESS) {
+ GetUpdatePolicyFromDword(value, &update_policy);
+ }
+ }
+#endif // defined(GOOGLE_CHROME_BUILD)
+
+ if (is_overridden != NULL)
+ *is_overridden = found_override;
+
+ return update_policy;
+}