diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-04-07 14:02:21 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-04-07 14:02:21 +0200 |
commit | 8edaaced16664503e89d9be80637e17dedc56ab9 (patch) | |
tree | 944e3ea4deb9a859700e382007873b5942a02e81 | |
parent | 32c3e3a44cb6ae2b0ff949e9f60fa0405f081dc3 (diff) | |
download | busybox-w32-8edaaced16664503e89d9be80637e17dedc56ab9.tar.gz busybox-w32-8edaaced16664503e89d9be80637e17dedc56ab9.tar.bz2 busybox-w32-8edaaced16664503e89d9be80637e17dedc56ab9.zip |
ftpd: added -A option to disable all authentication, closes 10921
function old new delta
packed_usage 32745 32777 +32
ftpd_main 2162 2156 -6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/1 up/down: 32/-6) Total: 26 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | networking/ftpd.c | 69 |
1 files changed, 40 insertions, 29 deletions
diff --git a/networking/ftpd.c b/networking/ftpd.c index e289a6051..4ecdb4121 100644 --- a/networking/ftpd.c +++ b/networking/ftpd.c | |||
@@ -57,7 +57,7 @@ | |||
57 | //usage: "[-wvS]"IF_FEATURE_FTPD_AUTHENTICATION(" [-a USER]")" [-t N] [-T N] [DIR]" | 57 | //usage: "[-wvS]"IF_FEATURE_FTPD_AUTHENTICATION(" [-a USER]")" [-t N] [-T N] [DIR]" |
58 | //usage:#define ftpd_full_usage "\n\n" | 58 | //usage:#define ftpd_full_usage "\n\n" |
59 | //usage: IF_NOT_FEATURE_FTPD_AUTHENTICATION( | 59 | //usage: IF_NOT_FEATURE_FTPD_AUTHENTICATION( |
60 | //usage: "Anonymous FTP server. Accesses by clients occur under ftpd's UID.\n" | 60 | //usage: "Anonymous FTP server. Client access occurs under ftpd's UID.\n" |
61 | //usage: ) | 61 | //usage: ) |
62 | //usage: IF_FEATURE_FTPD_AUTHENTICATION( | 62 | //usage: IF_FEATURE_FTPD_AUTHENTICATION( |
63 | //usage: "FTP server. " | 63 | //usage: "FTP server. " |
@@ -66,9 +66,11 @@ | |||
66 | //usage: "Should be used as inetd service, inetd.conf line:\n" | 66 | //usage: "Should be used as inetd service, inetd.conf line:\n" |
67 | //usage: " 21 stream tcp nowait root ftpd ftpd /files/to/serve\n" | 67 | //usage: " 21 stream tcp nowait root ftpd ftpd /files/to/serve\n" |
68 | //usage: "Can be run from tcpsvd:\n" | 68 | //usage: "Can be run from tcpsvd:\n" |
69 | //usage: " tcpsvd -vE 0.0.0.0 21 ftpd /files/to/serve\n" | 69 | //usage: " tcpsvd -vE 0.0.0.0 21 ftpd /files/to/serve" |
70 | //usage: "\n" | ||
70 | //usage: "\n -w Allow upload" | 71 | //usage: "\n -w Allow upload" |
71 | //usage: IF_FEATURE_FTPD_AUTHENTICATION( | 72 | //usage: IF_FEATURE_FTPD_AUTHENTICATION( |
73 | //usage: "\n -A No login required, client access occurs under ftpd's UID" | ||
72 | //usage: "\n -a USER Enable 'anonymous' login and map it to USER" | 74 | //usage: "\n -a USER Enable 'anonymous' login and map it to USER" |
73 | //usage: ) | 75 | //usage: ) |
74 | //usage: "\n -v Log errors to stderr. -vv: verbose log" | 76 | //usage: "\n -v Log errors to stderr. -vv: verbose log" |
@@ -1157,9 +1159,12 @@ enum { | |||
1157 | OPT_1 = (1 << 1), | 1159 | OPT_1 = (1 << 1), |
1158 | OPT_A = (1 << 2), | 1160 | OPT_A = (1 << 2), |
1159 | #endif | 1161 | #endif |
1160 | OPT_v = (1 << ((!BB_MMU) * 3 + 0)), | 1162 | BIT_v = (!BB_MMU) * 3, |
1161 | OPT_S = (1 << ((!BB_MMU) * 3 + 1)), | 1163 | OPT_v = (1 << (BIT_v + 0)), |
1162 | OPT_w = (1 << ((!BB_MMU) * 3 + 2)) * ENABLE_FEATURE_FTPD_WRITE, | 1164 | OPT_S = (1 << (BIT_v + 1)), |
1165 | OPT_w = (1 << (BIT_v + 2)) * ENABLE_FEATURE_FTPD_WRITE, | ||
1166 | BIT_A = BIT_v + 2 + ENABLE_FEATURE_FTPD_WRITE, | ||
1167 | OPT_A = (1 << (BIT_A + 0)) * ENABLE_FEATURE_FTPD_AUTHENTICATION, | ||
1163 | }; | 1168 | }; |
1164 | 1169 | ||
1165 | int ftpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 1170 | int ftpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
@@ -1180,14 +1185,16 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv) | |||
1180 | G.timeout = 2 * 60; | 1185 | G.timeout = 2 * 60; |
1181 | #if BB_MMU | 1186 | #if BB_MMU |
1182 | opts = getopt32(argv, "^" "vS" | 1187 | opts = getopt32(argv, "^" "vS" |
1183 | IF_FEATURE_FTPD_WRITE("w") "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:") | 1188 | IF_FEATURE_FTPD_WRITE("w") IF_FEATURE_FTPD_AUTHENTICATION("A") |
1189 | "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:") | ||
1184 | "\0" "vv:SS", | 1190 | "\0" "vv:SS", |
1185 | &G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,) | 1191 | &G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,) |
1186 | &G.verbose, &verbose_S | 1192 | &G.verbose, &verbose_S |
1187 | ); | 1193 | ); |
1188 | #else | 1194 | #else |
1189 | opts = getopt32(argv, "^" "l1AvS" | 1195 | opts = getopt32(argv, "^" "l1AvS" |
1190 | IF_FEATURE_FTPD_WRITE("w") "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:") | 1196 | IF_FEATURE_FTPD_WRITE("w") IF_FEATURE_FTPD_AUTHENTICATION("A") |
1197 | "t:+T:+" IF_FEATURE_FTPD_AUTHENTICATION("a:") | ||
1191 | "\0" "vv:SS", | 1198 | "\0" "vv:SS", |
1192 | &G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,) | 1199 | &G.timeout, &abs_timeout, IF_FEATURE_FTPD_AUTHENTICATION(&anon_opt,) |
1193 | &G.verbose, &verbose_S | 1200 | &G.verbose, &verbose_S |
@@ -1254,30 +1261,32 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv) | |||
1254 | signal(SIGALRM, timeout_handler); | 1261 | signal(SIGALRM, timeout_handler); |
1255 | 1262 | ||
1256 | #if ENABLE_FEATURE_FTPD_AUTHENTICATION | 1263 | #if ENABLE_FEATURE_FTPD_AUTHENTICATION |
1257 | while (1) { | 1264 | if (!(opts & OPT_A)) { |
1258 | uint32_t cmdval = cmdio_get_cmd_and_arg(); | 1265 | while (1) { |
1259 | if (cmdval == const_USER) { | 1266 | uint32_t cmdval = cmdio_get_cmd_and_arg(); |
1260 | if (anon_opt && strcmp(G.ftp_arg, "anonymous") == 0) { | 1267 | if (cmdval == const_USER) { |
1261 | pw = getpwnam(anon_opt); | 1268 | if (anon_opt && strcmp(G.ftp_arg, "anonymous") == 0) { |
1262 | if (pw) | 1269 | pw = getpwnam(anon_opt); |
1263 | break; /* does not even ask for password */ | 1270 | if (pw) |
1264 | } | 1271 | break; /* does not even ask for password */ |
1265 | pw = getpwnam(G.ftp_arg); | 1272 | } |
1266 | cmdio_write_raw(STR(FTP_GIVEPWORD)" Specify password\r\n"); | 1273 | pw = getpwnam(G.ftp_arg); |
1267 | } else if (cmdval == const_PASS) { | 1274 | cmdio_write_raw(STR(FTP_GIVEPWORD)" Specify password\r\n"); |
1268 | if (check_password(pw, G.ftp_arg) > 0) { | 1275 | } else if (cmdval == const_PASS) { |
1269 | break; /* login success */ | 1276 | if (check_password(pw, G.ftp_arg) > 0) { |
1277 | break; /* login success */ | ||
1278 | } | ||
1279 | cmdio_write_raw(STR(FTP_LOGINERR)" Login failed\r\n"); | ||
1280 | pw = NULL; | ||
1281 | } else if (cmdval == const_QUIT) { | ||
1282 | WRITE_OK(FTP_GOODBYE); | ||
1283 | return 0; | ||
1284 | } else { | ||
1285 | cmdio_write_raw(STR(FTP_LOGINERR)" Login with USER+PASS\r\n"); | ||
1270 | } | 1286 | } |
1271 | cmdio_write_raw(STR(FTP_LOGINERR)" Login failed\r\n"); | ||
1272 | pw = NULL; | ||
1273 | } else if (cmdval == const_QUIT) { | ||
1274 | WRITE_OK(FTP_GOODBYE); | ||
1275 | return 0; | ||
1276 | } else { | ||
1277 | cmdio_write_raw(STR(FTP_LOGINERR)" Login with USER+PASS\r\n"); | ||
1278 | } | 1287 | } |
1288 | WRITE_OK(FTP_LOGINOK); | ||
1279 | } | 1289 | } |
1280 | WRITE_OK(FTP_LOGINOK); | ||
1281 | #endif | 1290 | #endif |
1282 | 1291 | ||
1283 | /* Do this after auth, else /etc/passwd is not accessible */ | 1292 | /* Do this after auth, else /etc/passwd is not accessible */ |
@@ -1309,7 +1318,9 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv) | |||
1309 | } | 1318 | } |
1310 | 1319 | ||
1311 | #if ENABLE_FEATURE_FTPD_AUTHENTICATION | 1320 | #if ENABLE_FEATURE_FTPD_AUTHENTICATION |
1312 | change_identity(pw); | 1321 | if (pw) |
1322 | change_identity(pw); | ||
1323 | /* else: -A is in effect */ | ||
1313 | #endif | 1324 | #endif |
1314 | 1325 | ||
1315 | /* RFC-959 Section 5.1 | 1326 | /* RFC-959 Section 5.1 |