*/
#ifndef lint
-static char rcsid[] = "$Id: auth.c,v 1.11 1994/10/22 11:54:04 paulus Exp $";
+static char rcsid[] = "$Id: auth.c,v 1.14 1995/04/26 06:46:22 paulus Exp $";
#endif
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
+#ifdef HAS_SHADOW
+#include <shadow.h>
+#include <shadow/pwauth.h>
+#ifndef PW_PPP
+#define PW_PPP PW_LOGIN
+#endif
+#endif
+
#include "pppd.h"
#include "fsm.h"
#include "lcp.h"
#define TRUE 1
/* Records which authentication operations haven't completed yet. */
-static int auth_pending[N_PPP];
+static int auth_pending[NUM_PPP];
static int logged_in;
-static struct wordlist *addresses[N_PPP];
+static struct wordlist *addresses[NUM_PPP];
/* Bits in auth_pending[] */
#define UPAP_WITHPEER 1
* treat it as though it authenticated with PAP using a username
* of "" and a password of "". If that's not OK, boot it out.
*/
- if (wo->neg_upap && !null_login(unit)) {
+ if (!wo->neg_upap || !null_login(unit)) {
syslog(LOG_WARNING, "peer refused to authenticate");
lcp_close(unit);
phase = PHASE_TERMINATE;
} else {
check_access(f, filename);
if (scan_authfile(f, user, our_name, secret, &addrs, filename) < 0
- || (secret[0] != 0 && strcmp(passwd, secret) != 0
+ || (secret[0] != 0 && (cryptpap || strcmp(passwd, secret) != 0)
&& strcmp(crypt(passwd, secret), secret) != 0)) {
syslog(LOG_WARNING, "upap authentication failure for %s", user);
ret = UPAP_AUTHNAK;
char *epasswd;
char *tty;
+#ifdef HAS_SHADOW
+ struct spwd *spwd;
+ struct spwd *getspnam();
+#endif
+
if ((pw = getpwnam(user)) == NULL) {
return (UPAP_AUTHNAK);
}
+#ifdef HAS_SHADOW
+ if ((spwd = getspnam(user)) == NULL) {
+ pw->pw_passwd = "";
+ } else {
+ pw->pw_passwd = spwd->sp_pwdp;
+ }
+#endif
+
/*
* XXX If no passwd, let them login without one.
*/
return (UPAP_AUTHACK);
}
+#ifdef HAS_SHADOW
+ if ((pw->pw_passwd && pw->pw_passwd[0] == '@'
+ && pw_auth (pw->pw_passwd+1, pw->pw_name, PW_PPP, NULL))
+ || !valid (passwd, pw)) {
+ return (UPAP_AUTHNAK);
+ }
+#else
epasswd = crypt(passwd, pw->pw_passwd);
if (strcmp(epasswd, pw->pw_passwd)) {
return (UPAP_AUTHNAK);
}
+#endif
syslog(LOG_INFO, "user %s logged in", user);