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:
parent
a721843197
commit
38d2b1794a
@ -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 */
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user