]> andersk Git - openssh.git/blob - auth-passwd.c
- Prepare for 1.2.1pre20
[openssh.git] / auth-passwd.c
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  * Created: Sat Mar 18 05:11:38 1995 ylo
6  * Password authentication.  This file contains the functions to check whether
7  * the password is valid for the user.
8  */
9
10 #include "includes.h"
11
12 #ifndef HAVE_LIBPAM
13
14 RCSID("$Id$");
15
16 #include "packet.h"
17 #include "ssh.h"
18 #include "servconf.h"
19 #include "xmalloc.h"
20
21 #ifdef HAVE_SHADOW_H
22 #include <shadow.h>
23 #endif
24
25 #ifdef HAVE_MD5_PASSWORDS
26 #include "md5crypt.h"
27 #endif
28
29 /*
30  * Tries to authenticate the user using password.  Returns true if
31  * authentication succeeds.
32  */
33 int 
34 auth_password(struct passwd * pw, const char *password)
35 {
36         extern ServerOptions options;
37         char *encrypted_password;
38         char *pw_password;
39         char *salt;
40 #ifdef HAVE_SHADOW_H
41         struct spwd *spw;
42 #endif
43
44         if (pw->pw_uid == 0 && options.permit_root_login == 2)
45                 return 0;
46         if (*password == '\0' && options.permit_empty_passwd == 0)
47                 return 0;
48         /* deny if no user. */
49         if (pw == NULL)
50                 return 0;
51
52 #ifdef SKEY
53         if (options.skey_authentication == 1) {
54                 int ret = auth_skey_password(pw, password);
55                 if (ret == 1 || ret == 0)
56                         return ret;
57                 /* Fall back to ordinary passwd authentication. */
58         }
59 #endif
60 #ifdef KRB4
61         if (options.kerberos_authentication == 1) {
62                 int ret = auth_krb4_password(pw, password);
63                 if (ret == 1 || ret == 0)
64                         return ret;
65                 /* Fall back to ordinary passwd authentication. */
66         }
67 #endif
68
69         /* Check for users with no password. */
70         if (strcmp(password, "") == 0 && strcmp(pw->pw_passwd, "") == 0)
71                 return 1;
72
73         pw_password = pw->pw_passwd;
74
75 #if defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW)
76         spw = getspnam(pw->pw_name);
77         if (spw == NULL) 
78                 return(0);
79
80         /* Check for users with no password. */
81         if (strcmp(password, "") == 0 && strcmp(spw->sp_pwdp, "") == 0)
82                 return 1;
83
84         pw_password = spw->sp_pwdp;
85 #endif /* defined(HAVE_SHADOW_H) && !defined(DISABLE_SHADOW) */
86
87         if (pw_password[0] != '\0')
88                 salt = pw_password;
89         else
90                 salt = "xx";
91
92 #ifdef HAVE_MD5_PASSWORDS
93         if (is_md5_salt(salt))
94                 encrypted_password = md5_crypt(password, salt);
95         else
96                 encrypted_password = crypt(password, salt);
97 #else /* HAVE_MD5_PASSWORDS */    
98         encrypted_password = crypt(password, salt);
99 #endif /* HAVE_MD5_PASSWORDS */    
100
101         /* Authentication is accepted if the encrypted passwords are identical. */
102         return (strcmp(encrypted_password, pw_password) == 0);
103 }
104 #endif /* !HAVE_LIBPAM */
This page took 0.068544 seconds and 5 git commands to generate.