The branch, master has been updated via 2674df4cc0e s3:libsmb: let cli_tree_connect_creds() only call cli_credentials_get_password() if needed via aff2932c420 python/samba/getopt: don't prompt for a password for --use-krb5-ccache=... via 0ba9e5dacbb lib/cmdline: only call cli_credentials_get_password_and_obtained if needed via 994e12e8f7a lib/cmdline: move cli_credentials_set_cmdline_callbacks to the end of POPT_CALLBACK_REASON_POST via e2170431f1d s3:auth_generic: fix talloc_unlink() in auth_generic_set_creds() via 5af5bf26457 auth/credentials: don't call talloc_free(ccache_name) on callers memory via d221f930efc auth/credentials: a temporary MEMORY ccache needs krb5_cc_destroy() via 126357e2e73 lib/krb5_wrap: let smb_krb5_cc_get_lifetime() behave more like the heimdal krb5_cc_get_lifetime via e58f83d3958 s3:libads: don't dump securityIdentifier and msDS-TrustForestTrustInfo as strings via e6f92edba69 s3:notify: don't log user_can_stat_name_under_fsp with level 0 for OBJECT_NAME_NOT_FOUND from c49c48afe09 ldb:utf8: ldb_ascii_toupper() avoids real toupper()
https://git.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 2674df4cc0e124d74eb9d764c29a07c9c84b94d6 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Apr 14 15:36:51 2022 +0200 s3:libsmb: let cli_tree_connect_creds() only call cli_credentials_get_password() if needed Only legacy protocols need a password for share level authentication, so avoid triggering the password prompt for the common case. BUG: https://bugzilla.samba.org/show_bug.cgi?id=15018 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> Autobuild-User(master): Stefan Metzmacher <me...@samba.org> Autobuild-Date(master): Tue Apr 23 15:21:38 UTC 2024 on atb-devel-224 commit aff2932c420fd102c077063b8d1f66cdd8a777cb Author: Stefan Metzmacher <me...@samba.org> Date: Fri Mar 8 14:14:34 2024 +0100 python/samba/getopt: don't prompt for a password for --use-krb5-ccache=... BUG: https://bugzilla.samba.org/show_bug.cgi?id=15018 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 0ba9e5dacbb4e5bf94600e0a4a1cbd9f7a9c5d9e Author: Stefan Metzmacher <me...@samba.org> Date: Thu Apr 14 13:31:20 2022 +0200 lib/cmdline: only call cli_credentials_get_password_and_obtained if needed BUG: https://bugzilla.samba.org/show_bug.cgi?id=15018 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 994e12e8f7a6b089342a32a6c3269048bfef1545 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Apr 14 13:30:56 2022 +0200 lib/cmdline: move cli_credentials_set_cmdline_callbacks to the end of POPT_CALLBACK_REASON_POST BUG: https://bugzilla.samba.org/show_bug.cgi?id=15018 Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit e2170431f1d4a6f4ce7e3e6949282d5bc60b5d08 Author: Stefan Metzmacher <me...@samba.org> Date: Thu Mar 7 00:11:26 2024 +0100 s3:auth_generic: fix talloc_unlink() in auth_generic_set_creds() Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 5af5bf264571b732b5236e6db2061b523e603c05 Author: Stefan Metzmacher <me...@samba.org> Date: Tue Feb 27 16:22:14 2024 +0100 auth/credentials: don't call talloc_free(ccache_name) on callers memory The internally allocated ccache_name has ccc as parent, so we don't need to cleanup explicitly. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit d221f930efcff09a9b5dc18c5dfb6475ade1312a Author: Stefan Metzmacher <me...@samba.org> Date: Tue Feb 27 16:07:22 2024 +0100 auth/credentials: a temporary MEMORY ccache needs krb5_cc_destroy() A simple krb5_cc_close() doesn't remove it from the global memory list. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit 126357e2e7302eb219fda80e3cfbef3da02c1d6d Author: Stefan Metzmacher <me...@samba.org> Date: Fri Mar 8 11:39:35 2024 +0100 lib/krb5_wrap: let smb_krb5_cc_get_lifetime() behave more like the heimdal krb5_cc_get_lifetime If the ccache doesn't have a intial TGT the shortest lifetime of service tickets should be returned. This is needed in order to work with special ccaches used for things like S2U4Self/S4U2Proxy tickets or other things where the caller only wants to pass a single service ticket. Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit e58f83d3958d7b6a16d7d75a7a266cead4befb48 Author: Stefan Metzmacher <me...@samba.org> Date: Wed Apr 3 16:00:41 2024 +0200 s3:libads: don't dump securityIdentifier and msDS-TrustForestTrustInfo as strings Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> commit e6f92edba690923ec8ef427bc6d5b30d609c129a Author: Stefan Metzmacher <me...@samba.org> Date: Wed Apr 3 16:35:35 2024 +0200 s3:notify: don't log user_can_stat_name_under_fsp with level 0 for OBJECT_NAME_NOT_FOUND Signed-off-by: Stefan Metzmacher <me...@samba.org> Reviewed-by: Andreas Schneider <a...@samba.org> ----------------------------------------------------------------------- Summary of changes: auth/credentials/credentials_krb5.c | 9 ++++----- lib/cmdline/cmdline.c | 28 +++++++++++++++------------- lib/krb5_wrap/krb5_samba.c | 28 +++++++++++++++++++++++++++- python/samba/getopt.py | 1 + source3/libads/ldap.c | 2 ++ source3/libsmb/auth_generic.c | 2 +- source3/libsmb/cliconnect.c | 18 +++++++++++++++++- source3/smbd/notify.c | 11 ++++++++--- 8 files changed, 75 insertions(+), 24 deletions(-) Changeset truncated at 500 lines: diff --git a/auth/credentials/credentials_krb5.c b/auth/credentials/credentials_krb5.c index c388f6c82df..dcfa2e4daee 100644 --- a/auth/credentials/credentials_krb5.c +++ b/auth/credentials/credentials_krb5.c @@ -109,13 +109,13 @@ static uint32_t smb_gss_krb5_copy_ccache(uint32_t *min_stat, */ maj_stat = gss_krb5_copy_ccache(min_stat, cred, dummy_ccache); if (maj_stat != 0) { - krb5_cc_close(context, dummy_ccache); + krb5_cc_destroy(context, dummy_ccache); return maj_stat; } code = krb5_cc_start_seq_get(context, dummy_ccache, &cursor); if (code != 0) { - krb5_cc_close(context, dummy_ccache); + krb5_cc_destroy(context, dummy_ccache); *min_stat = EINVAL; return GSS_S_FAILURE; } @@ -125,7 +125,7 @@ static uint32_t smb_gss_krb5_copy_ccache(uint32_t *min_stat, &cursor, &creds); if (code != 0) { - krb5_cc_close(context, dummy_ccache); + krb5_cc_destroy(context, dummy_ccache); *min_stat = EINVAL; return GSS_S_FAILURE; } @@ -163,7 +163,7 @@ static uint32_t smb_gss_krb5_copy_ccache(uint32_t *min_stat, krb5_cc_end_seq_get(context, dummy_ccache, &cursor); code = 0; } - krb5_cc_close(context, dummy_ccache); + krb5_cc_destroy(context, dummy_ccache); if (code != 0 || princ == NULL) { krb5_free_cred_contents(context, &creds); @@ -647,7 +647,6 @@ static int cli_credentials_new_ccache(struct cli_credentials *cred, ccache_name, smb_get_krb5_error_message(ccc->smb_krb5_context->krb5_context, ret, ccc)); - talloc_free(ccache_name); talloc_free(ccc); return ret; } diff --git a/lib/cmdline/cmdline.c b/lib/cmdline/cmdline.c index db962146bd2..6f081324e64 100644 --- a/lib/cmdline/cmdline.c +++ b/lib/cmdline/cmdline.c @@ -803,19 +803,6 @@ static void popt_common_credentials_callback(poptContext popt_ctx, "Unable to read defaults from smb.conf\n"); } - (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); - if (!ok) { - fprintf(stderr, - "Failed to set cmdline password " - "callback\n"); - exit(1); - } - } - if (machine_account_pending) { NTSTATUS status; @@ -850,6 +837,21 @@ static void popt_common_credentials_callback(poptContext popt_ctx, CRED_SPECIFIED); } + if (!skip_password_callback) { + (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); + if (!ok) { + fprintf(stderr, + "Failed to set cmdline password " + "callback\n"); + exit(1); + } + } + return; } diff --git a/lib/krb5_wrap/krb5_samba.c b/lib/krb5_wrap/krb5_samba.c index 6865b049b77..7cc28697e81 100644 --- a/lib/krb5_wrap/krb5_samba.c +++ b/lib/krb5_wrap/krb5_samba.c @@ -3028,6 +3028,7 @@ krb5_error_code smb_krb5_cc_get_lifetime(krb5_context context, krb5_cc_cursor cursor; krb5_error_code kerr; krb5_creds cred; + krb5_timestamp endtime = 0; krb5_timestamp now; *t = 0; @@ -3043,20 +3044,45 @@ krb5_error_code smb_krb5_cc_get_lifetime(krb5_context context, } while ((kerr = krb5_cc_next_cred(context, id, &cursor, &cred)) == 0) { + if (krb5_is_config_principal(context, cred.server)) { + krb5_free_cred_contents(context, &cred); + continue; + } + #ifndef HAVE_FLAGS_IN_KRB5_CREDS if (cred.ticket_flags & TKT_FLG_INITIAL) { #else if (cred.flags.b.initial) { #endif if (now < cred.times.endtime) { - *t = (time_t) (cred.times.endtime - now); + endtime = cred.times.endtime; } krb5_free_cred_contents(context, &cred); break; } + + if (cred.times.endtime <= now) { + /* already expired */ + krb5_free_cred_contents(context, &cred); + continue; + } + + /** + * If there was no krbtgt, use the shortest lifetime of + * service tickets that have yet to expire. If all + * credentials are expired, krb5_cc_get_lifetime() will fail. + */ + if (endtime == 0 || cred.times.endtime < endtime) { + endtime = cred.times.endtime; + } krb5_free_cred_contents(context, &cred); } + if (now < endtime) { + *t = (time_t) (endtime - now); + kerr = 0; + } + krb5_cc_end_seq_get(context, id, &cursor); return kerr; diff --git a/python/samba/getopt.py b/python/samba/getopt.py index 0935ed00d40..2620138c3de 100644 --- a/python/samba/getopt.py +++ b/python/samba/getopt.py @@ -439,6 +439,7 @@ class CredentialsOptions(OptionGroup): self.creds.set_bind_dn(arg) def _set_krb5_ccache(self, option, opt_str, arg, parser): + self.ask_for_password = False self.creds.set_kerberos_state(MUST_USE_KERBEROS) self.creds.set_named_ccache(arg) diff --git a/source3/libads/ldap.c b/source3/libads/ldap.c index 4d4afb279c8..04b2f35022d 100644 --- a/source3/libads/ldap.c +++ b/source3/libads/ldap.c @@ -2906,11 +2906,13 @@ static bool ads_dump_field(ADS_STRUCT *ads, char *field, void **values, void *da {"nTSecurityDescriptor", False, dump_sd}, {"dnsRecord", False, dump_binary}, {"objectSid", False, dump_sid}, + {"securityIdentifier", False, dump_sid}, {"tokenGroups", False, dump_sid}, {"tokenGroupsNoGCAcceptable", False, dump_sid}, {"tokengroupsGlobalandUniversal", False, dump_sid}, {"mS-DS-CreatorSID", False, dump_sid}, {"msExchMailboxGuid", False, dump_guid}, + {"msDS-TrustForestTrustInfo", False, dump_binary}, {NULL, True, NULL} }; int i; diff --git a/source3/libsmb/auth_generic.c b/source3/libsmb/auth_generic.c index e5120a083a6..527b51900d8 100644 --- a/source3/libsmb/auth_generic.c +++ b/source3/libsmb/auth_generic.c @@ -51,7 +51,7 @@ NTSTATUS auth_generic_set_password(struct auth_generic_state *ans, NTSTATUS auth_generic_set_creds(struct auth_generic_state *ans, struct cli_credentials *creds) { - talloc_unlink(ans->credentials, creds); + talloc_unlink(ans, ans->credentials); ans->credentials = creds; return NT_STATUS_OK; } diff --git a/source3/libsmb/cliconnect.c b/source3/libsmb/cliconnect.c index d42f08fbb1a..169960282a4 100644 --- a/source3/libsmb/cliconnect.c +++ b/source3/libsmb/cliconnect.c @@ -2424,9 +2424,25 @@ NTSTATUS cli_tree_connect_creds(struct cli_state *cli, const char *share, const char *dev, struct cli_credentials *creds) { + bool need_pass = false; const char *pw = NULL; - if (creds != NULL) { + /* + * We should work out if the protocol + * will make use of a password for share level + * authentication before we may cause + * the password prompt to be called. + */ + if (smbXcli_conn_protocol(cli->conn) < PROTOCOL_SMB2_02) { + uint16_t sec_mode = smb1cli_conn_server_security_mode(cli->conn); + + /* in user level security don't send a password now */ + if (!(sec_mode & NEGOTIATE_SECURITY_USER_LEVEL)) { + need_pass = true; + } + } + + if (need_pass && creds != NULL) { pw = cli_credentials_get_password(creds); } diff --git a/source3/smbd/notify.c b/source3/smbd/notify.c index 850193eccf3..d08df3c8380 100644 --- a/source3/smbd/notify.c +++ b/source3/smbd/notify.c @@ -651,9 +651,14 @@ static bool user_can_stat_name_under_fsp(files_struct *fsp, const char *name) 0, &fname); if (!NT_STATUS_IS_OK(status)) { - DBG_ERR("synthetic_pathref failed for %s, error %s\n", - filepath, - nt_errstr(status)); + int dbg_lvl = DBGLVL_ERR; + if (NT_STATUS_EQUAL(status, NT_STATUS_OBJECT_NAME_NOT_FOUND)) { + dbg_lvl = DBGLVL_DEBUG; + } + DBG_PREFIX(dbg_lvl, ( + "synthetic_pathref failed for %s, error %s\n", + filepath, + nt_errstr(status))); TALLOC_FREE(fname); TALLOC_FREE(filepath); return false; -- Samba Shared Repository