diff options
author | stoyan@chromium.org <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-20 22:44:58 +0000 |
---|---|---|
committer | stoyan@chromium.org <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-11-20 22:44:58 +0000 |
commit | 42d7c0218dc58679cebee0a2cd18dcb00a85dfbc (patch) | |
tree | 9aa6253efcbd6cef14c19b4a9aaa22d9de79d4eb /chrome_frame/test/chrome_frame_test_utils.cc | |
parent | 90a7ad5203fea92a68b6ac3b18f09b67a48192d5 (diff) | |
download | chromium_src-42d7c0218dc58679cebee0a2cd18dcb00a85dfbc.zip chromium_src-42d7c0218dc58679cebee0a2cd18dcb00a85dfbc.tar.gz chromium_src-42d7c0218dc58679cebee0a2cd18dcb00a85dfbc.tar.bz2 |
Launch COM server IE as low integrity process on Vista.
Review URL: http://codereview.chromium.org/402089
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@32699 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome_frame/test/chrome_frame_test_utils.cc')
-rw-r--r-- | chrome_frame/test/chrome_frame_test_utils.cc | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/chrome_frame/test/chrome_frame_test_utils.cc b/chrome_frame/test/chrome_frame_test_utils.cc index cb59615..2cce441 100644 --- a/chrome_frame/test/chrome_frame_test_utils.cc +++ b/chrome_frame/test/chrome_frame_test_utils.cc @@ -7,6 +7,7 @@ #include <atlbase.h> #include <atlwin.h> #include <iepmapi.h> +#include <sddl.h> #include "base/message_loop.h" #include "base/registry.h" // to find IE and firefox @@ -533,4 +534,91 @@ HWND GetChromeRendererWindow() { return chrome_window; } + +LowIntegrityToken::LowIntegrityToken() : impersonated_(false) { +} + +LowIntegrityToken::~LowIntegrityToken() { + RevertToSelf(); +} + +BOOL LowIntegrityToken::RevertToSelf() { + BOOL ok = TRUE; + if (impersonated_) { + DCHECK(IsImpersonated()); + ok = ::RevertToSelf(); + if (ok) + impersonated_ = false; + } + + return ok; +} + +BOOL LowIntegrityToken::Impersonate() { + DCHECK(!impersonated_); + DCHECK(!IsImpersonated()); + HANDLE process_token_handle = NULL; + BOOL ok = ::OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE, + &process_token_handle); + if (!ok) { + DLOG(ERROR) << "::OpenProcessToken failed: " << GetLastError(); + return ok; + } + + ScopedHandle process_token(process_token_handle); + // Create impersonation low integrity token. + HANDLE impersonation_token_handle = NULL; + ok = ::DuplicateTokenEx(process_token, + TOKEN_QUERY | TOKEN_IMPERSONATE | TOKEN_ADJUST_DEFAULT, NULL, + SecurityImpersonation, TokenImpersonation, &impersonation_token_handle); + if (!ok) { + DLOG(ERROR) << "::DuplicateTokenEx failed: " << GetLastError(); + return ok; + } + + // TODO: sandbox/src/restricted_token_utils.cc has SetTokenIntegrityLevel + // function already. + ScopedHandle impersonation_token(impersonation_token_handle); + PSID integrity_sid = NULL; + TOKEN_MANDATORY_LABEL tml = {0}; + ok = ::ConvertStringSidToSid(SDDL_ML_LOW, &integrity_sid); + if (!ok) { + DLOG(ERROR) << "::ConvertStringSidToSid failed: " << GetLastError(); + return ok; + } + + tml.Label.Attributes = SE_GROUP_INTEGRITY | SE_GROUP_INTEGRITY_ENABLED; + tml.Label.Sid = integrity_sid; + ok = ::SetTokenInformation(impersonation_token, TokenIntegrityLevel, + &tml, sizeof(tml) + ::GetLengthSid(integrity_sid)); + ::LocalFree(integrity_sid); + if (!ok) { + DLOG(ERROR) << "::SetTokenInformation failed: " << GetLastError(); + return ok; + } + + // Switch current thread to low integrity. + ok = ::ImpersonateLoggedOnUser(impersonation_token); + if (ok) { + impersonated_ = true; + } else { + DLOG(ERROR) << "::ImpersonateLoggedOnUser failed: " << GetLastError(); + } + + return ok; +} + +bool LowIntegrityToken::IsImpersonated() { + HANDLE token = NULL; + if (!::OpenThreadToken(::GetCurrentThread(), 0, false, &token) && + ::GetLastError() != ERROR_NO_TOKEN) { + return true; + } + + if (token) + ::CloseHandle(token); + + return false; +} + } // namespace chrome_frame_test |