This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx-apps.git
The following commit(s) were added to refs/heads/master by this push:
new 3a28933ca nshlib: Don't show passwd in telnet login
3a28933ca is described below
commit 3a28933ca88119ddf472ceed88bfebaa16ab6b90
Author: Huang Qi <[email protected]>
AuthorDate: Sat Apr 22 10:15:42 2023 +0800
nshlib: Don't show passwd in telnet login
Current implementation is broken, in this patch ECHO is
disabled by termios.
This patch works with https://github.com/apache/nuttx/pull/8950
Signed-off-by: Huang Qi <[email protected]>
---
nshlib/nsh_telnetlogin.c | 50 ++++++++++++++++++++++++++++--------------------
1 file changed, 29 insertions(+), 21 deletions(-)
diff --git a/nshlib/nsh_telnetlogin.c b/nshlib/nsh_telnetlogin.c
index c2ec13a53..3167fb93c 100644
--- a/nshlib/nsh_telnetlogin.c
+++ b/nshlib/nsh_telnetlogin.c
@@ -27,6 +27,7 @@
#include <string.h>
#include <ctype.h>
#include <unistd.h>
+#include <termios.h>
#include "fsutils/passwd.h"
@@ -53,21 +54,6 @@
* Private Functions
****************************************************************************/
-/****************************************************************************
- * Name: nsh_telnetecho
- ****************************************************************************/
-
-static void nsh_telnetecho(FAR struct console_stdio_s *pstate,
- uint8_t is_use)
-{
- uint8_t optbuf[4];
- optbuf[0] = TELNET_IAC;
- optbuf[1] = (is_use == TELNET_USE_ECHO) ? TELNET_WILL : TELNET_DO;
- optbuf[2] = 1;
- optbuf[3] = 0;
- write(OUTFD(pstate), optbuf, strlen((FAR const char *)optbuf));
-}
-
/****************************************************************************
* Name: nsh_telnettoken
****************************************************************************/
@@ -166,7 +152,9 @@ int nsh_telnetlogin(FAR struct console_stdio_s *pstate)
#ifdef CONFIG_NSH_PLATFORM_CHALLENGE
char challenge[128];
#endif
+ struct termios cfg;
int i;
+ int ret;
#ifdef CONFIG_NSH_PLATFORM_SKIP_LOGIN
if (platform_skip_login() == OK)
@@ -211,11 +199,34 @@ int nsh_telnetlogin(FAR struct console_stdio_s *pstate)
/* Ask for the login password */
write(OUTFD(pstate), g_passwordprompt, strlen(g_passwordprompt));
- nsh_telnetecho(pstate, TELNET_NOTUSE_ECHO);
+
+ /* Disable ECHO if its a tty device */
+
+ if (isatty(INFD(pstate)))
+ {
+ if (tcgetattr(INFD(pstate), &cfg) == 0)
+ {
+ cfg.c_lflag &= ~ECHO;
+ tcsetattr(INFD(pstate), TCSANOW, &cfg);
+ }
+ }
password[0] = '\0';
- if (readline_fd(pstate->cn_line, CONFIG_NSH_LINELEN,
- INFD(pstate), OUTFD(pstate)) >= 0)
+ ret = readline_fd(pstate->cn_line, CONFIG_NSH_LINELEN,
+ INFD(pstate), OUTFD(pstate));
+
+ /* Enable echo again after password */
+
+ if (isatty(INFD(pstate)))
+ {
+ if (tcgetattr(INFD(pstate), &cfg) == 0)
+ {
+ cfg.c_lflag |= ECHO;
+ tcsetattr(INFD(pstate), TCSANOW, &cfg);
+ }
+ }
+
+ if (ret >= 0)
{
/* Parse out the password */
@@ -242,7 +253,6 @@ int nsh_telnetlogin(FAR struct console_stdio_s *pstate)
#endif
{
write(OUTFD(pstate), g_loginsuccess, strlen(g_loginsuccess));
- nsh_telnetecho(pstate, TELNET_USE_ECHO);
return OK;
}
else
@@ -254,8 +264,6 @@ int nsh_telnetlogin(FAR struct console_stdio_s *pstate)
#endif
}
}
-
- nsh_telnetecho(pstate, TELNET_USE_ECHO);
}
/* Too many failed login attempts */