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;
+}