Anonymous ftpd logins is usefull even when ftpd authentication feature
is enabled. Anonymous logins provide simple password-less connection
for FTP clients.
To allow password-less connection user command line option '-a USER' is
added. This option allow specifying the system user to use when
'anonymous' username is provided in USER command.
Signed-off-by: Andrey Mozzhuhin <[email protected]>
---
networking/ftpd.c | 26 ++++++++++++++++++--------
1 file changed, 18 insertions(+), 8 deletions(-)
diff --git a/networking/ftpd.c b/networking/ftpd.c
index bcd60a2..7dd2242 100644
--- a/networking/ftpd.c
+++ b/networking/ftpd.c
@@ -47,7 +47,9 @@
//kbuild:lib-$(CONFIG_FTPD) += ftpd.o
//usage:#define ftpd_trivial_usage
-//usage: "[-wvS] [-t N] [-T N] [DIR]"
+//usage: "[-wvS]"
+//usage: IF_FEATURE_FTPD_AUTHENTICATION(" [-a USER]")
+//usage: " [-t N] [-T N] [DIR]"
//usage:#define ftpd_full_usage "\n\n"
//usage: "Anonymous FTP server\n"
//usage: "\n"
@@ -59,6 +61,8 @@
//usage: "\n -w Allow upload"
//usage: "\n -v Log errors to stderr. -vv: verbose log"
//usage: "\n -S Log errors to syslog. -SS: verbose log"
+//usage: IF_FEATURE_FTPD_AUTHENTICATION(
+//usage: "\n -a USER User for anonymous logins")
//usage: "\n -t,-T Idle and absolute timeouts"
//usage: "\n DIR Change root to this directory"
@@ -1154,6 +1158,8 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
{
#if ENABLE_FEATURE_FTPD_AUTHENTICATION
struct passwd *pw = NULL;
+ char *anonymous_user = NULL;
+ int is_anonymous = 0;
#endif
unsigned abs_timeout;
unsigned verbose_S;
@@ -1165,10 +1171,13 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
verbose_S = 0;
G.timeout = 2 * 60;
opt_complementary = "vv:SS";
-#if BB_MMU
- opts = getopt32(argv, "vS" IF_FEATURE_FTPD_WRITE("w") "t:+T:+",
&G.timeout, &abs_timeout, &G.verbose, &verbose_S);
-#else
- opts = getopt32(argv, "l1AvS" IF_FEATURE_FTPD_WRITE("w") "t:+T:+",
&G.timeout, &abs_timeout, &G.verbose, &verbose_S);
+ opts = getopt32(argv, USE_FOR_NOMMU("l1A") "vS"
IF_FEATURE_FTPD_WRITE("w")
+ "t:+T:+"
+ IF_FEATURE_FTPD_AUTHENTICATION("a:"),
+ &G.timeout, &abs_timeout,
+ IF_FEATURE_FTPD_AUTHENTICATION(&anonymous_user,)
+ &G.verbose, &verbose_S);
+#if !BB_MMU
if (opts & (OPT_l|OPT_1)) {
/* Our secret backdoor to ls */
/* TODO: pass --group-directories-first? would be nice, but ls doesn't
do that yet */
@@ -1234,11 +1243,12 @@ int ftpd_main(int argc UNUSED_PARAM, char **argv)
#if ENABLE_FEATURE_FTPD_AUTHENTICATION
while (1) {
uint32_t cmdval = cmdio_get_cmd_and_arg();
- if (cmdval == const_USER) {
- pw = getpwnam(G.ftp_arg);
+ if (cmdval == const_USER) {
+ is_anonymous = anonymous_user && !strcmp(G.ftp_arg,
"anonymous");
+ pw = is_anonymous ? getpwnam(anonymous_user) :
getpwnam(G.ftp_arg);
cmdio_write_raw(STR(FTP_GIVEPWORD)" Please specify
password\r\n");
} else if (cmdval == const_PASS) {
- if (check_password(pw, G.ftp_arg) > 0) {
+ if (is_anonymous || check_password(pw, G.ftp_arg) > 0) {
break; /* login success */
}
cmdio_write_raw(STR(FTP_LOGINERR)" Login failed\r\n");
--
2.7.4
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox