| Index: chrome/installer/setup/setup_main.cc
|
| ===================================================================
|
| --- chrome/installer/setup/setup_main.cc (revision 89207)
|
| +++ chrome/installer/setup/setup_main.cc (working copy)
|
| @@ -252,6 +252,83 @@
|
| return ret;
|
| }
|
|
|
| +// For each product that is being updated (i.e., already installed at an earlier
|
| +// version), see if that product has an update policy override that differs from
|
| +// that for the binaries. If any are found, fail with an error indicating that
|
| +// the Group Policy settings are in an inconsistent state. Do not do this test
|
| +// for same-version installs, since it would be unkind to block attempts to
|
| +// repair a corrupt installation. This function returns false when installation
|
| +// should be halted, in which case |status| contains the relevant exit code and
|
| +// the proper installer result has been written to the registry.
|
| +bool CheckGroupPolicySettings(const InstallationState& original_state,
|
| + const InstallerState& installer_state,
|
| + const Version& new_version,
|
| + installer::InstallStatus* status) {
|
| +#if !defined(GOOGLE_CHROME_BUILD)
|
| + // Chromium builds are not updated via Google Update, so there are no
|
| + // Group Policy settings to consult.
|
| + return true;
|
| +#else
|
| + DCHECK(status);
|
| +
|
| + // Single installs are always in good shape.
|
| + if (!installer_state.is_multi_install())
|
| + return true;
|
| +
|
| + bool settings_are_valid = true;
|
| + const bool is_system_install = installer_state.system_install();
|
| + BrowserDistribution* const binaries_dist =
|
| + installer_state.multi_package_binaries_distribution();
|
| +
|
| + // Get the update policy for the binaries.
|
| + const GoogleUpdateSettings::UpdatePolicy binaries_policy =
|
| + GoogleUpdateSettings::GetAppUpdatePolicy(binaries_dist->GetAppGuid(),
|
| + NULL);
|
| +
|
| + // Check for differing update policies for all of the products being updated.
|
| + const Products& products = installer_state.products();
|
| + Products::const_iterator scan = products.begin();
|
| + for (Products::const_iterator end = products.end(); scan != end; ++scan) {
|
| + BrowserDistribution* dist = (*scan)->distribution();
|
| + const ProductState* product_state =
|
| + original_state.GetProductState(is_system_install, dist->GetType());
|
| + // Is an earlier version of this product already installed?
|
| + if (product_state != NULL &&
|
| + product_state->version().CompareTo(new_version) < 0) {
|
| + bool is_overridden = false;
|
| + GoogleUpdateSettings::UpdatePolicy app_policy =
|
| + GoogleUpdateSettings::GetAppUpdatePolicy(dist->GetAppGuid(),
|
| + &is_overridden);
|
| + if (is_overridden && app_policy != binaries_policy) {
|
| + LOG(ERROR) << "Found legacy Group Policy setting for "
|
| + << dist->GetAppShortCutName() << " (value: " << app_policy
|
| + << ") that does not match the setting for "
|
| + << binaries_dist->GetAppShortCutName()
|
| + << " (value: " << binaries_policy << ").";
|
| + settings_are_valid = false;
|
| + }
|
| + }
|
| + }
|
| +
|
| + if (!settings_are_valid) {
|
| + // TODO(grt): add " See http://goo.gl/+++ for details." to the end of this
|
| + // log message and to the IDS_INSTALL_INCONSISTENT_UPDATE_POLICY string once
|
| + // we have a help center article that explains why this error is being
|
| + // reported and how to resolve it.
|
| + LOG(ERROR) << "Cannot apply update on account of inconsistent "
|
| + "Google Update Group Policy settings. Use the Group Policy "
|
| + "Editor to set the update policy override for the "
|
| + << binaries_dist->GetAppShortCutName()
|
| + << " application and try again.";
|
| + *status = installer::INCONSISTENT_UPDATE_POLICY;
|
| + installer_state.WriteInstallerResult(
|
| + *status, IDS_INSTALL_INCONSISTENT_UPDATE_POLICY_BASE, NULL);
|
| + }
|
| +
|
| + return settings_are_valid;
|
| +#endif // defined(GOOGLE_CHROME_BUILD)
|
| +}
|
| +
|
| // The supported multi-install modes are:
|
| // --multi-install --chrome --chrome-frame --ready-mode
|
| // - If a non-multi Chrome Frame installation is present, Chrome Frame is
|
| @@ -526,7 +603,7 @@
|
| // currently installed product for the shared binary installation, should
|
| // (or rather must) be upgraded.
|
| VLOG(1) << "version to install: " << installer_version->GetString();
|
| - bool higher_version_installed = false;
|
| + bool proceed_with_installation = true;
|
| for (size_t i = 0; i < installer_state.products().size(); ++i) {
|
| const Product* product = installer_state.products()[i];
|
| const ProductState* product_state =
|
| @@ -535,7 +612,7 @@
|
| if (product_state != NULL &&
|
| (product_state->version().CompareTo(*installer_version) > 0)) {
|
| LOG(ERROR) << "Higher version is already installed.";
|
| - higher_version_installed = true;
|
| + proceed_with_installation = false;
|
| install_status = installer::HIGHER_VERSION_EXISTS;
|
|
|
| if (product->is_chrome()) {
|
| @@ -550,7 +627,12 @@
|
| }
|
| }
|
|
|
| - if (!higher_version_installed) {
|
| + proceed_with_installation =
|
| + proceed_with_installation &&
|
| + CheckGroupPolicySettings(original_state, installer_state,
|
| + *installer_version, &install_status);
|
| +
|
| + if (proceed_with_installation) {
|
| // We want to keep uncompressed archive (chrome.7z) that we get after
|
| // uncompressing and binary patching. Get the location for this file.
|
| FilePath archive_to_copy(
|
|
|