16
16
along with this program. If not, see <http://www.gnu.org/licenses/>.
19
20
#include "includes.h"
21
21
#include "pycredentials.h"
22
22
#include "param/param.h"
23
23
#include "lib/cmdline/credentials.h"
24
24
#include "librpc/gen_ndr/samr.h" /* for struct samr_Password */
25
25
#include "libcli/util/pyerrors.h"
26
26
#include "param/pyparam.h"
28
#ifndef Py_RETURN_NONE
29
#define Py_RETURN_NONE return Py_INCREF(Py_None), Py_None
32
29
static PyObject *PyString_FromStringOrNULL(const char *str)
196
static PyObject *py_creds_set_krb_forwardable(py_talloc_Object *self, PyObject *args)
199
if (!PyArg_ParseTuple(args, "i", &state))
202
cli_credentials_set_krb_forwardable(PyCredentials_AsCliCredentials(self), state);
199
206
static PyObject *py_creds_guess(py_talloc_Object *self, PyObject *args)
201
208
PyObject *py_lp_ctx = Py_None;
202
209
struct loadparm_context *lp_ctx;
211
struct cli_credentials *creds;
213
creds = PyCredentials_AsCliCredentials(self);
203
215
if (!PyArg_ParseTuple(args, "|O", &py_lp_ctx))
206
lp_ctx = lp_from_py_object(py_lp_ctx);
210
cli_credentials_guess(PyCredentials_AsCliCredentials(self), lp_ctx);
218
mem_ctx = talloc_new(NULL);
219
if (mem_ctx == NULL) {
224
lp_ctx = lpcfg_from_py_object(mem_ctx, py_lp_ctx);
225
if (lp_ctx == NULL) {
226
talloc_free(mem_ctx);
230
cli_credentials_guess(creds, lp_ctx);
232
talloc_free(mem_ctx);
217
239
PyObject *py_lp_ctx = Py_None;
218
240
struct loadparm_context *lp_ctx;
242
struct cli_credentials *creds;
245
creds = PyCredentials_AsCliCredentials(self);
220
247
if (!PyArg_ParseTuple(args, "|O", &py_lp_ctx))
223
lp_ctx = lp_from_py_object(py_lp_ctx);
227
status = cli_credentials_set_machine_account(PyCredentials_AsCliCredentials(self), lp_ctx);
250
mem_ctx = talloc_new(NULL);
251
if (mem_ctx == NULL) {
256
lp_ctx = lpcfg_from_py_object(mem_ctx, py_lp_ctx);
257
if (lp_ctx == NULL) {
258
talloc_free(mem_ctx);
262
status = cli_credentials_set_machine_account(creds, lp_ctx);
263
talloc_free(mem_ctx);
228
265
PyErr_NTSTATUS_IS_ERR_RAISE(status);
270
PyObject *PyCredentialCacheContainer_from_ccache_container(struct ccache_container *ccc)
272
PyCredentialCacheContainerObject *py_ret;
278
py_ret = (PyCredentialCacheContainerObject *)PyCredentialCacheContainer.tp_alloc(&PyCredentialCacheContainer, 0);
279
if (py_ret == NULL) {
283
py_ret->mem_ctx = talloc_new(NULL);
284
py_ret->ccc = talloc_reference(py_ret->mem_ctx, ccc);
285
return (PyObject *)py_ret;
289
static PyObject *py_creds_get_named_ccache(py_talloc_Object *self, PyObject *args)
291
PyObject *py_lp_ctx = Py_None;
293
struct loadparm_context *lp_ctx;
294
struct ccache_container *ccc;
295
struct tevent_context *event_ctx;
297
const char *error_string;
298
struct cli_credentials *creds;
301
creds = PyCredentials_AsCliCredentials(self);
303
if (!PyArg_ParseTuple(args, "|Os", &py_lp_ctx, &ccache_name))
306
mem_ctx = talloc_new(NULL);
307
if (mem_ctx == NULL) {
312
lp_ctx = lpcfg_from_py_object(mem_ctx, py_lp_ctx);
313
if (lp_ctx == NULL) {
314
talloc_free(mem_ctx);
318
event_ctx = tevent_context_init(mem_ctx);
320
ret = cli_credentials_get_named_ccache(creds, event_ctx, lp_ctx,
321
ccache_name, &ccc, &error_string);
322
talloc_unlink(mem_ctx, lp_ctx);
324
talloc_steal(ccc, event_ctx);
325
talloc_free(mem_ctx);
326
return PyCredentialCacheContainer_from_ccache_container(ccc);
329
PyErr_SetString(PyExc_RuntimeError, error_string?error_string:"NULL");
331
talloc_free(mem_ctx);
335
static PyObject *py_creds_set_gensec_features(py_talloc_Object *self, PyObject *args)
337
unsigned int gensec_features;
339
if (!PyArg_ParseTuple(args, "I", &gensec_features))
342
cli_credentials_set_gensec_features(PyCredentials_AsCliCredentials(self), gensec_features);
347
static PyObject *py_creds_get_gensec_features(py_talloc_Object *self, PyObject *args)
349
unsigned int gensec_features;
351
gensec_features = cli_credentials_get_gensec_features(PyCredentials_AsCliCredentials(self));
352
return PyInt_FromLong(gensec_features);
233
356
static PyMethodDef py_creds_methods[] = {
234
357
{ "get_username", (PyCFunction)py_creds_get_username, METH_NOARGS,
235
358
"S.get_username() -> username\nObtain username." },
285
408
{ "set_kerberos_state", (PyCFunction)py_creds_set_kerberos_state, METH_VARARGS,
410
{ "set_krb_forwardable", (PyCFunction)py_creds_set_krb_forwardable, METH_VARARGS,
287
412
{ "guess", (PyCFunction)py_creds_guess, METH_VARARGS, NULL },
288
413
{ "set_machine_account", (PyCFunction)py_creds_set_machine_account, METH_VARARGS, NULL },
414
{ "get_named_ccache", (PyCFunction)py_creds_get_named_ccache, METH_VARARGS, NULL },
415
{ "set_gensec_features", (PyCFunction)py_creds_set_gensec_features, METH_VARARGS, NULL },
416
{ "get_gensec_features", (PyCFunction)py_creds_get_gensec_features, METH_NOARGS, NULL },
292
420
PyTypeObject PyCredentials = {
293
421
.tp_name = "Credentials",
294
422
.tp_basicsize = sizeof(py_talloc_Object),
295
.tp_dealloc = py_talloc_dealloc,
296
423
.tp_new = py_creds_new,
297
424
.tp_flags = Py_TPFLAGS_DEFAULT,
298
425
.tp_methods = py_creds_methods,
429
PyTypeObject PyCredentialCacheContainer = {
430
.tp_name = "CredentialCacheContainer",
431
.tp_basicsize = sizeof(py_talloc_Object),
432
.tp_flags = Py_TPFLAGS_DEFAULT,
301
435
void initcredentials(void)
438
PyTypeObject *talloc_type = PyTalloc_GetObjectType();
439
if (talloc_type == NULL)
442
PyCredentials.tp_base = PyCredentialCacheContainer.tp_base = talloc_type;
305
444
if (PyType_Ready(&PyCredentials) < 0)
447
if (PyType_Ready(&PyCredentialCacheContainer) < 0)
308
450
m = Py_InitModule3("credentials", NULL, "Credentials management.");
313
455
PyModule_AddObject(m, "DONT_USE_KERBEROS", PyInt_FromLong(CRED_DONT_USE_KERBEROS));
314
456
PyModule_AddObject(m, "MUST_USE_KERBEROS", PyInt_FromLong(CRED_MUST_USE_KERBEROS));
458
PyModule_AddObject(m, "AUTO_KRB_FORWARDABLE", PyInt_FromLong(CRED_AUTO_KRB_FORWARDABLE));
459
PyModule_AddObject(m, "NO_KRB_FORWARDABLE", PyInt_FromLong(CRED_NO_KRB_FORWARDABLE));
460
PyModule_AddObject(m, "FORCE_KRB_FORWARDABLE", PyInt_FromLong(CRED_FORCE_KRB_FORWARDABLE));
316
462
Py_INCREF(&PyCredentials);
317
463
PyModule_AddObject(m, "Credentials", (PyObject *)&PyCredentials);
464
Py_INCREF(&PyCredentialCacheContainer);
465
PyModule_AddObject(m, "CredentialCacheContainer", (PyObject *)&PyCredentialCacheContainer);