/* pam_ftp module */ /* * $Id: pam_ftp.c,v 1.14 2009/03/27 10:46:11 kukuk Exp $ * * Written by Andrew Morgan 1996/3/11 * */ #define PLEASE_ENTER_PASSWORD "Password required for %s." #define GUEST_LOGIN_PROMPT "Guest login ok, " \ "send your complete e-mail address as password." /* the following is a password that "can't be correct" */ #define BLOCK_PASSWORD "\177BAD PASSWPRD\177" #include "config.h" #include #include #include #include #include #include /* * here, we make a definition for the externally accessible function * in this file (this definition is required for static a module * but strongly encouraged generally) it is used to instruct the * modules include file to define the function prototypes. */ #define PAM_SM_AUTH #include #include #include /* argument parsing */ #define PAM_DEBUG_ARG 01 #define PAM_IGNORE_EMAIL 02 #define PAM_NO_ANON 04 static int _pam_parse(pam_handle_t *pamh, int argc, const char **argv, const char **users) { int ctrl=0; /* step through arguments */ for (ctrl=0; argc-- > 0; ++argv) { /* generic options */ if (!strcmp(*argv,"debug")) ctrl |= PAM_DEBUG_ARG; else if (!strncmp(*argv,"users=",6)) { *users = 6 + *argv; } else if (!strcmp(*argv,"ignore")) { ctrl |= PAM_IGNORE_EMAIL; } else { pam_syslog(pamh, LOG_ERR, "unknown option: %s", *argv); } } return ctrl; } /* * check if name is in list or default list. place users name in *_user * return 1 if listed 0 if not. */ static int lookup(const char *name, const char *list, const char **_user) { int anon = 0; *_user = name; /* this is the default */ if (list && *list) { const char *l; char *list_copy, *x; char *sptr = NULL; list_copy = x_strdup(list); x = list_copy; while (list_copy && (l = strtok_r(x, ",", &sptr))) { x = NULL; if (!strcmp(name, l)) { *_user = list; anon = 1; } } _pam_overwrite(list_copy); _pam_drop(list_copy); } else { #define MAX_L 2 static const char *l[MAX_L] = { "ftp", "anonymous" }; int i; for (i=0; i