X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=networking%2Fftpd.c;h=6ca231c90b203d4ee54a6fb7fe46c5188b61441b;hb=505eeae402a84dc5208986c5ad611f5e485cbe34;hp=e289a60517156d52c59f8f4bcf946719760b937d;hpb=32c3e3a44cb6ae2b0ff949e9f60fa0405f081dc3;p=oweals%2Fbusybox.git diff --git a/networking/ftpd.c b/networking/ftpd.c index e289a6051..6ca231c90 100644 --- a/networking/ftpd.c +++ b/networking/ftpd.c @@ -57,7 +57,7 @@ //usage: "[-wvS]"IF_FEATURE_FTPD_AUTHENTICATION(" [-a USER]")" [-t N] [-T N] [DIR]" //usage:#define ftpd_full_usage "\n\n" //usage: IF_NOT_FEATURE_FTPD_AUTHENTICATION( -//usage: "Anonymous FTP server. Accesses by clients occur under ftpd's UID.\n" +//usage: "Anonymous FTP server. Client access occurs under ftpd's UID.\n" //usage: ) //usage: IF_FEATURE_FTPD_AUTHENTICATION( //usage: "FTP server. " @@ -66,9 +66,15 @@ //usage: "Should be used as inetd service, inetd.conf line:\n" //usage: " 21 stream tcp nowait root ftpd ftpd /files/to/serve\n" //usage: "Can be run from tcpsvd:\n" -//usage: " tcpsvd -vE 0.0.0.0 21 ftpd /files/to/serve\n" +//usage: " tcpsvd -vE 0.0.0.0 21 ftpd /files/to/serve" +//usage: "\n" //usage: "\n -w Allow upload" //usage: IF_FEATURE_FTPD_AUTHENTICATION( +//usage: "\n -A No login required, client access occurs under ftpd's UID" +// +// if !FTPD_AUTHENTICATION, -A is accepted too, but not shown in --help +// since it's the only supported mode in that configuration +// //usage: "\n -a USER Enable 'anonymous' login and map it to USER" //usage: ) //usage: "\n -v Log errors to stderr. -vv: verbose log" @@ -1155,11 +1161,12 @@ enum { #if !BB_MMU OPT_l = (1 << 0), OPT_1 = (1 << 1), - OPT_A = (1 << 2), #endif - OPT_v = (1 << ((!BB_MMU) * 3 + 0)), - OPT_S = (1 << ((!BB_MMU) * 3 + 1)), - OPT_w = (1 << ((!BB_MMU) * 3 + 2)) * ENABLE_FEATURE_FTPD_WRITE, + BIT_A = (!BB_MMU) * 2, + OPT_A = (1 << (BIT_A + 0)), + OPT_v = (1 << (BIT_A + 1)), + OPT_S = (1 << (BIT_A + 2)), + OPT_w = (1 << (BIT_A + 3)) * ENABLE_FEATURE_FTPD_WRITE, }; int ftpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; @@ -1179,24 +1186,25 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv) verbose_S = 0; G.timeout = 2 * 60; #if BB_MMU - opts = getopt32(argv, "^" "vS" - IF_FEATURE_FTPD_WRITE("w") "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:") + opts = getopt32(argv, "^" "AvS" IF_FEATURE_FTPD_WRITE("w") + "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:") "\0" "vv:SS", &G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,) &G.verbose, &verbose_S ); #else - opts = getopt32(argv, "^" "l1AvS" - IF_FEATURE_FTPD_WRITE("w") "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:") + opts = getopt32(argv, "^" "l1AvS" IF_FEATURE_FTPD_WRITE("w") + "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:") "\0" "vv:SS", &G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,) &G.verbose, &verbose_S ); if (opts & (OPT_l|OPT_1)) { - /* Our secret backdoor to ls */ + /* Our secret backdoor to ls: see popen_ls() */ if (fchdir(3) != 0) _exit(127); /* memset(&G, 0, sizeof(G)); - ls_main does it */ + /* NB: in this case -A has a different meaning: like "ls -A" */ return ls_main(/*argc_unused*/ 0, argv); } #endif @@ -1254,30 +1262,32 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv) signal(SIGALRM, timeout_handler); #if ENABLE_FEATURE_FTPD_AUTHENTICATION - while (1) { - uint32_t cmdval = cmdio_get_cmd_and_arg(); - if (cmdval == const_USER) { - if (anon_opt && strcmp(G.ftp_arg, "anonymous") == 0) { - pw = getpwnam(anon_opt); - if (pw) - break; /* does not even ask for password */ - } - pw = getpwnam(G.ftp_arg); - cmdio_write_raw(STR(FTP_GIVEPWORD)" Specify password\r\n"); - } else if (cmdval == const_PASS) { - if (check_password(pw, G.ftp_arg) > 0) { - break; /* login success */ + if (!(opts & OPT_A)) { + while (1) { + uint32_t cmdval = cmdio_get_cmd_and_arg(); + if (cmdval == const_USER) { + if (anon_opt && strcmp(G.ftp_arg, "anonymous") == 0) { + pw = getpwnam(anon_opt); + if (pw) + break; /* does not even ask for password */ + } + pw = getpwnam(G.ftp_arg); + cmdio_write_raw(STR(FTP_GIVEPWORD)" Specify password\r\n"); + } else if (cmdval == const_PASS) { + if (check_password(pw, G.ftp_arg) > 0) { + break; /* login success */ + } + cmdio_write_raw(STR(FTP_LOGINERR)" Login failed\r\n"); + pw = NULL; + } else if (cmdval == const_QUIT) { + WRITE_OK(FTP_GOODBYE); + return 0; + } else { + cmdio_write_raw(STR(FTP_LOGINERR)" Login with USER+PASS\r\n"); } - cmdio_write_raw(STR(FTP_LOGINERR)" Login failed\r\n"); - pw = NULL; - } else if (cmdval == const_QUIT) { - WRITE_OK(FTP_GOODBYE); - return 0; - } else { - cmdio_write_raw(STR(FTP_LOGINERR)" Login with USER+PASS\r\n"); } + WRITE_OK(FTP_LOGINOK); } - WRITE_OK(FTP_LOGINOK); #endif /* Do this after auth, else /etc/passwd is not accessible */ @@ -1309,7 +1319,9 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv) } #if ENABLE_FEATURE_FTPD_AUTHENTICATION - change_identity(pw); + if (pw) + change_identity(pw); + /* else: -A is in effect */ #endif /* RFC-959 Section 5.1