2
Unix SMB/CIFS implementation.
3
Copyright (C) Jelmer Vernooij <jelmer@samba.org> 2007
5
This program is free software; you can redistribute it and/or modify
6
it under the terms of the GNU General Public License as published by
7
the Free Software Foundation; either version 3 of the License, or
8
(at your option) any later version.
10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
GNU General Public License for more details.
15
You should have received a copy of the GNU General Public License
16
along with this program. If not, see <http://www.gnu.org/licenses/>.
21
#include "ldb_errors.h"
22
#include "param/param.h"
23
#include "auth/credentials/credentials.h"
24
#include "dsdb/samdb/samdb.h"
25
#include "lib/ldb-samba/ldif_handlers.h"
26
#include "librpc/ndr/libndr.h"
29
#include "lib/ldb/pyldb.h"
30
#include "libcli/util/pyerrors.h"
31
#include "libcli/security/security.h"
32
#include "auth/pyauth.h"
33
#include "param/pyparam.h"
35
#ifndef Py_RETURN_NONE
36
#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
39
/* FIXME: These should be in a header file somewhere, once we finish moving
40
* away from SWIG .. */
41
extern struct cli_credentials *cli_credentials_from_py_object(PyObject *py_obj);
43
#define PyErr_LDB_OR_RAISE(py_ldb, ldb) \
44
if (!PyLdb_Check(py_ldb)) { \
45
/*PyErr_SetString(PyExc_TypeError, "Ldb connection object required"); \
48
ldb = PyLdb_AsLdbContext(py_ldb);
51
static PyObject *py_generate_random_str(PyObject *self, PyObject *args)
56
if (!PyArg_ParseTuple(args, "i", &len))
59
retstr = generate_random_str(NULL, len);
60
ret = PyString_FromString(retstr);
65
static PyObject *py_unix2nttime(PyObject *self, PyObject *args)
69
if (!PyArg_ParseTuple(args, "I", &t))
72
unix_to_nt_time(&nt, t);
74
return PyInt_FromLong((uint64_t)nt);
77
static PyObject *py_ldb_set_credentials(PyObject *self, PyObject *args)
79
PyObject *py_creds, *py_ldb;
80
struct cli_credentials *creds;
81
struct ldb_context *ldb;
82
if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_creds))
85
PyErr_LDB_OR_RAISE(py_ldb, ldb);
87
creds = cli_credentials_from_py_object(py_creds);
89
PyErr_SetString(PyExc_TypeError, "Expected credentials object");
93
ldb_set_opaque(ldb, "credentials", creds);
98
static PyObject *py_ldb_set_loadparm(PyObject *self, PyObject *args)
100
PyObject *py_lp_ctx, *py_ldb;
101
struct loadparm_context *lp_ctx;
102
struct ldb_context *ldb;
103
if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_lp_ctx))
106
PyErr_LDB_OR_RAISE(py_ldb, ldb);
108
lp_ctx = lp_from_py_object(py_lp_ctx);
109
if (lp_ctx == NULL) {
110
PyErr_SetString(PyExc_TypeError, "Expected loadparm object");
114
ldb_set_opaque(ldb, "loadparm", lp_ctx);
120
static PyObject *py_ldb_set_session_info(PyObject *self, PyObject *args)
122
PyObject *py_session_info, *py_ldb;
123
struct auth_session_info *info;
124
struct ldb_context *ldb;
125
if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_session_info))
128
PyErr_LDB_OR_RAISE(py_ldb, ldb);
129
/*if (!PyAuthSession_Check(py_session_info)) {
130
PyErr_SetString(PyExc_TypeError, "Expected session info object");
134
info = PyAuthSession_AsSession(py_session_info);
136
ldb_set_opaque(ldb, "sessionInfo", info);
141
static PyObject *py_samdb_set_domain_sid(PyLdbObject *self, PyObject *args)
143
PyObject *py_ldb, *py_sid;
144
struct ldb_context *ldb;
148
if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_sid))
151
PyErr_LDB_OR_RAISE(py_ldb, ldb);
153
sid = dom_sid_parse_talloc(NULL, PyString_AsString(py_sid));
155
ret = samdb_set_domain_sid(ldb, sid);
157
PyErr_SetString(PyExc_RuntimeError, "set_domain_sid failed");
163
static PyObject *py_ldb_register_samba_handlers(PyObject *self, PyObject *args)
166
struct ldb_context *ldb;
169
if (!PyArg_ParseTuple(args, "O", &py_ldb))
172
PyErr_LDB_OR_RAISE(py_ldb, ldb);
173
ret = ldb_register_samba_handlers(ldb);
175
PyErr_LDB_ERROR_IS_ERR_RAISE(ret, ldb);
179
static PyObject *py_dsdb_set_ntds_invocation_id(PyObject *self, PyObject *args)
181
PyObject *py_ldb, *py_guid;
184
struct ldb_context *ldb;
185
if (!PyArg_ParseTuple(args, "OO", &py_ldb, &py_guid))
188
PyErr_LDB_OR_RAISE(py_ldb, ldb);
189
GUID_from_string(PyString_AsString(py_guid), &guid);
191
ret = samdb_set_ntds_invocation_id(ldb, &guid);
193
PyErr_SetString(PyExc_RuntimeError, "set_ntds_invocation_id failed");
199
static PyObject *py_dsdb_set_global_schema(PyObject *self, PyObject *args)
202
struct ldb_context *ldb;
204
if (!PyArg_ParseTuple(args, "O", &py_ldb))
207
PyErr_LDB_OR_RAISE(py_ldb, ldb);
209
ret = dsdb_set_global_schema(ldb);
210
PyErr_LDB_ERROR_IS_ERR_RAISE(ret, ldb);
215
static PyObject *py_dsdb_attach_schema_from_ldif_file(PyObject *self, PyObject *args)
220
struct ldb_context *ldb;
222
if (!PyArg_ParseTuple(args, "Oss", &py_ldb, &pf, &df))
225
PyErr_LDB_OR_RAISE(py_ldb, ldb);
227
result = dsdb_attach_schema_from_ldif_file(ldb, pf, df);
228
PyErr_WERROR_IS_ERR_RAISE(result);
233
static PyMethodDef py_misc_methods[] = {
234
{ "generate_random_str", (PyCFunction)py_generate_random_str, METH_VARARGS,
235
"random_password(len) -> string\n"
236
"Generate random password with specified length." },
237
{ "unix2nttime", (PyCFunction)py_unix2nttime, METH_VARARGS,
238
"unix2nttime(timestamp) -> nttime" },
239
{ "ldb_set_credentials", (PyCFunction)py_ldb_set_credentials, METH_VARARGS,
240
"ldb_set_credentials(ldb, credentials) -> None\n"
241
"Set credentials to use when connecting." },
242
{ "ldb_set_session_info", (PyCFunction)py_ldb_set_session_info, METH_VARARGS,
243
"ldb_set_session_info(ldb, session_info)\n"
244
"Set session info to use when connecting." },
245
{ "ldb_set_loadparm", (PyCFunction)py_ldb_set_loadparm, METH_VARARGS,
246
"ldb_set_loadparm(ldb, session_info)\n"
247
"Set loadparm context to use when connecting." },
248
{ "samdb_set_domain_sid", (PyCFunction)py_samdb_set_domain_sid, METH_VARARGS,
249
"samdb_set_domain_sid(samdb, sid)\n"
250
"Set SID of domain to use." },
251
{ "ldb_register_samba_handlers", (PyCFunction)py_ldb_register_samba_handlers, METH_VARARGS,
252
"ldb_register_samba_handlers(ldb)\n"
253
"Register Samba-specific LDB modules and schemas." },
254
{ "dsdb_set_ntds_invocation_id", (PyCFunction)py_dsdb_set_ntds_invocation_id, METH_VARARGS,
256
{ "dsdb_set_global_schema", (PyCFunction)py_dsdb_set_global_schema, METH_VARARGS,
258
{ "dsdb_attach_schema_from_ldif_file", (PyCFunction)py_dsdb_attach_schema_from_ldif_file, METH_VARARGS,
267
m = Py_InitModule3("glue", py_misc_methods,
268
"Python bindings for miscellaneous Samba functions.");
272
PyModule_AddObject(m, "version", PyString_FromString(SAMBA_VERSION_STRING));