[SCM] Samba Shared Repository - branch master updated - 7f148a2cf85132c71516bed4b71f640495dd05fc

Jelmer Vernooij jelmer at samba.org
Thu Dec 18 16:52:44 GMT 2008


The branch, master has been updated
       via  7f148a2cf85132c71516bed4b71f640495dd05fc (commit)
       via  01c22153a95377fc83dc9559404b1876cca109e7 (commit)
       via  61a2d5c8784a99d4d0419a00375be91a3e9bfc33 (commit)
       via  49d522fe381430799d636305dcc8d2babe16f8ff (commit)
       via  d14c8604653d39dd25736279d34930ee7a3ae103 (commit)
       via  0c0b9c738f0fc1bf8aa64533a5e4e0635b84f58f (commit)
      from  fc31f2c5269fd405be96b9a036baf35a60141ccf (commit)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 7f148a2cf85132c71516bed4b71f640495dd05fc
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Thu Dec 18 16:51:59 2008 +0000

    Fix Python event tests after rename to tevent.

commit 01c22153a95377fc83dc9559404b1876cca109e7
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Thu Dec 18 16:50:54 2008 +0000

    Fix samba3sam test after removal of dom_sid IDL file.

commit 61a2d5c8784a99d4d0419a00375be91a3e9bfc33
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Thu Dec 18 16:49:33 2008 +0000

    Use plain Python C API for registry module, rather than SWIG.

commit 49d522fe381430799d636305dcc8d2babe16f8ff
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Thu Dec 18 15:32:58 2008 +0000

    Add convenience macro for raising exceptions for NTSTATUS / WERROR.

commit d14c8604653d39dd25736279d34930ee7a3ae103
Merge: 0c0b9c738f0fc1bf8aa64533a5e4e0635b84f58f fc31f2c5269fd405be96b9a036baf35a60141ccf
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Thu Dec 18 14:54:57 2008 +0000

    Merge branch 'master' of ssh://git.samba.org/data/git/samba into pyregistry

commit 0c0b9c738f0fc1bf8aa64533a5e4e0635b84f58f
Author: Jelmer Vernooij <jelmer at samba.org>
Date:   Tue Dec 16 21:51:01 2008 +0100

    Start converting registry python module to plain C rather than SWIG.

-----------------------------------------------------------------------

Summary of changes:
 source4/dsdb/samdb/ldb_modules/tests/samba3sam.py |    4 +-
 source4/lib/registry/config.mk                    |   12 +-
 source4/lib/registry/pyregistry.c                 |  432 ++
 source4/lib/registry/registry.i                   |  223 -
 source4/lib/registry/registry.py                  |  151 -
 source4/lib/registry/registry_wrap.c              | 4489 ---------------------
 source4/lib/registry/tests/bindings.py            |    2 +-
 source4/libcli/util/pyerrors.h                    |   12 +
 source4/scripting/python/samba/provision.py       |    2 +-
 source4/selftest/tests.sh                         |    2 +-
 10 files changed, 453 insertions(+), 4876 deletions(-)
 create mode 100644 source4/lib/registry/pyregistry.c
 delete mode 100644 source4/lib/registry/registry.i
 delete mode 100644 source4/lib/registry/registry.py
 delete mode 100644 source4/lib/registry/registry_wrap.c


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/samdb/ldb_modules/tests/samba3sam.py b/source4/dsdb/samdb/ldb_modules/tests/samba3sam.py
index fa1af2a..d1a8e71 100644
--- a/source4/dsdb/samdb/ldb_modules/tests/samba3sam.py
+++ b/source4/dsdb/samdb/ldb_modules/tests/samba3sam.py
@@ -27,7 +27,7 @@ import ldb
 from ldb import SCOPE_DEFAULT, SCOPE_BASE, SCOPE_SUBTREE
 from samba import Ldb, substitute_var
 from samba.tests import LdbTestCase, TestCaseInTempDir, cmdline_loadparm
-import samba.dcerpc.dom_sid
+import samba.dcerpc.security
 import samba.security
 import samba.ndr
 
@@ -116,7 +116,7 @@ class MapBaseTestCase(TestCaseInTempDir):
         super(MapBaseTestCase, self).tearDown()
 
     def assertSidEquals(self, text, ndr_sid):
-        sid_obj1 = samba.ndr.ndr_unpack(samba.dcerpc.dom_sid.dom_sid,
+        sid_obj1 = samba.ndr.ndr_unpack(samba.dcerpc.security.dom_sid,
                                         str(ndr_sid[0]))
         sid_obj2 = samba.security.Sid(text)
         # For now, this is the only way we can compare these since the 
diff --git a/source4/lib/registry/config.mk b/source4/lib/registry/config.mk
index 9af61f9..6528127 100644
--- a/source4/lib/registry/config.mk
+++ b/source4/lib/registry/config.mk
@@ -103,12 +103,8 @@ torture_registry_OBJ_FILES = $(addprefix $(libregistrysrcdir)/tests/, generic.o
 
 $(eval $(call proto_header_template,$(libregistrysrcdir)/tests/proto.h,$(torture_registry_OBJ_FILES:.o=.c)))
 
-[PYTHON::swig_registry]
-LIBRARY_REALNAME = samba/_registry.$(SHLIBEXT)
-PUBLIC_DEPENDENCIES = registry
-
-swig_registry_OBJ_FILES = $(libregistrysrcdir)/registry_wrap.o
-
-$(eval $(call python_py_module_template,samba/registry.py,$(libregistrysrcdir)/registry.py))
+[PYTHON::py_registry]
+LIBRARY_REALNAME = samba/registry.$(SHLIBEXT)
+PUBLIC_DEPENDENCIES = registry PYTALLOC swig_credentials param
 
-$(swig_registry_OBJ_FILES): CFLAGS+=$(CFLAG_NO_UNUSED_MACROS) $(CFLAG_NO_CAST_QUAL)
+py_registry_OBJ_FILES = $(libregistrysrcdir)/pyregistry.o
diff --git a/source4/lib/registry/pyregistry.c b/source4/lib/registry/pyregistry.c
new file mode 100644
index 0000000..e49fdad
--- /dev/null
+++ b/source4/lib/registry/pyregistry.c
@@ -0,0 +1,432 @@
+/* 
+   Unix SMB/CIFS implementation.
+   Samba utility functions
+   Copyright (C) Jelmer Vernooij <jelmer at 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 "includes.h"
+#include <Python.h>
+#include "libcli/util/pyerrors.h"
+#include "lib/registry/registry.h"
+#include "scripting/python/modules.h" /* for py_iconv_convenience() */
+#include <pytalloc.h>
+#include <tevent.h>
+
+extern struct loadparm_context *lp_from_py_object(PyObject *py_obj);
+extern struct cli_credentials *cli_credentials_from_py_object(PyObject *py_obj);
+
+PyAPI_DATA(PyTypeObject) PyRegistryKey;
+PyAPI_DATA(PyTypeObject) PyRegistry;
+PyAPI_DATA(PyTypeObject) PyHiveKey;
+
+static PyObject *py_get_predefined_key_by_name(PyObject *self, PyObject *args)
+{
+	char *name;
+	WERROR result;
+	struct registry_context *ctx = py_talloc_get_ptr(self);
+	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);
+
+	return py_talloc_import(&PyRegistryKey, key);
+}
+
+static PyObject *py_key_del_abs(PyObject *self, PyObject *args)
+{
+	char *path;
+	WERROR result;
+	struct registry_context *ctx = py_talloc_get_ptr(self);
+
+	if (!PyArg_ParseTuple(args, "s", &path))
+		return NULL;
+
+	result = reg_key_del_abs(ctx, path);
+	PyErr_WERROR_IS_ERR_RAISE(result);
+
+	return Py_None;
+}
+
+static PyObject *py_get_predefined_key(PyObject *self, PyObject *args)
+{
+	uint32_t hkey;
+	struct registry_context *ctx = py_talloc_get_ptr(self);
+	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);
+
+	return py_talloc_import(&PyRegistryKey, key);
+}
+
+static PyObject *py_diff_apply(PyObject *self, PyObject *args)
+{
+	char *filename;
+	WERROR result;
+	struct registry_context *ctx = py_talloc_get_ptr(self);
+	if (!PyArg_ParseTuple(args, "s", &filename))
+		return NULL;
+
+	result = reg_diff_apply(ctx, py_iconv_convenience(NULL), filename);
+	PyErr_WERROR_IS_ERR_RAISE(result);
+
+	return Py_None; 
+}
+
+static PyObject *py_mount_hive(PyObject *self, PyObject *args)
+{
+	struct registry_context *ctx = py_talloc_get_ptr(self);
+	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);
+
+	result = reg_mount_hive(ctx, py_talloc_get_ptr(py_hivekey), hkey, elements);
+	PyErr_WERROR_IS_ERR_RAISE(result);
+
+	return Py_None;
+}
+
+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);
+	return py_talloc_import(&PyRegistry, ctx);
+}
+
+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,
+	.tp_basicsize = sizeof(py_talloc_Object),
+	.tp_dealloc = py_talloc_dealloc,
+};
+
+static PyObject *py_hive_key_del(PyObject *self, PyObject *args)
+{
+	char *name;
+	struct hive_key *key = py_talloc_get_ptr(self);
+	WERROR result;
+
+	if (!PyArg_ParseTuple(args, "s", &name))
+		return NULL;
+
+	result = hive_key_del(key, name);
+
+	PyErr_WERROR_IS_ERR_RAISE(result);
+
+	return Py_None; 
+}
+
+static PyObject *py_hive_key_flush(PyObject *self)
+{
+	WERROR result;
+	struct hive_key *key = py_talloc_get_ptr(self);
+
+	result = hive_key_flush(key);
+	PyErr_WERROR_IS_ERR_RAISE(result);
+
+	return Py_None;
+}
+
+static PyObject *py_hive_key_del_value(PyObject *self, PyObject *args)
+{
+	char *name;
+	WERROR result;
+	struct hive_key *key = py_talloc_get_ptr(self);
+
+	if (!PyArg_ParseTuple(args, "s", &name))
+		return NULL;
+
+	result = hive_key_del_value(key, name);
+
+	PyErr_WERROR_IS_ERR_RAISE(result);
+
+	return Py_None; 
+}
+
+static PyObject *py_hive_key_set_value(PyObject *self, PyObject *args)
+{
+	char *name;
+	uint32_t type;
+	DATA_BLOB value;
+	WERROR result;
+	struct hive_key *key = py_talloc_get_ptr(self);
+
+	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);
+
+	return Py_None; 
+}
+
+static PyMethodDef hive_key_methods[] = {
+	{ "del", py_hive_key_del, METH_VARARGS, "S.del(name) -> None\n"
+		"Delete a subkey" },
+	{ "flush", (PyCFunction)py_hive_key_flush, METH_NOARGS, "S.flush() -> None\n"
+                "Flush this key to disk" },
+	{ "del_value", py_hive_key_del_value, METH_VARARGS, "S.del_value(name) -> None\n"
+                 "Delete a value" },
+	{ "set_value", py_hive_key_set_value, METH_VARARGS, "S.set_value(name, type, data) -> None\n"
+                 "Set a value" },
+	{ NULL }
+};
+
+static PyObject *hive_open(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+	/* reg_open_hive */
+	return Py_None;
+}
+
+PyTypeObject PyHiveKey = {
+	.tp_name = "HiveKey",
+	.tp_methods = hive_key_methods,
+	.tp_new = hive_open,
+	.tp_basicsize = sizeof(py_talloc_Object),
+	.tp_dealloc = py_talloc_dealloc,
+};
+
+PyTypeObject PyRegistryKey = {
+	.tp_name = "RegistryKey",
+	.tp_basicsize = sizeof(py_talloc_Object),
+	.tp_dealloc = py_talloc_dealloc,
+};
+
+static PyObject *py_open_samba(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+	const char *kwnames[] = { "lp_ctx", "session_info", NULL };
+	struct registry_context *reg_ctx;
+	WERROR result;
+    struct loadparm_context *lp_ctx;
+	PyObject *py_lp_ctx, *py_session_info, *py_credentials;
+	struct auth_session_info *session_info;
+    struct cli_credentials *credentials;
+	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOO", discard_const_p(char *, kwnames),
+					 &py_lp_ctx, &py_session_info, &py_credentials))
+		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_samba(NULL, &reg_ctx, NULL, 
+				lp_ctx, session_info, credentials);
+	if (!W_ERROR_IS_OK(result)) {
+		PyErr_SetWERROR(result);
+		return NULL;
+	}
+	
+	return py_talloc_import(&PyRegistry, reg_ctx);
+}
+
+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);
+
+	return py_talloc_import(&PyHiveKey, key);
+}
+
+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);
+
+	return py_talloc_import(&PyHiveKey, key);
+}
+
+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,
+							   event_context_init(NULL), lp_ctx, &key);
+	PyErr_WERROR_IS_ERR_RAISE(result);
+
+	return py_talloc_import(&PyHiveKey, key);
+}
+
+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)
+		return Py_None;
+	return PyString_FromString(str);
+}
+
+static PyMethodDef py_registry_methods[] = {
+	{ "open_samba", (PyCFunction)py_open_samba, METH_VARARGS|METH_KEYWORDS, "open_samba() -> reg" },
+	{ "open_directory", py_open_directory, METH_VARARGS, "open_dir(location) -> key" },
+	{ "create_directory", py_create_directory, METH_VARARGS, "create_dir(location) -> key" },
+	{ "open_ldb", (PyCFunction)py_open_ldb_file, METH_VARARGS|METH_KEYWORDS, "open_ldb(location, session_info=None, credentials=None, loadparm_context=None) -> key" },
+	{ "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)
+{
+	PyObject *m;
+
+	if (PyType_Ready(&PyHiveKey) < 0)
+		return;
+
+	if (PyType_Ready(&PyRegistry) < 0)
+		return;
+
+	if (PyType_Ready(&PyRegistryKey) < 0)
+		return;
+
+	m = Py_InitModule3("registry", py_registry_methods, "Registry");
+	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));
+
+	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);
+}
diff --git a/source4/lib/registry/registry.i b/source4/lib/registry/registry.i
deleted file mode 100644
index cbd5fe8..0000000
--- a/source4/lib/registry/registry.i
+++ /dev/null
@@ -1,223 +0,0 @@
-/* 
-   Unix SMB/CIFS implementation.
-   Copyright (C) Jelmer Vernooij <jelmer at samba.org> 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.


-- 
Samba Shared Repository


More information about the samba-cvs mailing list