| Index: chrome/installer/setup/install_worker.cc
|
| diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc
|
| index 1713fe5884a2077c9cf9376eba5bce734372bab2..62bbbf17261a5d6e4a830b69d57ff95269b0c8a5 100644
|
| --- a/chrome/installer/setup/install_worker.cc
|
| +++ b/chrome/installer/setup/install_worker.cc
|
| @@ -36,6 +36,7 @@
|
| #include "chrome/installer/util/callback_work_item.h"
|
| #include "chrome/installer/util/conditional_work_item_list.h"
|
| #include "chrome/installer/util/create_reg_key_work_item.h"
|
| +#include "chrome/installer/util/firewall_manager.h"
|
| #include "chrome/installer/util/google_update_constants.h"
|
| #include "chrome/installer/util/helper.h"
|
| #include "chrome/installer/util/install_util.h"
|
| @@ -255,6 +256,55 @@ void AddInstallExtensionCommandWorkItem(const InstallerState& installer_state,
|
| work_item_list);
|
| }
|
|
|
| +// A callback invoked by |work_item| that adds firewall rules for Chrome. Rules
|
| +// are left in-place on rollback unless |remove_on_rollback| is true. This is
|
| +// the case for new installs only. Updates and overinstalls leave the rule
|
| +// in-place on rollback since a previous install of Chrome will be used in that
|
| +// case.
|
| +bool AddFirewallRulesCallback(bool system_level,
|
| + BrowserDistribution* dist,
|
| + const base::FilePath& chrome_path,
|
| + bool remove_on_rollback,
|
| + const CallbackWorkItem& work_item) {
|
| + // There is no work to do on rollback if this is not a new install.
|
| + if (work_item.IsRollback() && !remove_on_rollback)
|
| + return true;
|
| +
|
| + scoped_ptr<FirewallManager> firewall_manager(
|
| + FirewallManager::Create(dist, chrome_path));
|
| + if (!firewall_manager) {
|
| + LOG(ERROR) << "Failed creating a FirewallManager to adjust rules."
|
| + " Continuing with install.";
|
| + return true;
|
| + }
|
| +
|
| + if (work_item.IsRollback()) {
|
| + firewall_manager->DeleteUDPFirewallRule();
|
| + return true;
|
| + }
|
| +
|
| + // Adding the firewall rule is expected to fail for user-level installs on
|
| + // Vista+. Try anyway in case the installer is running elevated.
|
| + if (!firewall_manager->AddUDPFirewallRuleIfAbsent() && !system_level)
|
| + LOG(ERROR) << "Failed to add UDP firewall rule. Continuing with install.";
|
| +
|
| + // Don't abort installation if the firewall rule couldn't be added.
|
| + return true;
|
| +}
|
| +
|
| +// Adds work items to |list| to create firewall rules.
|
| +void AddFirewallRulesWorkItems(const InstallerState& installer_state,
|
| + BrowserDistribution* dist,
|
| + bool is_new_install,
|
| + WorkItemList* list) {
|
| + list->AddCallbackWorkItem(
|
| + base::Bind(&AddFirewallRulesCallback,
|
| + installer_state.system_install(),
|
| + dist,
|
| + installer_state.target_path().Append(kChromeExe),
|
| + is_new_install));
|
| +}
|
| +
|
| // Returns the basic CommandLine to setup.exe for a quick-enable operation on
|
| // the binaries. This will unconditionally include --multi-install as well as
|
| // --verbose-logging if the current installation was launched with
|
| @@ -345,6 +395,7 @@ void AddProductSpecificWorkItems(const InstallationState& original_state,
|
| const InstallerState& installer_state,
|
| const base::FilePath& setup_path,
|
| const Version& new_version,
|
| + bool is_new_install,
|
| WorkItemList* list) {
|
| const Products& products = installer_state.products();
|
| for (Products::const_iterator it = products.begin(); it < products.end();
|
| @@ -359,6 +410,8 @@ void AddProductSpecificWorkItems(const InstallationState& original_state,
|
| list);
|
| AddInstallExtensionCommandWorkItem(installer_state, original_state,
|
| setup_path, new_version, p, list);
|
| + AddFirewallRulesWorkItems(installer_state, p.distribution(),
|
| + is_new_install, list);
|
| }
|
| if (p.is_chrome_binaries()) {
|
| AddQueryEULAAcceptanceWorkItems(
|
| @@ -1178,7 +1231,8 @@ void AddInstallWorkItems(const InstallationState& original_state,
|
| // Add any remaining work items that involve special settings for
|
| // each product.
|
| AddProductSpecificWorkItems(original_state, installer_state, setup_path,
|
| - new_version, install_list);
|
| + new_version, current_version == NULL,
|
| + install_list);
|
|
|
| // Copy over brand, usagestats, and other values.
|
| AddGoogleUpdateWorkItems(original_state, installer_state, install_list);
|
|
|