master xplshn/aruu / shared / libutil / passwd.c
 1/* See LICENSE file for copyright and license details. */
 2#include <sys/resource.h>
 3#include <sys/time.h>
 4
 5#include <errno.h>
 6#include <pwd.h>
 7#include <shadow.h>
 8#include <stdio.h>
 9#include <stdlib.h>
10#include <string.h>
11#include <unistd.h>
12
13#include "../passwd.h"
14#include "../text.h"
15#include "../util.h"
16
17/* Returns -1 on error, 0 for incorrect password
18 * and 1 if all went OK */
19int
20pw_check(const struct passwd *pw, const char *pass)
21{
22	char *cryptpass, *p;
23	struct spwd *spw;
24
25	p = pw->pw_passwd;
26	if (p[0] == '!' || p[0] == '*') {
27		weprintf("denied\n");
28		return -1;
29	}
30
31	if (pw->pw_passwd[0] == '\0') {
32		if (pass[0] == '\0')
33			return 1;
34		weprintf("incorrect password\n");
35		return 0;
36	}
37
38	if (pw->pw_passwd[0] == 'x' && pw->pw_passwd[1] == '\0') {
39		errno = 0;
40		spw = getspnam(pw->pw_name);
41		if (!spw) {
42			if (errno)
43				weprintf("getspnam: %s:", pw->pw_name);
44			else
45				weprintf("who are you?\n");
46			return -1;
47		}
48		p = spw->sp_pwdp;
49		if (p[0] == '!' || p[0] == '*') {
50			weprintf("denied\n");
51			return -1;
52		}
53	}
54
55	cryptpass = crypt(pass, p);
56	if (!cryptpass) {
57		weprintf("crypt:");
58		return -1;
59	}
60	if (strcmp(cryptpass, p) != 0) {
61		weprintf("incorrect password\n");
62		return 0;
63	}
64	return 1;
65}
66
67int
68pw_init(void)
69{
70	struct rlimit rlim;
71
72	rlim.rlim_cur = 0;
73	rlim.rlim_max = 0;
74	if (setrlimit(RLIMIT_CORE, &rlim) < 0)
75		eprintf("setrlimit:");
76	return 0;
77}