You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by mt...@apache.org on 2009/05/25 19:28:48 UTC
svn commit: r778458 - in /commons/sandbox/runtime/trunk/src/main/native:
include/arch/windows/acr_arch_private.h os/win32/file.c os/win32/main.c
os/win32/wusec.c
Author: mturk
Date: Mon May 25 17:28:48 2009
New Revision: 778458
URL: http://svn.apache.org/viewvc?rev=778458&view=rev
Log:
Move common security code to wusec.c
Modified:
commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h
commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c
commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c
Modified: commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h?rev=778458&r1=778457&r2=778458&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h (original)
+++ commons/sandbox/runtime/trunk/src/main/native/include/arch/windows/acr_arch_private.h Mon May 25 17:28:48 2009
@@ -69,6 +69,9 @@
void ACR_GetUserHomePath(LPWSTR buf, DWORD blen, PSID sid);
HANDLE ACR_GetCurrentAccessToken(JNIEnv *_E);
PSID ACR_AllocateWellKnownSid(JNIEnv *_E, WELL_KNOWN_SID_TYPE type);
+DWORD ACR_SetTokenPrivilege(LPCWSTR szPrivilege, BOOL bEnablePrivilege);
+DWORD ACR_EnablePrivilege(LPCWSTR szPrivilege);
+PSID ACR_DuplicateSid(JNIEnv *_E, PSID sSID);
/**
* Heap allocation from main.c
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c?rev=778458&r1=778457&r2=778458&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/file.c Mon May 25 17:28:48 2009
@@ -622,71 +622,22 @@
return JNI_TRUE;
}
-static BOOL SetPrivilege(HANDLE hToken, LPCTSTR lpszPrivilege,
- BOOL bEnablePrivilege)
-{
- TOKEN_PRIVILEGES tp;
- LUID luid;
-
- if (!LookupPrivilegeValue(NULL,
- lpszPrivilege,
- &luid)) {
- return FALSE;
- }
-
- tp.PrivilegeCount = 1;
- tp.Privileges[0].Luid = luid;
- if (bEnablePrivilege)
- tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
- else
- tp.Privileges[0].Attributes = 0;
-
- /* Enable the privilege or disable all privileges.
- */
- if (!AdjustTokenPrivileges(hToken,
- FALSE,
- &tp,
- sizeof(TOKEN_PRIVILEGES),
- NULL,
- NULL)) {
- return FALSE;
- }
-
- if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) {
- /* The token does not have the specified privilege. */
- return FALSE;
- }
-
- return TRUE;
-}
-
-
ACR_IO_EXPORT_DECLARE(jboolean, File, fprot2)(ACR_JNISTDARGS, jstring pathname,
jobject usr, jobject grp)
{
int rc = EINVAL;
- HANDLE hToken = NULL;
UNREFERENCED_O;
- if (!OpenProcessToken(GetCurrentProcess(),
- TOKEN_ADJUST_PRIVILEGES,
- &hToken)) {
- rc = ACR_GET_OS_ERROR();
- if (ACR_STATUS_IS_EACCES(rc))
- ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
- else
- ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc);
- return JNI_FALSE;
- }
+
/* Enable the SE_TAKE_OWNERSHIP_NAME privilege.
*/
- if (!SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, TRUE)) {
- rc = ACR_GET_OS_ERROR();
+ if ((rc = ACR_SetTokenPrivilege(L"SeTakeOwnershipPrivilege",
+ TRUE)) != ERROR_SUCCESS) {
+ rc = ACR_FROM_OS_ERROR(rc);
if (ACR_STATUS_IS_EACCES(rc))
ACR_ThrowException(_E, THROW_NMARK, ACR_EX_ESECURITY, 0);
else
ACR_ThrowException(_E, THROW_NMARK, ACR_EX_EIO, rc);
- CloseHandle(hToken);
return JNI_FALSE;
}
@@ -708,8 +659,7 @@
NULL,
NULL);
} END_WITH_WSTR(pathname);
- SetPrivilege(hToken, SE_TAKE_OWNERSHIP_NAME, FALSE);
- CloseHandle(hToken);
+ ACR_SetTokenPrivilege(L"SeTakeOwnershipPrivilege", FALSE);
if (rc) {
rc = ACR_FROM_OS_ERROR(rc);
if (ACR_STATUS_IS_EACCES(rc))
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c?rev=778458&r1=778457&r2=778458&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c Mon May 25 17:28:48 2009
@@ -187,89 +187,6 @@
return ERROR_SUCCESS;
}
-static DWORD set_current_privilege(LPCWSTR szPrivilege,
- BOOL bEnablePrivilege)
-{
- DWORD dwError;
- HANDLE hToken;
- TOKEN_PRIVILEGES tp;
- LUID luid;
- TOKEN_PRIVILEGES tpPrevious;
- DWORD cbPrevious = sizeof(TOKEN_PRIVILEGES);
- BOOL bSuccess=FALSE;
-
- if (!LookupPrivilegeValueW(NULL, szPrivilege, &luid))
- return ERROR_NO_SUCH_PRIVILEGE;
-
- if (!OpenProcessToken(GetCurrentProcess(),
- TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
- &hToken))
- return GetLastError();
-
- tp.PrivilegeCount = 1;
- tp.Privileges[0].Luid = luid;
- tp.Privileges[0].Attributes = 0;
-
- AdjustTokenPrivileges(hToken,
- FALSE,
- &tp,
- sizeof(TOKEN_PRIVILEGES),
- &tpPrevious,
- &cbPrevious);
-
- if ((dwError = GetLastError()) == ERROR_SUCCESS) {
- tpPrevious.PrivilegeCount = 1;
- tpPrevious.Privileges[0].Luid = luid;
-
- if(bEnablePrivilege)
- tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
- else
- tpPrevious.Privileges[0].Attributes &= ~(SE_PRIVILEGE_ENABLED);
-
- AdjustTokenPrivileges(hToken,
- FALSE,
- &tpPrevious,
- cbPrevious,
- NULL,
- NULL);
-
- dwError = GetLastError();
- }
- CloseHandle(hToken);
- return dwError;
-}
-
-static DWORD enable_privilege(LPCWSTR szPrivilege)
-{
- DWORD dwError;
- HANDLE hToken;
- TOKEN_PRIVILEGES tp;
- LUID luid;
-
- if (!LookupPrivilegeValueW(NULL, szPrivilege, &luid))
- return ERROR_NO_SUCH_PRIVILEGE;
-
- if (!OpenProcessToken(GetCurrentProcess(),
- TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
- &hToken))
- return GetLastError();
-
- tp.PrivilegeCount = 1;
- tp.Privileges[0].Luid = luid;
- tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
-
- AdjustTokenPrivileges(hToken,
- FALSE,
- &tp,
- sizeof(TOKEN_PRIVILEGES),
- NULL,
- NULL);
-
- dwError = GetLastError();
- CloseHandle(hToken);
- return dwError;
-}
-
char *acr_log_domain = NULL;
extern void do_syslog(jint, LPWSTR, DWORD);
@@ -329,7 +246,7 @@
if ((dll_tls_index = TlsAlloc()) == TLS_OUT_OF_INDEXES) {
return JNI_ERR;
}
- if ((rc = enable_privilege(L"SeDebugPrivilege")) != ERROR_SUCCESS) {
+ if ((rc = ACR_EnablePrivilege(L"SeDebugPrivilege")) != ERROR_SUCCESS) {
/* Log that we couldn't set privilege */
acr_init_log_source(LOG_MSG_DOMAIN);
do_syslog(ACR_LOG_ERROR,
Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c
URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c?rev=778458&r1=778457&r2=778458&view=diff
==============================================================================
--- commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c (original)
+++ commons/sandbox/runtime/trunk/src/main/native/os/win32/wusec.c Mon May 25 17:28:48 2009
@@ -205,3 +205,107 @@
}
return sid;
}
+
+DWORD ACR_SetTokenPrivilege(LPCWSTR szPrivilege, BOOL bEnablePrivilege)
+{
+ DWORD dwError = ERROR_SUCCESS;
+ TOKEN_PRIVILEGES tp;
+ LUID luid;
+ HANDLE hToken = NULL;
+ TOKEN_PRIVILEGES tpPrevious;
+ DWORD cbPrevious = sizeof(TOKEN_PRIVILEGES);
+
+ if (!LookupPrivilegeValueW(NULL,
+ szPrivilege,
+ &luid)) {
+ return ERROR_NO_SUCH_PRIVILEGE;
+ }
+
+ if (!OpenProcessToken(GetCurrentProcess(),
+ TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
+ &hToken))
+ return GetLastError();
+ tp.PrivilegeCount = 1;
+ tp.Privileges[0].Luid = luid;
+ tp.Privileges[0].Attributes = 0;
+
+ if (!AdjustTokenPrivileges(hToken,
+ FALSE,
+ &tp,
+ sizeof(TOKEN_PRIVILEGES),
+ &tpPrevious,
+ &cbPrevious)) {
+ dwError = GetLastError();
+ }
+ else {
+ tpPrevious.PrivilegeCount = 1;
+ tpPrevious.Privileges[0].Luid = luid;
+
+ if (bEnablePrivilege)
+ tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED);
+ else
+ tpPrevious.Privileges[0].Attributes &= ~(SE_PRIVILEGE_ENABLED);
+
+ AdjustTokenPrivileges(hToken,
+ FALSE,
+ &tpPrevious,
+ cbPrevious,
+ NULL,
+ NULL);
+ /* Always check the last error because it can
+ * be ERROR_NOT_ALL_ASSIGNED even if TRUE is returned.
+ */
+ dwError = GetLastError();
+ }
+
+ CloseHandle(hToken);
+ return dwError;
+}
+
+DWORD ACR_EnablePrivilege(LPCWSTR szPrivilege)
+{
+ DWORD dwError;
+ HANDLE hToken;
+ TOKEN_PRIVILEGES tp;
+ LUID luid;
+
+ if (!LookupPrivilegeValueW(NULL, szPrivilege, &luid))
+ return ERROR_NO_SUCH_PRIVILEGE;
+
+ if (!OpenProcessToken(GetCurrentProcess(),
+ TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
+ &hToken))
+ return GetLastError();
+
+ tp.PrivilegeCount = 1;
+ tp.Privileges[0].Luid = luid;
+ tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+
+ AdjustTokenPrivileges(hToken,
+ FALSE,
+ &tp,
+ sizeof(TOKEN_PRIVILEGES),
+ NULL,
+ NULL);
+ dwError = GetLastError();
+ CloseHandle(hToken);
+
+ return dwError;
+}
+
+PSID ACR_DuplicateSid(JNIEnv *_E, PSID sSID)
+{
+ PSID pSID = NULL;
+
+ if (sSID && IsValidSid(sSID)) {
+ DWORD dwLen = GetLengthSid(sSID);
+ pSID = (PSID) ACR_Calloc(_E, THROW_NMARK, dwLen);
+ if (!pSID)
+ return NULL;
+ if (!CopySid(dwLen, pSID, sSID)) {
+ free(pSID);
+ pSID = NULL;
+ }
+ }
+ return pSID;
+}