diff options
| author | Tim Potter <tpot@samba.org> | 2002-04-14 09:00:13 +0000 | 
|---|---|---|
| committer | Tim Potter <tpot@samba.org> | 2002-04-14 09:00:13 +0000 | 
| commit | f143cb6144a564f0248770cd552e440dbcddb056 (patch) | |
| tree | e688dc82c4c58b8683768c3c133309cd2d97b316 | |
| parent | a99e810bda20b2a95ae5d5204a6d36d6d22309d6 (diff) | |
| download | samba-f143cb6144a564f0248770cd552e440dbcddb056.tar.gz samba-f143cb6144a564f0248770cd552e440dbcddb056.tar.bz2 samba-f143cb6144a564f0248770cd552e440dbcddb056.zip  | |
Added copyright.
Added lookup_names() and lookup_sids() functions.
(This used to be commit 2d2c925014374605b29e052729e959c0fd690586)
| -rw-r--r-- | source3/python/py_lsa.c | 202 | 
1 files changed, 160 insertions, 42 deletions
diff --git a/source3/python/py_lsa.c b/source3/python/py_lsa.c index 5e805a91ad..1c84af5ea0 100644 --- a/source3/python/py_lsa.c +++ b/source3/python/py_lsa.c @@ -1,29 +1,27 @@ +/*  +   Python wrappers for DCERPC/SMB client routines. + +   Copyright (C) Tim Potter, 2002 +    +   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 "Python.h"  #include "python/py_lsa.h" -static void py_policy_hnd_dealloc(PyObject* self) -{ -	PyObject_Del(self); -} - -PyTypeObject lsa_policy_hnd_type = { -	PyObject_HEAD_INIT(NULL) -	0, -	"LSA Policy Handle", -	sizeof(lsa_policy_hnd_object), -	0, -	py_policy_hnd_dealloc, /*tp_dealloc*/ -	0,          /*tp_print*/ -	0,          /*tp_getattr*/ -	0,          /*tp_setattr*/ -	0,          /*tp_compare*/ -	0,          /*tp_repr*/ -	0,          /*tp_as_number*/ -	0,          /*tp_as_sequence*/ -	0,          /*tp_as_mapping*/ -	0,          /*tp_hash */ -};  PyObject *new_lsa_policy_hnd_object(struct cli_state *cli, TALLOC_CTX *mem_ctx,  				    POLICY_HND *pol) @@ -54,7 +52,7 @@ PyObject *lsa_ntstatus;		/* This exception is raised when a RPC call   * Open/close lsa handles   */ -static PyObject *lsa_openpolicy(PyObject *self, PyObject *args,  +static PyObject *lsa_open_policy(PyObject *self, PyObject *args,   				PyObject *kw)   {  	static char *kwlist[] = { "servername", "creds", "access", NULL }; @@ -114,7 +112,7 @@ static PyObject *lsa_close(PyObject *self, PyObject *args, PyObject *kw)  	result = cli_lsa_close(hnd->cli, hnd->mem_ctx, &hnd->pol); -	/* Cleanup samba stuf */ +	/* Cleanup samba stuff */  	cli_shutdown(hnd->cli);  	talloc_destroy(hnd->mem_ctx); @@ -125,39 +123,156 @@ static PyObject *lsa_close(PyObject *self, PyObject *args, PyObject *kw)  	return Py_None;	  } -static PyObject *lsa_lookupnames(PyObject *self, PyObject *args,  -				 PyObject *kw)  +static PyObject *lsa_lookup_names(PyObject *self, PyObject *args)  { -	return NULL; +	PyObject *py_names, *result; +	NTSTATUS ntstatus; +	lsa_policy_hnd_object *hnd = (lsa_policy_hnd_object *)self; +	int num_names, i; +	const char **names; +	DOM_SID *sids; +	uint32 *name_types; + +	if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &py_names)) +		return NULL; + +	/* Convert dictionary to char ** array */ + +	num_names = PyList_Size(py_names); +	names = (const char **)talloc( +		hnd->mem_ctx, num_names * sizeof(char *)); + +	for (i = 0; i < num_names; i++) { +		PyObject *obj = PyList_GetItem(py_names, i); + +		names[i] = talloc_strdup(hnd->mem_ctx, PyString_AsString(obj)); +	} + +	ntstatus = cli_lsa_lookup_names(hnd->cli, hnd->mem_ctx, &hnd->pol, +					num_names, names, &sids, &name_types); + +	if (!NT_STATUS_IS_OK(ntstatus) && NT_STATUS_V(ntstatus) != 0x107) { +		PyErr_SetObject(lsa_ntstatus, py_ntstatus_tuple(ntstatus)); +		return NULL; +	} + +	result = PyList_New(num_names); + +	for (i = 0; i < num_names; i++) { +		PyObject *sid_obj, *obj; + +		py_from_SID(&sid_obj, &sids[i]); + +		obj = Py_BuildValue("(Oi)", sid_obj, name_types[i]); + +		PyList_SetItem(result, i, obj); +	} +	 +	return result;  } -static PyObject *lsa_lookupsids(PyObject *self, PyObject *args,  -				PyObject *kw)  +static PyObject *lsa_lookup_sids(PyObject *self, PyObject *args,  +				 PyObject *kw)   { -	return NULL; +	PyObject *py_sids, *result; +	NTSTATUS ntstatus; +	int num_sids, i; +	char **domains, **names; +	uint32 *types; +	lsa_policy_hnd_object *hnd = (lsa_policy_hnd_object *)self; +	DOM_SID *sids; + +	if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &py_sids)) +		return NULL; + +	/* Convert dictionary to char ** array */ + +	num_sids = PyList_Size(py_sids); +	sids = (DOM_SID *)talloc(hnd->mem_ctx, num_sids * sizeof(DOM_SID)); + +	memset(sids, 0, num_sids * sizeof(DOM_SID)); + +	for (i = 0; i < num_sids; i++) { +		PyObject *obj = PyList_GetItem(py_sids, i); + +		string_to_sid(&sids[i], PyString_AsString(obj)); +	} + +	ntstatus = cli_lsa_lookup_sids(hnd->cli, hnd->mem_ctx, &hnd->pol, +				       num_sids, sids, &domains, &names,  +				       &types); + +	if (!NT_STATUS_IS_OK(ntstatus)) { +		PyErr_SetObject(lsa_ntstatus, py_ntstatus_tuple(ntstatus)); +		return NULL; +	} + +	result = PyList_New(num_sids); + +	for (i = 0; i < num_sids; i++) { +		PyObject *name_obj, *obj; + +		obj = Py_BuildValue("{sssssi}", "username", names[i], +				    "domain", domains[i], "name_type",  +				    types[i]); + +		PyList_SetItem(result, i, obj); +	} +	 +	return result;  }  /* - * Method dispatch table + * Method dispatch tables   */ +static PyMethodDef lsa_hnd_methods[] = { + +	{ "lookup_sids", lsa_lookup_sids, METH_VARARGS | METH_KEYWORDS, +	  "Convert sids to names." }, + +	{ "lookup_names", lsa_lookup_names, METH_VARARGS | METH_KEYWORDS, +	  "Convert names to sids." }, + +	{ NULL } +}; + +static void py_lsa_policy_hnd_dealloc(PyObject* self) +{ +	PyObject_Del(self); +} + +static PyObject *py_lsa_policy_hnd_getattr(PyObject *self, char *attrname) +{ +	return Py_FindMethod(lsa_hnd_methods, self, attrname); +} + +PyTypeObject lsa_policy_hnd_type = { +	PyObject_HEAD_INIT(NULL) +	0, +	"LSA Policy Handle", +	sizeof(lsa_policy_hnd_object), +	0, +	py_lsa_policy_hnd_dealloc, /*tp_dealloc*/ +	0,          /*tp_print*/ +	py_lsa_policy_hnd_getattr,          /*tp_getattr*/ +	0,          /*tp_setattr*/ +	0,          /*tp_compare*/ +	0,          /*tp_repr*/ +	0,          /*tp_as_number*/ +	0,          /*tp_as_sequence*/ +	0,          /*tp_as_mapping*/ +	0,          /*tp_hash */ +}; +  static PyMethodDef lsa_methods[] = {  	/* Open/close lsa handles */ -	{ "openpolicy", lsa_openpolicy, METH_VARARGS | METH_KEYWORDS,  +	{ "open_policy", lsa_open_policy, METH_VARARGS | METH_KEYWORDS,   	  "Open a policy handle" }, -	{ "close", lsa_close, METH_VARARGS,  -	  "Close a policy handle" }, - -	/* Name <-> SID resolution */ - -	{ "lookupnames", lsa_lookupnames, METH_VARARGS | METH_KEYWORDS, -	  "Look up SIDS from a list of names" }, - -	{ "lookupsids", lsa_lookupsids, METH_VARARGS | METH_KEYWORDS, -	  "Look up names from a list of SIDS" }, +	{ "close", lsa_close, METH_VARARGS, "Close a policy handle" },  	{ NULL }  }; @@ -192,4 +307,7 @@ void initlsa(void)  	/* Do samba initialisation */  	py_samba_init(); + +	setup_logging("lsa", True); +	DEBUGLEVEL = 10;  }  | 
