Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "chrome/installer/util/google_update_settings.h" | 5 #include "chrome/installer/util/google_update_settings.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 33 FOUND_SAME_SETTING | 33 FOUND_SAME_SETTING |
| 34 }; | 34 }; |
| 35 | 35 |
| 36 bool ReadGoogleUpdateStrKey(const wchar_t* const name, std::wstring* value) { | 36 bool ReadGoogleUpdateStrKey(const wchar_t* const name, std::wstring* value) { |
| 37 // The registry functions below will end up going to disk. Do this on another | 37 // The registry functions below will end up going to disk. Do this on another |
| 38 // thread to avoid slowing the IO thread. http://crbug.com/62121 | 38 // thread to avoid slowing the IO thread. http://crbug.com/62121 |
| 39 base::ThreadRestrictions::ScopedAllowIO allow_io; | 39 base::ThreadRestrictions::ScopedAllowIO allow_io; |
| 40 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | 40 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| 41 std::wstring reg_path = dist->GetStateKey(); | 41 std::wstring reg_path = dist->GetStateKey(); |
| 42 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ); | 42 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ); |
| 43 if (!key.ReadValue(name, value)) { | 43 if (key.ReadValue(name, value) != ERROR_SUCCESS) { |
| 44 RegKey hklm_key(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_READ); | 44 RegKey hklm_key(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_READ); |
| 45 return hklm_key.ReadValue(name, value); | 45 return (hklm_key.ReadValue(name, value) == ERROR_SUCCESS); |
| 46 } | 46 } |
| 47 return true; | 47 return true; |
| 48 } | 48 } |
| 49 | 49 |
| 50 bool WriteGoogleUpdateStrKey(const wchar_t* const name, | 50 bool WriteGoogleUpdateStrKey(const wchar_t* const name, |
| 51 const std::wstring& value) { | 51 const std::wstring& value) { |
| 52 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | 52 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| 53 std::wstring reg_path = dist->GetStateKey(); | 53 std::wstring reg_path = dist->GetStateKey(); |
| 54 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ | KEY_WRITE); | 54 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ | KEY_WRITE); |
| 55 return key.WriteValue(name, value.c_str()); | 55 return (key.WriteValue(name, value.c_str()) == ERROR_SUCCESS); |
| 56 } | 56 } |
| 57 | 57 |
| 58 bool ClearGoogleUpdateStrKey(const wchar_t* const name) { | 58 bool ClearGoogleUpdateStrKey(const wchar_t* const name) { |
| 59 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | 59 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| 60 std::wstring reg_path = dist->GetStateKey(); | 60 std::wstring reg_path = dist->GetStateKey(); |
| 61 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ | KEY_WRITE); | 61 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ | KEY_WRITE); |
| 62 std::wstring value; | 62 std::wstring value; |
| 63 if (!key.ReadValue(name, &value)) | 63 if (key.ReadValue(name, &value) != ERROR_SUCCESS) |
| 64 return false; | 64 return false; |
| 65 return key.WriteValue(name, L""); | 65 return (key.WriteValue(name, L"") == ERROR_SUCCESS); |
| 66 } | 66 } |
| 67 | 67 |
| 68 bool RemoveGoogleUpdateStrKey(const wchar_t* const name) { | 68 bool RemoveGoogleUpdateStrKey(const wchar_t* const name) { |
| 69 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | 69 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| 70 std::wstring reg_path = dist->GetStateKey(); | 70 std::wstring reg_path = dist->GetStateKey(); |
| 71 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ | KEY_WRITE); | 71 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ | KEY_WRITE); |
| 72 if (!key.ValueExists(name)) | 72 if (!key.ValueExists(name)) |
| 73 return true; | 73 return true; |
| 74 return key.DeleteValue(name); | 74 return (key.DeleteValue(name) == ERROR_SUCCESS); |
| 75 } | 75 } |
| 76 | 76 |
| 77 EulaSearchResult HasEULASetting(HKEY root, const std::wstring& state_key, | 77 EulaSearchResult HasEULASetting(HKEY root, const std::wstring& state_key, |
| 78 bool setting) { | 78 bool setting) { |
| 79 RegKey key; | 79 RegKey key; |
| 80 DWORD previous_value; | 80 DWORD previous_value = setting ? 1 : 0; |
| 81 | 81 if (key.Open(root, state_key.c_str(), KEY_QUERY_VALUE) != ERROR_SUCCESS) |
| 82 if (!key.Open(root, state_key.c_str(), KEY_QUERY_VALUE)) | |
| 83 return NO_SETTING; | 82 return NO_SETTING; |
| 84 | 83 if (key.ReadValueDW(google_update::kRegEULAAceptedField, |
| 85 if (!key.ReadValueDW(google_update::kRegEULAAceptedField, &previous_value)) | 84 &previous_value) != ERROR_SUCCESS) |
| 86 return FOUND_CLIENT_STATE; | 85 return FOUND_CLIENT_STATE; |
| 87 | 86 |
| 88 return ((previous_value != 0) == setting) ? | 87 return ((previous_value != 0) == setting) ? |
| 89 FOUND_SAME_SETTING : FOUND_OPPOSITE_SETTING; | 88 FOUND_SAME_SETTING : FOUND_OPPOSITE_SETTING; |
| 90 } | 89 } |
| 91 | 90 |
| 92 } // namespace. | 91 } // namespace. |
| 93 | 92 |
| 94 bool GoogleUpdateSettings::GetCollectStatsConsent() { | 93 bool GoogleUpdateSettings::GetCollectStatsConsent() { |
| 95 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | 94 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| 96 std::wstring reg_path = dist->GetStateKey(); | 95 std::wstring reg_path = dist->GetStateKey(); |
| 97 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ); | 96 RegKey key(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ); |
| 98 DWORD value; | 97 DWORD value = 0; |
| 99 if (!key.ReadValueDW(google_update::kRegUsageStatsField, &value)) { | 98 if (key.ReadValueDW(google_update::kRegUsageStatsField, &value) |
| 100 RegKey hklm_key(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_READ); | 99 != ERROR_SUCCESS) { |
|
grt (UTC plus 2)
2011/01/16 04:19:48
Wrapping
amit
2011/01/16 07:54:28
Done.
| |
| 101 if (!hklm_key.ReadValueDW(google_update::kRegUsageStatsField, &value)) | 100 key.Open(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_READ); |
| 102 return false; | 101 key.ReadValueDW(google_update::kRegUsageStatsField, &value); |
| 103 } | 102 } |
| 104 return (1 == value); | 103 return (1 == value); |
| 105 } | 104 } |
| 106 | 105 |
| 107 bool GoogleUpdateSettings::SetCollectStatsConsent(bool consented) { | 106 bool GoogleUpdateSettings::SetCollectStatsConsent(bool consented) { |
| 108 DWORD value = consented? 1 : 0; | 107 DWORD value = consented? 1 : 0; |
| 109 // Writing to HKLM is only a best effort deal. | 108 // Writing to HKLM is only a best effort deal. |
| 110 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); | 109 BrowserDistribution* dist = BrowserDistribution::GetDistribution(); |
| 111 std::wstring reg_path = dist->GetStateMediumKey(); | 110 std::wstring reg_path = dist->GetStateMediumKey(); |
| 112 RegKey key_hklm(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_READ | KEY_WRITE); | 111 RegKey key(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_READ | KEY_WRITE); |
| 113 key_hklm.WriteValue(google_update::kRegUsageStatsField, value); | 112 key.WriteValue(google_update::kRegUsageStatsField, value); |
| 114 // Writing to HKCU is used both by chrome and by the crash reporter. | 113 // Writing to HKCU is used both by chrome and by the crash reporter. |
| 115 reg_path = dist->GetStateKey(); | 114 reg_path = dist->GetStateKey(); |
| 116 RegKey key_hkcu(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ | KEY_WRITE); | 115 key.Open(HKEY_CURRENT_USER, reg_path.c_str(), KEY_READ | KEY_WRITE); |
| 117 return key_hkcu.WriteValue(google_update::kRegUsageStatsField, value); | 116 return (key.WriteValue(google_update::kRegUsageStatsField, value) |
| 117 == ERROR_SUCCESS); | |
|
grt (UTC plus 2)
2011/01/16 04:19:48
Wrapping and indentation
amit
2011/01/16 07:54:28
Done.
| |
| 118 } | 118 } |
| 119 | 119 |
| 120 bool GoogleUpdateSettings::GetMetricsId(std::wstring* metrics_id) { | 120 bool GoogleUpdateSettings::GetMetricsId(std::wstring* metrics_id) { |
| 121 return ReadGoogleUpdateStrKey(google_update::kRegMetricsId, metrics_id); | 121 return ReadGoogleUpdateStrKey(google_update::kRegMetricsId, metrics_id); |
| 122 } | 122 } |
| 123 | 123 |
| 124 bool GoogleUpdateSettings::SetMetricsId(const std::wstring& metrics_id) { | 124 bool GoogleUpdateSettings::SetMetricsId(const std::wstring& metrics_id) { |
| 125 return WriteGoogleUpdateStrKey(google_update::kRegMetricsId, metrics_id); | 125 return WriteGoogleUpdateStrKey(google_update::kRegMetricsId, metrics_id); |
| 126 } | 126 } |
| 127 | 127 |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 149 reg_path = product.distribution()->GetStateMediumKey(); | 149 reg_path = product.distribution()->GetStateMediumKey(); |
| 150 } | 150 } |
| 151 } | 151 } |
| 152 if (status == NO_SETTING) { | 152 if (status == NO_SETTING) { |
| 153 LOG(WARNING) | 153 LOG(WARNING) |
| 154 << "eulaaccepted value not found; setting consent on package"; | 154 << "eulaaccepted value not found; setting consent on package"; |
| 155 reg_path = package.properties()->GetStateMediumKey(); | 155 reg_path = package.properties()->GetStateMediumKey(); |
| 156 } | 156 } |
| 157 } | 157 } |
| 158 RegKey key(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_SET_VALUE); | 158 RegKey key(HKEY_LOCAL_MACHINE, reg_path.c_str(), KEY_SET_VALUE); |
| 159 return key.WriteValue(google_update::kRegEULAAceptedField, consented ? 1 : 0); | 159 return (key.WriteValue(google_update::kRegEULAAceptedField, |
| 160 consented ? 1 : 0) == ERROR_SUCCESS); | |
| 160 } | 161 } |
| 161 | 162 |
| 162 int GoogleUpdateSettings::GetLastRunTime() { | 163 int GoogleUpdateSettings::GetLastRunTime() { |
| 163 std::wstring time_s; | 164 std::wstring time_s; |
| 164 if (!ReadGoogleUpdateStrKey(google_update::kRegLastRunTimeField, &time_s)) | 165 if (!ReadGoogleUpdateStrKey(google_update::kRegLastRunTimeField, &time_s)) |
| 165 return -1; | 166 return -1; |
| 166 int64 time_i; | 167 int64 time_i; |
| 167 if (!base::StringToInt64(time_s, &time_i)) | 168 if (!base::StringToInt64(time_s, &time_i)) |
| 168 return -1; | 169 return -1; |
| 169 base::TimeDelta td = | 170 base::TimeDelta td = |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 240 void GoogleUpdateSettings::UpdateInstallStatus(bool system_install, | 241 void GoogleUpdateSettings::UpdateInstallStatus(bool system_install, |
| 241 bool incremental_install, bool multi_install, int install_return_code, | 242 bool incremental_install, bool multi_install, int install_return_code, |
| 242 const std::wstring& product_guid) { | 243 const std::wstring& product_guid) { |
| 243 HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; | 244 HKEY reg_root = (system_install) ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; |
| 244 | 245 |
| 245 RegKey key; | 246 RegKey key; |
| 246 installer::ChannelInfo channel_info; | 247 installer::ChannelInfo channel_info; |
| 247 std::wstring reg_key(google_update::kRegPathClientState); | 248 std::wstring reg_key(google_update::kRegPathClientState); |
| 248 reg_key.append(L"\\"); | 249 reg_key.append(L"\\"); |
| 249 reg_key.append(product_guid); | 250 reg_key.append(product_guid); |
| 250 if (!key.Open(reg_root, reg_key.c_str(), KEY_QUERY_VALUE | KEY_SET_VALUE) || | 251 LONG result = key.Open(reg_root, reg_key.c_str(), |
| 251 !channel_info.Initialize(key)) { | 252 KEY_QUERY_VALUE | KEY_SET_VALUE); |
| 253 if (result != ERROR_SUCCESS || !channel_info.Initialize(key)) { | |
| 252 VLOG(1) << "Application key not found."; | 254 VLOG(1) << "Application key not found."; |
| 253 if (!incremental_install && !multi_install || !install_return_code) { | 255 if (!incremental_install && !multi_install || !install_return_code) { |
| 254 VLOG(1) << "Returning without changing application key."; | 256 VLOG(1) << "Returning without changing application key."; |
| 255 return; | 257 return; |
| 256 } else if (!key.Valid()) { | 258 } else if (!key.Valid()) { |
| 257 reg_key.assign(google_update::kRegPathClientState); | 259 reg_key.assign(google_update::kRegPathClientState); |
| 258 if (!key.Open(reg_root, reg_key.c_str(), KEY_CREATE_SUB_KEY) || | 260 result = key.Open(reg_root, reg_key.c_str(), KEY_CREATE_SUB_KEY); |
| 259 !key.CreateKey(product_guid.c_str(), KEY_SET_VALUE)) { | 261 if (result == ERROR_SUCCESS) |
| 260 LOG(ERROR) << "Failed to create application key."; | 262 result = key.CreateKey(product_guid.c_str(), KEY_SET_VALUE); |
| 263 | |
| 264 if (result != ERROR_SUCCESS) { | |
| 265 LOG(ERROR) << "Failed to create application key. Error: " << result; | |
| 261 return; | 266 return; |
| 262 } | 267 } |
| 263 } | 268 } |
| 264 } | 269 } |
| 265 | 270 |
| 266 if (UpdateGoogleUpdateApKey(incremental_install, multi_install, | 271 if (UpdateGoogleUpdateApKey(incremental_install, multi_install, |
| 267 install_return_code, &channel_info) && | 272 install_return_code, &channel_info) && |
| 268 !channel_info.Write(&key)) { | 273 !channel_info.Write(&key)) { |
| 269 LOG(ERROR) << "Failed to write value " << channel_info.value() | 274 LOG(ERROR) << "Failed to write value " << channel_info.value() |
| 270 << " to the registry field " << google_update::kRegApField; | 275 << " to the registry field " << google_update::kRegApField; |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 354 }; | 359 }; |
| 355 const wchar_t** end = &kBrands[arraysize(kBrands)]; | 360 const wchar_t** end = &kBrands[arraysize(kBrands)]; |
| 356 const wchar_t** found = std::find(&kBrands[0], end, brand); | 361 const wchar_t** found = std::find(&kBrands[0], end, brand); |
| 357 if (found != end) | 362 if (found != end) |
| 358 return true; | 363 return true; |
| 359 if (StartsWith(brand, L"EUB", true) || StartsWith(brand, L"EUC", true) || | 364 if (StartsWith(brand, L"EUB", true) || StartsWith(brand, L"EUC", true) || |
| 360 StartsWith(brand, L"GGR", true)) | 365 StartsWith(brand, L"GGR", true)) |
| 361 return true; | 366 return true; |
| 362 return false; | 367 return false; |
| 363 } | 368 } |
| OLD | NEW |