aboutsummaryrefslogtreecommitdiff
path: root/libexec/ftpd/ftpd.c
diff options
context:
space:
mode:
Diffstat (limited to 'libexec/ftpd/ftpd.c')
-rw-r--r--libexec/ftpd/ftpd.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/libexec/ftpd/ftpd.c b/libexec/ftpd/ftpd.c
index 2638e8dd8b71..701d2a29a839 100644
--- a/libexec/ftpd/ftpd.c
+++ b/libexec/ftpd/ftpd.c
@@ -144,6 +144,11 @@ char *LastArgv = NULL; /* end of argv */
char proctitle[BUFSIZ]; /* initial part of title */
#endif /* SETPROCTITLE */
+#ifdef SKEY
+int pwok = 0;
+char *skey_challenge();
+char *skey_crypt();
+#endif
main(argc, argv, envp)
int argc;
char *argv[];
@@ -151,6 +156,9 @@ main(argc, argv, envp)
{
int addrlen, on = 1, tos;
char *cp;
+#ifdef SKEY
+ char addr_string[20]; /* XXX */
+#endif
/*
* LOG_NDELAY sets up the logging connection immediately,
@@ -162,6 +170,10 @@ main(argc, argv, envp)
syslog(LOG_ERR, "getpeername (%s): %m",argv[0]);
exit(1);
}
+#ifdef SKEY
+ strcpy(addr_string, inet_ntoa(his_addr.sin_addr));
+ pwok = authfile(addr_string);
+#endif
addrlen = sizeof (ctrl_addr);
if (getsockname(0, (struct sockaddr *)&ctrl_addr, &addrlen) < 0) {
syslog(LOG_ERR, "getsockname (%s): %m",argv[0]);
@@ -384,7 +396,11 @@ user(name)
return;
}
}
+#ifdef SKEY
+ reply(331, "%s", skey_challenge(name, pw, pwok));
+#else
reply(331, "Password required for %s.", name);
+#endif
askpasswd = 1;
/*
* Delay before reading passwd after first failed
@@ -448,7 +464,11 @@ pass(passwd)
salt = "xx";
else
salt = pw->pw_passwd;
+#ifdef SKEY
+ xpasswd = skey_crypt(passwd, salt, pw, pwok);
+#else
xpasswd = crypt(passwd, salt);
+#endif
/* The strcmp does not catch null passwords! */
if (pw == NULL || *pw->pw_passwd == '\0' ||
strcmp(xpasswd, pw->pw_passwd)) {