r22542: Move over to using the _strict varients of the talloc
[tprouty/samba.git] / source / python / py_ntsec.c
index f216d96aa8ff84d46f0b54f3a42293f1445bc6ac..f82433a69ff819f7a6a72ea1f2a1bc78cde9a4e9 100644 (file)
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#include "includes.h"
-#include "Python.h"
-
-#include "python/py_common_proto.h"
+#include "python/py_common.h"
 
 /* Convert a SID to a Python dict */
 
@@ -61,14 +58,14 @@ BOOL py_from_ACE(PyObject **dict, SEC_ACE *ace)
                return True;
        }
 
-       *dict = PyDict_New();
-
-       PyDict_SetItemString(*dict, "type", PyInt_FromLong(ace->type));
-       PyDict_SetItemString(*dict, "flags", PyInt_FromLong(ace->flags));
-       PyDict_SetItemString(*dict, "mask", PyInt_FromLong(ace->info.mask));
+       *dict = Py_BuildValue("{sisisi}", "type", ace->type,
+                               "flags", ace->flags,
+                               "mask", ace->access_mask);
 
-       if (py_from_SID(&obj, &ace->trustee))
+       if (py_from_SID(&obj, &ace->trustee)) {
                PyDict_SetItemString(*dict, "trustee", obj);
+               Py_DECREF(obj);
+       }
 
        return True;
 }
@@ -106,7 +103,7 @@ BOOL py_to_ACE(SEC_ACE *ace, PyObject *dict)
            !PyInt_Check(obj))
                return False;
 
-       sec_access.mask = PyInt_AsLong(obj);
+       sec_access = PyInt_AsLong(obj);
 
        init_sec_ace(ace, &trustee, ace_type, sec_access, ace_flags);
 
@@ -128,20 +125,17 @@ BOOL py_from_ACL(PyObject **dict, SEC_ACL *acl)
                return True;
        }
 
-       *dict = PyDict_New();
-
-       PyDict_SetItemString(*dict, "revision", PyInt_FromLong(acl->revision));
-
        ace_list = PyList_New(acl->num_aces);
 
        for (i = 0; i < acl->num_aces; i++) {
                PyObject *obj;
 
-               if (py_from_ACE(&obj, &acl->ace[i]))
+               if (py_from_ACE(&obj, &acl->aces[i]))
                        PyList_SetItem(ace_list, i, obj);
        }
 
-       PyDict_SetItemString(*dict, "ace_list", ace_list);
+       *dict = Py_BuildValue("{sisN}", "revision", acl->revision,
+                       "ace_list", ace_list);
 
        return True;
 }
@@ -163,16 +157,16 @@ BOOL py_to_ACL(SEC_ACL *acl, PyObject *dict, TALLOC_CTX *mem_ctx)
        
        acl->num_aces = PyList_Size(obj);
 
-       acl->ace = talloc(mem_ctx, acl->num_aces * sizeof(SEC_ACE));
+       acl->aces = TALLOC_ARRAY(mem_ctx, struct security_ace, acl->num_aces);
        acl->size = SEC_ACL_HEADER_SIZE;
 
        for (i = 0; i < acl->num_aces; i++) {
                PyObject *py_ace = PyList_GetItem(obj, i);
 
-               if (!py_to_ACE(&acl->ace[i], py_ace))
+               if (!py_to_ACE(&acl->aces[i], py_ace))
                        return False;
 
-               acl->size += acl->ace[i].size;
+               acl->size += acl->aces[i].size;
        }
 
        return True;
@@ -184,19 +178,33 @@ BOOL py_from_SECDESC(PyObject **dict, SEC_DESC *sd)
 
        *dict = PyDict_New();
 
-       PyDict_SetItemString(*dict, "revision", PyInt_FromLong(sd->revision));
+       obj = PyInt_FromLong(sd->revision);
+       PyDict_SetItemString(*dict, "revision", obj);
+       Py_DECREF(obj);
+
+       obj = PyInt_FromLong(sd->type);
+       PyDict_SetItemString(*dict, "type", obj);
+       Py_DECREF(obj);
 
-       if (py_from_SID(&obj, sd->owner_sid))
+       if (py_from_SID(&obj, sd->owner_sid)) {
                PyDict_SetItemString(*dict, "owner_sid", obj);
+               Py_DECREF(obj);
+       }
 
-       if (py_from_SID(&obj, sd->grp_sid))
+       if (py_from_SID(&obj, sd->group_sid)) {
                PyDict_SetItemString(*dict, "group_sid", obj);
+               Py_DECREF(obj);
+       }
 
-       if (py_from_ACL(&obj, sd->dacl))
+       if (py_from_ACL(&obj, sd->dacl)) {
                PyDict_SetItemString(*dict, "dacl", obj);
+               Py_DECREF(obj);
+       }
 
-       if (py_from_ACL(&obj, sd->sacl))
+       if (py_from_ACL(&obj, sd->sacl)) {
                PyDict_SetItemString(*dict, "sacl", obj);
+               Py_DECREF(obj);
+       }
 
        return True;
 }
@@ -205,6 +213,7 @@ BOOL py_to_SECDESC(SEC_DESC **sd, PyObject *dict, TALLOC_CTX *mem_ctx)
 {
        PyObject *obj;
        uint16 revision;
+       uint16 type = SEC_DESC_SELF_RELATIVE;
        DOM_SID owner_sid, group_sid;
        SEC_ACL sacl, dacl;
        BOOL got_dacl = False, got_sacl = False;
@@ -218,6 +227,12 @@ BOOL py_to_SECDESC(SEC_DESC **sd, PyObject *dict, TALLOC_CTX *mem_ctx)
 
        revision = PyInt_AsLong(obj);
 
+       if ((obj = PyDict_GetItemString(dict, "type"))) {
+               if (obj != Py_None) {
+                       type = PyInt_AsLong(obj);
+               }
+       }
+
        if ((obj = PyDict_GetItemString(dict, "owner_sid"))) {
 
                if (obj != Py_None) {
@@ -272,7 +287,7 @@ BOOL py_to_SECDESC(SEC_DESC **sd, PyObject *dict, TALLOC_CTX *mem_ctx)
        {
                size_t sd_size;
 
-               *sd = make_sec_desc(mem_ctx, revision,
+               *sd = make_sec_desc(mem_ctx, revision, type,
                            got_owner_sid ? &owner_sid : NULL, 
                            got_group_sid ? &group_sid : NULL,
                            got_sacl ? &sacl : NULL,