forked from chromium/chromium
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathinstall_util.h
190 lines (151 loc) · 8.22 KB
/
install_util.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// This file declares utility functions for the installer. The original reason
// for putting these functions in installer\util library is so that we can
// separate out the critical logic and write unit tests for it.
#ifndef CHROME_INSTALLER_UTIL_INSTALL_UTIL_H_
#define CHROME_INSTALLER_UTIL_INSTALL_UTIL_H_
#include <optional>
#include <string>
#include <string_view>
#include <tuple>
#include <utility>
#include <vector>
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/types/strong_alias.h"
#include "base/version.h"
#include "base/win/registry.h"
#include "base/win/scoped_handle.h"
#include "base/win/windows_types.h"
#include "chrome/installer/util/util_constants.h"
class WorkItemList;
// This is a utility class that provides common installation related
// utility methods that can be used by installer and also unit tested
// independently.
class InstallUtil {
public:
InstallUtil(const InstallUtil&) = delete;
InstallUtil& operator=(const InstallUtil&) = delete;
// Attempts to trigger the command that would be run by Active Setup for a
// system-level Chrome. For use only when system-level Chrome is installed.
static void TriggerActiveSetupCommand();
// Launches given exe as admin on Vista.
static bool ExecuteExeAsAdmin(const base::CommandLine& cmd, DWORD* exit_code);
// Reads the uninstall command for Chromium from the Windows registry and
// returns it. If |system_install| is true the command is read from HKLM,
// otherwise from HKCU. Returns an empty CommandLine if Chrome is not
// installed.
static base::CommandLine GetChromeUninstallCmd(bool system_install);
// Returns the version of Chrome registered with Google Update, or an invalid
// Version in case no such value could be found. |system_install| indicates
// whether HKLM (true) or HKCU (false) should be checked.
static base::Version GetChromeVersion(bool system_install);
// Returns the last critical update (version) of Chrome, or an invalid Version
// in case no such value is found. A critical update is a specially flagged
// version (by Google Update) that contains an important security fix.
static base::Version GetCriticalUpdateVersion();
// This function checks if the current OS is supported for Chromium.
static bool IsOSSupported();
// Adds work items to |install_list| to set installer error information in the
// registry for consumption by Google Update. |install_list| must be best-
// effort with rollback disabled. |state_key| must be the full path to an
// app's ClientState key. See InstallerState::WriteInstallerResult for more
// details.
static void AddInstallerResultItems(bool system_install,
const std::wstring& state_key,
installer::InstallStatus status,
int string_resource_id,
const std::wstring* const launch_cmd,
WorkItemList* install_list);
// Returns true if this installation path is per user, otherwise returns false
// (per machine install, meaning: the exe_path contains the path to Program
// Files).
// TODO(grt): consider replacing all callers with direct use of
// InstallDetails.
static bool IsPerUserInstall();
// Returns true if the sentinel file exists (or the path cannot be obtained).
static bool IsFirstRunSentinelPresent();
// Test to see if a Start menu shortcut exists with the right toast activator
// CLSID registered.
static bool IsStartMenuShortcutWithActivatorGuidInstalled();
// Returns true if the current process has the interactive user token. False
// otherwise.
static bool IsRunningAsInteractiveUser();
// Returns the toast activator registry path.
static std::wstring GetToastActivatorRegistryPath();
// Populates |path| with EULA sentinel file path. Returns false on error.
static bool GetEulaSentinelFilePath(base::FilePath* path);
// Returns zero on install success, or an InstallStatus value otherwise.
static int GetInstallReturnCode(installer::InstallStatus install_status);
// Composes |program| and |arguments| into |command_line|.
static void ComposeCommandLine(const std::wstring& program,
const std::wstring& arguments,
base::CommandLine* command_line);
// Appends the installer switch that selects the current install mode and
// policy-specified channel (see install_static::InstallDetails).
static void AppendModeAndChannelSwitches(base::CommandLine* command_line);
// Returns a string in the form YYYYMMDD of the current date.
static std::wstring GetCurrentDate();
// Returns the highest Chrome version that was installed prior to a downgrade,
// or no value if Chrome was not previously downgraded from a newer version.
static std::optional<base::Version> GetDowngradeVersion();
// Returns pairs of registry key paths and value names where the enrollment
// token is stored for machine level user cloud policies. The locations are
// returned in order of preference.
static std::vector<std::pair<std::wstring, std::wstring>>
GetCloudManagementEnrollmentTokenRegistryPaths();
using ReadOnly = base::StrongAlias<class ReadOnlyTag, bool>;
using BrowserLocation = base::StrongAlias<class BrowserLocationTag, bool>;
// Returns the path where the cloud management DMToken should be read/written.
// |browser_location| indicates whether the legacy browser-specific path is
// returned rather than the app-neutral path.
static std::pair<std::wstring, std::wstring> GetCloudManagementDmTokenPath(
BrowserLocation browser_location);
// Returns the registry key and value name from/to which a cloud management DM
// token may be read/written. |read_only| indicates whether they key is opened
// for reading the value or writing it. |browser_location| indicates whether
// the legacy browser-specific location is returned rather than the
// app-neutral location. The returned key will be invalid if it could not be
// opened/created.
static std::pair<base::win::RegKey, std::wstring>
GetCloudManagementDmTokenLocation(ReadOnly read_only,
BrowserLocation browser_location);
// Returns the registry key and value names from/to which the device trust
// signing key and trust level may be read/written. |read_only| indicates
// whether they key is opened for reading the value or writing it. The
// returned key will be invalid if it could not be opened/created.
static std::tuple<base::win::RegKey, std::wstring, std::wstring>
GetDeviceTrustSigningKeyLocation(ReadOnly read_only);
// Returns the token used to enroll this chrome instance for machine level
// user cloud policies. Returns an empty string if this machine should not
// be enrolled.
static std::wstring GetCloudManagementEnrollmentToken();
// Returns true if cloud management enrollment is mandatory.
static bool ShouldCloudManagementBlockOnFailure();
// Returns the localized name of the browser.
static std::wstring GetDisplayName();
// Returns the app description for shortcuts.
static std::wstring GetAppDescription();
// Returns the name of the browser's publisher.
static std::wstring GetPublisherName();
// Returns the name of Chrome's shortcut in the Start Menu (among other
// places).
static std::wstring GetShortcutName();
// Returns the name of the subdirectory in which Chrome's Start Menu shortcut
// was once placed. This remains purely to migrate old installs to the new
// style.
static std::wstring GetChromeShortcutDirNameDeprecated();
// Returns the name of the subdirectory in the Start Menu in which Chrome
// apps' shortcuts are placed.
static std::wstring GetChromeAppsShortcutDirName();
// Returns the long description of Chrome used when registering as a browser
// with Windows.
static std::wstring GetLongAppDescription();
// Converts a product GUID into a SQuished gUID that is used for MSI installer
// registry entries.
static std::wstring GuidToSquid(std::wstring_view guid);
};
#endif // CHROME_INSTALLER_UTIL_INSTALL_UTIL_H_