/* See LICENSE file for copyright and license details. */ #include #include #include #include #include #include #include #include #include #include "../passwd.h" #include "../text.h" #include "../util.h" /* Returns -1 on error, 0 for incorrect password * and 1 if all went OK */ int pw_check(const struct passwd *pw, const char *pass) { char *cryptpass, *p; struct spwd *spw; p = pw->pw_passwd; if (p[0] == '!' || p[0] == '*') { weprintf("denied\n"); return -1; } if (pw->pw_passwd[0] == '\0') { if (pass[0] == '\0') return 1; weprintf("incorrect password\n"); return 0; } if (pw->pw_passwd[0] == 'x' && pw->pw_passwd[1] == '\0') { errno = 0; spw = getspnam(pw->pw_name); if (!spw) { if (errno) weprintf("getspnam: %s:", pw->pw_name); else weprintf("who are you?\n"); return -1; } p = spw->sp_pwdp; if (p[0] == '!' || p[0] == '*') { weprintf("denied\n"); return -1; } } cryptpass = crypt(pass, p); if (!cryptpass) { weprintf("crypt:"); return -1; } if (strcmp(cryptpass, p) != 0) { weprintf("incorrect password\n"); return 0; } return 1; } int pw_init(void) { struct rlimit rlim; rlim.rlim_cur = 0; rlim.rlim_max = 0; if (setrlimit(RLIMIT_CORE, &rlim) < 0) eprintf("setrlimit:"); return 0; }