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
12using base::Time;
13using base::win::RegKey;
14
15namespace {
16const wchar_t kReactivationHistoryKey[] = L"reactivation";
17
18std::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
28bool 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
36bool 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                                  &timestamp,
66                                  sizeof(timestamp),
67                                  REG_QWORD);
68    }
69  }
70
71  return success;
72}
73
74