2008-12-16 21:51:01 +01: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/>.
*/
2009-10-23 16:23:01 +11:00
# include <Python.h>
2008-12-16 21:51:01 +01:00
# include "includes.h"
2009-02-05 15:58:40 +01:00
# include <tevent.h>
2008-12-18 16:49:33 +00:00
# include "libcli/util/pyerrors.h"
# include "lib/registry/registry.h"
# include "scripting/python/modules.h" /* for py_iconv_convenience() */
# include <pytalloc.h>
2009-02-05 15:58:40 +01:00
# include "auth/credentials/pycredentials.h"
2008-12-22 04:38:57 +01:00
# include "param/pyparam.h"
2008-12-18 16:49:33 +00:00
PyAPI_DATA ( PyTypeObject ) PyRegistryKey ;
PyAPI_DATA ( PyTypeObject ) PyRegistry ;
PyAPI_DATA ( PyTypeObject ) PyHiveKey ;
2008-12-16 21:51:01 +01:00
2009-02-05 15:58:40 +01:00
/*#define PyRegistryKey_AsRegistryKey(obj) py_talloc_get_type(obj, struct registry_key)*/
2009-02-06 12:10:23 +01:00
# define PyRegistry_AsRegistryContext(obj) ((struct registry_context *)py_talloc_get_ptr(obj))
# define PyHiveKey_AsHiveKey(obj) ((struct hive_key*)py_talloc_get_ptr(obj))
2009-02-05 15:58:40 +01:00
2008-12-16 21:51:01 +01:00
static PyObject * py_get_predefined_key_by_name ( PyObject * self , PyObject * args )
{
2008-12-18 16:49:33 +00:00
char * name ;
WERROR result ;
2009-02-05 15:58:40 +01:00
struct registry_context * ctx = PyRegistry_AsRegistryContext ( self ) ;
2008-12-18 16:49:33 +00:00
struct registry_key * key ;
if ( ! PyArg_ParseTuple ( args , " s " , & name ) )
return NULL ;
result = reg_get_predefined_key_by_name ( ctx , name , & key ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-07-30 20:04:42 +02:00
return py_talloc_steal ( & PyRegistryKey , key ) ;
2008-12-16 21:51:01 +01:00
}
static PyObject * py_key_del_abs ( PyObject * self , PyObject * args )
{
2008-12-18 16:49:33 +00:00
char * path ;
WERROR result ;
2009-02-05 15:58:40 +01:00
struct registry_context * ctx = PyRegistry_AsRegistryContext ( self ) ;
2008-12-18 16:49:33 +00:00
if ( ! PyArg_ParseTuple ( args , " s " , & path ) )
return NULL ;
result = reg_key_del_abs ( ctx , path ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-01-06 04:13:57 +01:00
Py_RETURN_NONE ;
2008-12-18 16:49:33 +00:00
}
static PyObject * py_get_predefined_key ( PyObject * self , PyObject * args )
{
uint32_t hkey ;
2009-02-05 15:58:40 +01:00
struct registry_context * ctx = PyRegistry_AsRegistryContext ( self ) ;
2008-12-18 16:49:33 +00:00
WERROR result ;
struct registry_key * key ;
if ( ! PyArg_ParseTuple ( args , " I " , & hkey ) )
return NULL ;
result = reg_get_predefined_key ( ctx , hkey , & key ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-07-30 20:04:42 +02:00
return py_talloc_steal ( & PyRegistryKey , key ) ;
2008-12-18 16:49:33 +00:00
}
static PyObject * py_diff_apply ( PyObject * self , PyObject * args )
{
char * filename ;
WERROR result ;
2009-02-05 15:58:40 +01:00
struct registry_context * ctx = PyRegistry_AsRegistryContext ( self ) ;
2008-12-18 16:49:33 +00:00
if ( ! PyArg_ParseTuple ( args , " s " , & filename ) )
return NULL ;
result = reg_diff_apply ( ctx , py_iconv_convenience ( NULL ) , filename ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-01-06 04:13:57 +01:00
Py_RETURN_NONE ;
2008-12-18 16:49:33 +00:00
}
static PyObject * py_mount_hive ( PyObject * self , PyObject * args )
{
2009-02-05 15:58:40 +01:00
struct registry_context * ctx = PyRegistry_AsRegistryContext ( self ) ;
2008-12-18 16:49:33 +00:00
uint32_t hkey ;
PyObject * py_hivekey , * py_elements = Py_None ;
const char * * elements ;
WERROR result ;
if ( ! PyArg_ParseTuple ( args , " OI|O " , & py_hivekey , & hkey , & py_elements ) )
return NULL ;
if ( ! PyList_Check ( py_elements ) & & py_elements ! = Py_None ) {
PyErr_SetString ( PyExc_TypeError , " Expected list of elements " ) ;
return NULL ;
}
if ( py_elements = = Py_None ) {
elements = NULL ;
} else {
int i ;
elements = talloc_array ( NULL , const char * , PyList_Size ( py_elements ) ) ;
for ( i = 0 ; i < PyList_Size ( py_elements ) ; i + + )
elements [ i ] = PyString_AsString ( PyList_GetItem ( py_elements , i ) ) ;
}
SMB_ASSERT ( ctx ! = NULL ) ;
2009-02-05 15:58:40 +01:00
result = reg_mount_hive ( ctx , PyHiveKey_AsHiveKey ( py_hivekey ) , hkey , elements ) ;
2008-12-18 16:49:33 +00:00
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-01-06 04:13:57 +01:00
Py_RETURN_NONE ;
2008-12-18 16:49:33 +00:00
}
static PyObject * registry_new ( PyTypeObject * type , PyObject * args , PyObject * kwargs )
{
WERROR result ;
struct registry_context * ctx ;
result = reg_open_local ( NULL , & ctx ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-07-30 20:04:42 +02:00
return py_talloc_steal ( & PyRegistry , ctx ) ;
2008-12-16 21:51:01 +01:00
}
static PyMethodDef registry_methods [ ] = {
{ " get_predefined_key_by_name " , py_get_predefined_key_by_name , METH_VARARGS ,
" S.get_predefined_key_by_name(name) -> key \n "
" Find a predefined key by name " } ,
{ " key_del_abs " , py_key_del_abs , METH_VARARGS , " S.key_del_abs(name) -> None \n "
" Delete a key by absolute path. " } ,
{ " get_predefined_key " , py_get_predefined_key , METH_VARARGS , " S.get_predefined_key(hkey_id) -> key \n "
" Find a predefined key by id " } ,
{ " diff_apply " , py_diff_apply , METH_VARARGS , " S.diff_apply(filename) -> None \n "
" Apply the diff from the specified file " } ,
{ " mount_hive " , py_mount_hive , METH_VARARGS , " S.mount_hive(key, key_id, elements=None) -> None \n "
" Mount the specified key at the specified path. " } ,
{ NULL }
} ;
PyTypeObject PyRegistry = {
. tp_name = " Registry " ,
. tp_methods = registry_methods ,
. tp_new = registry_new ,
2008-12-18 16:49:33 +00:00
. tp_basicsize = sizeof ( py_talloc_Object ) ,
. tp_dealloc = py_talloc_dealloc ,
2008-12-21 03:08:14 +01:00
. tp_flags = Py_TPFLAGS_DEFAULT ,
2008-12-16 21:51:01 +01:00
} ;
2008-12-18 16:49:33 +00:00
static PyObject * py_hive_key_del ( PyObject * self , PyObject * args )
{
char * name ;
2009-02-05 15:58:40 +01:00
struct hive_key * key = PyHiveKey_AsHiveKey ( self ) ;
2008-12-18 16:49:33 +00:00
WERROR result ;
if ( ! PyArg_ParseTuple ( args , " s " , & name ) )
return NULL ;
result = hive_key_del ( key , name ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-01-06 04:13:57 +01:00
Py_RETURN_NONE ;
2008-12-18 16:49:33 +00:00
}
static PyObject * py_hive_key_flush ( PyObject * self )
{
WERROR result ;
2009-02-05 15:58:40 +01:00
struct hive_key * key = PyHiveKey_AsHiveKey ( self ) ;
2008-12-18 16:49:33 +00:00
result = hive_key_flush ( key ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-01-06 04:13:57 +01:00
Py_RETURN_NONE ;
2008-12-18 16:49:33 +00:00
}
static PyObject * py_hive_key_del_value ( PyObject * self , PyObject * args )
{
char * name ;
WERROR result ;
2009-02-05 15:58:40 +01:00
struct hive_key * key = PyHiveKey_AsHiveKey ( self ) ;
2008-12-18 16:49:33 +00:00
if ( ! PyArg_ParseTuple ( args , " s " , & name ) )
return NULL ;
result = hive_key_del_value ( key , name ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-01-06 04:13:57 +01:00
Py_RETURN_NONE ;
2008-12-18 16:49:33 +00:00
}
static PyObject * py_hive_key_set_value ( PyObject * self , PyObject * args )
{
char * name ;
uint32_t type ;
DATA_BLOB value ;
WERROR result ;
2009-02-05 15:58:40 +01:00
struct hive_key * key = PyHiveKey_AsHiveKey ( self ) ;
2008-12-18 16:49:33 +00:00
if ( ! PyArg_ParseTuple ( args , " siz# " , & name , & type , & value . data , & value . length ) )
return NULL ;
if ( value . data ! = NULL )
result = hive_key_set_value ( key , name , type , value ) ;
else
result = hive_key_del_value ( key , name ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-01-06 04:13:57 +01:00
Py_RETURN_NONE ;
2008-12-18 16:49:33 +00:00
}
2008-12-16 21:51:01 +01:00
static PyMethodDef hive_key_methods [ ] = {
2008-12-18 16:49:33 +00:00
{ " del " , py_hive_key_del , METH_VARARGS , " S.del(name) -> None \n "
2008-12-16 21:51:01 +01:00
" Delete a subkey " } ,
2008-12-18 16:49:33 +00:00
{ " flush " , ( PyCFunction ) py_hive_key_flush , METH_NOARGS , " S.flush() -> None \n "
2008-12-16 21:51:01 +01:00
" Flush this key to disk " } ,
2008-12-18 16:49:33 +00:00
{ " del_value " , py_hive_key_del_value , METH_VARARGS , " S.del_value(name) -> None \n "
2008-12-16 21:51:01 +01:00
" Delete a value " } ,
2008-12-18 16:49:33 +00:00
{ " set_value " , py_hive_key_set_value , METH_VARARGS , " S.set_value(name, type, data) -> None \n "
2008-12-16 21:51:01 +01:00
" Set a value " } ,
{ NULL }
} ;
static PyObject * hive_open ( PyTypeObject * type , PyObject * args , PyObject * kwargs )
{
/* reg_open_hive */
2009-01-06 04:13:57 +01:00
Py_RETURN_NONE ;
2008-12-16 21:51:01 +01:00
}
PyTypeObject PyHiveKey = {
. tp_name = " HiveKey " ,
. tp_methods = hive_key_methods ,
. tp_new = hive_open ,
2008-12-18 16:49:33 +00:00
. tp_basicsize = sizeof ( py_talloc_Object ) ,
. tp_dealloc = py_talloc_dealloc ,
2008-12-21 03:08:14 +01:00
. tp_flags = Py_TPFLAGS_DEFAULT ,
2008-12-18 16:49:33 +00:00
} ;
PyTypeObject PyRegistryKey = {
. tp_name = " RegistryKey " ,
. tp_basicsize = sizeof ( py_talloc_Object ) ,
. tp_dealloc = py_talloc_dealloc ,
2008-12-21 03:08:14 +01:00
. tp_flags = Py_TPFLAGS_DEFAULT ,
2008-12-16 21:51:01 +01:00
} ;
static PyObject * py_open_samba ( PyObject * self , PyObject * args , PyObject * kwargs )
{
2008-12-18 16:49:33 +00:00
const char * kwnames [ ] = { " lp_ctx " , " session_info " , NULL } ;
2008-12-16 21:51:01 +01:00
struct registry_context * reg_ctx ;
2008-12-18 16:49:33 +00:00
WERROR result ;
struct loadparm_context * lp_ctx ;
2008-12-16 21:51:01 +01:00
PyObject * py_lp_ctx , * py_session_info , * py_credentials ;
2008-12-18 16:49:33 +00:00
struct auth_session_info * session_info ;
struct cli_credentials * credentials ;
if ( ! PyArg_ParseTupleAndKeywords ( args , kwargs , " |OOO " , discard_const_p ( char * , kwnames ) ,
2008-12-16 21:51:01 +01:00
& py_lp_ctx , & py_session_info , & py_credentials ) )
return NULL ;
2008-12-18 16:49:33 +00:00
lp_ctx = lp_from_py_object ( py_lp_ctx ) ;
if ( lp_ctx = = NULL ) {
PyErr_SetString ( PyExc_TypeError , " Expected loadparm context " ) ;
return NULL ;
}
credentials = cli_credentials_from_py_object ( py_credentials ) ;
if ( credentials = = NULL ) {
PyErr_SetString ( PyExc_TypeError , " Expected credentials " ) ;
return NULL ;
}
2008-12-16 21:51:01 +01:00
2008-12-18 16:49:33 +00:00
session_info = NULL ; /* FIXME */
result = reg_open_samba ( NULL , & reg_ctx , NULL ,
2008-12-16 21:51:01 +01:00
lp_ctx , session_info , credentials ) ;
if ( ! W_ERROR_IS_OK ( result ) ) {
PyErr_SetWERROR ( result ) ;
return NULL ;
}
2009-07-30 20:04:42 +02:00
return py_talloc_steal ( & PyRegistry , reg_ctx ) ;
2008-12-18 16:49:33 +00:00
}
2008-12-16 21:51:01 +01:00
2008-12-18 16:49:33 +00:00
static PyObject * py_open_directory ( PyObject * self , PyObject * args )
{
char * location ;
WERROR result ;
struct hive_key * key ;
if ( ! PyArg_ParseTuple ( args , " s " , & location ) )
return NULL ;
result = reg_open_directory ( NULL , location , & key ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-07-30 20:04:42 +02:00
return py_talloc_steal ( & PyHiveKey , key ) ;
2008-12-18 16:49:33 +00:00
}
static PyObject * py_create_directory ( PyObject * self , PyObject * args )
{
char * location ;
WERROR result ;
struct hive_key * key ;
if ( ! PyArg_ParseTuple ( args , " s " , & location ) )
return NULL ;
result = reg_create_directory ( NULL , location , & key ) ;
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-07-30 20:04:42 +02:00
return py_talloc_steal ( & PyHiveKey , key ) ;
2008-12-18 16:49:33 +00:00
}
static PyObject * py_open_ldb_file ( PyObject * self , PyObject * args , PyObject * kwargs )
{
const char * kwnames [ ] = { " location " , " session_info " , " credentials " , " lp_ctx " , NULL } ;
PyObject * py_session_info = Py_None , * py_credentials = Py_None , * py_lp_ctx = Py_None ;
WERROR result ;
char * location ;
struct loadparm_context * lp_ctx ;
struct cli_credentials * credentials ;
struct hive_key * key ;
struct auth_session_info * session_info ;
if ( ! PyArg_ParseTupleAndKeywords ( args , kwargs , " s|OOO " ,
discard_const_p ( char * , kwnames ) ,
& location ,
& py_session_info , & py_credentials ,
& py_lp_ctx ) )
return NULL ;
lp_ctx = lp_from_py_object ( py_lp_ctx ) ;
if ( lp_ctx = = NULL ) {
PyErr_SetString ( PyExc_TypeError , " Expected loadparm context " ) ;
return NULL ;
}
credentials = cli_credentials_from_py_object ( py_credentials ) ;
if ( credentials = = NULL ) {
PyErr_SetString ( PyExc_TypeError , " Expected credentials " ) ;
return NULL ;
}
session_info = NULL ; /* FIXME */
result = reg_open_ldb_file ( NULL , location , session_info , credentials ,
2009-01-02 16:06:31 +01:00
tevent_context_init ( NULL ) , lp_ctx , & key ) ;
2008-12-18 16:49:33 +00:00
PyErr_WERROR_IS_ERR_RAISE ( result ) ;
2009-07-30 20:04:42 +02:00
return py_talloc_steal ( & PyHiveKey , key ) ;
2008-12-18 16:49:33 +00:00
}
static PyObject * py_str_regtype ( PyObject * self , PyObject * args )
{
int regtype ;
if ( ! PyArg_ParseTuple ( args , " i " , & regtype ) )
return NULL ;
return PyString_FromString ( str_regtype ( regtype ) ) ;
}
static PyObject * py_get_predef_name ( PyObject * self , PyObject * args )
{
uint32_t hkey ;
const char * str ;
if ( ! PyArg_ParseTuple ( args , " I " , & hkey ) )
return NULL ;
str = reg_get_predef_name ( hkey ) ;
if ( str = = NULL )
2009-01-06 04:13:57 +01:00
Py_RETURN_NONE ;
2008-12-18 16:49:33 +00:00
return PyString_FromString ( str ) ;
2008-12-16 21:51:01 +01:00
}
static PyMethodDef py_registry_methods [ ] = {
2008-12-18 16:49:33 +00:00
{ " open_samba " , ( PyCFunction ) py_open_samba , METH_VARARGS | METH_KEYWORDS , " open_samba() -> reg " } ,
2008-12-16 21:51:01 +01:00
{ " open_directory " , py_open_directory , METH_VARARGS , " open_dir(location) -> key " } ,
{ " create_directory " , py_create_directory , METH_VARARGS , " create_dir(location) -> key " } ,
2008-12-18 16:49:33 +00:00
{ " open_ldb " , ( PyCFunction ) py_open_ldb_file , METH_VARARGS | METH_KEYWORDS , " open_ldb(location, session_info=None, credentials=None, loadparm_context=None) -> key " } ,
2008-12-16 21:51:01 +01:00
{ " str_regtype " , py_str_regtype , METH_VARARGS , " str_regtype(int) -> str " } ,
{ " get_predef_name " , py_get_predef_name , METH_VARARGS , " get_predef_name(hkey) -> str " } ,
{ NULL }
} ;
void initregistry ( void )
{
2008-12-18 16:49:33 +00:00
PyObject * m ;
if ( PyType_Ready ( & PyHiveKey ) < 0 )
return ;
2008-12-16 21:51:01 +01:00
2008-12-18 16:49:33 +00:00
if ( PyType_Ready ( & PyRegistry ) < 0 )
return ;
if ( PyType_Ready ( & PyRegistryKey ) < 0 )
return ;
m = Py_InitModule3 ( " registry " , py_registry_methods , " Registry " ) ;
2008-12-16 21:51:01 +01:00
if ( m = = NULL )
return ;
PyModule_AddObject ( m , " HKEY_CLASSES_ROOT " , PyInt_FromLong ( HKEY_CLASSES_ROOT ) ) ;
PyModule_AddObject ( m , " HKEY_CURRENT_USER " , PyInt_FromLong ( HKEY_CURRENT_USER ) ) ;
PyModule_AddObject ( m , " HKEY_LOCAL_MACHINE " , PyInt_FromLong ( HKEY_LOCAL_MACHINE ) ) ;
PyModule_AddObject ( m , " HKEY_USERS " , PyInt_FromLong ( HKEY_USERS ) ) ;
PyModule_AddObject ( m , " HKEY_PERFORMANCE_DATA " , PyInt_FromLong ( HKEY_PERFORMANCE_DATA ) ) ;
PyModule_AddObject ( m , " HKEY_CURRENT_CONFIG " , PyInt_FromLong ( HKEY_CURRENT_CONFIG ) ) ;
PyModule_AddObject ( m , " HKEY_DYN_DATA " , PyInt_FromLong ( HKEY_DYN_DATA ) ) ;
PyModule_AddObject ( m , " HKEY_PERFORMANCE_TEXT " , PyInt_FromLong ( HKEY_PERFORMANCE_TEXT ) ) ;
PyModule_AddObject ( m , " HKEY_PERFORMANCE_NLSTEXT " , PyInt_FromLong ( HKEY_PERFORMANCE_NLSTEXT ) ) ;
2008-12-18 16:49:33 +00:00
Py_INCREF ( & PyRegistry ) ;
PyModule_AddObject ( m , " Registry " , ( PyObject * ) & PyRegistry ) ;
Py_INCREF ( & PyHiveKey ) ;
PyModule_AddObject ( m , " HiveKey " , ( PyObject * ) & PyHiveKey ) ;
Py_INCREF ( & PyRegistryKey ) ;
PyModule_AddObject ( m , " RegistryKey " , ( PyObject * ) & PyRegistryKey ) ;
2008-12-16 21:51:01 +01:00
}