From ae7911e4d85755085e5413b2de53155e19ac4a1a Mon Sep 17 00:00:00 2001 From: Tim Potter Date: Wed, 1 Nov 2000 04:31:19 +0000 Subject: Added a authentication hook to smbwrapper which allows a (username, workgroup, password) tuple to be provided by another function. (This used to be commit 644c78d64a6d7b7e44414c579de660321a0a6b34) --- source3/smbwrapper/smbw.c | 57 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 11 deletions(-) (limited to 'source3/smbwrapper/smbw.c') diff --git a/source3/smbwrapper/smbw.c b/source3/smbwrapper/smbw.c index 5532e687ce..362f7b4964 100644 --- a/source3/smbwrapper/smbw.c +++ b/source3/smbwrapper/smbw.c @@ -390,6 +390,34 @@ int smbw_errno(struct cli_state *c) return ret; } +/* Return a username and password given a server and share name */ + +void get_envvar_auth_data(char *server, char *share, char **workgroup, + char **username, char **password) +{ + /* Fall back to shared memory/environment variables */ + + *username = smbw_getshared("USER"); + if (!*username) *username = getenv("USER"); + if (!*username) *username = "guest"; + + *workgroup = smbw_getshared("WORKGROUP"); + if (!*workgroup) *workgroup = lp_workgroup(); + + *password = smbw_getshared("PASSWORD"); + if (!*password) *password = ""; +} + +static smbw_get_auth_data_fn get_auth_data_fn = get_envvar_auth_data; + +/***************************************************** +set the get auth data function +******************************************************/ +void smbw_set_auth_data_fn(smbw_get_auth_data_fn fn) +{ + get_auth_data_fn = fn; +} + /***************************************************** return a connection to a server (existing or new) *******************************************************/ @@ -410,20 +438,13 @@ struct smbw_server *smbw_server(char *server, char *share) ip = ipzero; ZERO_STRUCT(c); - username = smbw_getshared("USER"); - if (!username) username = getenv("USER"); - if (!username) username = "guest"; - - workgroup = smbw_getshared("WORKGROUP"); - if (!workgroup) workgroup = lp_workgroup(); - - password = smbw_getshared("PASSWORD"); - if (!password) password = ""; - /* try to use an existing connection */ for (srv=smbw_srvs;srv;srv=srv->next) { if (strcmp(server,srv->server_name)==0 && - strcmp(share,srv->share_name)==0) return srv; + strcmp(share,srv->share_name)==0 && + strcmp(workgroup,srv->workgroup)==0 && + strcmp(username, srv->username) == 0) + return srv; } if (server[0] == 0) { @@ -434,6 +455,8 @@ struct smbw_server *smbw_server(char *server, char *share) make_nmb_name(&calling, global_myname, 0x0); make_nmb_name(&called , server, 0x20); + get_auth_data_fn(server, share, &workgroup, &username, &password); + DEBUG(4,("server_n=[%s] server=[%s]\n", server_n, server)); if ((p=strchr(server_n,'#')) && strcmp(p+1,"1D")==0) { @@ -539,6 +562,18 @@ struct smbw_server *smbw_server(char *server, char *share) goto failed; } + srv->workgroup = strdup(workgroup); + if (!srv->workgroup) { + errno = ENOMEM; + goto failed; + } + + srv->username = strdup(username); + if (!srv->username) { + errno = ENOMEM; + goto failed; + } + /* some programs play with file descriptors fairly intimately. We try to get out of the way by duping to a high fd number */ if (fcntl(SMBW_CLI_FD + srv->cli.fd, F_GETFD) && errno == EBADF) { -- cgit