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

Unified 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: Sanity check before dcommit 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/installer/setup/install_worker.h ('k') | chrome/installer/setup/install_worker_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/installer/setup/install_worker.cc
diff --git a/chrome/installer/setup/install_worker.cc b/chrome/installer/setup/install_worker.cc
index 7164d5032219a4ce284d8ddacfc94e5e2959f836..4bcb43723ebeb5b6793faae90d8025ff1b1100ef 100644
--- a/chrome/installer/setup/install_worker.cc
+++ b/chrome/installer/setup/install_worker.cc
@@ -606,6 +606,11 @@ bool AppendPostInstallTasks(const InstallerState& installer_state,
// update upgrade_utils::SwapNewChromeExeIfPresent.
}
+ if (installer_state.FindProduct(BrowserDistribution::CHROME_FRAME)) {
+ AddCopyIELowRightsPolicyWorkItems(installer_state,
+ in_use_update_work_items.get());
+ }
+
post_install_task_list->AddWorkItem(in_use_update_work_items.release());
}
@@ -626,6 +631,11 @@ bool AppendPostInstallTasks(const InstallerState& installer_state,
google_update::kRegRenameCmdField);
}
+ if (installer_state.FindProduct(BrowserDistribution::CHROME_FRAME)) {
+ AddDeleteOldIELowRightsPolicyWorkItems(installer_state,
+ regular_update_work_items.get());
+ }
+
post_install_task_list->AddWorkItem(regular_update_work_items.release());
}
@@ -969,63 +979,71 @@ void AddChromeFrameWorkItems(const InstallationState& original_state,
}
}
-void AddElevationPolicyWorkItems(const InstallationState& original_state,
- const InstallerState& installer_state,
- const Version& new_version,
- WorkItemList* install_list) {
- if (!installer_state.is_multi_install()) {
- VLOG(1) << "Not adding elevation policy for single installs";
- return;
+namespace {
+
+enum ElevationPolicyId {
+ CURRENT_ELEVATION_POLICY,
+ OLD_ELEVATION_POLICY,
+};
+
+// Although the UUID of the ChromeFrame class is used for the "current" value,
+// this is done only as a convenience; there is no need for the GUID of the Low
+// Rights policies to match the ChromeFrame class's GUID. Hence, it is safe to
+// use this completely unrelated GUID for the "old" policies.
+const wchar_t kIELowRightsPolicyOldGuid[] =
+ L"{6C288DD7-76FB-4721-B628-56FAC252E199}";
+
+const wchar_t kElevationPolicyKeyPath[] =
+ L"SOFTWARE\\Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy\\";
+
+void GetIELowRightsElevationPolicyKeyPath(ElevationPolicyId policy,
+ std::wstring* key_path) {
+ DCHECK(policy == CURRENT_ELEVATION_POLICY || policy == OLD_ELEVATION_POLICY);
+
+ key_path->assign(kElevationPolicyKeyPath,
+ arraysize(kElevationPolicyKeyPath) - 1);
+ if (policy == CURRENT_ELEVATION_POLICY) {
+ wchar_t cf_clsid[64];
+ int len = StringFromGUID2(__uuidof(ChromeFrame), &cf_clsid[0],
+ arraysize(cf_clsid));
+ key_path->append(&cf_clsid[0], len - 1);
} else {
- const ProductState* cf_state =
- original_state.GetProductState(installer_state.system_install(),
- BrowserDistribution::CHROME_FRAME);
- if (cf_state && !cf_state->is_multi_install()) {
- LOG(WARNING) << "Not adding elevation policy since a single install "
- "of CF exists";
- return;
- }
+ key_path->append(kIELowRightsPolicyOldGuid,
+ arraysize(kIELowRightsPolicyOldGuid)- 1);
}
+}
- FilePath binary_dir(
- GetChromeInstallPath(installer_state.system_install(),
- BrowserDistribution::GetSpecificDistribution(
- BrowserDistribution::CHROME_BINARIES)));
-
- struct {
- const wchar_t* sub_key;
- const wchar_t* executable;
- const FilePath exe_dir;
- } low_rights_entries[] = {
- { L"ElevationPolicy\\", kChromeLauncherExe,
- binary_dir.Append(ASCIIToWide(new_version.GetString())) },
- { L"DragDrop\\", chrome::kBrowserProcessExecutableName, binary_dir },
- };
-
- bool uninstall = (installer_state.operation() == InstallerState::UNINSTALL);
- HKEY root = installer_state.root_key();
- const wchar_t kLowRightsKeyPath[] =
- L"SOFTWARE\\Microsoft\\Internet Explorer\\Low Rights\\";
- std::wstring key_path(kLowRightsKeyPath);
+} // namespace
- wchar_t cf_classid[64] = {0};
- StringFromGUID2(__uuidof(ChromeFrame), cf_classid, arraysize(cf_classid));
+void AddDeleteOldIELowRightsPolicyWorkItems(
+ const InstallerState& installer_state,
+ WorkItemList* install_list) {
+ DCHECK(install_list);
- for (size_t i = 0; i < arraysize(low_rights_entries); ++i) {
- key_path.append(low_rights_entries[i].sub_key).append(cf_classid);
- if (uninstall) {
- install_list->AddDeleteRegKeyWorkItem(root, key_path);
- } else {
- install_list->AddCreateRegKeyWorkItem(root, key_path);
- install_list->AddSetRegValueWorkItem(root, key_path, L"Policy",
- static_cast<DWORD>(3), true);
- install_list->AddSetRegValueWorkItem(root, key_path, L"AppName",
- low_rights_entries[i].executable, true);
- install_list->AddSetRegValueWorkItem(root, key_path, L"AppPath",
- low_rights_entries[i].exe_dir.value(), true);
- }
- key_path.resize(arraysize(kLowRightsKeyPath) - 1);
- }
+ std::wstring key_path;
+ GetIELowRightsElevationPolicyKeyPath(OLD_ELEVATION_POLICY, &key_path);
+ install_list->AddDeleteRegKeyWorkItem(installer_state.root_key(), key_path);
+}
+
+// Adds work items to copy the chrome_launcher IE low rights elevation policy
+// from the primary policy GUID to the "old" policy GUID. Take care not to
+// perform the copy if there is already an old policy present, as the ones under
+// the main kElevationPolicyGuid would then correspond to an intermediate
+// version (current_version < pv < new_version).
+void AddCopyIELowRightsPolicyWorkItems(const InstallerState& installer_state,
+ WorkItemList* install_list) {
+ DCHECK(install_list);
+
+ std::wstring current_key_path;
+ std::wstring old_key_path;
+
+ GetIELowRightsElevationPolicyKeyPath(CURRENT_ELEVATION_POLICY,
+ &current_key_path);
+ GetIELowRightsElevationPolicyKeyPath(OLD_ELEVATION_POLICY, &old_key_path);
+ // Do not clobber existing old policies.
+ install_list->AddCopyRegKeyWorkItem(installer_state.root_key(),
+ current_key_path, old_key_path,
+ WorkItem::IF_NOT_PRESENT);
}
void AppendUninstallCommandLineFlags(const InstallerState& installer_state,
« no previous file with comments | « chrome/installer/setup/install_worker.h ('k') | chrome/installer/setup/install_worker_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698