Ag Hatzim([EMAIL PROTECTED])@Sat, Aug 20, 2005 at 08:27:25PM +0300:
Just a small correction for anyone wants to try,if you apply the
netkit-ftp-0.17-ssl-0.2.patch
compiling will fail
In addition i attach the patches for anyone is interesting.
Some from gentoo,and 2 from fedora.
I applied with the following order
netkit-ftp-0.17-acct.patch
netkit-ftp-0.17-locale.patch
netkit-ftp-0.17-runique_mget.patch
netkit-ftp-0.17-security.patch
netkit-ftp-0.17+ssl-0.2.diff
netkit-ftp-0.17+ssl-0.2+auth.diff
Ripped from Fedora
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=17353
--- netkit-ftp-0.17/ftp/ftp.c.acct Sun Jan 21 00:08:29 2001
+++ netkit-ftp-0.17/ftp/ftp.c Sun Jan 21 00:09:04 2001
@@ -254,7 +254,8 @@
if (n == CONTINUE) {
aflag++;
/* fflush(stdout); */
- zacct = getpass("Account:");
+ if(zacct==NULL)
+ zacct = getpass("Account:");
n = command("ACCT %s", zacct);
}
if (n != COMPLETE) {
ripped from Fedora
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=142265
--- netkit-ftp-0.17/ftp/main.c.locale 2004-12-15 16:52:14.504193752 +0000
+++ netkit-ftp-0.17/ftp/main.c 2004-12-15 16:52:51.719133655 +0000
@@ -51,6 +51,7 @@
/* #include <arpa/ftp.h> <--- unused? */
+#include <locale.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
@@ -109,6 +110,7 @@
tick = 0;
+ setlocale (LC_ALL, "");
sp = getservbyname("ftp", "tcp");
if (sp == 0) {
fprintf(stderr, "ftp: ftp/tcp: unknown service\n");
ripped from Fedora
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=79367
--- netkit-ftp-0.17/ftp/ftp.c.runique_mget 2004-12-07 12:05:49.360133092
+0100
+++ netkit-ftp-0.17/ftp/ftp.c 2004-12-07 12:06:48.480883902 +0100
@@ -923,7 +923,9 @@
return;
}
}
- else if (runique && (local = gunique(local)) == NULL) {
+ else if (runique && (strcmp(cmd, "NLST") != 0) &&
+ (local = gunique(local)) == NULL)
+ {
(void) signal(SIGINT, oldintr);
code = -1;
return;
ripped from Fedora
diff -urN netkit-ftp-0.17-pre20000412/ftp/ftp.c
netkit-ftp-0.17-pre20000412.new/ftp/ftp.c
--- netkit-ftp-0.17-pre20000412/ftp/ftp.c Mon Dec 13 21:33:20 1999
+++ netkit-ftp-0.17-pre20000412.new/ftp/ftp.c Wed Aug 16 14:12:50 2000
@@ -883,7 +883,7 @@
}
if (fstat(fileno(fout), &st) < 0 || st.st_blksize == 0)
st.st_blksize = BUFSIZ;
- if (st.st_blksize > bufsize) {
+ if ((unsigned)st.st_blksize > bufsize) {
if (buf)
(void) free(buf);
buf = malloc((unsigned)st.st_blksize);
diff -u -r -N netkit-ftp-0.17/ftp/Makefile netkit-ftp-0.17+ssl-0.2/ftp/Makefile
--- netkit-ftp-0.17/ftp/Makefile Sun Aug 1 08:00:12 1999
+++ netkit-ftp-0.17+ssl-0.2/ftp/Makefile Mon Sep 25 23:36:51 2000
@@ -8,6 +8,9 @@
LIBS += -lreadline $(LIBTERMCAP)
endif
+CFLAGS += -DUSE_SSL -g
+LIBS += -lssl -lcrypto
+
ftp: cmds.o cmdtab.o domacro.o ftp.o glob.o main.o ruserpass.o
$(CC) $(LDFLAGS) $^ $(LIBS) -o $@
diff -u -r -N netkit-ftp-0.17/ftp/cmds.c netkit-ftp-0.17+ssl-0.2/ftp/cmds.c
--- netkit-ftp-0.17/ftp/cmds.c Sun Jul 23 03:36:59 2000
+++ netkit-ftp-0.17+ssl-0.2/ftp/cmds.c Sun Sep 24 15:09:15 2000
@@ -207,6 +207,32 @@
}
port = ftp_port;
if (argc > 2) {
+#ifdef USE_SSL
+ /* not really an SSL enhancement but something that
+ * should have always been here --tjh
+ */
+ if (!isdigit(argv[2][0])) {
+ struct servent *destsp;
+
+ destsp = getservbyname(argv[2], "tcp");
+
+ /* if lookup fails for ssl-ftp we fallback to
+ * the default (unofficial) port number
+ */
+ if ((strcmp(argv[2],"ssl-ftp")==0) && (destsp==NULL))
+ port = 150;
+ else {
+ if (destsp == NULL ) {
+ printf("%s: bad port name-- %s\n",argv[1],argv[2]);
+ printf ("usage: %s host-name [port]\n",argv[0]);
+ code = -1;
+ return;
+ } else {
+ port = ntohs(destsp->s_port);
+ }
+ }
+ } else
+#endif /* USE_SSL */
port = atoi(argv[2]);
if (port < 1) {
printf("%s: bad port number-- %s\n", argv[1], argv[2]);
diff -u -r -N netkit-ftp-0.17/ftp/ftp.1 netkit-ftp-0.17+ssl-0.2/ftp/ftp.1
--- netkit-ftp-0.17/ftp/ftp.1 Mon Jul 31 01:56:59 2000
+++ netkit-ftp-0.17+ssl-0.2/ftp/ftp.1 Sun May 13 14:10:22 2001
@@ -97,6 +97,52 @@
as report on data transfer statistics.
.It Fl d
Enables debugging.
+.It Fl z Ar option
+Set SSL (Secure Socket Layer) parameters. The default is to negotiate
+via ftp protocoll if SSL is availlable at server side and then to
+switch it on. In this mode you can connect to both conventional and
+SSL enhanced ftpd's.
+.Pp
+The SSL parameters are:
+.Bl -tag -width Fl
+.It Ic Ar debug
+Send SSL related debugging information to stderr.
+.It Ic Ar authdebug
+Enable authentication debugging.
+.It Ic Ar ssl
+Negotiate SSL at first, then use ftp protocol. ftp protocol
+negotiation goes encrypted. (Not yet implemented)
+.It Ic Ar nossl, Ar !ssl
+switch of SSL negotiation
+.It Ic Ar certrequired
+client certificate is mandatory
+.It Ic Ar secure
+Don't switch back to unencrypted mode (no SSL) if SSL is not available.
+.It Ic Ar verbose
+Be verbose about certificates etc.
+.It Ic Ar verify=int
+.\" TODO
+Set the SSL verify flags (SSL_VERIFY_* in
+.Ar ssl/ssl.h
+).
+.\" TODO
+.It Ic Ar cert=cert_file
+.\" TODO
+Use the certificate(s) in
+.Ar cert_file .
+.It Ic Ar key=key_file
+.\" TODO
+Use the key(s) in
+.Ar key_file .
+.It Ic Ar cipher=ciph_list
+.\" TODO
+Set the preferred ciphers to
+.Ar ciph_list .
+.\" TODO: possible values; comma-separated list?
+(See
+.Ar ssl/ssl.h
+).
+.El
.El
.Pp
The client host with which
diff -u -r -N netkit-ftp-0.17/ftp/ftp.c netkit-ftp-0.17+ssl-0.2/ftp/ftp.c
--- netkit-ftp-0.17/ftp/ftp.c Mon Dec 13 21:33:20 1999
+++ netkit-ftp-0.17+ssl-0.2/ftp/ftp.c Tue Sep 26 00:25:48 2000
@@ -1,3 +1,15 @@
+/*
+ * The modifications to support SSLeay were done by Tim Hudson
+ * [EMAIL PROTECTED]
+ *
+ * You can do whatever you like with these patches except pretend that
+ * you wrote them.
+ *
+ * Email [EMAIL PROTECTED] to get instructions on how to
+ * join the mailing list that discusses SSLeay and also these patches.
+ *
+ */
+
/*
* Copyright (c) 1985, 1989 Regents of the University of California.
* All rights reserved.
@@ -77,6 +89,17 @@
static sigjmp_buf ptabort;
static int ptabflg = 0;
static int abrtflag = 0;
+#ifdef USE_SSL
+static int pdata = -1;
+static int
+auth_user(char *u,char *p);
+static int
+ssl_getc(SSL *ssl_con);
+static int
+ssl_putc_flush(SSL *ssl_con);
+static int
+ssl_putc(SSL *ssl_con, int oneint);
+#endif
void lostpeer(int);
extern int connected;
@@ -243,14 +266,7 @@
else
luser = tmp;
}
- n = command("USER %s", luser);
- if (n == CONTINUE) {
- if (pass == NULL) {
- /* fflush(stdout); */
- pass = getpass("Password:");
- }
- n = command("PASS %s", pass);
- }
+ n = auth_user(luser,pass);
if (n == CONTINUE) {
aflag++;
/* fflush(stdout); */
@@ -296,6 +312,9 @@
va_list ap;
int r;
void (*oldintr)(int);
+#ifdef USE_SSL
+ char outputbuf[8192];
+#endif /* USE_SSL */
abrtflag = 0;
if (debug) {
@@ -316,10 +335,27 @@
}
oldintr = signal(SIGINT, cmdabort);
va_start(ap, fmt);
+#ifdef USE_SSL
+ /* assemble the output into a buffer */
+ vsnprintf(outputbuf,sizeof(outputbuf),fmt,ap);
+ strcat(outputbuf,"\r\n");
+ if (ssl_active_flag) {
+ SSL_write(ssl_con,outputbuf,strlen(outputbuf));
+ } else {
+ fprintf(cout,"%s",outputbuf);
+ fflush(cout);
+ }
+#else /* !USE_SSL */
vfprintf(cout, fmt, ap);
+#endif /* USE_SSL */
va_end(ap);
+
+#ifndef USE_SSL
+ /* we don't need this as we concatenated it above */
fprintf(cout, "\r\n");
(void) fflush(cout);
+#endif /* !USE_SSL */
+
cpend = 1;
r = getreply(!strcmp(fmt, "QUIT"));
if (abrtflag && oldintr != SIG_IGN)
@@ -343,25 +379,39 @@
int pflag = 0;
size_t px = 0;
size_t psize = sizeof(pasv);
+ char buf[16];
oldintr = signal(SIGINT, cmdabort);
for (;;) {
dig = n = code = 0;
cp = reply_string;
- while ((c = getc(cin)) != '\n') {
+ while ((c = GETC(cin)) != '\n') {
if (c == IAC) { /* handle telnet commands */
- switch (c = getc(cin)) {
+ switch (c = GETC(cin)) {
case WILL:
case WONT:
- c = getc(cin);
- fprintf(cout, "%c%c%c", IAC, DONT, c);
- (void) fflush(cout);
+ c = GETC(cin);
+ sprintf(buf,
+ "%c%c%c", IAC, DONT, c);
+#ifdef USE_SSL
+ if (ssl_active_flag)
+ SSL_write(ssl_con,buf,3);
+ else
+#endif /* !USE_SSL */
+ fwrite(buf,3,1,cout);
+ (void) FFLUSH(cout);
break;
case DO:
case DONT:
- c = getc(cin);
- fprintf(cout, "%c%c%c", IAC, WONT, c);
- (void) fflush(cout);
+ c = GETC(cin);
+ sprintf(buf, "%c%c%c", IAC, WONT, c);
+#ifdef USE_SSL
+ if (ssl_active_flag)
+ SSL_write(ssl_con,buf,3);
+ else
+#endif /* !USE_SSL */
+ fwrite(buf,3,1,cout);
+ (void) FFLUSH(cout);
break;
default:
break;
@@ -600,9 +650,18 @@
errno = d = 0;
while ((c = read(fileno(fin), buf, sizeof (buf))) > 0) {
bytes += c;
+#ifdef USE_SSL
+ if (ssl_data_active_flag) {
+ for (bufp = buf; c > 0; c -= d, bufp += d)
+ if ((d = SSL_write(ssl_data_con, bufp, c)) <= 0)
+ break;
+ } else
+#endif /* !USE_SSL */
+ {
for (bufp = buf; c > 0; c -= d, bufp += d)
if ((d = write(fileno(dout), bufp, c)) <= 0)
break;
+ }
if (hash) {
while (bytes >= hashbytes) {
(void) putchar('#');
@@ -654,16 +713,17 @@
}
if (ferror(dout))
break;
- (void) putc('\r', dout);
+ (void) DATAPUTC('\r', dout);
bytes++;
}
- (void) putc(c, dout);
+ (void) DATAPUTC(c, dout);
bytes++;
/* if (c == '\r') { */
/* (void) putc('\0', dout); (* this violates rfc */
/* bytes++; */
/* } */
}
+ DATAFLUSH(dout);
if (hash) {
if (bytes < hashbytes)
(void) putchar('#');
@@ -688,6 +748,15 @@
if (closefunc != NULL)
(*closefunc)(fin);
(void) fclose(dout);
+
+#ifdef USE_SSL
+ if (ssl_data_active_flag && (ssl_data_con!=NULL)) {
+ SSL_free(ssl_data_con);
+ ssl_data_active_flag=0;
+ ssl_data_con=NULL;
+ }
+#endif /* USE_SSL */
+
/* closes data as well, so discard it */
data = -1;
(void) getreply(0);
@@ -714,6 +783,15 @@
(void) close(data);
data = -1;
}
+
+#ifdef USE_SSL
+ if (ssl_data_active_flag && (ssl_data_con!=NULL)) {
+ SSL_free(ssl_data_con);
+ ssl_data_active_flag=0;
+ ssl_data_con=NULL;
+ }
+#endif /* USE_SSL */
+
(void) getreply(0);
code = -1;
if (closefunc != NULL && fin != NULL)
@@ -908,6 +986,33 @@
return;
}
errno = d = 0;
+#ifdef USE_SSL
+ if (ssl_data_active_flag) {
+ while ((c = SSL_read(ssl_data_con, buf, bufsize)) > 0) {
+ if ((d = write(fileno(fout), buf, c)) != c)
+ break;
+ bytes += c;
+ if (hash) {
+ while (bytes >= hashbytes) {
+ (void) putchar('#');
+ hashbytes += HASHBYTES;
+ }
+ (void) fflush(stdout);
+ }
+ }
+ if ( c < -1 ) {
+ static char errbuf[1024];
+
+ sprintf(errbuf,"ftp: SSL_read DATA error %s\n",
+ ERR_error_string(ERR_get_error(),NULL));
+
+ /* tell the user ... who else */
+ fprintf(stderr,"%s", errbuf);
+ fflush(stderr);
+ }
+ } else
+#endif /* !USE_SSL */
+ {
while ((c = read(fileno(din), buf, bufsize)) > 0) {
if ((d = write(fileno(fout), buf, c)) != c)
break;
@@ -927,6 +1032,7 @@
hashbytes += TICKBYTES;
}
}
+ }
if (hash && bytes > 0) {
if (bytes < HASHBYTES)
(void) putchar('#');
@@ -973,7 +1079,7 @@
return;
}
}
- while ((c = getc(din)) != EOF) {
+ while ((c = DATAGETC(din)) != EOF) {
if (c == '\n')
bare_lfs++;
while (c == '\r') {
@@ -991,7 +1097,7 @@
hashbytes += TICKBYTES;
}
bytes++;
- if ((c = getc(din)) != '\n' || tcrflag) {
+ if ((c = DATAGETC(din)) != '\n' || tcrflag) {
if (ferror(fout))
goto break2;
(void) putc('\r', fout);
@@ -1039,6 +1145,15 @@
(void) signal(SIGPIPE, oldintp);
(void) gettimeofday(&stop, (struct timezone *)0);
(void) fclose(din);
+
+#ifdef USE_SSL
+ if (ssl_data_active_flag && (ssl_data_con!=NULL)) {
+ SSL_free(ssl_data_con);
+ ssl_data_active_flag=0;
+ ssl_data_con=NULL;
+ }
+#endif /* USE_SSL */
+
/* closes data as well, so discard it */
data = -1;
(void) getreply(0);
@@ -1071,6 +1186,15 @@
(void) close(data);
data = -1;
}
+
+#ifdef USE_SSL
+ if (ssl_data_active_flag && (ssl_data_con!=NULL)) {
+ SSL_free(ssl_data_con);
+ ssl_data_active_flag=0;
+ ssl_data_con=NULL;
+ }
+#endif /* USE_SSL */
+
if (bytes > 0)
ptransfer("received", bytes, &start, &stop);
(void) signal(SIGINT, oldintr);
@@ -1207,6 +1331,7 @@
struct sockaddr_in from;
int s, tos;
socklen_t fromlen = sizeof(from);
+ int ret;
if (passivemode)
return (fdopen(data, lmode));
@@ -1224,6 +1349,67 @@
if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos, sizeof(int)) < 0)
perror("ftp: setsockopt TOS (ignored)");
#endif
+
+#ifdef USE_SSL
+ ssl_data_active_flag=0;
+ if (ssl_active_flag && ssl_encrypt_data) {
+ /* do SSL */
+ if (ssl_data_con!=NULL) {
+ SSL_free(ssl_data_con);
+ ssl_data_con=NULL;
+ }
+ ssl_data_con=(SSL *)SSL_new(ssl_ctx);
+
+ SSL_set_fd(ssl_data_con,data);
+ set_ssl_trace(ssl_data_con);
+
+ SSL_set_verify(ssl_data_con,ssl_verify_flag,NULL);
+
+ /* this is the "magic" call that makes
+ * this quick assuming Eric has this going
+ * okay! ;-)
+ */
+ SSL_copy_session_id(ssl_data_con,ssl_con);
+
+ /* we are doing I/O and not using select so
+ * it is "safe" to read ahead
+ */
+ /* SSL_set_read_ahead(ssl_data_con,1); */
+
+ if (debug) {
+ fprintf(stderr,"===>START SSL connect on DATA\n");
+ fflush(stderr);
+ }
+
+ if ((ret=SSL_connect(ssl_data_con))<=0) {
+ static char errbuf[1024];
+
+ sprintf(errbuf,"ftp: SSL_connect DATA error %d - %s\n",
+ ret,ERR_error_string(ERR_get_error(),NULL));
+
+ /* tell the user ... who else */
+ fprintf(stderr,"%s", errbuf);
+ fflush(stderr);
+
+ /* abort time methinks ... */
+ close(data);
+ return NULL;
+ } else {
+ if (ssl_debug_flag) {
+ BIO_printf(bio_err,"[SSL DATA Cipher %s]\n",
+ SSL_get_cipher(ssl_con));
+ }
+ ssl_data_active_flag=1;
+ }
+
+ if (debug) {
+ fprintf(stderr,"===>DONE SSL connect on DATA %d\n",data);
+ fflush(stderr);
+ }
+
+ }
+#endif /* USE_SSL */
+
return (fdopen(data, lmode));
}
@@ -1609,3 +1795,142 @@
}
(void) getreply(0);
}
+
+static int
+auth_user(char *u,char *p)
+{
+ int n;
+
+#ifdef USE_SSL
+ if (ssl_enabled) {
+ n = command("AUTH SSL");
+ if (n == ERROR) { /* do normal USER/PASS */
+ printf("SSL not available\n");
+ /* spit the dummy as we will only talk ssl
+ * when running in "secure" mode
+ */
+ if (ssl_secure_flag)
+ return ERROR;
+ } else if (n == CONTINUE ) {
+ /* do SSL */
+ ssl_con=(SSL *)SSL_new(ssl_ctx);
+
+ SSL_set_fd(ssl_con,fileno(cout));
+ set_ssl_trace(ssl_con);
+
+ SSL_set_verify(ssl_con,ssl_verify_flag,NULL);
+
+ /* Add in any certificates if you want to here ... */
+ if (my_ssl_cert_file) {
+ if (!SSL_use_certificate_file(ssl_con, my_ssl_cert_file,
+ X509_FILETYPE_PEM)) {
+ fprintf(stderr,"%s: ",my_ssl_cert_file);
+ ERR_print_errors_fp(stderr);
+ exit(1);
+ } else {
+ if (!my_ssl_key_file)
+ my_ssl_key_file = my_ssl_cert_file;
+ if (!SSL_use_RSAPrivateKey_file(ssl_con,
my_ssl_key_file,
+ X509_FILETYPE_PEM)) {
+ fprintf(stderr,"%s: ", my_ssl_key_file);
+ ERR_print_errors_fp(stderr);
+ exit(1);
+ }
+ }
+ }
+
+ if (SSL_connect(ssl_con)<=0) {
+ static char errbuf[1024];
+
+ sprintf(errbuf,"ftp: SSL_connect error %s\n",
+ ERR_error_string(ERR_get_error(),NULL));
+ perror(errbuf);
+ /* abort time methinks ... */
+ exit(1);
+ } else {
+ fprintf(stderr,"[SSL Cipher %s]\n",SSL_get_cipher(ssl_con));
+ fflush(stderr);
+ ssl_active_flag=1;
+ }
+
+ n = command("USER %s",u);
+ if (n == CONTINUE) {
+ if(p == NULL)
+ p = getpass("Password:");
+ n = command("PASS %s",p);
+ }
+ return (n);
+ }
+ }
+#endif /* USE_SSL */
+ n = command("USER %s",u);
+ if (n == CONTINUE) {
+ if(p == NULL)
+ p = getpass("Password:");
+ n = command("PASS %s",p);
+ }
+ return(n);
+}
+
+#ifdef USE_SSL
+
+/* we really shouldn't have code like this! --tjh */
+static int
+ssl_getc(SSL *ssl_con)
+{
+ char onebyte;
+ int ret;
+
+ if ((ret=SSL_read(ssl_con,&onebyte,1))!=1) {
+ /* we want to know this stuff! */
+ if (ssl_debug_flag || (ret!=0)) {
+ fprintf(stderr,"ssl_getc: SSL_read failed %d = %d\n",ret,errno);
+ fflush(stderr);
+ }
+ return -1;
+ } else {
+ if (ssl_debug_flag) {
+ BIO_printf(bio_err,"ssl_getc: SSL_read %d (%c) ",onebyte &
0xff,isprint(onebyte)?onebyte:'.');
+ }
+ return onebyte & 0xff;
+ }
+}
+
+
+/* got back to this an implemented some rather "simple" buffering */
+static char putc_buf[BUFSIZ];
+static int putc_buf_pos=0;
+
+static int
+ssl_putc_flush(SSL *ssl_con)
+{
+ if (putc_buf_pos>0) {
+ if (SSL_write(ssl_con,putc_buf,putc_buf_pos)!=putc_buf_pos) {
+ if (ssl_debug_flag) {
+ BIO_printf(bio_err,"ssl_putc_flush: WRITE FAILED\n");
+ }
+ putc_buf_pos=0;
+ return -1;
+ }
+ }
+ putc_buf_pos=0;
+ return 0;
+}
+
+int
+ssl_putc(SSL *ssl_con,int oneint)
+{
+ char onebyte;
+
+ onebyte = oneint & 0xff;
+
+ /* make sure there is space */
+ if (putc_buf_pos>=BUFSIZ)
+ if (ssl_putc_flush(ssl_con)!=0)
+ return EOF;
+ putc_buf[putc_buf_pos++]=onebyte;
+
+ return onebyte;
+}
+
+#endif /* USE_SSL */
diff -u -r -N netkit-ftp-0.17/ftp/ftp_var.h
netkit-ftp-0.17+ssl-0.2/ftp/ftp_var.h
--- netkit-ftp-0.17/ftp/ftp_var.h Sat Oct 2 20:39:17 1999
+++ netkit-ftp-0.17+ssl-0.2/ftp/ftp_var.h Sun Sep 24 15:48:48 2000
@@ -158,3 +158,6 @@
void setpeer(int argc, char *argv[]);
void quit(void);
void changetype(int newtype, int show);
+
+#include "sslapp.h"
+#include "ssl_port.h"
diff -u -r -N netkit-ftp-0.17/ftp/main.c netkit-ftp-0.17+ssl-0.2/ftp/main.c
--- netkit-ftp-0.17/ftp/main.c Sat Oct 2 15:25:23 1999
+++ netkit-ftp-0.17+ssl-0.2/ftp/main.c Thu May 3 20:42:41 2001
@@ -1,3 +1,15 @@
+/*
+ * The modifications to support SSLeay were done by Tim Hudson
+ * [EMAIL PROTECTED]
+ *
+ * You can do whatever you like with these patches except pretend that
+ * you wrote them.
+ *
+ * Email [EMAIL PROTECTED] to get instructions on how to
+ * join the mailing list that discusses SSLeay and also these patches.
+ *
+ */
+
/*
* Copyright (c) 1985, 1989 Regents of the University of California.
* All rights reserved.
@@ -82,6 +94,75 @@
static void cmdscanner(int top);
static char *slurpstring(void);
+#ifdef USE_SSL
+
+/* icky way of doing things ... */
+#include "sslapp.c"
+
+/*
+#include "ssl_err.h"
+*/
+
+SSL *ssl_con;
+SSL *ssl_data_con;
+int ssl_data_active_flag=0;
+
+/* for the moment this is a compile time option only --tjh */
+int ssl_encrypt_data=1;
+int ssl_enabled=1;
+
+char *my_ssl_key_file=NULL;
+char *my_ssl_cert_file=NULL;
+
+BIO *bio_err=NULL;
+
+static long
+bio_dump_cb(BIO *bio,
+ int cmd,
+ char *argp,
+ int argi,
+ long argl,
+ long ret)
+ {
+ BIO *out;
+
+/*
+ out=(BIO *)BIO_get_callback_arg(bio);
+*/
+ out=bio_err;
+ if (out == NULL) return(ret);
+
+ if (cmd == (BIO_CB_READ|BIO_CB_RETURN))
+ {
+ BIO_printf(out,"read from %08X (%d bytes => %ld (%X))\n",
+ bio,argi,ret,ret);
+ BIO_dump(out,argp,(int)ret);
+ BIO_flush(out);
+ }
+ else if (cmd == (BIO_CB_WRITE|BIO_CB_RETURN))
+ {
+ BIO_printf(out,"write to %08X (%d bytes => %ld (%X))\n",
+ bio,argi,ret,ret);
+ BIO_dump(out,argp,(int)ret);
+ BIO_flush(out);
+ }
+ return( (cmd & BIO_CB_RETURN) ? ret : 1);
+ }
+
+int
+set_ssl_trace(SSL *con)
+{
+ if (con!=NULL) {
+ if (ssl_debug_flag) {
+ BIO_set_callback(SSL_get_rbio(con),bio_dump_cb);
+ BIO_set_callback_arg(SSL_get_rbio(con),bio_err);
+ }
+ }
+ return 0;
+}
+
+#endif /* USE_SSL */
+
static
void
usage(void)
@@ -106,6 +187,7 @@
int top;
struct passwd *pw = NULL;
char homedir[MAXPATHLEN];
+ char *optarg;
tick = 0;
@@ -134,6 +216,7 @@
argc--, argv++;
while (argc > 0 && **argv == '-') {
+ optarg=*(argv+1);
for (cp = *argv + 1; *cp; cp++)
switch (*cp) {
@@ -174,6 +257,44 @@
usage();
exit(0);
+#ifdef USE_SSL
+ case 'z':
+ if (strcmp(optarg, "debug") == 0 ) {
+ ssl_debug_flag=1;
+ }
+ if (strcmp(optarg, "ssl") == 0 ) {
+ ssl_only_flag=1;
+ }
+ /* disable *all* ssl stuff */
+ if ( (strcmp(optarg, "!ssl") == 0 ) ||
+ (strcmp(optarg, "nossl") == 0 ) ) {
+ ssl_enabled=0;
+ }
+ if (strcmp(optarg, "secure") == 0 ) {
+ ssl_secure_flag=1;
+ }
+ if (strcmp(optarg, "certsok") == 0 ) {
+ ssl_certsok_flag=1;
+ }
+ if (strcmp(optarg, "verbose") == 0 ) {
+ ssl_verbose_flag=1;
+ }
+ if (strncmp(optarg, "verify=",
strlen("verify=")) == 0 ) {
+
ssl_verify_flag=atoi(optarg+strlen("verify="));
+ }
+ if (strncmp(optarg, "cert=", strlen("cert="))
== 0 ) {
+ my_ssl_cert_file=optarg+strlen("cert=");
+ }
+ if (strncmp(optarg, "key=", strlen("key=")) ==
0 ) {
+ my_ssl_key_file=optarg+strlen("key=");
+ }
+
+ /* we have swallowed an extra arg */
+ argc--;
+ argv++;
+ break;
+#endif /* USE_SSL */
+
default:
fprintf(stdout,
"ftp: %c: unknown option\n", *cp);
@@ -202,6 +323,18 @@
homedir[sizeof(homedir)-1] = 0;
home = homedir;
}
+
+#ifdef USE_SSL
+ if (ssl_enabled) {
+ if (!do_ssleay_init(0)) {
+ fprintf(stderr,"ftp: SSLeay initialisation failed\n");
+ fflush(stderr);
+ ERR_print_errors_fp(stderr);
+ exit(1);
+ }
+ }
+#endif /* USE_SSL */
+
if (argc > 0) {
if (sigsetjmp(toplevel, 1))
exit(0);
diff -u -r -N netkit-ftp-0.17/ftp/main.c.~1~
netkit-ftp-0.17+ssl-0.2/ftp/main.c.~1~
--- netkit-ftp-0.17/ftp/main.c.~1~ Thu Jan 1 01:00:00 1970
+++ netkit-ftp-0.17+ssl-0.2/ftp/main.c.~1~ Sun Sep 24 16:30:36 2000
@@ -0,0 +1,735 @@
+/*
+ * The modifications to support SSLeay were done by Tim Hudson
+ * [EMAIL PROTECTED]
+ *
+ * You can do whatever you like with these patches except pretend that
+ * you wrote them.
+ *
+ * Email [EMAIL PROTECTED] to get instructions on how to
+ * join the mailing list that discusses SSLeay and also these patches.
+ *
+ */
+
+/*
+ * Copyright (c) 1985, 1989 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+char copyright[] =
+ "@(#) Copyright (c) 1985, 1989 Regents of the University of California.\n"
+ "All rights reserved.\n";
+
+/*
+ * from: @(#)main.c 5.18 (Berkeley) 3/1/91
+ */
+char main_rcsid[] =
+ "$Id: netkit-ftp-0.17+ssl-0.2.diff,v 1.2 2005/07/29 01:38:43 vapier Exp $";
+
+
+/*
+ * FTP User Program -- Command Interface.
+ */
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/ioctl.h>
+
+/* #include <arpa/ftp.h> <--- unused? */
+
+#include <signal.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <errno.h>
+#include <ctype.h>
+#include <netdb.h>
+#include <pwd.h>
+#ifdef __USE_READLINE__
+#include <readline/readline.h>
+#include <readline/history.h>
+#endif
+
+#define Extern
+#include "ftp_var.h"
+int traceflag = 0;
+const char *home = "/";
+
+extern FILE *cout;
+extern int data;
+extern struct cmd cmdtab[];
+extern int NCMDS;
+
+void intr(int);
+void lostpeer(int);
+void help(int argc, char *argv[]);
+
+static void cmdscanner(int top);
+static char *slurpstring(void);
+
+#ifdef USE_SSL
+
+/* icky way of doing things ... */
+#include "sslapp.c"
+
+/*
+#include "ssl_err.h"
+*/
+
+SSL *ssl_con;
+SSL *ssl_data_con;
+int ssl_data_active_flag=0;
+
+/* for the moment this is a compile time option only --tjh */
+int ssl_encrypt_data=1;
+int ssl_enabled=1;
+
+char *my_ssl_key_file=NULL;
+char *my_ssl_cert_file=NULL;
+
+BIO *bio_err=NULL;
+
+static long
+bio_dump_cb(BIO *bio,
+ int cmd,
+ char *argp,
+ int argi,
+ long argl,
+ long ret)
+ {
+ BIO *out;
+
+/*
+ out=(BIO *)BIO_get_callback_arg(bio);
+*/
+ out=bio_err;
+ if (out == NULL) return(ret);
+
+ if (cmd == (BIO_CB_READ|BIO_CB_RETURN))
+ {
+ BIO_printf(out,"read from %08X (%d bytes => %ld (%X))\n",
+ bio,argi,ret,ret);
+ BIO_dump(out,argp,(int)ret);
+ BIO_flush(out);
+ }
+ else if (cmd == (BIO_CB_WRITE|BIO_CB_RETURN))
+ {
+ BIO_printf(out,"write to %08X (%d bytes => %ld (%X))\n",
+ bio,argi,ret,ret);
+ BIO_dump(out,argp,(int)ret);
+ BIO_flush(out);
+ }
+ return( (cmd & BIO_CB_RETURN) ? ret : 1);
+ }
+
+int
+set_ssl_trace(SSL *con)
+{
+ if (con!=NULL) {
+ if (ssl_debug_flag) {
+ BIO_set_callback(SSL_get_rbio(con),bio_dump_cb);
+ BIO_set_callback_arg(SSL_get_rbio(con),bio_err);
+ }
+ }
+ return 0;
+}
+
+#endif /* USE_SSL */
+
+static
+void
+usage(void)
+{
+ printf("\n\tUsage: { ftp | pftp } [-pinegvtd] [hostname]\n");
+ printf("\t -p: enable passive mode (default for pftp)\n");
+ printf("\t -i: turn off prompting during mget\n");
+ printf("\t -n: inhibit auto-login\n");
+ printf("\t -e: disable readline support, if present\n");
+ printf("\t -g: disable filename globbing\n");
+ printf("\t -v: verbose mode\n");
+ printf("\t -t: enable packet tracing [nonfunctional]\n");
+ printf("\t -d: enable debugging\n");
+ printf("\n");
+}
+
+int
+main(volatile int argc, char **volatile argv)
+{
+ register char *cp;
+ struct servent *sp;
+ int top;
+ struct passwd *pw = NULL;
+ char homedir[MAXPATHLEN];
+
+ tick = 0;
+
+ sp = getservbyname("ftp", "tcp");
+ if (sp == 0) {
+ fprintf(stderr, "ftp: ftp/tcp: unknown service\n");
+ exit(1);
+ }
+ ftp_port = sp->s_port;
+ doglob = 1;
+ interactive = 1;
+ autologin = 1;
+ passivemode = 0;
+
+ cp = strrchr(argv[0], '/');
+ cp = (cp == NULL) ? argv[0] : cp+1;
+ if (strcmp(cp, "pftp") == 0)
+ passivemode = 1;
+
+#ifdef __USE_READLINE__
+ /*
+ * Set terminal type so libreadline can parse .inputrc correctly
+ */
+ rl_terminal_name = getenv("TERM");
+#endif
+
+ argc--, argv++;
+ while (argc > 0 && **argv == '-') {
+ for (cp = *argv + 1; *cp; cp++)
+ switch (*cp) {
+
+ case 'd':
+ options |= SO_DEBUG;
+ debug++;
+ break;
+
+ case 'v':
+ verbose++;
+ break;
+
+ case 't':
+ traceflag++;
+ break;
+
+ case 'i':
+ interactive = 0;
+ break;
+
+ case 'n':
+ autologin = 0;
+ break;
+
+ case 'p':
+ passivemode = 1;
+ break;
+
+ case 'g':
+ doglob = 0;
+ break;
+
+ case 'e':
+ rl_inhibit = 1;
+ break;
+
+ case 'h':
+ usage();
+ exit(0);
+
+#ifdef USE_SSL
+ case 'z':
+ if (strcmp(optarg, "debug") == 0 ) {
+ ssl_debug_flag=1;
+ }
+ if (strcmp(optarg, "ssl") == 0 ) {
+ ssl_only_flag=1;
+ }
+ /* disable *all* ssl stuff */
+ if ( (strcmp(optarg, "!ssl") == 0 ) ||
+ (strcmp(optarg, "nossl") == 0 ) ) {
+ ssl_enabled=0;
+ }
+ if (strcmp(optarg, "secure") == 0 ) {
+ ssl_secure_flag=1;
+ }
+ if (strcmp(optarg, "certsok") == 0 ) {
+ ssl_certsok_flag=1;
+ }
+ if (strcmp(optarg, "verbose") == 0 ) {
+ ssl_verbose_flag=1;
+ }
+ if (strncmp(optarg, "verify=",
strlen("verify=")) == 0 ) {
+
ssl_verify_flag=atoi(optarg+strlen("verify="));
+ }
+ if (strncmp(optarg, "cert=", strlen("cert="))
== 0 ) {
+ my_ssl_cert_file=optarg+strlen("cert=");
+ }
+ if (strncmp(optarg, "key=", strlen("key=")) ==
0 ) {
+ my_ssl_key_file=optarg+strlen("key=");
+ }
+
+ /* we have swallowed an extra arg */
+ argc--;
+ argv++;
+ break;
+#endif /* USE_SSL */
+
+ default:
+ fprintf(stdout,
+ "ftp: %c: unknown option\n", *cp);
+ exit(1);
+ }
+ argc--, argv++;
+ }
+ fromatty = isatty(fileno(stdin));
+ if (fromatty)
+ verbose++;
+ cpend = 0; /* no pending replies */
+ proxy = 0; /* proxy not active */
+ crflag = 1; /* strip c.r. on ascii gets */
+ sendport = -1; /* not using ports */
+ /*
+ * Set up the home directory in case we're globbing.
+ */
+ cp = getlogin();
+ if (cp != NULL) {
+ pw = getpwnam(cp);
+ }
+ if (pw == NULL)
+ pw = getpwuid(getuid());
+ if (pw != NULL) {
+ strncpy(homedir, pw->pw_dir, sizeof(homedir));
+ homedir[sizeof(homedir)-1] = 0;
+ home = homedir;
+ }
+
+#ifdef USE_SSL
+ if (ssl_enabled) {
+ if (!do_ssleay_init(0)) {
+ fprintf(stderr,"ftp: SSLeay initialisation failed\n");
+ fflush(stderr);
+ ERR_print_errors_fp(stderr);
+ exit(1);
+ }
+ }
+#endif /* USE_SSL */
+
+ if (argc > 0) {
+ if (sigsetjmp(toplevel, 1))
+ exit(0);
+ (void) signal(SIGINT, intr);
+ (void) signal(SIGPIPE, lostpeer);
+ setpeer(argc + 1, argv - 1);
+ }
+ top = sigsetjmp(toplevel, 1) == 0;
+ if (top) {
+ (void) signal(SIGINT, intr);
+ (void) signal(SIGPIPE, lostpeer);
+ }
+ for (;;) {
+ cmdscanner(top);
+ top = 1;
+ }
+}
+
+void
+intr(int ignore)
+{
+ (void)ignore;
+ siglongjmp(toplevel, 1);
+}
+
+void
+lostpeer(int ignore)
+{
+ (void)ignore;
+
+ if (connected) {
+ if (cout != NULL) {
+ shutdown(fileno(cout), 1+1);
+ fclose(cout);
+ cout = NULL;
+ }
+ if (data >= 0) {
+ shutdown(data, 1+1);
+ close(data);
+ data = -1;
+ }
+ connected = 0;
+ }
+ pswitch(1);
+ if (connected) {
+ if (cout != NULL) {
+ shutdown(fileno(cout), 1+1);
+ fclose(cout);
+ cout = NULL;
+ }
+ connected = 0;
+ }
+ proxflag = 0;
+ pswitch(0);
+}
+
+/*char *
+tail(filename)
+ char *filename;
+{
+ register char *s;
+
+ while (*filename) {
+ s = rindex(filename, '/');
+ if (s == NULL)
+ break;
+ if (s[1])
+ return (s + 1);
+ *s = '\0';
+ }
+ return (filename);
+}
+*/
+
+static char *get_input_line(char *buf, int buflen)
+{
+#ifdef __USE_READLINE__
+ if (fromatty && !rl_inhibit) {
+ char *lineread = readline("ftp> ");
+ if (!lineread) return NULL;
+ strncpy(buf, lineread, buflen);
+ buf[buflen-1] = 0;
+ if (lineread[0]) add_history(lineread);
+ free(lineread);
+ return buf;
+ }
+#endif
+ if (fromatty) {
+ printf("ftp> ");
+ fflush(stdout);
+ }
+ return fgets(buf, buflen, stdin);
+}
+
+
+/*
+ * Command parser.
+ */
+static void
+cmdscanner(int top)
+{
+ int margc;
+ char *marg;
+ char **margv;
+ register struct cmd *c;
+ register int l;
+
+ if (!top)
+ (void) putchar('\n');
+ for (;;) {
+ if (!get_input_line(line, sizeof(line))) {
+ quit();
+ }
+ l = strlen(line);
+ if (l == 0)
+ break;
+ if (line[--l] == '\n') {
+ if (l == 0)
+ break;
+ line[l] = '\0';
+ }
+ else if (l == sizeof(line) - 2) {
+ printf("sorry, input line too long\n");
+ while ((l = getchar()) != '\n' && l != EOF)
+ /* void */;
+ break;
+ } /* else it was a line without a newline */
+ margv = makeargv(&margc, &marg);
+ if (margc == 0) {
+ continue;
+ }
+ c = getcmd(margv[0]);
+ if (c == (struct cmd *)-1) {
+ printf("?Ambiguous command\n");
+ continue;
+ }
+ if (c == NULL) {
+ printf("?Invalid command\n");
+ continue;
+ }
+ if (c->c_conn && !connected) {
+ printf("Not connected.\n");
+ continue;
+ }
+ if (c->c_handler_v) c->c_handler_v(margc, margv);
+ else if (c->c_handler_0) c->c_handler_0();
+ else c->c_handler_1(marg);
+
+ if (bell && c->c_bell) putchar('\007');
+ if (c->c_handler_v != help)
+ break;
+ }
+ (void) signal(SIGINT, intr);
+ (void) signal(SIGPIPE, lostpeer);
+}
+
+struct cmd *
+getcmd(const char *name)
+{
+ const char *p, *q;
+ struct cmd *c, *found;
+ int nmatches, longest;
+
+ longest = 0;
+ nmatches = 0;
+ found = 0;
+ for (c = cmdtab; (p = c->c_name) != NULL; c++) {
+ for (q = name; *q == *p++; q++)
+ if (*q == 0) /* exact match? */
+ return (c);
+ if (!*q) { /* the name was a prefix */
+ if (q - name > longest) {
+ longest = q - name;
+ nmatches = 1;
+ found = c;
+ } else if (q - name == longest)
+ nmatches++;
+ }
+ }
+ if (nmatches > 1)
+ return ((struct cmd *)-1);
+ return (found);
+}
+
+/*
+ * Slice a string up into argc/argv.
+ */
+
+int slrflag;
+
+char **
+makeargv(int *pargc, char **parg)
+{
+ static char *rargv[20];
+ int rargc = 0;
+ char **argp;
+
+ argp = rargv;
+ stringbase = line; /* scan from first of buffer */
+ argbase = argbuf; /* store from first of buffer */
+ slrflag = 0;
+ while ((*argp++ = slurpstring())!=NULL)
+ rargc++;
+
+ *pargc = rargc;
+ if (parg) *parg = altarg;
+ return rargv;
+}
+
+/*
+ * Parse string into argbuf;
+ * implemented with FSM to
+ * handle quoting and strings
+ */
+static
+char *
+slurpstring(void)
+{
+ static char excl[] = "!", dols[] = "$";
+
+ int got_one = 0;
+ register char *sb = stringbase;
+ register char *ap = argbase;
+ char *tmp = argbase; /* will return this if token found */
+
+ if (*sb == '!' || *sb == '$') { /* recognize ! as a token for shell */
+ switch (slrflag) { /* and $ as token for macro invoke */
+ case 0:
+ slrflag++;
+ stringbase++;
+ return ((*sb == '!') ? excl : dols);
+ /* NOTREACHED */
+ case 1:
+ slrflag++;
+ altarg = stringbase;
+ break;
+ default:
+ break;
+ }
+ }
+
+S0:
+ switch (*sb) {
+
+ case '\0':
+ goto OUT;
+
+ case ' ':
+ case '\t':
+ sb++; goto S0;
+
+ default:
+ switch (slrflag) {
+ case 0:
+ slrflag++;
+ break;
+ case 1:
+ slrflag++;
+ altarg = sb;
+ break;
+ default:
+ break;
+ }
+ goto S1;
+ }
+
+S1:
+ switch (*sb) {
+
+ case ' ':
+ case '\t':
+ case '\0':
+ goto OUT; /* end of token */
+
+ case '\\':
+ sb++; goto S2; /* slurp next character */
+
+ case '"':
+ sb++; goto S3; /* slurp quoted string */
+
+ default:
+ *ap++ = *sb++; /* add character to token */
+ got_one = 1;
+ goto S1;
+ }
+
+S2:
+ switch (*sb) {
+
+ case '\0':
+ goto OUT;
+
+ default:
+ *ap++ = *sb++;
+ got_one = 1;
+ goto S1;
+ }
+
+S3:
+ switch (*sb) {
+
+ case '\0':
+ goto OUT;
+
+ case '"':
+ sb++; goto S1;
+
+ default:
+ *ap++ = *sb++;
+ got_one = 1;
+ goto S3;
+ }
+
+OUT:
+ if (got_one)
+ *ap++ = '\0';
+ argbase = ap; /* update storage pointer */
+ stringbase = sb; /* update scan pointer */
+ if (got_one) {
+ return(tmp);
+ }
+ switch (slrflag) {
+ case 0:
+ slrflag++;
+ break;
+ case 1:
+ slrflag++;
+ altarg = NULL;
+ break;
+ default:
+ break;
+ }
+ return NULL;
+}
+
+#define HELPINDENT ((int) sizeof ("directory"))
+
+/*
+ * Help command.
+ * Call each command handler with argc == 0 and argv[0] == name.
+ */
+void
+help(int argc, char *argv[])
+{
+ struct cmd *c;
+
+ if (argc == 1) {
+ int i, j, w;
+ unsigned k;
+ int columns, width = 0, lines;
+
+ printf("Commands may be abbreviated. Commands are:\n\n");
+ for (c = cmdtab; c < &cmdtab[NCMDS]; c++) {
+ int len = strlen(c->c_name);
+
+ if (len > width)
+ width = len;
+ }
+ width = (width + 8) &~ 7;
+ columns = 80 / width;
+ if (columns == 0)
+ columns = 1;
+ lines = (NCMDS + columns - 1) / columns;
+ for (i = 0; i < lines; i++) {
+ for (j = 0; j < columns; j++) {
+ c = cmdtab + j * lines + i;
+ if (c->c_name && (!proxy || c->c_proxy)) {
+ printf("%s", c->c_name);
+ }
+ else if (c->c_name) {
+ for (k=0; k < strlen(c->c_name); k++) {
+ (void) putchar(' ');
+ }
+ }
+ if (c + lines >= &cmdtab[NCMDS]) {
+ printf("\n");
+ break;
+ }
+ w = strlen(c->c_name);
+ while (w < width) {
+ w = (w + 8) &~ 7;
+ (void) putchar('\t');
+ }
+ }
+ }
+ return;
+ }
+ while (--argc > 0) {
+ register char *arg;
+ arg = *++argv;
+ c = getcmd(arg);
+ if (c == (struct cmd *)-1)
+ printf("?Ambiguous help command %s\n", arg);
+ else if (c == NULL)
+ printf("?Invalid help command %s\n", arg);
+ else
+ printf("%-*s\t%s\n", HELPINDENT,
+ c->c_name, c->c_help);
+ }
+}
diff -u -r -N netkit-ftp-0.17/ftp/ssl_port.h
netkit-ftp-0.17+ssl-0.2/ftp/ssl_port.h
--- netkit-ftp-0.17/ftp/ssl_port.h Thu Jan 1 01:00:00 1970
+++ netkit-ftp-0.17+ssl-0.2/ftp/ssl_port.h Sun Sep 24 15:46:02 2000
@@ -0,0 +1,85 @@
+/* ssl_port.h - standard porting things
+ *
+ * The modifications to support SSLeay were done by Tim Hudson
+ * [EMAIL PROTECTED]
+ *
+ * You can do whatever you like with these patches except pretend that
+ * you wrote them.
+ *
+ * Email [EMAIL PROTECTED] to get instructions on how to
+ * join the mailing list that discusses SSLeay and also these patches.
+ *
+ */
+
+#ifndef HEADER_SSL_PORT_H
+#define HEADER_SSL_PORT_H
+
+#ifdef USE_SSL
+
+#include <stdio.h>
+
+#define OLDPROTO NOPROTO
+#define NOPROTO
+#include <openssl/buffer.h>
+#undef NOPROTO
+#define NOPROTO OLDPROTO
+
+#include <openssl/x509.h>
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+
+extern SSL *ssl_con;
+extern SSL_CTX *ssl_ctx;
+extern int ssl_debug_flag;
+extern int ssl_only_flag;
+extern int ssl_active_flag;
+extern int ssl_verify_flag;
+extern int ssl_secure_flag;
+extern int ssl_enabled;
+
+extern int ssl_encrypt_data;
+extern SSL *ssl_data_con;
+extern int ssl_data_active_flag;
+
+extern char *my_ssl_cert_file;
+extern char *my_ssl_key_file;
+extern int ssl_certsok_flag;
+
+extern int set_ssl_trace(SSL *s);
+
+extern FILE *cin, *cout;
+
+#define is_ssl_fd(X,Y) ( (SSL_get_fd((X))==0) || \
+ (SSL_get_fd((X))==1) || \
+ (SSL_get_fd((X))==pdata) || \
+ (SSL_get_fd((X))==(Y)) \
+ )
+
+#define is_ssl_fp(X,Y) ( ( (SSL_get_fd((X))==0) && (fileno((Y))==0) ) || \
+ ( (SSL_get_fd((X))==1) && (fileno((Y))==1) ) || \
+ ( (SSL_get_fd((X))==pdata) && \
+ (fileno((Y))==pdata) ) || \
+ (SSL_get_fd((X))==fileno(Y)) \
+ )
+
+/* these macros make things much easier to handle ... */
+
+#define FFLUSH(X) (ssl_active_flag && (((X)==cin)||((X)==cout)) ? 1 :
fflush((X)) )
+
+#define GETC(X) (ssl_active_flag && (((X)==cin)||((X)==cout)) ?
ssl_getc(ssl_con) : getc((X)) )
+
+#define DATAGETC(X) (ssl_data_active_flag &&
((fileno(X)==data)||(fileno(X)==pdata)) ? ssl_getc(ssl_data_con) : getc((X)) )
+#define DATAPUTC(X,Y) (ssl_data_active_flag &&
((fileno(Y)==data)||(fileno(Y)==pdata)) ? ssl_putc(ssl_data_con,(X)) :
putc((X),(Y)) )
+#define DATAFLUSH(X) (ssl_data_active_flag &&
((fileno(X)==data)||(fileno(X)==pdata)) ? ssl_putc_flush(ssl_data_con) :
fflush((X)) )
+
+#else
+
+#define GETC(X) getc((X))
+#define DATAGETC(X) getc((X))
+#define DATAPUTC(X,Y) putc((X),(Y))
+#define DATAFLUSH(X) fflush((X))
+#define FFLUSH(X) fflush((X))
+
+#endif /* USE_SSL */
+
+#endif /* HEADER_SSL_PORT_H */
diff -u -r -N netkit-ftp-0.17/ftp/sslapp.c netkit-ftp-0.17+ssl-0.2/ftp/sslapp.c
--- netkit-ftp-0.17/ftp/sslapp.c Thu Jan 1 01:00:00 1970
+++ netkit-ftp-0.17+ssl-0.2/ftp/sslapp.c Sun Sep 24 18:07:23 2000
@@ -0,0 +1,186 @@
+/* sslapp.c - ssl application code */
+
+/*
+ * The modifications to support SSLeay were done by Tim Hudson
+ * [EMAIL PROTECTED]
+ *
+ * You can do whatever you like with these patches except pretend that
+ * you wrote them.
+ *
+ * Email [EMAIL PROTECTED] to get instructions on how to
+ * join the mailing list that discusses SSLeay and also these patches.
+ *
+ */
+
+#ifdef USE_SSL
+
+#include "sslapp.h"
+
+SSL_CTX *ssl_ctx;
+SSL *ssl_con;
+int ssl_debug_flag=0;
+int ssl_only_flag=0;
+int ssl_active_flag=0;
+int ssl_verify_flag=SSL_VERIFY_NONE;
+int ssl_secure_flag=0;
+int ssl_certsok_flag=0;
+int ssl_cert_required=0;
+int ssl_verbose_flag=0;
+int ssl_disabled_flag=0;
+char *ssl_cert_file=NULL;
+char *ssl_key_file=NULL;
+char *ssl_cipher_list=NULL;
+char *ssl_log_file=NULL;
+
+/* fwd decl */
+static void
+client_info_callback(SSL *s, int where, int ret);
+
+int
+do_ssleay_init(int server)
+{
+ char *p;
+
+ /* make sure we have somewhere we can log errors to */
+ if (bio_err==NULL) {
+ if ((bio_err=BIO_new(BIO_s_file()))!=NULL) {
+ if (ssl_log_file==NULL)
+ BIO_set_fp(bio_err,stderr,BIO_NOCLOSE);
+ else {
+ if (BIO_write_filename(bio_err,ssl_log_file)<=0) {
+ /* not a lot we can do */
+ }
+ }
+ }
+ }
+
+ /* rather simple things these days ... the old SSL_LOG and SSL_ERR
+ * vars are long gone now SSLeay8 has rolled around and we have
+ * a clean interface for doing things
+ */
+ if (ssl_debug_flag)
+ BIO_printf(bio_err,"SSL_DEBUG_FLAG on\r\n");
+
+
+ /* init things so we will get meaningful error messages
+ * rather than numbers
+ */
+ SSL_load_error_strings();
+
+ SSLeay_add_ssl_algorithms();
+ ssl_ctx=(SSL_CTX *)SSL_CTX_new(SSLv23_method());
+
+ /* we may require a temp 512 bit RSA key because of the
+ * wonderful way export things work ... if so we generate
+ * one now!
+ */
+ if (server) {
+ if (SSL_CTX_need_tmp_RSA(ssl_ctx)) {
+ RSA *rsa;
+
+ if (ssl_debug_flag)
+ BIO_printf(bio_err,"Generating temp (512 bit) RSA key ...\r\n");
+ rsa=RSA_generate_key(512,RSA_F4,NULL,NULL);
+ if (ssl_debug_flag)
+ BIO_printf(bio_err,"Generation of temp (512 bit) RSA key done\r\n");
+
+ if (!SSL_CTX_set_tmp_rsa(ssl_ctx,rsa)) {
+ BIO_printf(bio_err,"Failed to assign generated temp RSA key!\r\n");
+ }
+ RSA_free(rsa);
+ if (ssl_debug_flag)
+ BIO_printf(bio_err,"Assigned temp (512 bit) RSA key\r\n");
+ }
+ }
+
+ /* also switch on all the interoperability and bug
+ * workarounds so that we will communicate with people
+ * that cannot read poorly written specs :-)
+ */
+ SSL_CTX_set_options(ssl_ctx,SSL_OP_ALL);
+
+ /* the user can set whatever ciphers they want to use */
+ if (ssl_cipher_list==NULL) {
+ p=getenv("SSL_CIPHER");
+ if (p!=NULL)
+ SSL_CTX_set_cipher_list(ssl_ctx,p);
+ } else
+ SSL_CTX_set_cipher_list(ssl_ctx,ssl_cipher_list);
+
+ /* for verbose we use the 0.6.x info callback that I got
+ * eric to finally add into the code :-) --tjh
+ */
+ if (ssl_verbose_flag) {
+ SSL_CTX_set_info_callback(ssl_ctx,client_info_callback);
+ }
+
+ /* Add in any certificates if you want to here ... */
+ if (ssl_cert_file) {
+ if (!SSL_CTX_use_certificate_file(ssl_ctx, ssl_cert_file,
+ X509_FILETYPE_PEM)) {
+ BIO_printf(bio_err,"Error loading %s: ",ssl_cert_file);
+ ERR_print_errors(bio_err);
+ BIO_printf(bio_err,"\r\n");
+ return(0);
+ } else {
+ if (!ssl_key_file)
+ ssl_key_file = ssl_cert_file;
+ if (!SSL_CTX_use_RSAPrivateKey_file(ssl_ctx, ssl_key_file,
+ X509_FILETYPE_PEM)) {
+ BIO_printf(bio_err,"Error loading %s: ",ssl_key_file);
+ ERR_print_errors(bio_err);
+ BIO_printf(bio_err,"\r\n");
+ return(0);
+ }
+ }
+ }
+
+ /* make sure we will find certificates in the standard
+ * location ... otherwise we don't look anywhere for
+ * these things which is going to make client certificate
+ * exchange rather useless :-)
+ */
+ SSL_CTX_set_default_verify_paths(ssl_ctx);
+
+ /* now create a connection */
+ ssl_con=(SSL *)SSL_new(ssl_ctx);
+ SSL_set_verify(ssl_con,ssl_verify_flag,NULL);
+
+#if 0
+ SSL_set_verify(ssl_con,ssl_verify_flag,client_verify_callback);
+#endif
+
+ return(1);
+}
+
+
+static void
+client_info_callback(SSL *s, int where, int ret)
+{
+ if (where==SSL_CB_CONNECT_LOOP) {
+ BIO_printf(bio_err,"SSL_connect:%s %s\r\n",
+ SSL_state_string(s),SSL_state_string_long(s));
+ } else if (where==SSL_CB_CONNECT_EXIT) {
+ if (ret == 0) {
+ BIO_printf(bio_err,"SSL_connect:failed in %s %s\r\n",
+ SSL_state_string(s),SSL_state_string_long(s));
+ } else if (ret < 0) {
+ BIO_printf(bio_err,"SSL_connect:error in %s %s\r\n",
+ SSL_state_string(s),SSL_state_string_long(s));
+ }
+ }
+}
+
+
+#else /* !USE_SSL */
+
+/* something here to stop warnings if we build without SSL support */
+static int dummy_func()
+{
+ int i;
+
+ i++;
+}
+
+#endif /* USE_SSL */
+
diff -u -r -N netkit-ftp-0.17/ftp/sslapp.h netkit-ftp-0.17+ssl-0.2/ftp/sslapp.h
--- netkit-ftp-0.17/ftp/sslapp.h Thu Jan 1 01:00:00 1970
+++ netkit-ftp-0.17+ssl-0.2/ftp/sslapp.h Sun Sep 24 18:07:48 2000
@@ -0,0 +1,63 @@
+/* sslapp.h - ssl application code */
+
+/*
+ * The modifications to support SSLeay were done by Tim Hudson
+ * [EMAIL PROTECTED]
+ *
+ * You can do whatever you like with these patches except pretend that
+ * you wrote them.
+ *
+ * Email [EMAIL PROTECTED] to get instructions on how to
+ * join the mailing list that discusses SSLeay and also these patches.
+ *
+ */
+
+#ifdef USE_SSL
+
+#include <stdio.h>
+
+#include <openssl/crypto.h>
+
+#define SSL_set_pref_cipher(c,n) SSL_set_cipher_list(c,n)
+#define ONELINE_NAME(X) X509_NAME_oneline(X,NULL,0)
+
+#define OLDPROTO NOPROTO
+#define NOPROTO
+#include <openssl/bio.h>
+#undef NOPROTO
+#define NOPROTO OLDPROTO
+#undef OLDPROTO
+#include <openssl/buffer.h>
+
+#include <openssl/x509.h>
+#include <openssl/ssl.h>
+#include <openssl/err.h>
+
+extern BIO *bio_err;
+extern SSL *ssl_con;
+extern SSL_CTX *ssl_ctx;
+extern int ssl_debug_flag;
+extern int ssl_only_flag;
+extern int ssl_active_flag;
+extern int ssl_verify_flag;
+extern int ssl_secure_flag;
+extern int ssl_verbose_flag;
+extern int ssl_disabled_flag;
+extern int ssl_cert_required;
+extern int ssl_certsok_flag;
+
+extern char *ssl_log_file;
+extern char *ssl_cert_file;
+extern char *ssl_key_file;
+extern char *ssl_cipher_list;
+
+/* we hide all the initialisation code in a separate file now */
+extern int do_ssleay_init(int server);
+
+/*extern int display_connect_details();
+extern int server_verify_callback();
+extern int client_verify_callback();*/
+
+#endif /* USE_SSL */
+
+
diff -urN netkit-ftp-0.17.old/ftp/ftp.c netkit-ftp-0.17.new/ftp/ftp.c
--- netkit-ftp-0.17.old/ftp/ftp.c 2003-03-18 18:33:49.000000000 -0300
+++ netkit-ftp-0.17.new/ftp/ftp.c 2003-03-18 18:37:17.000000000 -0300
@@ -1811,7 +1811,7 @@
*/
if (ssl_secure_flag)
return ERROR;
- } else if (n == CONTINUE ) {
+ } else if (n == CONTINUE || n == COMPLETE) {
/* do SSL */
ssl_con=(SSL *)SSL_new(ssl_ctx);
--
http://linuxfromscratch.org/mailman/listinfo/lfs-dev
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page