]> andersk Git - gssapi-openssh.git/blame - openssh/auth-passwd.c
Import of openssh-SNAP-20040105
[gssapi-openssh.git] / openssh / auth-passwd.c
CommitLineData
3c0ef626 1/*
2 * Author: Tatu Ylonen <ylo@cs.hut.fi>
3 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4 * All rights reserved
5 * Password authentication. This file contains the functions to check whether
6 * the password is valid for the user.
7 *
8 * As far as I am concerned, the code I have written for this software
9 * can be used freely for any purpose. Any derived versions of this
10 * software must be clearly marked as such, and if the derived work is
11 * incompatible with the protocol description in the RFC file, it must be
12 * called by a name other than "ssh" or "Secure Shell".
13 *
14 * Copyright (c) 1999 Dug Song. All rights reserved.
15 * Copyright (c) 2000 Markus Friedl. All rights reserved.
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 * notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 * notice, this list of conditions and the following disclaimer in the
24 * documentation and/or other materials provided with the distribution.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
27 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
28 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
29 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
30 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
31 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
32 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
33 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
35 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 */
37
38#include "includes.h"
12408a1b 39RCSID("$OpenBSD: auth-passwd.c,v 1.30 2003/11/04 08:54:09 djm Exp $");
3c0ef626 40
41#include "packet.h"
3c0ef626 42#include "log.h"
43#include "servconf.h"
44#include "auth.h"
41b2f314 45#ifdef WITH_AIXAUTHENTICATE
0fff78ff 46# include "canohost.h"
41b2f314 47#endif
3c0ef626 48
0fff78ff 49extern ServerOptions options;
50
3c0ef626 51/*
52 * Tries to authenticate the user using password. Returns true if
53 * authentication succeeds.
54 */
55int
56auth_password(Authctxt *authctxt, const char *password)
57{
58 struct passwd * pw = authctxt->pw;
7e772e1f 59 int ok = authctxt->valid;
3c0ef626 60
3c0ef626 61#ifndef HAVE_CYGWIN
12408a1b 62 if (pw->pw_uid == 0 && options.permit_root_login != PERMIT_YES)
7e772e1f 63 ok = 0;
3c0ef626 64#endif
65 if (*password == '\0' && options.permit_empty_passwd == 0)
7e772e1f 66 return 0;
0fff78ff 67
68#if defined(HAVE_OSF_SIA)
69 return auth_sia_password(authctxt, password) && ok;
6a9b3198 70#else
71# ifdef KRB5
3c0ef626 72 if (options.kerberos_authentication == 1) {
73 int ret = auth_krb5_password(authctxt, password);
74 if (ret == 1 || ret == 0)
0fff78ff 75 return ret && ok;
3c0ef626 76 /* Fall back to ordinary passwd authentication. */
77 }
6a9b3198 78# endif
79# ifdef HAVE_CYGWIN
3c0ef626 80 if (is_winnt) {
81 HANDLE hToken = cygwin_logon_user(pw, password);
82
83 if (hToken == INVALID_HANDLE_VALUE)
84 return 0;
85 cygwin_set_impersonation_token(hToken);
0fff78ff 86 return ok;
3c0ef626 87 }
6a9b3198 88# endif
89# ifdef WITH_AIXAUTHENTICATE
12408a1b 90 if (aix_authenticate(pw->pw_name, password,
91 get_canonical_hostname(options.use_dns)) == 0)
92 return 0;
93 else
94 return ok;
6a9b3198 95# endif
96# ifdef BSD_AUTH
3c0ef626 97 if (auth_userokay(pw->pw_name, authctxt->style, "auth-ssh",
98 (char *)password) == 0)
99 return 0;
100 else
0fff78ff 101 return ok;
102# else
103 {
104 /* Just use the supplied fake password if authctxt is invalid */
105 char *pw_password = authctxt->valid ? shadow_pw(pw) : pw->pw_passwd;
3c0ef626 106
107 /* Check for users with no password. */
acc3d05e 108 if (strcmp(pw_password, "") == 0 && strcmp(password, "") == 0)
0fff78ff 109 return ok;
110 else {
111 /* Encrypt the candidate password using the proper salt. */
112 char *encrypted_password = xcrypt(password,
113 (pw_password[0] && pw_password[1]) ? pw_password : "xx");
114
115 /*
116 * Authentication is accepted if the encrypted passwords
117 * are identical.
118 */
119 return (strcmp(encrypted_password, pw_password) == 0) && ok;
120 }
3c0ef626 121
0fff78ff 122 }
123# endif
124#endif /* !HAVE_OSF_SIA */
700318f3 125}
This page took 0.067696 seconds and 5 git commands to generate.