From: Derrell Lipman Date: Wed, 9 Jul 2008 00:44:39 +0000 (-0400) Subject: [BUG 5580] Allow access to DFS shares via libsmbclient X-Git-Tag: samba-3.3.0pre1~610 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=888f922bd0d1c84a687d404e95ae314a9dd0aee1;p=thirdparty%2Fsamba.git [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 --- 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(); +}