[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Tue Jan 18 03:42:02 MST 2011


The branch, master has been updated
       via  a1e1f02 s4-gensec Extend python bindings for GENSEC and the associated test
       via  24a4b9a s4-auth Extend python bindings to allow ldb and message to be specified
       via  08051ae s4-pygensec Fix indentation of py_gensec_start_mech_by_name()
       via  489e337 s4-torture Remove unused temp dirs from the RPC-PAC test.
       via  4e2e5ea s4-pyldb Fix tp_basicsize for PyLdbDn
       via  147f075 s4-pygensec Add bindings for server_start() and update()
       via  969c1b5 s4-pyauth Add bindings for auth_context_create() as AuthContext()
       via  017fbcd s4-pyauth Use py_talloc_get_type() for greater talloc binding safety
       via  9b643c8 s4-gensec Don't steal the auth_context, reference it.
      from  d5173ca pidl:wscript: don't warn about pidl gammar file changes for now

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit a1e1f02efea3a6c1f419a7d93498718d46636d2b
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Jan 18 19:14:45 2011 +1100

    s4-gensec Extend python bindings for GENSEC and the associated test
    
    This now tests a real GENSEC exchange, including wrap and unwrap,
    using GSSAPI.  Therefore, it now needs to access a KDC.
    
    Andrew Bartlett
    
    Autobuild-User: Andrew Bartlett <abartlet at samba.org>
    Autobuild-Date: Tue Jan 18 11:41:26 CET 2011 on sn-devel-104

commit 24a4b9a7387f75c6d6a922800bef9b2178747f86
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Tue Jan 18 19:13:19 2011 +1100

    s4-auth Extend python bindings to allow ldb and message to be specified
    
    This will allow for some more tokenGroups tests in future.
    
    Andrew Bartlett

commit 08051ae29e53e83844bffb67bfe8ecf1cf4dc887
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Jan 17 16:26:21 2011 +1100

    s4-pygensec Fix indentation of py_gensec_start_mech_by_name()

commit 489e3372d629a56b8f6c433f99ae750d16eecc2c
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Jan 17 16:24:16 2011 +1100

    s4-torture Remove unused temp dirs from the RPC-PAC test.
    
    The code previously required the creation of a messaging context, but
    this isn't done any more, so we don't need the tmp dir to put it in.
    
    Andrew Bartlett

commit 4e2e5eafb2dfd60fcddd27efa95ff17a52311fec
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Jan 17 16:23:23 2011 +1100

    s4-pyldb Fix tp_basicsize for PyLdbDn
    
    This wasn't actually causing problems before, as the structures were
    the same size.
    
    Andrew Bartlett

commit 147f075c471d26bcf7d9e9ecafb88ff102414de4
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Jan 17 16:23:02 2011 +1100

    s4-pygensec Add bindings for server_start() and update()

commit 969c1b58eb325d4741097c1f7b9a81c67b23270d
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Jan 17 16:22:31 2011 +1100

    s4-pyauth Add bindings for auth_context_create() as AuthContext()

commit 017fbcdd101b3e8503ce643202fdbaa6d076a995
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Jan 17 16:21:28 2011 +1100

    s4-pyauth Use py_talloc_get_type() for greater talloc binding safety
    
    This does a talloc check of the returned pointer before casting it.
    
    Andrew Bartlett

commit 9b643c8c83bda42b5f8ad1d9ca0419e1e1c0e372
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Mon Jan 17 16:20:09 2011 +1100

    s4-gensec Don't steal the auth_context, reference it.
    
    We don't want to steal this pointer away from the caller if it's been
    set up from python.
    
    Andrew Bartlett

-----------------------------------------------------------------------

Summary of changes:
 source4/auth/auth.h                            |    1 +
 source4/auth/gensec/gensec.c                   |    8 +-
 source4/auth/gensec/pygensec.c                 |  345 ++++++++++++++++++++++--
 source4/auth/ntlm/auth.c                       |    2 +-
 source4/auth/pyauth.c                          |  141 +++++++++-
 source4/auth/samba_server_gensec.c             |   15 +-
 source4/auth/wscript_build                     |    2 +-
 source4/lib/ldb/pyldb.c                        |    2 +-
 source4/scripting/python/samba/tests/gensec.py |   57 ++++-
 source4/selftest/tests.py                      |    2 +-
 source4/torture/rpc/remote_pac.c               |    9 -
 11 files changed, 529 insertions(+), 55 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/auth/auth.h b/source4/auth/auth.h
index 33c398d..6d3dede 100644
--- a/source4/auth/auth.h
+++ b/source4/auth/auth.h
@@ -233,6 +233,7 @@ NTSTATUS auth_context_create_methods(TALLOC_CTX *mem_ctx, const char **methods,
 				     struct loadparm_context *lp_ctx,
 				     struct ldb_context *sam_ctx,
 				     struct auth_context **auth_ctx);
+const char **auth_methods_from_lp(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx);
 
 NTSTATUS auth_context_create(TALLOC_CTX *mem_ctx,
 			     struct tevent_context *ev,
diff --git a/source4/auth/gensec/gensec.c b/source4/auth/gensec/gensec.c
index 3c25f3b..c732c6e 100644
--- a/source4/auth/gensec/gensec.c
+++ b/source4/auth/gensec/gensec.c
@@ -507,7 +507,7 @@ const char **gensec_security_oids(struct gensec_security *gensec_security,
   @param mem_ctx The parent TALLOC memory context.
   @param gensec_security Returned GENSEC context pointer.
   @note  The mem_ctx is only a parent and may be NULL.
-  @note, the auth context is moved to be a child of the
+  @note, the auth context is moved to be a referenced pointer of the
   @ gensec_security return 
 */
 static NTSTATUS gensec_start(TALLOC_CTX *mem_ctx, 
@@ -527,7 +527,11 @@ static NTSTATUS gensec_start(TALLOC_CTX *mem_ctx,
 	(*gensec_security)->event_ctx = ev;
 	SMB_ASSERT(settings->lp_ctx != NULL);
 	(*gensec_security)->settings = talloc_reference(*gensec_security, settings);
-	(*gensec_security)->auth_context = talloc_steal(*gensec_security, auth_context);
+
+	/* We need to reference this, not steal, as the caller may be
+	 * python, which won't like it if we steal it's object away
+	 * from it */
+	(*gensec_security)->auth_context = talloc_reference(*gensec_security, auth_context);
 
 	return NT_STATUS_OK;
 }
diff --git a/source4/auth/gensec/pygensec.c b/source4/auth/gensec/pygensec.c
index e16ba37..da62018 100644
--- a/source4/auth/gensec/pygensec.c
+++ b/source4/auth/gensec/pygensec.c
@@ -20,10 +20,12 @@
 #include "includes.h"
 #include "param/pyparam.h"
 #include "auth/gensec/gensec.h"
+#include "auth/credentials/pycredentials.h"
 #include "libcli/util/pyerrors.h"
 #include "scripting/python/modules.h"
 #include "lib/talloc/pytalloc.h"
 #include <tevent.h>
+#include "librpc/rpc/pyrpc_util.h"
 
 static PyObject *py_get_name_by_authtype(PyObject *self, PyObject *args)
 {
@@ -34,7 +36,7 @@ static PyObject *py_get_name_by_authtype(PyObject *self, PyObject *args)
 	if (!PyArg_ParseTuple(args, "i", &type))
 		return NULL;
 
-	security = (struct gensec_security *)py_talloc_get_ptr(self);
+	security = py_talloc_get_type(self, struct gensec_security);
 
 	name = gensec_get_name_by_authtype(security, type);
 	if (name == NULL)
@@ -83,7 +85,7 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
 	struct tevent_context *ev;
 	struct gensec_security *gensec;
 
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", discard_const_p(char *, kwnames), &py_settings))
+	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O", discard_const_p(char *, kwnames), &py_settings))
 		return NULL;
 
 	self = (py_talloc_Object*)type->tp_alloc(type, 0);
@@ -97,12 +99,90 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
 		return NULL;
 	}
 
-	settings = settings_from_object(self->talloc_ctx, py_settings);
-	if (settings == NULL) {
+	if (py_settings != Py_None) {
+		settings = settings_from_object(self->talloc_ctx, py_settings);
+		if (settings == NULL) {
+			PyObject_DEL(self);
+			return NULL;
+		}
+	} else {
+		settings = talloc_zero(self->talloc_ctx, struct gensec_settings);
+		if (settings == NULL) {
+			PyObject_DEL(self);
+			return NULL;
+		}
+
+		settings->lp_ctx = loadparm_init_global(true);
+	}
+
+	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, &gensec, ev, settings);
+	if (!NT_STATUS_IS_OK(status)) {
+		PyErr_SetNTSTATUS(status);
 		PyObject_DEL(self);
 		return NULL;
 	}
 
+	self->ptr = gensec;
+
+	return (PyObject *)self;
+}
+
+static PyObject *py_gensec_start_server(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+	NTSTATUS status;
+	py_talloc_Object *self;
+	struct gensec_settings *settings = NULL;
+	const char *kwnames[] = { "settings", "auth_context", NULL };
+	PyObject *py_settings = Py_None;
+	PyObject *py_auth_context = Py_None;
+	struct tevent_context *ev;
+	struct gensec_security *gensec;
+	struct auth_context *auth_context = NULL;
+
+	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OO", discard_const_p(char *, kwnames), &py_settings, &py_auth_context))
+		return NULL;
+
+	self = (py_talloc_Object*)type->tp_alloc(type, 0);
+	if (self == NULL) {
+		PyErr_NoMemory();
+		return NULL;
+	}
+	self->talloc_ctx = talloc_new(NULL);
+	if (self->talloc_ctx == NULL) {
+		PyErr_NoMemory();
+		return NULL;
+	}
+
+	if (py_settings != Py_None) {
+		settings = settings_from_object(self->talloc_ctx, py_settings);
+		if (settings == NULL) {
+			PyObject_DEL(self);
+			return NULL;
+		}
+	} else {
+		settings = talloc_zero(self->talloc_ctx, struct gensec_settings);
+		if (settings == NULL) {
+			PyObject_DEL(self);
+			return NULL;
+		}
+
+		settings->lp_ctx = loadparm_init_global(true);
+	}
+
 	ev = tevent_context_init(self->talloc_ctx);
 	if (ev == NULL) {
 		PyErr_NoMemory();
@@ -110,6 +190,16 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
 		return NULL;
 	}
 
+	if (py_auth_context != Py_None) {
+		auth_context = py_talloc_get_type(py_auth_context, struct auth_context);
+		if (!auth_context) {
+			PyErr_Format(PyExc_TypeError,
+				     "Expected auth.AuthContext for auth_context argument, got %s",
+				     talloc_get_name(py_talloc_get_ptr(py_auth_context)));
+			return NULL;
+		}
+	}
+
 	status = gensec_init(settings->lp_ctx);
 	if (!NT_STATUS_IS_OK(status)) {
 		PyErr_SetNTSTATUS(status);
@@ -117,7 +207,7 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
 		return NULL;
 	}
 
-	status = gensec_client_start(self->talloc_ctx, &gensec, ev, settings);
+	status = gensec_server_start(self->talloc_ctx, ev, settings, auth_context, &gensec);
 	if (!NT_STATUS_IS_OK(status)) {
 		PyErr_SetNTSTATUS(status);
 		PyObject_DEL(self);
@@ -129,10 +219,37 @@ static PyObject *py_gensec_start_client(PyTypeObject *type, PyObject *args, PyOb
 	return (PyObject *)self;
 }
 
+static PyObject *py_gensec_set_credentials(PyObject *self, PyObject *args)
+{
+	PyObject *py_creds = Py_None;
+	struct cli_credentials *creds;
+	struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
+	NTSTATUS status;
+
+	if (!PyArg_ParseTuple(args, "O", &py_creds))
+		return NULL;
+
+	creds = PyCredentials_AsCliCredentials(py_creds);
+	if (!creds) {
+		PyErr_Format(PyExc_TypeError,
+			     "Expected samba.credentaials for credentials argument got  %s",
+			     talloc_get_name(py_talloc_get_ptr(py_creds)));
+	}
+
+	status = gensec_set_credentials(security, creds);
+	if (!NT_STATUS_IS_OK(status)) {
+		PyErr_SetNTSTATUS(status);
+		return NULL;
+	}
+
+	Py_RETURN_NONE;
+}
+
 static PyObject *py_gensec_session_info(PyObject *self)
 {
 	NTSTATUS status;
-	struct gensec_security *security = (struct gensec_security *)py_talloc_get_ptr(self);
+	PyObject *py_session_info;
+	struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
 	struct auth_session_info *info;
 	if (security->ops == NULL) {
 		PyErr_SetString(PyExc_RuntimeError, "no mechanism selected");
@@ -144,32 +261,51 @@ static PyObject *py_gensec_session_info(PyObject *self)
 		return NULL;
 	}
 
-	/* FIXME */
-	Py_RETURN_NONE;
+	py_session_info = py_return_ndr_struct("samba.auth", "AuthSession",
+						 info, info);
+	return py_session_info;
 }
 
 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;
+	char *name;
+	struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
+	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 PyObject *py_gensec_start_mech_by_sasl_name(PyObject *self, PyObject *args)
+{
+	char *sasl_name;
+	struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
+	NTSTATUS status;
 
-    if (!PyArg_ParseTuple(args, "s", &name))
-        return NULL;
+	if (!PyArg_ParseTuple(args, "s", &sasl_name))
+		return NULL;
 
-    status = gensec_start_mech_by_name(security, name);
-    if (!NT_STATUS_IS_OK(status)) {
-        PyErr_SetNTSTATUS(status);
-        return NULL;
-    }
+	status = gensec_start_mech_by_sasl_name(security, sasl_name);
+	if (!NT_STATUS_IS_OK(status)) {
+		PyErr_SetNTSTATUS(status);
+		return NULL;
+	}
 
-    Py_RETURN_NONE;
+	Py_RETURN_NONE;
 }
 
 static PyObject *py_gensec_start_mech_by_authtype(PyObject *self, PyObject *args)
 {
 	int authtype, level;
-    struct gensec_security *security = (struct gensec_security *)py_talloc_get_ptr(self);
+	struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
 	NTSTATUS status;
 	if (!PyArg_ParseTuple(args, "ii", &authtype, &level))
 		return NULL;
@@ -183,18 +319,179 @@ static PyObject *py_gensec_start_mech_by_authtype(PyObject *self, PyObject *args
 	Py_RETURN_NONE;
 }
 
+static PyObject *py_gensec_want_feature(PyObject *self, PyObject *args)
+{
+	int feature;
+	struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
+	/* This is i (and declared as an int above) by design, as they are handled as an integer in python */
+	if (!PyArg_ParseTuple(args, "i", &feature))
+		return NULL;
+
+	gensec_want_feature(security, feature);
+
+	Py_RETURN_NONE;
+}
+
+static PyObject *py_gensec_have_feature(PyObject *self, PyObject *args)
+{
+	int feature;
+	struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
+	/* This is i (and declared as an int above) by design, as they are handled as an integer in python */
+	if (!PyArg_ParseTuple(args, "i", &feature))
+		return NULL;
+
+	if (gensec_have_feature(security, feature)) {
+		return Py_True;
+	} 
+	return Py_False;
+}
+
+static PyObject *py_gensec_update(PyObject *self, PyObject *args)
+{
+	NTSTATUS status;
+
+	TALLOC_CTX *mem_ctx;
+	DATA_BLOB in, out;
+	PyObject *ret, *py_in;
+	struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
+
+	if (!PyArg_ParseTuple(args, "O", &py_in))
+		return NULL;
+
+	mem_ctx = talloc_new(NULL);
+
+	if (py_in == Py_None) {
+		in = data_blob_null;
+	} else {
+		in.data = (uint8_t *)PyString_AsString(py_in);
+		in.length = PyString_Size(py_in);
+	}
+
+	status = gensec_update(security, mem_ctx, in, &out);
+
+	if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)
+	    && !NT_STATUS_IS_OK(status)) {
+		PyErr_SetNTSTATUS(status);
+		talloc_free(mem_ctx);
+		return NULL;
+	}
+	if (out.length != 0) {
+		ret = PyString_FromStringAndSize((const char *)out.data, out.length);
+	} else {
+		ret = Py_None;
+	}
+	talloc_free(mem_ctx);
+	if (NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) 
+	{
+		return PyTuple_Pack(2, Py_False, ret);
+	} else {
+		return PyTuple_Pack(2, Py_True, ret);
+	}
+}
+
+static PyObject *py_gensec_wrap(PyObject *self, PyObject *args)
+{
+	NTSTATUS status;
+
+	TALLOC_CTX *mem_ctx;
+	DATA_BLOB in, out;
+	PyObject *ret, *py_in;
+	struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
+
+	if (!PyArg_ParseTuple(args, "O", &py_in))
+		return NULL;
+
+	mem_ctx = talloc_new(NULL);
+
+	if (py_in == Py_None) {
+		in = data_blob_null;
+	} else {
+		in.data = (uint8_t *)PyString_AsString(py_in);
+		in.length = PyString_Size(py_in);
+	}
+
+	status = gensec_wrap(security, mem_ctx, &in, &out);
+
+	if (!NT_STATUS_IS_OK(status)) {
+		PyErr_SetNTSTATUS(status);
+		talloc_free(mem_ctx);
+		return NULL;
+	}
+
+	if (out.length != 0) {
+		ret = PyString_FromStringAndSize((const char *)out.data, out.length);
+	} else {
+		ret = Py_None;
+	}
+	talloc_free(mem_ctx);
+	return ret;
+}
+
+static PyObject *py_gensec_unwrap(PyObject *self, PyObject *args)
+{
+	NTSTATUS status;
+
+	TALLOC_CTX *mem_ctx;
+	DATA_BLOB in, out;
+	PyObject *ret, *py_in;
+	struct gensec_security *security = py_talloc_get_type(self, struct gensec_security);
+
+	if (!PyArg_ParseTuple(args, "O", &py_in))
+		return NULL;
+
+	mem_ctx = talloc_new(NULL);
+
+	if (py_in == Py_None) {
+		in = data_blob_null;
+	} else {
+		in.data = (uint8_t *)PyString_AsString(py_in);
+		in.length = PyString_Size(py_in);
+	}
+
+	status = gensec_unwrap(security, mem_ctx, &in, &out);
+
+	if (!NT_STATUS_IS_OK(status)) {
+		PyErr_SetNTSTATUS(status);
+		talloc_free(mem_ctx);
+		return NULL;
+	}
+
+	if (out.length != 0) {
+		ret = PyString_FromStringAndSize((const char *)out.data, out.length);
+	} else {
+		ret = Py_None;
+	}
+	talloc_free(mem_ctx);
+	return ret;
+}
+
 static PyMethodDef py_gensec_security_methods[] = {
 	{ "start_client", (PyCFunction)py_gensec_start_client, METH_VARARGS|METH_KEYWORDS|METH_CLASS, 
 		"S.start_client(settings) -> gensec" },
-/*	{ "start_server", (PyCFunction)py_gensec_start_server, METH_VARARGS|METH_KEYWORDS|METH_CLASS, 
-		"S.start_server(auth_ctx, settings) -> gensec" },*/
+	{ "start_server", (PyCFunction)py_gensec_start_server, METH_VARARGS|METH_KEYWORDS|METH_CLASS,
+		"S.start_server(auth_ctx, settings) -> gensec" },
+	{ "set_credentials", (PyCFunction)py_gensec_set_credentials, METH_VARARGS, 
+		"S.start_client(credentials)" },
 	{ "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.session_info() -> info" },
+	{ "start_mech_by_name", (PyCFunction)py_gensec_start_mech_by_name, METH_VARARGS,
         "S.start_mech_by_name(name)" },
+	{ "start_mech_by_sasl_name", (PyCFunction)py_gensec_start_mech_by_sasl_name, METH_VARARGS,
+        "S.start_mech_by_sasl_name(name)" },
 	{ "start_mech_by_authtype", (PyCFunction)py_gensec_start_mech_by_authtype, METH_VARARGS, "S.start_mech_by_authtype(authtype, level)" },
 	{ "get_name_by_authtype", (PyCFunction)py_get_name_by_authtype, METH_VARARGS,
 		"S.get_name_by_authtype(authtype) -> name\nLookup an auth type." },
+	{ "want_feature", (PyCFunction)py_gensec_want_feature, METH_VARARGS,
+	  "S.want_feature(feature)\n Request that GENSEC negotiate a particular feature." },
+	{ "have_feature", (PyCFunction)py_gensec_have_feature, METH_VARARGS,
+	  "S.have_feature()\n Return True if GENSEC negotiated a particular feature." },
+	{ "update",  (PyCFunction)py_gensec_update, METH_VARARGS,
+		"S.update(blob_in) -> (finished, blob_out)\nPerform one step in a GENSEC dance.  Repeat with new packets until finished is true or exception." },
+	{ "wrap",  (PyCFunction)py_gensec_wrap, METH_VARARGS,
+		"S.wrap(blob_in) -> blob_out\nPackage one clear packet into a wrapped GENSEC packet." },
+	{ "unwrap",  (PyCFunction)py_gensec_unwrap, METH_VARARGS,
+		"S.unwrap(blob_in) -> blob_out\nPerform one wrapped GENSEC packet into a clear packet." },
+
 	{ NULL }
 };
 
diff --git a/source4/auth/ntlm/auth.c b/source4/auth/ntlm/auth.c
index 0c6c8ef..7f355d7 100644
--- a/source4/auth/ntlm/auth.c
+++ b/source4/auth/ntlm/auth.c
@@ -496,7 +496,7 @@ _PUBLIC_ NTSTATUS auth_context_create_methods(TALLOC_CTX *mem_ctx, const char **
 	return NT_STATUS_OK;
 }
 
-static const char **auth_methods_from_lp(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx)
+const char **auth_methods_from_lp(TALLOC_CTX *mem_ctx, struct loadparm_context *lp_ctx)
 {
 	const char **auth_methods = NULL;
 	switch (lpcfg_server_role(lp_ctx)) {
diff --git a/source4/auth/pyauth.c b/source4/auth/pyauth.c
index c8ab460..a603053 100644
--- a/source4/auth/pyauth.c
+++ b/source4/auth/pyauth.c
@@ -28,11 +28,14 @@
 #include "param/pyparam.h"


-- 
Samba Shared Repository


More information about the samba-cvs mailing list