From 75c7fd4030a7c2ec5eeb752ccbc0f5fde74d1029 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Wed, 21 Nov 2007 12:31:26 +0100 Subject: r26073: Import Python bindings for the registry. (This used to be commit 777205b5705940c00384172c531ea99ba3eae235) --- source4/lib/registry/config.mk | 7 +- source4/lib/registry/registry.i | 150 +++++++++++++++++++++++++++++++++ source4/lib/registry/tests/bindings.py | 34 ++++++++ source4/selftest/samba4_tests.sh | 1 + 4 files changed, 191 insertions(+), 1 deletion(-) create mode 100644 source4/lib/registry/registry.i create mode 100644 source4/lib/registry/tests/bindings.py diff --git a/source4/lib/registry/config.mk b/source4/lib/registry/config.mk index 58ee6deb51..b289ff9afd 100644 --- a/source4/lib/registry/config.mk +++ b/source4/lib/registry/config.mk @@ -35,7 +35,7 @@ OBJ_FILES = \ rpc.o PUBLIC_DEPENDENCIES = \ LIBSAMBA-UTIL CHARSET TDR_REGF LIBLDB \ - RPC_NDR_WINREG + RPC_NDR_WINREG LDB_WRAP PUBLIC_HEADERS = registry.h hive.h patchfile.h # End MODULE registry_ldb ################################################ @@ -100,3 +100,8 @@ OBJ_FILES = \ tests/hive.o \ tests/diff.o \ tests/registry.o + +[PYTHON::swig_registry] +PUBLIC_DEPENDENCIES = registry LIBPYTHON +SWIG_FILE = registry.i + diff --git a/source4/lib/registry/registry.i b/source4/lib/registry/registry.i new file mode 100644 index 0000000000..7e33f43a14 --- /dev/null +++ b/source4/lib/registry/registry.i @@ -0,0 +1,150 @@ +/* + 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 registry + +%{ +/* Include headers */ +#include +#include + +#include "includes.h" +#include "registry.h" + +typedef struct registry_context reg; +typedef struct hive_key hive; +%} + +/* FIXME: This should be in another file */ +%typemap(default) struct auth_session_info * { + $1 = NULL; +} + +%import "stdint.i" +%import "../../lib/talloc/talloc.i" +%import "../../auth/credentials/credentials.i" +%import "../../libcli/util/errors.i" + +/* Utility functions */ + +const char *reg_get_predef_name(uint32_t hkey); +const char *str_regtype(int type); + +/* Registry contexts */ +%typemap(in,numinputs=0) struct registry_context ** (struct registry_context *tmp) { + $1 = &tmp; +} + +%typemap(argout) struct registry_context ** { + $result = SWIG_NewPointerObj(*$1, SWIGTYPE_p_registry_context, 0); +} + +%rename(Registry) reg_open_local; +WERROR reg_open_local(TALLOC_CTX *parent_ctx, struct registry_context **ctx, + struct auth_session_info *session_info, + struct cli_credentials *credentials); + +%typemap(in) const char ** { + /* Check if is a list */ + if (PyList_Check($input)) { + int size = PyList_Size($input); + int i = 0; + $1 = (char **) malloc((size+1)*sizeof(const char *)); + for (i = 0; i < size; i++) { + PyObject *o = PyList_GetItem($input,i); + if (PyString_Check(o)) + $1[i] = PyString_AsString(PyList_GetItem($input,i)); + else { + PyErr_SetString(PyExc_TypeError,"list must contain strings"); + free($1); + return NULL; + } + } + $1[i] = 0; + } else { + PyErr_SetString(PyExc_TypeError,"not a list"); + return NULL; + } +} + +%typemap(freearg) const char ** { + free((char **) $1); +} + +typedef struct registry_context { + %extend { + + ~reg() { talloc_free($self); } + WERROR get_predefined_key_by_name(const char *name, + struct registry_key **key); + + WERROR get_predefined_key(uint32_t hkey_id, struct registry_key **key); + WERROR apply_patchfile(const char *filename) + { + return reg_diff_apply(filename, $self); + } + + WERROR mount_hive(struct hive_key *hive_key, uint32_t hkey_id, + const char **elements=NULL); + } + + %pythoncode { + def mount(self, path, hkey_id, elements=[]): + self.mount_hive(Hive(path), hkey_id, elements) + } +} reg; + +/* Hives */ +%typemap(in,numinputs=0) struct hive_key ** (struct hive_key *tmp) { + $1 = &tmp; +} + +%typemap(argout) struct hive_key ** { + Py_XDECREF($result); + $result = SWIG_NewPointerObj(*$1, SWIGTYPE_p_hive_key, 0); +} + +%rename(Hive) reg_open_hive; +WERROR reg_open_hive(TALLOC_CTX *parent_ctx, const char *location, + struct auth_session_info *session_info, + struct cli_credentials *credentials, + struct hive_key **root); + +typedef struct hive_key { + %extend { + ~hive() { talloc_free($self); } + } +} hive; + +%rename(open_samba) reg_open_samba; + +WERROR reg_open_samba(TALLOC_CTX *mem_ctx, + struct registry_context **ctx, + struct auth_session_info *session_info, + struct cli_credentials *credentials); + +/* Constants */ +%constant uint32_t HKEY_CLASSES_ROOT = HKEY_CLASSES_ROOT; +%constant uint32_t HKEY_CURRENT_USER = HKEY_CURRENT_USER; +%constant uint32_t HKEY_LOCAL_MACHINE = HKEY_LOCAL_MACHINE; +%constant uint32_t HKEY_USERS = HKEY_USERS; +%constant uint32_t HKEY_PERFORMANCE_DATA = HKEY_PERFORMANCE_DATA; +%constant uint32_t HKEY_CURRENT_CONFIG = HKEY_CURRENT_CONFIG; +%constant uint32_t HKEY_DYN_DATA = HKEY_DYN_DATA; +%constant uint32_t HKEY_PERFORMANCE_TEXT = HKEY_PERFORMANCE_TEXT; +%constant uint32_t HKEY_PERFORMANCE_NLSTEXT = HKEY_PERFORMANCE_NLSTEXT; diff --git a/source4/lib/registry/tests/bindings.py b/source4/lib/registry/tests/bindings.py new file mode 100644 index 0000000000..be87efe594 --- /dev/null +++ b/source4/lib/registry/tests/bindings.py @@ -0,0 +1,34 @@ +#!/usr/bin/python + +# 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 . +# + +import unittest +import registry + +class HelperTests(unittest.TestCase): + def test_predef_to_name(self): + self.assertEquals("HKEY_LOCAL_MACHINE", + registry.reg_get_predef_name(0x80000002)) + + def test_str_regtype(self): + self.assertEquals("REG_DWORD", registry.str_regtype(4)) + + +class RegistryTests(unittest.TestCase): + def test_new(self): + self.registry = registry.Registry() diff --git a/source4/selftest/samba4_tests.sh b/source4/selftest/samba4_tests.sh index a4d2bb2e29..dd00a2b349 100755 --- a/source4/selftest/samba4_tests.sh +++ b/source4/selftest/samba4_tests.sh @@ -296,4 +296,5 @@ if which trial 2>/dev/null >/dev/null then plantest "ldb.python" none PYTHONPATH=bin/python trial lib/ldb/tests/python/api.py plantest "credentials.python" none PYTHONPATH=bin/python trial auth/credentials/tests/bindings.py + plantest "registry.python" none PYTHONPATH=bin/python trial lib/registry/tests/bindings.py fi -- cgit