1 | /*
|
---|
2 | Unix SMB/CIFS implementation.
|
---|
3 |
|
---|
4 | Python interface to ldb - utility functions.
|
---|
5 |
|
---|
6 | Copyright (C) 2007-2010 Jelmer Vernooij <jelmer@samba.org>
|
---|
7 |
|
---|
8 | ** NOTE! The following LGPL license applies to the ldb
|
---|
9 | ** library. This does NOT imply that all of Samba is released
|
---|
10 | ** under the LGPL
|
---|
11 |
|
---|
12 | This library is free software; you can redistribute it and/or
|
---|
13 | modify it under the terms of the GNU Lesser General Public
|
---|
14 | License as published by the Free Software Foundation; either
|
---|
15 | version 3 of the License, or (at your option) any later version.
|
---|
16 |
|
---|
17 | This library is distributed in the hope that it will be useful,
|
---|
18 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
19 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
---|
20 | Lesser General Public License for more details.
|
---|
21 |
|
---|
22 | You should have received a copy of the GNU Lesser General Public
|
---|
23 | License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
---|
24 | */
|
---|
25 |
|
---|
26 | #include <Python.h>
|
---|
27 | #include "ldb.h"
|
---|
28 | #include "pyldb.h"
|
---|
29 |
|
---|
30 | static PyObject *ldb_module = NULL;
|
---|
31 |
|
---|
32 | /* There's no Py_ssize_t in 2.4, apparently */
|
---|
33 | #if PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5
|
---|
34 | typedef int Py_ssize_t;
|
---|
35 | typedef inquiry lenfunc;
|
---|
36 | typedef intargfunc ssizeargfunc;
|
---|
37 | #endif
|
---|
38 |
|
---|
39 | #ifndef Py_RETURN_NONE
|
---|
40 | #define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
|
---|
41 | #endif
|
---|
42 |
|
---|
43 |
|
---|
44 | /**
|
---|
45 | * Find out PyTypeObject in ldb module for a given typename
|
---|
46 | */
|
---|
47 | static PyTypeObject * PyLdb_GetPyType(const char *typename)
|
---|
48 | {
|
---|
49 | PyObject *py_obj = NULL;
|
---|
50 |
|
---|
51 | if (ldb_module == NULL) {
|
---|
52 | ldb_module = PyImport_ImportModule("ldb");
|
---|
53 | if (ldb_module == NULL) {
|
---|
54 | return NULL;
|
---|
55 | }
|
---|
56 | }
|
---|
57 |
|
---|
58 | py_obj = PyObject_GetAttrString(ldb_module, typename);
|
---|
59 |
|
---|
60 | return (PyTypeObject*)py_obj;
|
---|
61 | }
|
---|
62 |
|
---|
63 | /**
|
---|
64 | * Obtain a ldb DN from a Python object.
|
---|
65 | *
|
---|
66 | * @param mem_ctx Memory context
|
---|
67 | * @param object Python object
|
---|
68 | * @param ldb_ctx LDB context
|
---|
69 | * @return Whether or not the conversion succeeded
|
---|
70 | */
|
---|
71 | bool PyObject_AsDn(TALLOC_CTX *mem_ctx, PyObject *object,
|
---|
72 | struct ldb_context *ldb_ctx, struct ldb_dn **dn)
|
---|
73 | {
|
---|
74 | struct ldb_dn *odn;
|
---|
75 | PyTypeObject *PyLdb_Dn_Type;
|
---|
76 |
|
---|
77 | if (ldb_ctx != NULL && PyString_Check(object)) {
|
---|
78 | odn = ldb_dn_new(mem_ctx, ldb_ctx, PyString_AsString(object));
|
---|
79 | *dn = odn;
|
---|
80 | return true;
|
---|
81 | }
|
---|
82 |
|
---|
83 | PyLdb_Dn_Type = PyLdb_GetPyType("Dn");
|
---|
84 | if (PyLdb_Dn_Type == NULL) {
|
---|
85 | return false;
|
---|
86 | }
|
---|
87 |
|
---|
88 | if (PyObject_TypeCheck(object, PyLdb_Dn_Type)) {
|
---|
89 | *dn = PyLdbDn_AsDn(object);
|
---|
90 | return true;
|
---|
91 | }
|
---|
92 |
|
---|
93 | PyErr_SetString(PyExc_TypeError, "Expected DN");
|
---|
94 | return false;
|
---|
95 | }
|
---|
96 |
|
---|
97 | PyObject *PyLdbDn_FromDn(struct ldb_dn *dn)
|
---|
98 | {
|
---|
99 | PyLdbDnObject *py_ret;
|
---|
100 | PyTypeObject *PyLdb_Dn_Type;
|
---|
101 |
|
---|
102 | if (dn == NULL) {
|
---|
103 | Py_RETURN_NONE;
|
---|
104 | }
|
---|
105 |
|
---|
106 | PyLdb_Dn_Type = PyLdb_GetPyType("Dn");
|
---|
107 | if (PyLdb_Dn_Type == NULL) {
|
---|
108 | return NULL;
|
---|
109 | }
|
---|
110 |
|
---|
111 | py_ret = (PyLdbDnObject *)PyLdb_Dn_Type->tp_alloc(PyLdb_Dn_Type, 0);
|
---|
112 | if (py_ret == NULL) {
|
---|
113 | PyErr_NoMemory();
|
---|
114 | return NULL;
|
---|
115 | }
|
---|
116 | py_ret->mem_ctx = talloc_new(NULL);
|
---|
117 | py_ret->dn = talloc_reference(py_ret->mem_ctx, dn);
|
---|
118 | return (PyObject *)py_ret;
|
---|
119 | }
|
---|