r2817: Get winreg_GetKeySecurity() working but use data blob instead of
authorTim Potter <tpot@samba.org>
Mon, 4 Oct 2004 06:29:06 +0000 (06:29 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:59:36 +0000 (12:59 -0500)
security descriptor.
(This used to be commit bc5165e40a716fb7c612b32c0b6f03cb2d331d11)

source4/librpc/idl/winreg.idl
source4/scripting/swig/torture/winreg.py

index c06e94b34cb1962d15ec63da9540c7f77416b95d..428345ff30ac609f75d9b568fe38995dc28e9aef 100644 (file)
                [in,ref] policy_handle *handle
        );
 
+       typedef struct {
+               uint32 max_len;
+               uint32 offset;
+               uint32 len;
+       } KeySecuritySize;
+
+       typedef struct {
+               uint32 max_len;
+               DATA_BLOB data;
+       } KeySecurityData;
+
        /******************/
        /* Function: 0x0c */
        WERROR winreg_GetKeySecurity(
                [in,ref] policy_handle *handle,
-               [in] uint32 sec_info,
-               [in] uint32 *len1,
-               [in] uint32 empty,
-               [in] uint32 len2,
-               [in] uint32 unknown1,
-               [in] uint32 unknown2,
-               [out] sec_desc_buf *data
+               [in] uint32 unknown,
+               [in,out] KeySecuritySize *size,
+               [in,out] KeySecurityData data
        );
 
        /******************/
index b7a42042a8a9aca102fe1472b59f07cfded1dd20..eb60b9847eaca53f22dbf290ce5a1a0d7826d317 100755 (executable)
@@ -30,7 +30,49 @@ def test_CloseKey(pipe, handle):
 
     dcerpc.winreg_CloseKey(pipe, r)
 
-def test_Enum(pipe, handle, name, depth = 0):
+def test_FlushKey(pipe, handle):
+
+    r = {}
+    r['handle'] = handle
+    
+    dcerpc.winreg_FlushKey(pipe, r)
+
+def test_GetVersion(pipe, handle):
+
+    r = {}
+    r['handle'] = handle
+    
+    dcerpc.winreg_GetVersion(pipe, r)
+
+def test_GetKeySecurity(pipe, handle):
+
+    r = {}
+    r['handle'] = handle
+    r['unknown'] = 4
+    r['size'] = None
+    r['data'] = {}
+    r['data']['max_len'] = 0
+    r['data']['data'] = ''
+
+    result = dcerpc.winreg_GetKeySecurity(pipe, r)
+
+    print result
+
+    if result['result'] == dcerpc.WERR_INSUFFICIENT_BUFFER:
+        r['size'] = {}
+        r['size']['max_len'] = result['data']['max_len']
+        r['size']['offset'] = 0
+        r['size']['len'] = result['data']['max_len']
+
+        result = dcerpc.winreg_GetKeySecurity(pipe, r)
+
+    print result
+
+    sys.exit(1)
+    
+def test_Key(pipe, handle, name, depth = 0):
+
+    # Don't descend too far.  Registries can be very deep.
 
     if depth > 2:
         return
@@ -41,7 +83,38 @@ def test_Enum(pipe, handle, name, depth = 0):
         if arg[0] == dcerpc.WERR_ACCESS_DENIED:
             return
 
-    # Enumerate keys
+    test_GetVersion(pipe, handle)
+
+    test_FlushKey(pipe, handle)
+
+    test_GetKeySecurity(pipe, handle)
+
+    # Enumerate values in this key
+
+    r = {}
+    r['handle'] = handle
+    r['name_in'] = {}
+    r['name_in']['len'] = 0
+    r['name_in']['max_len'] = (keyinfo['max_valnamelen'] + 1) * 2
+    r['name_in']['buffer'] = {}
+    r['name_in']['buffer']['max_len'] = keyinfo['max_valnamelen']  + 1
+    r['name_in']['buffer']['offset'] = 0
+    r['name_in']['buffer']['len'] = 0
+    r['type'] = 0
+    r['value_in'] = {}
+    r['value_in']['max_len'] = keyinfo['max_valbufsize']
+    r['value_in']['offset'] = 0
+    r['value_in']['len'] = 0
+    r['value_len1'] = keyinfo['max_valbufsize']
+    r['value_len2'] = 0
+    
+    for i in range(0, keyinfo['num_values']):
+
+        r['enum_index'] = i
+
+        dcerpc.winreg_EnumValue(pipe, r)
+
+    # Recursively test subkeys of this key
 
     r = {}
     r['handle'] = handle
@@ -72,41 +145,13 @@ def test_Enum(pipe, handle, name, depth = 0):
 
         result = dcerpc.winreg_OpenKey(pipe, s)
 
-        test_Enum(pipe, result['handle'], name + '/' + s['keyname']['name'],
-                  depth + 1)
+        test_Key(pipe, result['handle'], name + '/' + s['keyname']['name'],
+                 depth + 1)
 
         test_CloseKey(pipe, result['handle'])
 
     # Enumerate values
 
-    r = {}
-    r['handle'] = handle
-
-    r['name_in'] = {}
-    r['name_in']['len'] = 0
-    r['name_in']['max_len'] = (keyinfo['max_valnamelen'] + 1) * 2
-    r['name_in']['buffer'] = {}
-    r['name_in']['buffer']['max_len'] = keyinfo['max_valnamelen']  + 1
-    r['name_in']['buffer']['offset'] = 0
-    r['name_in']['buffer']['len'] = 0
-    r['type'] = 0
-    r['value_in'] = {}
-    r['value_in']['max_len'] = keyinfo['max_valbufsize']
-    r['value_in']['offset'] = 0
-    r['value_in']['len'] = 0
-    r['value_len1'] = keyinfo['max_valbufsize']
-    r['value_len2'] = 0
-    
-    for i in range(0, keyinfo['num_values']):
-
-        r['enum_index'] = i
-
-        dcerpc.winreg_EnumValue(pipe, r)
-
-def test_Key(pipe, handle, name):
-
-    test_Enum(pipe, handle, name)
-
 def runtests(binding, domain, username, password):
     
     print 'Testing WINREG pipe'