ftpd: Remove FTPD_SessionInfo_t::pass member

There is no need to keep the password throughout the session.

Update #3530.
This commit is contained in:
Sebastian Huber
2018-10-05 14:39:46 +02:00
parent e761fb4dc0
commit dcf42bb238
3 changed files with 51 additions and 16 deletions

View File

@@ -265,7 +265,6 @@ typedef struct
int xfer_mode; /* Transfer mode (ASCII/binary) */ int xfer_mode; /* Transfer mode (ASCII/binary) */
rtems_id tid; /* Task id */ rtems_id tid; /* Task id */
char *user; /* user name (0 if not supplied) */ char *user; /* user name (0 if not supplied) */
char *pass; /* password (0 if not supplied) */
bool auth; /* true if user/pass was valid, false if not or not supplied */ bool auth; /* true if user/pass was valid, false if not or not supplied */
} FTPD_SessionInfo_t; } FTPD_SessionInfo_t;
@@ -1739,8 +1738,6 @@ exec_command(FTPD_SessionInfo_t *info, char* cmd, char* args)
{ {
sscanf(args, "%254s", fname); sscanf(args, "%254s", fname);
free(info->user); free(info->user);
free(info->pass);
info->pass = NULL;
info->user = strdup(fname); info->user = strdup(fname);
if (ftpd_config->login && if (ftpd_config->login &&
!ftpd_config->login(info->user, NULL)) { !ftpd_config->login(info->user, NULL)) {
@@ -1753,14 +1750,11 @@ exec_command(FTPD_SessionInfo_t *info, char* cmd, char* args)
} }
else if (!strcmp("PASS", cmd)) else if (!strcmp("PASS", cmd))
{ {
sscanf(args, "%254s", fname);
free(info->pass);
info->pass = strdup(fname);
if (!info->user) { if (!info->user) {
send_reply(info, 332, "Need account to log in"); send_reply(info, 332, "Need account to log in");
} else { } else {
if (ftpd_config->login && if (ftpd_config->login &&
!ftpd_config->login(info->user, info->pass)) { !ftpd_config->login(info->user, args)) {
info->auth = false; info->auth = false;
send_reply(info, 530, "Not logged in."); send_reply(info, 530, "Not logged in.");
} else { } else {
@@ -1951,7 +1945,6 @@ session(rtems_task_argument arg)
close_data_socket(info); close_data_socket(info);
close_stream(info); close_stream(info);
free(info->user); free(info->user);
free(info->pass);
task_pool_release(info); task_pool_release(info);
} }
} }
@@ -2038,7 +2031,6 @@ ftpd_daemon(rtems_task_argument args RTEMS_UNUSED)
htons(ntohs(info->ctrl_addr.sin_port) - 1); htons(ntohs(info->ctrl_addr.sin_port) - 1);
info->idle = ftpd_timeout; info->idle = ftpd_timeout;
info->user = NULL; info->user = NULL;
info->pass = NULL;
if (ftpd_config->login) if (ftpd_config->login)
info->auth = false; info->auth = false;
else else

View File

@@ -1,10 +1,17 @@
*** TEST FTP 1 *** *** BEGIN OF TEST FTP 1 ***
*** TEST VERSION: 5.0.0.b38887ad22e2e28c15b4e248dac72f6eaff8cb13
*** TEST STATE: EXPECTED-PASS
*** TEST BUILD: RTEMS_NETWORKING
*** TEST TOOLS: 7.3.0 20180125 (RTEMS 5, RSB 9670d7541e0621915e521fe76e7bb33de8cee661, Newlib d13c84eb07e35984bf7a974cd786a6cdac29e6b9)
syslog: ftpd: FTP daemon started (2 sessions max) syslog: ftpd: FTP daemon started (2 sessions max)
220 RTEMS FTP server (Version 1.1-JWJ) ready. 220 RTEMS FTP server (Version 1.1-JWJ) ready.
login check (1): user "anonymous"
USER anonymous USER anonymous
230 User logged in. 230 User logged in.
TYPE I TYPE I
200 Type set to I. 200 Type set to I.
SIZE a.txt
550 Could not get file size.
PASV PASV
227 Entering passive mode (127,0,0,1,4,1). 227 Entering passive mode (127,0,0,1,4,1).
STOR a.txt STOR a.txt
@@ -13,6 +20,7 @@ STOR a.txt
QUIT QUIT
221 Goodbye. 221 Goodbye.
220 RTEMS FTP server (Version 1.1-JWJ) ready. 220 RTEMS FTP server (Version 1.1-JWJ) ready.
login check (1): user "anonymous"
USER anonymous USER anonymous
230 User logged in. 230 User logged in.
TYPE I TYPE I
@@ -24,10 +32,16 @@ PASV
RETR a.txt RETR a.txt
150 Opening BINARY mode data connection. 150 Opening BINARY mode data connection.
220 RTEMS FTP server (Version 1.1-JWJ) ready. 220 RTEMS FTP server (Version 1.1-JWJ) ready.
USER anonymous login check (1): user "user"
USER user
331 User name okay, need password.
login check (2): user "user", pass "pass"
PASS pass
230 User logged in. 230 User logged in.
TYPE I TYPE I
200 Type set to I. 200 Type set to I.
SIZE b.txt
550 Could not get file size.
PASV PASV
227 Entering passive mode (127,0,0,1,4,7). 227 Entering passive mode (127,0,0,1,4,7).
STOR b.txt STOR b.txt
@@ -39,7 +53,11 @@ QUIT
QUIT QUIT
221 Goodbye. 221 Goodbye.
220 RTEMS FTP server (Version 1.1-JWJ) ready. 220 RTEMS FTP server (Version 1.1-JWJ) ready.
USER anonymous login check (1): user "user"
USER user
331 User name okay, need password.
login check (2): user "user", pass "pass"
PASS pass
230 User logged in. 230 User logged in.
TYPE I TYPE I
200 Type set to I. 200 Type set to I.
@@ -53,6 +71,7 @@ RETR b.txt
QUIT QUIT
221 Goodbye. 221 Goodbye.
220 RTEMS FTP server (Version 1.1-JWJ) ready. 220 RTEMS FTP server (Version 1.1-JWJ) ready.
login check (1): user "anonymous"
USER anonymous USER anonymous
230 User logged in. 230 User logged in.
TYPE I TYPE I
@@ -62,7 +81,11 @@ SIZE a.txt
QUIT QUIT
221 Goodbye. 221 Goodbye.
220 RTEMS FTP server (Version 1.1-JWJ) ready. 220 RTEMS FTP server (Version 1.1-JWJ) ready.
USER anonymous login check (1): user "user"
USER user
331 User name okay, need password.
login check (2): user "user", pass "pass"
PASS pass
230 User logged in. 230 User logged in.
TYPE I TYPE I
200 Type set to I. 200 Type set to I.
@@ -70,4 +93,5 @@ SIZE b.txt
213 1102 213 1102
QUIT QUIT
221 Goodbye. 221 Goodbye.
*** END OF TEST FTP 1 *** *** END OF TEST FTP 1 ***

View File

@@ -1,8 +1,8 @@
/* /*
* Copyright (c) 2011 embedded brains GmbH. All rights reserved. * Copyright (c) 2011, 2018 embedded brains GmbH. All rights reserved.
* *
* embedded brains GmbH * embedded brains GmbH
* Obere Lagerstr. 30 * Dornierstr. 4
* 82178 Puchheim * 82178 Puchheim
* Germany * Germany
* <rtems@embedded-brains.de> * <rtems@embedded-brains.de>
@@ -38,6 +38,24 @@ struct rtems_bsdnet_config rtems_bsdnet_config;
#define FTP_WORKER_TASK_EXTRA_STACK (FTP_WORKER_TASK_COUNT * FTPD_STACKSIZE) #define FTP_WORKER_TASK_EXTRA_STACK (FTP_WORKER_TASK_COUNT * FTPD_STACKSIZE)
static bool login_check(const char *user, const char *pass)
{
rtems_test_assert(
strcmp(user, "anonymous") == 0 || strcmp(user, "user") == 0
);
if (pass != NULL) {
rtems_test_assert(
strcmp(pass, "anonymous") == 0 || strcmp(pass, "pass") == 0
);
printf("login check (2): user \"%s\", pass \"%s\"\n", user, pass);
return true;
} else {
printf("login check (1): user \"%s\"\n", user);
return strcmp(user, "anonymous") == 0;
}
}
struct rtems_ftpd_configuration rtems_ftpd_configuration = { struct rtems_ftpd_configuration rtems_ftpd_configuration = {
.priority = 90, .priority = 90,
.max_hook_filesize = 0, .max_hook_filesize = 0,
@@ -46,6 +64,7 @@ struct rtems_ftpd_configuration rtems_ftpd_configuration = {
.root = NULL, .root = NULL,
.tasks_count = FTP_WORKER_TASK_COUNT, .tasks_count = FTP_WORKER_TASK_COUNT,
.idle = 0, .idle = 0,
.login = login_check,
.access = 0 .access = 0
}; };
@@ -199,7 +218,7 @@ static void test(void)
{ {
int rv = 0; int rv = 0;
const char file_a [] = "/FTP/127.0.0.1/a.txt"; const char file_a [] = "/FTP/127.0.0.1/a.txt";
const char file_b [] = "/FTP/127.0.0.1/b.txt"; const char file_b [] = "/FTP/user:pass@127.0.0.1/b.txt";
rv = rtems_bsdnet_initialize_network(); rv = rtems_bsdnet_initialize_network();
rtems_test_assert(rv == 0); rtems_test_assert(rv == 0);