summaryrefslogtreecommitdiff
path: root/source4/auth
diff options
context:
space:
mode:
Diffstat (limited to 'source4/auth')
-rw-r--r--source4/auth/gensec/gensec.c5
-rw-r--r--source4/auth/gensec/pygensec.c33
2 files changed, 30 insertions, 8 deletions
diff --git a/source4/auth/gensec/gensec.c b/source4/auth/gensec/gensec.c
index 3520585c95..7220d0e836 100644
--- a/source4/auth/gensec/gensec.c
+++ b/source4/auth/gensec/gensec.c
@@ -718,10 +718,9 @@ _PUBLIC_ const char *gensec_get_name_by_oid(struct gensec_security *gensec_secur
}
return oid_string;
}
-
-/**
- * Start a GENSEC sub-mechanism with a specifed mechansim structure, used in SPNEGO
+/**
+ * Start a GENSEC sub-mechanism with a specified mechansim structure, used in SPNEGO
*
*/
diff --git a/source4/auth/gensec/pygensec.c b/source4/auth/gensec/pygensec.c
index fc76fad1be..28441cc9ca 100644
--- a/source4/auth/gensec/pygensec.c
+++ b/source4/auth/gensec/pygensec.c
@@ -67,7 +67,7 @@ static struct gensec_settings *settings_from_object(TALLOC_CTX *mem_ctx, PyObjec
PyErr_SetString(PyExc_ValueError, "settings.lp_ctx not found");
return NULL;
}
-
+
s->target_hostname = PyString_AsString(py_hostname);
s->lp_ctx = lpcfg_from_py_object(s, py_lp_ctx);
return s;
@@ -81,6 +81,7 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
const char *kwnames[] = { "settings", NULL };
PyObject *py_settings;
struct tevent_context *ev;
+ struct gensec_security *gensec;
if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", discard_const_p(char *, kwnames), &py_settings))
return NULL;
@@ -101,7 +102,7 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
PyObject_DEL(self);
return NULL;
}
-
+
ev = tevent_context_init(self->talloc_ctx);
if (ev == NULL) {
PyErr_NoMemory();
@@ -116,13 +117,15 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
return NULL;
}
- status = gensec_client_start(self->talloc_ctx,
- (struct gensec_security **)&self->ptr, ev, settings);
+ status = gensec_client_start(self->talloc_ctx, &gensec, ev, settings);
if (!NT_STATUS_IS_OK(status)) {
PyErr_SetNTSTATUS(status);
PyObject_DEL(self);
return NULL;
}
+
+ self->ptr = gensec;
+
return (PyObject *)self;
}
@@ -132,7 +135,7 @@ static PyObject *py_gensec_session_info(PyObject *self)
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");
+ PyErr_SetString(PyExc_RuntimeError, "no mechanism selected");
return NULL;
}
status = gensec_session_info(security, &info);
@@ -145,6 +148,24 @@ static PyObject *py_gensec_session_info(PyObject *self)
Py_RETURN_NONE;
}
+static PyObject *py_gensec_start_mech_by_name(PyObject *self, PyObject *args)
+{
+ char *name;
+ struct gensec_security *security = (struct gensec_security *)py_talloc_get_ptr(self);
+ NTSTATUS status;
+
+ if (!PyArg_ParseTuple(args, "s", &name))
+ return NULL;
+
+ status = gensec_start_mech_by_name(security, name);
+ if (!NT_STATUS_IS_OK(status)) {
+ PyErr_SetNTSTATUS(status);
+ return NULL;
+ }
+
+ Py_RETURN_NONE;
+}
+
static PyMethodDef py_gensec_security_methods[] = {
{ "start_client", (PyCFunction)py_gensec_start_client, METH_VARARGS|METH_KEYWORDS|METH_CLASS,
"S.start_client(settings) -> gensec" },
@@ -152,6 +173,8 @@ static PyMethodDef py_gensec_security_methods[] = {
"S.start_server(auth_ctx, settings) -> gensec" },*/
{ "session_info", (PyCFunction)py_gensec_session_info, METH_NOARGS,
"S.session_info() -> info" },
+ { "start_mech_by_name", (PyCFunction)py_gensec_start_mech_by_name, METH_VARARGS,
+ "S.start_mech_by_name(name)" },
{ "get_name_by_authtype", (PyCFunction)py_get_name_by_authtype, METH_VARARGS,
"S.get_name_by_authtype(authtype) -> name\nLookup an auth type." },
{ NULL }