[SCM] Samba Shared Repository - branch master updated

Andreas Schneider asn at samba.org
Tue Apr 15 12:55:02 UTC 2025


The branch, master has been updated
       via  9dc165e80fb lib:cmdline: POPT_CALLBACK_REASON_POST should handle if we skip the password callback
       via  dd4f4037925 lib:cmdline: Make sure --use-krb5-ccache sets the ccache
       via  6085b737ba7 auth:creds: Do a kinit if we have a password and the ccache is empty
      from  be192dc2f5b s3-wscript: make sure to build with selftest without libevent

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


- Log -----------------------------------------------------------------
commit 9dc165e80fb90774b6999b90483e5fcfb5c2798e
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Apr 11 10:56:43 2025 +0200

    lib:cmdline: POPT_CALLBACK_REASON_POST should handle if we skip the password callback
    
    It is already checking if there is a valid ccache and disabling the callback.
    In case of IAKerb we specify a ccache but might to fill one with a krbtgt.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Alexander Bokovoy <ab at samba.org>
    
    Autobuild-User(master): Andreas Schneider <asn at cryptomilk.org>
    Autobuild-Date(master): Tue Apr 15 12:54:57 UTC 2025 on atb-devel-224

commit dd4f403792528d13955228c780fe4891a56e3e60
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Apr 4 10:27:50 2025 +0200

    lib:cmdline: Make sure --use-krb5-ccache sets the ccache
    
    Pair-Programmed-With: Alexander Bokovoy <ab at samba.org>
    Signed-off-by: Alexander Bokovoy <ab at samba.org>
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>

commit 6085b737ba702582765840e21cc88d6007dacecf
Author: Andreas Schneider <asn at samba.org>
Date:   Fri Apr 11 13:49:22 2025 +0200

    auth:creds: Do a kinit if we have a password and the ccache is empty
    
    This implements the same behaviour for s4 clients as we have with s3
    clients.
    
    Signed-off-by: Andreas Schneider <asn at samba.org>
    Reviewed-by: Stefan Metzmacher <metze at samba.org>
    Reviewed-by: Alexander Bokovoy <ab at samba.org>

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

Summary of changes:
 auth/credentials/credentials_krb5.c        | 30 +++++------
 lib/cmdline/cmdline.c                      | 84 +++++++++++++++++++++---------
 testprogs/blackbox/test_client_kerberos.sh |  2 +-
 3 files changed, 72 insertions(+), 44 deletions(-)


Changeset truncated at 500 lines:

diff --git a/auth/credentials/credentials_krb5.c b/auth/credentials/credentials_krb5.c
index ce76b10361d..f905fe736cc 100644
--- a/auth/credentials/credentials_krb5.c
+++ b/auth/credentials/credentials_krb5.c
@@ -669,37 +669,31 @@ _PUBLIC_ int cli_credentials_get_named_ccache(struct cli_credentials *cred,
 	if (cred->ccache_obtained >= cred->ccache_threshold &&
 	    cred->ccache_obtained > CRED_UNINITIALISED) {
 		time_t lifetime;
-		bool expired = false;
+		enum credentials_obtained pass_obtained =
+			cli_credentials_get_password_obtained(cred);
+		bool kinit_required = false;
 		ret = smb_krb5_cc_get_lifetime(cred->ccache->smb_krb5_context->krb5_context,
 					       cred->ccache->ccache, &lifetime);
 		if (ret == KRB5_CC_END || ret == ENOENT) {
-			/* If we have a particular ccache set, without
-			 * an initial ticket, then assume there is a
-			 * good reason */
+			kinit_required = true;
 		} else if (ret == 0) {
 			if (lifetime == 0) {
-				DEBUG(3, ("Ticket in credentials cache for %s expired, will refresh\n",
-					  cli_credentials_get_principal(cred, cred)));
-				expired = true;
+				kinit_required = true;
 			} else if (lifetime < 300) {
-				DEBUG(3, ("Ticket in credentials cache for %s will shortly expire (%u secs), will refresh\n",
-					  cli_credentials_get_principal(cred, cred), (unsigned int)lifetime));
-				expired = true;
+				kinit_required = true;
 			}
 		} else {
-			(*error_string) = talloc_asprintf(cred, "failed to get ccache lifetime: %s\n",
-							  smb_get_krb5_error_message(cred->ccache->smb_krb5_context->krb5_context,
-										     ret, cred));
-			return ret;
+			kinit_required = true;
 		}
 
-		DEBUG(5, ("Ticket in credentials cache for %s will expire in %u secs\n",
-			  cli_credentials_get_principal(cred, cred), (unsigned int)lifetime));
-
-		if (!expired) {
+		if (!kinit_required) {
 			*ccc = cred->ccache;
 			return 0;
 		}
+		if (pass_obtained < cred->ccache_obtained) {
+			(*error_string) = "The credential cache is invalid";
+			return EINVAL;
+		}
 	}
 	if (cli_credentials_is_anonymous(cred)) {
 		(*error_string) = "Cannot get anonymous kerberos credentials";
diff --git a/lib/cmdline/cmdline.c b/lib/cmdline/cmdline.c
index 161ba8874bf..e434d65a2ef 100644
--- a/lib/cmdline/cmdline.c
+++ b/lib/cmdline/cmdline.c
@@ -16,6 +16,7 @@
  */
 
 #include "includes.h"
+#include "auth/credentials/credentials.h"
 #include "lib/param/param.h"
 #include "dynconfig/dynconfig.h"
 #include "auth/gensec/gensec.h"
@@ -930,6 +931,7 @@ static struct poptOption popt_common_connection[] = {
 
 static bool skip_password_callback;
 static bool machine_account_pending;
+static char *krb5_ccache = NULL;
 
 static void popt_common_credentials_callback(poptContext popt_ctx,
 					     enum poptCallbackReason reason,
@@ -1004,6 +1006,31 @@ static void popt_common_credentials_callback(poptContext popt_ctx,
 						     CRED_SPECIFIED);
 		}
 
+		/*
+		 * If --use-krb5-ccache was passed on the command line we need
+		 * to overwrite the values set by cli_credentials_guess().
+		 */
+		if (krb5_ccache != NULL) {
+			const char *error_string = NULL;
+			int rc;
+
+			rc = cli_credentials_set_ccache(creds,
+							lp_ctx,
+							krb5_ccache,
+							CRED_SPECIFIED,
+							&error_string);
+			SAFE_FREE(krb5_ccache);
+			if (rc != 0) {
+				fprintf(stderr,
+					"Error setting krb5 credentials cache: "
+					"'%s'"
+					" - %s\n",
+					krb5_ccache,
+					error_string);
+				exit(1);
+			}
+		}
+
 		if (cli_credentials_get_kerberos_state(creds) ==
 		    CRED_USE_KERBEROS_REQUIRED)
 		{
@@ -1023,10 +1050,10 @@ static void popt_common_credentials_callback(poptContext popt_ctx,
 				skip_password_callback = true;
 			}
 		}
-		if (!skip_password_callback) {
-			(void)cli_credentials_get_password_and_obtained(creds,
-									&password_obtained);
-		}
+
+		(void)cli_credentials_get_password_and_obtained(
+			creds, &password_obtained);
+
 		if (!skip_password_callback &&
 		    password_obtained < CRED_CALLBACK) {
 			ok = cli_credentials_set_cmdline_callbacks(creds);
@@ -1038,6 +1065,15 @@ static void popt_common_credentials_callback(poptContext popt_ctx,
 			}
 		}
 
+		/*
+		 * If the user specified a password on the command line always
+		 * do a kinit!
+		 */
+		if (password_obtained == CRED_SPECIFIED) {
+			cli_credentials_invalidate_ccache(creds,
+							  CRED_SPECIFIED);
+		}
+
 		return;
 	}
 
@@ -1138,9 +1174,6 @@ static void popt_common_credentials_callback(poptContext popt_ctx,
 		break;
 	}
 	case OPT_USE_KERBEROS_CCACHE: {
-		const char *error_string = NULL;
-		int rc;
-
 		if (arg == NULL) {
 			fprintf(stderr,
 				"Failed to parse --use-krb5-ccache=CCACHE: "
@@ -1148,30 +1181,31 @@ static void popt_common_credentials_callback(poptContext popt_ctx,
 			exit(1);
 		}
 
-		ok = cli_credentials_set_kerberos_state(creds,
-							CRED_USE_KERBEROS_REQUIRED,
-							CRED_SPECIFIED);
-		if (!ok) {
-			fprintf(stderr,
-				"Failed to set Kerberos state to %s!\n", arg);
-			exit(1);
+		/*
+		 * Remember the value and handle it in
+		 * POPT_CALLBACK_REASON_POST.
+		 */
+		if (arg[0] != '\0') {
+			krb5_ccache = strdup(arg);
+			if (krb5_ccache == NULL) {
+				fprintf(stderr, "Failed allocate memory\n");
+				exit(1);
+			}
 		}
 
-		rc = cli_credentials_set_ccache(creds,
-						lp_ctx,
-						arg,
-						CRED_SPECIFIED,
-						&error_string);
-		if (rc != 0) {
+		ok = cli_credentials_set_kerberos_state(
+			creds, CRED_USE_KERBEROS_REQUIRED, CRED_SPECIFIED);
+		if (!ok) {
 			fprintf(stderr,
-				"Error reading krb5 credentials cache: '%s'"
-				" - %s\n",
-				arg,
-				error_string);
+				"Failed to set Kerberos state to %s!\n",
+				arg);
 			exit(1);
 		}
 
-		skip_password_callback = true;
+		/*
+		 * The password callback will be skipped, if we have a valid
+		 * ccache. This is handled in POPT_CALLBACK_REASON_POST.
+		 */
 		break;
 	}
 	case OPT_USE_WINBIND_CCACHE:
diff --git a/testprogs/blackbox/test_client_kerberos.sh b/testprogs/blackbox/test_client_kerberos.sh
index 54554ea3290..395b5bc989a 100755
--- a/testprogs/blackbox/test_client_kerberos.sh
+++ b/testprogs/blackbox/test_client_kerberos.sh
@@ -147,7 +147,7 @@ testit "test rpcclient kerberos" \
 	failed=$(expr $failed + 1)
 
 cmd='echo ${PASSWORD} | $samba_rpcclient ncacn_np:${SERVER} -U${USERNAME} --use-krb5-ccache=$KRB5CCNAME --configfile=${CONFIGURATION} -c getusername 2>&1'
-testit_expect_failure "test rpcclient kerberos interactive (negative test)" \
+testit "test rpcclient kerberos interactive" \
 	test_rpc_getusername ||
 	failed=$(expr $failed + 1)
 


-- 
Samba Shared Repository



More information about the samba-cvs mailing list