2008-12-16 02:16:02 +03:00
/*
Unix SMB / CIFS implementation .
Samba utility functions
Copyright ( C ) Jelmer Vernooij < jelmer @ samba . org > 2008
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 < http : //www.gnu.org/licenses/>.
*/
# include "libcli/security/security.h"
2008-12-21 23:10:40 +03:00
static void PyType_AddMethods ( PyTypeObject * type , PyMethodDef * methods )
{
PyObject * dict ;
int i ;
if ( type - > tp_dict = = NULL )
type - > tp_dict = PyDict_New ( ) ;
dict = type - > tp_dict ;
for ( i = 0 ; methods [ i ] . ml_name ; i + + ) {
PyObject * descr = PyDescr_NewMethod ( type , & methods [ i ] ) ;
PyDict_SetItemString ( dict , methods [ i ] . ml_name ,
descr ) ;
}
}
2008-12-22 01:05:35 +03:00
static int py_dom_sid_cmp ( PyObject * self , PyObject * py_other )
2008-12-16 02:16:02 +03:00
{
struct dom_sid * this = py_talloc_get_ptr ( self ) , * other ;
2008-12-22 01:05:35 +03:00
other = py_talloc_get_ptr ( py_other ) ;
2008-12-16 02:16:02 +03:00
if ( other = = NULL )
2008-12-22 01:05:35 +03:00
return - 1 ;
2008-12-16 02:16:02 +03:00
2008-12-22 01:05:35 +03:00
return dom_sid_compare ( this , other ) ;
2008-12-16 02:16:02 +03:00
}
static PyObject * py_dom_sid_str ( PyObject * self )
{
struct dom_sid * this = py_talloc_get_ptr ( self ) ;
char * str = dom_sid_string ( NULL , this ) ;
PyObject * ret = PyString_FromString ( str ) ;
talloc_free ( str ) ;
return ret ;
}
static PyObject * py_dom_sid_repr ( PyObject * self )
{
struct dom_sid * this = py_talloc_get_ptr ( self ) ;
char * str = dom_sid_string ( NULL , this ) ;
PyObject * ret = PyString_FromFormat ( " dom_sid('%s') " , str ) ;
talloc_free ( str ) ;
return ret ;
}
2008-12-21 23:10:40 +03:00
static int py_dom_sid_init ( PyObject * self , PyObject * args , PyObject * kwargs )
2008-12-21 20:03:27 +03:00
{
2008-12-21 23:10:40 +03:00
char * str = NULL ;
struct dom_sid * sid = py_talloc_get_ptr ( self ) ;
const char * kwnames [ ] = { " str " , NULL } ;
2008-12-21 20:03:27 +03:00
2008-12-21 23:10:40 +03:00
if ( ! PyArg_ParseTupleAndKeywords ( args , kwargs , " |s " , discard_const_p ( char * , kwnames ) , & str ) )
return - 1 ;
2008-12-21 20:03:27 +03:00
2008-12-21 23:10:40 +03:00
if ( str ! = NULL & & ! dom_sid_parse ( str , sid ) ) {
PyErr_SetString ( PyExc_TypeError , " Unable to parse string " ) ;
return - 1 ;
}
return 0 ;
2008-12-21 20:03:27 +03:00
}
2008-12-21 23:10:40 +03:00
static void py_dom_sid_patch ( PyTypeObject * type )
{
type - > tp_init = py_dom_sid_init ;
type - > tp_str = py_dom_sid_str ;
type - > tp_repr = py_dom_sid_repr ;
2008-12-22 01:05:35 +03:00
type - > tp_compare = py_dom_sid_cmp ;
2008-12-21 23:10:40 +03:00
}
# define PY_DOM_SID_PATCH py_dom_sid_patch
2008-12-21 20:03:27 +03:00
static PyObject * py_descriptor_sacl_add ( PyObject * self , PyObject * args )
{
struct security_descriptor * desc = py_talloc_get_ptr ( self ) ;
NTSTATUS status ;
struct security_ace * ace ;
PyObject * py_ace ;
if ( ! PyArg_ParseTuple ( args , " O " , & py_ace ) )
return NULL ;
ace = py_talloc_get_ptr ( py_ace ) ;
status = security_descriptor_sacl_add ( desc , ace ) ;
PyErr_NTSTATUS_IS_ERR_RAISE ( status ) ;
return Py_None ;
}
static PyObject * py_descriptor_dacl_add ( PyObject * self , PyObject * args )
{
struct security_descriptor * desc = py_talloc_get_ptr ( self ) ;
NTSTATUS status ;
struct security_ace * ace ;
PyObject * py_ace ;
if ( ! PyArg_ParseTuple ( args , " O " , & py_ace ) )
return NULL ;
ace = py_talloc_get_ptr ( py_ace ) ;
status = security_descriptor_dacl_add ( desc , ace ) ;
PyErr_NTSTATUS_IS_ERR_RAISE ( status ) ;
return Py_None ;
}
static PyObject * py_descriptor_dacl_del ( PyObject * self , PyObject * args )
{
struct security_descriptor * desc = py_talloc_get_ptr ( self ) ;
NTSTATUS status ;
struct dom_sid * sid ;
PyObject * py_sid ;
if ( ! PyArg_ParseTuple ( args , " O " , & py_sid ) )
return NULL ;
sid = py_talloc_get_ptr ( py_sid ) ;
status = security_descriptor_dacl_del ( desc , sid ) ;
PyErr_NTSTATUS_IS_ERR_RAISE ( status ) ;
return Py_None ;
}
static PyObject * py_descriptor_sacl_del ( PyObject * self , PyObject * args )
{
struct security_descriptor * desc = py_talloc_get_ptr ( self ) ;
NTSTATUS status ;
struct dom_sid * sid ;
PyObject * py_sid ;
if ( ! PyArg_ParseTuple ( args , " O " , & py_sid ) )
return NULL ;
sid = py_talloc_get_ptr ( py_sid ) ;
status = security_descriptor_sacl_del ( desc , sid ) ;
PyErr_NTSTATUS_IS_ERR_RAISE ( status ) ;
return Py_None ;
}
static PyObject * py_descriptor_new ( PyTypeObject * self , PyObject * args , PyObject * kwargs )
{
return py_talloc_import ( self , security_descriptor_initialise ( NULL ) ) ;
}
2008-12-21 23:10:40 +03:00
static PyMethodDef py_descriptor_extra_methods [ ] = {
{ " sacl_add " , ( PyCFunction ) py_descriptor_sacl_add , METH_VARARGS ,
" S.sacl_add(ace) -> None \n "
" Add a security ace to this security descriptor " } ,
{ " dacl_add " , ( PyCFunction ) py_descriptor_dacl_add , METH_VARARGS ,
2008-12-21 20:03:27 +03:00
NULL } ,
2008-12-21 23:10:40 +03:00
{ " dacl_del " , ( PyCFunction ) py_descriptor_dacl_del , METH_VARARGS ,
NULL } ,
{ " sacl_del " , ( PyCFunction ) py_descriptor_sacl_del , METH_VARARGS ,
NULL } ,
{ NULL }
} ;
static void py_descriptor_patch ( PyTypeObject * type )
{
type - > tp_new = py_descriptor_new ;
PyType_AddMethods ( type , py_descriptor_extra_methods ) ;
}
# define PY_DESCRIPTOR_PATCH py_descriptor_patch
2008-12-21 20:03:27 +03:00
static PyObject * py_token_is_sid ( PyObject * self , PyObject * args )
{
PyObject * py_sid ;
struct dom_sid * sid ;
struct security_token * token = py_talloc_get_ptr ( self ) ;
if ( ! PyArg_ParseTuple ( args , " O " , & py_sid ) )
return NULL ;
sid = py_talloc_get_ptr ( py_sid ) ;
return PyBool_FromLong ( security_token_is_sid ( token , sid ) ) ;
}
static PyObject * py_token_has_sid ( PyObject * self , PyObject * args )
{
PyObject * py_sid ;
struct dom_sid * sid ;
struct security_token * token = py_talloc_get_ptr ( self ) ;
if ( ! PyArg_ParseTuple ( args , " O " , & py_sid ) )
return NULL ;
sid = py_talloc_get_ptr ( py_sid ) ;
return PyBool_FromLong ( security_token_has_sid ( token , sid ) ) ;
}
static PyObject * py_token_is_anonymous ( PyObject * self )
{
struct security_token * token = py_talloc_get_ptr ( self ) ;
return PyBool_FromLong ( security_token_is_anonymous ( token ) ) ;
}
static PyObject * py_token_is_system ( PyObject * self )
{
struct security_token * token = py_talloc_get_ptr ( self ) ;
return PyBool_FromLong ( security_token_is_system ( token ) ) ;
}
static PyObject * py_token_has_builtin_administrators ( PyObject * self )
{
struct security_token * token = py_talloc_get_ptr ( self ) ;
return PyBool_FromLong ( security_token_has_builtin_administrators ( token ) ) ;
}
static PyObject * py_token_has_nt_authenticated_users ( PyObject * self )
{
struct security_token * token = py_talloc_get_ptr ( self ) ;
return PyBool_FromLong ( security_token_has_nt_authenticated_users ( token ) ) ;
}
static PyObject * py_token_has_privilege ( PyObject * self , PyObject * args )
{
int priv ;
struct security_token * token = py_talloc_get_ptr ( self ) ;
if ( ! PyArg_ParseTuple ( args , " i " , & priv ) )
return NULL ;
return PyBool_FromLong ( security_token_has_privilege ( token , priv ) ) ;
}
static PyObject * py_token_set_privilege ( PyObject * self , PyObject * args )
{
int priv ;
struct security_token * token = py_talloc_get_ptr ( self ) ;
if ( ! PyArg_ParseTuple ( args , " i " , & priv ) )
return NULL ;
security_token_set_privilege ( token , priv ) ;
return Py_None ;
}
static PyObject * py_token_new ( PyTypeObject * self , PyObject * args , PyObject * kwargs )
{
return py_talloc_import ( self , security_token_initialise ( NULL ) ) ;
}
2008-12-21 23:10:40 +03:00
static PyMethodDef py_token_extra_methods [ ] = {
{ " is_sid " , ( PyCFunction ) py_token_is_sid , METH_VARARGS ,
" S.is_sid(sid) -> bool \n "
" Check whether this token is of the specified SID. " } ,
{ " has_sid " , ( PyCFunction ) py_token_has_sid , METH_VARARGS ,
NULL } ,
{ " is_anonymous " , ( PyCFunction ) py_token_is_anonymous , METH_NOARGS ,
" S.is_anonymus() -> bool \n "
" Check whether this is an anonymous token. " } ,
{ " is_system " , ( PyCFunction ) py_token_is_system , METH_NOARGS ,
NULL } ,
{ " has_builtin_administrators " , ( PyCFunction ) py_token_has_builtin_administrators , METH_NOARGS ,
NULL } ,
{ " has_nt_authenticated_users " , ( PyCFunction ) py_token_has_nt_authenticated_users , METH_NOARGS ,
NULL } ,
{ " has_privilege " , ( PyCFunction ) py_token_has_privilege , METH_VARARGS ,
NULL } ,
{ " set_privilege " , ( PyCFunction ) py_token_set_privilege , METH_VARARGS ,
2008-12-21 20:03:27 +03:00
NULL } ,
2008-12-21 23:10:40 +03:00
{ NULL }
} ;
# define PY_TOKEN_PATCH py_token_patch
static void py_token_patch ( PyTypeObject * type )
{
type - > tp_new = py_token_new ;
PyType_AddMethods ( type , py_token_extra_methods ) ;
}
2008-12-21 20:25:59 +03:00
static PyObject * py_privilege_name ( PyObject * self , PyObject * args )
{
int priv ;
if ( ! PyArg_ParseTuple ( args , " i " , & priv ) )
return NULL ;
return PyString_FromString ( sec_privilege_name ( priv ) ) ;
}
static PyObject * py_privilege_id ( PyObject * self , PyObject * args )
{
char * name ;
if ( ! PyArg_ParseTuple ( args , " s " , & name ) )
return NULL ;
return PyInt_FromLong ( sec_privilege_id ( name ) ) ;
}
static PyObject * py_random_sid ( PyObject * self )
{
struct dom_sid * sid ;
PyObject * ret ;
char * str = talloc_asprintf ( NULL , " S-1-5-21-%u-%u-%u " ,
( unsigned ) generate_random ( ) ,
( unsigned ) generate_random ( ) ,
( unsigned ) generate_random ( ) ) ;
sid = dom_sid_parse_talloc ( NULL , str ) ;
talloc_free ( str ) ;
2008-12-21 20:46:59 +03:00
ret = py_talloc_import ( & dom_sid_Type , sid ) ;
2008-12-21 20:25:59 +03:00
talloc_free ( sid ) ;
return ret ;
}
2008-12-21 20:46:59 +03:00
2008-12-21 23:10:40 +03:00
static PyMethodDef py_mod_security_extra_methods [ ] = {
{ " random_sid " , ( PyCFunction ) py_random_sid , METH_NOARGS , NULL } ,
{ " privilege_id " , ( PyCFunction ) py_privilege_id , METH_VARARGS , NULL } ,
2008-12-21 20:46:59 +03:00
{ " privilege_name " , ( PyCFunction ) py_privilege_name , METH_VARARGS , NULL } ,
2008-12-21 23:10:40 +03:00
{ NULL }
} ;
static void py_mod_security_patch ( PyObject * m )
{
int i ;
for ( i = 0 ; py_mod_security_extra_methods [ i ] . ml_name ; i + + ) {
PyObject * descr = PyCFunction_New ( & py_mod_security_extra_methods [ i ] , NULL ) ;
PyModule_AddObject ( m , py_mod_security_extra_methods [ i ] . ml_name ,
descr ) ;
}
}
# define PY_MOD_SECURITY_PATCH py_mod_security_patch