Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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> |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 206 app_cmd.is_auto_run_on_os_upgrade(), | 206 app_cmd.is_auto_run_on_os_upgrade(), |
| 207 "be marked to run on OS upgrade"}, | 207 "be marked to run on OS upgrade"}, |
| 208 {google_update::kRegRunAsUserField, | 208 {google_update::kRegRunAsUserField, |
| 209 app_cmd.is_run_as_user(), | 209 app_cmd.is_run_as_user(), |
| 210 "be marked to run as user"}, | 210 "be marked to run as user"}, |
| 211 }; | 211 }; |
| 212 for (int i = 0; i < arraysize(check_list); ++i) { | 212 for (int i = 0; i < arraysize(check_list); ++i) { |
| 213 bool expected = flags_exp.find(check_list[i].exp_key) != flags_exp.end(); | 213 bool expected = flags_exp.find(check_list[i].exp_key) != flags_exp.end(); |
| 214 if (check_list[i].val != expected) { | 214 if (check_list[i].val != expected) { |
| 215 *is_valid = false; | 215 *is_valid = false; |
| 216 LOG(ERROR) << ctx.dist->GetAppShortCutName() << ": " | 216 LOG(ERROR) << ctx.dist->GetDisplayName() << ": " |
|
huangs
2013/05/21 21:35:41
I don't think we should localize our logs. Please
| |
| 217 << name << " command should " << (expected ? "" : "not ") | 217 << name << " command should " << (expected ? "" : "not ") |
| 218 << check_list[i].msg << "."; | 218 << check_list[i].msg << "."; |
| 219 } | 219 } |
| 220 } | 220 } |
| 221 } | 221 } |
| 222 | 222 |
| 223 // Validates both "install-application" and "install-extension" depending on | 223 // Validates both "install-application" and "install-extension" depending on |
| 224 // what is passed in. | 224 // what is passed in. |
| 225 void InstallationValidator::ValidateInstallCommand( | 225 void InstallationValidator::ValidateInstallCommand( |
| 226 const ProductContext& ctx, | 226 const ProductContext& ctx, |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 410 for (; cmd_iterators.first != cmd_iterators.second; ++cmd_iterators.first) { | 410 for (; cmd_iterators.first != cmd_iterators.second; ++cmd_iterators.first) { |
| 411 const string16& cmd_id = cmd_iterators.first->first; | 411 const string16& cmd_id = cmd_iterators.first->first; |
| 412 // Do we have an expectation for this command? | 412 // Do we have an expectation for this command? |
| 413 expectation = the_expectations.find(cmd_id); | 413 expectation = the_expectations.find(cmd_id); |
| 414 if (expectation != the_expectations.end()) { | 414 if (expectation != the_expectations.end()) { |
| 415 (expectation->second)(ctx, cmd_iterators.first->second, is_valid); | 415 (expectation->second)(ctx, cmd_iterators.first->second, is_valid); |
| 416 // Remove this command from the set of expectations since we found it. | 416 // Remove this command from the set of expectations since we found it. |
| 417 the_expectations.erase(expectation); | 417 the_expectations.erase(expectation); |
| 418 } else { | 418 } else { |
| 419 *is_valid = false; | 419 *is_valid = false; |
| 420 LOG(ERROR) << ctx.dist->GetAppShortCutName() | 420 LOG(ERROR) << ctx.dist->GetDisplayName() |
| 421 << " has an unexpected Google Update product command named \"" | 421 << " has an unexpected Google Update product command named \"" |
| 422 << cmd_id << "\"."; | 422 << cmd_id << "\"."; |
| 423 } | 423 } |
| 424 } | 424 } |
| 425 | 425 |
| 426 // Report on any expected commands that weren't present. | 426 // Report on any expected commands that weren't present. |
| 427 CommandExpectations::const_iterator scan(the_expectations.begin()); | 427 CommandExpectations::const_iterator scan(the_expectations.begin()); |
| 428 CommandExpectations::const_iterator end(the_expectations.end()); | 428 CommandExpectations::const_iterator end(the_expectations.end()); |
| 429 for (; scan != end; ++scan) { | 429 for (; scan != end; ++scan) { |
| 430 *is_valid = false; | 430 *is_valid = false; |
| 431 LOG(ERROR) << ctx.dist->GetAppShortCutName() | 431 LOG(ERROR) << ctx.dist->GetDisplayName() |
| 432 << " is missing the Google Update product command named \"" | 432 << " is missing the Google Update product command named \"" |
| 433 << scan->first << "\"."; | 433 << scan->first << "\"."; |
| 434 } | 434 } |
| 435 } | 435 } |
| 436 | 436 |
| 437 // Validates the multi-install binaries' Google Update commands. | 437 // Validates the multi-install binaries' Google Update commands. |
| 438 void InstallationValidator::ValidateBinariesCommands( | 438 void InstallationValidator::ValidateBinariesCommands( |
| 439 const ProductContext& ctx, | 439 const ProductContext& ctx, |
| 440 bool* is_valid) { | 440 bool* is_valid) { |
| 441 DCHECK(is_valid); | 441 DCHECK(is_valid); |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 590 | 590 |
| 591 base::FilePath expected_path = installer::GetChromeInstallPath( | 591 base::FilePath expected_path = installer::GetChromeInstallPath( |
| 592 ctx.system_install, bins_dist); | 592 ctx.system_install, bins_dist); |
| 593 expected_path = expected_path | 593 expected_path = expected_path |
| 594 .AppendASCII(ctx.state.version().GetString()) | 594 .AppendASCII(ctx.state.version().GetString()) |
| 595 .Append(installer::kInstallerDir) | 595 .Append(installer::kInstallerDir) |
| 596 .Append(installer::kSetupExe); | 596 .Append(installer::kSetupExe); |
| 597 if (!base::FilePath::CompareEqualIgnoreCase(expected_path.value(), | 597 if (!base::FilePath::CompareEqualIgnoreCase(expected_path.value(), |
| 598 setup_exe.value())) { | 598 setup_exe.value())) { |
| 599 *is_valid = false; | 599 *is_valid = false; |
| 600 LOG(ERROR) << ctx.dist->GetAppShortCutName() << " path to " << purpose | 600 LOG(ERROR) << ctx.dist->GetDisplayName() << " path to " << purpose |
| 601 << " is not " << expected_path.value() << ": " | 601 << " is not " << expected_path.value() << ": " |
| 602 << setup_exe.value(); | 602 << setup_exe.value(); |
| 603 } | 603 } |
| 604 } | 604 } |
| 605 | 605 |
| 606 // Validates that |command| meets the expectations described in |expected|. | 606 // Validates that |command| meets the expectations described in |expected|. |
| 607 void InstallationValidator::ValidateCommandExpectations( | 607 void InstallationValidator::ValidateCommandExpectations( |
| 608 const ProductContext& ctx, | 608 const ProductContext& ctx, |
| 609 const CommandLine& command, | 609 const CommandLine& command, |
| 610 const SwitchExpectations& expected, | 610 const SwitchExpectations& expected, |
| 611 const string16& source, | 611 const string16& source, |
| 612 bool* is_valid) { | 612 bool* is_valid) { |
| 613 for (SwitchExpectations::size_type i = 0, size = expected.size(); i < size; | 613 for (SwitchExpectations::size_type i = 0, size = expected.size(); i < size; |
| 614 ++i) { | 614 ++i) { |
| 615 const SwitchExpectations::value_type& expectation = expected[i]; | 615 const SwitchExpectations::value_type& expectation = expected[i]; |
| 616 if (command.HasSwitch(expectation.first) != expectation.second) { | 616 if (command.HasSwitch(expectation.first) != expectation.second) { |
| 617 *is_valid = false; | 617 *is_valid = false; |
| 618 LOG(ERROR) << ctx.dist->GetAppShortCutName() << " " << source | 618 LOG(ERROR) << ctx.dist->GetDisplayName() << " " << source |
| 619 << (expectation.second ? " is missing" : " has") << " \"" | 619 << (expectation.second ? " is missing" : " has") << " \"" |
| 620 << expectation.first << "\"" | 620 << expectation.first << "\"" |
| 621 << (expectation.second ? "" : " but shouldn't") << ": " | 621 << (expectation.second ? "" : " but shouldn't") << ": " |
| 622 << command.GetCommandLineString(); | 622 << command.GetCommandLineString(); |
| 623 } | 623 } |
| 624 } | 624 } |
| 625 } | 625 } |
| 626 | 626 |
| 627 // Validates that |command|, originating from |source|, is formed properly for | 627 // Validates that |command|, originating from |source|, is formed properly for |
| 628 // the product described by |ctx| | 628 // the product described by |ctx| |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 675 // Validates the "opv" and "cmd" values for the product described in |ctx|. | 675 // Validates the "opv" and "cmd" values for the product described in |ctx|. |
| 676 void InstallationValidator::ValidateOldVersionValues( | 676 void InstallationValidator::ValidateOldVersionValues( |
| 677 const ProductContext& ctx, | 677 const ProductContext& ctx, |
| 678 bool* is_valid) { | 678 bool* is_valid) { |
| 679 DCHECK(is_valid); | 679 DCHECK(is_valid); |
| 680 | 680 |
| 681 // opv and cmd must both be present or both absent | 681 // opv and cmd must both be present or both absent |
| 682 if (ctx.state.old_version() == NULL) { | 682 if (ctx.state.old_version() == NULL) { |
| 683 if (!ctx.state.rename_cmd().empty()) { | 683 if (!ctx.state.rename_cmd().empty()) { |
| 684 *is_valid = false; | 684 *is_valid = false; |
| 685 LOG(ERROR) << ctx.dist->GetAppShortCutName() | 685 LOG(ERROR) << ctx.dist->GetDisplayName() |
| 686 << " has a rename command but no opv: " | 686 << " has a rename command but no opv: " |
| 687 << ctx.state.rename_cmd(); | 687 << ctx.state.rename_cmd(); |
| 688 } | 688 } |
| 689 } else { | 689 } else { |
| 690 if (ctx.state.rename_cmd().empty()) { | 690 if (ctx.state.rename_cmd().empty()) { |
| 691 *is_valid = false; | 691 *is_valid = false; |
| 692 LOG(ERROR) << ctx.dist->GetAppShortCutName() | 692 LOG(ERROR) << ctx.dist->GetDisplayName() |
| 693 << " has an opv but no rename command: " | 693 << " has an opv but no rename command: " |
| 694 << ctx.state.old_version()->GetString(); | 694 << ctx.state.old_version()->GetString(); |
| 695 } else { | 695 } else { |
| 696 ValidateRenameCommand(ctx, is_valid); | 696 ValidateRenameCommand(ctx, is_valid); |
| 697 } | 697 } |
| 698 } | 698 } |
| 699 } | 699 } |
| 700 | 700 |
| 701 // Validates the multi-install state of the product described in |ctx|. | 701 // Validates the multi-install state of the product described in |ctx|. |
| 702 void InstallationValidator::ValidateMultiInstallProduct( | 702 void InstallationValidator::ValidateMultiInstallProduct( |
| 703 const ProductContext& ctx, | 703 const ProductContext& ctx, |
| 704 bool* is_valid) { | 704 bool* is_valid) { |
| 705 DCHECK(is_valid); | 705 DCHECK(is_valid); |
| 706 | 706 |
| 707 const ProductState* binaries = | 707 const ProductState* binaries = |
| 708 ctx.machine_state.GetProductState(ctx.system_install, | 708 ctx.machine_state.GetProductState(ctx.system_install, |
| 709 BrowserDistribution::CHROME_BINARIES); | 709 BrowserDistribution::CHROME_BINARIES); |
| 710 if (!binaries) { | 710 if (!binaries) { |
| 711 if (ctx.dist->GetType() == BrowserDistribution::CHROME_APP_HOST) { | 711 if (ctx.dist->GetType() == BrowserDistribution::CHROME_APP_HOST) { |
| 712 if (!ctx.machine_state.GetProductState( | 712 if (!ctx.machine_state.GetProductState( |
| 713 true, // system-level | 713 true, // system-level |
| 714 BrowserDistribution::CHROME_BINARIES) && | 714 BrowserDistribution::CHROME_BINARIES) && |
| 715 !ctx.machine_state.GetProductState( | 715 !ctx.machine_state.GetProductState( |
| 716 true, // system-level | 716 true, // system-level |
| 717 BrowserDistribution::CHROME_BROWSER)) { | 717 BrowserDistribution::CHROME_BROWSER)) { |
| 718 *is_valid = false; | 718 *is_valid = false; |
| 719 LOG(ERROR) << ctx.dist->GetAppShortCutName() | 719 LOG(ERROR) << ctx.dist->GetDisplayName() |
| 720 << " (" << ctx.state.version().GetString() << ") is " | 720 << " (" << ctx.state.version().GetString() << ") is " |
| 721 << "installed without Chrome Binaries or a system-level " | 721 << "installed without Chrome Binaries or a system-level " |
| 722 << "Chrome."; | 722 << "Chrome."; |
| 723 } | 723 } |
| 724 } else { | 724 } else { |
| 725 *is_valid = false; | 725 *is_valid = false; |
| 726 LOG(ERROR) << ctx.dist->GetAppShortCutName() | 726 LOG(ERROR) << ctx.dist->GetDisplayName() |
| 727 << " (" << ctx.state.version().GetString() << ") is installed " | 727 << " (" << ctx.state.version().GetString() << ") is installed " |
| 728 << "without Chrome Binaries."; | 728 << "without Chrome Binaries."; |
| 729 } | 729 } |
| 730 } else { | 730 } else { |
| 731 // Version must match that of binaries. | 731 // Version must match that of binaries. |
| 732 if (ctx.state.version().CompareTo(binaries->version()) != 0) { | 732 if (ctx.state.version().CompareTo(binaries->version()) != 0) { |
| 733 *is_valid = false; | 733 *is_valid = false; |
| 734 LOG(ERROR) << "Version of " << ctx.dist->GetAppShortCutName() | 734 LOG(ERROR) << "Version of " << ctx.dist->GetDisplayName() |
| 735 << " (" << ctx.state.version().GetString() << ") does not " | 735 << " (" << ctx.state.version().GetString() << ") does not " |
| 736 "match that of Chrome Binaries (" | 736 "match that of Chrome Binaries (" |
| 737 << binaries->version().GetString() << ")."; | 737 << binaries->version().GetString() << ")."; |
| 738 } | 738 } |
| 739 | 739 |
| 740 // Channel value must match that of binaries. | 740 // Channel value must match that of binaries. |
| 741 if (!ctx.state.channel().Equals(binaries->channel())) { | 741 if (!ctx.state.channel().Equals(binaries->channel())) { |
| 742 *is_valid = false; | 742 *is_valid = false; |
| 743 LOG(ERROR) << "Channel name of " << ctx.dist->GetAppShortCutName() | 743 LOG(ERROR) << "Channel name of " << ctx.dist->GetDisplayName() |
| 744 << " (" << ctx.state.channel().value() | 744 << " (" << ctx.state.channel().value() |
| 745 << ") does not match that of Chrome Binaries (" | 745 << ") does not match that of Chrome Binaries (" |
| 746 << binaries->channel().value() << ")."; | 746 << binaries->channel().value() << ")."; |
| 747 } | 747 } |
| 748 } | 748 } |
| 749 } | 749 } |
| 750 | 750 |
| 751 // Validates the Google Update commands for the product described in |ctx|. | 751 // Validates the Google Update commands for the product described in |ctx|. |
| 752 void InstallationValidator::ValidateAppCommands( | 752 void InstallationValidator::ValidateAppCommands( |
| 753 const ProductContext& ctx, | 753 const ProductContext& ctx, |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 767 ValidateAppCommandExpectations(ctx, expectations, is_valid); | 767 ValidateAppCommandExpectations(ctx, expectations, is_valid); |
| 768 } | 768 } |
| 769 | 769 |
| 770 // Validates usagestats for the product or binaries in |ctx|. | 770 // Validates usagestats for the product or binaries in |ctx|. |
| 771 void InstallationValidator::ValidateUsageStats(const ProductContext& ctx, | 771 void InstallationValidator::ValidateUsageStats(const ProductContext& ctx, |
| 772 bool* is_valid) { | 772 bool* is_valid) { |
| 773 DWORD usagestats = 0; | 773 DWORD usagestats = 0; |
| 774 if (ctx.state.GetUsageStats(&usagestats)) { | 774 if (ctx.state.GetUsageStats(&usagestats)) { |
| 775 if (!ctx.rules.UsageStatsAllowed(ctx)) { | 775 if (!ctx.rules.UsageStatsAllowed(ctx)) { |
| 776 *is_valid = false; | 776 *is_valid = false; |
| 777 LOG(ERROR) << ctx.dist->GetAppShortCutName() | 777 LOG(ERROR) << ctx.dist->GetDisplayName() |
| 778 << " has a usagestats value (" << usagestats | 778 << " has a usagestats value (" << usagestats |
| 779 << "), yet should not."; | 779 << "), yet should not."; |
| 780 } else if (usagestats != 0 && usagestats != 1) { | 780 } else if (usagestats != 0 && usagestats != 1) { |
| 781 *is_valid = false; | 781 *is_valid = false; |
| 782 LOG(ERROR) << ctx.dist->GetAppShortCutName() | 782 LOG(ERROR) << ctx.dist->GetDisplayName() |
| 783 << " has an unsupported usagestats value (" << usagestats | 783 << " has an unsupported usagestats value (" << usagestats |
| 784 << ")."; | 784 << ")."; |
| 785 } | 785 } |
| 786 } | 786 } |
| 787 } | 787 } |
| 788 | 788 |
| 789 // Validates the product described in |product_state| according to |rules|. | 789 // Validates the product described in |product_state| according to |rules|. |
| 790 void InstallationValidator::ValidateProduct( | 790 void InstallationValidator::ValidateProduct( |
| 791 const InstallationState& machine_state, | 791 const InstallationState& machine_state, |
| 792 bool system_install, | 792 bool system_install, |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 892 InstallationType* type) { | 892 InstallationType* type) { |
| 893 DCHECK(type); | 893 DCHECK(type); |
| 894 InstallationState machine_state; | 894 InstallationState machine_state; |
| 895 | 895 |
| 896 machine_state.Initialize(); | 896 machine_state.Initialize(); |
| 897 | 897 |
| 898 return ValidateInstallationTypeForState(machine_state, system_level, type); | 898 return ValidateInstallationTypeForState(machine_state, system_level, type); |
| 899 } | 899 } |
| 900 | 900 |
| 901 } // namespace installer | 901 } // namespace installer |
| OLD | NEW |