Index: client/install_self.cc |
diff --git a/client/install_self.cc b/client/install_self.cc |
deleted file mode 100644 |
index 601055b822a710c34c604116803ffc308ca2133b..0000000000000000000000000000000000000000 |
--- a/client/install_self.cc |
+++ /dev/null |
@@ -1,411 +0,0 @@ |
-// Copyright 2007-2010 Google Inc. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
-// ======================================================================== |
- |
-#include "omaha/client/install_self.h" |
-#include "omaha/client/install_self_internal.h" |
-#include "omaha/base/debug.h" |
-#include "omaha/base/error.h" |
-#include "omaha/base/logging.h" |
-#include "omaha/base/omaha_version.h" |
-#include "omaha/base/reg_key.h" |
-#include "omaha/base/string.h" |
-#include "omaha/base/utils.h" |
-#include "omaha/base/vistautil.h" |
-#include "omaha/base/xml_utils.h" |
-#include "omaha/client/client_utils.h" |
-#include "omaha/common/app_registry_utils.h" |
-#include "omaha/common/command_line.h" |
-#include "omaha/common/const_cmd_line.h" |
-#include "omaha/common/config_manager.h" |
-#include "omaha/common/const_goopdate.h" |
-#include "omaha/common/ping.h" |
-#include "omaha/setup/setup.h" |
-#include "omaha/setup/setup_metrics.h" |
- |
-namespace omaha { |
- |
-namespace install_self { |
- |
-namespace { |
- |
-// Returns whether elevation is required. |
-bool IsElevationRequired(bool is_machine) { |
- return is_machine && !vista_util::IsUserAdmin(); |
-} |
- |
-} // namespace |
- |
-namespace internal { |
- |
-HRESULT DoSelfUpdate(bool is_machine, int* extra_code1) { |
- ASSERT1(extra_code1); |
- |
- *extra_code1 = 0; |
- |
- HRESULT hr = DoInstallSelf(is_machine, true, false, false, extra_code1); |
- if (FAILED(hr)) { |
- PersistUpdateErrorInfo(is_machine, hr, *extra_code1, GetVersionString()); |
- return hr; |
- } |
- |
- return S_OK; |
-} |
- |
-// Does not need to update the UI during Omaha install. This should be quick |
-// with a simple throbbing UI. UI will transition when product install begins. |
-HRESULT DoInstallSelf(bool is_machine, |
- bool is_self_update, |
- bool is_eula_required, |
- bool set_keepalive, |
- int* extra_code1) { |
- ASSERT1(extra_code1); |
- ASSERT1(!is_self_update || !is_eula_required); |
- ASSERT1(!IsElevationRequired(is_machine)); |
- |
- *extra_code1 = 0; |
- |
- // TODO(omaha3): This needs to be in some type of lock(s) when |
- // !is_eula_required. See comments for SetEulaNotAccepted. |
- // TODO(omaha3): Integrate CL 11232530 - fix for bug 1866730 - from mainline. |
- // The Omaha 2 implementation of EULA [not] accepted was completely changed in |
- // this CL, which has not been integrated yet. |
- // TODO(omaha3): Code running in install-related processes before this point |
- // need to check for /eularequired before sending pings OR we need to move |
- // this before any pings can be sent. Even the latter is insufficient for |
- // the non-elevated machine install instance on Vista. |
- HRESULT hr = SetEulaRequiredState(is_machine, is_eula_required); |
- if (FAILED(hr)) { |
- return hr; |
- } |
- |
- // Checking system requirements here keeps requirements checks for other |
- // modules out of Setup. |
- // It is possible that an older metainstaller would fail the install for |
- // system requirements that are not required for the installed version when |
- // doing a handoff install. |
- hr = CheckSystemRequirements(); |
- if (FAILED(hr)) { |
- return hr; |
- } |
- |
- Setup setup(is_machine); |
- setup.set_is_self_update(is_self_update); |
- hr = setup.Install(set_keepalive); |
- *extra_code1 = setup.extra_code1(); |
- |
- if (FAILED(hr)) { |
- CORE_LOG(LE, (_T("[Setup::Install failed][0x%08x]"), hr)); |
- return hr; |
- } |
- |
- // All Omaha installs are "offline" because there is no update check. |
- const CString omaha_client_state_key_path = |
- ConfigManager::Instance()->registry_client_state_goopdate(is_machine); |
- app_registry_utils::PersistSuccessfulInstall(omaha_client_state_key_path, |
- is_self_update, |
- !is_self_update); // is_offline |
- |
- CORE_LOG(L1, (_T("[Setup successfully completed]"))); |
- |
- return S_OK; |
-} |
- |
-HRESULT CheckSystemRequirements() { |
- // Validate that key OS components are installed. |
- if (!HasXmlParser()) { |
- return GOOPDATE_E_RUNNING_INFERIOR_MSXML; |
- } |
- |
- return S_OK; |
-} |
- |
-bool HasXmlParser() { |
- CComPtr<IXMLDOMDocument> my_xmldoc; |
- HRESULT hr = CoCreateSafeDOMDocument(&my_xmldoc); |
- const bool ret = SUCCEEDED(hr); |
- CORE_LOG(L3, (_T("[HasXmlParser returned %d][0x%08x]"), ret, hr)); |
- return ret; |
-} |
- |
-// Failing to set the state fails installation because this would prevent |
-// updates or allow updates that should not be allowed. |
-HRESULT SetEulaRequiredState(bool is_machine, bool is_eula_required) { |
- ASSERT1(!IsElevationRequired(is_machine)); |
- |
- const bool eula_accepted = !is_eula_required; |
- HRESULT hr = eula_accepted ? SetEulaAccepted(is_machine) : |
- SetEulaNotAccepted(is_machine); |
- if (FAILED(hr)) { |
- CORE_LOG(LE, (_T("[set EULA accepted state failed][accepted=%d][0x%08x]"), |
- eula_accepted, hr)); |
- return hr; |
- } |
- |
- return S_OK; |
-} |
- |
-// Does not write the registry if Google Update is already installed as |
-// determined by the presence of 2 or more registered apps. In those cases, we |
-// assume the existing EULA state is correct and do not want to disable updates |
-// for an existing installation. |
-// Assumes it is called with appropriate synchronization protection such that it |
-// can reliably check the number of registered clients. |
-// TODO(omaha3): How do we assure the above assumption? |
-HRESULT SetEulaNotAccepted(bool is_machine) { |
- CORE_LOG(L4, (_T("[SetEulaNotAccepted][%d]"), is_machine)); |
- |
- size_t num_clients(0); |
- if (SUCCEEDED(app_registry_utils::GetNumClients(is_machine, &num_clients)) && |
- num_clients >= 2) { |
- CORE_LOG(L4, (_T(" [Apps registered. Not setting eulaaccepted=0.]"))); |
- return S_OK; |
- } |
- |
- const ConfigManager* cm = ConfigManager::Instance(); |
- return RegKey::SetValue(cm->registry_update(is_machine), |
- kRegValueOmahaEulaAccepted, |
- static_cast<DWORD>(0)); |
-} |
- |
-HRESULT SetInstallationId(const CString& omaha_client_state_key_path, |
- const GUID& iid) { |
- if (GUID_NULL != iid) { |
- return RegKey::SetValue(omaha_client_state_key_path, |
- kRegValueInstallationId, |
- GuidToString(iid)); |
- } |
- |
- return S_OK; |
-} |
- |
-// Persist experiment labels that are specific to Google Update itself during |
-// an initial install. These are specified in a tag using "omahaexperiments"; |
-// once it's on the machine, Google Update's experiment labels will be read |
-// and modified like any other app on the system. |
-HRESULT SetExperimentLabels(const CString& omaha_client_state_key_path, |
- const CString& experiment_labels) { |
- if (!experiment_labels.IsEmpty()) { |
- return RegKey::SetValue(omaha_client_state_key_path, |
- kRegValueExperimentLabels, |
- experiment_labels); |
- } |
- |
- return S_OK; |
-} |
- |
-void PersistUpdateErrorInfo(bool is_machine, |
- HRESULT error, |
- int extra_code1, |
- const CString& version) { |
- const TCHAR* update_key_name = |
- ConfigManager::Instance()->registry_update(is_machine); |
- VERIFY1(SUCCEEDED(RegKey::SetValue(update_key_name, |
- kRegValueSelfUpdateErrorCode, |
- static_cast<DWORD>(error)))); |
- VERIFY1(SUCCEEDED(RegKey::SetValue(update_key_name, |
- kRegValueSelfUpdateExtraCode1, |
- static_cast<DWORD>(extra_code1)))); |
- VERIFY1(SUCCEEDED(RegKey::SetValue(update_key_name, |
- kRegValueSelfUpdateVersion, |
- version))); |
-} |
- |
-} // namespace internal |
- |
-// Returns false if the values cannot be deleted to avoid skewing the log data |
-// with a single user pinging repeatedly with the same data. |
-bool ReadAndClearUpdateErrorInfo(bool is_machine, |
- DWORD* error_code, |
- DWORD* extra_code1, |
- CString* version) { |
- ASSERT1(error_code); |
- ASSERT1(extra_code1); |
- ASSERT1(version); |
- |
- const TCHAR* update_key_name = |
- ConfigManager::Instance()->registry_update(is_machine); |
- RegKey update_key; |
- HRESULT hr = update_key.Open(update_key_name); |
- if (FAILED(hr)) { |
- ASSERT1(false); |
- return false; |
- } |
- |
- if (!update_key.HasValue(kRegValueSelfUpdateErrorCode)) { |
- ASSERT1(!update_key.HasValue(kRegValueSelfUpdateExtraCode1)); |
- return false; |
- } |
- |
- VERIFY1(SUCCEEDED(update_key.GetValue(kRegValueSelfUpdateErrorCode, |
- error_code))); |
- ASSERT1(FAILED(*error_code)); |
- |
- VERIFY1(SUCCEEDED(update_key.GetValue(kRegValueSelfUpdateExtraCode1, |
- extra_code1))); |
- |
- VERIFY1(SUCCEEDED(update_key.GetValue(kRegValueSelfUpdateVersion, version))); |
- |
- if (FAILED(update_key.DeleteValue(kRegValueSelfUpdateErrorCode)) || |
- FAILED(update_key.DeleteValue(kRegValueSelfUpdateExtraCode1)) || |
- FAILED(update_key.DeleteValue(kRegValueSelfUpdateVersion))) { |
- ASSERT1(false); |
- return false; |
- } |
- |
- return true; |
-} |
- |
-HRESULT SetEulaAccepted(bool is_machine) { |
- CORE_LOG(L4, (_T("[SetEulaAccepted][%d]"), is_machine)); |
- const TCHAR* update_key_name = |
- ConfigManager::Instance()->registry_update(is_machine); |
- return RegKey::HasKey(update_key_name) ? |
- RegKey::DeleteValue(update_key_name, kRegValueOmahaEulaAccepted) : |
- S_OK; |
-} |
- |
-HRESULT InstallSelf(bool is_machine, |
- bool is_eula_required, |
- bool is_oem_install, |
- const CString& current_version, |
- const CString& install_source, |
- const CommandLineExtraArgs& extra_args, |
- const CString& session_id, |
- int* extra_code1) { |
- CORE_LOG(L2, (_T("[InstallSelf]"))); |
- |
- HRESULT hr = internal::DoInstallSelf(is_machine, |
- false, |
- is_eula_required, |
- extra_args.runtime_only, |
- extra_code1); |
- if (FAILED(hr)) { |
- CORE_LOG(LE, (_T("[DoInstallSelf failed][0x%08x]"), hr)); |
- return hr; |
- } |
- |
- // Set Omaha's optional IID, experiment labels, and branding. |
- // IID and experiment labels are always written on install; branding will |
- // only be written if no branding exists, which should only be true on the |
- // first install. |
- const CString omaha_client_state_key_path = |
- ConfigManager::Instance()->registry_client_state_goopdate(is_machine); |
- |
- // TODO(omaha): move SetInstallationId to app_registry_utils |
- VERIFY1(SUCCEEDED(internal::SetInstallationId(omaha_client_state_key_path, |
- extra_args.installation_id))); |
- VERIFY1(SUCCEEDED(internal::SetExperimentLabels( |
- omaha_client_state_key_path, |
- extra_args.experiment_labels))); |
- VERIFY1(SUCCEEDED(app_registry_utils::SetGoogleUpdateBranding( |
- omaha_client_state_key_path, |
- extra_args.brand_code, |
- extra_args.client_id))); |
- |
- if (is_eula_required || is_oem_install) { |
- return S_OK; |
- } |
- |
- // Send a successful EVENT_INSTALL_COMPLETE ping and do not wait for the |
- // completion of the ping. This reduces the overall latency of Omaha |
- // installs. The 'curent_version' parameter represent the version of |
- // Omaha before the setup has run. |
- Ping install_ping(is_machine, session_id, install_source); |
- PingEventPtr setup_install_complete_ping_event( |
- new PingEvent(PingEvent::EVENT_INSTALL_COMPLETE, |
- PingEvent::EVENT_RESULT_SUCCESS, |
- hr, |
- *extra_code1)); |
- const CString next_version(GetVersionString()); |
- install_ping.LoadAppDataFromExtraArgs(extra_args); |
- install_ping.BuildOmahaPing(current_version, |
- next_version, |
- setup_install_complete_ping_event); |
- HRESULT send_result = install_ping.Send(true); |
- if (FAILED(send_result)) { |
- CORE_LOG(LW, (_T("[InstallPing::Send failed][0x%x]"), send_result)); |
- } |
- |
- return S_OK; |
-} |
- |
-HRESULT UpdateSelf(bool is_machine, const CString& session_id) { |
- CORE_LOG(L2, (_T("[UpdateSelf]"))); |
- |
- ++metric_setup_update_self_total; |
- |
- // 'current_version' corresponds to the value of 'pv' read from the registry. |
- CString current_version; |
- app_registry_utils::GetAppVersion(is_machine, |
- kGoogleUpdateAppId, |
- ¤t_version); |
- |
- int extra_code1 = 0; |
- const HRESULT hr = internal::DoSelfUpdate(is_machine, &extra_code1); |
- if (SUCCEEDED(hr)) { |
- ++metric_setup_update_self_succeeded; |
- } else { |
- CORE_LOG(LE, (_T("[DoSelfUpdate failed][0x%08x]"), hr)); |
- } |
- |
- // If a self-update failed because an uninstall of that Omaha is in progress, |
- // don't bother with an update failure ping; the uninstall ping will suffice. |
- if (hr == GOOPDATE_E_FAILED_TO_GET_LOCK_UNINSTALL_PROCESS_RUNNING) { |
- return hr; |
- } |
- |
- if (!ConfigManager::Instance()->CanUseNetwork(is_machine)) { |
- return hr; |
- } |
- |
- // Send an update complete ping and wait for send to complete. |
- PingEvent::Results result = SUCCEEDED(hr) ? |
- PingEvent::EVENT_RESULT_SUCCESS : |
- PingEvent::EVENT_RESULT_ERROR; |
- |
- const CString next_version(GetVersionString()); |
- |
- PingEventPtr update_complete_ping_event( |
- new PingEvent(PingEvent::EVENT_UPDATE_COMPLETE, result, hr, extra_code1)); |
- |
- Ping ping(is_machine, session_id, kCmdLineInstallSource_SelfUpdate); |
- ping.LoadOmahaDataFromRegistry(); |
- ping.BuildOmahaPing(current_version, |
- next_version, |
- update_complete_ping_event); |
- ping.Send(false); |
- |
- return hr; |
-} |
- |
-HRESULT Repair(bool is_machine) { |
- CORE_LOG(L2, (_T("[Repair]"))); |
- int extra_code1 = 0; |
- return internal::DoSelfUpdate(is_machine, &extra_code1); |
-} |
- |
-void CheckInstallStateConsistency(bool is_machine) { |
- Setup::CheckInstallStateConsistency(is_machine); |
-} |
- |
-HRESULT UninstallSelf(bool is_machine, bool send_uninstall_ping) { |
- CORE_LOG(L2, (_T("[UninstallSelf]"))); |
- Setup setup(is_machine); |
- return setup.Uninstall(send_uninstall_ping); |
-} |
- |
-} // namespace install_self |
- |
-} // namespace omaha |