2002-03-20 07:53:44 +03:00
/*
Unix SMB / CIFS implementation .
Python wrapper for winbind client functions .
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 0213 9 , USA .
*/
2002-03-20 06:29:03 +03:00
# include "includes.h"
# include "Python.h"
/*
* Exceptions raised by this module
*/
PyObject * winbind_error ; /* A winbind call returned WINBINDD_ERROR */
2002-03-20 07:53:44 +03:00
/* Prototypes from common.h */
NSS_STATUS winbindd_request ( int req_type ,
struct winbindd_request * request ,
struct winbindd_response * response ) ;
/*
* Name < - > SID conversion
*/
/* Convert a name to a sid */
static PyObject * winbind_name_to_sid ( PyObject * self , PyObject * args )
{
struct winbindd_request request ;
struct winbindd_response response ;
PyObject * result ;
char * name , * p ;
if ( ! PyArg_ParseTuple ( args , " s " , & name ) )
return NULL ;
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
/* FIXME: use winbind separator */
if ( ( p = strchr ( name , ' \\ ' ) ) ) {
* p = 0 ;
fstrcpy ( request . data . name . dom_name , name ) ;
fstrcpy ( request . data . name . name , p + 1 ) ;
} else {
fstrcpy ( request . data . name . dom_name , lp_workgroup ( ) ) ;
fstrcpy ( request . data . name . name , name ) ;
}
if ( winbindd_request ( WINBINDD_LOOKUPNAME , & request , & response )
! = NSS_STATUS_SUCCESS ) {
PyErr_SetString ( winbind_error , " lookup failed " ) ;
return NULL ;
}
result = PyString_FromString ( response . data . sid . sid ) ;
return result ;
}
/* Convert a sid to a name */
static PyObject * winbind_sid_to_name ( PyObject * self , PyObject * args )
{
struct winbindd_request request ;
struct winbindd_response response ;
PyObject * result ;
char * sid , * name ;
if ( ! PyArg_ParseTuple ( args , " s " , & sid ) )
return NULL ;
ZERO_STRUCT ( request ) ;
ZERO_STRUCT ( response ) ;
fstrcpy ( request . data . sid , sid ) ;
if ( winbindd_request ( WINBINDD_LOOKUPSID , & request , & response )
! = NSS_STATUS_SUCCESS ) {
PyErr_SetString ( winbind_error , " lookup failed " ) ;
return NULL ;
}
/* FIXME: use actual winbind separator */
asprintf ( & name , " %s%c%s " , response . data . name . dom_name ,
' \\ ' , response . data . name . name ) ;
result = PyString_FromString ( name ) ;
free ( name ) ;
return result ;
}
2002-03-20 09:27:41 +03:00
/*
* Enumerate users / groups
*/
/* Enumerate domain users */
static PyObject * winbind_enum_domain_users ( PyObject * self , PyObject * args )
{
struct winbindd_response response ;
PyObject * result ;
if ( ! PyArg_ParseTuple ( args , " " ) )
return NULL ;
ZERO_STRUCT ( response ) ;
if ( winbindd_request ( WINBINDD_LIST_USERS , NULL , & response )
! = NSS_STATUS_SUCCESS ) {
PyErr_SetString ( winbind_error , " lookup failed " ) ;
return NULL ;
}
result = PyList_New ( 0 ) ;
if ( response . extra_data ) {
char * extra_data = response . extra_data ;
fstring name ;
while ( next_token ( & extra_data , name , " , " , sizeof ( fstring ) ) )
PyList_Append ( result , PyString_FromString ( name ) ) ;
}
return result ;
}
/* Enumerate domain groups */
static PyObject * winbind_enum_domain_groups ( PyObject * self , PyObject * args )
{
struct winbindd_request request ;
struct winbindd_response response ;
PyObject * result = NULL ;
if ( ! PyArg_ParseTuple ( args , " " ) )
return NULL ;
ZERO_STRUCT ( response ) ;
if ( winbindd_request ( WINBINDD_LIST_GROUPS , NULL , & response )
! = NSS_STATUS_SUCCESS ) {
PyErr_SetString ( winbind_error , " lookup failed " ) ;
return NULL ;
}
result = PyList_New ( 0 ) ;
if ( response . extra_data ) {
char * extra_data = response . extra_data ;
fstring name ;
while ( next_token ( & extra_data , name , " , " , sizeof ( fstring ) ) )
PyList_Append ( result , PyString_FromString ( name ) ) ;
}
return result ;
}
2002-03-20 06:29:03 +03:00
/*
* Method dispatch table
*/
static PyMethodDef winbind_methods [ ] = {
2002-03-20 07:53:44 +03:00
/* Name <-> SID conversion */
{ " name_to_sid " , winbind_name_to_sid , METH_VARARGS ,
" Convert a name to a sid " } ,
{ " sid_to_name " , winbind_sid_to_name , METH_VARARGS ,
" Convert a sid to a name " } ,
2002-03-20 09:27:41 +03:00
/* Enumerate users/groups */
{ " enum_domain_users " , winbind_enum_domain_users , METH_VARARGS ,
" Enumerate domain users " } ,
{ " enum_domain_groups " , winbind_enum_domain_groups , METH_VARARGS ,
" Enumerate domain groups " } ,
2002-03-20 06:29:03 +03:00
{ NULL }
} ;
/*
* Module initialisation
*/
void initwinbind ( void )
{
PyObject * module , * dict ;
/* Initialise module */
module = Py_InitModule ( " winbind " , winbind_methods ) ;
dict = PyModule_GetDict ( module ) ;
winbind_error = PyErr_NewException ( " winbind.error " , NULL , NULL ) ;
PyDict_SetItemString ( dict , " error " , winbind_error ) ;
2002-03-20 09:27:41 +03:00
py_samba_init ( ) ;
2002-03-20 06:29:03 +03:00
}