diff options
Diffstat (limited to 'source4/auth/gensec/pygensec.c')
-rw-r--r-- | source4/auth/gensec/pygensec.c | 57 |
1 files changed, 50 insertions, 7 deletions
diff --git a/source4/auth/gensec/pygensec.c b/source4/auth/gensec/pygensec.c index efa97e0184..d6d1f63ef1 100644 --- a/source4/auth/gensec/pygensec.c +++ b/source4/auth/gensec/pygensec.c @@ -19,8 +19,10 @@ #include "includes.h" #include <Python.h> #include "param/param.h" +#include "param/pyparam.h" #include "auth/gensec/gensec.h" #include "libcli/util/pyerrors.h" +#include "scripting/python/modules.h" #include "pytalloc.h" #include <tevent.h> @@ -46,9 +48,35 @@ static PyObject *py_get_name_by_authtype(PyObject *self, PyObject *args) return PyString_FromString(name); } -static struct gensec_settings *settings_from_object(PyObject *object) +static struct gensec_settings *settings_from_object(TALLOC_CTX *mem_ctx, PyObject *object) { - return NULL; /* FIXME */ + struct gensec_settings *s; + PyObject *py_hostname, *py_lp_ctx; + + if (!PyDict_Check(object)) { + PyErr_SetString(PyExc_ValueError, "settings should be a dictionary"); + return NULL; + } + + s = talloc_zero(mem_ctx, struct gensec_settings); + if (!s) return NULL; + + py_hostname = PyDict_GetItemString(object, "target_hostname"); + if (!py_hostname) { + PyErr_SetString(PyExc_ValueError, "settings.target_hostname not found"); + return NULL; + } + + py_lp_ctx = PyDict_GetItemString(object, "lp_ctx"); + if (!py_lp_ctx) { + PyErr_SetString(PyExc_ValueError, "settings.lp_ctx not found"); + return NULL; + } + + s->target_hostname = PyString_AsString(py_hostname); + s->lp_ctx = lp_from_py_object(py_lp_ctx); + s->iconv_convenience = py_iconv_convenience(s); + return s; } static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyObject *kwargs) @@ -60,13 +88,9 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb PyObject *py_settings; struct tevent_context *ev; - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", kwnames, &py_settings)) + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", discard_const_p(char *, kwnames), &py_settings)) return NULL; - settings = settings_from_object(py_settings); - if (settings == NULL) - return NULL; - self = (py_talloc_Object*)type->tp_alloc(type, 0); if (self == NULL) { PyErr_NoMemory(); @@ -77,12 +101,27 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb PyErr_NoMemory(); return NULL; } + + settings = settings_from_object(self->talloc_ctx, py_settings); + if (settings == NULL) { + PyObject_DEL(self); + return NULL; + } + ev = tevent_context_init(self->talloc_ctx); if (ev == NULL) { PyErr_NoMemory(); PyObject_Del(self); return NULL; } + + status = gensec_init(settings->lp_ctx); + if (!NT_STATUS_IS_OK(status)) { + PyErr_SetNTSTATUS(status); + PyObject_DEL(self); + return NULL; + } + status = gensec_client_start(self->talloc_ctx, (struct gensec_security **)&self->ptr, ev, settings); if (!NT_STATUS_IS_OK(status)) { @@ -98,6 +137,10 @@ static PyObject *py_gensec_session_info(PyObject *self) NTSTATUS status; struct gensec_security *security = (struct gensec_security *)py_talloc_get_ptr(self); struct auth_session_info *info; + if (security->ops == NULL) { + PyErr_SetString(PyExc_ValueError, "gensec not fully initialised - ask Andrew"); + return NULL; + } status = gensec_session_info(security, &info); if (NT_STATUS_IS_ERR(status)) { PyErr_SetNTSTATUS(status); |