Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(197)

Side by Side Diff: chrome/installer/setup/install_worker.cc

Issue 7976045: Fix in-use updates for Chrome Frame. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixed line widths Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 // This file contains the definitions of the installer functions that build 5 // This file contains the definitions of the installer functions that build
6 // the WorkItemList used to install the application. 6 // the WorkItemList used to install the application.
7 7
8 #include "chrome/installer/setup/install_worker.h" 8 #include "chrome/installer/setup/install_worker.h"
9 9
10 #include <shlobj.h> 10 #include <shlobj.h>
(...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 in_use_update_work_items->AddSetRegValueWorkItem( 599 in_use_update_work_items->AddSetRegValueWorkItem(
600 root, 600 root,
601 dist->GetVersionKey(), 601 dist->GetVersionKey(),
602 google_update::kRegOldVersionField, 602 google_update::kRegOldVersionField,
603 UTF8ToWide(current_version->GetString()), 603 UTF8ToWide(current_version->GetString()),
604 true); 604 true);
605 // TODO(tommi): We should move the rename command here. We also need to 605 // TODO(tommi): We should move the rename command here. We also need to
606 // update upgrade_utils::SwapNewChromeExeIfPresent. 606 // update upgrade_utils::SwapNewChromeExeIfPresent.
607 } 607 }
608 608
609 MaybeAddCopyIELowRightsPolicyWorkItems(installer_state,
610 in_use_update_work_items.get());
611
609 post_install_task_list->AddWorkItem(in_use_update_work_items.release()); 612 post_install_task_list->AddWorkItem(in_use_update_work_items.release());
610 } 613 }
611 614
612 // Append work items that will be executed if this was NOT an in-use update. 615 // Append work items that will be executed if this was NOT an in-use update.
613 { 616 {
614 scoped_ptr<WorkItemList> regular_update_work_items( 617 scoped_ptr<WorkItemList> regular_update_work_items(
615 WorkItem::CreateConditionalWorkItemList( 618 WorkItem::CreateConditionalWorkItemList(
616 new Not(new ConditionRunIfFileExists(new_chrome_exe)))); 619 new Not(new ConditionRunIfFileExists(new_chrome_exe))));
617 regular_update_work_items->set_log_message("RegularUpdateWorkItemList"); 620 regular_update_work_items->set_log_message("RegularUpdateWorkItemList");
618 621
619 // Since this was not an in-use-update, delete 'opv' and 'cmd' keys. 622 // Since this was not an in-use-update, delete 'opv' and 'cmd' keys.
620 for (size_t i = 0; i < products.size(); ++i) { 623 for (size_t i = 0; i < products.size(); ++i) {
621 BrowserDistribution* dist = products[i]->distribution(); 624 BrowserDistribution* dist = products[i]->distribution();
622 std::wstring version_key(dist->GetVersionKey()); 625 std::wstring version_key(dist->GetVersionKey());
623 regular_update_work_items->AddDeleteRegValueWorkItem(root, version_key, 626 regular_update_work_items->AddDeleteRegValueWorkItem(root, version_key,
624 google_update::kRegOldVersionField); 627 google_update::kRegOldVersionField);
625 regular_update_work_items->AddDeleteRegValueWorkItem(root, version_key, 628 regular_update_work_items->AddDeleteRegValueWorkItem(root, version_key,
626 google_update::kRegRenameCmdField); 629 google_update::kRegRenameCmdField);
627 } 630 }
628 631
632 MaybeAddDeleteOldIELowRightsPolicyWorkItems(
633 installer_state, regular_update_work_items.get());
634
629 post_install_task_list->AddWorkItem(regular_update_work_items.release()); 635 post_install_task_list->AddWorkItem(regular_update_work_items.release());
630 } 636 }
631 637
632 AddRegisterComDllWorkItemsForPackage(installer_state, current_version, 638 AddRegisterComDllWorkItemsForPackage(installer_state, current_version,
633 new_version, post_install_task_list); 639 new_version, post_install_task_list);
634 640
635 // If we're told that we're an MSI install, make sure to set the marker 641 // If we're told that we're an MSI install, make sure to set the marker
636 // in the client state key so that future updates do the right thing. 642 // in the client state key so that future updates do the right thing.
637 if (installer_state.is_msi()) { 643 if (installer_state.is_msi()) {
638 for (size_t i = 0; i < products.size(); ++i) { 644 for (size_t i = 0; i < products.size(); ++i) {
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
962 BrowserDistribution::CHROME_BROWSER)); 968 BrowserDistribution::CHROME_BROWSER));
963 chrome.InitializeFromUninstallCommand(chrome_state->uninstall_command()); 969 chrome.InitializeFromUninstallCommand(chrome_state->uninstall_command());
964 AddUninstallShortcutWorkItems(installer_state, setup_path, 970 AddUninstallShortcutWorkItems(installer_state, setup_path,
965 chrome_state->version(), list, chrome); 971 chrome_state->version(), list, chrome);
966 } else { 972 } else {
967 NOTREACHED() << "What happened to Chrome?"; 973 NOTREACHED() << "What happened to Chrome?";
968 } 974 }
969 } 975 }
970 } 976 }
971 977
972 void AddElevationPolicyWorkItems(const InstallationState& original_state, 978 namespace {
973 const InstallerState& installer_state, 979
974 const Version& new_version, 980 enum ElevationPolicyId {
975 WorkItemList* install_list) { 981 CURRENT_ELEVATION_POLICY,
976 if (!installer_state.is_multi_install()) { 982 OLD_ELEVATION_POLICY,
977 VLOG(1) << "Not adding elevation policy for single installs"; 983 };
978 return; 984
985 // Historically, the UUID of the ChromeFrame class has been used for this value.
986 // There is no need for the elevation policy GUID to match the ChromeFrame
987 // class's GUID, so I am choosing to hardcode the GUID for the policy here
988 // rather than do something like StringFromGUID2(__uuidof(ChromeFrame), ...).
robertshield 2011/09/22 20:34:10 If there is nothing that constrains the GUID from
grt (UTC plus 2) 2011/09/23 04:16:49 Because the reader could be confused into thinking
robertshield 2011/09/23 14:22:18 SGTM.
989 const wchar_t kIELowRightsPolicyGuid[] =
robertshield 2011/09/22 20:34:10 Sometimes we call things ElevationPolicy and other
grt (UTC plus 2) 2011/09/23 04:16:49 GCF requires some entries in two subkeys of IE's "
robertshield 2011/09/23 14:22:18 Ok, I don't feel strongly, as long as you admit th
990 L"{E0A900DF-9611-4446-86BD-4B1D47E7DB2A}";
991 const wchar_t kIELowRightsPolicyOldGuid[] =
992 L"{6C288DD7-76FB-4721-B628-56FAC252E199}";
993
994 const wchar_t kElevationPolicyKeyPath[] =
995 L"SOFTWARE\\Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy\\";
996
997 void GetIELowRightsElevationPolicyKeyPath(ElevationPolicyId policy,
robertshield 2011/09/22 20:34:10 Drop the "LowRights" bit of the name.
grt (UTC plus 2) 2011/09/23 04:16:49 This function returns the path to the "ElevationPo
robertshield 2011/09/23 14:22:18 As you will.
998 std::wstring* key_path) {
999 DCHECK(policy == CURRENT_ELEVATION_POLICY || policy == OLD_ELEVATION_POLICY);
robertshield 2011/09/22 20:34:10 Do we commonly dcheck that enum values are one of
grt (UTC plus 2) 2011/09/23 04:16:49 I'm not sure. I put this here so that if a third
robertshield 2011/09/23 14:22:18 Yes, but just because you're paranoid doesn't mean
1000
1001 key_path->assign(kElevationPolicyKeyPath,
1002 arraysize(kElevationPolicyKeyPath) - 1);
1003 if (policy == CURRENT_ELEVATION_POLICY) {
1004 key_path->append(kIELowRightsPolicyGuid,
1005 arraysize(kIELowRightsPolicyGuid) - 1);
979 } else { 1006 } else {
robertshield 2011/09/23 14:22:18 perhaps change this to } else if (policy == OLD_
grt (UTC plus 2) 2011/09/23 18:21:07 My hope was that the DCHECK is sufficient. How st
robertshield 2011/09/23 18:34:24 lg.
980 const ProductState* cf_state = 1007 key_path->append(kIELowRightsPolicyOldGuid,
981 original_state.GetProductState(installer_state.system_install(), 1008 arraysize(kIELowRightsPolicyOldGuid)- 1);
982 BrowserDistribution::CHROME_FRAME);
983 if (cf_state && !cf_state->is_multi_install()) {
984 LOG(WARNING) << "Not adding elevation policy since a single install "
985 "of CF exists";
986 return;
987 }
988 }
989
990 FilePath binary_dir(
991 GetChromeInstallPath(installer_state.system_install(),
992 BrowserDistribution::GetSpecificDistribution(
993 BrowserDistribution::CHROME_BINARIES)));
994
995 struct {
996 const wchar_t* sub_key;
997 const wchar_t* executable;
998 const FilePath exe_dir;
999 } low_rights_entries[] = {
1000 { L"ElevationPolicy\\", kChromeLauncherExe,
1001 binary_dir.Append(ASCIIToWide(new_version.GetString())) },
1002 { L"DragDrop\\", chrome::kBrowserProcessExecutableName, binary_dir },
1003 };
1004
1005 bool uninstall = (installer_state.operation() == InstallerState::UNINSTALL);
1006 HKEY root = installer_state.root_key();
1007 const wchar_t kLowRightsKeyPath[] =
1008 L"SOFTWARE\\Microsoft\\Internet Explorer\\Low Rights\\";
1009 std::wstring key_path(kLowRightsKeyPath);
1010
1011 wchar_t cf_classid[64] = {0};
1012 StringFromGUID2(__uuidof(ChromeFrame), cf_classid, arraysize(cf_classid));
1013
1014 for (size_t i = 0; i < arraysize(low_rights_entries); ++i) {
1015 key_path.append(low_rights_entries[i].sub_key).append(cf_classid);
1016 if (uninstall) {
1017 install_list->AddDeleteRegKeyWorkItem(root, key_path);
1018 } else {
1019 install_list->AddCreateRegKeyWorkItem(root, key_path);
1020 install_list->AddSetRegValueWorkItem(root, key_path, L"Policy",
1021 static_cast<DWORD>(3), true);
1022 install_list->AddSetRegValueWorkItem(root, key_path, L"AppName",
1023 low_rights_entries[i].executable, true);
1024 install_list->AddSetRegValueWorkItem(root, key_path, L"AppPath",
1025 low_rights_entries[i].exe_dir.value(), true);
1026 }
1027 key_path.resize(arraysize(kLowRightsKeyPath) - 1);
1028 } 1009 }
1029 } 1010 }
1030 1011
1012 // Returns true if this installation run owns the old IE low rights policies.
1013 bool InstallerOwnsOldLowRightsPolicies(const InstallerState& installer_state) {
robertshield 2011/09/22 20:34:10 InstallerOwnsOldLowRightsPolicies -> InstallerOwns
robertshield 2011/09/23 14:22:18 I take it that you disagree? Fine :-)
1014 // The installer owns the old policies only when GCF is being operated on.
1015 return installer_state.FindProduct(BrowserDistribution::CHROME_FRAME) != NULL;
1016 }
1017
1018 } // namespace
1019
1020 void MaybeAddDeleteOldIELowRightsPolicyWorkItems(
1021 const InstallerState& installer_state,
1022 WorkItemList* install_list) {
1023 DCHECK(install_list);
1024
1025 if (InstallerOwnsOldLowRightsPolicies(installer_state)) {
1026 std::wstring key_path;
1027 GetIELowRightsElevationPolicyKeyPath(OLD_ELEVATION_POLICY, &key_path);
1028 install_list->AddDeleteRegKeyWorkItem(installer_state.root_key(), key_path);
1029 }
1030 }
1031
1032 // Conditionally adds work items to copy the chrome_launcher IE low rights
1033 // elevation policy from the primary policy GUID to the "old" policy GUID. Take
1034 // care not to perform the copy if there is already an old policy present, as
1035 // the ones under the main kElevationPolicyGuid would then correspond to an
1036 // intermediate version (current_version < pv < new_version).
1037 void MaybeAddCopyIELowRightsPolicyWorkItems(
robertshield 2011/09/22 20:34:10 what about instead of having these MaybeFoo method
grt (UTC plus 2) 2011/09/23 04:16:49 The Copy is only called for an in-use update, whil
robertshield 2011/09/23 14:22:18 How about just wrapping the existing call sites in
grt (UTC plus 2) 2011/09/23 18:21:07 Done.
1038 const InstallerState& installer_state,
1039 WorkItemList* install_list) {
1040 DCHECK(install_list);
1041
1042 // Proceed if we own the old policies and if old policies are not already
1043 // present (we don't want to clobber them).
1044 if (InstallerOwnsOldLowRightsPolicies(installer_state)) {
1045 const HKEY root = installer_state.root_key();
1046 std::wstring old_key_path;
1047
1048 GetIELowRightsElevationPolicyKeyPath(OLD_ELEVATION_POLICY, &old_key_path);
1049 if (!RegKey(root, old_key_path.c_str(), KEY_QUERY_VALUE).Valid()) {
1050 std::wstring current_key_path;
1051
1052 GetIELowRightsElevationPolicyKeyPath(CURRENT_ELEVATION_POLICY,
1053 &current_key_path);
1054 install_list->AddCopyRegKeyWorkItem(root, current_key_path, old_key_path);
1055 }
1056 }
1057 }
1058
1031 void AppendUninstallCommandLineFlags(const InstallerState& installer_state, 1059 void AppendUninstallCommandLineFlags(const InstallerState& installer_state,
1032 const Product& product, 1060 const Product& product,
1033 CommandLine* uninstall_cmd) { 1061 CommandLine* uninstall_cmd) {
1034 DCHECK(uninstall_cmd); 1062 DCHECK(uninstall_cmd);
1035 1063
1036 uninstall_cmd->AppendSwitch(installer::switches::kUninstall); 1064 uninstall_cmd->AppendSwitch(installer::switches::kUninstall);
1037 1065
1038 // Append the product-specific uninstall flags. 1066 // Append the product-specific uninstall flags.
1039 product.AppendUninstallFlags(uninstall_cmd); 1067 product.AppendUninstallFlags(uninstall_cmd);
1040 if (installer_state.is_msi()) { 1068 if (installer_state.is_msi()) {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 } else { 1229 } else {
1202 DCHECK(operation == REMOVE_COMMAND); 1230 DCHECK(operation == REMOVE_COMMAND);
1203 work_item_list->AddDeleteRegKeyWorkItem(installer_state.root_key(), 1231 work_item_list->AddDeleteRegKeyWorkItem(installer_state.root_key(),
1204 cmd_key)->set_log_message( 1232 cmd_key)->set_log_message(
1205 "removing quick-enable-cf command"); 1233 "removing quick-enable-cf command");
1206 } 1234 }
1207 } 1235 }
1208 } 1236 }
1209 1237
1210 } // namespace installer 1238 } // namespace installer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698