OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/install_static/install_util.h" | 5 #include "chrome/install_static/install_util.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <assert.h> | 8 #include <assert.h> |
9 #include <stdlib.h> | 9 #include <stdlib.h> |
10 #include <string.h> | 10 #include <string.h> |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 std::basic_istringstream<typename StringType::value_type> buffer(str); | 250 std::basic_istringstream<typename StringType::value_type> buffer(str); |
251 for (StringType token; std::getline(buffer, token, delimiter);) { | 251 for (StringType token; std::getline(buffer, token, delimiter);) { |
252 if (trim_spaces) | 252 if (trim_spaces) |
253 TrimT<StringType>(&token); | 253 TrimT<StringType>(&token); |
254 tokens.push_back(token); | 254 tokens.push_back(token); |
255 } | 255 } |
256 return tokens; | 256 return tokens; |
257 } | 257 } |
258 | 258 |
259 std::wstring ChannelFromAdditionalParameters(const InstallConstants& mode, | 259 std::wstring ChannelFromAdditionalParameters(const InstallConstants& mode, |
260 bool system_level, | 260 bool system_level) { |
261 bool binaries) { | |
262 assert(kUseGoogleUpdateIntegration); | 261 assert(kUseGoogleUpdateIntegration); |
263 // InitChannelInfo in google_update_settings.cc only reports a failure in the | 262 // InitChannelInfo in google_update_settings.cc only reports a failure when |
264 // case of multi-install Chrome where the binaries' ClientState key exists, | 263 // Chrome's ClientState key exists but that the "ap" value therein cannot be |
265 // but that the "ap" value therein cannot be read due to some reason *other* | 264 // read due to some reason *other* than it not being present. This should be |
266 // than it not being present. This should be exceedingly rare. For | 265 // exceedingly rare. For simplicity's sake, use an empty |value| in case of |
267 // simplicity's sake, use an empty |value| in case of any error whatsoever | 266 // any error whatsoever here. |
268 // here. | |
269 std::wstring value; | 267 std::wstring value; |
270 nt::QueryRegValueSZ(system_level ? nt::HKLM : nt::HKCU, nt::WOW6432, | 268 nt::QueryRegValueSZ(system_level ? nt::HKLM : nt::HKCU, nt::WOW6432, |
271 (binaries ? GetBinariesClientStateKeyPath() | 269 GetClientStateKeyPath(mode.app_guid).c_str(), kRegValueAp, |
272 : GetClientStateKeyPath(mode.app_guid)) | 270 &value); |
273 .c_str(), | |
274 kRegValueAp, &value); | |
275 | 271 |
276 static constexpr wchar_t kChromeChannelBetaPattern[] = L"1?1-*"; | 272 static constexpr wchar_t kChromeChannelBetaPattern[] = L"1?1-*"; |
277 static constexpr wchar_t kChromeChannelBetaX64Pattern[] = L"*x64-beta*"; | 273 static constexpr wchar_t kChromeChannelBetaX64Pattern[] = L"*x64-beta*"; |
278 static constexpr wchar_t kChromeChannelDevPattern[] = L"2?0-d*"; | 274 static constexpr wchar_t kChromeChannelDevPattern[] = L"2?0-d*"; |
279 static constexpr wchar_t kChromeChannelDevX64Pattern[] = L"*x64-dev*"; | 275 static constexpr wchar_t kChromeChannelDevX64Pattern[] = L"*x64-dev*"; |
280 | 276 |
281 std::transform(value.begin(), value.end(), value.begin(), ::tolower); | 277 std::transform(value.begin(), value.end(), value.begin(), ::tolower); |
282 | 278 |
283 // Empty channel names or those containing "stable" should be reported as | 279 // Empty channel names or those containing "stable" should be reported as |
284 // an empty string. | 280 // an empty string. |
285 std::wstring channel_name; | 281 std::wstring channel_name; |
286 if (value.empty() || | 282 if (value.empty() || |
287 (value.find(kChromeChannelStableExplicit) != std::wstring::npos)) { | 283 (value.find(kChromeChannelStableExplicit) != std::wstring::npos)) { |
288 } else if (MatchPattern(value, kChromeChannelDevPattern) || | 284 } else if (MatchPattern(value, kChromeChannelDevPattern) || |
289 MatchPattern(value, kChromeChannelDevX64Pattern)) { | 285 MatchPattern(value, kChromeChannelDevX64Pattern)) { |
290 channel_name.assign(kChromeChannelDev); | 286 channel_name.assign(kChromeChannelDev); |
291 } else if (MatchPattern(value, kChromeChannelBetaPattern) || | 287 } else if (MatchPattern(value, kChromeChannelBetaPattern) || |
292 MatchPattern(value, kChromeChannelBetaX64Pattern)) { | 288 MatchPattern(value, kChromeChannelBetaX64Pattern)) { |
293 channel_name.assign(kChromeChannelBeta); | 289 channel_name.assign(kChromeChannelBeta); |
294 } | 290 } |
295 // Else report values with garbage as stable since they will match the stable | 291 // Else report values with garbage as stable since they will match the stable |
296 // rules in the update configs. ChannelInfo::GetChannelName painstakingly | 292 // rules in the update configs. ChannelInfo::GetChannelName painstakingly |
297 // strips off known modifiers (e.g., "-multi-full") to see if the empty string | 293 // strips off known modifiers (e.g., "-full") to see if the empty string |
298 // remains, returning channel "unknown" if not. This differs here in that some | 294 // remains, returning channel "unknown" if not. This differs here in that some |
299 // clients will tag crashes as "stable" rather than "unknown" via this | 295 // clients will tag crashes as "stable" rather than "unknown" via this |
300 // codepath, but it is an accurate reflection of which update channel the | 296 // codepath, but it is an accurate reflection of which update channel the |
301 // client is on according to the server-side rules. | 297 // client is on according to the server-side rules. |
302 | 298 |
303 return channel_name; | 299 return channel_name; |
304 } | 300 } |
305 | 301 |
306 } // namespace | 302 } // namespace |
307 | 303 |
308 bool IsSystemInstall() { | 304 bool IsSystemInstall() { |
309 return InstallDetails::Get().system_level(); | 305 return InstallDetails::Get().system_level(); |
310 } | 306 } |
311 | 307 |
312 bool IsMultiInstall() { | |
313 return InstallDetails::Get().multi_install(); | |
314 } | |
315 | |
316 bool GetCollectStatsConsent() { | 308 bool GetCollectStatsConsent() { |
317 bool enabled = true; | 309 bool enabled = true; |
318 | 310 |
319 if (ReportingIsEnforcedByPolicy(&enabled)) | 311 if (ReportingIsEnforcedByPolicy(&enabled)) |
320 return enabled; | 312 return enabled; |
321 | 313 |
322 const bool system_install = IsSystemInstall(); | 314 const bool system_install = IsSystemInstall(); |
323 | 315 |
324 DWORD out_value = 0; | 316 DWORD out_value = 0; |
325 | 317 |
326 // If system_install, first try ClientStateMedium in HKLM. | 318 // If system_install, first try ClientStateMedium in HKLM. |
327 if (system_install && | 319 if (system_install && |
328 nt::QueryRegValueDWORD( | 320 nt::QueryRegValueDWORD( |
329 nt::HKLM, nt::WOW6432, | 321 nt::HKLM, nt::WOW6432, |
330 InstallDetails::Get().GetClientStateMediumKeyPath(true).c_str(), | 322 InstallDetails::Get().GetClientStateMediumKeyPath().c_str(), |
331 kRegValueUsageStats, &out_value)) { | 323 kRegValueUsageStats, &out_value)) { |
332 return (out_value == 1); | 324 return (out_value == 1); |
333 } | 325 } |
334 | 326 |
335 // Second, try ClientState. | 327 // Second, try ClientState. |
336 return (nt::QueryRegValueDWORD( | 328 return (nt::QueryRegValueDWORD( |
337 system_install ? nt::HKLM : nt::HKCU, nt::WOW6432, | 329 system_install ? nt::HKLM : nt::HKCU, nt::WOW6432, |
338 InstallDetails::Get().GetClientStateKeyPath(true).c_str(), | 330 InstallDetails::Get().GetClientStateKeyPath().c_str(), |
339 kRegValueUsageStats, &out_value) && | 331 kRegValueUsageStats, &out_value) && |
340 out_value == 1); | 332 out_value == 1); |
341 } | 333 } |
342 | 334 |
343 bool GetCollectStatsInSample() { | 335 bool GetCollectStatsInSample() { |
344 std::wstring registry_path = GetChromeInstallRegistryPath(); | 336 std::wstring registry_path = GetChromeInstallRegistryPath(); |
345 | 337 |
346 DWORD out_value = 0; | 338 DWORD out_value = 0; |
347 if (!nt::QueryRegValueDWORD(nt::HKCU, nt::WOW6432, registry_path.c_str(), | 339 if (!nt::QueryRegValueDWORD(nt::HKCU, nt::WOW6432, registry_path.c_str(), |
348 kRegValueChromeStatsSample, &out_value)) { | 340 kRegValueChromeStatsSample, &out_value)) { |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
506 std::wstring official_build; | 498 std::wstring official_build; |
507 GetValueFromVersionResource(data.get(), L"Official Build", | 499 GetValueFromVersionResource(data.get(), L"Official Build", |
508 &official_build); | 500 &official_build); |
509 if (official_build != L"1") | 501 if (official_build != L"1") |
510 version->append(L"-devel"); | 502 version->append(L"-devel"); |
511 GetValueFromVersionResource(data.get(), L"ProductShortName", | 503 GetValueFromVersionResource(data.get(), L"ProductShortName", |
512 product_name); | 504 product_name); |
513 GetValueFromVersionResource(data.get(), L"SpecialBuild", special_build); | 505 GetValueFromVersionResource(data.get(), L"SpecialBuild", special_build); |
514 } | 506 } |
515 } | 507 } |
516 *channel_name = GetChromeChannelName(true /* add_modifier */); | 508 *channel_name = GetChromeChannelName(); |
517 } | 509 } |
518 | 510 |
519 std::wstring GetChromeChannelName(bool add_modifier) { | 511 std::wstring GetChromeChannelName() { |
520 const std::wstring& channel = InstallDetails::Get().channel(); | 512 return InstallDetails::Get().channel(); |
521 if (!add_modifier || !IsMultiInstall()) | |
522 return channel; | |
523 if (channel.empty()) | |
524 return L"m"; | |
525 return channel + L"-m"; | |
526 } | 513 } |
527 | 514 |
528 std::wstring GetBrowserCrashDumpAttemptsRegistryPath() { | 515 std::wstring GetBrowserCrashDumpAttemptsRegistryPath() { |
529 return GetChromeInstallRegistryPath().append(kBrowserCrashDumpMetricsSubKey); | 516 return GetChromeInstallRegistryPath().append(kBrowserCrashDumpMetricsSubKey); |
530 } | 517 } |
531 | 518 |
532 bool MatchPattern(const std::wstring& source, const std::wstring& pattern) { | 519 bool MatchPattern(const std::wstring& source, const std::wstring& pattern) { |
533 assert(pattern.find(L"**") == std::wstring::npos); | 520 assert(pattern.find(L"**") == std::wstring::npos); |
534 return MatchPatternImpl(source, pattern, 0, 0); | 521 return MatchPatternImpl(source, pattern, 0, 0); |
535 } | 522 } |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
741 Trace(L"Failed to create directory %ls, last error is %d\n", | 728 Trace(L"Failed to create directory %ls, last error is %d\n", |
742 full_path_str, error_code); | 729 full_path_str, error_code); |
743 return false; | 730 return false; |
744 } | 731 } |
745 } | 732 } |
746 return true; | 733 return true; |
747 } | 734 } |
748 | 735 |
749 // This function takes these inputs rather than accessing the module's | 736 // This function takes these inputs rather than accessing the module's |
750 // InstallDetails instance since it is used to bootstrap InstallDetails. | 737 // InstallDetails instance since it is used to bootstrap InstallDetails. |
751 std::wstring DetermineChannel(const InstallConstants& mode, | 738 std::wstring DetermineChannel(const InstallConstants& mode, bool system_level) { |
752 bool system_level, | |
753 bool multi_install) { | |
754 if (!kUseGoogleUpdateIntegration) | 739 if (!kUseGoogleUpdateIntegration) |
755 return std::wstring(); | 740 return std::wstring(); |
756 | 741 |
757 switch (mode.channel_strategy) { | 742 switch (mode.channel_strategy) { |
758 case ChannelStrategy::UNSUPPORTED: | 743 case ChannelStrategy::UNSUPPORTED: |
759 assert(false); | 744 assert(false); |
760 break; | 745 break; |
761 case ChannelStrategy::ADDITIONAL_PARAMETERS: | 746 case ChannelStrategy::ADDITIONAL_PARAMETERS: |
762 return ChannelFromAdditionalParameters(mode, system_level, multi_install); | 747 return ChannelFromAdditionalParameters(mode, system_level); |
763 case ChannelStrategy::FIXED: | 748 case ChannelStrategy::FIXED: |
764 return mode.default_channel_name; | 749 return mode.default_channel_name; |
765 } | 750 } |
766 | 751 |
767 return std::wstring(); | 752 return std::wstring(); |
768 } | 753 } |
769 | 754 |
770 } // namespace install_static | 755 } // namespace install_static |
OLD | NEW |