From a57b1aa0f1df4fb5ec5a5b38f0505302ae20f001 Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Fri, 19 Dec 2008 01:22:07 +0000 Subject: Initial work using manual Python bindings for LDB, rather than SWIG-generated ones. --- source4/lib/ldb/ldb.i | 1289 ------------------------------------------------- 1 file changed, 1289 deletions(-) delete mode 100644 source4/lib/ldb/ldb.i (limited to 'source4/lib/ldb/ldb.i') diff --git a/source4/lib/ldb/ldb.i b/source4/lib/ldb/ldb.i deleted file mode 100644 index 7831d6da60..0000000000 --- a/source4/lib/ldb/ldb.i +++ /dev/null @@ -1,1289 +0,0 @@ -/* - Unix SMB/CIFS implementation. - - Swig interface to ldb. - - Copyright (C) 2005,2006 Tim Potter - Copyright (C) 2006 Simo Sorce - Copyright (C) 2007-2008 Jelmer Vernooij - - ** NOTE! The following LGPL license applies to the ldb - ** library. This does NOT imply that all of Samba is released - ** under the LGPL - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 3 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, see . -*/ - -%define DOCSTRING -"An interface to LDB, a LDAP-like API that can either to talk an embedded database (TDB-based) or a standards-compliant LDAP server." -%enddef - -%module(docstring=DOCSTRING) ldb - -%{ - -#include -#include -#include "talloc.h" -#include "events.h" -#include "ldb.h" -#include "ldb_errors.h" -#include "ldb_private.h" - -typedef struct ldb_message ldb_msg; -typedef struct ldb_context ldb; -typedef struct ldb_dn ldb_dn; -typedef struct ldb_ldif ldb_ldif; -typedef struct ldb_message_element ldb_message_element; -typedef struct ldb_module ldb_module; -typedef int ldb_error; -typedef int ldb_int_error; - -%} - -%import "carrays.i" -%import "typemaps.i" -%include "exception.i" -%import "stdint.i" - -/* Don't expose talloc contexts in Python code. Python does reference - counting for us, so just create a new top-level talloc context. - */ -%typemap(in, numinputs=0, noblock=1) TALLOC_CTX * { - $1 = NULL; -} - - - -%constant int SCOPE_DEFAULT = LDB_SCOPE_DEFAULT; -%constant int SCOPE_BASE = LDB_SCOPE_BASE; -%constant int SCOPE_ONELEVEL = LDB_SCOPE_ONELEVEL; -%constant int SCOPE_SUBTREE = LDB_SCOPE_SUBTREE; - -%constant int CHANGETYPE_NONE = LDB_CHANGETYPE_NONE; -%constant int CHANGETYPE_ADD = LDB_CHANGETYPE_ADD; -%constant int CHANGETYPE_DELETE = LDB_CHANGETYPE_DELETE; -%constant int CHANGETYPE_MODIFY = LDB_CHANGETYPE_MODIFY; - -/* - * Wrap struct ldb_context - */ - -/* The ldb functions will crash if a NULL ldb context is passed so - catch this before it happens. */ - -%typemap(check,noblock=1) struct ldb_context* { - if ($1 == NULL) - SWIG_exception(SWIG_ValueError, - "ldb context must be non-NULL"); -} - -%typemap(check,noblock=1) ldb_msg * { - if ($1 == NULL) - SWIG_exception(SWIG_ValueError, - "Message can not be None"); -} - -/* - * Wrap struct ldb_val - */ - -%typemap(in,noblock=1) struct ldb_val *INPUT (struct ldb_val temp) { - $1 = &temp; - if (!PyString_Check($input)) { - PyErr_SetString(PyExc_TypeError, "string arg expected"); - return NULL; - } - $1->length = PyString_Size($input); - $1->data = PyString_AsString($input); -} - -%inline %{ -PyObject *ldb_val_to_py_object(struct ldb_context *ldb_ctx, - struct ldb_message_element *el, - struct ldb_val *val) -{ - const struct ldb_schema_attribute *a; - struct ldb_val new_val; - TALLOC_CTX *mem_ctx = talloc_new(NULL); - PyObject *ret; - - new_val = *val; - - if (ldb_ctx != NULL) { - a = ldb_schema_attribute_by_name(ldb_ctx, el->name); - - if (a != NULL) { - if (a->syntax->ldif_write_fn(ldb_ctx, mem_ctx, val, &new_val) != 0) { - talloc_free(mem_ctx); - return NULL; - } - } - } - - ret = PyString_FromStringAndSize((const char *)new_val.data, new_val.length); - - talloc_free(mem_ctx); - - return ret; -} - -%} - -%typemap(out,noblock=1) struct ldb_val * { - $result = PyString_FromStringAndSize((const char *)$1->data, $1->length) -} - -%typemap(out,noblock=1) struct ldb_val { - $result = PyString_FromStringAndSize((const char *)$1.data, $1.length) -} - -/* - * Wrap struct ldb_result - */ - -%typemap(in,noblock=1,numinputs=0) struct ldb_result ** (struct ldb_result *temp_ldb_result) { - $1 = &temp_ldb_result; -} - -#ifdef SWIGPYTHON -%typemap(argout,noblock=1) struct ldb_result ** (int i) { - if ($1 == NULL) { - $result = Py_None; - } else { - $result = PyList_New((*$1)->count); - for (i = 0; i < (*$1)->count; i++) { - PyList_SetItem($result, i, - SWIG_NewPointerObj((*$1)->msgs[i], SWIGTYPE_p_ldb_message, 0) - ); - } - } -} - -%typemap(in,noblock=1,numinputs=1) const char * const *NULL_STR_LIST { - if ($input == Py_None) { - $1 = NULL; - } else if (PySequence_Check($input)) { - int i; - $1 = talloc_array(NULL, char *, PySequence_Size($input)+1); - for(i = 0; i < PySequence_Size($input); i++) - $1[i] = PyString_AsString(PySequence_GetItem($input, i)); - $1[i] = NULL; - } else { - SWIG_exception(SWIG_TypeError, "expected sequence"); - } -} - -%typemap(freearg,noblock=1) const char * const *NULL_STR_LIST { - talloc_free($1); -} - -%apply const char * const *NULL_STR_LIST { const char * const *attrs } -%apply const char * const *NULL_STR_LIST { const char * const *options } -%apply const char * const *NULL_STR_LIST { const char * const *control_strings } - -#endif - -%types(struct ldb_result *, struct ldb_parse_tree *); - -/* - * Wrap struct ldb_dn - */ - -%rename(__str__) ldb_dn::get_linearized; -%rename(__cmp__) ldb_dn::compare; -%rename(__len__) ldb_dn::get_comp_num; -%rename(Dn) ldb_dn; -%feature("docstring") ldb_dn "A LDB distinguished name."; -typedef struct ldb_dn { - %extend { - %feature("docstring") ldb_dn "S.__init__(ldb, string)\n" \ - "Create a new DN."; - ldb_dn(ldb *ldb_ctx, const char *str) - { - ldb_dn *ret = ldb_dn_new(ldb_ctx, ldb_ctx, str); - /* ldb_dn_new() doesn't accept NULL as memory context, so - we do it this way... */ - talloc_steal(NULL, ret); - - if (ret == NULL || !ldb_dn_validate(ret)) - SWIG_exception(SWIG_ValueError, - "unable to parse dn string"); -fail: - return ret; - } - ~ldb_dn() { talloc_free($self); } - %feature("docstring") validate "S.validate() -> bool\n" \ - "Validate DN is correct."; - bool validate(); - const char *get_casefold(); - const char *get_linearized(); - %feature("docstring") parent "S.parent() -> dn\n" \ - "Get the parent for this DN."; - ldb_dn *parent() { return ldb_dn_get_parent(NULL, $self); } - int compare(ldb_dn *other); - bool is_valid(); - %feature("docstring") is_special "S.is_special() -> bool\n" \ - "Check whether this is a special LDB DN."; - bool is_special(); - %feature("docstring") is_null "S.is_null() -> bool\n" \ - "Check whether this is a null DN."; - bool is_null(); - bool check_special(const char *name); - int get_comp_num(); - %feature("docstring") add_child "S.add_child(dn) -> None\n" \ - "Add a child DN to this DN."; - bool add_child(ldb_dn *child); - %feature("docstring") add_base "S.add_base(dn) -> None\n" \ - "Add a base DN to this DN."; - bool add_base(ldb_dn *base); - %feature("docstring") canonical_str "S.canonical_str() -> string\n" \ - "Canonical version of this DN (like a posix path)."; - const char *canonical_str() { - return ldb_dn_canonical_string($self, $self); - } - %feature("docstring") canonical_ex_str "S.canonical_ex_str() -> string\n" \ - "Canonical version of this DN (like a posix path, with terminating newline)."; - const char *canonical_ex_str() { - return ldb_dn_canonical_ex_string($self, $self); - } -#ifdef SWIGPYTHON - char *__repr__(void) - { - char *dn = ldb_dn_get_linearized($self), *ret; - asprintf(&ret, "Dn('%s')", dn); - return ret; - } - - ldb_dn *__add__(ldb_dn *other) - { - ldb_dn *ret = ldb_dn_copy(NULL, $self); - ldb_dn_add_child(ret, other); - return ret; - } - - /* FIXME: implement __getslice__ */ -#endif - %pythoncode { - def __eq__(self, other): - if isinstance(other, self.__class__): - return self.__cmp__(other) == 0 - if isinstance(other, str): - return str(self) == other - return False - } - } -} ldb_dn; - -#ifdef SWIGPYTHON -%{ -struct ldb_context *ldb_context_from_py_object(PyObject *py_obj) -{ - struct ldb_context *ldb_ctx; - if (SWIG_ConvertPtr(py_obj, (void *)&ldb_ctx, SWIGTYPE_p_ldb_context, 0 | 0 ) < 0) - return NULL; - return ldb_ctx; -} - -int ldb_dn_from_pyobject(TALLOC_CTX *mem_ctx, PyObject *object, - struct ldb_context *ldb_ctx, ldb_dn **dn) -{ - int ret; - struct ldb_dn *odn; - if (ldb_ctx != NULL && PyString_Check(object)) { - odn = ldb_dn_new(mem_ctx, ldb_ctx, PyString_AsString(object)); - if (!odn) { - return SWIG_ERROR; - } - *dn = odn; - return 0; - } - ret = SWIG_ConvertPtr(object, (void **)&odn, SWIGTYPE_p_ldb_dn, - SWIG_POINTER_EXCEPTION); - *dn = ldb_dn_copy(mem_ctx, odn); - if (odn && !*dn) { - return SWIG_ERROR; - } - return ret; -} - -ldb_message_element *ldb_msg_element_from_pyobject(TALLOC_CTX *mem_ctx, - PyObject *set_obj, int flags, - const char *attr_name) -{ - struct ldb_message_element *me = talloc(mem_ctx, struct ldb_message_element); - me->name = attr_name; - me->flags = flags; - if (PyString_Check(set_obj)) { - me->num_values = 1; - me->values = talloc_array(me, struct ldb_val, me->num_values); - me->values[0].length = PyString_Size(set_obj); - me->values[0].data = (uint8_t *)talloc_strdup(me->values, - PyString_AsString(set_obj)); - } else if (PySequence_Check(set_obj)) { - int i; - me->num_values = PySequence_Size(set_obj); - me->values = talloc_array(me, struct ldb_val, me->num_values); - for (i = 0; i < me->num_values; i++) { - PyObject *obj = PySequence_GetItem(set_obj, i); - me->values[i].length = PyString_Size(obj); - me->values[i].data = (uint8_t *)PyString_AsString(obj); - } - } else { - talloc_free(me); - me = NULL; - } - - return me; -} - -PyObject *ldb_msg_element_to_set(struct ldb_context *ldb_ctx, - ldb_message_element *me) -{ - int i; - PyObject *result; - - /* Python << 2.5 doesn't have PySet_New and PySet_Add. */ - result = PyList_New(me->num_values); - - for (i = 0; i < me->num_values; i++) { - PyList_SetItem(result, i, - ldb_val_to_py_object(ldb_ctx, me, &me->values[i])); - } - - return result; -} - -%} -#endif - -/* ldb_message_element */ -%rename(MessageElement) ldb_message_element; -%feature("docstring") ldb_message_element "Message element."; -typedef struct ldb_message_element { - %extend { -#ifdef SWIGPYTHON - int __cmp__(ldb_message_element *other) - { - return ldb_msg_element_compare($self, other); - } - - PyObject *__iter__(void) - { - return PyObject_GetIter(ldb_msg_element_to_set(NULL, $self)); - } - - PyObject *__set__(void) - { - return ldb_msg_element_to_set(NULL, $self); - } - - ldb_message_element(PyObject *set_obj, int flags=0, const char *name = NULL) - { - return ldb_msg_element_from_pyobject(NULL, set_obj, flags, name); - } - - int __len__() - { - return $self->num_values; - } -#endif - - PyObject *get(int i) - { - if (i < 0 || i >= $self->num_values) - return Py_None; - - return ldb_val_to_py_object(NULL, $self, &$self->values[i]); - } - - ~ldb_message_element() { talloc_free($self); } - } - %pythoncode { - def __getitem__(self, i): - ret = self.get(i) - if ret is None: - raise KeyError("no such value") - return ret - - def __repr__(self): - return "MessageElement([%s])" % (",".join(repr(x) for x in self.__set__())) - - def __eq__(self, other): - if (len(self) == 1 and self.get(0) == other): - return True - if isinstance(other, self.__class__): - return self.__cmp__(other) == 0 - o = iter(other) - for i in range(len(self)): - if self.get(i) != o.next(): - return False - return True - } -} ldb_message_element; - -/* ldb_message */ - -%feature("docstring") ldb_message "Message."; -%rename(Message) ldb_message; -#ifdef SWIGPYTHON -%rename(__delitem__) ldb_message::remove_attr; -%typemap(out) ldb_message_element * { - if ($1 == NULL) - PyErr_SetString(PyExc_KeyError, "no such element"); - else - $result = SWIG_NewPointerObj($1, SWIGTYPE_p_ldb_message_element, 0); -} - -%inline { - PyObject *ldb_msg_list_elements(ldb_msg *msg) - { - int i, j = 0; - PyObject *obj = PyList_New(msg->num_elements+(msg->dn != NULL?1:0)); - if (msg->dn != NULL) { - PyList_SetItem(obj, j, PyString_FromString("dn")); - j++; - } - for (i = 0; i < msg->num_elements; i++) { - PyList_SetItem(obj, j, PyString_FromString(msg->elements[i].name)); - j++; - } - return obj; - } -} - -#endif - -typedef struct ldb_message { - ldb_dn *dn; - - %extend { - ldb_msg(ldb_dn *dn = NULL) { - ldb_msg *ret = ldb_msg_new(NULL); - ret->dn = talloc_reference(ret, dn); - return ret; - } - ~ldb_msg() { talloc_free($self); } - ldb_message_element *find_element(const char *name); - -#ifdef SWIGPYTHON - void __setitem__(const char *attr_name, ldb_message_element *val) - { - struct ldb_message_element *el; - - ldb_msg_remove_attr($self, attr_name); - - el = talloc($self, struct ldb_message_element); - el->name = talloc_strdup(el, attr_name); - el->num_values = val->num_values; - el->values = talloc_reference(el, val->values); - - ldb_msg_add($self, el, val->flags); - } - - void __setitem__(const char *attr_name, PyObject *val) - { - struct ldb_message_element *el = ldb_msg_element_from_pyobject(NULL, - val, 0, attr_name); - talloc_steal($self, el); - ldb_msg_remove_attr($self, attr_name); - ldb_msg_add($self, el, el->flags); - } - - unsigned int __len__() { return $self->num_elements; } - - PyObject *keys(void) - { - return ldb_msg_list_elements($self); - } - - PyObject *__iter__(void) - { - return PyObject_GetIter(ldb_msg_list_elements($self)); - } -#endif - void remove_attr(const char *name); -%pythoncode { - def get(self, key, default=None): - if key == "dn": - return self.dn - return self.find_element(key) - - def __getitem__(self, key): - ret = self.get(key, None) - if ret is None: - raise KeyError("No such element") - return ret - - def iteritems(self): - for k in self.keys(): - yield k, self[k] - - def items(self): - return list(self.iteritems()) - - def __repr__(self): - return "Message(%s)" % repr(dict(self.iteritems())) -} - } -} ldb_msg; - -/* FIXME: Convert ldb_result to 3-tuple: - (msgs, refs, controls) - */ - -typedef struct ldb_ldif ldb_ldif; - -#ifdef SWIGPYTHON -%{ -static void py_ldb_debug(void *context, enum ldb_debug_level level, const char *fmt, va_list ap) PRINTF_ATTRIBUTE(3, 0); - -static void py_ldb_debug(void *context, enum ldb_debug_level level, const char *fmt, va_list ap) -{ - char *text; - PyObject *fn = context; - - vasprintf(&text, fmt, ap); - PyObject_CallFunction(fn, (char *)"(i,s)", level, text); - free(text); -} -%} - -%typemap(in,numinputs=1,noblock=1) (void (*debug)(void *context, enum ldb_debug_level level, const char *fmt, va_list ap), void *context) { - $1 = py_ldb_debug; - /* FIXME: Should be decreased somewhere as well. Perhaps register a - destructor and tie it to the ldb context ? */ - Py_INCREF($input); - $2 = $input; -} -#endif - -%inline { - static PyObject *ldb_ldif_to_pyobject(ldb_ldif *ldif) - { - if (ldif == NULL) { - return Py_None; - } else { - /* We don't want this attached to the 'ldb' any more */ - talloc_steal(NULL, ldif); - return Py_BuildValue((char *)"(iO)", ldif->changetype, - SWIG_NewPointerObj(ldif->msg, SWIGTYPE_p_ldb_message, 0)); - } - } -} - -/* - * Wrap ldb errors - */ - -%{ -PyObject *PyExc_LdbError; -%} - -%pythoncode %{ - LdbError = _ldb.LdbError -%} - -%init %{ - PyExc_LdbError = PyErr_NewException((char *)"_ldb.LdbError", NULL, NULL); - PyDict_SetItemString(d, "LdbError", PyExc_LdbError); -%} - -%ignore _LDB_ERRORS_H_; -%ignore LDB_SUCCESS; -%include "include/ldb_errors.h" - -/* - * Wrap ldb functions - */ - - -%typemap(out,noblock=1) ldb_error { - if ($1 != LDB_SUCCESS) { - PyErr_SetObject(PyExc_LdbError, Py_BuildValue((char *)"(i,s)", $1, ldb_errstring(arg1))); - SWIG_fail; - } - $result = Py_None; -}; - -%typemap(out,noblock=1) ldb_int_error { - if ($1 != LDB_SUCCESS) { - PyErr_SetObject(PyExc_LdbError, Py_BuildValue((char *)"(i,s)", $1, ldb_strerror($1))); - SWIG_fail; - } - $result = Py_None; -}; - -%typemap(out,noblock=1) struct ldb_control ** { - if ($1 == NULL) { - PyErr_SetObject(PyExc_LdbError, Py_BuildValue((char *)"(s)", ldb_errstring(arg1))); - SWIG_fail; - } - $result = SWIG_NewPointerObj($1, $1_descriptor, 0); -} - -%rename(Ldb) ldb_context; -%feature("docstring") ldb_context "Connection to a LDB database."; - -%typemap(in,noblock=1) struct ldb_dn * { - if (ldb_dn_from_pyobject(NULL, $input, arg1, &$1) != 0) { - SWIG_fail; - } -}; - -%typemap(freearg,noblock=1) struct ldb_dn * { - talloc_free($1); -}; - -%typemap(in,numinputs=1) ldb_msg *add_msg { - Py_ssize_t dict_pos, msg_pos; - ldb_message_element *msgel; - PyObject *key, *value; - - if (PyDict_Check($input)) { - PyObject *dn_value = PyDict_GetItemString($input, "dn"); - $1 = ldb_msg_new(NULL); - $1->elements = talloc_zero_array($1, struct ldb_message_element, PyDict_Size($input)); - msg_pos = dict_pos = 0; - if (dn_value) { - /* using argp1 (magic SWIG value) here is a hack */ - if (ldb_dn_from_pyobject($1, dn_value, argp1, &$1->dn) != 0) { - SWIG_exception(SWIG_TypeError, "unable to import dn object"); - } - if ($1->dn == NULL) { - SWIG_exception(SWIG_TypeError, "dn set but not found"); - } - } - - while (PyDict_Next($input, &dict_pos, &key, &value)) { - char *key_str = PyString_AsString(key); - if (strcmp(key_str, "dn") != 0) { - msgel = ldb_msg_element_from_pyobject($1->elements, value, 0, key_str); - if (msgel == NULL) { - SWIG_exception(SWIG_TypeError, "unable to import element"); - } - memcpy(&$1->elements[msg_pos], msgel, sizeof(*msgel)); - msg_pos++; - } - } - - if ($1->dn == NULL) { - SWIG_exception(SWIG_TypeError, "no dn set"); - } - - $1->num_elements = msg_pos; - } else { - if (SWIG_ConvertPtr($input, (void **)&$1, SWIGTYPE_p_ldb_message, 0) != 0) { - SWIG_exception(SWIG_TypeError, "unable to convert ldb message"); - } - } -} - -/* Top-level ldb operations */ -typedef struct ldb_context { - %rename(firstmodule) modules; - struct ldb_module *modules; - - %pythoncode { - def itermodules(self): - m = self.firstmodule - while m is not None: - yield m - m = m.next - - def modules(self): - return list(self.itermodules()) - } - - %extend { - ldb(void) { - return ldb_init(NULL, event_context_init(NULL)); - } - - %feature("docstring") connect "S.connect(url,flags=0,options=None) -> None\n" \ - "Connect to a LDB URL."; - ldb_error connect(const char *url, unsigned int flags = 0, - const char *const *options = NULL); - - ~ldb() { talloc_free($self); } - - ldb_error search_ex(TALLOC_CTX *mem_ctx, - ldb_dn *base = NULL, - enum ldb_scope scope = LDB_SCOPE_DEFAULT, - const char *expression = NULL, - const char *const *attrs = NULL, - struct ldb_control **controls = NULL, - struct ldb_result **OUT) { - int ret; - struct ldb_result *res; - struct ldb_request *req; - res = talloc_zero(mem_ctx, struct ldb_result); - if (!res) { - return LDB_ERR_OPERATIONS_ERROR; - } - - ret = ldb_build_search_req(&req, $self, mem_ctx, - base?base:ldb_get_default_basedn($self), - scope, - expression, - attrs, - controls, - res, - ldb_search_default_callback, - NULL); - - if (ret != LDB_SUCCESS) { - talloc_free(res); - return ret; - } - - ret = ldb_request($self, req); - - if (ret == LDB_SUCCESS) { - ret = ldb_wait(req->handle, LDB_WAIT_ALL); - } - - talloc_free(req); - - *OUT = res; - return ret; - } - - %feature("docstring") delete "S.delete(dn) -> None\n" \ - "Remove an entry."; - ldb_error delete(ldb_dn *dn); - %feature("docstring") rename "S.rename(old_dn, new_dn) -> None\n" \ - "Rename an entry."; - ldb_error rename(ldb_dn *olddn, ldb_dn *newdn); - struct ldb_control **parse_control_strings(TALLOC_CTX *mem_ctx, - const char * const*control_strings); - %feature("docstring") add "S.add(message) -> None\n" \ - "Add an entry."; - ldb_error add(ldb_msg *add_msg); - %feature("docstring") modify "S.modify(message) -> None\n" \ - "Modify an entry."; - ldb_error modify(ldb_msg *message); - ldb_dn *get_config_basedn(); - ldb_dn *get_root_basedn(); - ldb_dn *get_schema_basedn(); - ldb_dn *get_default_basedn(); - PyObject *schema_format_value(const char *element_name, PyObject *val) - { - const struct ldb_schema_attribute *a; - struct ldb_val old_val; - struct ldb_val new_val; - TALLOC_CTX *mem_ctx = talloc_new(NULL); - PyObject *ret; - - old_val.data = PyString_AsString(val); - old_val.length = PyString_Size(val); - - a = ldb_schema_attribute_by_name($self, element_name); - - if (a == NULL) { - return Py_None; - } - - if (a->syntax->ldif_write_fn($self, mem_ctx, &old_val, &new_val) != 0) { - talloc_free(mem_ctx); - return Py_None; - } - - ret = PyString_FromStringAndSize((const char *)new_val.data, new_val.length); - - talloc_free(mem_ctx); - - return ret; - } - - const char *errstring(); - %feature("docstring") set_create_perms "S.set_create_perms(mode) -> None\n" \ - "Set mode to use when creating new LDB files."; - void set_create_perms(unsigned int perms); - %feature("docstring") set_modules_dir "S.set_modules_dir(path) -> None\n" \ - "Set path LDB should search for modules"; - void set_modules_dir(const char *path); - %feature("docstring") set_debug "S.set_debug(callback) -> None\n" \ - "Set callback for LDB debug messages.\n" \ - "The callback should accept a debug level and debug text."; - ldb_error set_debug(void (*debug)(void *context, enum ldb_debug_level level, - const char *fmt, va_list ap), - void *context); - %feature("docstring") set_opaque "S.set_opaque(name, value) -> None\n" \ - "Set an opaque value on this LDB connection. \n" - ":note: Passing incorrect values may cause crashes."; - ldb_error set_opaque(const char *name, void *value); - %feature("docstring") get_opaque "S.get_opaque(name) -> value\n" \ - "Get an opaque value set on this LDB connection. \n" - ":note: The returned value may not be useful in Python."; - void *get_opaque(const char *name); - %feature("docstring") transaction_start "S.transaction_start() -> None\n" \ - "Start a new transaction."; - ldb_error transaction_start(); - %feature("docstring") transaction_commit "S.transaction_commit() -> None\n" \ - "Commit currently active transaction."; - ldb_error transaction_commit(); - %feature("docstring") transaction_cancel "S.transaction_cancel() -> None\n" \ - "Cancel currently active transaction."; - ldb_error transaction_cancel(); - void schema_attribute_remove(const char *name); - ldb_error schema_attribute_add(const char *attribute, unsigned flags, const char *syntax); - ldb_error setup_wellknown_attributes(void); - -#ifdef SWIGPYTHON - %typemap(in,numinputs=0,noblock=1) struct ldb_result **result_as_bool (struct ldb_result *tmp) { $1 = &tmp; } - %typemap(argout,noblock=1) struct ldb_result **result_as_bool { $result = ((*$1)->count > 0)?Py_True:Py_False; } - %typemap(freearg,noblock=1) struct ldb_result **result_as_bool { talloc_free(*$1); } - ldb_error __contains__(ldb_dn *dn, struct ldb_result **result_as_bool) - { - return ldb_search($self, $self, result_as_bool, dn, LDB_SCOPE_BASE, NULL, NULL); - } - - %feature("docstring") parse_ldif "S.parse_ldif(ldif) -> iter(messages)\n" \ - "Parse a string formatted using LDIF."; - - PyObject *parse_ldif(const char *s) - { - PyObject *list = PyList_New(0); - struct ldb_ldif *ldif; - while ((ldif = ldb_ldif_read_string($self, &s)) != NULL) { - PyList_Append(list, ldb_ldif_to_pyobject(ldif)); - } - return PyObject_GetIter(list); - } - - char *__repr__(void) - { - char *ret; - asprintf(&ret, "", ret); - return ret; - } -#endif - } - %pythoncode { - def __init__(self, url=None, flags=0, options=None): - """Create a new LDB object. - - Will also connect to the specified URL if one was given. - """ - _ldb.Ldb_swiginit(self,_ldb.new_Ldb()) - if url is not None: - self.connect(url, flags, options) - - def search(self, base=None, scope=SCOPE_DEFAULT, expression=None, - attrs=None, controls=None): - """Search in a database. - - :param base: Optional base DN to search - :param scope: Search scope (SCOPE_BASE, SCOPE_ONELEVEL or SCOPE_SUBTREE) - :param expression: Optional search expression - :param attrs: Attributes to return (defaults to all) - :param controls: Optional list of controls - :return: Iterator over Message objects - """ - if not (attrs is None or isinstance(attrs, list)): - raise TypeError("attributes not a list") - parsed_controls = None - if controls is not None: - parsed_controls = self.parse_control_strings(controls) - return self.search_ex(base, scope, expression, attrs, - parsed_controls) - } - -} ldb; - -%typemap(in,noblock=1) struct ldb_dn *; -%typemap(freearg,noblock=1) struct ldb_dn *; - -%nodefault ldb_message; -%nodefault ldb_context; -%nodefault Dn; - -%rename(valid_attr_name) ldb_valid_attr_name; -%feature("docstring") ldb_valid_attr_name "S.valid_attr_name(name) -> bool\n" - "Check whether the supplied name is a valid attribute name."; -int ldb_valid_attr_name(const char *s); - -typedef unsigned long time_t; - -%feature("docstring") timestring "S.timestring(int) -> string\n" - "Generate a LDAP time string from a UNIX timestamp"; - -%inline %{ -static char *timestring(time_t t) -{ - char *tresult = ldb_timestring(NULL, t); - char *result = strdup(tresult); - talloc_free(tresult); - return result; -} -%} - -%rename(string_to_time) ldb_string_to_time; -%feature("docstring") ldb_string_to_time "S.string_to_time(string) -> int\n" - "Parse a LDAP time string into a UNIX timestamp."; -time_t ldb_string_to_time(const char *s); - -typedef struct ldb_module { - struct ldb_module *prev, *next; - - %extend { -#ifdef SWIGPYTHON - const char *__str__() { - return $self->ops->name; - } - char *__repr__() { - char *ret; - asprintf(&ret, "", $self->ops->name); - return ret; - } -#endif - int search(struct ldb_dn *base, enum ldb_scope scope, struct ldb_parse_tree *tree, const char * const * attrs, struct ldb_result **res) { - int ret; - struct ldb_request *req = talloc_zero(NULL, struct ldb_request); - - req->operation = LDB_SEARCH; - req->op.search.base = base; - req->op.search.scope = scope; - req->op.search.tree = tree; - req->op.search.attrs = attrs; - - req->op.search.res = talloc_zero(NULL, struct ldb_result); - - ret = $self->ops->search($self, req); - - *res = req->op.search.res; - - talloc_free(req); - - return ret; - } - ldb_error add(struct ldb_message *message) { - struct ldb_request *req = talloc_zero(NULL, struct ldb_request); - req->operation = LDB_ADD; - req->op.add.message = message; - - return $self->ops->add($self, &req); - } - ldb_error modify(struct ldb_message *message) { - struct ldb_request *req = talloc_zero(NULL, struct ldb_request); - req->operation = LDB_MODIFY; - req->op.mod.message = message; - - return $self->ops->modify($self, &req); - } - ldb_error delete(struct ldb_dn *dn) { - struct ldb_request *req = talloc_zero(NULL, struct ldb_request); - req->operation = LDB_DELETE; - req->op.del.dn = dn; - - return $self->ops->del($self, &req); - - } - ldb_error rename(struct ldb_dn *olddn, struct ldb_dn *newdn) { - struct ldb_request *req = talloc_zero(NULL, struct ldb_request); - req->operation = LDB_RENAME; - req->op.rename.olddn = olddn; - req->op.rename.olddn = newdn; - - return $self->ops->rename($self, &req); - } - ldb_error start_transaction() { - return $self->ops->start_transaction($self); - } - ldb_error end_transaction() { - return $self->ops->end_transaction($self); - } - ldb_error del_transaction() { - return $self->ops->del_transaction($self); - } - } -} ldb_module; - -%{ -int py_module_search(struct ldb_module *mod, struct ldb_request *req) -{ - PyObject *py_ldb = mod->private_data; - PyObject *py_result, *py_base, *py_attrs, *py_tree; - - py_base = SWIG_NewPointerObj(req->op.search.base, SWIGTYPE_p_ldb_dn, 0); - - if (py_base == NULL) - return LDB_ERR_OPERATIONS_ERROR; - - py_tree = SWIG_NewPointerObj(req->op.search.tree, SWIGTYPE_p_ldb_parse_tree, 0); - - if (py_tree == NULL) - return LDB_ERR_OPERATIONS_ERROR; - - if (req->op.search.attrs == NULL) { - py_attrs = Py_None; - } else { - int i, len; - for (len = 0; req->op.search.attrs[len]; len++); - py_attrs = PyList_New(len); - for (i = 0; i < len; i++) - PyList_SetItem(py_attrs, i, PyString_FromString(req->op.search.attrs[i])); - } - - py_result = PyObject_CallMethod(py_ldb, "search", "OiOO", py_base, req->op.search.scope, py_tree, py_attrs); - - Py_DECREF(py_attrs); - Py_DECREF(py_tree); - Py_DECREF(py_base); - - if (py_result == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - if (SWIG_ConvertPtr(py_result, &req->op.search.res, SWIGTYPE_p_ldb_result, 0) != 0) { - return LDB_ERR_OPERATIONS_ERROR; - } - - Py_DECREF(py_result); - - return LDB_SUCCESS; -} - -int py_module_add(struct ldb_module *mod, struct ldb_request *req) -{ - PyObject *py_ldb = mod->private_data; - PyObject *py_result, *py_msg; - - py_msg = SWIG_NewPointerObj(req->op.add.message, SWIGTYPE_p_ldb_message, 0); - - if (py_msg == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - py_result = PyObject_CallMethod(py_ldb, "add", "O", py_msg); - - Py_DECREF(py_msg); - - if (py_result == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - Py_DECREF(py_result); - - return LDB_SUCCESS; -} - -int py_module_modify(struct ldb_module *mod, struct ldb_request *req) -{ - PyObject *py_ldb = mod->private_data; - PyObject *py_result, *py_msg; - - py_msg = SWIG_NewPointerObj(req->op.mod.message, SWIGTYPE_p_ldb_message, 0); - - if (py_msg == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - py_result = PyObject_CallMethod(py_ldb, "modify", "O", py_msg); - - Py_DECREF(py_msg); - - if (py_result == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - Py_DECREF(py_result); - - return LDB_SUCCESS; -} - -int py_module_del(struct ldb_module *mod, struct ldb_request *req) -{ - PyObject *py_ldb = mod->private_data; - PyObject *py_result, *py_dn; - - py_dn = SWIG_NewPointerObj(req->op.del.dn, SWIGTYPE_p_ldb_dn, 0); - - if (py_dn == NULL) - return LDB_ERR_OPERATIONS_ERROR; - - py_result = PyObject_CallMethod(py_ldb, "delete", "O", py_dn); - - if (py_result == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - Py_DECREF(py_result); - - return LDB_SUCCESS; -} - -int py_module_rename(struct ldb_module *mod, struct ldb_request *req) -{ - PyObject *py_ldb = mod->private_data; - PyObject *py_result, *py_olddn, *py_newdn; - - py_olddn = SWIG_NewPointerObj(req->op.rename.olddn, SWIGTYPE_p_ldb_dn, 0); - - if (py_olddn == NULL) - return LDB_ERR_OPERATIONS_ERROR; - - py_newdn = SWIG_NewPointerObj(req->op.rename.newdn, SWIGTYPE_p_ldb_dn, 0); - - if (py_newdn == NULL) - return LDB_ERR_OPERATIONS_ERROR; - - py_result = PyObject_CallMethod(py_ldb, "rename", "OO", py_olddn, py_newdn); - - Py_DECREF(py_olddn); - Py_DECREF(py_newdn); - - if (py_result == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - Py_DECREF(py_result); - - return LDB_SUCCESS; -} - -int py_module_request(struct ldb_module *mod, struct ldb_request *req) -{ - PyObject *py_ldb = mod->private_data; - PyObject *py_result; - - py_result = PyObject_CallMethod(py_ldb, "request", ""); - - return LDB_ERR_OPERATIONS_ERROR; -} - -int py_module_extended(struct ldb_module *mod, struct ldb_request *req) -{ - PyObject *py_ldb = mod->private_data; - PyObject *py_result; - - py_result = PyObject_CallMethod(py_ldb, "extended", ""); - - return LDB_ERR_OPERATIONS_ERROR; -} - -int py_module_start_transaction(struct ldb_module *mod) -{ - PyObject *py_ldb = mod->private_data; - PyObject *py_result; - - py_result = PyObject_CallMethod(py_ldb, "start_transaction", ""); - - if (py_result == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - Py_DECREF(py_result); - - return LDB_SUCCESS; -} - -int py_module_end_transaction(struct ldb_module *mod) -{ - PyObject *py_ldb = mod->private_data; - PyObject *py_result; - - py_result = PyObject_CallMethod(py_ldb, "end_transaction", ""); - - if (py_result == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - Py_DECREF(py_result); - - return LDB_SUCCESS; -} - -int py_module_del_transaction(struct ldb_module *mod) -{ - PyObject *py_ldb = mod->private_data; - PyObject *py_result; - - py_result = PyObject_CallMethod(py_ldb, "del_transaction", ""); - - if (py_result == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - Py_DECREF(py_result); - - return LDB_SUCCESS; -} - -static int py_module_destructor(void *_mod) -{ - struct ldb_module *mod = _mod; - Py_DECREF((PyObject *)mod->private_data); - return 0; -} - -int py_module_init (struct ldb_module *mod) -{ - PyObject *py_class = mod->ops->private_data; - PyObject *py_result, *py_next, *py_ldb; - - py_ldb = SWIG_NewPointerObj(mod->ldb, SWIGTYPE_p_ldb_context, 0); - - if (py_ldb == NULL) - return LDB_ERR_OPERATIONS_ERROR; - - py_next = SWIG_NewPointerObj(mod->next, SWIGTYPE_p_ldb_module, 0); - - if (py_next == NULL) - return LDB_ERR_OPERATIONS_ERROR; - - py_result = PyObject_CallFunction(py_class, "OO", py_ldb, py_next); - - if (py_result == NULL) { - return LDB_ERR_OPERATIONS_ERROR; - } - - mod->private_data = py_result; - - talloc_set_destructor (mod, py_module_destructor); - - return ldb_next_init(mod); -} -%} - -%typemap(in,noblock=1) const struct ldb_module_ops * { - $1 = talloc_zero(talloc_autofree_context(), struct ldb_module_ops); - - $1->name = talloc_strdup($1, PyString_AsString(PyObject_GetAttrString($input, (char *)"name"))); - - Py_INCREF($input); - $1->private_data = $input; - $1->init_context = py_module_init; - $1->search = py_module_search; - $1->add = py_module_add; - $1->modify = py_module_modify; - $1->del = py_module_del; - $1->rename = py_module_rename; - $1->request = py_module_request; - $1->extended = py_module_extended; - $1->start_transaction = py_module_start_transaction; - $1->end_transaction = py_module_end_transaction; - $1->del_transaction = py_module_del_transaction; -} - -%feature("docstring") ldb_register_module "S.register_module(module) -> None\n" - "Register a LDB module."; -%rename(register_module) ldb_register_module; -ldb_int_error ldb_register_module(const struct ldb_module_ops *); - -%pythoncode { -__docformat__ = "restructuredText" -open = Ldb -} -- cgit