r25598: Add missing become_root/unbecome_root around calls of add_aliases.
[samba.git] / source / python / py_ntsec.c
index 47524d8e19048cdfa21be4d9e06a5cc7718d1f0a..6cd59ae6d0eccd7b024e7cdb1babdfce25170745 100644 (file)
@@ -5,7 +5,7 @@
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "python/py_common.h"
@@ -58,14 +57,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;
 }
@@ -103,7 +102,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);
 
@@ -125,20 +124,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;
 }
@@ -160,16 +156,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;
@@ -181,19 +177,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);
 
-       if (py_from_SID(&obj, sd->owner_sid))
+       obj = PyInt_FromLong(sd->type);
+       PyDict_SetItemString(*dict, "type", obj);
+       Py_DECREF(obj);
+
+       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;
 }
@@ -202,6 +212,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;
@@ -215,6 +226,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) {
@@ -269,7 +286,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,