diff options
author | grt@chromium.org <grt@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-03 19:03:38 +0000 |
---|---|---|
committer | grt@chromium.org <grt@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-10-03 19:03:38 +0000 |
commit | bf124375ab566296664d22bbda10ae20988f0ad0 (patch) | |
tree | 5e6dee623f516976958719a6a9582e870061539f /chrome_frame | |
parent | a8ddb9778b0996dce33dd673148d5289e3485fec (diff) | |
download | chromium_src-bf124375ab566296664d22bbda10ae20988f0ad0.zip chromium_src-bf124375ab566296664d22bbda10ae20988f0ad0.tar.gz chromium_src-bf124375ab566296664d22bbda10ae20988f0ad0.tar.bz2 |
Don't modify Secure Mime Handlers if there's no need.
When Chrome creates Google Update's OnDemandMachineAppsClass by way of
the elevation moniker, the eventual setup.exe's process security token
doesn't have the SeSecurityPrivilege. This prevents Chrome Frame from
reading and/or modifying the security descriptor on the Secure Mime
Handlers registry key. This had been resulting in error 7 when trying to
manually update a Chrome that shared binaries with Chrome Frame. With
this change, the values are probed before trying to modify them. Chances
are that they will already hold the correct data, so the update should
succeed.
BUG=224043
TEST=see comment #3 in bug
Review URL: https://codereview.chromium.org/25738003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@226810 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame')
-rw-r--r-- | chrome_frame/chrome_tab.cc | 59 |
1 files changed, 43 insertions, 16 deletions
diff --git a/chrome_frame/chrome_tab.cc b/chrome_frame/chrome_tab.cc index 70c188b..a54b88f 100644 --- a/chrome_frame/chrome_tab.cc +++ b/chrome_frame/chrome_tab.cc @@ -562,25 +562,51 @@ struct TokenWithPrivileges { CSid user_; }; -HRESULT SetOrDeleteMimeHandlerKey(bool set, HKEY root_key) { - std::wstring key_name = kInternetSettings; +const wchar_t* const kMimeHandlerKeyValues[] = { + L"ChromeTab.ChromeActiveDocument", + L"ChromeTab.ChromeActiveDocument.1", +}; + +// Returns true if the values are present or absent in |root_key|'s Secure Mime +// Handlers key based on |for_installed|. Returns false if the values are not as +// expected or if an error occurred. +bool MimeHandlerKeyIsConfigured(bool for_install, HKEY root_key) { + string16 key_name(kInternetSettings); key_name.append(L"\\Secure Mime Handlers"); - RegKey key(root_key, key_name.c_str(), KEY_READ | KEY_WRITE); + RegKey key(root_key, key_name.c_str(), KEY_QUERY_VALUE); if (!key.Valid()) return false; - LONG result1 = ERROR_SUCCESS; - LONG result2 = ERROR_SUCCESS; - if (set) { - result1 = key.WriteValue(L"ChromeTab.ChromeActiveDocument", 1); - result2 = key.WriteValue(L"ChromeTab.ChromeActiveDocument.1", 1); - } else { - result1 = key.DeleteValue(L"ChromeTab.ChromeActiveDocument"); - result2 = key.DeleteValue(L"ChromeTab.ChromeActiveDocument.1"); + for (size_t i = 0; i < arraysize(kMimeHandlerKeyValues); ++i) { + DWORD value = 0; + LONG result = key.ReadValueDW(kMimeHandlerKeyValues[i], &value); + if (for_install) { + if (result != ERROR_SUCCESS || value != 1) + return false; + } else { + if (result != ERROR_FILE_NOT_FOUND) + return false; + } } + return true; +} - return result1 != ERROR_SUCCESS ? HRESULT_FROM_WIN32(result1) : - HRESULT_FROM_WIN32(result2); +HRESULT SetOrDeleteMimeHandlerKey(bool set, HKEY root_key) { + string16 key_name(kInternetSettings); + key_name.append(L"\\Secure Mime Handlers"); + RegKey key(root_key, key_name.c_str(), KEY_SET_VALUE); + if (!key.Valid()) + return false; + + HRESULT result = S_OK; + for (size_t i = 0; i < arraysize(kMimeHandlerKeyValues); ++i) { + LONG intermediate = set ? + key.WriteValue(kMimeHandlerKeyValues[i], 1) : + key.DeleteValue(kMimeHandlerKeyValues[i]); + if (intermediate != ERROR_SUCCESS && result == S_OK) + result = HRESULT_FROM_WIN32(intermediate); + } + return result; } void OnPinModule() { @@ -591,11 +617,12 @@ void OnPinModule() { // Chrome Frame registration functions. //----------------------------------------------------------------------------- HRESULT RegisterSecuredMimeHandler(bool enable, bool is_system) { - if (!is_system) { + if (MimeHandlerKeyIsConfigured(enable, HKEY_LOCAL_MACHINE)) + return S_OK; + if (!is_system) return SetOrDeleteMimeHandlerKey(enable, HKEY_CURRENT_USER); - } else if (base::win::GetVersion() < base::win::VERSION_VISTA) { + if (base::win::GetVersion() < base::win::VERSION_VISTA) return SetOrDeleteMimeHandlerKey(enable, HKEY_LOCAL_MACHINE); - } std::wstring mime_key = kInternetSettings; mime_key.append(L"\\Secure Mime Handlers"); |