1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/installer/gcapi/gcapi_reactivation.h" 6 7 #include "base/time/time.h" 8 #include "base/win/registry.h" 9 #include "chrome/installer/gcapi/gcapi.h" 10 #include "chrome/installer/util/google_update_constants.h" 11 12 using base::Time; 13 using base::win::RegKey; 14 15 namespace { 16 const wchar_t kReactivationHistoryKey[] = L"reactivation"; 17 18 std::wstring GetReactivationHistoryKeyPath() { 19 std::wstring reactivation_path(google_update::kRegPathClientState); 20 reactivation_path += L"\\"; 21 reactivation_path += google_update::kChromeUpgradeCode; 22 reactivation_path += L"\\"; 23 reactivation_path += kReactivationHistoryKey; 24 return reactivation_path; 25 } 26 } // namespace 27 28 bool HasBeenReactivated() { 29 RegKey reactivation_key(HKEY_CURRENT_USER, 30 GetReactivationHistoryKeyPath().c_str(), 31 KEY_QUERY_VALUE | KEY_WOW64_32KEY); 32 33 return reactivation_key.Valid(); 34 } 35 36 bool SetReactivationBrandCode(const std::wstring& brand_code, int shell_mode) { 37 bool success = false; 38 39 // This function currently only should be run in a non-elevated shell, 40 // so we return "true" if it is being invoked from an elevated shell. 41 if (shell_mode == GCAPI_INVOKED_UAC_ELEVATION) 42 return true; 43 44 std::wstring path(google_update::kRegPathClientState); 45 path += L"\\"; 46 path += google_update::kChromeUpgradeCode; 47 48 RegKey client_state_key( 49 HKEY_CURRENT_USER, path.c_str(), KEY_SET_VALUE | KEY_WOW64_32KEY); 50 if (client_state_key.Valid()) { 51 success = client_state_key.WriteValue( 52 google_update::kRegRLZReactivationBrandField, 53 brand_code.c_str()) == ERROR_SUCCESS; 54 } 55 56 if (success) { 57 // Store this brand code in the reactivation history. Store it with a 58 // a currently un-used timestamp for future proofing. 59 RegKey reactivation_key(HKEY_CURRENT_USER, 60 GetReactivationHistoryKeyPath().c_str(), 61 KEY_WRITE | KEY_WOW64_32KEY); 62 if (reactivation_key.Valid()) { 63 int64 timestamp = Time::Now().ToInternalValue(); 64 reactivation_key.WriteValue(brand_code.c_str(), 65 ×tamp, 66 sizeof(timestamp), 67 REG_QWORD); 68 } 69 } 70 71 return success; 72 } 73 74