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)                                  &timestamp,
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