| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Implementation of the installation validator. | 5 // Implementation of the installation validator. |
| 6 | 6 |
| 7 #include "chrome/installer/util/installation_validator.h" | 7 #include "chrome/installer/util/installation_validator.h" |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <set> | 10 #include <set> |
| 11 | 11 |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/version.h" | 13 #include "base/version.h" |
| 14 #include "chrome/installer/util/browser_distribution.h" | 14 #include "chrome/installer/util/browser_distribution.h" |
| 15 #include "chrome/installer/util/helper.h" | 15 #include "chrome/installer/util/helper.h" |
| 16 #include "chrome/installer/util/installation_state.h" | 16 #include "chrome/installer/util/installation_state.h" |
| 17 | 17 |
| 18 namespace installer { | 18 namespace installer { |
| 19 | 19 |
| 20 BrowserDistribution::Type | 20 BrowserDistribution::Type |
| 21 InstallationValidator::ChromeRules::distribution_type() const { | 21 InstallationValidator::ChromeRules::distribution_type() const { |
| 22 return BrowserDistribution::CHROME_BROWSER; | 22 return BrowserDistribution::CHROME_BROWSER; |
| 23 } | 23 } |
| 24 | 24 |
| 25 void InstallationValidator::ChromeRules::AddProductSwitchExpectations( | 25 void InstallationValidator::ChromeRules::AddUninstallSwitchExpectations( |
| 26 const InstallationState& machine_state, | 26 const InstallationState& machine_state, |
| 27 bool system_install, | 27 bool system_install, |
| 28 const ProductState& product_state, | 28 const ProductState& product_state, |
| 29 SwitchExpectations* expectations) const { | 29 SwitchExpectations* expectations) const { |
| 30 const bool is_multi_install = | 30 const bool is_multi_install = |
| 31 product_state.uninstall_command().HasSwitch(switches::kMultiInstall); | 31 product_state.uninstall_command().HasSwitch(switches::kMultiInstall); |
| 32 | 32 |
| 33 // --chrome should be present iff --multi-install. This wasn't the case in | 33 // --chrome should be present for uninstall iff --multi-install. This wasn't |
| 34 // Chrome 10 (between r68996 and r72497), though, so consider it optional. | 34 // the case in Chrome 10 (between r68996 and r72497), though, so consider it |
| 35 // optional. |
| 35 | 36 |
| 36 // --chrome-frame --ready-mode should be present iff CF in ready mode. | 37 // --chrome-frame --ready-mode should be present for uninstall iff CF in ready |
| 38 // mode. |
| 37 const ProductState* cf_state = | 39 const ProductState* cf_state = |
| 38 machine_state.GetProductState(system_install, | 40 machine_state.GetProductState(system_install, |
| 39 BrowserDistribution::CHROME_FRAME); | 41 BrowserDistribution::CHROME_FRAME); |
| 40 const bool ready_mode = | 42 const bool ready_mode = |
| 41 cf_state != NULL && | 43 cf_state != NULL && |
| 42 cf_state->uninstall_command().HasSwitch(switches::kChromeFrameReadyMode); | 44 cf_state->uninstall_command().HasSwitch(switches::kChromeFrameReadyMode); |
| 43 expectations->push_back(std::make_pair(std::string(switches::kChromeFrame), | 45 expectations->push_back(std::make_pair(std::string(switches::kChromeFrame), |
| 44 ready_mode)); | 46 ready_mode)); |
| 45 expectations->push_back( | 47 expectations->push_back( |
| 46 std::make_pair(std::string(switches::kChromeFrameReadyMode), ready_mode)); | 48 std::make_pair(std::string(switches::kChromeFrameReadyMode), ready_mode)); |
| 47 } | 49 } |
| 48 | 50 |
| 51 void InstallationValidator::ChromeRules::AddRenameSwitchExpectations( |
| 52 const InstallationState& machine_state, |
| 53 bool system_install, |
| 54 const ProductState& product_state, |
| 55 SwitchExpectations* expectations) const { |
| 56 const bool is_multi_install = |
| 57 product_state.uninstall_command().HasSwitch(switches::kMultiInstall); |
| 58 |
| 59 // --chrome should not be present for rename. It was for a time, so we'll be |
| 60 // lenient so that mini_installer tests pass. |
| 61 |
| 62 // --chrome-frame --ready-mode should never be present. |
| 63 expectations->push_back( |
| 64 std::make_pair(std::string(switches::kChromeFrame), false)); |
| 65 expectations->push_back( |
| 66 std::make_pair(std::string(switches::kChromeFrameReadyMode), false)); |
| 67 } |
| 68 |
| 49 bool InstallationValidator::ChromeRules::UsageStatsAllowed( | 69 bool InstallationValidator::ChromeRules::UsageStatsAllowed( |
| 50 const ProductState& product_state) const { | 70 const ProductState& product_state) const { |
| 51 // Products must not have usagestats consent values when multi-install | 71 // Products must not have usagestats consent values when multi-install |
| 52 // (only the multi-install binaries may). | 72 // (only the multi-install binaries may). |
| 53 return !product_state.is_multi_install(); | 73 return !product_state.is_multi_install(); |
| 54 } | 74 } |
| 55 | 75 |
| 56 BrowserDistribution::Type | 76 BrowserDistribution::Type |
| 57 InstallationValidator::ChromeFrameRules::distribution_type() const { | 77 InstallationValidator::ChromeFrameRules::distribution_type() const { |
| 58 return BrowserDistribution::CHROME_FRAME; | 78 return BrowserDistribution::CHROME_FRAME; |
| 59 } | 79 } |
| 60 | 80 |
| 61 void InstallationValidator::ChromeFrameRules::AddProductSwitchExpectations( | 81 void InstallationValidator::ChromeFrameRules::AddUninstallSwitchExpectations( |
| 62 const InstallationState& machine_state, | 82 const InstallationState& machine_state, |
| 63 bool system_install, | 83 bool system_install, |
| 64 const ProductState& product_state, | 84 const ProductState& product_state, |
| 65 SwitchExpectations* expectations) const { | 85 SwitchExpectations* expectations) const { |
| 66 // --chrome-frame must be present. | 86 // --chrome-frame must be present. |
| 67 expectations->push_back(std::make_pair(std::string(switches::kChromeFrame), | 87 expectations->push_back(std::make_pair(std::string(switches::kChromeFrame), |
| 68 true)); | 88 true)); |
| 69 // --chrome must not be present. | 89 // --chrome must not be present. |
| 70 expectations->push_back(std::make_pair(std::string(switches::kChrome), | 90 expectations->push_back(std::make_pair(std::string(switches::kChrome), |
| 71 false)); | 91 false)); |
| 72 } | 92 } |
| 73 | 93 |
| 94 void InstallationValidator::ChromeFrameRules::AddRenameSwitchExpectations( |
| 95 const InstallationState& machine_state, |
| 96 bool system_install, |
| 97 const ProductState& product_state, |
| 98 SwitchExpectations* expectations) const { |
| 99 // --chrome-frame must be present for SxS rename. |
| 100 expectations->push_back(std::make_pair(std::string(switches::kChromeFrame), |
| 101 !product_state.is_multi_install())); |
| 102 // --chrome must not be present. |
| 103 expectations->push_back(std::make_pair(std::string(switches::kChrome), |
| 104 false)); |
| 105 } |
| 106 |
| 74 bool InstallationValidator::ChromeFrameRules::UsageStatsAllowed( | 107 bool InstallationValidator::ChromeFrameRules::UsageStatsAllowed( |
| 75 const ProductState& product_state) const { | 108 const ProductState& product_state) const { |
| 76 // Products must not have usagestats consent values when multi-install | 109 // Products must not have usagestats consent values when multi-install |
| 77 // (only the multi-install binaries may). | 110 // (only the multi-install binaries may). |
| 78 return !product_state.is_multi_install(); | 111 return !product_state.is_multi_install(); |
| 79 } | 112 } |
| 80 | 113 |
| 81 BrowserDistribution::Type | 114 BrowserDistribution::Type |
| 82 InstallationValidator::ChromeBinariesRules::distribution_type() const { | 115 InstallationValidator::ChromeBinariesRules::distribution_type() const { |
| 83 return BrowserDistribution::CHROME_BINARIES; | 116 return BrowserDistribution::CHROME_BINARIES; |
| 84 } | 117 } |
| 85 | 118 |
| 86 void InstallationValidator::ChromeBinariesRules::AddProductSwitchExpectations( | 119 void InstallationValidator::ChromeBinariesRules::AddUninstallSwitchExpectations( |
| 87 const InstallationState& machine_state, | 120 const InstallationState& machine_state, |
| 88 bool system_install, | 121 bool system_install, |
| 89 const ProductState& product_state, | 122 const ProductState& product_state, |
| 90 SwitchExpectations* expectations) const { | 123 SwitchExpectations* expectations) const { |
| 91 NOTREACHED(); | 124 NOTREACHED(); |
| 92 } | 125 } |
| 93 | 126 |
| 127 void InstallationValidator::ChromeBinariesRules::AddRenameSwitchExpectations( |
| 128 const InstallationState& machine_state, |
| 129 bool system_install, |
| 130 const ProductState& product_state, |
| 131 SwitchExpectations* expectations) const { |
| 132 NOTREACHED(); |
| 133 } |
| 134 |
| 94 bool InstallationValidator::ChromeBinariesRules::UsageStatsAllowed( | 135 bool InstallationValidator::ChromeBinariesRules::UsageStatsAllowed( |
| 95 const ProductState& product_state) const { | 136 const ProductState& product_state) const { |
| 96 // UsageStats consent values are always allowed on the binaries. | 137 // UsageStats consent values are always allowed on the binaries. |
| 97 return true; | 138 return true; |
| 98 } | 139 } |
| 99 | 140 |
| 100 // static | 141 // static |
| 101 const InstallationValidator::InstallationType | 142 const InstallationValidator::InstallationType |
| 102 InstallationValidator::kInstallationTypes[] = { | 143 InstallationValidator::kInstallationTypes[] = { |
| 103 NO_PRODUCTS, | 144 NO_PRODUCTS, |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 ValidateSetupPath(ctx, command.GetProgram(), "uninstaller", is_valid); | 406 ValidateSetupPath(ctx, command.GetProgram(), "uninstaller", is_valid); |
| 366 | 407 |
| 367 const bool is_multi_install = ctx.state.is_multi_install(); | 408 const bool is_multi_install = ctx.state.is_multi_install(); |
| 368 SwitchExpectations expected; | 409 SwitchExpectations expected; |
| 369 | 410 |
| 370 expected.push_back(std::make_pair(std::string(switches::kUninstall), true)); | 411 expected.push_back(std::make_pair(std::string(switches::kUninstall), true)); |
| 371 expected.push_back(std::make_pair(std::string(switches::kSystemLevel), | 412 expected.push_back(std::make_pair(std::string(switches::kSystemLevel), |
| 372 ctx.system_install)); | 413 ctx.system_install)); |
| 373 expected.push_back(std::make_pair(std::string(switches::kMultiInstall), | 414 expected.push_back(std::make_pair(std::string(switches::kMultiInstall), |
| 374 is_multi_install)); | 415 is_multi_install)); |
| 375 ctx.rules.AddProductSwitchExpectations(ctx.machine_state, | 416 ctx.rules.AddUninstallSwitchExpectations(ctx.machine_state, |
| 376 ctx.system_install, | 417 ctx.system_install, |
| 377 ctx.state, &expected); | 418 ctx.state, |
| 419 &expected); |
| 378 | 420 |
| 379 ValidateCommandExpectations(ctx, command, expected, source, is_valid); | 421 ValidateCommandExpectations(ctx, command, expected, source, is_valid); |
| 380 } | 422 } |
| 381 | 423 |
| 382 // Validates the rename command for the product described by |ctx|. | 424 // Validates the rename command for the product described by |ctx|. |
| 383 void InstallationValidator::ValidateRenameCommand(const ProductContext& ctx, | 425 void InstallationValidator::ValidateRenameCommand(const ProductContext& ctx, |
| 384 bool* is_valid) { | 426 bool* is_valid) { |
| 385 DCHECK(is_valid); | 427 DCHECK(is_valid); |
| 386 DCHECK(!ctx.state.rename_cmd().empty()); | 428 DCHECK(!ctx.state.rename_cmd().empty()); |
| 387 | 429 |
| 388 CommandLine command = CommandLine::FromString(ctx.state.rename_cmd()); | 430 CommandLine command = CommandLine::FromString(ctx.state.rename_cmd()); |
| 389 | 431 |
| 390 ValidateSetupPath(ctx, command.GetProgram(), "in-use renamer", is_valid); | 432 ValidateSetupPath(ctx, command.GetProgram(), "in-use renamer", is_valid); |
| 391 | 433 |
| 392 SwitchExpectations expected; | 434 SwitchExpectations expected; |
| 393 | 435 |
| 394 expected.push_back(std::make_pair(std::string(switches::kRenameChromeExe), | 436 expected.push_back(std::make_pair(std::string(switches::kRenameChromeExe), |
| 395 true)); | 437 true)); |
| 396 expected.push_back(std::make_pair(std::string(switches::kSystemLevel), | 438 expected.push_back(std::make_pair(std::string(switches::kSystemLevel), |
| 397 ctx.system_install)); | 439 ctx.system_install)); |
| 398 expected.push_back(std::make_pair(std::string(switches::kMultiInstall), | 440 expected.push_back(std::make_pair(std::string(switches::kMultiInstall), |
| 399 ctx.state.is_multi_install())); | 441 ctx.state.is_multi_install())); |
| 442 ctx.rules.AddRenameSwitchExpectations(ctx.machine_state, |
| 443 ctx.system_install, |
| 444 ctx.state, |
| 445 &expected); |
| 400 | 446 |
| 401 ValidateCommandExpectations(ctx, command, expected, "in-use renamer", | 447 ValidateCommandExpectations(ctx, command, expected, "in-use renamer", |
| 402 is_valid); | 448 is_valid); |
| 403 } | 449 } |
| 404 | 450 |
| 405 // Validates the "opv" and "cmd" values for the product described in |ctx|. | 451 // Validates the "opv" and "cmd" values for the product described in |ctx|. |
| 406 void InstallationValidator::ValidateOldVersionValues( | 452 void InstallationValidator::ValidateOldVersionValues( |
| 407 const ProductContext& ctx, | 453 const ProductContext& ctx, |
| 408 bool* is_valid) { | 454 bool* is_valid) { |
| 409 DCHECK(is_valid); | 455 DCHECK(is_valid); |
| (...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 577 InstallationType* type) { | 623 InstallationType* type) { |
| 578 DCHECK(type); | 624 DCHECK(type); |
| 579 InstallationState machine_state; | 625 InstallationState machine_state; |
| 580 | 626 |
| 581 machine_state.Initialize(); | 627 machine_state.Initialize(); |
| 582 | 628 |
| 583 return ValidateInstallationTypeForState(machine_state, system_level, type); | 629 return ValidateInstallationTypeForState(machine_state, system_level, type); |
| 584 } | 630 } |
| 585 | 631 |
| 586 } // namespace installer | 632 } // namespace installer |
| OLD | NEW |