Module Name: src Committed By: martin Date: Tue May 16 16:16:00 UTC 2023
Modified Files: src/usr.bin/ftp [netbsd-10]: cmdtab.c extern.h fetch.c ftp.1 main.c ssl.c util.c version.h Log Message: Pull up following revision(s) (requested by lukem in ticket #170): usr.bin/ftp/ssl.c: revision 1.13 usr.bin/ftp/fetch.c: revision 1.236 usr.bin/ftp/util.c: revision 1.166 usr.bin/ftp/main.c: revision 1.129 usr.bin/ftp/extern.h: revision 1.83 usr.bin/ftp/ftp.1: revision 1.148 usr.bin/ftp/cmdtab.c: revision 1.53 usr.bin/ftp/version.h: revision 1.96 Add option sslnoverify to control validation of SSL certificates. Add netrc processing to fetch-mode (URL on command line) to enable options and autologin via netrc. Fix SSL cleanup in some error paths. Certificate validation is now enabled by default. Set FTPSSLNOVERIFY=1 in environment or configure a corresponding init macro via netrc to not validate certs (required if you haven't installed a required CA certificate for OpenSSL). Discussed with lukem@ on icb. To generate a diff of this commit: cvs rdiff -u -r1.52 -r1.52.40.1 src/usr.bin/ftp/cmdtab.c cvs rdiff -u -r1.82 -r1.82.10.1 src/usr.bin/ftp/extern.h cvs rdiff -u -r1.235 -r1.235.2.1 src/usr.bin/ftp/fetch.c cvs rdiff -u -r1.147 -r1.147.2.1 src/usr.bin/ftp/ftp.1 cvs rdiff -u -r1.128 -r1.128.2.1 src/usr.bin/ftp/main.c cvs rdiff -u -r1.12 -r1.12.2.1 src/usr.bin/ftp/ssl.c cvs rdiff -u -r1.164 -r1.164.2.1 src/usr.bin/ftp/util.c cvs rdiff -u -r1.95 -r1.95.2.1 src/usr.bin/ftp/version.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/usr.bin/ftp/cmdtab.c diff -u src/usr.bin/ftp/cmdtab.c:1.52 src/usr.bin/ftp/cmdtab.c:1.52.40.1 --- src/usr.bin/ftp/cmdtab.c:1.52 Sat Dec 22 16:57:09 2012 +++ src/usr.bin/ftp/cmdtab.c Tue May 16 16:16:00 2023 @@ -1,7 +1,7 @@ -/* $NetBSD: cmdtab.c,v 1.52 2012/12/22 16:57:09 christos Exp $ */ +/* $NetBSD: cmdtab.c,v 1.52.40.1 2023/05/16 16:16:00 martin Exp $ */ /*- - * Copyright (c) 1996-2009 The NetBSD Foundation, Inc. + * Copyright (c) 1996-2023 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -63,7 +63,7 @@ #if 0 static char sccsid[] = "@(#)cmdtab.c 8.4 (Berkeley) 10/9/94"; #else -__RCSID("$NetBSD: cmdtab.c,v 1.52 2012/12/22 16:57:09 christos Exp $"); +__RCSID("$NetBSD: cmdtab.c,v 1.52.40.1 2023/05/16 16:16:00 martin Exp $"); #endif #endif /* not lint */ @@ -295,13 +295,14 @@ struct cmd cmdtab[] = { }; struct option optiontab[] = { - { "anonpass", NULL }, - { "ftp_proxy", NULL }, - { "http_proxy", NULL }, - { "https_proxy",NULL }, - { "no_proxy", NULL }, - { "pager", NULL }, - { "prompt", NULL }, - { "rprompt", NULL }, - { NULL, NULL }, + { "anonpass", NULL }, + { "ftp_proxy", NULL }, + { "http_proxy", NULL }, + { "https_proxy", NULL }, + { "no_proxy", NULL }, + { "pager", NULL }, + { "prompt", NULL }, + { "rprompt", NULL }, + { "sslnoverify" ,NULL }, + { NULL, NULL }, }; Index: src/usr.bin/ftp/extern.h diff -u src/usr.bin/ftp/extern.h:1.82 src/usr.bin/ftp/extern.h:1.82.10.1 --- src/usr.bin/ftp/extern.h:1.82 Sat Jun 22 23:40:53 2019 +++ src/usr.bin/ftp/extern.h Tue May 16 16:16:00 2023 @@ -1,7 +1,7 @@ -/* $NetBSD: extern.h,v 1.82 2019/06/22 23:40:53 christos Exp $ */ +/* $NetBSD: extern.h,v 1.82.10.1 2023/05/16 16:16:00 martin Exp $ */ /*- - * Copyright (c) 1996-2009 The NetBSD Foundation, Inc. + * Copyright (c) 1996-2023 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -243,6 +243,7 @@ void user(int, char **); int ftp_connect(int, const struct sockaddr *, socklen_t, int); int ftp_listen(int, int); int ftp_poll(struct pollfd *, int, int); +int ftp_truthy(const char *, const char *, int); #ifndef SMALL void *ftp_malloc(size_t); StringList *ftp_sl_init(void); Index: src/usr.bin/ftp/fetch.c diff -u src/usr.bin/ftp/fetch.c:1.235 src/usr.bin/ftp/fetch.c:1.235.2.1 --- src/usr.bin/ftp/fetch.c:1.235 Sun Sep 11 20:49:27 2022 +++ src/usr.bin/ftp/fetch.c Tue May 16 16:16:00 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: fetch.c,v 1.235 2022/09/11 20:49:27 christos Exp $ */ +/* $NetBSD: fetch.c,v 1.235.2.1 2023/05/16 16:16:00 martin Exp $ */ /*- * Copyright (c) 1997-2015 The NetBSD Foundation, Inc. @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: fetch.c,v 1.235 2022/09/11 20:49:27 christos Exp $"); +__RCSID("$NetBSD: fetch.c,v 1.235.2.1 2023/05/16 16:16:00 martin Exp $"); #endif /* not lint */ /* @@ -617,13 +617,15 @@ parse_url(const char *url, const char *d sigjmp_buf httpabort; static int -ftp_socket(const struct urlinfo *ui, void **ssl) +ftp_socket(const struct urlinfo *ui, void **ssl, struct authinfo *auth) { struct addrinfo hints, *res, *res0 = NULL; int error; int s; const char *host = ui->host; const char *port = ui->port; + char *fuser = NULL, *pass = NULL, *facct = NULL; + int n; if (ui->utype != HTTPS_URL_T) ssl = NULL; @@ -688,6 +690,28 @@ ftp_socket(const struct urlinfo *ui, voi continue; } + if (ruserpass("", &fuser, &pass, &facct) < 0) { + close(s); + s = -1; + continue; + } + + if (autologin) { + if (fuser != NULL && auth->user == NULL) + auth->user = ftp_strdup(fuser); + if (pass != NULL && auth->pass == NULL) + auth->pass = ftp_strdup(pass); + } + + for (n = 0; n < macnum; ++n) { + if (!strcmp("init", macros[n].mac_name)) { + (void)strlcpy(line, "$init", sizeof(line)); + makeargv(); + domacro(margc, margv); + break; + } + } + #ifdef WITH_SSL if (ssl) { if ((*ssl = fetch_start_ssl(s, host)) == NULL) { @@ -699,6 +723,15 @@ ftp_socket(const struct urlinfo *ui, voi #endif break; } + + FREEPTR(fuser); + if (pass != NULL) + memset(pass, 0, strlen(pass)); + FREEPTR(pass); + if (facct != NULL) + memset(facct, 0, strlen(facct)); + FREEPTR(facct); + if (res0) freeaddrinfo(res0); return s; @@ -1484,6 +1517,10 @@ fetch_url(const char *url, const char *p } } else { /* ftp:// or http:// URLs */ int hasleading; + static char hostnamebuf[MAXHOSTNAMELEN]; + + (void)strlcpy(hostnamebuf, ui.host, sizeof(hostnamebuf)); + hostname = hostnamebuf; if (penv == NULL) { #ifdef WITH_SSL @@ -1517,7 +1554,7 @@ fetch_url(const char *url, const char *p } } /* ! EMPTYSTRING(penv) */ - s = ftp_socket(&ui, &ssl); + s = ftp_socket(&ui, &ssl, &wauth); if (s < 0) { warnx("Can't connect to `%s:%s'", ui.host, ui.port); goto cleanup_fetch_url; Index: src/usr.bin/ftp/ftp.1 diff -u src/usr.bin/ftp/ftp.1:1.147 src/usr.bin/ftp/ftp.1:1.147.2.1 --- src/usr.bin/ftp/ftp.1:1.147 Tue Aug 30 08:51:28 2022 +++ src/usr.bin/ftp/ftp.1 Tue May 16 16:16:00 2023 @@ -1,6 +1,6 @@ -.\" $NetBSD: ftp.1,v 1.147 2022/08/30 08:51:28 christos Exp $ +.\" $NetBSD: ftp.1,v 1.147.2.1 2023/05/16 16:16:00 martin Exp $ .\" -.\" Copyright (c) 1996-2021 The NetBSD Foundation, Inc. +.\" Copyright (c) 1996-2023 The NetBSD Foundation, Inc. .\" All rights reserved. .\" .\" This code is derived from software contributed to The NetBSD Foundation @@ -57,7 +57,7 @@ .\" .\" @(#)ftp.1 8.3 (Berkeley) 10/9/94 .\" -.Dd August 29, 2022 +.Dd February 25, 2023 .Dt FTP 1 .Os .Sh NAME @@ -1382,7 +1382,7 @@ and .Ar value are not given, display all of the options and their values. The currently supported options are: -.Bl -tag -width "https_proxy" -offset indent +.Bl -tag -width "sslnoverify" -offset indent .It Cm anonpass Defaults to .Ev $FTPANONPASS @@ -1407,6 +1407,9 @@ Defaults to .It Cm rprompt Defaults to .Ev $FTPRPROMPT . +.It Cm sslnoverify +Defaults to +.Ev $FTPSSLNOVERIFY . .El .It Ic site Op Ar arg ... The arguments specified are sent, verbatim, to the remote @@ -2312,6 +2315,8 @@ The value to send for the .Tn HTTP User-Agent header. +.It Ev FTPSSLNOVERIFY +Set to 1 to not verify SSL certificates. .It Ev HOME For default location of a .Pa .netrc @@ -2320,8 +2325,6 @@ file, if one exists. An alternate location of the .Pa .netrc file. -.It Ev NO_CERT_VERIFY -Don't verify SSL certificates. .It Ev PAGER Used by various commands to display files. Defaults to Index: src/usr.bin/ftp/main.c diff -u src/usr.bin/ftp/main.c:1.128 src/usr.bin/ftp/main.c:1.128.2.1 --- src/usr.bin/ftp/main.c:1.128 Sat Oct 9 09:07:20 2021 +++ src/usr.bin/ftp/main.c Tue May 16 16:16:00 2023 @@ -1,7 +1,7 @@ -/* $NetBSD: main.c,v 1.128 2021/10/09 09:07:20 lukem Exp $ */ +/* $NetBSD: main.c,v 1.128.2.1 2023/05/16 16:16:00 martin Exp $ */ /*- - * Copyright (c) 1996-2015 The NetBSD Foundation, Inc. + * Copyright (c) 1996-2023 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -98,7 +98,7 @@ __COPYRIGHT("@(#) Copyright (c) 1985, 19 #if 0 static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 10/9/94"; #else -__RCSID("$NetBSD: main.c,v 1.128 2021/10/09 09:07:20 lukem Exp $"); +__RCSID("$NetBSD: main.c,v 1.128.2.1 2023/05/16 16:16:00 martin Exp $"); #endif #endif /* not lint */ @@ -512,6 +512,7 @@ main(int volatile argc, char **volatile setupoption("pager", getenv("PAGER"), DEFAULTPAGER); setupoption("prompt", getenv("FTPPROMPT"), DEFAULTPROMPT); setupoption("rprompt", getenv("FTPRPROMPT"), DEFAULTRPROMPT); + setupoption("sslnoverify", getenv("FTPSSLNOVERIFY"), ""); free(anonpass); Index: src/usr.bin/ftp/ssl.c diff -u src/usr.bin/ftp/ssl.c:1.12 src/usr.bin/ftp/ssl.c:1.12.2.1 --- src/usr.bin/ftp/ssl.c:1.12 Mon Sep 12 15:10:31 2022 +++ src/usr.bin/ftp/ssl.c Tue May 16 16:16:00 2023 @@ -1,9 +1,10 @@ -/* $NetBSD: ssl.c,v 1.12 2022/09/12 15:10:31 christos Exp $ */ +/* $NetBSD: ssl.c,v 1.12.2.1 2023/05/16 16:16:00 martin Exp $ */ /*- * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav * Copyright (c) 2008, 2010 Joerg Sonnenberger <jo...@netbsd.org> * Copyright (c) 2015 Thomas Klausner <w...@netbsd.org> + * Copyright (c) 2023 Michael van Elst <mlel...@netbsd.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -34,7 +35,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: ssl.c,v 1.12 2022/09/12 15:10:31 christos Exp $"); +__RCSID("$NetBSD: ssl.c,v 1.12.2.1 2023/05/16 16:16:00 martin Exp $"); #endif #include <errno.h> @@ -63,6 +64,11 @@ __RCSID("$NetBSD: ssl.c,v 1.12 2022/09/1 #include "ssl.h" +#include <stringlist.h> +#include <histedit.h> +#include <sys/poll.h> +#include "extern.h" + extern int quit_time, verbose, ftp_debug; extern FILE *ttyout; @@ -589,7 +595,7 @@ fetch_start_ssl(int sock, const char *se SSL_CTX *ctx; X509_VERIFY_PARAM *param; int ret, ssl_err; - int verify = 0; // getenv("NO_CERT_VERIFY") == NULL; + int verify = !ftp_truthy("sslnoverify", getoptionvalue("sslnoverify"), 0); /* Init the SSL library and context */ if (!SSL_library_init()){ @@ -618,6 +624,8 @@ fetch_start_ssl(int sock, const char *se if (!X509_VERIFY_PARAM_set1_host(param, servername, strlen(servername))) { fprintf(ttyout, "SSL verification setup failed\n"); + SSL_free(ssl); + SSL_CTX_free(ctx); return NULL; } @@ -628,6 +636,7 @@ fetch_start_ssl(int sock, const char *se SSL_set_fd(ssl, sock); if (!SSL_set_tlsext_host_name(ssl, __UNCONST(servername))) { fprintf(ttyout, "SSL hostname setting failed\n"); + SSL_free(ssl); SSL_CTX_free(ctx); return NULL; } @@ -637,6 +646,7 @@ fetch_start_ssl(int sock, const char *se ssl_err != SSL_ERROR_WANT_WRITE) { ERR_print_errors_fp(ttyout); SSL_free(ssl); + SSL_CTX_free(ctx); return NULL; } } Index: src/usr.bin/ftp/util.c diff -u src/usr.bin/ftp/util.c:1.164 src/usr.bin/ftp/util.c:1.164.2.1 --- src/usr.bin/ftp/util.c:1.164 Sat Aug 6 18:26:43 2022 +++ src/usr.bin/ftp/util.c Tue May 16 16:16:00 2023 @@ -1,7 +1,7 @@ -/* $NetBSD: util.c,v 1.164 2022/08/06 18:26:43 andvar Exp $ */ +/* $NetBSD: util.c,v 1.164.2.1 2023/05/16 16:16:00 martin Exp $ */ /*- - * Copyright (c) 1997-2020 The NetBSD Foundation, Inc. + * Copyright (c) 1997-2023 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -64,7 +64,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: util.c,v 1.164 2022/08/06 18:26:43 andvar Exp $"); +__RCSID("$NetBSD: util.c,v 1.164.2.1 2023/05/16 16:16:00 martin Exp $"); #endif /* not lint */ /* @@ -1495,6 +1495,26 @@ ftp_poll(struct pollfd *fds, int nfds, i return poll(fds, nfds, timeout); } +/* + * Evaluate a "boolean" string, accept only "1" as true and "0" as false + * Anything else returns the default value. + * Warn about an invalid value that isn't empty. + */ +int +ftp_truthy(const char *name, const char *str, int defvalue) +{ + + if (strcmp(str, "1") == 0) + return 1; + else if (strcmp(str, "0") == 0) + return 0; + + if (*str) + warn("Option %s must be boolean (1 or 0)\n", name); + + return defvalue; +} + #ifndef SMALL /* * malloc() with inbuilt error checking Index: src/usr.bin/ftp/version.h diff -u src/usr.bin/ftp/version.h:1.95 src/usr.bin/ftp/version.h:1.95.2.1 --- src/usr.bin/ftp/version.h:1.95 Thu Sep 22 03:31:04 2022 +++ src/usr.bin/ftp/version.h Tue May 16 16:16:00 2023 @@ -1,7 +1,7 @@ -/* $NetBSD: version.h,v 1.95 2022/09/22 03:31:04 lukem Exp $ */ +/* $NetBSD: version.h,v 1.95.2.1 2023/05/16 16:16:00 martin Exp $ */ /*- - * Copyright (c) 1999-2022 The NetBSD Foundation, Inc. + * Copyright (c) 1999-2023 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -34,5 +34,5 @@ #endif #ifndef FTP_VERSION -#define FTP_VERSION "20220911" +#define FTP_VERSION "20230225" #endif