From 539ffc91296dd3f38a94b70821dc61c4c413dfa1 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Sun, 22 Feb 2004 12:25:47 +0000 Subject: [PATCH] Fernando Silveira writes: Hi, Well, I made this patch a long time ago (08/2002) because it was a need of a project, but had no time to send it to you. It adds support to `autologin' option of the telnet protocol. It has been used since made with busybox 0.60.3 at production and I had no problems with it. I have ported it to the HEAD revision of the CVS server (20040211) and I hope you enjoy and apply it to the official sources. :) Thanks a lot! --- include/usage.h | 15 ++++++++ networking/Config.in | 10 ++++++ networking/telnet.c | 85 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 110 insertions(+) diff --git a/include/usage.h b/include/usage.h index 59e81c2d3..56650d565 100644 --- a/include/usage.h +++ b/include/usage.h @@ -2415,11 +2415,26 @@ "$ cat /tmp/foo\n" \ "Hello\n" +#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN +#define telnet_trivial_usage \ + "[-a] [-l USER] HOST [PORT]" +#define telnet_full_usage \ + "Telnet is used to establish interactive communication with another\n" \ + "computer over a network using the TELNET protocol.\n\n" \ + "Options:\n" \ + "\t-a\t\tAttempt an automatic login with the USER variable.\n" \ + "\t-l USER\t\tAttempt an automatic login with the USER argument.\n" \ + "\tHOST\t\tThe official name, alias or the IP address of the\n" \ + "\t\t\tremote host.\n" \ + "\tPORT\t\tThe remote port number to connect to. If it is not\n" \ + "\t\t\tspecified, the default telnet (23) port is used.\n" +#else #define telnet_trivial_usage \ "HOST [PORT]" #define telnet_full_usage \ "Telnet is used to establish interactive communication with another\n"\ "computer over a network using the TELNET protocol." +#endif #ifdef CONFIG_FEATURE_TELNETD_INETD #define telnetd_trivial_usage \ diff --git a/networking/Config.in b/networking/Config.in index f250e78cc..d2916e7cd 100644 --- a/networking/Config.in +++ b/networking/Config.in @@ -479,6 +479,16 @@ config CONFIG_FEATURE_TELNET_TTYPE remote host you are connecting to. This is useful to make sure that things like ANSI colors and other control sequences behave. +config CONFIG_FEATURE_TELNET_AUTOLOGIN + bool " Pass USER type to remote host" + default y + depends on CONFIG_TELNET + help + Setting this option will forward the USER environment variable to the + remote host you are connecting to. This is useful when you need to + log into a machine without telling the username (autologin). This + option enables `-a' and `-l USER' arguments. + config CONFIG_TELNETD bool "telnetd" default n diff --git a/networking/telnet.c b/networking/telnet.c index 1b71bf26a..574fe8dab 100644 --- a/networking/telnet.c +++ b/networking/telnet.c @@ -28,6 +28,8 @@ * Modified 2000/06/13 for inclusion into BusyBox by Erik Andersen * Modified 2001/05/07 to add ability to pass TTYPE to remote host by Jim McQuillan * + * Modified 2004/02/11 to add ability to pass the USER variable to remote host + * by Fernando Silveira * */ @@ -129,6 +131,10 @@ static int one = 1; static char *ttype; #endif +#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN +static char *autologin; +#endif + #ifdef CONFIG_FEATURE_AUTOWIDTH static int win_width, win_height; #endif @@ -355,6 +361,34 @@ static void putiac_subopt(byte c, char *str) } #endif +#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN +static void putiac_subopt_autologin(void) +{ + int len = strlen(autologin) + 6; // (2 + 1 + 1 + strlen + 2) + char *user = "USER"; + + if (G.iaclen + len > IACBUFSIZE) + iacflush(); + + putiac(IAC); + putiac(SB); + putiac(TELOPT_NEW_ENVIRON); + putiac(TELQUAL_IS); + putiac(NEW_ENV_VAR); + + while(*user) + putiac(*user++); + + putiac(NEW_ENV_VALUE); + + while(*autologin) + putiac(*autologin++); + + putiac(IAC); + putiac(SE); +} +#endif + #ifdef CONFIG_FEATURE_AUTOWIDTH static void putiac_naws(byte c, int x, int y) { @@ -495,6 +529,20 @@ static inline void to_ttype(void) } #endif +#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN +static inline void to_new_environ(void) +{ + /* Tell server we will (or will not) do AUTOLOGIN */ + + if (autologin) + putiac2(WILL, TELOPT_NEW_ENVIRON); + else + putiac2(WONT, TELOPT_NEW_ENVIRON); + + return; +} +#endif + #ifdef CONFIG_FEATURE_AUTOWIDTH static inline void to_naws(void) { @@ -513,6 +561,9 @@ static void telopt(byte c) #ifdef CONFIG_FEATURE_TELNET_TTYPE case TELOPT_TTYPE: to_ttype();break; #endif +#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN + case TELOPT_NEW_ENVIRON: to_new_environ(); break; +#endif #ifdef CONFIG_FEATURE_AUTOWIDTH case TELOPT_NAWS: to_naws(); putiac_naws(c, win_width, win_height); @@ -539,6 +590,11 @@ static int subneg(byte c) else if (c == TELOPT_TTYPE) putiac_subopt(TELOPT_TTYPE,ttype); +#endif +#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN + else + if (c == TELOPT_NEW_ENVIRON) + putiac_subopt_autologin(); #endif break; case TS_SUB2: @@ -579,6 +635,10 @@ extern int telnet_main(int argc, char** argv) int maxfd; #endif +#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN + int opt; +#endif + #ifdef CONFIG_FEATURE_AUTOWIDTH get_terminal_width_height(0, &win_width, &win_height); #endif @@ -598,8 +658,33 @@ extern int telnet_main(int argc, char** argv) if (argc < 2) bb_show_usage(); +#ifdef CONFIG_FEATURE_TELNET_AUTOLOGIN + autologin = NULL; + while ((opt = getopt(argc, argv, "al:")) != EOF) { + switch (opt) { + case 'l': + autologin = bb_xstrdup(optarg); + break; + case 'a': + autologin = getenv("USER"); + break; + case '?': + bb_show_usage(); + break; + } + } + if (optind < argc) { + bb_lookup_host(&s_in, argv[optind++]); + s_in.sin_port = bb_lookup_port((optind < argc) ? argv[optind++] : + "telnet", "tcp", 23); + if (optind < argc) + bb_show_usage(); + } else + bb_show_usage(); +#else bb_lookup_host(&s_in, argv[1]); s_in.sin_port = bb_lookup_port((argc == 3) ? argv[2] : "telnet", "tcp", 23); +#endif G.netfd = xconnect(&s_in);