summaryrefslogtreecommitdiffstats
path: root/chrome_frame/test/chrome_frame_test_utils.cc
diff options
context:
space:
mode:
authorstoyan@chromium.org <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-20 22:44:58 +0000
committerstoyan@chromium.org <stoyan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-11-20 22:44:58 +0000
commit42d7c0218dc58679cebee0a2cd18dcb00a85dfbc (patch)
tree9aa6253efcbd6cef14c19b4a9aaa22d9de79d4eb /chrome_frame/test/chrome_frame_test_utils.cc
parent90a7ad5203fea92a68b6ac3b18f09b67a48192d5 (diff)
downloadchromium_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.cc88
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