From 39adc2418a0586261c6c4aea36f72596c6cf8897 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 21 Nov 2007 13:07:16 +0100 Subject: r26088: Import some native-python python modules and move original python swig torture code to common python directory as well. (This used to be commit cbf656ff054ab2b0b5ca81e1d4f16ac54c8098f1) --- source4/scripting/python/config.mk | 35 + source4/scripting/python/misc.i | 32 + source4/scripting/python/parammodule.c | 182 +++++ source4/scripting/python/samba/__init__.py | 57 ++ source4/scripting/python/samba/getopt.py | 46 ++ source4/scripting/python/samba/samr.py | 753 +++++++++++++++++++++ source4/scripting/python/samba/torture/pytorture | 51 ++ source4/scripting/python/samba/torture/spoolss.py | 437 ++++++++++++ .../scripting/python/samba/torture/torture_samr.py | 221 ++++++ .../scripting/python/samba/torture/torture_tdb.py | 90 +++ source4/scripting/python/samba/torture/winreg.py | 165 +++++ source4/scripting/python/sidmodule.c | 57 ++ source4/scripting/python/uuidmodule.c | 57 ++ source4/scripting/swig/README | 20 - source4/scripting/swig/config.m4 | 29 - source4/scripting/swig/config.mk | 19 - source4/scripting/swig/samba.i | 57 -- source4/scripting/swig/samr.py | 753 --------------------- source4/scripting/swig/status_codes.i | 554 --------------- source4/scripting/swig/torture/pytorture | 51 -- source4/scripting/swig/torture/spoolss.py | 437 ------------ source4/scripting/swig/torture/torture_samr.py | 221 ------ source4/scripting/swig/torture/torture_tdb.py | 90 --- source4/scripting/swig/torture/winreg.py | 165 ----- 24 files changed, 2183 insertions(+), 2396 deletions(-) create mode 100644 source4/scripting/python/config.mk create mode 100644 source4/scripting/python/misc.i create mode 100644 source4/scripting/python/parammodule.c create mode 100644 source4/scripting/python/samba/__init__.py create mode 100644 source4/scripting/python/samba/getopt.py create mode 100644 source4/scripting/python/samba/samr.py create mode 100755 source4/scripting/python/samba/torture/pytorture create mode 100644 source4/scripting/python/samba/torture/spoolss.py create mode 100755 source4/scripting/python/samba/torture/torture_samr.py create mode 100755 source4/scripting/python/samba/torture/torture_tdb.py create mode 100755 source4/scripting/python/samba/torture/winreg.py create mode 100644 source4/scripting/python/sidmodule.c create mode 100644 source4/scripting/python/uuidmodule.c delete mode 100644 source4/scripting/swig/README delete mode 100644 source4/scripting/swig/config.m4 delete mode 100644 source4/scripting/swig/config.mk delete mode 100644 source4/scripting/swig/samba.i delete mode 100644 source4/scripting/swig/samr.py delete mode 100644 source4/scripting/swig/status_codes.i delete mode 100755 source4/scripting/swig/torture/pytorture delete mode 100644 source4/scripting/swig/torture/spoolss.py delete mode 100755 source4/scripting/swig/torture/torture_samr.py delete mode 100755 source4/scripting/swig/torture/torture_tdb.py delete mode 100755 source4/scripting/swig/torture/winreg.py (limited to 'source4/scripting') diff --git a/source4/scripting/python/config.mk b/source4/scripting/python/config.mk new file mode 100644 index 0000000000..1c9ffb20ac --- /dev/null +++ b/source4/scripting/python/config.mk @@ -0,0 +1,35 @@ +[PYTHON::python_param] +PRIVATE_DEPENDENCIES = LIBSAMBA-CONFIG +OBJ_FILES = parammodule.o + +[PYTHON::python_uuid] +PRIVATE_DEPENDENCIES = LIBNDR +OBJ_FILES = uuidmodule.o + +[PYTHON::python_sid] +PRIVATE_DEPENDENCIES = LIBNDR +OBJ_FILES = sidmodule.o + +[PYTHON::python_misc] +PRIVATE_DEPENDENCIES = LIBNDR LIBLDB +SWIG_FILE = misc.i + +# Swig extensions +swig: pythonmods + +.SUFFIXES: _wrap.c .i + +.i_wrap.c: + swig -Wall -I$(srcdir)/scripting/swig -python $< + +clean:: + @echo "Removing SWIG output files" + @-rm -f bin/python/* + # FIXME: Remove _wrap.c files + # +pythonmods: $(PYTHON_DSOS) + +PYDOCTOR_MODULES=bin/python/ldb.py bin/python/auth.py bin/python/credentials.py bin/python/registry.py + +pydoctor:: pythonmods + LD_LIBRARY_PATH=bin/shared PYTHONPATH=bin/python pydoctor --make-html --docformat=restructuredtext --add-package scripting/python/samba/ $(addprefix --add-module , $(PYDOCTOR_MODULES)) diff --git a/source4/scripting/python/misc.i b/source4/scripting/python/misc.i new file mode 100644 index 0000000000..088522320e --- /dev/null +++ b/source4/scripting/python/misc.i @@ -0,0 +1,32 @@ +/* + Unix SMB/CIFS implementation. + Copyright (C) Jelmer Vernooij 2007 + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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, see . +*/ + +%module(package="samba.misc") misc + +%{ +#include "includes.h" +#include "ldb.h" +#include "auth/credentials/credentials.h" +%} + +%import "stdint.i" +%import "../../lib/talloc/talloc.i" + +%rename(random_password) generate_random_str; +char *generate_random_str(TALLOC_CTX *mem_ctx, size_t len); + diff --git a/source4/scripting/python/parammodule.c b/source4/scripting/python/parammodule.c new file mode 100644 index 0000000000..38d312cf1d --- /dev/null +++ b/source4/scripting/python/parammodule.c @@ -0,0 +1,182 @@ +/* + Unix SMB/CIFS implementation. + + Python wrapper for reading smb.conf files + + Copyright (C) Jelmer Vernooij 2007 + + 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 + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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. +*/ + +#include "includes.h" +#include "scripting/python/talloc.h" +#include "Python.h" +#include "param/param.h" + +staticforward PyTypeObject param_ParamFileType; + +typedef struct { + PyObject_HEAD + struct param_context *param_ctx; +} param_ParamFileObject; + +static param_ParamFileObject *py_param_init(void) +{ + param_ParamFileObject *param; + + param = PyObject_New(param_ParamFileObject, ¶m_ParamFileType); + + param->param_ctx = param_init(NULL); + + return param; +} + +static PyObject *py_param_load(PyObject *self, PyObject *args) +{ + char *filename = NULL; + param_ParamFileObject *param; + + if (!PyArg_ParseTuple(args, "|s:new", &filename)) + return NULL; + + param = py_param_init(); + + if (filename != NULL) { + int ret = param_read(param->param_ctx, filename); + + if (ret == -1) { + PyErr_SetString(PyExc_TypeError, "reading file failed"); + return NULL; + } + } + + return (PyObject *)param; +} + +static void +param_dealloc(PyObject* self) +{ + PyObject_Del(self); +} + +static PyObject *py_param_get(PyObject *_self, PyObject *args) +{ + struct param_opt *param; + const char *section_name = NULL, *param_name = NULL; + param_ParamFileObject *self = (param_ParamFileObject *)_self; + + if (!PyArg_ParseTuple(args, (char *)"s|s", ¶m_name, §ion_name)) + return NULL; + + param = param_get(self->param_ctx, section_name, param_name); + if (param == NULL) + return Py_None; + + return PyString_FromString(param->value); +} + +static PyObject *py_param_set(PyObject *_self, PyObject *args) +{ + param_ParamFileObject *self = (param_ParamFileObject *)_self; + const char *section_name = NULL, *param_name = NULL, *param_value = NULL; + + if (!PyArg_ParseTuple(args, "ss|s", ¶m_name, ¶m_value, §ion_name)) + return NULL; + + if (section_name == NULL) + section_name = GLOBAL_NAME; + + if (param_set_string(self->param_ctx, section_name, param_name, param_value) != 0) { + PyErr_SetString(PyExc_TypeError, "setting variable failed"); + return NULL; + } + + return Py_None; +} + +static PyObject *py_param_save(PyObject *_self, PyObject *args) +{ + param_ParamFileObject *self = (param_ParamFileObject *)_self; + const char *filename = NULL; + + if (!PyArg_ParseTuple(args, "s", &filename)) + return NULL; + + if (param_write(self->param_ctx, filename) != 0) { + PyErr_SetString(PyExc_TypeError, "unable to save"); + return NULL; + } + + return Py_None; +} + +static PyObject *py_param_use(PyObject *_self, PyObject *args) +{ + param_ParamFileObject *self = (param_ParamFileObject *)_self; + + if (!PyArg_ParseTuple(args, "")) + return NULL; + + if (param_use(global_loadparm, self->param_ctx) != 0) { + PyErr_SetString(PyExc_TypeError, "unable to use"); + return NULL; + } + + return Py_None; +} + +static PyMethodDef param_methods[] = { + {"get", (PyCFunction)py_param_get, METH_VARARGS, + "Get a parameter."}, + {"set", (PyCFunction)py_param_set, METH_VARARGS, + "Set a parameter."}, + {"save", (PyCFunction)py_param_save, METH_VARARGS, + "Save file" }, + {"use", (PyCFunction)py_param_use, METH_VARARGS, + "Use param file" }, + {NULL, NULL, 0, NULL} +}; + +static PyObject * +param_getattr(PyTypeObject *obj, char *name) +{ + return Py_FindMethod(param_methods, (PyObject *)obj, name); +} + +static PyTypeObject param_ParamFileType = { + PyObject_HEAD_INIT(NULL) 0, + .tp_name = "ParamFile", + .tp_basicsize = sizeof(param_ParamFileObject), + .tp_dealloc = param_dealloc, + .tp_getattr = param_getattr, +}; + + +static PyMethodDef methods[] = { + { "ParamFile", (PyCFunction)py_param_load, METH_VARARGS, NULL}, + { NULL, NULL } +}; + +PyDoc_STRVAR(param_doc, "Simple wrappers around the smb.conf parsers"); + +PyMODINIT_FUNC initparam(void) +{ + PyObject *mod = Py_InitModule3("param", methods, param_doc); + if (mod == NULL) + return; + + PyModule_AddObject(mod, "configfile", + PyString_FromString(lp_configfile(global_loadparm))); +} diff --git a/source4/scripting/python/samba/__init__.py b/source4/scripting/python/samba/__init__.py new file mode 100644 index 0000000000..46d8ff7d37 --- /dev/null +++ b/source4/scripting/python/samba/__init__.py @@ -0,0 +1,57 @@ +#!/usr/bin/python + +# Unix SMB/CIFS implementation. +# Copyright (C) Andrew Tridgell 2005 +# Copyright (C) Jelmer Vernooij 2007 +# +# 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# 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, see . +# + +import os +from misc import ldb_set_credentials + +def Ldb(url, session_info=None, credentials=None, modules_dir=None): + """Open a Samba Ldb file. + + This is different from a regular Ldb file in that the Samba-specific + modules-dir is used by default and that credentials and session_info + can be passed through (required by some modules). + """ + import ldb + ret = ldb.Ldb() + if modules_dir is None: + modules_dir = os.path.join(os.getcwd(), "bin", "modules", "ldb") + ret.set_modules_dir(modules_dir) + def samba_debug(level,text): + print "%d %s" % (level, text) + ldb_set_opaque("credentials", credentials) + ret.set_opaque("sessionInfo", session_info) + #ret.set_debug(samba_debug) + ret.connect(url) + return ret + + +def substitute_var(text, values): + """substitute strings of the form ${NAME} in str, replacing + with substitutions from subobj. + + :param text: Text in which to subsitute. + :param values: Dictionary with keys and values. + """ + + for (name, value) in values.items(): + text = text.replace("${%s}" % name, value) + + return text + diff --git a/source4/scripting/python/samba/getopt.py b/source4/scripting/python/samba/getopt.py new file mode 100644 index 0000000000..8143dcafdb --- /dev/null +++ b/source4/scripting/python/samba/getopt.py @@ -0,0 +1,46 @@ +#!/usr/bin/python + +# Samba-specific bits for optparse +# Copyright (C) Jelmer Vernooij 2007 +# +# 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 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# 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, see . +# + +import optparse +from credentials import Credentials + +class SambaOptions(optparse.OptionGroup): + def __init__(self, parser): + optparse.OptionGroup.__init__(self, parser, "Samba Common Options") + self.add_option("--configfile", type="string", metavar="FILE", + help="Configuration file") + + +class VersionOptions(optparse.OptionGroup): + def __init__(self, parser): + optparse.OptionGroup.__init__(self, parser, "Version Options") + + +class CredentialsOptions(optparse.OptionGroup): + def __init__(self, parser): + optparse.OptionGroup.__init__(self, parser, "Credentials Options") + self.add_option("--simple-bind-dn", type="string", metavar="DN", + help="DN to use for a simple bind") + self.add_option("--password", type="string", metavar="PASSWORD", + help="Password") + + def get_credentials(self): + creds = Credentials() + # FIXME: Update + return creds diff --git a/source4/scripting/python/samba/samr.py b/source4/scripting/python/samba/samr.py new file mode 100644 index 0000000000..314f78b8ad --- /dev/null +++ b/source4/scripting/python/samba/samr.py @@ -0,0 +1,753 @@ +import dcerpc + +def sid_to_string(sid): + """Convert a Python dictionary SID to a string SID.""" + + result = 'S-%d' % sid.sid_rev_num + + result = result + '-%u' % \ + (dcerpc.uint8_array_getitem(sid.id_auth, 5) + + (dcerpc.uint8_array_getitem(sid.id_auth, 4) << 8) + + (dcerpc.uint8_array_getitem(sid.id_auth, 3) << 16) + + (dcerpc.uint8_array_getitem(sid.id_auth, 2) << 24)) + + for i in range(0, sid.num_auths): + result = result + '-%u' % \ + dcerpc.uint32_array_getitem(sid.sub_auths, i) + + return result + +def string_to_sid(string): + """Convert a string SID to a Python dictionary SID. Throws a + ValueError if the SID string was badly formed.""" + + if string[0] != 'S': + raise ValueError('Bad SID format') + + string = string[1:] + + import re + + match = re.match('-\d+', string) + + if not match: + raise ValueError('Bad SID format') + + try: + sid_rev_num = int(string[match.start()+1:match.end()]) + except ValueError: + raise ValueError('Bad SID format') + + string = string[match.end():] + + match = re.match('-\d+', string) + + if not match: + raise ValueError('Bad SID format') + + try: + ia = int(string[match.start()+1:match.end()]) + except ValueError: + raise ValueError('Bad SID format') + + string = string[match.end():] + + id_auth = [0, 0, (ia >> 24) & 0xff, (ia >> 16) & 0xff, + (ia >> 8) & 0xff, ia & 0xff] + + num_auths = 0 + sub_auths = [] + + while len(string): + + match = re.match('-\d+', string) + + if not match: + raise ValueError('Bad SID format') + + try: + sa = int(string[match.start() + 1 : match.end()]) + except ValueError: + raise ValueError('Bad SID format') + + num_auths = num_auths + 1 + sub_auths.append(int(sa)) + + string = string[match.end():] + + sid = dcerpc.dom_sid() + sid.sid_rev_num = sid_rev_num + sid.id_auth = dcerpc.new_uint8_array(6) + for i in range(6): + dcerpc.uint8_array_setitem(sid.id_auth, i, id_auth[i]) + sid.num_auths = num_auths + sid.sub_auths = dcerpc.new_uint32_array(num_auths) + for i in range(num_auths): + dcerpc.uint32_array_setitem(sid.sub_auths, i, sub_auths[i]) + + return sid + +def call_fn(fn, pipe, args): + """Wrap up a RPC call and throw an exception is an error was returned.""" + + result = fn(pipe, args); + + if result & 0xc0000000L: + raise dcerpc.NTSTATUS(result, dcerpc.nt_errstr(result)); + + return result; + +class SamrHandle: + + def __init__(self, pipe, handle): + + self.pipe = pipe + self.handle = handle + + def __del__(self): + + if self.handle is not None: + self.Close() + + def Close(self): + + r = dcerpc.samr_Close() + r.data_in.handle = self.handle + + call_fn(dcerpc.dcerpc_samr_Close, self.pipe, r) + + self.handle = None + + def QuerySecurity(self, sec_info = 7): + + r = dcerpc.samr_QuerySecurity() + r.data_in.handle = self.handle + r.data_in.sec_info = sec_info + + call_fn(dcerpc.dcerpc_samr_QuerySecurity, self.pipe, r) + + return r.data_out.sdbuf + + def SetSecurity(self, sdbuf, sec_info = 7): + + r = dcerpc.samr_SetSecurity() + r.data_in.handle = self.handle + r.data_in.sec_info = sec_info + r.data_in.sdbuf = sdbuf + + call_fn(dcerpc.dcerpc_samr_SetSecurity, self.pipe, r) + +class ConnectHandle(SamrHandle): + + def EnumDomains(self): + + r = dcerpc.samr_EnumDomains() + r.data_in.connect_handle = self.handle + r.data_in.resume_handle = 0 + r.data_in.buf_size = -1 + + domains = [] + + while 1: + + call_fn(dcerpc.dcerpc_samr_EnumDomains, self.pipe, r) + + for i in range(r.data_out.sam.count): + domains.append(dcerpc.samr_SamEntry_array_getitem( + r.data_out.sam.entries, i).name.string) + + # TODO: Handle more entries here + + break + + return domains + + def LookupDomain(self, domain_name): + + r = dcerpc.samr_LookupDomain() + r.data_in.connect_handle = self.handle + r.data_in.domain_name = dcerpc.samr_String() + r.data_in.domain_name.string = domain_name + + call_fn(dcerpc.dcerpc_samr_LookupDomain, self.pipe, r) + + return sid_to_string(r.data_out.sid); + + def OpenDomain(self, domain_sid, access_mask = 0x02000000): + + r = dcerpc.samr_OpenDomain() + r.data_in.connect_handle = self.handle + r.data_in.access_mask = access_mask + r.data_in.sid = string_to_sid(domain_sid) + + call_fn(dcerpc.dcerpc_samr_OpenDomain, self.pipe, r) + + return DomainHandle(self.pipe, r.data_out.domain_handle) + + def Shutdown(self): + + r = dcerpc.samr_Shutdown() + r.data_in.connect_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_Shutdown, self.pipe, r) + + def GetDomPwInfo(self, domain_name): + + r = dcerpc.samr_GetDomPwInfo() + r.data_in.domain_name = dcerpc.samr_String() + r.data_in.domain_name.string = domain_name + + call_fn(dcerpc.dcerpc_samr_GetDomPwInfo, self.pipe, r) + + return r.data_out.info + + + def SetBootKeyInformation(self, unknown1, unknown2, unknown3): + + r = dcerpc.samr_GetBootKeyInformation() + r.data_in.connect_handle = self.handle + r.data_in.unknown1 = unknown1 + r.data_in.unknown2 = unknown2 + r.data_in.unknown3 = unknown3 + + call_fn(dcerpc.dcerpc_samr_SetBootKeyInformation, self.pipe, r) + +class DomainHandle(SamrHandle): + + def QueryDomainInfo(self, level = 2): + + r = dcerpc.samr_QueryDomainInfo() + r.data_in.domain_handle = self.handle + r.data_in.level = level + + call_fn(dcerpc.dcerpc_samr_QueryDomainInfo, self.pipe, r) + + return getattr(r.data_out.info, 'info%d' % level) + + def QueryDomainInfo2(self, level = 2): + + r = dcerpc.samr_QueryDomainInfo2() + r.data_in.domain_handle = self.handle + r.data_in.level = level + + call_fn(dcerpc.dcerpc_samr_QueryDomainInfo2, self.pipe, r) + + return getattr(r.data_out.info, 'info%d' % level) + + def SetDomainInfo(self, level, info): + + r = dcerpc.samr_SetDomainInfo() + r.data_in.domain_handle = self.handle + r.data_in.level = level + r.data_in.info = dcerpc.samr_DomainInfo() + setattr(r.data_in.info, 'info%d' % level, info) + + call_fn(dcerpc.dcerpc_samr_SetDomainInfo, self.pipe, r) + + def EnumDomainGroups(self): + + r = dcerpc.samr_EnumDomainGroups() + r.data_in.domain_handle = self.handle + r.data_in.resume_handle = 0 + r.data_in.max_size = 1000 + + call_fn(dcerpc.dcerpc_samr_EnumDomainGroups, self.pipe, r) + + groups = [] + + if r.data_out.sam.entries: + for i in range(r.data_out.sam.count): + groups.append(dcerpc.samr_SamEntry_array_getitem( + r.data_out.sam.entries, i).name.string) + + return groups + + def EnumDomainAliases(self): + + r = dcerpc.samr_EnumDomainAliases() + r.data_in.domain_handle = self.handle + r.data_in.resume_handle = 0 + # acct_flags in SamrEnumerateAliasesInDomain has probably + # no meaning so use 0xffffffff like W2K + r.data_in.acct_flags = 0xffffffffL + + call_fn(dcerpc.dcerpc_samr_EnumDomainAliases, self.pipe, r) + + aliases = [] + + if r.data_out.sam.entries: + for i in range(r.data_out.sam.count): + aliases.append(dcerpc.samr_SamEntry_array_getitem( + r.data_out.sam.entries, i).name.string) + + return aliases + + def EnumDomainUsers(self, user_account_flags = 16): + + r = dcerpc.samr_EnumDomainUsers() + r.data_in.domain_handle = self.handle + r.data_in.resume_handle = 0 + r.data_in.acct_flags = user_account_flags + r.data_in.max_size = 1000 + + call_fn(dcerpc.dcerpc_samr_EnumDomainUsers, self.pipe, r) + + users = [] + + if r.data_out.sam.entries: + for i in range(r.data_out.sam.count): + users.append(dcerpc.samr_SamEntry_array_getitem( + r.data_out.sam.entries, i).name.string) + + return users + + def CreateUser(self, account_name, access_mask = 0x02000000): + + r = dcerpc.samr_CreateUser() + r.data_in.domain_handle = self.handle + r.data_in.account_name = dcerpc.samr_String() + r.data_in.account_name.string = account_name + r.data_in.access_mask = access_mask + + call_fn(dcerpc.dcerpc_samr_CreateUser, self.pipe, r) + + return (r.data_out.user_handle, + dcerpc.uint32_array_getitem(r.data_out.rid, 0)) + + def CreateUser2(self, account_name, acct_flags = 0x00000010, + access_mask = 0x02000000): + + r = dcerpc.samr_CreateUser2() + r.data_in.domain_handle = self.handle + r.data_in.account_name = dcerpc.samr_String() + r.data_in.account_name.string = account_name + r.data_in.acct_flags = acct_flags + r.data_in.access_mask = access_mask + + call_fn(dcerpc.dcerpc_samr_CreateUser2, self.pipe, r) + + return (r.data_out.user_handle, + dcerpc.uint32_array_getitem(r.data_out.access_granted, 0), + dcerpc.uint32_array_getitem(r.data_out.rid, 0)) + + def OpenUser(self, rid, access_mask = 0x02000000): + + r = dcerpc.samr_OpenUser() + r.data_in.domain_handle = self.handle + r.data_in.access_mask = access_mask + r.data_in.rid = rid + + call_fn(dcerpc.dcerpc_samr_OpenUser, self.pipe, r) + + return UserHandle(self.pipe, r.data_out.user_handle) + + def OpenGroup(self, rid, access_mask = 0x02000000): + + r = dcerpc.samr_OpenGroup() + r.data_in.domain_handle = self.handle + r.data_in.access_mask = access_mask + r.data_in.rid = rid + + call_fn(dcerpc.dcerpc_samr_OpenGroup, self.pipe, r) + + return GroupHandle(self.pipe, r.data_out.group_handle) + + def OpenAlias(self, rid, access_mask = 0x02000000): + + r = dcerpc.samr_OpenAlias() + r.data_in.domain_handle = self.handle + r.data_in.access_mask = access_mask + r.data_in.rid = rid + + call_fn(dcerpc.dcerpc_samr_OpenAlias, self.pipe, r) + + return AliasHandle(self.pipe, r.data_out.alias_handle) + + def CreateDomAlias(self, alias_name, access_mask = 0x02000000): + + r = dcerpc.samr_CreateDomAlias() + r.data_in.domain_handle = self.handle + r.data_in.alias_name = dcerpc.samr_String() + r.data_in.alias_name.string = alias_name + r.data_in.access_mask = access_mask + + call_fn(dcerpc.dcerpc_samr_CreateDomAlias, self.pipe, r) + + return (AliasHandle(self.pipe, r.data_out.alias_handle), + r.data_out.rid) + + def RidToSid(self, rid): + + r = dcerpc.samr_RidToSid() + r.data_in.domain_handle = self.handle + r.data_in.rid = rid + + call_fn(dcerpc.dcerpc_samr_RidToSid, self.pipe, r) + + return sid_to_string(r.data_out.sid) + + def RemoveMemberFromForeignDomain(self, sid): + + r = dcerpc.samr_RemoveMemberFromForeignDomain() + r.data_in.domain_handle = self.handle + r.data_in.sid = sid + + call_fn(dcerpc.dcerpc_samr_RemoveMemberFromForeignDomain, self.pipe, r) + + def LookupNames(self, names): + + r = dcerpc.samr_LookupNames() + r.data_in.domain_handle = self.handle + r.data_in.num_names = len(names) + r.data_in.names = dcerpc.new_samr_String_array(len(names)) + + for i in range(len(names)): + s = dcerpc.samr_String() + s.string = names[i] + dcerpc.samr_String_array_setitem(r.data_in.names, i, s) + + call_fn(dcerpc.dcerpc_samr_LookupNames, self.pipe, r) + + return ([dcerpc.uint32_array_getitem(r.data_out.rids.ids, i) + for i in range(r.data_out.rids.count)], + [dcerpc.uint32_array_getitem(r.data_out.types.ids, i) + for i in range(r.data_out.types.count)]) + + def CreateDomainGroup(self, domain_name, access_mask = 0x02000000): + + r = dcerpc.samr_CreateDomainGroup() + r.data_in.domain_handle = self.handle + r.data_in.name = dcerpc.samr_String() + r.data_in.name.string = domain_name + r.data_in.access_mask = access_mask + + call_fn(dcerpc.dcerpc_samr_CreateDomainGroup, self.pipe, r) + + def GetAliasMembership(self, sids): + + r = dcerpc.samr_GetAliasMembership() + r.data_in.domain_handle = self.handle + r.data_in.sids = dcerpc.lsa_SidArray() + r.data_in.sids.num_sids = len(sids) + r.data_in.sids.sids = dcerpc.new_lsa_SidPtr_array(len(sids)) + + for i in range(len(sids)): + s = dcerpc.lsa_SidPtr() + s.sid = string_to_sid(sids[i]) + dcerpc.lsa_SidPtr_array_setitem(r.data_in.sids.sids, i, s) + + call_fn(dcerpc.dcerpc_samr_GetAliasMembership, self.pipe, r) + + return [r.ids[x] for x in range(r.count)] + + def QueryDisplayInfo(self, level): + + # TODO: Handle more data returns + + r = dcerpc.samr_QueryDisplayInfo() + r.data_in.domain_handle = self.handle + r.data_in.level = level + r.data_in.start_idx = 0 + r.data_in.max_entries = 1000 + r.data_in.buf_size = -1 + + call_fn(dcerpc.dcerpc_samr_QueryDisplayInfo, self.pipe, r) + + # TODO: Return a mapping of the various samr_DispInfo + # structures here. + + return getattr(r.data_out.info, 'info%d' % level) + + def QueryDisplayInfo2(self, level): + + # TODO: Handle more data returns + + r = dcerpc.samr_QueryDisplayInfo2() + r.data_in.domain_handle = self.handle + r.data_in.level = level + r.data_in.start_idx = 0 + r.data_in.max_entries = 1000 + r.data_in.buf_size = -1 + + call_fn(dcerpc.dcerpc_samr_QueryDisplayInfo2, self.pipe, r) + + # TODO: Return a mapping of the various samr_DispInfo + # structures here. + + return getattr(r.data_out.info, 'info%d' % level) + + def QueryDisplayInfo3(self, level): + + # TODO: Handle more data returns + + r = dcerpc.samr_QueryDisplayInfo3() + r.data_in.domain_handle = self.handle + r.data_in.level = level + r.data_in.start_idx = 0 + r.data_in.max_entries = 1000 + r.data_in.buf_size = -1 + + call_fn(dcerpc.dcerpc_samr_QueryDisplayInfo3, self.pipe, r) + + # TODO: Return a mapping of the various samr_DispInfo + # structures here. + + return getattr(r.data_out.info, 'info%d' % level) + + def GetBootKeyInformation(self): + + r = dcerpc.samr_GetBootKeyInformation() + r.data_in.domain_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_GetBootKeyInformation, self.pipe, r) + + return r.data_out.unknown + + def SetBootKeyInformation(self): + + r = dcerpc.samr_GetBootKeyInformation() + r.data_in.domain_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_GetBootKeyInformation, self.pipe, r) + + def TestPrivateFunctionsDomain(self): + + r = dcerpc.samr_TestPrivateFunctionsDomain() + r.data_in.domain_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_TestPrivateFunctionsDomain, self.pipe, r) + +class UserHandle(SamrHandle): + + def DeleteUser(self): + + r = dcerpc.samr_DeleteUser() + r.data_in.user_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_DeleteUser, self.pipe, r) + + self.handle = None + + def GetUserPwInfo(self): + + r = dcerpc.samr_GetUserPwInfo() + r.data_in.user_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_GetUserPwInfo, self.pipe, r) + + return r.data_out.info + + def QueryUserInfo(self, level): + + r = dcerpc.samr_QueryUserInfo() + r.data_in.user_handle = self.handle + r.data_in.level = level + + call_fn(dcerpc.dcerpc_samr_QueryUserInfo, self.pipe, r) + + return r.data_out.info + + def QueryUserInfo2(self, level): + + r = dcerpc.samr_QueryUserInfo2() + r.data_in.user_handle = self.handle + r.data_in.level = level + + call_fn(dcerpc.dcerpc_samr_QueryUserInfo2, self.pipe, r) + + return r.data_out.info + + def GetGroupsForUser(self): + + r = dcerpc.samr_GetGroupsForUser() + r.data_in.user_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_GetGroupsForUser, self.pipe, r) + + rid_types = [dcerpc.samr_RidType_array_getitem(r.data_out.rids.rid, x) + for x in range(r.data_out.rids.count)] + + return [(x.rid, x.type) for x in rid_types] + + def TestPrivateFunctionsUser(self): + + r = dcerpc.samr_TestPrivateFunctionsUser() + r.data_in.user_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_TestPrivateFunctionsUser, self.pipe, r) + +class GroupHandle(SamrHandle): + + def QueryGroupInfo(self, level): + + r = dcerpc.samr_QueryGroupInfo() + r.data_in.group_handle = self.handle + r.data_in.level = level + + call_fn(dcerpc.dcerpc_samr_QueryGroupInfo, self.pipe, r) + + return r.data_out.info + + def SetGroupInfo(self, level, info): + + r = dcerpc.samr_SetGroupInfo() + r.data_in.group_handle = self.handle + r.data_in.level = level + r.data_in.info = info + + call_fn(dcerpc.dcerpc_samr_SetGroupInfo, self.pipe, r) + + def QueryGroupMember(self): + + r = dcerpc.samr_QueryGroupMember() + r.data_in.group_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_QueryGroupMember, self.pipe, r) + + return [(dcerpc.uint32_array_getitem(r.data_out.rids.rids, x), + dcerpc.uint32_array_getitem(r.data_out.rids.unknown, x)) + for x in range(r.data_out.rids.count)] + +class AliasHandle(SamrHandle): + + def DeleteDomAlias(self): + + r = dcerpc.samr_DeleteDomAlias() + r.data_in.alias_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_DeleteDomAlias, self.pipe, r) + + self.handle = None + + def QueryAliasInfo(self, level = 1): + + r = dcerpc.samr_QueryAliasInfo() + r.data_in.alias_handle = self.handle + r.data_in.level = level + + call_fn(dcerpc.dcerpc_samr_QueryAliasInfo, self.pipe, r) + + return r.data_out.info + + def SetAliasInfo(self, level, info): + + r = dcerpc.samr_SetAliasInfo() + r.data_in.alias_handle = self.handle + r.data_in.level = level + r.data_in.info = info + + call_fn(dcerpc.dcerpc_samr_SetAliasInfo, self.pipe, r) + + def AddAliasMember(self, sid): + + r = dcerpc.samr_AddAliasMember() + r.data_in.alias_handle = self.handle + r.data_in.sid = string_to_sid(sid) + + call_fn(dcerpc.dcerpc_samr_AddAliasMember, self.pipe, r) + + def AddMultipleMembersToAlias(self, sids): + + r = dcerpc.samr_AddMultipleMembersToAlias() + r.data_in.alias_handle = self.handle + r.data_in.sids = dcerpc.lsa_SidArray() + r.data_in.sids.num_sids = len(sids) + r.data_in.sids.sids = dcerpc.new_lsa_SidPtr_array(len(sids)) + + for i in range(len(sids)): + s = dcerpc.lsa_SidPtr() + s.sid = string_to_sid(sids[i]) + dcerpc.lsa_SidPtr_array_setitem(r.data_in.sids.sids, i, s) + + call_fn(dcerpc.dcerpc_samr_AddMultipleMembersToAlias, self.pipe, r) + + def GetMembersInAlias(self): + + r = dcerpc.samr_GetMembersInAlias() + r.data_in.alias_handle = self.handle + + call_fn(dcerpc.dcerpc_samr_GetMembersInAlias, self.pipe, r) + + return [ + sid_to_string( + dcerpc.lsa_SidPtr_array_getitem(r.data_out.sids.sids, x).sid) + for x in range(r.data_out.sids.num_sids)] + +def Connect(pipe, access_mask = 0x02000000): + + r = dcerpc.samr_Connect() + r.data_in.system_name = dcerpc.new_uint16_array(1) + dcerpc.uint16_array_setitem(r.data_in.system_name, 0, ord('\\')) + r.data_in.access_mask = access_mask + + call_fn(dcerpc.dcerpc_samr_Connect, pipe, r) + + return ConnectHandle(pipe, r.data_out.connect_handle) + +def Connect2(pipe, system_name = '', access_mask = 0x02000000): + """Connect to the SAMR pipe.""" + + r = dcerpc.samr_Connect2() + r.data_in.system_name = system_name + r.data_in.access_mask = access_mask + + call_fn(dcerpc.dcerpc_samr_Connect2, pipe, r) + + return ConnectHandle(pipe, r.data_out.connect_handle) + +def Connect3(pipe, system_name = '', access_mask = 0x02000000): + + r = dcerpc.samr_Connect3() + r.data_in.system_name = system_name + r.data_in.unknown = 0 + r.data_in.access_mask = access_mask + + call_fn(dcerpc.dcerpc_samr_Connect3, pipe, r) + + return ConnectHandle(pipe, r.data_out.connect_handle) + + +def Connect4(pipe, system_name = '', access_mask = 0x02000000): + + r = dcerpc.samr_Connect4() + r.data_in.system_name = system_name + r.data_in.unknown = 0 + r.data_in.access_mask = access_mask + + call_fn(dcerpc.dcerpc_samr_Connect4, pipe, r) + + return ConnectHandle(pipe, r.data_out.connect_handle) + +def Connect5(pipe, system_name = '', access_mask = 0x02000000): + + r = dcerpc.samr_Connect5() + r.data_in.system_name = system_name + r.data_in.access_mask = access_mask + r.data_in.level = 1 + r.data_in.info = dcerpc.new_samr_ConnectInfo_array(1) + r.data_in.info.unknown1 = 0 + r.data_in.info.unknown2 = 0 + + call_fn(dcerpc.dcerpc_samr_Connect5, pipe, r) + + return ConnectHandle(pipe, r.data_out.connect_handle) + +# AddGroupMember +# DeleteDomainGroup +# DeleteGroupMember +# SetMemberAttributesofGroup +# AddAliasMember +# DeleteAliasMember +# GetMembersinAlias +# SetUserInfo +# ChangePasswordUser +# GetDisplayEnumerationIndex +# RemoveMemberFromForeignDomain +# GetDisplayEnumerationIndex2 +# RemoveMultipleMembersFromAlias +# OemChangePasswordUser2 +# ChangePasswordUser2 +# SetUserInfo2 +# ChangePasswordUser3 +# SetDsrmPassword +# ValidatePassword diff --git a/source4/scripting/python/samba/torture/pytorture b/source4/scripting/python/samba/torture/pytorture new file mode 100755 index 0000000000..e0123447e8 --- /dev/null +++ b/source4/scripting/python/samba/torture/pytorture @@ -0,0 +1,51 @@ +#!/usr/bin/python + +import sys +from optparse import OptionParser + +# Parse command line + +parser = OptionParser() + +parser.add_option("-b", "--binding", action="store", type="string", + dest="binding") + +parser.add_option("-d", "--domain", action="store", type="string", + dest="domain") + +parser.add_option("-u", "--username", action="store", type="string", + dest="username") + +parser.add_option("-p", "--password", action="store", type="string", + dest="password") + +(options, args) = parser.parse_args() + +if not options.binding: + parser.error('You must supply a binding string') + +if not options.username or not options.password or not options.domain: + parser.error('You must supply a domain, username and password') + +binding = options.binding +domain = options.domain +username = options.username +password = options.password + +if len(args) == 0: + parser.error('You must supply the name of a module to test') + +# Import and test + +for test in args: + + try: + module = __import__('torture_%s' % test) + except ImportError: + print 'No such module "%s"' % test + sys.exit(1) + + if not hasattr(module, 'runtests'): + print 'Module "%s" does not have a runtests function' % test + + module.runtests(binding, (domain, username, password)) diff --git a/source4/scripting/python/samba/torture/spoolss.py b/source4/scripting/python/samba/torture/spoolss.py new file mode 100644 index 0000000000..a75385e079 --- /dev/null +++ b/source4/scripting/python/samba/torture/spoolss.py @@ -0,0 +1,437 @@ +import sys, string +import dcerpc + + +def ResizeBufferCall(fn, pipe, r): + + r['buffer'] = None + r['buf_size'] = 0 + + result = fn(pipe, r) + + if result['result'] == dcerpc.WERR_INSUFFICIENT_BUFFER or \ + result['result'] == dcerpc.WERR_MORE_DATA: + r['buffer'] = result['buf_size'] * '\x00' + r['buf_size'] = result['buf_size'] + + result = fn(pipe, r) + + return result + + +def test_OpenPrinterEx(pipe, printer): + + print 'spoolss_OpenPrinterEx(%s)' % printer + + printername = '\\\\%s' % dcerpc.dcerpc_server_name(pipe) + + if printer is not None: + printername = printername + '\\%s' % printer + + r = {} + r['printername'] = printername + r['datatype'] = None + r['devmode_ctr'] = {} + r['devmode_ctr']['size'] = 0 + r['devmode_ctr']['devmode'] = None + r['access_mask'] = 0x02000000 + r['level'] = 1 + r['userlevel'] = {} + r['userlevel']['level1'] = {} + r['userlevel']['level1']['size'] = 0 + r['userlevel']['level1']['client'] = None + r['userlevel']['level1']['user'] = None + r['userlevel']['level1']['build'] = 1381 + r['userlevel']['level1']['major'] = 2 + r['userlevel']['level1']['minor'] = 0 + r['userlevel']['level1']['processor'] = 0 + + result = dcerpc.spoolss_OpenPrinterEx(pipe, r) + + return result['handle'] + + +def test_ClosePrinter(pipe, handle): + + r = {} + r['handle'] = handle + + dcerpc.spoolss_ClosePrinter(pipe, r) + + +def test_GetPrinter(pipe, handle): + + r = {} + r['handle'] = handle + + for level in [0, 1, 2, 3, 4, 5, 6, 7]: + + print 'spoolss_GetPrinter(level = %d)' % level + + r['level'] = level + r['buffer'] = None + r['buf_size'] = 0 + + result = ResizeBufferCall(dcerpc.spoolss_GetPrinter, pipe, r) + + +def test_EnumForms(pipe, handle): + + print 'spoolss_EnumForms()' + + r = {} + r['handle'] = handle + r['level'] = 1 + r['buffer'] = None + r['buf_size'] = 0 + + result = ResizeBufferCall(dcerpc.spoolss_EnumForms, pipe, r) + + forms = dcerpc.unmarshall_spoolss_FormInfo_array( + result['buffer'], r['level'], result['count']) + + for form in forms: + + r = {} + r['handle'] = handle + r['formname'] = form['info1']['formname'] + r['level'] = 1 + + result = ResizeBufferCall(dcerpc.spoolss_GetForm, pipe, r) + + +def test_EnumPorts(pipe, handle): + + print 'spoolss_EnumPorts()' + + for level in [1, 2]: + + r = {} + r['handle'] = handle + r['servername'] = None + r['level'] = level + + result = ResizeBufferCall(dcerpc.spoolss_EnumPorts, pipe, r) + + ports = dcerpc.unmarshall_spoolss_PortInfo_array( + result['buffer'], r['level'], result['count']) + + if level == 1: + port_names = map(lambda x: x['info1']['port_name'], ports) + + +def test_DeleteForm(pipe, handle, formname): + + r = {} + r['handle'] = handle + r['formname'] = formname + + dcerpc.spoolss_DeleteForm(pipe, r) + + +def test_GetForm(pipe, handle, formname): + + r = {} + r['handle'] = handle + r['formname'] = formname + r['level'] = 1 + + result = ResizeBufferCall(dcerpc.spoolss_GetForm, pipe, r) + + return result['info']['info1'] + + +def test_SetForm(pipe, handle, form): + + print 'spoolss_SetForm()' + + r = {} + r['handle'] = handle + r['level'] = 1 + r['formname'] = form['info1']['formname'] + r['info'] = form + + dcerpc.spoolss_SetForm(pipe, r) + + newform = test_GetForm(pipe, handle, r['formname']) + + if form['info1'] != newform: + print 'SetForm: mismatch: %s != %s' % \ + (r['info']['info1'], f) + sys.exit(1) + + +def test_AddForm(pipe, handle): + + print 'spoolss_AddForm()' + + formname = '__testform__' + + r = {} + r['handle'] = handle + r['level'] = 1 + r['info'] = {} + r['info']['info1'] = {} + r['info']['info1']['formname'] = formname + r['info']['info1']['flags'] = 0x0002 + r['info']['info1']['width'] = 100 + r['info']['info1']['length'] = 100 + r['info']['info1']['left'] = 0 + r['info']['info1']['top'] = 1000 + r['info']['info1']['right'] = 2000 + r['info']['info1']['bottom'] = 3000 + + try: + result = dcerpc.spoolss_AddForm(pipe, r) + except dcerpc.WERROR, arg: + if arg[0] == dcerpc.WERR_ALREADY_EXISTS: + test_DeleteForm(pipe, handle, formname) + result = dcerpc.spoolss_AddForm(pipe, r) + + f = test_GetForm(pipe, handle, formname) + + if r['info']['info1'] != f: + print 'AddForm: mismatch: %s != %s' % \ + (r['info']['info1'], f) + sys.exit(1) + + r['formname'] = formname + + test_SetForm(pipe, handle, r['info']) + + test_DeleteForm(pipe, handle, formname) + + +def test_EnumJobs(pipe, handle): + + print 'spoolss_EnumJobs()' + + r = {} + r['handle'] = handle + r['firstjob'] = 0 + r['numjobs'] = 0xffffffff + r['level'] = 1 + + result = ResizeBufferCall(dcerpc.spoolss_EnumJobs, pipe, r) + + if result['buffer'] is None: + return + + jobs = dcerpc.unmarshall_spoolss_JobInfo_array( + result['buffer'], r['level'], result['count']) + + for job in jobs: + + s = {} + s['handle'] = handle + s['job_id'] = job['info1']['job_id'] + s['level'] = 1 + + result = ResizeBufferCall(dcerpc.spoolss_GetJob, pipe, s) + + if result['info'] != job: + print 'EnumJobs: mismatch: %s != %s' % (result['info'], job) + sys.exit(1) + + + # TODO: AddJob, DeleteJob, ScheduleJob + + +def test_EnumPrinterData(pipe, handle): + + print 'test_EnumPrinterData()' + + enum_index = 0 + + while 1: + + r = {} + r['handle'] = handle + r['enum_index'] = enum_index + + r['value_offered'] = 0 + r['data_size'] = 0 + + result = dcerpc.spoolss_EnumPrinterData(pipe, r) + + r['value_offered'] = result['value_needed'] + r['data_size'] = result['data_size'] + + result = dcerpc.spoolss_EnumPrinterData(pipe, r) + + if result['result'] == dcerpc.WERR_NO_MORE_ITEMS: + break + + s = {} + s['handle'] = handle + s['value_name'] = result['value_name'] + + result2 = ResizeBufferCall(dcerpc.spoolss_GetPrinterData, pipe, s) + + if result['buffer'][:result2['buf_size']] != result2['buffer']: + print 'EnumPrinterData/GetPrinterData mismatch' + sys.exit(1) + + enum_index += 1 + + +def test_SetPrinterDataEx(pipe, handle): + + valuename = '__printerdataextest__' + data = '12345' + + r = {} + r['handle'] = handle + r['key_name'] = 'DsSpooler' + r['value_name'] = valuename + r['type'] = 3 + r['buffer'] = data + r['buf_size'] = len(data) + + result = dcerpc.spoolss_SetPrinterDataEx(pipe, r) + + +def test_EnumPrinterDataEx(pipe, handle): + + r = {} + r['handle'] = handle + r['key_name'] = 'DsSpooler' + r['buf_size'] = 0 + + result = dcerpc.spoolss_EnumPrinterDataEx(pipe, r) + + if result['result'] == dcerpc.WERR_MORE_DATA: + r['buf_size'] = result['buf_size'] + + result = dcerpc.spoolss_EnumPrinterDataEx(pipe, r) + + # TODO: test spoolss_GetPrinterDataEx() + + +def test_SetPrinterData(pipe, handle): + + print 'testing spoolss_SetPrinterData()' + + valuename = '__printerdatatest__' + data = '12345' + + r = {} + r['handle'] = handle + r['value_name'] = valuename + r['type'] = 3 # REG_BINARY + r['buffer'] = data + r['real_len'] = 5 + + dcerpc.spoolss_SetPrinterData(pipe, r) + + s = {} + s['handle'] = handle + s['value_name'] = valuename + + result = ResizeBufferCall(dcerpc.spoolss_GetPrinterData, pipe, r) + + if result['buffer'] != data: + print 'SetPrinterData: mismatch' + sys.exit(1) + + dcerpc.spoolss_DeletePrinterData(pipe, r) + + +def test_EnumPrinters(pipe): + + print 'testing spoolss_EnumPrinters()' + + printer_names = None + + r = {} + r['flags'] = 0x02 + r['server'] = None + + for level in [0, 1, 2, 4, 5]: + + print 'test_EnumPrinters(level = %d)' % level + + r['level'] = level + + result = ResizeBufferCall(dcerpc.spoolss_EnumPrinters, pipe, r) + + printers = dcerpc.unmarshall_spoolss_PrinterInfo_array( + result['buffer'], r['level'], result['count']) + + if level == 2: + for p in printers: + + # A nice check is for the specversion in the + # devicemode. This has always been observed to be + # 1025. + + if p['info2']['devmode']['specversion'] != 1025: + print 'test_EnumPrinters: specversion != 1025' + sys.exit(1) + + r['level'] = 1 + result = ResizeBufferCall(dcerpc.spoolss_EnumPrinters, pipe, r) + + for printer in dcerpc.unmarshall_spoolss_PrinterInfo_array( + result['buffer'], r['level'], result['count']): + + if string.find(printer['info1']['name'], '\\\\') == 0: + print 'Skipping remote printer %s' % printer['info1']['name'] + continue + + printername = string.split(printer['info1']['name'], ',')[0] + + handle = test_OpenPrinterEx(pipe, printername) + + test_GetPrinter(pipe, handle) + test_EnumPorts(pipe, handle) + test_EnumForms(pipe, handle) + test_AddForm(pipe, handle) + test_EnumJobs(pipe, handle) + test_EnumPrinterData(pipe, handle) + test_EnumPrinterDataEx(pipe, handle) + test_SetPrinterData(pipe, handle) +# test_SetPrinterDataEx(pipe, handle) + test_ClosePrinter(pipe, handle) + + +def test_EnumPrinterDrivers(pipe): + + print 'test spoolss_EnumPrinterDrivers()' + + for level in [1, 2, 3]: + + r = {} + r['server'] = None + r['environment'] = None + r['level'] = level + + result = ResizeBufferCall(dcerpc.spoolss_EnumPrinterDrivers, pipe, r) + + drivers = dcerpc.unmarshall_spoolss_DriverInfo_array( + result['buffer'], r['level'], result['count']) + + if level == 1: + driver_names = map(lambda x: x['info1']['driver_name'], drivers) + + +def test_PrintServer(pipe): + + handle = test_OpenPrinterEx(pipe, None) + + # EnumForms and AddForm tests return WERR_BADFID here (??) + + test_ClosePrinter(pipe, handle) + + +def runtests(binding, domain, username, password): + + print 'Testing SPOOLSS pipe' + + pipe = dcerpc.pipe_connect(binding, + dcerpc.DCERPC_SPOOLSS_UUID, dcerpc.DCERPC_SPOOLSS_VERSION, + domain, username, password) + + test_EnumPrinters(pipe) + test_EnumPrinterDrivers(pipe) + test_PrintServer(pipe) diff --git a/source4/scripting/python/samba/torture/torture_samr.py b/source4/scripting/python/samba/torture/torture_samr.py new file mode 100755 index 0000000000..15c6dc1a76 --- /dev/null +++ b/source4/scripting/python/samba/torture/torture_samr.py @@ -0,0 +1,221 @@ +#!/usr/bin/python + +import sys +import dcerpc, samr + +def test_Connect(pipe): + + handle = samr.Connect(pipe) + handle = samr.Connect2(pipe) + handle = samr.Connect3(pipe) + handle = samr.Connect4(pipe) + + # WIN2K3 only? + + try: + handle = samr.Connect5(pipe) + except dcerpc.NTSTATUS, arg: + if arg[0] != 0xc00000d2L: # NT_STATUS_NET_WRITE_FAULT + raise + + return handle + +def test_UserHandle(user_handle): + + # QuerySecurity()/SetSecurity() + + user_handle.SetSecurity(user_handle.QuerySecurity()) + + # GetUserPwInfo() + + user_handle.GetUserPwInfo() + + # GetUserInfo() + + for level in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 20, + 21, 23, 24, 25, 26]: + + try: + user_handle.QueryUserInfo(level) + user_handle.QueryUserInfo2(level) + except dcerpc.NTSTATUS, arg: + if arg[0] != 0xc0000003L: # NT_STATUS_INVALID_INFO_CLASS + raise + + # GetGroupsForUser() + + user_handle.GetGroupsForUser() + + # TestPrivateFunctionsUser() + + try: + user_handle.TestPrivateFunctionsUser() + except dcerpc.NTSTATUS, arg: + if arg[0] != 0xC0000002L: + raise + +def test_GroupHandle(group_handle): + + # QuerySecurity()/SetSecurity() + + group_handle.SetSecurity(group_handle.QuerySecurity()) + + # QueryGroupInfo() + + for level in [1, 2, 3, 4, 5]: + info = group_handle.QueryGroupInfo(level) + + # TODO: SetGroupinfo() + + # QueryGroupMember() + + group_handle.QueryGroupMember() + +def test_AliasHandle(alias_handle): + + # QuerySecurity()/SetSecurity() + + alias_handle.SetSecurity(alias_handle.QuerySecurity()) + + print alias_handle.GetMembersInAlias() + +def test_DomainHandle(name, sid, domain_handle): + + print 'testing %s (%s)' % (name, sid) + + # QuerySecurity()/SetSecurity() + + domain_handle.SetSecurity(domain_handle.QuerySecurity()) + + # LookupNames(), none mapped + + try: + domain_handle.LookupNames(['xxNONAMExx']) + except dcerpc.NTSTATUS, arg: + if arg[0] != 0xc0000073L: + raise dcerpc.NTSTATUS(arg) + + # LookupNames(), some mapped + + if name != 'Builtin': + domain_handle.LookupNames(['Administrator', 'xxNONAMExx']) + + # QueryDomainInfo()/SetDomainInfo() + + levels = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13] + set_ok = [1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0] + + for i in range(len(levels)): + + info = domain_handle.QueryDomainInfo(level = levels[i]) + + try: + domain_handle.SetDomainInfo(levels[i], info) + except dcerpc.NTSTATUS, arg: + if not (arg[0] == 0xc0000003L and not set_ok[i]): + raise + + # QueryDomainInfo2() + + levels = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13] + + for i in range(len(levels)): + domain_handle.QueryDomainInfo2(level = levels[i]) + + # EnumDomainUsers + + print 'testing users' + + users = domain_handle.EnumDomainUsers() + rids = domain_handle.LookupNames(users) + + for i in range(len(users)): + test_UserHandle(domain_handle.OpenUser(rids[0][i])) + + # QueryDisplayInfo + + for i in [1, 2, 3, 4, 5]: + domain_handle.QueryDisplayInfo(level = i) + domain_handle.QueryDisplayInfo2(level = i) + domain_handle.QueryDisplayInfo3(level = i) + + # EnumDomainGroups + + print 'testing groups' + + groups = domain_handle.EnumDomainGroups() + rids = domain_handle.LookupNames(groups) + + for i in range(len(groups)): + test_GroupHandle(domain_handle.OpenGroup(rids[0][i])) + + # EnumDomainAliases + + print 'testing aliases' + + aliases = domain_handle.EnumDomainAliases() + rids = domain_handle.LookupNames(aliases) + + for i in range(len(aliases)): + test_AliasHandle(domain_handle.OpenAlias(rids[0][i])) + + # CreateUser + # CreateUser2 + # CreateDomAlias + # RidToSid + # RemoveMemberFromForeignDomain + # CreateDomainGroup + # GetAliasMembership + + # GetBootKeyInformation() + + try: + domain_handle.GetBootKeyInformation() + except dcerpc.NTSTATUS, arg: + pass + + # TestPrivateFunctionsDomain() + + try: + domain_handle.TestPrivateFunctionsDomain() + except dcerpc.NTSTATUS, arg: + if arg[0] != 0xC0000002L: + raise + +def test_ConnectHandle(connect_handle): + + print 'testing connect handle' + + # QuerySecurity/SetSecurity + + connect_handle.SetSecurity(connect_handle.QuerySecurity()) + + # Lookup bogus domain + + try: + connect_handle.LookupDomain('xxNODOMAINxx') + except dcerpc.NTSTATUS, arg: + if arg[0] != 0xC00000DFL: # NT_STATUS_NO_SUCH_DOMAIN + raise + + # Test all domains + + for domain_name in connect_handle.EnumDomains(): + + connect_handle.GetDomPwInfo(domain_name) + sid = connect_handle.LookupDomain(domain_name) + domain_handle = connect_handle.OpenDomain(sid) + + test_DomainHandle(domain_name, sid, domain_handle) + + # TODO: Test Shutdown() function + +def runtests(binding, creds): + + print 'Testing SAMR pipe' + + pipe = dcerpc.pipe_connect(binding, + dcerpc.DCERPC_SAMR_UUID, int(dcerpc.DCERPC_SAMR_VERSION), creds) + + handle = test_Connect(pipe) + test_ConnectHandle(handle) diff --git a/source4/scripting/python/samba/torture/torture_tdb.py b/source4/scripting/python/samba/torture/torture_tdb.py new file mode 100755 index 0000000000..7f97caf6cb --- /dev/null +++ b/source4/scripting/python/samba/torture/torture_tdb.py @@ -0,0 +1,90 @@ +#!/usr/bin/python + +import sys, os +import Tdb + +def fail(msg): + print 'FAILED:', msg + sys.exit(1) + +tdb_file = '/tmp/torture_tdb.tdb' + +# Create temporary tdb file + +t = Tdb.Tdb(tdb_file, flags = Tdb.CLEAR_IF_FIRST) + +# Check non-existent key throws KeyError exception + +try: + t['__none__'] +except KeyError: + pass +else: + fail('non-existent key did not throw KeyError') + +# Check storing key + +t['bar'] = '1234' +if t['bar'] != '1234': + fail('store key failed') + +# Check key exists + +if not t.has_key('bar'): + fail('has_key() failed for existing key') + +if t.has_key('__none__'): + fail('has_key() succeeded for non-existent key') + +# Delete key + +try: + del(t['__none__']) +except KeyError: + pass +else: + fail('delete of non-existent key did not throw KeyError') + +del t['bar'] +if t.has_key('bar'): + fail('delete of existing key did not delete key') + +# Clear all keys + +t.clear() +if len(t) != 0: + fail('clear failed to remove all keys') + +# Other dict functions + +t['a'] = '1' +t['ab'] = '12' +t['abc'] = '123' + +if len(t) != 3: + fail('len method produced wrong value') + +keys = t.keys() +values = t.values() +items = t.items() + +if set(keys) != set(['a', 'ab', 'abc']): + fail('keys method produced wrong values') + +if set(values) != set(['1', '12', '123']): + fail('values method produced wrong values') + +if set(items) != set([('a', '1'), ('ab', '12'), ('abc', '123')]): + fail('values method produced wrong values') + +t.close() + +# Re-open read-only + +t = Tdb.Tdb(tdb_file, open_flags = os.O_RDONLY) +t.keys() +t.close() + +# Clean up + +os.unlink(tdb_file) diff --git a/source4/scripting/python/samba/torture/winreg.py b/source4/scripting/python/samba/torture/winreg.py new file mode 100755 index 0000000000..eb60b9847e --- /dev/null +++ b/source4/scripting/python/samba/torture/winreg.py @@ -0,0 +1,165 @@ +#!/usr/bin/python + +import sys, dcerpc + +def test_OpenHKLM(pipe): + + r = {} + r['unknown'] = {} + r['unknown']['unknown0'] = 0x9038 + r['unknown']['unknown1'] = 0x0000 + r['access_required'] = 0x02000000 + + result = dcerpc.winreg_OpenHKLM(pipe, r) + + return result['handle'] + +def test_QueryInfoKey(pipe, handle): + + r = {} + r['handle'] = handle + r['class'] = {} + r['class']['name'] = None + + return dcerpc.winreg_QueryInfoKey(pipe, r) + +def test_CloseKey(pipe, handle): + + r = {} + r['handle'] = handle + + dcerpc.winreg_CloseKey(pipe, r) + +def test_FlushKey(pipe, handle): + + r = {} + r['handle'] = handle + + dcerpc.winreg_FlushKey(pipe, r) + +def test_GetVersion(pipe, handle): + + r = {} + r['handle'] = handle + + dcerpc.winreg_GetVersion(pipe, r) + +def test_GetKeySecurity(pipe, handle): + + r = {} + r['handle'] = handle + r['unknown'] = 4 + r['size'] = None + r['data'] = {} + r['data']['max_len'] = 0 + r['data']['data'] = '' + + result = dcerpc.winreg_GetKeySecurity(pipe, r) + + print result + + if result['result'] == dcerpc.WERR_INSUFFICIENT_BUFFER: + r['size'] = {} + r['size']['max_len'] = result['data']['max_len'] + r['size']['offset'] = 0 + r['size']['len'] = result['data']['max_len'] + + result = dcerpc.winreg_GetKeySecurity(pipe, r) + + print result + + sys.exit(1) + +def test_Key(pipe, handle, name, depth = 0): + + # Don't descend too far. Registries can be very deep. + + if depth > 2: + return + + try: + keyinfo = test_QueryInfoKey(pipe, handle) + except dcerpc.WERROR, arg: + if arg[0] == dcerpc.WERR_ACCESS_DENIED: + return + + test_GetVersion(pipe, handle) + + test_FlushKey(pipe, handle) + + test_GetKeySecurity(pipe, handle) + + # Enumerate values in this key + + r = {} + r['handle'] = handle + r['name_in'] = {} + r['name_in']['len'] = 0 + r['name_in']['max_len'] = (keyinfo['max_valnamelen'] + 1) * 2 + r['name_in']['buffer'] = {} + r['name_in']['buffer']['max_len'] = keyinfo['max_valnamelen'] + 1 + r['name_in']['buffer']['offset'] = 0 + r['name_in']['buffer']['len'] = 0 + r['type'] = 0 + r['value_in'] = {} + r['value_in']['max_len'] = keyinfo['max_valbufsize'] + r['value_in']['offset'] = 0 + r['value_in']['len'] = 0 + r['value_len1'] = keyinfo['max_valbufsize'] + r['value_len2'] = 0 + + for i in range(0, keyinfo['num_values']): + + r['enum_index'] = i + + dcerpc.winreg_EnumValue(pipe, r) + + # Recursively test subkeys of this key + + r = {} + r['handle'] = handle + r['key_name_len'] = 0 + r['unknown'] = 0x0414 + r['in_name'] = {} + r['in_name']['unknown'] = 0x20a + r['in_name']['key_name'] = {} + r['in_name']['key_name']['name'] = None + r['class'] = {} + r['class']['name'] = None + r['last_changed_time'] = {} + r['last_changed_time']['low'] = 0 + r['last_changed_time']['high'] = 0 + + for i in range(0, keyinfo['num_subkeys']): + + r['enum_index'] = i + + subkey = dcerpc.winreg_EnumKey(pipe, r) + + s = {} + s['handle'] = handle + s['keyname'] = {} + s['keyname']['name'] = subkey['out_name']['name'] + s['unknown'] = 0 + s['access_mask'] = 0x02000000 + + result = dcerpc.winreg_OpenKey(pipe, s) + + test_Key(pipe, result['handle'], name + '/' + s['keyname']['name'], + depth + 1) + + test_CloseKey(pipe, result['handle']) + + # Enumerate values + +def runtests(binding, domain, username, password): + + print 'Testing WINREG pipe' + + pipe = dcerpc.pipe_connect(binding, + dcerpc.DCERPC_WINREG_UUID, dcerpc.DCERPC_WINREG_VERSION, + domain, username, password) + + handle = test_OpenHKLM(pipe) + + test_Key(pipe, handle, 'HKLM') diff --git a/source4/scripting/python/sidmodule.c b/source4/scripting/python/sidmodule.c new file mode 100644 index 0000000000..2b3f152e9b --- /dev/null +++ b/source4/scripting/python/sidmodule.c @@ -0,0 +1,57 @@ +/* + Unix SMB/CIFS implementation. + Samba utility functions + Copyright (C) Jelmer Vernooij 2007 + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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, see . +*/ + +#include "includes.h" +#include "scripting/python/talloc.h" +#include "Python.h" +#include "libcli/security/security.h" + +static PyObject *sid_random(PyObject *self, PyObject *args) +{ + char *str; + + if (!PyArg_ParseTuple(args, "")) + return NULL; + + str = talloc_asprintf(NULL, "S-1-5-21-%u-%u-%u", + (unsigned)generate_random(), + (unsigned)generate_random(), + (unsigned)generate_random()); + + if (str == NULL) { + PyErr_SetString(PyExc_TypeError, "can't generate random sid"); + return NULL; + } + + return PyString_FromString(str); +} + +static PyMethodDef methods[] = { + { "random", (PyCFunction)sid_random, METH_VARARGS, NULL}, + { NULL, NULL } +}; + +PyDoc_STRVAR(param_doc, "SID helper routines"); + +PyMODINIT_FUNC initsid(void) +{ + PyObject *mod = Py_InitModule3("sid", methods, param_doc); + if (mod == NULL) + return; +} diff --git a/source4/scripting/python/uuidmodule.c b/source4/scripting/python/uuidmodule.c new file mode 100644 index 0000000000..9ae432dfa5 --- /dev/null +++ b/source4/scripting/python/uuidmodule.c @@ -0,0 +1,57 @@ +/* + Unix SMB/CIFS implementation. + Samba utility functions + Copyright (C) Jelmer Vernooij 2007 + + 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 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + 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, see . +*/ + +#include "includes.h" +#include "Python.h" +#include "librpc/ndr/libndr.h" + +static PyObject *uuid_random(PyObject *self, PyObject *args) +{ + struct GUID guid; + char *str; + + if (!PyArg_ParseTuple(args, "")) + return NULL; + + guid = GUID_random(); + + str = GUID_string(NULL, &guid); + if (str == NULL) { + PyErr_SetString(PyExc_TypeError, "can't convert uuid to string"); + return NULL; + } + + talloc_free(str); + + return PyString_FromString(str); +} + +static PyMethodDef methods[] = { + { "random", (PyCFunction)uuid_random, METH_VARARGS, NULL}, + { NULL, NULL } +}; + +PyDoc_STRVAR(param_doc, "UUID helper routines"); + +PyMODINIT_FUNC inituuid(void) +{ + PyObject *mod = Py_InitModule3("uuid", methods, param_doc); + if (mod == NULL) + return; +} diff --git a/source4/scripting/swig/README b/source4/scripting/swig/README deleted file mode 100644 index 38b95b28f4..0000000000 --- a/source4/scripting/swig/README +++ /dev/null @@ -1,20 +0,0 @@ -README for Samba SWIG Python extensions ---------------------------------------- - -Instructions for building: - -1. Run configure with the --with-python option to enable python - extensions. - -2. Run 'make idl_full swig' to build extensions. - -3. At some stage there will be a proper system for installing the - extensions, but right now it's easier to run them in place. Set - your PYTHONPATH to include the modules. From the Samba source - directory, run: - - export PYTHONPATH=`pwd`/scripting/swig - -Now you can go nuts and use the extensions. Check the -scripting/swig/torture directory for a testsuite. There will -hopefully be a bunch of usage examples somewhere. diff --git a/source4/scripting/swig/config.m4 b/source4/scripting/swig/config.m4 deleted file mode 100644 index 9988399f70..0000000000 --- a/source4/scripting/swig/config.m4 +++ /dev/null @@ -1,29 +0,0 @@ -dnl # Scripting subsystem - -# Check for python support - -PYTHON= - -AC_ARG_WITH(python, -[ --with-python=PYTHONNAME build Python libraries], -[ case "${withval-python}" in - yes) - PYTHON=python - ;; - no) - PYTHON= - ;; - *) - PYTHON=${withval-python} - ;; - esac ]) - -if test x"$PYTHON" != "x"; then - incdir=`python -c 'import sys; print "%s/include/python%d.%d" % (sys.prefix, sys.version_info[[0]], sys.version_info[[1]])'` - CPPFLAGS="$CPPFLAGS -I $incdir" -else - SMB_ENABLE(swig_dcerpc, NO) -fi - -AC_SUBST(PYTHON) - diff --git a/source4/scripting/swig/config.mk b/source4/scripting/swig/config.mk deleted file mode 100644 index 193e84b255..0000000000 --- a/source4/scripting/swig/config.mk +++ /dev/null @@ -1,19 +0,0 @@ -# Swig extensions -swig: pythonmods - -pythonmods: $(PYTHON_DSOS) - -.SUFFIXES: _wrap.c .i - -.i_wrap.c: - swig -Wall -I$(srcdir)/scripting/swig -python $< - -clean:: - @echo "Removing SWIG output files" - @-rm -f bin/python/* - # FIXME: Remove _wrap.c files - -PYDOCTOR_MODULES=bin/python/ldb.py bin/python/auth.py bin/python/credentials.py bin/python/registry.py - -pydoctor:: - LD_LIBRARY_PATH=bin/shared PYTHONPATH=bin/python pydoctor --make-html --docformat=restructedtext --add-package scripting/python/samba/ $(addprefix --add-module , $(PYDOCTOR_MODULES)) diff --git a/source4/scripting/swig/samba.i b/source4/scripting/swig/samba.i deleted file mode 100644 index fe83ae3da9..0000000000 --- a/source4/scripting/swig/samba.i +++ /dev/null @@ -1,57 +0,0 @@ -/* - Unix SMB/CIFS implementation. - - Common swig definitions - - Copyright (C) 2004 Tim Potter - - ** NOTE! The following LGPL license applies to the swig - ** definitions. This does NOT imply that all of Samba is released - ** under the LGPL - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 3 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, see . -*/ - -%typemap(in) NTSTATUS { - if (PyLong_Check($input)) - $1 = NT_STATUS(PyLong_AsUnsignedLong($input)); - else if (PyInt_Check($input)) - $1 = NT_STATUS(PyInt_AsLong($input)); - else { - PyErr_SetString(PyExc_TypeError, "Expected a long or an int"); - return NULL; - } -} - -%typemap(in) struct cli_credentials * { - $1 = cli_credentials_init(arg1); - if ($input == Py_None) { - cli_credentials_set_anonymous($1); - } else { - if (!PyTuple_Check($input) || - PyTuple_Size($input) != 3) { - PyErr_SetString(PyExc_TypeError, "Expecting three element tuple"); - return NULL; - } - if (!PyString_Check(PyTuple_GetItem($input, 0)) || - !PyString_Check(PyTuple_GetItem($input, 1)) || - !PyString_Check(PyTuple_GetItem($input, 2))) { - PyErr_SetString(PyExc_TypeError, "Expecting string elements"); - return NULL; - } - cli_credentials_set_domain($1, PyString_AsString(PyTuple_GetItem($input, 0)), CRED_SPECIFIED); - cli_credentials_set_username($1, PyString_AsString(PyTuple_GetItem($input, 1)), CRED_SPECIFIED); - cli_credentials_set_password($1, PyString_AsString(PyTuple_GetItem($input, 2)), CRED_SPECIFIED); - } -} diff --git a/source4/scripting/swig/samr.py b/source4/scripting/swig/samr.py deleted file mode 100644 index 314f78b8ad..0000000000 --- a/source4/scripting/swig/samr.py +++ /dev/null @@ -1,753 +0,0 @@ -import dcerpc - -def sid_to_string(sid): - """Convert a Python dictionary SID to a string SID.""" - - result = 'S-%d' % sid.sid_rev_num - - result = result + '-%u' % \ - (dcerpc.uint8_array_getitem(sid.id_auth, 5) + - (dcerpc.uint8_array_getitem(sid.id_auth, 4) << 8) + - (dcerpc.uint8_array_getitem(sid.id_auth, 3) << 16) + - (dcerpc.uint8_array_getitem(sid.id_auth, 2) << 24)) - - for i in range(0, sid.num_auths): - result = result + '-%u' % \ - dcerpc.uint32_array_getitem(sid.sub_auths, i) - - return result - -def string_to_sid(string): - """Convert a string SID to a Python dictionary SID. Throws a - ValueError if the SID string was badly formed.""" - - if string[0] != 'S': - raise ValueError('Bad SID format') - - string = string[1:] - - import re - - match = re.match('-\d+', string) - - if not match: - raise ValueError('Bad SID format') - - try: - sid_rev_num = int(string[match.start()+1:match.end()]) - except ValueError: - raise ValueError('Bad SID format') - - string = string[match.end():] - - match = re.match('-\d+', string) - - if not match: - raise ValueError('Bad SID format') - - try: - ia = int(string[match.start()+1:match.end()]) - except ValueError: - raise ValueError('Bad SID format') - - string = string[match.end():] - - id_auth = [0, 0, (ia >> 24) & 0xff, (ia >> 16) & 0xff, - (ia >> 8) & 0xff, ia & 0xff] - - num_auths = 0 - sub_auths = [] - - while len(string): - - match = re.match('-\d+', string) - - if not match: - raise ValueError('Bad SID format') - - try: - sa = int(string[match.start() + 1 : match.end()]) - except ValueError: - raise ValueError('Bad SID format') - - num_auths = num_auths + 1 - sub_auths.append(int(sa)) - - string = string[match.end():] - - sid = dcerpc.dom_sid() - sid.sid_rev_num = sid_rev_num - sid.id_auth = dcerpc.new_uint8_array(6) - for i in range(6): - dcerpc.uint8_array_setitem(sid.id_auth, i, id_auth[i]) - sid.num_auths = num_auths - sid.sub_auths = dcerpc.new_uint32_array(num_auths) - for i in range(num_auths): - dcerpc.uint32_array_setitem(sid.sub_auths, i, sub_auths[i]) - - return sid - -def call_fn(fn, pipe, args): - """Wrap up a RPC call and throw an exception is an error was returned.""" - - result = fn(pipe, args); - - if result & 0xc0000000L: - raise dcerpc.NTSTATUS(result, dcerpc.nt_errstr(result)); - - return result; - -class SamrHandle: - - def __init__(self, pipe, handle): - - self.pipe = pipe - self.handle = handle - - def __del__(self): - - if self.handle is not None: - self.Close() - - def Close(self): - - r = dcerpc.samr_Close() - r.data_in.handle = self.handle - - call_fn(dcerpc.dcerpc_samr_Close, self.pipe, r) - - self.handle = None - - def QuerySecurity(self, sec_info = 7): - - r = dcerpc.samr_QuerySecurity() - r.data_in.handle = self.handle - r.data_in.sec_info = sec_info - - call_fn(dcerpc.dcerpc_samr_QuerySecurity, self.pipe, r) - - return r.data_out.sdbuf - - def SetSecurity(self, sdbuf, sec_info = 7): - - r = dcerpc.samr_SetSecurity() - r.data_in.handle = self.handle - r.data_in.sec_info = sec_info - r.data_in.sdbuf = sdbuf - - call_fn(dcerpc.dcerpc_samr_SetSecurity, self.pipe, r) - -class ConnectHandle(SamrHandle): - - def EnumDomains(self): - - r = dcerpc.samr_EnumDomains() - r.data_in.connect_handle = self.handle - r.data_in.resume_handle = 0 - r.data_in.buf_size = -1 - - domains = [] - - while 1: - - call_fn(dcerpc.dcerpc_samr_EnumDomains, self.pipe, r) - - for i in range(r.data_out.sam.count): - domains.append(dcerpc.samr_SamEntry_array_getitem( - r.data_out.sam.entries, i).name.string) - - # TODO: Handle more entries here - - break - - return domains - - def LookupDomain(self, domain_name): - - r = dcerpc.samr_LookupDomain() - r.data_in.connect_handle = self.handle - r.data_in.domain_name = dcerpc.samr_String() - r.data_in.domain_name.string = domain_name - - call_fn(dcerpc.dcerpc_samr_LookupDomain, self.pipe, r) - - return sid_to_string(r.data_out.sid); - - def OpenDomain(self, domain_sid, access_mask = 0x02000000): - - r = dcerpc.samr_OpenDomain() - r.data_in.connect_handle = self.handle - r.data_in.access_mask = access_mask - r.data_in.sid = string_to_sid(domain_sid) - - call_fn(dcerpc.dcerpc_samr_OpenDomain, self.pipe, r) - - return DomainHandle(self.pipe, r.data_out.domain_handle) - - def Shutdown(self): - - r = dcerpc.samr_Shutdown() - r.data_in.connect_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_Shutdown, self.pipe, r) - - def GetDomPwInfo(self, domain_name): - - r = dcerpc.samr_GetDomPwInfo() - r.data_in.domain_name = dcerpc.samr_String() - r.data_in.domain_name.string = domain_name - - call_fn(dcerpc.dcerpc_samr_GetDomPwInfo, self.pipe, r) - - return r.data_out.info - - - def SetBootKeyInformation(self, unknown1, unknown2, unknown3): - - r = dcerpc.samr_GetBootKeyInformation() - r.data_in.connect_handle = self.handle - r.data_in.unknown1 = unknown1 - r.data_in.unknown2 = unknown2 - r.data_in.unknown3 = unknown3 - - call_fn(dcerpc.dcerpc_samr_SetBootKeyInformation, self.pipe, r) - -class DomainHandle(SamrHandle): - - def QueryDomainInfo(self, level = 2): - - r = dcerpc.samr_QueryDomainInfo() - r.data_in.domain_handle = self.handle - r.data_in.level = level - - call_fn(dcerpc.dcerpc_samr_QueryDomainInfo, self.pipe, r) - - return getattr(r.data_out.info, 'info%d' % level) - - def QueryDomainInfo2(self, level = 2): - - r = dcerpc.samr_QueryDomainInfo2() - r.data_in.domain_handle = self.handle - r.data_in.level = level - - call_fn(dcerpc.dcerpc_samr_QueryDomainInfo2, self.pipe, r) - - return getattr(r.data_out.info, 'info%d' % level) - - def SetDomainInfo(self, level, info): - - r = dcerpc.samr_SetDomainInfo() - r.data_in.domain_handle = self.handle - r.data_in.level = level - r.data_in.info = dcerpc.samr_DomainInfo() - setattr(r.data_in.info, 'info%d' % level, info) - - call_fn(dcerpc.dcerpc_samr_SetDomainInfo, self.pipe, r) - - def EnumDomainGroups(self): - - r = dcerpc.samr_EnumDomainGroups() - r.data_in.domain_handle = self.handle - r.data_in.resume_handle = 0 - r.data_in.max_size = 1000 - - call_fn(dcerpc.dcerpc_samr_EnumDomainGroups, self.pipe, r) - - groups = [] - - if r.data_out.sam.entries: - for i in range(r.data_out.sam.count): - groups.append(dcerpc.samr_SamEntry_array_getitem( - r.data_out.sam.entries, i).name.string) - - return groups - - def EnumDomainAliases(self): - - r = dcerpc.samr_EnumDomainAliases() - r.data_in.domain_handle = self.handle - r.data_in.resume_handle = 0 - # acct_flags in SamrEnumerateAliasesInDomain has probably - # no meaning so use 0xffffffff like W2K - r.data_in.acct_flags = 0xffffffffL - - call_fn(dcerpc.dcerpc_samr_EnumDomainAliases, self.pipe, r) - - aliases = [] - - if r.data_out.sam.entries: - for i in range(r.data_out.sam.count): - aliases.append(dcerpc.samr_SamEntry_array_getitem( - r.data_out.sam.entries, i).name.string) - - return aliases - - def EnumDomainUsers(self, user_account_flags = 16): - - r = dcerpc.samr_EnumDomainUsers() - r.data_in.domain_handle = self.handle - r.data_in.resume_handle = 0 - r.data_in.acct_flags = user_account_flags - r.data_in.max_size = 1000 - - call_fn(dcerpc.dcerpc_samr_EnumDomainUsers, self.pipe, r) - - users = [] - - if r.data_out.sam.entries: - for i in range(r.data_out.sam.count): - users.append(dcerpc.samr_SamEntry_array_getitem( - r.data_out.sam.entries, i).name.string) - - return users - - def CreateUser(self, account_name, access_mask = 0x02000000): - - r = dcerpc.samr_CreateUser() - r.data_in.domain_handle = self.handle - r.data_in.account_name = dcerpc.samr_String() - r.data_in.account_name.string = account_name - r.data_in.access_mask = access_mask - - call_fn(dcerpc.dcerpc_samr_CreateUser, self.pipe, r) - - return (r.data_out.user_handle, - dcerpc.uint32_array_getitem(r.data_out.rid, 0)) - - def CreateUser2(self, account_name, acct_flags = 0x00000010, - access_mask = 0x02000000): - - r = dcerpc.samr_CreateUser2() - r.data_in.domain_handle = self.handle - r.data_in.account_name = dcerpc.samr_String() - r.data_in.account_name.string = account_name - r.data_in.acct_flags = acct_flags - r.data_in.access_mask = access_mask - - call_fn(dcerpc.dcerpc_samr_CreateUser2, self.pipe, r) - - return (r.data_out.user_handle, - dcerpc.uint32_array_getitem(r.data_out.access_granted, 0), - dcerpc.uint32_array_getitem(r.data_out.rid, 0)) - - def OpenUser(self, rid, access_mask = 0x02000000): - - r = dcerpc.samr_OpenUser() - r.data_in.domain_handle = self.handle - r.data_in.access_mask = access_mask - r.data_in.rid = rid - - call_fn(dcerpc.dcerpc_samr_OpenUser, self.pipe, r) - - return UserHandle(self.pipe, r.data_out.user_handle) - - def OpenGroup(self, rid, access_mask = 0x02000000): - - r = dcerpc.samr_OpenGroup() - r.data_in.domain_handle = self.handle - r.data_in.access_mask = access_mask - r.data_in.rid = rid - - call_fn(dcerpc.dcerpc_samr_OpenGroup, self.pipe, r) - - return GroupHandle(self.pipe, r.data_out.group_handle) - - def OpenAlias(self, rid, access_mask = 0x02000000): - - r = dcerpc.samr_OpenAlias() - r.data_in.domain_handle = self.handle - r.data_in.access_mask = access_mask - r.data_in.rid = rid - - call_fn(dcerpc.dcerpc_samr_OpenAlias, self.pipe, r) - - return AliasHandle(self.pipe, r.data_out.alias_handle) - - def CreateDomAlias(self, alias_name, access_mask = 0x02000000): - - r = dcerpc.samr_CreateDomAlias() - r.data_in.domain_handle = self.handle - r.data_in.alias_name = dcerpc.samr_String() - r.data_in.alias_name.string = alias_name - r.data_in.access_mask = access_mask - - call_fn(dcerpc.dcerpc_samr_CreateDomAlias, self.pipe, r) - - return (AliasHandle(self.pipe, r.data_out.alias_handle), - r.data_out.rid) - - def RidToSid(self, rid): - - r = dcerpc.samr_RidToSid() - r.data_in.domain_handle = self.handle - r.data_in.rid = rid - - call_fn(dcerpc.dcerpc_samr_RidToSid, self.pipe, r) - - return sid_to_string(r.data_out.sid) - - def RemoveMemberFromForeignDomain(self, sid): - - r = dcerpc.samr_RemoveMemberFromForeignDomain() - r.data_in.domain_handle = self.handle - r.data_in.sid = sid - - call_fn(dcerpc.dcerpc_samr_RemoveMemberFromForeignDomain, self.pipe, r) - - def LookupNames(self, names): - - r = dcerpc.samr_LookupNames() - r.data_in.domain_handle = self.handle - r.data_in.num_names = len(names) - r.data_in.names = dcerpc.new_samr_String_array(len(names)) - - for i in range(len(names)): - s = dcerpc.samr_String() - s.string = names[i] - dcerpc.samr_String_array_setitem(r.data_in.names, i, s) - - call_fn(dcerpc.dcerpc_samr_LookupNames, self.pipe, r) - - return ([dcerpc.uint32_array_getitem(r.data_out.rids.ids, i) - for i in range(r.data_out.rids.count)], - [dcerpc.uint32_array_getitem(r.data_out.types.ids, i) - for i in range(r.data_out.types.count)]) - - def CreateDomainGroup(self, domain_name, access_mask = 0x02000000): - - r = dcerpc.samr_CreateDomainGroup() - r.data_in.domain_handle = self.handle - r.data_in.name = dcerpc.samr_String() - r.data_in.name.string = domain_name - r.data_in.access_mask = access_mask - - call_fn(dcerpc.dcerpc_samr_CreateDomainGroup, self.pipe, r) - - def GetAliasMembership(self, sids): - - r = dcerpc.samr_GetAliasMembership() - r.data_in.domain_handle = self.handle - r.data_in.sids = dcerpc.lsa_SidArray() - r.data_in.sids.num_sids = len(sids) - r.data_in.sids.sids = dcerpc.new_lsa_SidPtr_array(len(sids)) - - for i in range(len(sids)): - s = dcerpc.lsa_SidPtr() - s.sid = string_to_sid(sids[i]) - dcerpc.lsa_SidPtr_array_setitem(r.data_in.sids.sids, i, s) - - call_fn(dcerpc.dcerpc_samr_GetAliasMembership, self.pipe, r) - - return [r.ids[x] for x in range(r.count)] - - def QueryDisplayInfo(self, level): - - # TODO: Handle more data returns - - r = dcerpc.samr_QueryDisplayInfo() - r.data_in.domain_handle = self.handle - r.data_in.level = level - r.data_in.start_idx = 0 - r.data_in.max_entries = 1000 - r.data_in.buf_size = -1 - - call_fn(dcerpc.dcerpc_samr_QueryDisplayInfo, self.pipe, r) - - # TODO: Return a mapping of the various samr_DispInfo - # structures here. - - return getattr(r.data_out.info, 'info%d' % level) - - def QueryDisplayInfo2(self, level): - - # TODO: Handle more data returns - - r = dcerpc.samr_QueryDisplayInfo2() - r.data_in.domain_handle = self.handle - r.data_in.level = level - r.data_in.start_idx = 0 - r.data_in.max_entries = 1000 - r.data_in.buf_size = -1 - - call_fn(dcerpc.dcerpc_samr_QueryDisplayInfo2, self.pipe, r) - - # TODO: Return a mapping of the various samr_DispInfo - # structures here. - - return getattr(r.data_out.info, 'info%d' % level) - - def QueryDisplayInfo3(self, level): - - # TODO: Handle more data returns - - r = dcerpc.samr_QueryDisplayInfo3() - r.data_in.domain_handle = self.handle - r.data_in.level = level - r.data_in.start_idx = 0 - r.data_in.max_entries = 1000 - r.data_in.buf_size = -1 - - call_fn(dcerpc.dcerpc_samr_QueryDisplayInfo3, self.pipe, r) - - # TODO: Return a mapping of the various samr_DispInfo - # structures here. - - return getattr(r.data_out.info, 'info%d' % level) - - def GetBootKeyInformation(self): - - r = dcerpc.samr_GetBootKeyInformation() - r.data_in.domain_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_GetBootKeyInformation, self.pipe, r) - - return r.data_out.unknown - - def SetBootKeyInformation(self): - - r = dcerpc.samr_GetBootKeyInformation() - r.data_in.domain_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_GetBootKeyInformation, self.pipe, r) - - def TestPrivateFunctionsDomain(self): - - r = dcerpc.samr_TestPrivateFunctionsDomain() - r.data_in.domain_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_TestPrivateFunctionsDomain, self.pipe, r) - -class UserHandle(SamrHandle): - - def DeleteUser(self): - - r = dcerpc.samr_DeleteUser() - r.data_in.user_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_DeleteUser, self.pipe, r) - - self.handle = None - - def GetUserPwInfo(self): - - r = dcerpc.samr_GetUserPwInfo() - r.data_in.user_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_GetUserPwInfo, self.pipe, r) - - return r.data_out.info - - def QueryUserInfo(self, level): - - r = dcerpc.samr_QueryUserInfo() - r.data_in.user_handle = self.handle - r.data_in.level = level - - call_fn(dcerpc.dcerpc_samr_QueryUserInfo, self.pipe, r) - - return r.data_out.info - - def QueryUserInfo2(self, level): - - r = dcerpc.samr_QueryUserInfo2() - r.data_in.user_handle = self.handle - r.data_in.level = level - - call_fn(dcerpc.dcerpc_samr_QueryUserInfo2, self.pipe, r) - - return r.data_out.info - - def GetGroupsForUser(self): - - r = dcerpc.samr_GetGroupsForUser() - r.data_in.user_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_GetGroupsForUser, self.pipe, r) - - rid_types = [dcerpc.samr_RidType_array_getitem(r.data_out.rids.rid, x) - for x in range(r.data_out.rids.count)] - - return [(x.rid, x.type) for x in rid_types] - - def TestPrivateFunctionsUser(self): - - r = dcerpc.samr_TestPrivateFunctionsUser() - r.data_in.user_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_TestPrivateFunctionsUser, self.pipe, r) - -class GroupHandle(SamrHandle): - - def QueryGroupInfo(self, level): - - r = dcerpc.samr_QueryGroupInfo() - r.data_in.group_handle = self.handle - r.data_in.level = level - - call_fn(dcerpc.dcerpc_samr_QueryGroupInfo, self.pipe, r) - - return r.data_out.info - - def SetGroupInfo(self, level, info): - - r = dcerpc.samr_SetGroupInfo() - r.data_in.group_handle = self.handle - r.data_in.level = level - r.data_in.info = info - - call_fn(dcerpc.dcerpc_samr_SetGroupInfo, self.pipe, r) - - def QueryGroupMember(self): - - r = dcerpc.samr_QueryGroupMember() - r.data_in.group_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_QueryGroupMember, self.pipe, r) - - return [(dcerpc.uint32_array_getitem(r.data_out.rids.rids, x), - dcerpc.uint32_array_getitem(r.data_out.rids.unknown, x)) - for x in range(r.data_out.rids.count)] - -class AliasHandle(SamrHandle): - - def DeleteDomAlias(self): - - r = dcerpc.samr_DeleteDomAlias() - r.data_in.alias_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_DeleteDomAlias, self.pipe, r) - - self.handle = None - - def QueryAliasInfo(self, level = 1): - - r = dcerpc.samr_QueryAliasInfo() - r.data_in.alias_handle = self.handle - r.data_in.level = level - - call_fn(dcerpc.dcerpc_samr_QueryAliasInfo, self.pipe, r) - - return r.data_out.info - - def SetAliasInfo(self, level, info): - - r = dcerpc.samr_SetAliasInfo() - r.data_in.alias_handle = self.handle - r.data_in.level = level - r.data_in.info = info - - call_fn(dcerpc.dcerpc_samr_SetAliasInfo, self.pipe, r) - - def AddAliasMember(self, sid): - - r = dcerpc.samr_AddAliasMember() - r.data_in.alias_handle = self.handle - r.data_in.sid = string_to_sid(sid) - - call_fn(dcerpc.dcerpc_samr_AddAliasMember, self.pipe, r) - - def AddMultipleMembersToAlias(self, sids): - - r = dcerpc.samr_AddMultipleMembersToAlias() - r.data_in.alias_handle = self.handle - r.data_in.sids = dcerpc.lsa_SidArray() - r.data_in.sids.num_sids = len(sids) - r.data_in.sids.sids = dcerpc.new_lsa_SidPtr_array(len(sids)) - - for i in range(len(sids)): - s = dcerpc.lsa_SidPtr() - s.sid = string_to_sid(sids[i]) - dcerpc.lsa_SidPtr_array_setitem(r.data_in.sids.sids, i, s) - - call_fn(dcerpc.dcerpc_samr_AddMultipleMembersToAlias, self.pipe, r) - - def GetMembersInAlias(self): - - r = dcerpc.samr_GetMembersInAlias() - r.data_in.alias_handle = self.handle - - call_fn(dcerpc.dcerpc_samr_GetMembersInAlias, self.pipe, r) - - return [ - sid_to_string( - dcerpc.lsa_SidPtr_array_getitem(r.data_out.sids.sids, x).sid) - for x in range(r.data_out.sids.num_sids)] - -def Connect(pipe, access_mask = 0x02000000): - - r = dcerpc.samr_Connect() - r.data_in.system_name = dcerpc.new_uint16_array(1) - dcerpc.uint16_array_setitem(r.data_in.system_name, 0, ord('\\')) - r.data_in.access_mask = access_mask - - call_fn(dcerpc.dcerpc_samr_Connect, pipe, r) - - return ConnectHandle(pipe, r.data_out.connect_handle) - -def Connect2(pipe, system_name = '', access_mask = 0x02000000): - """Connect to the SAMR pipe.""" - - r = dcerpc.samr_Connect2() - r.data_in.system_name = system_name - r.data_in.access_mask = access_mask - - call_fn(dcerpc.dcerpc_samr_Connect2, pipe, r) - - return ConnectHandle(pipe, r.data_out.connect_handle) - -def Connect3(pipe, system_name = '', access_mask = 0x02000000): - - r = dcerpc.samr_Connect3() - r.data_in.system_name = system_name - r.data_in.unknown = 0 - r.data_in.access_mask = access_mask - - call_fn(dcerpc.dcerpc_samr_Connect3, pipe, r) - - return ConnectHandle(pipe, r.data_out.connect_handle) - - -def Connect4(pipe, system_name = '', access_mask = 0x02000000): - - r = dcerpc.samr_Connect4() - r.data_in.system_name = system_name - r.data_in.unknown = 0 - r.data_in.access_mask = access_mask - - call_fn(dcerpc.dcerpc_samr_Connect4, pipe, r) - - return ConnectHandle(pipe, r.data_out.connect_handle) - -def Connect5(pipe, system_name = '', access_mask = 0x02000000): - - r = dcerpc.samr_Connect5() - r.data_in.system_name = system_name - r.data_in.access_mask = access_mask - r.data_in.level = 1 - r.data_in.info = dcerpc.new_samr_ConnectInfo_array(1) - r.data_in.info.unknown1 = 0 - r.data_in.info.unknown2 = 0 - - call_fn(dcerpc.dcerpc_samr_Connect5, pipe, r) - - return ConnectHandle(pipe, r.data_out.connect_handle) - -# AddGroupMember -# DeleteDomainGroup -# DeleteGroupMember -# SetMemberAttributesofGroup -# AddAliasMember -# DeleteAliasMember -# GetMembersinAlias -# SetUserInfo -# ChangePasswordUser -# GetDisplayEnumerationIndex -# RemoveMemberFromForeignDomain -# GetDisplayEnumerationIndex2 -# RemoveMultipleMembersFromAlias -# OemChangePasswordUser2 -# ChangePasswordUser2 -# SetUserInfo2 -# ChangePasswordUser3 -# SetDsrmPassword -# ValidatePassword diff --git a/source4/scripting/swig/status_codes.i b/source4/scripting/swig/status_codes.i deleted file mode 100644 index cf13ac9852..0000000000 --- a/source4/scripting/swig/status_codes.i +++ /dev/null @@ -1,554 +0,0 @@ -/* Win32 status codes */ - -#define STATUS_BUFFER_OVERFLOW 0x80000005 -#define STATUS_NO_MORE_FILES 0x80000006 -#define NT_STATUS_NO_MORE_ENTRIES 0x8000001a - -#define STATUS_MORE_ENTRIES 0x0105 -#define STATUS_SOME_UNMAPPED 0x0107 -#define ERROR_INVALID_PARAMETER 0x0057 -#define ERROR_INSUFFICIENT_BUFFER 0x007a -#define STATUS_NOTIFY_ENUM_DIR 0x010c -#define ERROR_INVALID_DATATYPE 0x070c - -/* NT status codes */ - -#define NT_STATUS_OK 0x00000000 -#define NT_STATUS_UNSUCCESSFUL 0xC0000001 -#define NT_STATUS_NOT_IMPLEMENTED 0xC0000002 -#define NT_STATUS_INVALID_INFO_CLASS 0xC0000003 -#define NT_STATUS_INFO_LENGTH_MISMATCH 0xC0000004 -#define NT_STATUS_ACCESS_VIOLATION 0xC0000005 -#define NT_STATUS_IN_PAGE_ERROR 0xC0000006 -#define NT_STATUS_PAGEFILE_QUOTA 0xC0000007 -#define NT_STATUS_INVALID_HANDLE 0xC0000008 -#define NT_STATUS_BAD_INITIAL_STACK 0xC0000009 -#define NT_STATUS_BAD_INITIAL_PC 0xC000000a -#define NT_STATUS_INVALID_CID 0xC000000b -#define NT_STATUS_TIMER_NOT_CANCELED 0xC000000c -#define NT_STATUS_INVALID_PARAMETER 0xC000000d -#define NT_STATUS_NO_SUCH_DEVICE 0xC000000e -#define NT_STATUS_NO_SUCH_FILE 0xC000000f -#define NT_STATUS_INVALID_DEVICE_REQUEST 0xC0000010 -#define NT_STATUS_END_OF_FILE 0xC0000011 -#define NT_STATUS_WRONG_VOLUME 0xC0000012 -#define NT_STATUS_NO_MEDIA_IN_DEVICE 0xC0000013 -#define NT_STATUS_UNRECOGNIZED_MEDIA 0xC0000014 -#define NT_STATUS_NONEXISTENT_SECTOR 0xC0000015 -#define NT_STATUS_MORE_PROCESSING_REQUIRED 0xC0000016 -#define NT_STATUS_NO_MEMORY 0xC0000017 -#define NT_STATUS_CONFLICTING_ADDRESSES 0xC0000018 -#define NT_STATUS_NOT_MAPPED_VIEW 0xC0000019 -#define NT_STATUS_UNABLE_TO_FREE_VM 0xC000001a -#define NT_STATUS_UNABLE_TO_DELETE_SECTION 0xC000001b -#define NT_STATUS_INVALID_SYSTEM_SERVICE 0xC000001c -#define NT_STATUS_ILLEGAL_INSTRUCTION 0xC000001d -#define NT_STATUS_INVALID_LOCK_SEQUENCE 0xC000001e -#define NT_STATUS_INVALID_VIEW_SIZE 0xC000001f -#define NT_STATUS_INVALID_FILE_FOR_SECTION 0xC0000020 -#define NT_STATUS_ALREADY_COMMITTED 0xC0000021 -#define NT_STATUS_ACCESS_DENIED 0xC0000022 -#define NT_STATUS_BUFFER_TOO_SMALL 0xC0000023 -#define NT_STATUS_OBJECT_TYPE_MISMATCH 0xC0000024 -#define NT_STATUS_NONCONTINUABLE_EXCEPTION 0xC0000025 -#define NT_STATUS_INVALID_DISPOSITION 0xC0000026 -#define NT_STATUS_UNWIND 0xC0000027 -#define NT_STATUS_BAD_STACK 0xC0000028 -#define NT_STATUS_INVALID_UNWIND_TARGET 0xC0000029 -#define NT_STATUS_NOT_LOCKED 0xC000002a -#define NT_STATUS_PARITY_ERROR 0xC000002b -#define NT_STATUS_UNABLE_TO_DECOMMIT_VM 0xC000002c -#define NT_STATUS_NOT_COMMITTED 0xC000002d -#define NT_STATUS_INVALID_PORT_ATTRIBUTES 0xC000002e -#define NT_STATUS_PORT_MESSAGE_TOO_LONG 0xC000002f -#define NT_STATUS_INVALID_PARAMETER_MIX 0xC0000030 -#define NT_STATUS_INVALID_QUOTA_LOWER 0xC0000031 -#define NT_STATUS_DISK_CORRUPT_ERROR 0xC0000032 -#define NT_STATUS_OBJECT_NAME_INVALID 0xC0000033 -#define NT_STATUS_OBJECT_NAME_NOT_FOUND 0xC0000034 -#define NT_STATUS_OBJECT_NAME_COLLISION 0xC0000035 -#define NT_STATUS_HANDLE_NOT_WAITABLE 0xC0000036 -#define NT_STATUS_PORT_DISCONNECTED 0xC0000037 -#define NT_STATUS_DEVICE_ALREADY_ATTACHED 0xC0000038 -#define NT_STATUS_OBJECT_PATH_INVALID 0xC0000039 -#define NT_STATUS_OBJECT_PATH_NOT_FOUND 0xC000003a -#define NT_STATUS_OBJECT_PATH_SYNTAX_BAD 0xC000003b -#define NT_STATUS_DATA_OVERRUN 0xC000003c -#define NT_STATUS_DATA_LATE_ERROR 0xC000003d -#define NT_STATUS_DATA_ERROR 0xC000003e -#define NT_STATUS_CRC_ERROR 0xC000003f -#define NT_STATUS_SECTION_TOO_BIG 0xC0000040 -#define NT_STATUS_PORT_CONNECTION_REFUSED 0xC0000041 -#define NT_STATUS_INVALID_PORT_HANDLE 0xC0000042 -#define NT_STATUS_SHARING_VIOLATION 0xC0000043 -#define NT_STATUS_QUOTA_EXCEEDED 0xC0000044 -#define NT_STATUS_INVALID_PAGE_PROTECTION 0xC0000045 -#define NT_STATUS_MUTANT_NOT_OWNED 0xC0000046 -#define NT_STATUS_SEMAPHORE_LIMIT_EXCEEDED 0xC0000047 -#define NT_STATUS_PORT_ALREADY_SET 0xC0000048 -#define NT_STATUS_SECTION_NOT_IMAGE 0xC0000049 -#define NT_STATUS_SUSPEND_COUNT_EXCEEDED 0xC000004a -#define NT_STATUS_THREAD_IS_TERMINATING 0xC000004b -#define NT_STATUS_BAD_WORKING_SET_LIMIT 0xC000004c -#define NT_STATUS_INCOMPATIBLE_FILE_MAP 0xC000004d -#define NT_STATUS_SECTION_PROTECTION 0xC000004e -#define NT_STATUS_EAS_NOT_SUPPORTED 0xC000004f -#define NT_STATUS_EA_TOO_LARGE 0xC0000050 -#define NT_STATUS_NONEXISTENT_EA_ENTRY 0xC0000051 -#define NT_STATUS_NO_EAS_ON_FILE 0xC0000052 -#define NT_STATUS_EA_CORRUPT_ERROR 0xC0000053 -#define NT_STATUS_FILE_LOCK_CONFLICT 0xC0000054 -#define NT_STATUS_LOCK_NOT_GRANTED 0xC0000055 -#define NT_STATUS_DELETE_PENDING 0xC0000056 -#define NT_STATUS_CTL_FILE_NOT_SUPPORTED 0xC0000057 -#define NT_STATUS_UNKNOWN_REVISION 0xC0000058 -#define NT_STATUS_REVISION_MISMATCH 0xC0000059 -#define NT_STATUS_INVALID_OWNER 0xC000005a -#define NT_STATUS_INVALID_PRIMARY_GROUP 0xC000005b -#define NT_STATUS_NO_IMPERSONATION_TOKEN 0xC000005c -#define NT_STATUS_CANT_DISABLE_MANDATORY 0xC000005d -#define NT_STATUS_NO_LOGON_SERVERS 0xC000005e -#define NT_STATUS_NO_SUCH_LOGON_SESSION 0xC000005f -#define NT_STATUS_NO_SUCH_PRIVILEGE 0xC0000060 -#define NT_STATUS_PRIVILEGE_NOT_HELD 0xC0000061 -#define NT_STATUS_INVALID_ACCOUNT_NAME 0xC0000062 -#define NT_STATUS_USER_EXISTS 0xC0000063 -#define NT_STATUS_NO_SUCH_USER 0xC0000064 -#define NT_STATUS_GROUP_EXISTS 0xC0000065 -#define NT_STATUS_NO_SUCH_GROUP 0xC0000066 -#define NT_STATUS_MEMBER_IN_GROUP 0xC0000067 -#define NT_STATUS_MEMBER_NOT_IN_GROUP 0xC0000068 -#define NT_STATUS_LAST_ADMIN 0xC0000069 -#define NT_STATUS_WRONG_PASSWORD 0xC000006a -#define NT_STATUS_ILL_FORMED_PASSWORD 0xC000006b -#define NT_STATUS_PASSWORD_RESTRICTION 0xC000006c -#define NT_STATUS_LOGON_FAILURE 0xC000006d -#define NT_STATUS_ACCOUNT_RESTRICTION 0xC000006e -#define NT_STATUS_INVALID_LOGON_HOURS 0xC000006f -#define NT_STATUS_INVALID_WORKSTATION 0xC0000070 -#define NT_STATUS_PASSWORD_EXPIRED 0xC0000071 -#define NT_STATUS_ACCOUNT_DISABLED 0xC0000072 -#define NT_STATUS_NONE_MAPPED 0xC0000073 -#define NT_STATUS_TOO_MANY_LUIDS_REQUESTED 0xC0000074 -#define NT_STATUS_LUIDS_EXHAUSTED 0xC0000075 -#define NT_STATUS_INVALID_SUB_AUTHORITY 0xC0000076 -#define NT_STATUS_INVALID_ACL 0xC0000077 -#define NT_STATUS_INVALID_SID 0xC0000078 -#define NT_STATUS_INVALID_SECURITY_DESCR 0xC0000079 -#define NT_STATUS_PROCEDURE_NOT_FOUND 0xC000007a -#define NT_STATUS_INVALID_IMAGE_FORMAT 0xC000007b -#define NT_STATUS_NO_TOKEN 0xC000007c -#define NT_STATUS_BAD_INHERITANCE_ACL 0xC000007d -#define NT_STATUS_RANGE_NOT_LOCKED 0xC000007e -#define NT_STATUS_DISK_FULL 0xC000007f -#define NT_STATUS_SERVER_DISABLED 0xC0000080 -#define NT_STATUS_SERVER_NOT_DISABLED 0xC0000081 -#define NT_STATUS_TOO_MANY_GUIDS_REQUESTED 0xC0000082 -#define NT_STATUS_GUIDS_EXHAUSTED 0xC0000083 -#define NT_STATUS_INVALID_ID_AUTHORITY 0xC0000084 -#define NT_STATUS_AGENTS_EXHAUSTED 0xC0000085 -#define NT_STATUS_INVALID_VOLUME_LABEL 0xC0000086 -#define NT_STATUS_SECTION_NOT_EXTENDED 0xC0000087 -#define NT_STATUS_NOT_MAPPED_DATA 0xC0000088 -#define NT_STATUS_RESOURCE_DATA_NOT_FOUND 0xC0000089 -#define NT_STATUS_RESOURCE_TYPE_NOT_FOUND 0xC000008a -#define NT_STATUS_RESOURCE_NAME_NOT_FOUND 0xC000008b -#define NT_STATUS_ARRAY_BOUNDS_EXCEEDED 0xC000008c -#define NT_STATUS_FLOAT_DENORMAL_OPERAND 0xC000008d -#define NT_STATUS_FLOAT_DIVIDE_BY_ZERO 0xC000008e -#define NT_STATUS_FLOAT_INEXACT_RESULT 0xC000008f -#define NT_STATUS_FLOAT_INVALID_OPERATION 0xC0000090 -#define NT_STATUS_FLOAT_OVERFLOW 0xC0000091 -#define NT_STATUS_FLOAT_STACK_CHECK 0xC0000092 -#define NT_STATUS_FLOAT_UNDERFLOW 0xC0000093 -#define NT_STATUS_INTEGER_DIVIDE_BY_ZERO 0xC0000094 -#define NT_STATUS_INTEGER_OVERFLOW 0xC0000095 -#define NT_STATUS_PRIVILEGED_INSTRUCTION 0xC0000096 -#define NT_STATUS_TOO_MANY_PAGING_FILES 0xC0000097 -#define NT_STATUS_FILE_INVALID 0xC0000098 -#define NT_STATUS_ALLOTTED_SPACE_EXCEEDED 0xC0000099 -#define NT_STATUS_INSUFFICIENT_RESOURCES 0xC000009a -#define NT_STATUS_DFS_EXIT_PATH_FOUND 0xC000009b -#define NT_STATUS_DEVICE_DATA_ERROR 0xC000009c -#define NT_STATUS_DEVICE_NOT_CONNECTED 0xC000009d -#define NT_STATUS_DEVICE_POWER_FAILURE 0xC000009e -#define NT_STATUS_FREE_VM_NOT_AT_BASE 0xC000009f -#define NT_STATUS_MEMORY_NOT_ALLOCATED 0xC00000a0 -#define NT_STATUS_WORKING_SET_QUOTA 0xC00000a1 -#define NT_STATUS_MEDIA_WRITE_PROTECTED 0xC00000a2 -#define NT_STATUS_DEVICE_NOT_READY 0xC00000a3 -#define NT_STATUS_INVALID_GROUP_ATTRIBUTES 0xC00000a4 -#define NT_STATUS_BAD_IMPERSONATION_LEVEL 0xC00000a5 -#define NT_STATUS_CANT_OPEN_ANONYMOUS 0xC00000a6 -#define NT_STATUS_BAD_VALIDATION_CLASS 0xC00000a7 -#define NT_STATUS_BAD_TOKEN_TYPE 0xC00000a8 -#define NT_STATUS_BAD_MASTER_BOOT_RECORD 0xC00000a9 -#define NT_STATUS_INSTRUCTION_MISALIGNMENT 0xC00000aa -#define NT_STATUS_INSTANCE_NOT_AVAILABLE 0xC00000ab -#define NT_STATUS_PIPE_NOT_AVAILABLE 0xC00000ac -#define NT_STATUS_INVALID_PIPE_STATE 0xC00000ad -#define NT_STATUS_PIPE_BUSY 0xC00000ae -#define NT_STATUS_ILLEGAL_FUNCTION 0xC00000af -#define NT_STATUS_PIPE_DISCONNECTED 0xC00000b0 -#define NT_STATUS_PIPE_CLOSING 0xC00000b1 -#define NT_STATUS_PIPE_CONNECTED 0xC00000b2 -#define NT_STATUS_PIPE_LISTENING 0xC00000b3 -#define NT_STATUS_INVALID_READ_MODE 0xC00000b4 -#define NT_STATUS_IO_TIMEOUT 0xC00000b5 -#define NT_STATUS_FILE_FORCED_CLOSED 0xC00000b6 -#define NT_STATUS_PROFILING_NOT_STARTED 0xC00000b7 -#define NT_STATUS_PROFILING_NOT_STOPPED 0xC00000b8 -#define NT_STATUS_COULD_NOT_INTERPRET 0xC00000b9 -#define NT_STATUS_FILE_IS_A_DIRECTORY 0xC00000ba -#define NT_STATUS_NOT_SUPPORTED 0xC00000bb -#define NT_STATUS_REMOTE_NOT_LISTENING 0xC00000bc -#define NT_STATUS_DUPLICATE_NAME 0xC00000bd -#define NT_STATUS_BAD_NETWORK_PATH 0xC00000be -#define NT_STATUS_NETWORK_BUSY 0xC00000bf -#define NT_STATUS_DEVICE_DOES_NOT_EXIST 0xC00000c0 -#define NT_STATUS_TOO_MANY_COMMANDS 0xC00000c1 -#define NT_STATUS_ADAPTER_HARDWARE_ERROR 0xC00000c2 -#define NT_STATUS_INVALID_NETWORK_RESPONSE 0xC00000c3 -#define NT_STATUS_UNEXPECTED_NETWORK_ERROR 0xC00000c4 -#define NT_STATUS_BAD_REMOTE_ADAPTER 0xC00000c5 -#define NT_STATUS_PRINT_QUEUE_FULL 0xC00000c6 -#define NT_STATUS_NO_SPOOL_SPACE 0xC00000c7 -#define NT_STATUS_PRINT_CANCELLED 0xC00000c8 -#define NT_STATUS_NETWORK_NAME_DELETED 0xC00000c9 -#define NT_STATUS_NETWORK_ACCESS_DENIED 0xC00000ca -#define NT_STATUS_BAD_DEVICE_TYPE 0xC00000cb -#define NT_STATUS_BAD_NETWORK_NAME 0xC00000cc -#define NT_STATUS_TOO_MANY_NAMES 0xC00000cd -#define NT_STATUS_TOO_MANY_SESSIONS 0xC00000ce -#define NT_STATUS_SHARING_PAUSED 0xC00000cf -#define NT_STATUS_REQUEST_NOT_ACCEPTED 0xC00000d0 -#define NT_STATUS_REDIRECTOR_PAUSED 0xC00000d1 -#define NT_STATUS_NET_WRITE_FAULT 0xC00000d2 -#define NT_STATUS_PROFILING_AT_LIMIT 0xC00000d3 -#define NT_STATUS_NOT_SAME_DEVICE 0xC00000d4 -#define NT_STATUS_FILE_RENAMED 0xC00000d5 -#define NT_STATUS_VIRTUAL_CIRCUIT_CLOSED 0xC00000d6 -#define NT_STATUS_NO_SECURITY_ON_OBJECT 0xC00000d7 -#define NT_STATUS_CANT_WAIT 0xC00000d8 -#define NT_STATUS_PIPE_EMPTY 0xC00000d9 -#define NT_STATUS_CANT_ACCESS_DOMAIN_INFO 0xC00000da -#define NT_STATUS_CANT_TERMINATE_SELF 0xC00000db -#define NT_STATUS_INVALID_SERVER_STATE 0xC00000dc -#define NT_STATUS_INVALID_DOMAIN_STATE 0xC00000dd -#define NT_STATUS_INVALID_DOMAIN_ROLE 0xC00000de -#define NT_STATUS_NO_SUCH_DOMAIN 0xC00000df -#define NT_STATUS_DOMAIN_EXISTS 0xC00000e0 -#define NT_STATUS_DOMAIN_LIMIT_EXCEEDED 0xC00000e1 -#define NT_STATUS_OPLOCK_NOT_GRANTED 0xC00000e2 -#define NT_STATUS_INVALID_OPLOCK_PROTOCOL 0xC00000e3 -#define NT_STATUS_INTERNAL_DB_CORRUPTION 0xC00000e4 -#define NT_STATUS_INTERNAL_ERROR 0xC00000e5 -#define NT_STATUS_GENERIC_NOT_MAPPED 0xC00000e6 -#define NT_STATUS_BAD_DESCRIPTOR_FORMAT 0xC00000e7 -#define NT_STATUS_INVALID_USER_BUFFER 0xC00000e8 -#define NT_STATUS_UNEXPECTED_IO_ERROR 0xC00000e9 -#define NT_STATUS_UNEXPECTED_MM_CREATE_ERR 0xC00000ea -#define NT_STATUS_UNEXPECTED_MM_MAP_ERROR 0xC00000eb -#define NT_STATUS_UNEXPECTED_MM_EXTEND_ERR 0xC00000ec -#define NT_STATUS_NOT_LOGON_PROCESS 0xC00000ed -#define NT_STATUS_LOGON_SESSION_EXISTS 0xC00000ee -#define NT_STATUS_INVALID_PARAMETER_1 0xC00000ef -#define NT_STATUS_INVALID_PARAMETER_2 0xC00000f0 -#define NT_STATUS_INVALID_PARAMETER_3 0xC00000f1 -#define NT_STATUS_INVALID_PARAMETER_4 0xC00000f2 -#define NT_STATUS_INVALID_PARAMETER_5 0xC00000f3 -#define NT_STATUS_INVALID_PARAMETER_6 0xC00000f4 -#define NT_STATUS_INVALID_PARAMETER_7 0xC00000f5 -#define NT_STATUS_INVALID_PARAMETER_8 0xC00000f6 -#define NT_STATUS_INVALID_PARAMETER_9 0xC00000f7 -#define NT_STATUS_INVALID_PARAMETER_10 0xC00000f8 -#define NT_STATUS_INVALID_PARAMETER_11 0xC00000f9 -#define NT_STATUS_INVALID_PARAMETER_12 0xC00000fa -#define NT_STATUS_REDIRECTOR_NOT_STARTED 0xC00000fb -#define NT_STATUS_REDIRECTOR_STARTED 0xC00000fc -#define NT_STATUS_STACK_OVERFLOW 0xC00000fd -#define NT_STATUS_NO_SUCH_PACKAGE 0xC00000fe -#define NT_STATUS_BAD_FUNCTION_TABLE 0xC00000ff -#define NT_STATUS_DIRECTORY_NOT_EMPTY 0xC0000101 -#define NT_STATUS_FILE_CORRUPT_ERROR 0xC0000102 -#define NT_STATUS_NOT_A_DIRECTORY 0xC0000103 -#define NT_STATUS_BAD_LOGON_SESSION_STATE 0xC0000104 -#define NT_STATUS_LOGON_SESSION_COLLISION 0xC0000105 -#define NT_STATUS_NAME_TOO_LONG 0xC0000106 -#define NT_STATUS_FILES_OPEN 0xC0000107 -#define NT_STATUS_CONNECTION_IN_USE 0xC0000108 -#define NT_STATUS_MESSAGE_NOT_FOUND 0xC0000109 -#define NT_STATUS_PROCESS_IS_TERMINATING 0xC000010a -#define NT_STATUS_INVALID_LOGON_TYPE 0xC000010b -#define NT_STATUS_NO_GUID_TRANSLATION 0xC000010c -#define NT_STATUS_CANNOT_IMPERSONATE 0xC000010d -#define NT_STATUS_IMAGE_ALREADY_LOADED 0xC000010e -#define NT_STATUS_ABIOS_NOT_PRESENT 0xC000010f -#define NT_STATUS_ABIOS_LID_NOT_EXIST 0xC0000110 -#define NT_STATUS_ABIOS_LID_ALREADY_OWNED 0xC0000111 -#define NT_STATUS_ABIOS_NOT_LID_OWNER 0xC0000112 -#define NT_STATUS_ABIOS_INVALID_COMMAND 0xC0000113 -#define NT_STATUS_ABIOS_INVALID_LID 0xC0000114 -#define NT_STATUS_ABIOS_SELECTOR_NOT_AVAILABLE 0xC0000115 -#define NT_STATUS_ABIOS_INVALID_SELECTOR 0xC0000116 -#define NT_STATUS_NO_LDT 0xC0000117 -#define NT_STATUS_INVALID_LDT_SIZE 0xC0000118 -#define NT_STATUS_INVALID_LDT_OFFSET 0xC0000119 -#define NT_STATUS_INVALID_LDT_DESCRIPTOR 0xC000011a -#define NT_STATUS_INVALID_IMAGE_NE_FORMAT 0xC000011b -#define NT_STATUS_RXACT_INVALID_STATE 0xC000011c -#define NT_STATUS_RXACT_COMMIT_FAILURE 0xC000011d -#define NT_STATUS_MAPPED_FILE_SIZE_ZERO 0xC000011e -#define NT_STATUS_TOO_MANY_OPENED_FILES 0xC000011f -#define NT_STATUS_CANCELLED 0xC0000120 -#define NT_STATUS_CANNOT_DELETE 0xC0000121 -#define NT_STATUS_INVALID_COMPUTER_NAME 0xC0000122 -#define NT_STATUS_FILE_DELETED 0xC0000123 -#define NT_STATUS_SPECIAL_ACCOUNT 0xC0000124 -#define NT_STATUS_SPECIAL_GROUP 0xC0000125 -#define NT_STATUS_SPECIAL_USER 0xC0000126 -#define NT_STATUS_MEMBERS_PRIMARY_GROUP 0xC0000127 -#define NT_STATUS_FILE_CLOSED 0xC0000128 -#define NT_STATUS_TOO_MANY_THREADS 0xC0000129 -#define NT_STATUS_THREAD_NOT_IN_PROCESS 0xC000012a -#define NT_STATUS_TOKEN_ALREADY_IN_USE 0xC000012b -#define NT_STATUS_PAGEFILE_QUOTA_EXCEEDED 0xC000012c -#define NT_STATUS_COMMITMENT_LIMIT 0xC000012d -#define NT_STATUS_INVALID_IMAGE_LE_FORMAT 0xC000012e -#define NT_STATUS_INVALID_IMAGE_NOT_MZ 0xC000012f -#define NT_STATUS_INVALID_IMAGE_PROTECT 0xC0000130 -#define NT_STATUS_INVALID_IMAGE_WIN_16 0xC0000131 -#define NT_STATUS_LOGON_SERVER_CONFLICT 0xC0000132 -#define NT_STATUS_TIME_DIFFERENCE_AT_DC 0xC0000133 -#define NT_STATUS_SYNCHRONIZATION_REQUIRED 0xC0000134 -#define NT_STATUS_DLL_NOT_FOUND 0xC0000135 -#define NT_STATUS_OPEN_FAILED 0xC0000136 -#define NT_STATUS_IO_PRIVILEGE_FAILED 0xC0000137 -#define NT_STATUS_ORDINAL_NOT_FOUND 0xC0000138 -#define NT_STATUS_ENTRYPOINT_NOT_FOUND 0xC0000139 -#define NT_STATUS_CONTROL_C_EXIT 0xC000013a -#define NT_STATUS_LOCAL_DISCONNECT 0xC000013b -#define NT_STATUS_REMOTE_DISCONNECT 0xC000013c -#define NT_STATUS_REMOTE_RESOURCES 0xC000013d -#define NT_STATUS_LINK_FAILED 0xC000013e -#define NT_STATUS_LINK_TIMEOUT 0xC000013f -#define NT_STATUS_INVALID_CONNECTION 0xC0000140 -#define NT_STATUS_INVALID_ADDRESS 0xC0000141 -#define NT_STATUS_DLL_INIT_FAILED 0xC0000142 -#define NT_STATUS_MISSING_SYSTEMFILE 0xC0000143 -#define NT_STATUS_UNHANDLED_EXCEPTION 0xC0000144 -#define NT_STATUS_APP_INIT_FAILURE 0xC0000145 -#define NT_STATUS_PAGEFILE_CREATE_FAILED 0xC0000146 -#define NT_STATUS_NO_PAGEFILE 0xC0000147 -#define NT_STATUS_INVALID_LEVEL 0xC0000148 -#define NT_STATUS_WRONG_PASSWORD_CORE 0xC0000149 -#define NT_STATUS_ILLEGAL_FLOAT_CONTEXT 0xC000014a -#define NT_STATUS_PIPE_BROKEN 0xC000014b -#define NT_STATUS_REGISTRY_CORRUPT 0xC000014c -#define NT_STATUS_REGISTRY_IO_FAILED 0xC000014d -#define NT_STATUS_NO_EVENT_PAIR 0xC000014e -#define NT_STATUS_UNRECOGNIZED_VOLUME 0xC000014f -#define NT_STATUS_SERIAL_NO_DEVICE_INITED 0xC0000150 -#define NT_STATUS_NO_SUCH_ALIAS 0xC0000151 -#define NT_STATUS_MEMBER_NOT_IN_ALIAS 0xC0000152 -#define NT_STATUS_MEMBER_IN_ALIAS 0xC0000153 -#define NT_STATUS_ALIAS_EXISTS 0xC0000154 -#define NT_STATUS_LOGON_NOT_GRANTED 0xC0000155 -#define NT_STATUS_TOO_MANY_SECRETS 0xC0000156 -#define NT_STATUS_SECRET_TOO_LONG 0xC0000157 -#define NT_STATUS_INTERNAL_DB_ERROR 0xC0000158 -#define NT_STATUS_FULLSCREEN_MODE 0xC0000159 -#define NT_STATUS_TOO_MANY_CONTEXT_IDS 0xC000015a -#define NT_STATUS_LOGON_TYPE_NOT_GRANTED 0xC000015b -#define NT_STATUS_NOT_REGISTRY_FILE 0xC000015c -#define NT_STATUS_NT_CROSS_ENCRYPTION_REQUIRED 0xC000015d -#define NT_STATUS_DOMAIN_CTRLR_CONFIG_ERROR 0xC000015e -#define NT_STATUS_FT_MISSING_MEMBER 0xC000015f -#define NT_STATUS_ILL_FORMED_SERVICE_ENTRY 0xC0000160 -#define NT_STATUS_ILLEGAL_CHARACTER 0xC0000161 -#define NT_STATUS_UNMAPPABLE_CHARACTER 0xC0000162 -#define NT_STATUS_UNDEFINED_CHARACTER 0xC0000163 -#define NT_STATUS_FLOPPY_VOLUME 0xC0000164 -#define NT_STATUS_FLOPPY_ID_MARK_NOT_FOUND 0xC0000165 -#define NT_STATUS_FLOPPY_WRONG_CYLINDER 0xC0000166 -#define NT_STATUS_FLOPPY_UNKNOWN_ERROR 0xC0000167 -#define NT_STATUS_FLOPPY_BAD_REGISTERS 0xC0000168 -#define NT_STATUS_DISK_RECALIBRATE_FAILED 0xC0000169 -#define NT_STATUS_DISK_OPERATION_FAILED 0xC000016a -#define NT_STATUS_DISK_RESET_FAILED 0xC000016b -#define NT_STATUS_SHARED_IRQ_BUSY 0xC000016c -#define NT_STATUS_FT_ORPHANING 0xC000016d -#define NT_STATUS_PARTITION_FAILURE 0xC0000172 -#define NT_STATUS_INVALID_BLOCK_LENGTH 0xC0000173 -#define NT_STATUS_DEVICE_NOT_PARTITIONED 0xC0000174 -#define NT_STATUS_UNABLE_TO_LOCK_MEDIA 0xC0000175 -#define NT_STATUS_UNABLE_TO_UNLOAD_MEDIA 0xC0000176 -#define NT_STATUS_EOM_OVERFLOW 0xC0000177 -#define NT_STATUS_NO_MEDIA 0xC0000178 -#define NT_STATUS_NO_SUCH_MEMBER 0xC000017a -#define NT_STATUS_INVALID_MEMBER 0xC000017b -#define NT_STATUS_KEY_DELETED 0xC000017c -#define NT_STATUS_NO_LOG_SPACE 0xC000017d -#define NT_STATUS_TOO_MANY_SIDS 0xC000017e -#define NT_STATUS_LM_CROSS_ENCRYPTION_REQUIRED 0xC000017f -#define NT_STATUS_KEY_HAS_CHILDREN 0xC0000180 -#define NT_STATUS_CHILD_MUST_BE_VOLATILE 0xC0000181 -#define NT_STATUS_DEVICE_CONFIGURATION_ERROR 0xC0000182 -#define NT_STATUS_DRIVER_INTERNAL_ERROR 0xC0000183 -#define NT_STATUS_INVALID_DEVICE_STATE 0xC0000184 -#define NT_STATUS_IO_DEVICE_ERROR 0xC0000185 -#define NT_STATUS_DEVICE_PROTOCOL_ERROR 0xC0000186 -#define NT_STATUS_BACKUP_CONTROLLER 0xC0000187 -#define NT_STATUS_LOG_FILE_FULL 0xC0000188 -#define NT_STATUS_TOO_LATE 0xC0000189 -#define NT_STATUS_NO_TRUST_LSA_SECRET 0xC000018a -#define NT_STATUS_NO_TRUST_SAM_ACCOUNT 0xC000018b -#define NT_STATUS_TRUSTED_DOMAIN_FAILURE 0xC000018c -#define NT_STATUS_TRUSTED_RELATIONSHIP_FAILURE 0xC000018d -#define NT_STATUS_EVENTLOG_FILE_CORRUPT 0xC000018e -#define NT_STATUS_EVENTLOG_CANT_START 0xC000018f -#define NT_STATUS_TRUST_FAILURE 0xC0000190 -#define NT_STATUS_MUTANT_LIMIT_EXCEEDED 0xC0000191 -#define NT_STATUS_NETLOGON_NOT_STARTED 0xC0000192 -#define NT_STATUS_ACCOUNT_EXPIRED 0xC0000193 -#define NT_STATUS_POSSIBLE_DEADLOCK 0xC0000194 -#define NT_STATUS_NETWORK_CREDENTIAL_CONFLICT 0xC0000195 -#define NT_STATUS_REMOTE_SESSION_LIMIT 0xC0000196 -#define NT_STATUS_EVENTLOG_FILE_CHANGED 0xC0000197 -#define NT_STATUS_NOLOGON_INTERDOMAIN_TRUST_ACCOUNT 0xC0000198 -#define NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT 0xC0000199 -#define NT_STATUS_NOLOGON_SERVER_TRUST_ACCOUNT 0xC000019a -#define NT_STATUS_DOMAIN_TRUST_INCONSISTENT 0xC000019b -#define NT_STATUS_FS_DRIVER_REQUIRED 0xC000019c -#define NT_STATUS_NO_USER_SESSION_KEY 0xC0000202 -#define NT_STATUS_USER_SESSION_DELETED 0xC0000203 -#define NT_STATUS_RESOURCE_LANG_NOT_FOUND 0xC0000204 -#define NT_STATUS_INSUFF_SERVER_RESOURCES 0xC0000205 -#define NT_STATUS_INVALID_BUFFER_SIZE 0xC0000206 -#define NT_STATUS_INVALID_ADDRESS_COMPONENT 0xC0000207 -#define NT_STATUS_INVALID_ADDRESS_WILDCARD 0xC0000208 -#define NT_STATUS_TOO_MANY_ADDRESSES 0xC0000209 -#define NT_STATUS_ADDRESS_ALREADY_EXISTS 0xC000020a -#define NT_STATUS_ADDRESS_CLOSED 0xC000020b -#define NT_STATUS_CONNECTION_DISCONNECTED 0xC000020c -#define NT_STATUS_CONNECTION_RESET 0xC000020d -#define NT_STATUS_TOO_MANY_NODES 0xC000020e -#define NT_STATUS_TRANSACTION_ABORTED 0xC000020f -#define NT_STATUS_TRANSACTION_TIMED_OUT 0xC0000210 -#define NT_STATUS_TRANSACTION_NO_RELEASE 0xC0000211 -#define NT_STATUS_TRANSACTION_NO_MATCH 0xC0000212 -#define NT_STATUS_TRANSACTION_RESPONDED 0xC0000213 -#define NT_STATUS_TRANSACTION_INVALID_ID 0xC0000214 -#define NT_STATUS_TRANSACTION_INVALID_TYPE 0xC0000215 -#define NT_STATUS_NOT_SERVER_SESSION 0xC0000216 -#define NT_STATUS_NOT_CLIENT_SESSION 0xC0000217 -#define NT_STATUS_CANNOT_LOAD_REGISTRY_FILE 0xC0000218 -#define NT_STATUS_DEBUG_ATTACH_FAILED 0xC0000219 -#define NT_STATUS_SYSTEM_PROCESS_TERMINATED 0xC000021a -#define NT_STATUS_DATA_NOT_ACCEPTED 0xC000021b -#define NT_STATUS_NO_BROWSER_SERVERS_FOUND 0xC000021c -#define NT_STATUS_VDM_HARD_ERROR 0xC000021d -#define NT_STATUS_DRIVER_CANCEL_TIMEOUT 0xC000021e -#define NT_STATUS_REPLY_MESSAGE_MISMATCH 0xC000021f -#define NT_STATUS_MAPPED_ALIGNMENT 0xC0000220 -#define NT_STATUS_IMAGE_CHECKSUM_MISMATCH 0xC0000221 -#define NT_STATUS_LOST_WRITEBEHIND_DATA 0xC0000222 -#define NT_STATUS_CLIENT_SERVER_PARAMETERS_INVALID 0xC0000223 -#define NT_STATUS_PASSWORD_MUST_CHANGE 0xC0000224 -#define NT_STATUS_NOT_FOUND 0xC0000225 -#define NT_STATUS_NOT_TINY_STREAM 0xC0000226 -#define NT_STATUS_RECOVERY_FAILURE 0xC0000227 -#define NT_STATUS_STACK_OVERFLOW_READ 0xC0000228 -#define NT_STATUS_FAIL_CHECK 0xC0000229 -#define NT_STATUS_DUPLICATE_OBJECTID 0xC000022a -#define NT_STATUS_OBJECTID_EXISTS 0xC000022b -#define NT_STATUS_CONVERT_TO_LARGE 0xC000022c -#define NT_STATUS_RETRY 0xC000022d -#define NT_STATUS_FOUND_OUT_OF_SCOPE 0xC000022e -#define NT_STATUS_ALLOCATE_BUCKET 0xC000022f -#define NT_STATUS_PROPSET_NOT_FOUND 0xC0000230 -#define NT_STATUS_MARSHALL_OVERFLOW 0xC0000231 -#define NT_STATUS_INVALID_VARIANT 0xC0000232 -#define NT_STATUS_DOMAIN_CONTROLLER_NOT_FOUND 0xC0000233 -#define NT_STATUS_ACCOUNT_LOCKED_OUT 0xC0000234 -#define NT_STATUS_HANDLE_NOT_CLOSABLE 0xC0000235 -#define NT_STATUS_CONNECTION_REFUSED 0xC0000236 -#define NT_STATUS_GRACEFUL_DISCONNECT 0xC0000237 -#define NT_STATUS_ADDRESS_ALREADY_ASSOCIATED 0xC0000238 -#define NT_STATUS_ADDRESS_NOT_ASSOCIATED 0xC0000239 -#define NT_STATUS_CONNECTION_INVALID 0xC000023a -#define NT_STATUS_CONNECTION_ACTIVE 0xC000023b -#define NT_STATUS_NETWORK_UNREACHABLE 0xC000023c -#define NT_STATUS_HOST_UNREACHABLE 0xC000023d -#define NT_STATUS_PROTOCOL_UNREACHABLE 0xC000023e -#define NT_STATUS_PORT_UNREACHABLE 0xC000023f -#define NT_STATUS_REQUEST_ABORTED 0xC0000240 -#define NT_STATUS_CONNECTION_ABORTED 0xC0000241 -#define NT_STATUS_BAD_COMPRESSION_BUFFER 0xC0000242 -#define NT_STATUS_USER_MAPPED_FILE 0xC0000243 -#define NT_STATUS_AUDIT_FAILED 0xC0000244 -#define NT_STATUS_TIMER_RESOLUTION_NOT_SET 0xC0000245 -#define NT_STATUS_CONNECTION_COUNT_LIMIT 0xC0000246 -#define NT_STATUS_LOGIN_TIME_RESTRICTION 0xC0000247 -#define NT_STATUS_LOGIN_WKSTA_RESTRICTION 0xC0000248 -#define NT_STATUS_IMAGE_MP_UP_MISMATCH 0xC0000249 -#define NT_STATUS_INSUFFICIENT_LOGON_INFO 0xC0000250 -#define NT_STATUS_BAD_DLL_ENTRYPOINT 0xC0000251 -#define NT_STATUS_BAD_SERVICE_ENTRYPOINT 0xC0000252 -#define NT_STATUS_LPC_REPLY_LOST 0xC0000253 -#define NT_STATUS_IP_ADDRESS_CONFLICT1 0xC0000254 -#define NT_STATUS_IP_ADDRESS_CONFLICT2 0xC0000255 -#define NT_STATUS_REGISTRY_QUOTA_LIMIT 0xC0000256 -#define NT_STATUS_PATH_NOT_COVERED 0xC0000257 -#define NT_STATUS_NO_CALLBACK_ACTIVE 0xC0000258 -#define NT_STATUS_LICENSE_QUOTA_EXCEEDED 0xC0000259 -#define NT_STATUS_PWD_TOO_SHORT 0xC000025a -#define NT_STATUS_PWD_TOO_RECENT 0xC000025b -#define NT_STATUS_PWD_HISTORY_CONFLICT 0xC000025c -#define NT_STATUS_PLUGPLAY_NO_DEVICE 0xC000025e -#define NT_STATUS_UNSUPPORTED_COMPRESSION 0xC000025f -#define NT_STATUS_INVALID_HW_PROFILE 0xC0000260 -#define NT_STATUS_INVALID_PLUGPLAY_DEVICE_PATH 0xC0000261 -#define NT_STATUS_DRIVER_ORDINAL_NOT_FOUND 0xC0000262 -#define NT_STATUS_DRIVER_ENTRYPOINT_NOT_FOUND 0xC0000263 -#define NT_STATUS_RESOURCE_NOT_OWNED 0xC0000264 -#define NT_STATUS_TOO_MANY_LINKS 0xC0000265 -#define NT_STATUS_QUOTA_LIST_INCONSISTENT 0xC0000266 -#define NT_STATUS_FILE_IS_OFFLINE 0xC0000267 -#define NT_STATUS_NOT_A_REPARSE_POINT 0xC0000275 -#define NT_STATUS_NO_SUCH_JOB 0xC0000EDE - -#define WERR_OK 0 -#define WERR_BADFUNC 1 -#define WERR_BADFILE 2 -#define WERR_ACCESS_DENIED 5 -#define WERR_BADFID 6 -#define WERR_NOMEM 8 -#define WERR_GENERAL_FAILURE 31 -#define WERR_NOT_SUPPORTED 50 -#define WERR_BAD_NETPATH 53 -#define WERR_PRINTQ_FULL 61 -#define WERR_NO_SPOOL_SPACE 62 -#define WERR_NO_SUCH_SHARE 67 -#define WERR_ALREADY_EXISTS 80 -#define WERR_BAD_PASSWORD 86 -#define WERR_INVALID_PARAM 87 -#define WERR_INSUFFICIENT_BUFFER 122 -#define WERR_INVALID_NAME 123 -#define WERR_UNKNOWN_LEVEL 124 -#define WERR_OBJECT_PATH_INVALID 161 -#define WERR_NO_MORE_ITEMS 259 -#define WERR_MORE_DATA 234 -#define WERR_INVALID_OWNER 1307 -#define WERR_CAN_NOT_COMPLETE 1003 -#define WERR_INVALID_SECURITY_DESCRIPTOR 1338 -#define WERR_SERVER_UNAVAILABLE 1722 -#define WERR_UNKNOWN_PRINTER_DRIVER 1797 -#define WERR_INVALID_ENVIRONMENT 1805 -#define WERR_INVALID_FORM_NAME 1902 -#define WERR_INVALID_FORM_SIZE 1903 -#define WERR_BUF_TOO_SMALL 2123 -#define WERR_JOB_NOT_FOUND 2151 -#define WERR_DEST_NOT_FOUND 2152 -#define WERR_NOT_LOCAL_DOMAIN 2320 -#define WERR_STATUS_MORE_ENTRIES 0x0105 diff --git a/source4/scripting/swig/torture/pytorture b/source4/scripting/swig/torture/pytorture deleted file mode 100755 index e0123447e8..0000000000 --- a/source4/scripting/swig/torture/pytorture +++ /dev/null @@ -1,51 +0,0 @@ -#!/usr/bin/python - -import sys -from optparse import OptionParser - -# Parse command line - -parser = OptionParser() - -parser.add_option("-b", "--binding", action="store", type="string", - dest="binding") - -parser.add_option("-d", "--domain", action="store", type="string", - dest="domain") - -parser.add_option("-u", "--username", action="store", type="string", - dest="username") - -parser.add_option("-p", "--password", action="store", type="string", - dest="password") - -(options, args) = parser.parse_args() - -if not options.binding: - parser.error('You must supply a binding string') - -if not options.username or not options.password or not options.domain: - parser.error('You must supply a domain, username and password') - -binding = options.binding -domain = options.domain -username = options.username -password = options.password - -if len(args) == 0: - parser.error('You must supply the name of a module to test') - -# Import and test - -for test in args: - - try: - module = __import__('torture_%s' % test) - except ImportError: - print 'No such module "%s"' % test - sys.exit(1) - - if not hasattr(module, 'runtests'): - print 'Module "%s" does not have a runtests function' % test - - module.runtests(binding, (domain, username, password)) diff --git a/source4/scripting/swig/torture/spoolss.py b/source4/scripting/swig/torture/spoolss.py deleted file mode 100644 index a75385e079..0000000000 --- a/source4/scripting/swig/torture/spoolss.py +++ /dev/null @@ -1,437 +0,0 @@ -import sys, string -import dcerpc - - -def ResizeBufferCall(fn, pipe, r): - - r['buffer'] = None - r['buf_size'] = 0 - - result = fn(pipe, r) - - if result['result'] == dcerpc.WERR_INSUFFICIENT_BUFFER or \ - result['result'] == dcerpc.WERR_MORE_DATA: - r['buffer'] = result['buf_size'] * '\x00' - r['buf_size'] = result['buf_size'] - - result = fn(pipe, r) - - return result - - -def test_OpenPrinterEx(pipe, printer): - - print 'spoolss_OpenPrinterEx(%s)' % printer - - printername = '\\\\%s' % dcerpc.dcerpc_server_name(pipe) - - if printer is not None: - printername = printername + '\\%s' % printer - - r = {} - r['printername'] = printername - r['datatype'] = None - r['devmode_ctr'] = {} - r['devmode_ctr']['size'] = 0 - r['devmode_ctr']['devmode'] = None - r['access_mask'] = 0x02000000 - r['level'] = 1 - r['userlevel'] = {} - r['userlevel']['level1'] = {} - r['userlevel']['level1']['size'] = 0 - r['userlevel']['level1']['client'] = None - r['userlevel']['level1']['user'] = None - r['userlevel']['level1']['build'] = 1381 - r['userlevel']['level1']['major'] = 2 - r['userlevel']['level1']['minor'] = 0 - r['userlevel']['level1']['processor'] = 0 - - result = dcerpc.spoolss_OpenPrinterEx(pipe, r) - - return result['handle'] - - -def test_ClosePrinter(pipe, handle): - - r = {} - r['handle'] = handle - - dcerpc.spoolss_ClosePrinter(pipe, r) - - -def test_GetPrinter(pipe, handle): - - r = {} - r['handle'] = handle - - for level in [0, 1, 2, 3, 4, 5, 6, 7]: - - print 'spoolss_GetPrinter(level = %d)' % level - - r['level'] = level - r['buffer'] = None - r['buf_size'] = 0 - - result = ResizeBufferCall(dcerpc.spoolss_GetPrinter, pipe, r) - - -def test_EnumForms(pipe, handle): - - print 'spoolss_EnumForms()' - - r = {} - r['handle'] = handle - r['level'] = 1 - r['buffer'] = None - r['buf_size'] = 0 - - result = ResizeBufferCall(dcerpc.spoolss_EnumForms, pipe, r) - - forms = dcerpc.unmarshall_spoolss_FormInfo_array( - result['buffer'], r['level'], result['count']) - - for form in forms: - - r = {} - r['handle'] = handle - r['formname'] = form['info1']['formname'] - r['level'] = 1 - - result = ResizeBufferCall(dcerpc.spoolss_GetForm, pipe, r) - - -def test_EnumPorts(pipe, handle): - - print 'spoolss_EnumPorts()' - - for level in [1, 2]: - - r = {} - r['handle'] = handle - r['servername'] = None - r['level'] = level - - result = ResizeBufferCall(dcerpc.spoolss_EnumPorts, pipe, r) - - ports = dcerpc.unmarshall_spoolss_PortInfo_array( - result['buffer'], r['level'], result['count']) - - if level == 1: - port_names = map(lambda x: x['info1']['port_name'], ports) - - -def test_DeleteForm(pipe, handle, formname): - - r = {} - r['handle'] = handle - r['formname'] = formname - - dcerpc.spoolss_DeleteForm(pipe, r) - - -def test_GetForm(pipe, handle, formname): - - r = {} - r['handle'] = handle - r['formname'] = formname - r['level'] = 1 - - result = ResizeBufferCall(dcerpc.spoolss_GetForm, pipe, r) - - return result['info']['info1'] - - -def test_SetForm(pipe, handle, form): - - print 'spoolss_SetForm()' - - r = {} - r['handle'] = handle - r['level'] = 1 - r['formname'] = form['info1']['formname'] - r['info'] = form - - dcerpc.spoolss_SetForm(pipe, r) - - newform = test_GetForm(pipe, handle, r['formname']) - - if form['info1'] != newform: - print 'SetForm: mismatch: %s != %s' % \ - (r['info']['info1'], f) - sys.exit(1) - - -def test_AddForm(pipe, handle): - - print 'spoolss_AddForm()' - - formname = '__testform__' - - r = {} - r['handle'] = handle - r['level'] = 1 - r['info'] = {} - r['info']['info1'] = {} - r['info']['info1']['formname'] = formname - r['info']['info1']['flags'] = 0x0002 - r['info']['info1']['width'] = 100 - r['info']['info1']['length'] = 100 - r['info']['info1']['left'] = 0 - r['info']['info1']['top'] = 1000 - r['info']['info1']['right'] = 2000 - r['info']['info1']['bottom'] = 3000 - - try: - result = dcerpc.spoolss_AddForm(pipe, r) - except dcerpc.WERROR, arg: - if arg[0] == dcerpc.WERR_ALREADY_EXISTS: - test_DeleteForm(pipe, handle, formname) - result = dcerpc.spoolss_AddForm(pipe, r) - - f = test_GetForm(pipe, handle, formname) - - if r['info']['info1'] != f: - print 'AddForm: mismatch: %s != %s' % \ - (r['info']['info1'], f) - sys.exit(1) - - r['formname'] = formname - - test_SetForm(pipe, handle, r['info']) - - test_DeleteForm(pipe, handle, formname) - - -def test_EnumJobs(pipe, handle): - - print 'spoolss_EnumJobs()' - - r = {} - r['handle'] = handle - r['firstjob'] = 0 - r['numjobs'] = 0xffffffff - r['level'] = 1 - - result = ResizeBufferCall(dcerpc.spoolss_EnumJobs, pipe, r) - - if result['buffer'] is None: - return - - jobs = dcerpc.unmarshall_spoolss_JobInfo_array( - result['buffer'], r['level'], result['count']) - - for job in jobs: - - s = {} - s['handle'] = handle - s['job_id'] = job['info1']['job_id'] - s['level'] = 1 - - result = ResizeBufferCall(dcerpc.spoolss_GetJob, pipe, s) - - if result['info'] != job: - print 'EnumJobs: mismatch: %s != %s' % (result['info'], job) - sys.exit(1) - - - # TODO: AddJob, DeleteJob, ScheduleJob - - -def test_EnumPrinterData(pipe, handle): - - print 'test_EnumPrinterData()' - - enum_index = 0 - - while 1: - - r = {} - r['handle'] = handle - r['enum_index'] = enum_index - - r['value_offered'] = 0 - r['data_size'] = 0 - - result = dcerpc.spoolss_EnumPrinterData(pipe, r) - - r['value_offered'] = result['value_needed'] - r['data_size'] = result['data_size'] - - result = dcerpc.spoolss_EnumPrinterData(pipe, r) - - if result['result'] == dcerpc.WERR_NO_MORE_ITEMS: - break - - s = {} - s['handle'] = handle - s['value_name'] = result['value_name'] - - result2 = ResizeBufferCall(dcerpc.spoolss_GetPrinterData, pipe, s) - - if result['buffer'][:result2['buf_size']] != result2['buffer']: - print 'EnumPrinterData/GetPrinterData mismatch' - sys.exit(1) - - enum_index += 1 - - -def test_SetPrinterDataEx(pipe, handle): - - valuename = '__printerdataextest__' - data = '12345' - - r = {} - r['handle'] = handle - r['key_name'] = 'DsSpooler' - r['value_name'] = valuename - r['type'] = 3 - r['buffer'] = data - r['buf_size'] = len(data) - - result = dcerpc.spoolss_SetPrinterDataEx(pipe, r) - - -def test_EnumPrinterDataEx(pipe, handle): - - r = {} - r['handle'] = handle - r['key_name'] = 'DsSpooler' - r['buf_size'] = 0 - - result = dcerpc.spoolss_EnumPrinterDataEx(pipe, r) - - if result['result'] == dcerpc.WERR_MORE_DATA: - r['buf_size'] = result['buf_size'] - - result = dcerpc.spoolss_EnumPrinterDataEx(pipe, r) - - # TODO: test spoolss_GetPrinterDataEx() - - -def test_SetPrinterData(pipe, handle): - - print 'testing spoolss_SetPrinterData()' - - valuename = '__printerdatatest__' - data = '12345' - - r = {} - r['handle'] = handle - r['value_name'] = valuename - r['type'] = 3 # REG_BINARY - r['buffer'] = data - r['real_len'] = 5 - - dcerpc.spoolss_SetPrinterData(pipe, r) - - s = {} - s['handle'] = handle - s['value_name'] = valuename - - result = ResizeBufferCall(dcerpc.spoolss_GetPrinterData, pipe, r) - - if result['buffer'] != data: - print 'SetPrinterData: mismatch' - sys.exit(1) - - dcerpc.spoolss_DeletePrinterData(pipe, r) - - -def test_EnumPrinters(pipe): - - print 'testing spoolss_EnumPrinters()' - - printer_names = None - - r = {} - r['flags'] = 0x02 - r['server'] = None - - for level in [0, 1, 2, 4, 5]: - - print 'test_EnumPrinters(level = %d)' % level - - r['level'] = level - - result = ResizeBufferCall(dcerpc.spoolss_EnumPrinters, pipe, r) - - printers = dcerpc.unmarshall_spoolss_PrinterInfo_array( - result['buffer'], r['level'], result['count']) - - if level == 2: - for p in printers: - - # A nice check is for the specversion in the - # devicemode. This has always been observed to be - # 1025. - - if p['info2']['devmode']['specversion'] != 1025: - print 'test_EnumPrinters: specversion != 1025' - sys.exit(1) - - r['level'] = 1 - result = ResizeBufferCall(dcerpc.spoolss_EnumPrinters, pipe, r) - - for printer in dcerpc.unmarshall_spoolss_PrinterInfo_array( - result['buffer'], r['level'], result['count']): - - if string.find(printer['info1']['name'], '\\\\') == 0: - print 'Skipping remote printer %s' % printer['info1']['name'] - continue - - printername = string.split(printer['info1']['name'], ',')[0] - - handle = test_OpenPrinterEx(pipe, printername) - - test_GetPrinter(pipe, handle) - test_EnumPorts(pipe, handle) - test_EnumForms(pipe, handle) - test_AddForm(pipe, handle) - test_EnumJobs(pipe, handle) - test_EnumPrinterData(pipe, handle) - test_EnumPrinterDataEx(pipe, handle) - test_SetPrinterData(pipe, handle) -# test_SetPrinterDataEx(pipe, handle) - test_ClosePrinter(pipe, handle) - - -def test_EnumPrinterDrivers(pipe): - - print 'test spoolss_EnumPrinterDrivers()' - - for level in [1, 2, 3]: - - r = {} - r['server'] = None - r['environment'] = None - r['level'] = level - - result = ResizeBufferCall(dcerpc.spoolss_EnumPrinterDrivers, pipe, r) - - drivers = dcerpc.unmarshall_spoolss_DriverInfo_array( - result['buffer'], r['level'], result['count']) - - if level == 1: - driver_names = map(lambda x: x['info1']['driver_name'], drivers) - - -def test_PrintServer(pipe): - - handle = test_OpenPrinterEx(pipe, None) - - # EnumForms and AddForm tests return WERR_BADFID here (??) - - test_ClosePrinter(pipe, handle) - - -def runtests(binding, domain, username, password): - - print 'Testing SPOOLSS pipe' - - pipe = dcerpc.pipe_connect(binding, - dcerpc.DCERPC_SPOOLSS_UUID, dcerpc.DCERPC_SPOOLSS_VERSION, - domain, username, password) - - test_EnumPrinters(pipe) - test_EnumPrinterDrivers(pipe) - test_PrintServer(pipe) diff --git a/source4/scripting/swig/torture/torture_samr.py b/source4/scripting/swig/torture/torture_samr.py deleted file mode 100755 index 15c6dc1a76..0000000000 --- a/source4/scripting/swig/torture/torture_samr.py +++ /dev/null @@ -1,221 +0,0 @@ -#!/usr/bin/python - -import sys -import dcerpc, samr - -def test_Connect(pipe): - - handle = samr.Connect(pipe) - handle = samr.Connect2(pipe) - handle = samr.Connect3(pipe) - handle = samr.Connect4(pipe) - - # WIN2K3 only? - - try: - handle = samr.Connect5(pipe) - except dcerpc.NTSTATUS, arg: - if arg[0] != 0xc00000d2L: # NT_STATUS_NET_WRITE_FAULT - raise - - return handle - -def test_UserHandle(user_handle): - - # QuerySecurity()/SetSecurity() - - user_handle.SetSecurity(user_handle.QuerySecurity()) - - # GetUserPwInfo() - - user_handle.GetUserPwInfo() - - # GetUserInfo() - - for level in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 20, - 21, 23, 24, 25, 26]: - - try: - user_handle.QueryUserInfo(level) - user_handle.QueryUserInfo2(level) - except dcerpc.NTSTATUS, arg: - if arg[0] != 0xc0000003L: # NT_STATUS_INVALID_INFO_CLASS - raise - - # GetGroupsForUser() - - user_handle.GetGroupsForUser() - - # TestPrivateFunctionsUser() - - try: - user_handle.TestPrivateFunctionsUser() - except dcerpc.NTSTATUS, arg: - if arg[0] != 0xC0000002L: - raise - -def test_GroupHandle(group_handle): - - # QuerySecurity()/SetSecurity() - - group_handle.SetSecurity(group_handle.QuerySecurity()) - - # QueryGroupInfo() - - for level in [1, 2, 3, 4, 5]: - info = group_handle.QueryGroupInfo(level) - - # TODO: SetGroupinfo() - - # QueryGroupMember() - - group_handle.QueryGroupMember() - -def test_AliasHandle(alias_handle): - - # QuerySecurity()/SetSecurity() - - alias_handle.SetSecurity(alias_handle.QuerySecurity()) - - print alias_handle.GetMembersInAlias() - -def test_DomainHandle(name, sid, domain_handle): - - print 'testing %s (%s)' % (name, sid) - - # QuerySecurity()/SetSecurity() - - domain_handle.SetSecurity(domain_handle.QuerySecurity()) - - # LookupNames(), none mapped - - try: - domain_handle.LookupNames(['xxNONAMExx']) - except dcerpc.NTSTATUS, arg: - if arg[0] != 0xc0000073L: - raise dcerpc.NTSTATUS(arg) - - # LookupNames(), some mapped - - if name != 'Builtin': - domain_handle.LookupNames(['Administrator', 'xxNONAMExx']) - - # QueryDomainInfo()/SetDomainInfo() - - levels = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13] - set_ok = [1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0] - - for i in range(len(levels)): - - info = domain_handle.QueryDomainInfo(level = levels[i]) - - try: - domain_handle.SetDomainInfo(levels[i], info) - except dcerpc.NTSTATUS, arg: - if not (arg[0] == 0xc0000003L and not set_ok[i]): - raise - - # QueryDomainInfo2() - - levels = [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13] - - for i in range(len(levels)): - domain_handle.QueryDomainInfo2(level = levels[i]) - - # EnumDomainUsers - - print 'testing users' - - users = domain_handle.EnumDomainUsers() - rids = domain_handle.LookupNames(users) - - for i in range(len(users)): - test_UserHandle(domain_handle.OpenUser(rids[0][i])) - - # QueryDisplayInfo - - for i in [1, 2, 3, 4, 5]: - domain_handle.QueryDisplayInfo(level = i) - domain_handle.QueryDisplayInfo2(level = i) - domain_handle.QueryDisplayInfo3(level = i) - - # EnumDomainGroups - - print 'testing groups' - - groups = domain_handle.EnumDomainGroups() - rids = domain_handle.LookupNames(groups) - - for i in range(len(groups)): - test_GroupHandle(domain_handle.OpenGroup(rids[0][i])) - - # EnumDomainAliases - - print 'testing aliases' - - aliases = domain_handle.EnumDomainAliases() - rids = domain_handle.LookupNames(aliases) - - for i in range(len(aliases)): - test_AliasHandle(domain_handle.OpenAlias(rids[0][i])) - - # CreateUser - # CreateUser2 - # CreateDomAlias - # RidToSid - # RemoveMemberFromForeignDomain - # CreateDomainGroup - # GetAliasMembership - - # GetBootKeyInformation() - - try: - domain_handle.GetBootKeyInformation() - except dcerpc.NTSTATUS, arg: - pass - - # TestPrivateFunctionsDomain() - - try: - domain_handle.TestPrivateFunctionsDomain() - except dcerpc.NTSTATUS, arg: - if arg[0] != 0xC0000002L: - raise - -def test_ConnectHandle(connect_handle): - - print 'testing connect handle' - - # QuerySecurity/SetSecurity - - connect_handle.SetSecurity(connect_handle.QuerySecurity()) - - # Lookup bogus domain - - try: - connect_handle.LookupDomain('xxNODOMAINxx') - except dcerpc.NTSTATUS, arg: - if arg[0] != 0xC00000DFL: # NT_STATUS_NO_SUCH_DOMAIN - raise - - # Test all domains - - for domain_name in connect_handle.EnumDomains(): - - connect_handle.GetDomPwInfo(domain_name) - sid = connect_handle.LookupDomain(domain_name) - domain_handle = connect_handle.OpenDomain(sid) - - test_DomainHandle(domain_name, sid, domain_handle) - - # TODO: Test Shutdown() function - -def runtests(binding, creds): - - print 'Testing SAMR pipe' - - pipe = dcerpc.pipe_connect(binding, - dcerpc.DCERPC_SAMR_UUID, int(dcerpc.DCERPC_SAMR_VERSION), creds) - - handle = test_Connect(pipe) - test_ConnectHandle(handle) diff --git a/source4/scripting/swig/torture/torture_tdb.py b/source4/scripting/swig/torture/torture_tdb.py deleted file mode 100755 index 7f97caf6cb..0000000000 --- a/source4/scripting/swig/torture/torture_tdb.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/python - -import sys, os -import Tdb - -def fail(msg): - print 'FAILED:', msg - sys.exit(1) - -tdb_file = '/tmp/torture_tdb.tdb' - -# Create temporary tdb file - -t = Tdb.Tdb(tdb_file, flags = Tdb.CLEAR_IF_FIRST) - -# Check non-existent key throws KeyError exception - -try: - t['__none__'] -except KeyError: - pass -else: - fail('non-existent key did not throw KeyError') - -# Check storing key - -t['bar'] = '1234' -if t['bar'] != '1234': - fail('store key failed') - -# Check key exists - -if not t.has_key('bar'): - fail('has_key() failed for existing key') - -if t.has_key('__none__'): - fail('has_key() succeeded for non-existent key') - -# Delete key - -try: - del(t['__none__']) -except KeyError: - pass -else: - fail('delete of non-existent key did not throw KeyError') - -del t['bar'] -if t.has_key('bar'): - fail('delete of existing key did not delete key') - -# Clear all keys - -t.clear() -if len(t) != 0: - fail('clear failed to remove all keys') - -# Other dict functions - -t['a'] = '1' -t['ab'] = '12' -t['abc'] = '123' - -if len(t) != 3: - fail('len method produced wrong value') - -keys = t.keys() -values = t.values() -items = t.items() - -if set(keys) != set(['a', 'ab', 'abc']): - fail('keys method produced wrong values') - -if set(values) != set(['1', '12', '123']): - fail('values method produced wrong values') - -if set(items) != set([('a', '1'), ('ab', '12'), ('abc', '123')]): - fail('values method produced wrong values') - -t.close() - -# Re-open read-only - -t = Tdb.Tdb(tdb_file, open_flags = os.O_RDONLY) -t.keys() -t.close() - -# Clean up - -os.unlink(tdb_file) diff --git a/source4/scripting/swig/torture/winreg.py b/source4/scripting/swig/torture/winreg.py deleted file mode 100755 index eb60b9847e..0000000000 --- a/source4/scripting/swig/torture/winreg.py +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/python - -import sys, dcerpc - -def test_OpenHKLM(pipe): - - r = {} - r['unknown'] = {} - r['unknown']['unknown0'] = 0x9038 - r['unknown']['unknown1'] = 0x0000 - r['access_required'] = 0x02000000 - - result = dcerpc.winreg_OpenHKLM(pipe, r) - - return result['handle'] - -def test_QueryInfoKey(pipe, handle): - - r = {} - r['handle'] = handle - r['class'] = {} - r['class']['name'] = None - - return dcerpc.winreg_QueryInfoKey(pipe, r) - -def test_CloseKey(pipe, handle): - - r = {} - r['handle'] = handle - - dcerpc.winreg_CloseKey(pipe, r) - -def test_FlushKey(pipe, handle): - - r = {} - r['handle'] = handle - - dcerpc.winreg_FlushKey(pipe, r) - -def test_GetVersion(pipe, handle): - - r = {} - r['handle'] = handle - - dcerpc.winreg_GetVersion(pipe, r) - -def test_GetKeySecurity(pipe, handle): - - r = {} - r['handle'] = handle - r['unknown'] = 4 - r['size'] = None - r['data'] = {} - r['data']['max_len'] = 0 - r['data']['data'] = '' - - result = dcerpc.winreg_GetKeySecurity(pipe, r) - - print result - - if result['result'] == dcerpc.WERR_INSUFFICIENT_BUFFER: - r['size'] = {} - r['size']['max_len'] = result['data']['max_len'] - r['size']['offset'] = 0 - r['size']['len'] = result['data']['max_len'] - - result = dcerpc.winreg_GetKeySecurity(pipe, r) - - print result - - sys.exit(1) - -def test_Key(pipe, handle, name, depth = 0): - - # Don't descend too far. Registries can be very deep. - - if depth > 2: - return - - try: - keyinfo = test_QueryInfoKey(pipe, handle) - except dcerpc.WERROR, arg: - if arg[0] == dcerpc.WERR_ACCESS_DENIED: - return - - test_GetVersion(pipe, handle) - - test_FlushKey(pipe, handle) - - test_GetKeySecurity(pipe, handle) - - # Enumerate values in this key - - r = {} - r['handle'] = handle - r['name_in'] = {} - r['name_in']['len'] = 0 - r['name_in']['max_len'] = (keyinfo['max_valnamelen'] + 1) * 2 - r['name_in']['buffer'] = {} - r['name_in']['buffer']['max_len'] = keyinfo['max_valnamelen'] + 1 - r['name_in']['buffer']['offset'] = 0 - r['name_in']['buffer']['len'] = 0 - r['type'] = 0 - r['value_in'] = {} - r['value_in']['max_len'] = keyinfo['max_valbufsize'] - r['value_in']['offset'] = 0 - r['value_in']['len'] = 0 - r['value_len1'] = keyinfo['max_valbufsize'] - r['value_len2'] = 0 - - for i in range(0, keyinfo['num_values']): - - r['enum_index'] = i - - dcerpc.winreg_EnumValue(pipe, r) - - # Recursively test subkeys of this key - - r = {} - r['handle'] = handle - r['key_name_len'] = 0 - r['unknown'] = 0x0414 - r['in_name'] = {} - r['in_name']['unknown'] = 0x20a - r['in_name']['key_name'] = {} - r['in_name']['key_name']['name'] = None - r['class'] = {} - r['class']['name'] = None - r['last_changed_time'] = {} - r['last_changed_time']['low'] = 0 - r['last_changed_time']['high'] = 0 - - for i in range(0, keyinfo['num_subkeys']): - - r['enum_index'] = i - - subkey = dcerpc.winreg_EnumKey(pipe, r) - - s = {} - s['handle'] = handle - s['keyname'] = {} - s['keyname']['name'] = subkey['out_name']['name'] - s['unknown'] = 0 - s['access_mask'] = 0x02000000 - - result = dcerpc.winreg_OpenKey(pipe, s) - - test_Key(pipe, result['handle'], name + '/' + s['keyname']['name'], - depth + 1) - - test_CloseKey(pipe, result['handle']) - - # Enumerate values - -def runtests(binding, domain, username, password): - - print 'Testing WINREG pipe' - - pipe = dcerpc.pipe_connect(binding, - dcerpc.DCERPC_WINREG_UUID, dcerpc.DCERPC_WINREG_VERSION, - domain, username, password) - - handle = test_OpenHKLM(pipe) - - test_Key(pipe, handle, 'HKLM') -- cgit