[SCM] Samba Shared Repository - branch master updated

Andrew Bartlett abartlet at samba.org
Sat Feb 20 00:00:05 MST 2010


The branch, master has been updated
       via  a7036a9... librpc/ndr Remove unused macros
       via  a9d9447... s4:credentials Add hooks to extract a named Kerberos credentials cache
      from  da1970c... s4:lsa open trusted domain also with dns name

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


- Log -----------------------------------------------------------------
commit a7036a9e47382e738f6ebedf13719222950611d6
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Feb 20 11:51:47 2010 +1100

    librpc/ndr Remove unused macros
    
    Since the change to the way we pull these OIDs from the wire, these
    macros are unused.
    
    Andrew Bartlett

commit a9d9447d5a448e13d4373c3c4b48f0edd49dc38a
Author: Andrew Bartlett <abartlet at samba.org>
Date:   Sat Feb 20 11:44:41 2010 +1100

    s4:credentials Add hooks to extract a named Kerberos credentials cache
    
    This allows the integration of external tools that can't be linked
    into C or python, but need to authenticate as the local machine
    account.
    
    The machineaccountccache script demonstrates this, and debugging has
    been improved in cli_credentials_set_secrets() by passing back and
    error string.
    
    Andrew Bartlett

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

Summary of changes:
 librpc/ndr/ndr_drsuapi.c                       |   16 ----
 source4/auth/credentials/credentials.h         |    8 ++-
 source4/auth/credentials/credentials_files.c   |   92 ++++++++++++-----------
 source4/auth/credentials/credentials_krb5.c    |   56 ++++++++++-----
 source4/auth/credentials/pycredentials.c       |   63 ++++++++++++++++
 source4/auth/credentials/pycredentials.h       |    6 ++
 source4/dsdb/samdb/ldb_modules/update_keytab.c |    3 +-
 source4/dsdb/samdb/samdb.c                     |    4 +-
 source4/scripting/bin/machineaccountccache     |   30 ++++++++
 testprogs/blackbox/test_kinit.sh               |    7 ++-
 10 files changed, 203 insertions(+), 82 deletions(-)
 create mode 100755 source4/scripting/bin/machineaccountccache


Changeset truncated at 500 lines:

diff --git a/librpc/ndr/ndr_drsuapi.c b/librpc/ndr/ndr_drsuapi.c
index 17f2b7e..b91d5f7 100644
--- a/librpc/ndr/ndr_drsuapi.c
+++ b/librpc/ndr/ndr_drsuapi.c
@@ -66,22 +66,6 @@ void ndr_print_drsuapi_DsReplicaObjectListItemEx(struct ndr_print *ndr, const ch
 	}
 }
 
-#define _OID_PUSH_CHECK(call) do { \
-	bool _status; \
-	_status = call; \
-	if (_status != true) { \
-		return ndr_push_error(ndr, NDR_ERR_SUBCONTEXT, "OID Conversion Error: %s\n", __location__); \
-	} \
-} while (0)
-
-#define _OID_PULL_CHECK(call) do { \
-	bool _status; \
-	_status = call; \
-	if (_status != true) { \
-		return ndr_pull_error(ndr, NDR_ERR_SUBCONTEXT, "OID Conversion Error: %s\n", __location__); \
-	} \
-} while (0)
-
 _PUBLIC_ void ndr_print_drsuapi_DsReplicaOID(struct ndr_print *ndr, const char *name, const struct drsuapi_DsReplicaOID *r)
 {
 	ndr_print_struct(ndr, name, "drsuapi_DsReplicaOID");
diff --git a/source4/auth/credentials/credentials.h b/source4/auth/credentials/credentials.h
index 311cdc2..21a9c61 100644
--- a/source4/auth/credentials/credentials.h
+++ b/source4/auth/credentials/credentials.h
@@ -162,6 +162,11 @@ int cli_credentials_get_ccache(struct cli_credentials *cred,
 			       struct tevent_context *event_ctx,
 			       struct loadparm_context *lp_ctx,
 			       struct ccache_container **ccc);
+int cli_credentials_get_named_ccache(struct cli_credentials *cred, 
+				     struct tevent_context *event_ctx,
+				     struct loadparm_context *lp_ctx,
+				     char *ccache_name,
+				     struct ccache_container **ccc);
 int cli_credentials_get_keytab(struct cli_credentials *cred, 
 			       struct tevent_context *event_ctx,
 			       struct loadparm_context *lp_ctx,
@@ -266,7 +271,8 @@ NTSTATUS cli_credentials_set_secrets(struct cli_credentials *cred,
 				     struct loadparm_context *lp_ctx,
 				     struct ldb_context *ldb,
 				     const char *base,
-				     const char *filter);
+				     const char *filter, 
+				     char **error_string);
  int cli_credentials_get_kvno(struct cli_credentials *cred);
 
 #endif /* __CREDENTIALS_H__ */
diff --git a/source4/auth/credentials/credentials_files.c b/source4/auth/credentials/credentials_files.c
index 8036e48..6ddee9e 100644
--- a/source4/auth/credentials/credentials_files.c
+++ b/source4/auth/credentials/credentials_files.c
@@ -175,15 +175,16 @@ _PUBLIC_ bool cli_credentials_parse_file(struct cli_credentials *cred, const cha
  */
 _PUBLIC_ NTSTATUS cli_credentials_set_secrets(struct cli_credentials *cred, 
 					      struct tevent_context *event_ctx,
-				     struct loadparm_context *lp_ctx,
-				     struct ldb_context *ldb,
-				     const char *base,
-				     const char *filter)
+					      struct loadparm_context *lp_ctx,
+					      struct ldb_context *ldb,
+					      const char *base,
+					      const char *filter, 
+					      char **error_string)
 {
 	TALLOC_CTX *mem_ctx;
 	
 	int ldb_ret;
-	struct ldb_message **msgs;
+	struct ldb_message *msg;
 	const char *attrs[] = {
 		"secret",
 		"priorSecret",
@@ -224,46 +225,43 @@ _PUBLIC_ NTSTATUS cli_credentials_set_secrets(struct cli_credentials *cred,
 		if (!ldb) {
 			/* set anonymous as the fallback, if the machine account won't work */
 			cli_credentials_set_anonymous(cred);
-			DEBUG(1, ("Could not open secrets.ldb\n"));
+			*error_string = talloc_strdup(cred, "Could not open secrets.ldb");
 			talloc_free(mem_ctx);
 			return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
 		}
 	}
 
-	/* search for the secret record */
-	ldb_ret = gendb_search(ldb,
-			       mem_ctx, ldb_dn_new(mem_ctx, ldb, base), 
-			       &msgs, attrs,
-			       "%s", filter);
-	if (ldb_ret == 0) {
-		DEBUG(5, ("(normal if no LDAP backend required) Could not find entry to match filter: '%s' base: '%s'\n",
-			  filter, base));
-		/* set anonymous as the fallback, if the machine account won't work */
-		cli_credentials_set_anonymous(cred);
-		talloc_free(mem_ctx);
-		return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
-	} else if (ldb_ret != 1) {
-		DEBUG(5, ("Found more than one (%d) entry to match filter: '%s' base: '%s'\n",
-			  ldb_ret, filter, base));
+	ldb_ret = dsdb_search_one(ldb, ldb, &msg,
+				  ldb_dn_new(mem_ctx, ldb, base),
+				  LDB_SCOPE_SUBTREE,
+				  attrs, 0, "%s", filter);
+
+	if (ldb_ret != LDB_SUCCESS) {
+		*error_string = talloc_asprintf(cred, "Could not find entry to match filter: '%s' base: '%s': %s: %s\n",
+						filter, base ? base : "",
+						ldb_strerror(ldb_ret), ldb_errstring(ldb));
 		/* set anonymous as the fallback, if the machine account won't work */
 		cli_credentials_set_anonymous(cred);
 		talloc_free(mem_ctx);
 		return NT_STATUS_CANT_ACCESS_DOMAIN_INFO;
 	}
-	
-	password = ldb_msg_find_attr_as_string(msgs[0], "secret", NULL);
-	old_password = ldb_msg_find_attr_as_string(msgs[0], "priorSecret", NULL);
 
-	machine_account = ldb_msg_find_attr_as_string(msgs[0], "samAccountName", NULL);
+	password = ldb_msg_find_attr_as_string(msg, "secret", NULL);
+	old_password = ldb_msg_find_attr_as_string(msg, "priorSecret", NULL);
+
+	machine_account = ldb_msg_find_attr_as_string(msg, "samAccountName", NULL);
 
 	if (!machine_account) {
-		machine_account = ldb_msg_find_attr_as_string(msgs[0], "servicePrincipalName", NULL);
+		machine_account = ldb_msg_find_attr_as_string(msg, "servicePrincipalName", NULL);
 		
 		if (!machine_account) {
-			const char *ldap_bind_dn = ldb_msg_find_attr_as_string(msgs[0], "ldapBindDn", NULL);
+			const char *ldap_bind_dn = ldb_msg_find_attr_as_string(msg, "ldapBindDn", NULL);
 			if (!ldap_bind_dn) {
-				DEBUG(1, ("Could not find 'samAccountName', 'servicePrincipalName' or 'ldapBindDn' in secrets record: filter: '%s' base: '%s'\n",
-					  filter, base));
+				*error_string = talloc_asprintf(cred, 
+								"Could not find 'samAccountName', "
+								"'servicePrincipalName' or "
+								"'ldapBindDn' in secrets record: %s",
+								ldb_dn_get_linearized(msg->dn));
 				/* set anonymous as the fallback, if the machine account won't work */
 				cli_credentials_set_anonymous(cred);
 				talloc_free(mem_ctx);
@@ -275,16 +273,16 @@ _PUBLIC_ NTSTATUS cli_credentials_set_secrets(struct cli_credentials *cred,
 		}
 	}
 
-	salt_principal = ldb_msg_find_attr_as_string(msgs[0], "saltPrincipal", NULL);
+	salt_principal = ldb_msg_find_attr_as_string(msg, "saltPrincipal", NULL);
 	cli_credentials_set_salt_principal(cred, salt_principal);
 	
-	sct = ldb_msg_find_attr_as_int(msgs[0], "secureChannelType", 0);
+	sct = ldb_msg_find_attr_as_int(msg, "secureChannelType", 0);
 	if (sct) { 
 		cli_credentials_set_secure_channel_type(cred, sct);
 	}
 	
 	if (!password) {
-		const struct ldb_val *nt_password_hash = ldb_msg_find_ldb_val(msgs[0], "unicodePwd");
+		const struct ldb_val *nt_password_hash = ldb_msg_find_ldb_val(msg, "unicodePwd");
 		struct samr_Password hash;
 		ZERO_STRUCT(hash);
 		if (nt_password_hash) {
@@ -300,12 +298,12 @@ _PUBLIC_ NTSTATUS cli_credentials_set_secrets(struct cli_credentials *cred,
 	}
 
 	
-	domain = ldb_msg_find_attr_as_string(msgs[0], "flatname", NULL);
+	domain = ldb_msg_find_attr_as_string(msg, "flatname", NULL);
 	if (domain) {
 		cli_credentials_set_domain(cred, domain, CRED_SPECIFIED);
 	}
 
-	realm = ldb_msg_find_attr_as_string(msgs[0], "realm", NULL);
+	realm = ldb_msg_find_attr_as_string(msg, "realm", NULL);
 	if (realm) {
 		cli_credentials_set_realm(cred, realm, CRED_SPECIFIED);
 	}
@@ -314,16 +312,16 @@ _PUBLIC_ NTSTATUS cli_credentials_set_secrets(struct cli_credentials *cred,
 		cli_credentials_set_username(cred, machine_account, CRED_SPECIFIED);
 	}
 
-	cli_credentials_set_kvno(cred, ldb_msg_find_attr_as_int(msgs[0], "msDS-KeyVersionNumber", 0));
+	cli_credentials_set_kvno(cred, ldb_msg_find_attr_as_int(msg, "msDS-KeyVersionNumber", 0));
 
 	/* If there was an external keytab specified by reference in
 	 * the LDB, then use this.  Otherwise we will make one up
 	 * (chewing CPU time) from the password */
-	keytab = ldb_msg_find_attr_as_string(msgs[0], "krb5Keytab", NULL);
+	keytab = ldb_msg_find_attr_as_string(msg, "krb5Keytab", NULL);
 	if (keytab) {
 		cli_credentials_set_keytab_name(cred, event_ctx, lp_ctx, keytab, CRED_SPECIFIED);
 	} else {
-		keytab = ldb_msg_find_attr_as_string(msgs[0], "privateKeytab", NULL);
+		keytab = ldb_msg_find_attr_as_string(msg, "privateKeytab", NULL);
 		if (keytab) {
 			keytab = talloc_asprintf(mem_ctx, "FILE:%s", samdb_relative_path(ldb, mem_ctx, keytab));
 			if (keytab) {
@@ -347,6 +345,7 @@ _PUBLIC_ NTSTATUS cli_credentials_set_machine_account(struct cli_credentials *cr
 {
 	NTSTATUS status;
 	char *filter;
+	char *error_string;
 	/* Bleh, nasty recursion issues: We are setting a machine
 	 * account here, so we don't want the 'pending' flag around
 	 * any more */
@@ -355,9 +354,10 @@ _PUBLIC_ NTSTATUS cli_credentials_set_machine_account(struct cli_credentials *cr
 				       cli_credentials_get_domain(cred));
 	status = cli_credentials_set_secrets(cred, event_context_find(cred), lp_ctx, NULL, 
 					   SECRETS_PRIMARY_DOMAIN_DN,
-					   filter);
+					     filter, &error_string);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(1, ("Could not find machine account in secrets database: %s", nt_errstr(status)));
+		DEBUG(1, ("Could not find machine account in secrets database: %s: %s", nt_errstr(status), error_string));
+		talloc_free(error_string);
 	}
 	return status;
 }
@@ -374,6 +374,7 @@ NTSTATUS cli_credentials_set_krbtgt(struct cli_credentials *cred,
 {
 	NTSTATUS status;
 	char *filter;
+	char *error_string;
 	/* Bleh, nasty recursion issues: We are setting a machine
 	 * account here, so we don't want the 'pending' flag around
 	 * any more */
@@ -382,10 +383,11 @@ NTSTATUS cli_credentials_set_krbtgt(struct cli_credentials *cred,
 				       cli_credentials_get_realm(cred),
 				       cli_credentials_get_domain(cred));
 	status = cli_credentials_set_secrets(cred, event_ctx, lp_ctx, NULL, 
-					   SECRETS_PRINCIPALS_DN,
-					   filter);
+					     SECRETS_PRINCIPALS_DN,
+					     filter, &error_string);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(1, ("Could not find krbtgt (master Kerberos) account in secrets database: %s", nt_errstr(status)));
+		DEBUG(1, ("Could not find krbtgt (master Kerberos) account in secrets database: %s: %s", nt_errstr(status), error_string));
+		talloc_free(error_string);
 	}
 	return status;
 }
@@ -403,6 +405,7 @@ _PUBLIC_ NTSTATUS cli_credentials_set_stored_principal(struct cli_credentials *c
 {
 	NTSTATUS status;
 	char *filter;
+	char *error_string;
 	/* Bleh, nasty recursion issues: We are setting a machine
 	 * account here, so we don't want the 'pending' flag around
 	 * any more */
@@ -412,9 +415,10 @@ _PUBLIC_ NTSTATUS cli_credentials_set_stored_principal(struct cli_credentials *c
 				 cli_credentials_get_domain(cred),
 				 serviceprincipal);
 	status = cli_credentials_set_secrets(cred, event_ctx, lp_ctx, NULL, 
-					   SECRETS_PRINCIPALS_DN, filter);
+					     SECRETS_PRINCIPALS_DN, filter,
+					     &error_string);
 	if (!NT_STATUS_IS_OK(status)) {
-		DEBUG(1, ("Could not find %s principal in secrets database: %s", serviceprincipal, nt_errstr(status)));
+		DEBUG(1, ("Could not find %s principal in secrets database: %s: %s", serviceprincipal, nt_errstr(status), error_string));
 	}
 	return status;
 }
diff --git a/source4/auth/credentials/credentials_krb5.c b/source4/auth/credentials/credentials_krb5.c
index efcca3e..b722901 100644
--- a/source4/auth/credentials/credentials_krb5.c
+++ b/source4/auth/credentials/credentials_krb5.c
@@ -40,7 +40,8 @@ _PUBLIC_ int cli_credentials_get_krb5_context(struct cli_credentials *cred,
 		return 0;
 	}
 
-	ret = smb_krb5_init_context(cred, event_ctx, lp_ctx, &cred->smb_krb5_context);
+	ret = smb_krb5_init_context(cred, event_ctx, lp_ctx, 
+				    &cred->smb_krb5_context);
 	if (ret) {
 		cred->smb_krb5_context = NULL;
 		return ret;
@@ -203,23 +204,16 @@ _PUBLIC_ int cli_credentials_set_ccache(struct cli_credentials *cred,
 static int cli_credentials_new_ccache(struct cli_credentials *cred, 
 				      struct tevent_context *event_ctx,
 				      struct loadparm_context *lp_ctx,
+				      char *ccache_name,
 				      struct ccache_container **_ccc)
 {
+	bool must_free_cc_name = false;
 	krb5_error_code ret;
 	struct ccache_container *ccc = talloc(cred, struct ccache_container);
-	char *ccache_name;
 	if (!ccc) {
 		return ENOMEM;
 	}
 
-	ccache_name = talloc_asprintf(ccc, "MEMORY:%p", 
-				      ccc);
-
-	if (!ccache_name) {
-		talloc_free(ccc);
-		return ENOMEM;
-	}
-
 	ret = cli_credentials_get_krb5_context(cred, event_ctx, lp_ctx, 
 					       &ccc->smb_krb5_context);
 	if (ret) {
@@ -231,6 +225,17 @@ static int cli_credentials_new_ccache(struct cli_credentials *cred,
 		return ENOMEM;
 	}
 
+	if (!ccache_name) {
+		must_free_cc_name = true;
+		ccache_name = talloc_asprintf(ccc, "MEMORY:%p", 
+					      ccc);
+		
+		if (!ccache_name) {
+			talloc_free(ccc);
+			return ENOMEM;
+		}
+	}
+
 	ret = krb5_cc_resolve(ccc->smb_krb5_context->krb5_context, ccache_name, 
 			      &ccc->ccache);
 	if (ret) {
@@ -242,19 +247,26 @@ static int cli_credentials_new_ccache(struct cli_credentials *cred,
 		return ret;
 	}
 
-	talloc_set_destructor(ccc, free_mccache);
+	if (strncasecmp(ccache_name, "MEMORY:", 7) == 0) {
+		talloc_set_destructor(ccc, free_mccache);
+	} else {
+		talloc_set_destructor(ccc, free_dccache);
+	}
 
-	talloc_free(ccache_name);
+	if (must_free_cc_name) {
+		talloc_free(ccache_name);
+	}
 
 	*_ccc = ccc;
 
 	return ret;
 }
 
-_PUBLIC_ int cli_credentials_get_ccache(struct cli_credentials *cred, 
-					struct tevent_context *event_ctx,
-			       struct loadparm_context *lp_ctx,
-			       struct ccache_container **ccc)
+_PUBLIC_ int cli_credentials_get_named_ccache(struct cli_credentials *cred, 
+					      struct tevent_context *event_ctx,
+					      struct loadparm_context *lp_ctx,
+					      char *ccache_name,
+					      struct ccache_container **ccc)
 {
 	krb5_error_code ret;
 	
@@ -271,7 +283,7 @@ _PUBLIC_ int cli_credentials_get_ccache(struct cli_credentials *cred,
 		return EINVAL;
 	}
 
-	ret = cli_credentials_new_ccache(cred, event_ctx, lp_ctx, ccc);
+	ret = cli_credentials_new_ccache(cred, event_ctx, lp_ctx, ccache_name, ccc);
 	if (ret) {
 		return ret;
 	}
@@ -295,6 +307,14 @@ _PUBLIC_ int cli_credentials_get_ccache(struct cli_credentials *cred,
 	return ret;
 }
 
+_PUBLIC_ int cli_credentials_get_ccache(struct cli_credentials *cred, 
+					struct tevent_context *event_ctx,
+					struct loadparm_context *lp_ctx,
+					struct ccache_container **ccc)
+{
+	return cli_credentials_get_named_ccache(cred, event_ctx, lp_ctx, NULL, ccc);
+}
+
 void cli_credentials_invalidate_client_gss_creds(struct cli_credentials *cred, 
 						 enum credentials_obtained obtained)
 {
@@ -472,7 +492,7 @@ _PUBLIC_ int cli_credentials_get_client_gss_creds(struct cli_credentials *cred,
 		return ENOMEM;
 	}
 
-	ret = cli_credentials_new_ccache(cred, event_ctx, lp_ctx, &ccc);
+	ret = cli_credentials_new_ccache(cred, event_ctx, lp_ctx, NULL, &ccc);
 	if (ret != 0) {
 		return ret;
 	}
diff --git a/source4/auth/credentials/pycredentials.c b/source4/auth/credentials/pycredentials.c
index 3c06ae9..002ecbc 100644
--- a/source4/auth/credentials/pycredentials.c
+++ b/source4/auth/credentials/pycredentials.c
@@ -24,6 +24,7 @@
 #include "librpc/gen_ndr/samr.h" /* for struct samr_Password */
 #include "libcli/util/pyerrors.h"
 #include "param/pyparam.h"
+#include <tevent.h>
 
 static PyObject *PyString_FromStringOrNULL(const char *str)
 {
@@ -226,6 +227,54 @@ static PyObject *py_creds_set_machine_account(py_talloc_Object *self, PyObject *
 	Py_RETURN_NONE;
 }
 
+PyObject *PyCredentialCacheContainer_from_ccache_container(struct ccache_container *ccc)
+{
+	PyCredentialCacheContainerObject *py_ret;
+
+	if (ccc == NULL) {
+		Py_RETURN_NONE;
+	}
+
+	py_ret = (PyCredentialCacheContainerObject *)PyCredentialCacheContainer.tp_alloc(&PyCredentialCacheContainer, 0);
+	if (py_ret == NULL) {
+		PyErr_NoMemory();
+		return NULL;
+	}
+	py_ret->mem_ctx = talloc_new(NULL);
+	py_ret->ccc = talloc_reference(py_ret->mem_ctx, ccc);
+	return (PyObject *)py_ret;
+}
+
+
+static PyObject *py_creds_get_named_ccache(py_talloc_Object *self, PyObject *args)
+{
+	PyObject *py_lp_ctx = Py_None;
+	char *ccache_name;
+	struct loadparm_context *lp_ctx;
+	struct ccache_container *ccc;
+	struct tevent_context *event_ctx;
+	int ret;
+
+	if (!PyArg_ParseTuple(args, "|Os", &py_lp_ctx, &ccache_name))
+		return NULL;
+
+	lp_ctx = lp_from_py_object(py_lp_ctx);
+	if (lp_ctx == NULL) 
+		return NULL;
+
+	event_ctx = tevent_context_init(NULL);
+
+	ret = cli_credentials_get_named_ccache(PyCredentials_AsCliCredentials(self), event_ctx, lp_ctx, ccache_name, &ccc);
+	if (ret == 0) {
+		talloc_steal(ccc, event_ctx);
+		return PyCredentialCacheContainer_from_ccache_container(ccc);
+	} else {
+		talloc_free(event_ctx);
+		return NULL;
+	}
+
+}
+
 static PyMethodDef py_creds_methods[] = {
 	{ "get_username", (PyCFunction)py_creds_get_username, METH_NOARGS,
 		"S.get_username() -> username\nObtain username." },
@@ -282,6 +331,7 @@ static PyMethodDef py_creds_methods[] = {
 		NULL },
 	{ "guess", (PyCFunction)py_creds_guess, METH_VARARGS, NULL },
 	{ "set_machine_account", (PyCFunction)py_creds_set_machine_account, METH_VARARGS, NULL },
+	{ "get_named_ccache", (PyCFunction)py_creds_get_named_ccache, METH_VARARGS, NULL },
 	{ NULL }
 };
 
@@ -294,6 +344,14 @@ PyTypeObject PyCredentials = {
 	.tp_methods = py_creds_methods,
 };
 
+
+PyTypeObject PyCredentialCacheContainer = {
+	.tp_name = "CredentialCacheContainer",
+	.tp_basicsize = sizeof(py_talloc_Object),
+	.tp_dealloc = py_talloc_dealloc,
+	.tp_flags = Py_TPFLAGS_DEFAULT,
+};
+
 void initcredentials(void)
 {
 	PyObject *m;
@@ -301,6 +359,9 @@ void initcredentials(void)
 	if (PyType_Ready(&PyCredentials) < 0)
 		return;
 
+	if (PyType_Ready(&PyCredentialCacheContainer) < 0)
+		return;
+
 	m = Py_InitModule3("credentials", NULL, "Credentials management.");
 	if (m == NULL)
 		return;
@@ -311,4 +372,6 @@ void initcredentials(void)
 
 	Py_INCREF(&PyCredentials);
 	PyModule_AddObject(m, "Credentials", (PyObject *)&PyCredentials);
+	Py_INCREF(&PyCredentialCacheContainer);
+	PyModule_AddObject(m, "CredentialCacheContainer", (PyObject *)&PyCredentialCacheContainer);
 }
diff --git a/source4/auth/credentials/pycredentials.h b/source4/auth/credentials/pycredentials.h
index 1889248..b1040c6 100644


-- 
Samba Shared Repository


More information about the samba-cvs mailing list