Index: base/scoped_impersonation.h |
diff --git a/base/scoped_impersonation.h b/base/scoped_impersonation.h |
deleted file mode 100644 |
index aa088491e93caabf501623398328c308e9209833..0000000000000000000000000000000000000000 |
--- a/base/scoped_impersonation.h |
+++ /dev/null |
@@ -1,173 +0,0 @@ |
-// Copyright 2008-2010 Google Inc. |
-// |
-// Licensed under the Apache License, Version 2.0 (the "License"); |
-// you may not use this file except in compliance with the License. |
-// You may obtain a copy of the License at |
-// |
-// http://www.apache.org/licenses/LICENSE-2.0 |
-// |
-// Unless required by applicable law or agreed to in writing, software |
-// distributed under the License is distributed on an "AS IS" BASIS, |
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-// See the License for the specific language governing permissions and |
-// limitations under the License. |
-// ======================================================================== |
- |
-// TODO(omaha): deprecate and use ATL::CAccessToken instead. |
- |
-#ifndef OMAHA_BASE_SCOPED_IMPERSONATION_H_ |
-#define OMAHA_BASE_SCOPED_IMPERSONATION_H_ |
- |
-#include <windows.h> |
-#include <atlsecurity.h> |
-#include "omaha/base/debug.h" |
-#include "omaha/base/error.h" |
-#include "omaha/base/logging.h" |
-#include "omaha/base/scoped_any.h" |
- |
-namespace omaha { |
- |
-inline void ImpersonateLoggedOnUserOrDie(HANDLE token) { |
- if (!::ImpersonateLoggedOnUser(token)) { |
- CORE_LOG(LE, (_T("[ImpersonateLoggedOnUser failed][0x%08x]"), |
- HRESULTFromLastError())); |
- ::RaiseException(EXCEPTION_IMPERSONATION_FAILED, |
- EXCEPTION_NONCONTINUABLE, |
- 0, |
- NULL); |
- } |
-} |
- |
-inline void RevertToSelfOrDie() { |
- if (!::RevertToSelf()) { |
- CORE_LOG(LE, (_T("[RevertToSelf failed][0x%08x]"), HRESULTFromLastError())); |
- ::RaiseException(EXCEPTION_REVERT_IMPERSONATION_FAILED, |
- EXCEPTION_NONCONTINUABLE, |
- 0, |
- NULL); |
- } |
-} |
- |
-inline HRESULT smart_impersonate_helper(HANDLE token) { |
- if (!token) { |
- return S_FALSE; |
- } |
- return ::ImpersonateLoggedOnUser(token) ? S_OK : HRESULTFromLastError(); |
-} |
- |
-inline void smart_unimpersonate_helper(HRESULT result) { |
- if (result == S_OK) { |
- RevertToSelfOrDie(); |
- } |
-} |
- |
-typedef close_fun<void (*)(HRESULT), smart_unimpersonate_helper> |
- close_impersonation; |
- |
-typedef value_const<HRESULT, E_FAIL> impersonation_not_init; |
- |
-typedef scoped_any<HRESULT, close_impersonation, impersonation_not_init> |
- scoped_impersonation_close; |
- |
-// Manages the calls to ImpersonateLoggedOnUser and RevertToSelf. The input |
-// token is allowed to be NULL in which case no impersonation/revert is |
-// performed. |
-struct scoped_impersonation { |
- explicit scoped_impersonation(HANDLE token) |
- : result_(smart_impersonate_helper(token)) { |
- HRESULT hr = result(); |
- if (token && SUCCEEDED(hr)) { |
- CORE_LOG(L3, (_T("[Impersonation succeeded]"))); |
- } else if (token && FAILED(hr)) { |
- CORE_LOG(LW, (_T("[Impersonation failed][0x%x]"), hr)); |
- } else if (!token) { |
- CORE_LOG(LW, (_T("[Impersonation requested but the token was null]"))); |
- } |
- } |
- |
- HRESULT result() const { return get(result_); } |
- |
- private: |
- const scoped_impersonation_close result_; |
-}; |
- |
-class scoped_revert_to_self { |
- public: |
- scoped_revert_to_self() { |
- token_.GetThreadToken(TOKEN_ALL_ACCESS); |
- if (token_.GetHandle()) { |
- RevertToSelfOrDie(); |
- } |
- } |
- ~scoped_revert_to_self() { |
- if (token_.GetHandle()) { |
- ImpersonateLoggedOnUserOrDie(token_.GetHandle()); |
- } |
- } |
- private: |
- CAccessToken token_; |
-}; |
- |
-// Calls a function member using the security context of the process, and |
-// re-impersonates after the call if the calling thread previously had a valid |
-// thread token. |
-// This is particularly useful when a thread running impersonated needs to |
-// revert to self, call a member function, and impersonate back. If the callee |
-// has a result type, it returns the result of the actual call as an out |
-// parameter. The function crashes the process if either revert to self or |
-// re-impersonation fails. |
- |
-// Callers for function members without arguments. |
-template <typename T, typename R> |
-R CallAsSelfAndImpersonate0(T* object, R (T::*pm)()) { |
- ASSERT1(object); |
- ASSERT1(pm); |
- |
- scoped_revert_to_self revert_to_self; |
- return (object->*pm)(); |
-} |
- |
-// Callers for __stdcall function members with one argument. |
-template <typename T, typename P1, typename R> |
-R StdCallAsSelfAndImpersonate1(T* object, R (__stdcall T::*pm)(P1), P1 p1) { |
- ASSERT1(object); |
- ASSERT1(pm); |
- |
- scoped_revert_to_self revert_to_self; |
- return (object->*pm)(p1); |
-} |
- |
-// Callers for function members with one argument. |
-template <typename T, typename P1, typename R> |
-R CallAsSelfAndImpersonate1(T* object, R (T::*pm)(P1), P1 p1) { |
- ASSERT1(object); |
- ASSERT1(pm); |
- |
- scoped_revert_to_self revert_to_self; |
- return (object->*pm)(p1); |
-} |
- |
-// Callers for function members with two arguments. |
-template <class T, typename P1, typename P2, class R> |
-R CallAsSelfAndImpersonate2(T* object, R (T::*pm)(P1, P2), P1 p1, P2 p2) { |
- ASSERT1(object); |
- ASSERT1(pm); |
- |
- scoped_revert_to_self revert_to_self; |
- return (object->*pm)(p1, p2); |
-} |
- |
-// Callers for function members with three arguments. |
-template <class T, typename P1, typename P2, typename P3, typename R> |
-R CallAsSelfAndImpersonate3(T* object, R (T::*pm)(P1, P2, P3), |
- P1 p1, P2 p2, P3 p3) { |
- ASSERT1(object); |
- ASSERT1(pm); |
- |
- scoped_revert_to_self revert_to_self; |
- return (object->*pm)(p1, p2, p3); |
-} |
- |
-} // namespace omaha |
- |
-#endif // OMAHA_BASE_SCOPED_IMPERSONATION_H_ |