From 888f922bd0d1c84a687d404e95ae314a9dd0aee1 Mon Sep 17 00:00:00 2001 From: Derrell Lipman Date: Tue, 8 Jul 2008 20:44:39 -0400 Subject: [PATCH] [BUG 5580] Allow access to DFS shares via libsmbclient Brian Sheehan provided a nice patch intended for the 3.0 code base. This commit applies a similar patch for the 3.3 code base. It adds a new public function to libsmbclient -- smbc_set_credentials() -- that may be called from the authentication callback when DFS referrals are in use. Derrell --- source/include/libsmbclient.h | 27 +++++++++++++++++++++++++++ source/include/proto.h | 1 + source/lib/util.c | 5 +++++ source/libsmb/libsmb_context.c | 20 ++++++++++++++++++++ 4 files changed, 53 insertions(+) diff --git a/source/include/libsmbclient.h b/source/include/libsmbclient.h index 74d0d5c9ddb..2828e9e7805 100644 --- a/source/include/libsmbclient.h +++ b/source/include/libsmbclient.h @@ -2561,6 +2561,33 @@ smbc_version(void); } #endif +/**@ingroup misc + * Set the users credentials globally so they can be used for DFS + * referrals. Probably best to use this function in the smbc_get_auth_data_fn + * callback. + * + * @param workgroup Workgroup of the user. + * + * @param user Username of user. + * + * @param password Password of user. + * + * @param use_kerberos Whether to use Kerberos + * + * @param signing_state One of these strings (all equivalents on same line): + * "off", "no", "false" + * "on", "yes", "true", "auto" + * "force", "required", "forced" + */ + +void +smbc_set_credentials(char *workgroup, + char *user, + char *password, + bool use_kerberos, + char *signing_state); + + /** * @ingroup structure * Structure that contains a client context information diff --git a/source/include/proto.h b/source/include/proto.h index 2a954f4efeb..665a86d2c8b 100644 --- a/source/include/proto.h +++ b/source/include/proto.h @@ -1271,6 +1271,7 @@ const char *get_cmdline_auth_info_password(void); void set_cmdline_auth_info_password(const char *password); bool set_cmdline_auth_info_signing_state(const char *arg); int get_cmdline_auth_info_signing_state(void); +void set_cmdline_auth_info_use_kerberos(bool b); bool get_cmdline_auth_info_use_kerberos(void); void set_cmdline_auth_info_use_krb5_ticket(void); void set_cmdline_auth_info_smb_encrypt(void); diff --git a/source/lib/util.c b/source/lib/util.c index 68524a21ce0..8d744a5ae3b 100644 --- a/source/lib/util.c +++ b/source/lib/util.c @@ -353,6 +353,11 @@ int get_cmdline_auth_info_signing_state(void) return cmdline_auth_info.signing_state; } +void set_cmdline_auth_info_use_kerberos(bool b) +{ + cmdline_auth_info.use_kerberos = b; +} + bool get_cmdline_auth_info_use_kerberos(void) { return cmdline_auth_info.use_kerberos; diff --git a/source/libsmb/libsmb_context.c b/source/libsmb/libsmb_context.c index dd78bcee355..51948d16487 100644 --- a/source/libsmb/libsmb_context.c +++ b/source/libsmb/libsmb_context.c @@ -610,3 +610,23 @@ smbc_version(void) } +/* + * Set the credentials so DFS will work when following referrals. + */ +void +smbc_set_credentials(char *workgroup, + char *user, + char *password, + bool use_kerberos, + char *signing_state) +{ + + set_cmdline_auth_info_username(user); + set_cmdline_auth_info_password(password); + set_cmdline_auth_info_use_kerberos(use_kerberos); + if (! set_cmdline_auth_info_signing_state(signing_state)) { + DEBUG(0, ("Invalid signing state: %s", signing_state)); + } + set_global_myworkgroup(workgroup); + cli_cm_set_credentials(); +} -- 2.11.4.GIT