diff -Nru muddleftpd-1.3.7.4-zakcus/authanon.c muddleftpd-1.3.7.4-zakcus4/authanon.c --- muddleftpd-1.3.7.4-zakcus/authanon.c 2002-04-10 14:26:25.000000000 +0200 +++ muddleftpd-1.3.7.4-zakcus4/authanon.c 2004-06-11 02:17:37.254431864 +0200 @@ -93,4 +93,6 @@ anonauth_gethandle, anonauth_freehandle, NULL, + NULL, + NULL, }; diff -Nru muddleftpd-1.3.7.4-zakcus/auth.c muddleftpd-1.3.7.4-zakcus4/auth.c --- muddleftpd-1.3.7.4-zakcus/auth.c 2001-03-15 04:26:24.000000000 +0100 +++ muddleftpd-1.3.7.4-zakcus4/auth.c 2004-06-11 02:24:01.100078456 +0200 @@ -27,6 +27,7 @@ { "anonymous", &anonauth_commands }, { "internal", &internalauth_commands }, { "disabled", &disableauth_commands }, + { "user", &userauth_commands }, #ifdef HAVE_PAM_START { "pam", &pamauth_commands }, #endif @@ -266,6 +267,12 @@ tokenset_settoken(tset, 'G', makegidliststr(list)); freewrapper(list); } +#if 1 + if (s->getbaseuser) + tokenset_settoken(tset, 'S', strdupwrapper(s->getbaseuser(a))); + if (s->getsubuser) + tokenset_settoken(tset, 's', strdupwrapper(s->getsubuser(a))); +#endif } void setupacls(FTPSTATE *peer, TOKENSET *tset, int section, char *funcname, int aclfunc) diff -Nru muddleftpd-1.3.7.4-zakcus/authdisable.c muddleftpd-1.3.7.4-zakcus4/authdisable.c --- muddleftpd-1.3.7.4-zakcus/authdisable.c 2000-08-02 05:32:46.000000000 +0200 +++ muddleftpd-1.3.7.4-zakcus4/authdisable.c 2004-06-11 02:17:27.678887568 +0200 @@ -44,4 +44,6 @@ disableauth_gethandle, disableauth_freehandle, NULL, + NULL, + NULL, }; diff -Nru muddleftpd-1.3.7.4-zakcus/auth.h muddleftpd-1.3.7.4-zakcus4/auth.h --- muddleftpd-1.3.7.4-zakcus/auth.h 2000-07-27 04:05:14.000000000 +0200 +++ muddleftpd-1.3.7.4-zakcus4/auth.h 2004-06-11 02:22:35.877034328 +0200 @@ -10,6 +10,8 @@ gid_t *(* getusersupgid)(void *); void *(* gethandle)(FTPSTATE *peer, TOKENSET *tset, char *username, int *err); void (* freehandle)(void *); + char *(* getbaseuser)(void *); + char *(* getsubuser)(void *); void *handle; } PERMSTRUCT; @@ -17,6 +19,7 @@ extern PERMSTRUCT anonauth_commands; extern PERMSTRUCT internalauth_commands; extern PERMSTRUCT disableauth_commands; +extern PERMSTRUCT userauth_commands; #ifdef HAVE_PAM_START extern PERMSTRUCT pamauth_commands; diff -Nru muddleftpd-1.3.7.4-zakcus/authint.c muddleftpd-1.3.7.4-zakcus4/authint.c --- muddleftpd-1.3.7.4-zakcus/authint.c 2000-08-01 18:04:17.000000000 +0200 +++ muddleftpd-1.3.7.4-zakcus4/authint.c 2004-06-11 02:17:52.808067352 +0200 @@ -143,4 +143,6 @@ internalauth_gethandle, internalauth_freehandle, NULL, + NULL, + NULL, }; diff -Nru muddleftpd-1.3.7.4-zakcus/authpam.c muddleftpd-1.3.7.4-zakcus4/authpam.c --- muddleftpd-1.3.7.4-zakcus/authpam.c 2000-07-27 04:10:01.000000000 +0200 +++ muddleftpd-1.3.7.4-zakcus4/authpam.c 2004-06-11 02:18:01.258782648 +0200 @@ -235,6 +235,8 @@ pamauth_gethandle, pamauth_freehandle, NULL, + NULL, + NULL, }; #endif diff -Nru muddleftpd-1.3.7.4-zakcus/authunix.c muddleftpd-1.3.7.4-zakcus4/authunix.c --- muddleftpd-1.3.7.4-zakcus/authunix.c 2000-08-01 16:23:53.000000000 +0200 +++ muddleftpd-1.3.7.4-zakcus4/authunix.c 2004-06-11 02:17:17.489436600 +0200 @@ -166,4 +166,6 @@ unixauth_gethandle, unixauth_freehandle, NULL, + NULL, + NULL, }; diff -Nru muddleftpd-1.3.7.4-zakcus/authuser.c muddleftpd-1.3.7.4-zakcus4/authuser.c --- muddleftpd-1.3.7.4-zakcus/authuser.c 1970-01-01 01:00:00.000000000 +0100 +++ muddleftpd-1.3.7.4-zakcus4/authuser.c 2004-06-11 02:25:29.542633144 +0200 @@ -0,0 +1,230 @@ +/* Copyright (C) 1999 Beau Kuiper + Copyright (C) 2004 Krzysztof Rusocki + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "ftpd.h" +#include "auth.h" + +#define GOT_USER 1 +#define NOT_GOT_USER 0 + +typedef struct +{ + struct passwd *passent; /* baseuser */ + char *username; /* subuser */ + + char *udata; + + char *password; + char *rootdir; + char *homedir; +} PASSWDSTRUCT; + +int userauth_config(char *username, char *data, int line, void *h) +{ + PASSWDSTRUCT *handle = (PASSWDSTRUCT *)h; + + if (strcmp(username, handle->username) == 0) + { + handle->udata = strdupwrapper(data); + return(GOT_USER); + } + return(NOT_GOT_USER); +} + + +void *userauth_gethandle(FTPSTATE *peer, TOKENSET *tset, char *username, int *err) +{ + PASSWDSTRUCT *newhandle; + int result, error, line; + + char * dot; + char * rusername; /* real user name */ + char * susername; /* sub-user name */ + int rlen; + int tmplen; + + char * passpath; /* passfile path, relative to user's pw_dir */ + char * fullpasspath; + + printf("user: %s\n", username); + + newhandle = mallocwrapper(sizeof(PASSWDSTRUCT)); + + newhandle->passent = getpwnam(username); + if (newhandle->passent != NULL) + goto error; + + dot = strrchr(username, '.'); + if (dot == NULL) + goto error; + + rlen = dot - username; + rusername = mallocwrapper(rlen + 1); + susername = strdupwrapper(dot + 1); + + memcpy(rusername, username, rlen); + rusername[rlen] = '\0'; + + /* now we have real user and sub-user names ready */ + newhandle->passent = getpwnam(rusername); + if (newhandle->passent == NULL) { + freewrapper(rusername); + freewrapper(susername); + goto error; + } + + printf("I stand ready, %s:%s\n", rusername, susername); + + passpath = mktokconfstr(tset, auth_getcursectionid(peer), "userauth_passfile", "ftp/passwd"); + if (passpath == NULL) { + freewrapper(rusername); + freewrapper(susername); + goto error; + } + + rlen = strlen(passpath); + tmplen = strlen(newhandle->passent->pw_dir); + fullpasspath = mallocwrapper(rlen + tmplen + 2); + memcpy(fullpasspath, newhandle->passent->pw_dir, tmplen); + fullpasspath[tmplen] = '/'; + memcpy(fullpasspath + tmplen + 1, passpath, rlen); + fullpasspath[rlen + tmplen + 1] = '\0'; + freewrapper(passpath); + + printf("fullpasspath: %s\n", fullpasspath); + + /* make sure that the password file is secure */ + newhandle->username = susername; + result = loadconfigfile(fullpasspath, userauth_config, newhandle, TRUE, &error, &line); + + switch (result) + { + case CONFIG_OK: + newhandle->username = NULL; /* not really neccessary but... */ + freewrapper(fullpasspath); + freewrapper(rusername); + freewrapper(susername); + goto error; + case CONFIG_HANDLER_ERROR: + break; /* found the user */ + default: + newhandle->username = NULL; + freewrapper(fullpasspath); + freewrapper(rusername); + freewrapper(susername); + goto error; + } + + if (strchrcount(newhandle->udata, ':') != 2) + { + freewrapper(fullpasspath); + freewrapper(rusername); + freewrapper(susername); + freewrapper(newhandle->udata); + goto error; + } + + newhandle->password = newhandle->udata; + newhandle->homedir = strchr(newhandle->udata, ':') + 1; + + /* lets hope this doesn't cause heart attacks. It may not + work with flakey C compilers */ + newhandle->homedir[-1] = 0; + newhandle->rootdir = strchr(newhandle->homedir, ':') + 1; + newhandle->rootdir[-1] = 0; + + freewrapper(fullpasspath); + freewrapper(rusername); + //freewrapper(susername); /* that has been put in handle->username */ + + *err = AUTH_OK; + printf("I'm hunger for battle!\n"); + return(newhandle); + +error: + *err = AUTH_USERNKNOW; + freewrapper(newhandle); + return(NULL); +} + +void userauth_freehandle(void *h) +{ + PASSWDSTRUCT *handle = (PASSWDSTRUCT *)h; + + freewrapper(handle->udata); + freewrapper(handle->username); + freewrapper(handle); +} + +int userauth_checkpasswd(void *h, char *password, char **errmsg) +{ + PASSWDSTRUCT *handle = (PASSWDSTRUCT *)h; + return(chkpassword(handle->password, password)); +} + +char *userauth_gethomedir(void *h) +{ + //return(((PASSWDSTRUCT *)h)->passent->pw_dir); + return "/"; +} + +char *userauth_getrootdir(void *h) +{ + return("/"); +} + +uid_t userauth_getuseruid(void *h) +{ + return(((PASSWDSTRUCT *)h)->passent->pw_uid); +} + +gid_t userauth_getusergid(void *h) +{ + return(((PASSWDSTRUCT *)h)->passent->pw_gid); +} + +gid_t *userauth_getusersupgid(void *h) +{ + return(getusergrouplist(((PASSWDSTRUCT *)h)->passent->pw_name)); +} + +char *userauth_getbaseuser(void *h) +{ + PASSWDSTRUCT *handle = (PASSWDSTRUCT *)h; + return(handle->passent->pw_name); +} + +char *userauth_getsubuser(void *h) +{ + PASSWDSTRUCT *handle = (PASSWDSTRUCT *)h; + return(handle->username); +} + +PERMSTRUCT userauth_commands = +{ + userauth_checkpasswd, + userauth_gethomedir, + userauth_getrootdir, + userauth_getuseruid, + userauth_getusergid, + userauth_getusersupgid, + userauth_gethandle, + userauth_freehandle, + userauth_getbaseuser, + userauth_getsubuser, + NULL, +}; diff -Nru muddleftpd-1.3.7.4-zakcus/Makefile.in muddleftpd-1.3.7.4-zakcus4/Makefile.in --- muddleftpd-1.3.7.4-zakcus/Makefile.in 2001-03-20 04:34:07.000000000 +0100 +++ muddleftpd-1.3.7.4-zakcus4/Makefile.in 2004-06-10 20:36:14.270318760 +0200 @@ -36,7 +36,8 @@ ftp.c ftplist.c ftpout.c ftpsite.c ftpstat.c ftpstate.c ftptrans.c \ init.c logger.c main.c myglob.c newfile.c procnum.c proxy.c ratio.c \ select.c shmem.c socket.c string.c utils.c version.c \ - util/pwgrent.c util/snprintf.c util/strerror.c + util/pwgrent.c util/snprintf.c util/strerror.c \ + authuser.c WHOSRC = ftpwho.c util/strerror.c utils.c string.c config.c newfile.c \ version.c util/snprintf.c util/pwgrent.c