Antti Aalto пре 9 година
родитељ
комит
4487b37e50
1 измењених фајлова са 23 додато и 10 уклоњено
  1. 23 10
      src/borg/platform/windows.pyx

+ 23 - 10
src/borg/platform/windows.pyx

@@ -37,17 +37,29 @@ cdef extern from 'windows.h':
     ctypedef BYTE* PSID
     struct _ACL:
         uint16_t AceCount
+        
+    cdef enum _SID_NAME_USE:
+        SidTypeUser,
+        SidTypeGroup,
+        SidTypeDomain,
+        SidTypeAlias,
+        SidTypeWellKnownGroup,
+        SidTypeDeletedAccount,
+        SidTypeInvalid,
+        SidTypeUnknown,
+        SidTypeComputer,
+        SidTypeLabel
 
     HLOCAL LocalFree(HLOCAL)
     DWORD GetLastError();
     void SetLastError(DWORD)
 
-    DWORD FormatMessageW(DWORD, void*, DWORD, DWORD, wchar_t**, DWORD, void*)
+    DWORD FormatMessageW(DWORD, void*, DWORD, DWORD, wchar_t*, DWORD, void*)
 
 
     BOOL InitializeSecurityDescriptor(BYTE*, DWORD)
 
-    BOOL LookupAccountNameW(LPCTSTR, LPCTSTR, PSID, LPDWORD, LPCTSTR, LPDWORD, LPDWORD)
+    BOOL LookupAccountNameW(LPCTSTR, LPCTSTR, PSID, LPDWORD, LPCTSTR, LPDWORD, _SID_NAME_USE*)
     BOOL GetSecurityDescriptorDacl(PSID, BOOL*, _ACL**, BOOL*)
 
     cdef extern int ERROR_INSUFFICIENT_BUFFER
@@ -101,7 +113,7 @@ cdef extern from 'Sddl.h':
 
     BOOL GetFileSecurityW(LPCTSTR, int, PSID, DWORD, LPDWORD)
     BOOL GetSecurityDescriptorOwner(PSID, PSID*, LPBOOL)
-    BOOL LookupAccountSidW(LPCTSTR, PSID, LPCTSTR, LPDWORD, LPCTSTR, LPDWORD, uint16_t*)
+    BOOL LookupAccountSidW(LPCTSTR, PSID, LPCTSTR, LPDWORD, LPCTSTR, LPDWORD, _SID_NAME_USE*)
     BOOL ConvertSidToStringSidW(PSID, LPCTSTR*)
     BOOL ConvertStringSidToSidW(LPCTSTR, PSID*)
     BOOL ConvertSecurityDescriptorToStringSecurityDescriptorW(BYTE*, DWORD, int, LPCTSTR*, int*)
@@ -122,7 +134,7 @@ def raise_error(api, path=''):
     if not error:
         return
     FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
-                   NULL, error, 0, &error_message, 0, NULL)
+                   NULL, error, 0, <wchar_t*>&error_message, 0, NULL)
     error_string = PyUnicode_FromWideChar(error_message, -1)
     LocalFree(<HLOCAL>error_message)
     error_string = api + ': ' + error_string
@@ -162,7 +174,7 @@ cdef _look_up_account_sid(PSID sid):
     cdef wchar_t* domain = <wchar_t*>malloc((SIZE) * sizeof(wchar_t))
     cdef DWORD cch_name = SIZE
     cdef DWORD cch_domain = SIZE
-    cdef uint16_t sid_type = <uint16_t>0
+    cdef _SID_NAME_USE sid_type
 
     cdef BOOL ret = LookupAccountSidW(NULL, sid, name, &cch_name, domain, &cch_domain, &sid_type)
     if ret == 0:
@@ -199,17 +211,18 @@ def get_owner(path):
     if sid == NULL:
         return 'unknown', 'S-1-0-0'
     name, domain, sid_type = _look_up_account_sid(sid)
+    sidstr = sid2string(sid)
     free(sd)
     if domain and domain.lower() != platform.node().lower() and domain != 'BUILTIN':
-        return '{0}\\{1}'.format(domain, name), sid2string(sid)
+        return '{0}\\{1}'.format(domain, name), sidstr
     else:
-        return name, sid2string(sid)
+        return name, sidstr
 
 
 def set_owner(path, owner, sidstring = None):
     cdef PSID newsid
     cdef wchar_t* temp
-    cdef DWORD sid_type = 0
+    cdef _SID_NAME_USE sid_type
     cdef DWORD length = 0
     cdef DWORD domainlength = 0
     if sidstring is not None:
@@ -260,7 +273,7 @@ def acl_get(path, item, st, numeric_owner=False):
     pyDACL = []
     cdef PSID newsid
     cdef uint32_t domainlength
-    cdef uint32_t sid_type
+    cdef _SID_NAME_USE sid_type
     for i in range(length):
         permissions = None
         name = ""
@@ -270,7 +283,7 @@ def acl_get(path, item, st, numeric_owner=False):
             sidstr = sid2string(<PSID>(ACEs[i].Trustee.ptstrName))
 
         elif ACEs[i].Trustee.TrusteeForm == TRUSTEE_IS_NAME:
-            sid_type = 0
+            sid_type = SidTypeInvalid
             domainlength = 0
             LookupAccountNameW(NULL, ACEs[i].Trustee.ptstrName, NULL, &(length), NULL, &domainlength, &sid_type)