Started working on setprinter code.
authorTim Potter <tpot@samba.org>
Thu, 18 Apr 2002 03:35:05 +0000 (03:35 +0000)
committerTim Potter <tpot@samba.org>
Thu, 18 Apr 2002 03:35:05 +0000 (03:35 +0000)
source/python/py_common_proto.h
source/python/py_ntsec.c
source/python/py_spoolss_printers.c
source/python/py_spoolss_printers_conv.c
source/python/py_spoolss_proto.h
source/python/samba-head.patch

index 0c227ffef89cda9864647ef66e6e1fe6a0a953c8..bca59689a45c69f56f10f2a7513815685e493432 100644 (file)
@@ -19,12 +19,12 @@ struct cli_state *open_pipe_creds(char *system_name, PyObject *creds,
 /* The following definitions come from python/py_ntsec.c  */
 
 BOOL py_from_SID(PyObject **obj, DOM_SID *sid);
-BOOL py_to_SID(DOM_SID *sid, PyObject *dict);
+BOOL py_to_SID(DOM_SID *sid, PyObject *obj);
 BOOL py_from_ACE(PyObject **dict, SEC_ACE *ace);
 BOOL py_to_ACE(SEC_ACE *ace, PyObject *dict);
 BOOL py_from_ACL(PyObject **dict, SEC_ACL *acl);
-BOOL py_to_ACL(SEC_ACL *acl, PyObject *dict);
+BOOL py_to_ACL(SEC_ACL *acl, PyObject *dict, TALLOC_CTX *mem_ctx);
 BOOL py_from_SECDESC(PyObject **dict, SEC_DESC *sd);
-BOOL py_to_SECDESC(SEC_DESC *sd, PyObject *dict);
+BOOL py_to_SECDESC(SEC_DESC **sd, PyObject *dict, TALLOC_CTX *mem_ctx);
 
 #endif /*  _PY_COMMON_PROTO_H  */
index d97bbb6f8c8bc7beeaab831432803996535b5a05..d8ed50379f983629065386e341427e136b8932a1 100644 (file)
@@ -43,9 +43,19 @@ BOOL py_from_SID(PyObject **obj, DOM_SID *sid)
        return True;
 }
 
-BOOL py_to_SID(DOM_SID *sid, PyObject *dict)
+BOOL py_to_SID(DOM_SID *sid, PyObject *obj)
 {
-       return False;
+       BOOL result;
+
+       if (!PyString_Check(obj))
+               return False;
+
+       result = string_to_sid(sid, PyString_AsString(obj));
+
+       if (result)
+               DEBUG(0, ("py: got sid %s\n", PyString_AsString(obj)));
+
+       return result;
 }
 
 BOOL py_from_ACE(PyObject **dict, SEC_ACE *ace)
@@ -72,7 +82,50 @@ BOOL py_from_ACE(PyObject **dict, SEC_ACE *ace)
 
 BOOL py_to_ACE(SEC_ACE *ace, PyObject *dict)
 {
-       return False;
+       PyObject *obj;
+       uint8 ace_type, ace_flags;
+       DOM_SID trustee;
+       SEC_ACCESS sec_access;
+
+       if (!PyDict_Check(dict))
+               return False;
+
+       if (!(obj = PyDict_GetItemString(dict, "type")) ||
+           !PyInt_Check(obj))
+               return False;
+
+       ace_type = PyInt_AsLong(obj);
+
+       DEBUG(0, ("py: got ace_type %d\n", ace_type));
+
+       if (!(obj = PyDict_GetItemString(dict, "flags")) ||
+           !PyInt_Check(obj))
+               return False;
+
+       ace_flags = PyInt_AsLong(obj);
+
+       DEBUG(0, ("py: got ace_flags %d\n", ace_flags));
+
+       if (!(obj = PyDict_GetItemString(dict, "trustee")) ||
+           !PyString_Check(obj))
+               return False;
+
+       if (!py_to_SID(&trustee, obj))
+               return False;
+
+       DEBUG(0, ("py: got trustee\n"));
+
+       if (!(obj = PyDict_GetItemString(dict, "mask")) ||
+           !PyInt_Check(obj))
+               return False;
+
+       sec_access.mask = PyInt_AsLong(obj);
+
+       DEBUG(0, ("py: got mask 0x%08x\n", sec_access.mask));
+
+       init_sec_ace(ace, &trustee, ace_type, sec_access, ace_flags);
+
+       return True;
 }
 
 BOOL py_from_ACL(PyObject **dict, SEC_ACL *acl)
@@ -104,9 +157,39 @@ BOOL py_from_ACL(PyObject **dict, SEC_ACL *acl)
        return True;
 }
 
-BOOL py_to_ACL(SEC_ACL *acl, PyObject *dict)
+BOOL py_to_ACL(SEC_ACL *acl, PyObject *dict, TALLOC_CTX *mem_ctx)
 {
-       return False;
+       PyObject *obj;
+       uint32 i;
+
+       if (!(obj = PyDict_GetItemString(dict, "revision")) ||
+           !PyInt_Check(obj))
+               return False;
+
+       acl->revision = PyInt_AsLong(obj);
+
+       DEBUG(0, ("py: got revision %d\n", acl->revision));
+
+       if (!(obj = PyDict_GetItemString(dict, "ace_list")) ||
+           !PyList_Check(obj)) 
+               return False;
+       
+       acl->num_aces = PyList_Size(obj);
+
+       DEBUG(0, ("py: got num_aces %d\n", acl->num_aces));
+
+       acl->ace = talloc(mem_ctx, acl->num_aces * sizeof(SEC_ACE));
+
+       for (i = 0; i < acl->num_aces; i++) {
+               PyObject *py_ace = PyList_GetItem(obj, i);
+
+               if (!py_to_ACE(acl->ace, py_ace))
+                       return False;
+
+               DEBUG(0, ("py: got ace %d\n", i));
+       }
+
+       return True;
 }
 
 BOOL py_from_SECDESC(PyObject **dict, SEC_DESC *sd)
@@ -116,7 +199,6 @@ BOOL py_from_SECDESC(PyObject **dict, SEC_DESC *sd)
        *dict = PyDict_New();
 
        PyDict_SetItemString(*dict, "revision", PyInt_FromLong(sd->revision));
-       PyDict_SetItemString(*dict, "type", PyInt_FromLong(sd->type));
 
        if (py_from_SID(&obj, sd->owner_sid))
                PyDict_SetItemString(*dict, "owner_sid", obj);
@@ -133,7 +215,60 @@ BOOL py_from_SECDESC(PyObject **dict, SEC_DESC *sd)
        return True;
 }
 
-BOOL py_to_SECDESC(SEC_DESC *sd, PyObject *dict)
+BOOL py_to_SECDESC(SEC_DESC **sd, PyObject *dict, TALLOC_CTX *mem_ctx)
 {
-       return False;
+       PyObject *obj;
+       uint16 revision;
+       DOM_SID owner_sid, group_sid;
+       SEC_ACL sacl, dacl;
+       size_t sd_size;
+       BOOL got_dacl = False, got_sacl = False;
+
+       ZERO_STRUCT(dacl); ZERO_STRUCT(sacl);
+       ZERO_STRUCT(owner_sid); ZERO_STRUCT(group_sid);
+
+       if (!(obj = PyDict_GetItemString(dict, "revision")))
+               return False;
+
+       revision = PyInt_AsLong(obj);
+
+       if (!(obj = PyDict_GetItemString(dict, "owner_sid")))
+               return False;
+
+       if (!py_to_SID(&owner_sid, obj))
+               return False;
+
+       if (!(obj = PyDict_GetItemString(dict, "group_sid")))
+               return False;
+
+       if (!py_to_SID(&group_sid, obj))
+               return False;
+
+       if ((obj = PyDict_GetItemString(dict, "dacl"))) {
+
+               if (!py_to_ACL(&dacl, obj, mem_ctx))
+                       return False;
+
+               got_dacl = True;
+       }
+
+       DEBUG(0, ("py: got dacl\n"));
+
+       if ((obj = PyDict_GetItemString(dict, "sacl"))) {
+               if (obj != Py_None) {
+
+                       if (!py_to_ACL(&sacl, obj, mem_ctx))
+                               return False;
+
+                       got_sacl = True;
+               }
+       }
+
+       DEBUG(0, ("py: got sacl\n"));
+
+       *sd = make_sec_desc(mem_ctx, revision, &owner_sid, &group_sid,
+                           got_sacl ? &sacl : NULL, 
+                           got_dacl ? &dacl : NULL, &sd_size);
+       
+       return True;
 }
index 69b2733cfbed9b598c754f92409344591e3d0cc1..48321500e7db5ad3b9b536c36bd755ffb1bfbf54 100644 (file)
@@ -181,12 +181,8 @@ PyObject *spoolss_setprinter(PyObject *self, PyObject *args, PyObject *kw)
        uint32 level;
        static char *kwlist[] = {"dict", NULL};
        union {
-               PRINTER_INFO_0 printers_0;
-               PRINTER_INFO_1 printers_1;
                PRINTER_INFO_2 printers_2;
                PRINTER_INFO_3 printers_3;
-               PRINTER_INFO_4 printers_4;
-               PRINTER_INFO_5 printers_5;
        } pinfo;
 
        /* Parse parameters */
@@ -199,12 +195,22 @@ PyObject *spoolss_setprinter(PyObject *self, PyObject *args, PyObject *kw)
 
        if ((level_obj = PyDict_GetItemString(info, "level"))) {
 
-               if (!PyInt_Check(level_obj))
+               if (!PyInt_Check(level_obj)) {
+                       DEBUG(0, ("** level not an integer\n"));
                        goto error;
+               }
 
                level = PyInt_AsLong(level_obj);
 
+               /* Only level 2, 3 supported by NT */
+
+               if (level != 2 && level != 3) {
+                       DEBUG(0, ("** unsupported info level\n"));
+                       goto error;
+               }
+
        } else {
+               DEBUG(0, ("** no level info\n"));
        error:
                PyErr_SetString(spoolss_error, "invalid info");
                return NULL;
@@ -215,34 +221,14 @@ PyObject *spoolss_setprinter(PyObject *self, PyObject *args, PyObject *kw)
        ZERO_STRUCT(ctr);
 
        switch (level) {
-       case 2: {
-               PyObject *devmode_obj;
-
+       case 2:
                ctr.printers_2 = &pinfo.printers_2;
 
-               if (!py_to_PRINTER_INFO_2(&pinfo.printers_2, info))
+               if (!py_to_PRINTER_INFO_2(&pinfo.printers_2, info,
+                                         hnd->mem_ctx))
                        goto error;
 
-#if 0
-               devmode_obj = PyDict_GetItemString(info, "device_mode");
-
-               pinfo.printers_2.devmode = talloc(
-                       hnd->mem_ctx, sizeof(DEVICEMODE));
-
-               PyDEVICEMODE_AsDEVICEMODE(pinfo.printers_2.devmode, 
-                                         devmode_obj);
-
-#else
-
-               /* FIXME: can we actually set the security descriptor using
-                  a setprinter level 2? */
-
-               pinfo.printers_2.secdesc = NULL;
-               pinfo.printers_2.secdesc = NULL;
-
-#endif
                break;
-       }
        default:
                PyErr_SetString(spoolss_error, "unsupported info level");
                return NULL;
index 84b36ddbb27b9f09e99eaccf1d80d81bb15e0bb4..4b78f087e6d20108fb6f7a61179660b5e736eba1 100644 (file)
@@ -165,9 +165,7 @@ BOOL py_to_DEVICEMODE(DEVICEMODE *devmode, PyObject *dict)
 
        to_struct(devmode, dict, py_DEVICEMODE);
 
-       obj = PyDict_GetItemString(dict, "private");
-
-       if (!obj)
+       if (!(obj = PyDict_GetItemString(dict, "private")))
                return False;
 
        devmode->private = PyString_AsString(obj);
@@ -225,9 +223,28 @@ BOOL py_from_PRINTER_INFO_2(PyObject **dict, PRINTER_INFO_2 *info)
        return True;
 }
 
-BOOL py_to_PRINTER_INFO_2(PRINTER_INFO_2 *info, PyObject *dict)
+BOOL py_to_PRINTER_INFO_2(PRINTER_INFO_2 *info, PyObject *dict,
+                         TALLOC_CTX *mem_ctx)
 {
-       return False;
+       PyObject *obj;
+
+       to_struct(info, dict, py_PRINTER_INFO_2);
+
+       if (!(obj = PyDict_GetItemString(dict, "security_descriptor")))
+               return False;
+
+       if (!py_to_SECDESC(&info->secdesc, obj, mem_ctx))
+               return False;
+
+       if (!(obj = PyDict_GetItemString(dict, "device_mode")))
+               return False;
+
+       info->devmode = talloc(mem_ctx, sizeof(DEVICEMODE));
+
+       if (!py_to_DEVICEMODE(info->devmode, obj))
+               return False;
+
+       return True;
 }
 
 /*
index 3e3e5ef6eed402aec4a52f35fbf91747117ea1eb..47602d175dbacd8e97a4c7d8d7c2964ffc09d178 100644 (file)
@@ -6,8 +6,8 @@
 
 /* The following definitions come from python/py_spoolss.c  */
 
-PyObject *new_policy_hnd_object(struct cli_state *cli, TALLOC_CTX *mem_ctx
-                               POLICY_HND *pol);
+PyObject *new_spoolss_policy_hnd_object(struct cli_state *cli
+                                       TALLOC_CTX *mem_ctx, POLICY_HND *pol);
 void initspoolss(void);
 
 /* The following definitions come from python/py_spoolss_drivers.c  */
@@ -66,14 +66,6 @@ PyObject *spoolss_enumprinters(PyObject *self, PyObject *args, PyObject *kw);
 
 /* The following definitions come from python/py_spoolss_printers_conv.c  */
 
-BOOL py_from_SID(PyObject **obj, DOM_SID *sid);
-BOOL py_to_SID(DOM_SID *sid, PyObject *dict);
-BOOL py_from_ACE(PyObject **dict, SEC_ACE *ace);
-BOOL py_to_ACE(SEC_ACE *ace, PyObject *dict);
-BOOL py_from_ACL(PyObject **dict, SEC_ACL *acl);
-BOOL py_to_ACL(SEC_ACL *acl, PyObject *dict);
-BOOL py_from_SECDESC(PyObject **dict, SEC_DESC *sd);
-BOOL py_to_SECDESC(SEC_DESC *sd, PyObject *dict);
 BOOL py_from_DEVICEMODE(PyObject **dict, DEVICEMODE *devmode);
 BOOL py_to_DEVICEMODE(DEVICEMODE *devmode, PyObject *dict);
 BOOL py_from_PRINTER_INFO_0(PyObject **dict, PRINTER_INFO_0 *info);
@@ -81,7 +73,8 @@ BOOL py_to_PRINTER_INFO_0(PRINTER_INFO_0 *info, PyObject *dict);
 BOOL py_from_PRINTER_INFO_1(PyObject **dict, PRINTER_INFO_1 *info);
 BOOL py_to_PRINTER_INFO_1(PRINTER_INFO_1 *info, PyObject *dict);
 BOOL py_from_PRINTER_INFO_2(PyObject **dict, PRINTER_INFO_2 *info);
-BOOL py_to_PRINTER_INFO_2(PRINTER_INFO_2 *info, PyObject *dict);
+BOOL py_to_PRINTER_INFO_2(PRINTER_INFO_2 *info, PyObject *dict,
+                         TALLOC_CTX *mem_ctx);
 BOOL py_from_PRINTER_INFO_3(PyObject **dict, PRINTER_INFO_3 *info);
 BOOL py_to_PRINTER_INFO_3(PRINTER_INFO_3 *info, PyObject *dict);
 
index 223e0179fb7db86ed7d7ff6c08165a6efb535461..c8089934b864359c46d3107c3bd8eebb0544e517 100644 (file)
@@ -4,8 +4,8 @@ RCS file: /data/cvs/samba/source/Makefile.in,v
 retrieving revision 1.470
 diff -u -r1.470 Makefile.in
 --- Makefile.in        2002/04/13 11:45:33     1.470
-+++ Makefile.in        2002/04/14 01:01:05
-@@ -787,6 +787,36 @@
++++ Makefile.in        2002/04/18 03:34:05
+@@ -787,6 +787,43 @@
        -$(INSTALLCMD) -d ${prefix}/include
        -$(INSTALLCMD) include/libsmbclient.h ${prefix}/include
  
@@ -22,7 +22,9 @@ diff -u -r1.470 Makefile.in
 +
 +PY_LSA_PROTO_OBJ = python/py_lsa.o
 +
-+python_proto: python_spoolss_proto python_lsa_proto
++PY_COMMON_PROTO_OBJ = python/py_common.c python/py_ntsec.c
++
++python_proto: python_spoolss_proto python_lsa_proto python_common_proto
 +
 +python_spoolss_proto:
 +      @cd $(srcdir) && $(SHELL) script/mkproto.sh $(AWK) \
@@ -34,6 +36,11 @@ diff -u -r1.470 Makefile.in
 +              -h _PY_LSA_PROTO_H python/py_lsa_proto.h \
 +              $(PY_LSA_PROTO_OBJ)
 +
++python_common_proto:
++      @cd $(srcdir) && $(SHELL) script/mkproto.sh $(AWK) \
++              -h _PY_COMMON_PROTO_H python/py_common_proto.h \
++              $(PY_COMMON_PROTO_OBJ)
++
 +python_ext: $(PYTHON_OBJS)
 +      @echo python python/setup.py build
 +      @PYTHON_OBJS="$(PYTHON_OBJS)" PYTHON_CFLAGS="$(CFLAGS) $(CPPFLAGS)" \
@@ -48,7 +55,7 @@ RCS file: /data/cvs/samba/source/configure.in,v
 retrieving revision 1.300
 diff -u -r1.300 configure.in
 --- configure.in       2002/04/11 15:26:58     1.300
-+++ configure.in       2002/04/14 01:01:08
++++ configure.in       2002/04/18 03:34:05
 @@ -2716,7 +2716,7 @@
  builddir=`pwd`
  AC_SUBST(builddir)