1) Added s/key support .
[unix-history] / libexec / ftpd / ftpd.c
index 2638e8d..701d2a2 100644 (file)
@@ -144,6 +144,11 @@ char       *LastArgv = NULL;       /* end of argv */
 char   proctitle[BUFSIZ];      /* initial part of title */
 #endif /* SETPROCTITLE */
 
 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[];
 main(argc, argv, envp)
        int argc;
        char *argv[];
@@ -151,6 +156,9 @@ main(argc, argv, envp)
 {
        int addrlen, on = 1, tos;
        char *cp;
 {
        int addrlen, on = 1, tos;
        char *cp;
+#ifdef SKEY
+       char addr_string[20];   /* XXX */
+#endif
 
        /*
         * LOG_NDELAY sets up the logging connection immediately,
 
        /*
         * 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);
        }
                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]);
        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;
                }
        }
                        return;
                }
        }
+#ifdef SKEY
+       reply(331, "%s", skey_challenge(name, pw, pwok));
+#else
        reply(331, "Password required for %s.", name);
        reply(331, "Password required for %s.", name);
+#endif
        askpasswd = 1;
        /*
         * Delay before reading passwd after first failed
        askpasswd = 1;
        /*
         * Delay before reading passwd after first failed
@@ -448,7 +464,11 @@ pass(passwd)
                        salt = "xx";
                else
                        salt = pw->pw_passwd;
                        salt = "xx";
                else
                        salt = pw->pw_passwd;
+#ifdef SKEY
+               xpasswd = skey_crypt(passwd, salt, pw, pwok);
+#else
                xpasswd = crypt(passwd, salt);
                xpasswd = crypt(passwd, salt);
+#endif
                /* The strcmp does not catch null passwords! */
                if (pw == NULL || *pw->pw_passwd == '\0' ||
                    strcmp(xpasswd, pw->pw_passwd)) {
                /* The strcmp does not catch null passwords! */
                if (pw == NULL || *pw->pw_passwd == '\0' ||
                    strcmp(xpasswd, pw->pw_passwd)) {