15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/gcapi/gcapi_reactivation.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/registry.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/installer/gcapi/gcapi.h" 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/installer/util/google_update_constants.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::win::RegKey; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const wchar_t kReactivationHistoryKey[] = L"reactivation"; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::wstring GetReactivationHistoryKeyPath() { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring reactivation_path(google_update::kRegPathClientState); 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reactivation_path += L"\\"; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reactivation_path += google_update::kChromeUpgradeCode; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reactivation_path += L"\\"; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reactivation_path += kReactivationHistoryKey; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reactivation_path; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HasBeenReactivated() { 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegKey reactivation_key(HKEY_CURRENT_USER, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetReactivationHistoryKeyPath().c_str(), 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) KEY_QUERY_VALUE | KEY_WOW64_32KEY); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return reactivation_key.Valid(); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool SetReactivationBrandCode(const std::wstring& brand_code, int shell_mode) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = false; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This function currently only should be run in a non-elevated shell, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so we return "true" if it is being invoked from an elevated shell. 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (shell_mode == GCAPI_INVOKED_UAC_ELEVATION) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::wstring path(google_update::kRegPathClientState); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path += L"\\"; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) path += google_update::kChromeUpgradeCode; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RegKey client_state_key( 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HKEY_CURRENT_USER, path.c_str(), KEY_SET_VALUE | KEY_WOW64_32KEY); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (client_state_key.Valid()) { 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success = client_state_key.WriteValue( 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) google_update::kRegRLZReactivationBrandField, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) brand_code.c_str()) == ERROR_SUCCESS; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (success) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Store this brand code in the reactivation history. Store it with a 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a currently un-used timestamp for future proofing. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RegKey reactivation_key(HKEY_CURRENT_USER, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetReactivationHistoryKeyPath().c_str(), 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) KEY_WRITE | KEY_WOW64_32KEY); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (reactivation_key.Valid()) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 timestamp = Time::Now().ToInternalValue(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reactivation_key.WriteValue(brand_code.c_str(), 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ×tamp, 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sizeof(timestamp), 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REG_QWORD); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74