GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: usr.bin/ssh/sshd/../auth-passwd.c Lines: 0 41 0.0 %
Date: 2017-11-07 Branches: 0 22 0.0 %

Line Branch Exec Source
1
/* $OpenBSD: auth-passwd.c,v 1.45 2016/07/21 01:39:35 dtucker Exp $ */
2
/*
3
 * Author: Tatu Ylonen <ylo@cs.hut.fi>
4
 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5
 *                    All rights reserved
6
 * Password authentication.  This file contains the functions to check whether
7
 * the password is valid for the user.
8
 *
9
 * As far as I am concerned, the code I have written for this software
10
 * can be used freely for any purpose.  Any derived versions of this
11
 * software must be clearly marked as such, and if the derived work is
12
 * incompatible with the protocol description in the RFC file, it must be
13
 * called by a name other than "ssh" or "Secure Shell".
14
 *
15
 * Copyright (c) 1999 Dug Song.  All rights reserved.
16
 * Copyright (c) 2000 Markus Friedl.  All rights reserved.
17
 *
18
 * Redistribution and use in source and binary forms, with or without
19
 * modification, are permitted provided that the following conditions
20
 * are met:
21
 * 1. Redistributions of source code must retain the above copyright
22
 *    notice, this list of conditions and the following disclaimer.
23
 * 2. Redistributions in binary form must reproduce the above copyright
24
 *    notice, this list of conditions and the following disclaimer in the
25
 *    documentation and/or other materials provided with the distribution.
26
 *
27
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
28
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
29
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
30
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
31
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
32
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
33
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
34
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
35
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
36
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37
 */
38
39
#include <sys/types.h>
40
41
#include <login_cap.h>
42
#include <pwd.h>
43
#include <stdio.h>
44
#include <string.h>
45
#include <stdarg.h>
46
47
#include "packet.h"
48
#include "buffer.h"
49
#include "log.h"
50
#include "misc.h"
51
#include "servconf.h"
52
#include "key.h"
53
#include "hostfile.h"
54
#include "auth.h"
55
#include "auth-options.h"
56
57
extern Buffer loginmsg;
58
extern ServerOptions options;
59
int sys_auth_passwd(Authctxt *, const char *);
60
61
extern login_cap_t *lc;
62
63
#define DAY		(24L * 60 * 60) /* 1 day in seconds */
64
#define TWO_WEEKS	(2L * 7 * DAY)	/* 2 weeks in seconds */
65
66
#define MAX_PASSWORD_LEN	1024
67
68
static void
69
disable_forwarding(void)
70
{
71
	no_port_forwarding_flag = 1;
72
	no_agent_forwarding_flag = 1;
73
	no_x11_forwarding_flag = 1;
74
}
75
76
/*
77
 * Tries to authenticate the user using password.  Returns true if
78
 * authentication succeeds.
79
 */
80
int
81
auth_password(Authctxt *authctxt, const char *password)
82
{
83
	struct passwd * pw = authctxt->pw;
84
	int ok = authctxt->valid;
85
86
	if (strlen(password) > MAX_PASSWORD_LEN)
87
		return 0;
88
89
	if (pw->pw_uid == 0 && options.permit_root_login != PERMIT_YES)
90
		ok = 0;
91
	if (*password == '\0' && options.permit_empty_passwd == 0)
92
		return 0;
93
#ifdef KRB5
94
	if (options.kerberos_authentication == 1) {
95
		int ret = auth_krb5_password(authctxt, password);
96
		if (ret == 1 || ret == 0)
97
			return ret && ok;
98
		/* Fall back to ordinary passwd authentication. */
99
	}
100
#endif
101
	return (sys_auth_passwd(authctxt, password) && ok);
102
}
103
104
static void
105
warn_expiry(Authctxt *authctxt, auth_session_t *as)
106
{
107
	char buf[256];
108
	quad_t pwtimeleft, actimeleft, daysleft, pwwarntime, acwarntime;
109
110
	pwwarntime = acwarntime = TWO_WEEKS;
111
112
	pwtimeleft = auth_check_change(as);
113
	actimeleft = auth_check_expire(as);
114
	if (authctxt->valid) {
115
		pwwarntime = login_getcaptime(lc, "password-warn", TWO_WEEKS,
116
		    TWO_WEEKS);
117
		acwarntime = login_getcaptime(lc, "expire-warn", TWO_WEEKS,
118
		    TWO_WEEKS);
119
	}
120
	if (pwtimeleft != 0 && pwtimeleft < pwwarntime) {
121
		daysleft = pwtimeleft / DAY + 1;
122
		snprintf(buf, sizeof(buf),
123
		    "Your password will expire in %lld day%s.\n",
124
		    daysleft, daysleft == 1 ? "" : "s");
125
		buffer_append(&loginmsg, buf, strlen(buf));
126
	}
127
	if (actimeleft != 0 && actimeleft < acwarntime) {
128
		daysleft = actimeleft / DAY + 1;
129
		snprintf(buf, sizeof(buf),
130
		    "Your account will expire in %lld day%s.\n",
131
		    daysleft, daysleft == 1 ? "" : "s");
132
		buffer_append(&loginmsg, buf, strlen(buf));
133
	}
134
}
135
136
int
137
sys_auth_passwd(Authctxt *authctxt, const char *password)
138
{
139
	struct passwd *pw = authctxt->pw;
140
	auth_session_t *as;
141
	static int expire_checked = 0;
142
143
	as = auth_usercheck(pw->pw_name, authctxt->style, "auth-ssh",
144
	    (char *)password);
145
	if (as == NULL)
146
		return (0);
147
	if (auth_getstate(as) & AUTH_PWEXPIRED) {
148
		auth_close(as);
149
		disable_forwarding();
150
		authctxt->force_pwchange = 1;
151
		return (1);
152
	} else {
153
		if (!expire_checked) {
154
			expire_checked = 1;
155
			warn_expiry(authctxt, as);
156
		}
157
		return (auth_close(as));
158
	}
159
}