/* ** Copyright 1998 - 1999 Double Precision, Inc. See COPYING for ** distribution information. */ #if HAVE_CONFIG_H #include "courier_auth_config.h" #endif #include #include #include #include #include #if HAVE_UNISTD_H #include #endif #include "auth.h" #include "courierauthdebug.h" #include "userdb/userdb.h" static const char rcsid[]="$Id: preauthuserdbcommon.c,v 1.21 2006/10/28 19:22:52 mrsam Exp $"; int auth_userdb_pre_common(const char *userid, const char *service, int needpass, int (*callback)(struct authinfo *, void *), void *arg) { char *u; struct userdbs *udb; struct authinfo auth; char *udbs; char *services; char *passwords=0; int rc; userdb_set_debug(courier_authdebug_login_level); userdb_init(USERDB ".dat"); /* We rely on DPRINTF doing 'safe' printing */ DPRINTF("userdb: looking up '%s'", userid); if ( (u=userdb(userid)) == 0) { userdb_close(); errno=EPERM; return (-1); } if ((udb=userdb_creates(u)) == 0) { free(u); return (-1); } free(u); memset(&auth, 0, sizeof(auth)); auth.sysuserid= &udb->udb_uid; auth.sysgroupid=udb->udb_gid; auth.homedir=udb->udb_dir; auth.address=userid; auth.fullname=udb->udb_gecos; auth.options=udb->udb_options; if (needpass) { udbs=userdbshadow(USERDB "shadow.dat", userid); if (udbs) { if ((services=malloc(strlen(service)+sizeof("pw"))) == 0) { perror("malloc"); free(udbs); userdb_frees(udb); return (1); } strcat(strcpy(services, service), "pw"); passwords=userdb_gets(udbs, services); if (passwords) { DPRINTF("found %s in userdbshadow", services); } else { passwords=userdb_gets(udbs, "systempw"); if (passwords) { DPRINTF("found systempw in userdbshadow"); } else { DPRINTF("no %s or systempw value in userdbshadow for %s", services, userid); } } free(services); free(udbs); } auth.passwd=passwords; } auth.maildir=udb->udb_mailbox; auth.quota=udb->udb_quota; courier_authdebug_authinfo("DEBUG: authuserdb: ", &auth, 0, passwords); rc= (*callback)(&auth, arg); if (passwords) free(passwords); userdb_frees(udb); return (rc); } void auth_userdb_cleanup() { userdb_close(); } void auth_userdb_enumerate( void(*cb_func)(const char *name, uid_t uid, gid_t gid, const char *homedir, const char *maildir, const char *options, void *void_arg), void *void_arg) { struct userdbs *u; userdb_init(USERDB ".dat"); for (u=userdb_enum_first(); u; u=userdb_enum_next()) { (*cb_func)(u->udb_name, u->udb_uid, u->udb_gid, u->udb_dir, u->udb_mailbox, u->udb_options, void_arg); userdb_frees(u); } (*cb_func)(NULL, 0, 0, NULL, NULL, NULL, void_arg); }