1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-04 05:18:06 +03:00

Started working on setprinter code.

This commit is contained in:
Tim Potter 0001-01-01 00:00:00 +00:00
parent a721843197
commit 38d2b1794a
6 changed files with 197 additions and 59 deletions

View 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 */

View 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;
}

View 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;

View 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;
}
/*

View 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);

View 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)