/* * pam_ftp module * * 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 #include #include #include #include "pam_inline.h" /* 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) { const char *str; /* generic options */ if (!strcmp(*argv,"debug")) ctrl |= PAM_DEBUG_ARG; else if (!strcmp(*argv,"ignore")) ctrl |= PAM_IGNORE_EMAIL; else if ((str = pam_str_skip_prefix(*argv, "users=")) != NULL) *users = str; 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, char **_user) { int anon = 0; if (list && *list) { const char *l; char *list_copy, *x; char *sptr = NULL; list_copy = strdup(list); x = list_copy; while (list_copy && (l = strtok_r(x, ",", &sptr))) { x = NULL; if (!strcmp(name, l)) { *_user = list_copy; anon = 1; break; } } if (*_user != list_copy) { free(list_copy); } } else { #define MAX_L 2 static const char *l[MAX_L] = { "ftp", "anonymous" }; int i; for (i=0; i