[PATCH] Add option for specifying username to use for anonymous logins

Andrey Mozzhuhin amozzhuhin at yandex.ru
Fri Jan 6 22:01:42 UTC 2017


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 <amozzhuhin at yandex.ru>
---
  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


More information about the busybox mailing list