diff options
Diffstat (limited to 'chrome/installer/util/google_update_settings.cc')
-rw-r--r-- | chrome/installer/util/google_update_settings.cc | 70 |
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; +} |