telnet.c 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071
  1. /*
  2. * Telnet backend.
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <limits.h>
  7. #include "putty.h"
  8. #define IAC 255 /* interpret as command: */
  9. #define DONT 254 /* you are not to use option */
  10. #define DO 253 /* please, you use option */
  11. #define WONT 252 /* I won't use option */
  12. #define WILL 251 /* I will use option */
  13. #define SB 250 /* interpret as subnegotiation */
  14. #define SE 240 /* end sub negotiation */
  15. #define GA 249 /* you may reverse the line */
  16. #define EL 248 /* erase the current line */
  17. #define EC 247 /* erase the current character */
  18. #define AYT 246 /* are you there */
  19. #define AO 245 /* abort output--but let prog finish */
  20. #define IP 244 /* interrupt process--permanently */
  21. #define BREAK 243 /* break */
  22. #define DM 242 /* data mark--for connect. cleaning */
  23. #define NOP 241 /* nop */
  24. #define EOR 239 /* end of record (transparent mode) */
  25. #define ABORT 238 /* Abort process */
  26. #define SUSP 237 /* Suspend process */
  27. #define xEOF 236 /* End of file: EOF is already used... */
  28. #define TELOPTS(X) \
  29. X(BINARY, 0) /* 8-bit data path */ \
  30. X(ECHO, 1) /* echo */ \
  31. X(RCP, 2) /* prepare to reconnect */ \
  32. X(SGA, 3) /* suppress go ahead */ \
  33. X(NAMS, 4) /* approximate message size */ \
  34. X(STATUS, 5) /* give status */ \
  35. X(TM, 6) /* timing mark */ \
  36. X(RCTE, 7) /* remote controlled transmission and echo */ \
  37. X(NAOL, 8) /* negotiate about output line width */ \
  38. X(NAOP, 9) /* negotiate about output page size */ \
  39. X(NAOCRD, 10) /* negotiate about CR disposition */ \
  40. X(NAOHTS, 11) /* negotiate about horizontal tabstops */ \
  41. X(NAOHTD, 12) /* negotiate about horizontal tab disposition */ \
  42. X(NAOFFD, 13) /* negotiate about formfeed disposition */ \
  43. X(NAOVTS, 14) /* negotiate about vertical tab stops */ \
  44. X(NAOVTD, 15) /* negotiate about vertical tab disposition */ \
  45. X(NAOLFD, 16) /* negotiate about output LF disposition */ \
  46. X(XASCII, 17) /* extended ascic character set */ \
  47. X(LOGOUT, 18) /* force logout */ \
  48. X(BM, 19) /* byte macro */ \
  49. X(DET, 20) /* data entry terminal */ \
  50. X(SUPDUP, 21) /* supdup protocol */ \
  51. X(SUPDUPOUTPUT, 22) /* supdup output */ \
  52. X(SNDLOC, 23) /* send location */ \
  53. X(TTYPE, 24) /* terminal type */ \
  54. X(EOR, 25) /* end or record */ \
  55. X(TUID, 26) /* TACACS user identification */ \
  56. X(OUTMRK, 27) /* output marking */ \
  57. X(TTYLOC, 28) /* terminal location number */ \
  58. X(3270REGIME, 29) /* 3270 regime */ \
  59. X(X3PAD, 30) /* X.3 PAD */ \
  60. X(NAWS, 31) /* window size */ \
  61. X(TSPEED, 32) /* terminal speed */ \
  62. X(LFLOW, 33) /* remote flow control */ \
  63. X(LINEMODE, 34) /* Linemode option */ \
  64. X(XDISPLOC, 35) /* X Display Location */ \
  65. X(OLD_ENVIRON, 36) /* Old - Environment variables */ \
  66. X(AUTHENTICATION, 37) /* Authenticate */ \
  67. X(ENCRYPT, 38) /* Encryption option */ \
  68. X(NEW_ENVIRON, 39) /* New - Environment variables */ \
  69. X(TN3270E, 40) /* TN3270 enhancements */ \
  70. X(XAUTH, 41) \
  71. X(CHARSET, 42) /* Character set */ \
  72. X(RSP, 43) /* Remote serial port */ \
  73. X(COM_PORT_OPTION, 44) /* Com port control */ \
  74. X(SLE, 45) /* Suppress local echo */ \
  75. X(STARTTLS, 46) /* Start TLS */ \
  76. X(KERMIT, 47) /* Automatic Kermit file transfer */ \
  77. X(SEND_URL, 48) \
  78. X(FORWARD_X, 49) \
  79. X(PRAGMA_LOGON, 138) \
  80. X(SSPI_LOGON, 139) \
  81. X(PRAGMA_HEARTBEAT, 140) \
  82. X(EXOPL, 255) /* extended-options-list */
  83. #define telnet_enum(x,y) TELOPT_##x = y,
  84. enum { TELOPTS(telnet_enum) dummy=0 };
  85. #undef telnet_enum
  86. #define TELQUAL_IS 0 /* option is... */
  87. #define TELQUAL_SEND 1 /* send option */
  88. #define TELQUAL_INFO 2 /* ENVIRON: informational version of IS */
  89. #define BSD_VAR 1
  90. #define BSD_VALUE 0
  91. #define RFC_VAR 0
  92. #define RFC_VALUE 1
  93. #define CR 13
  94. #define LF 10
  95. #define NUL 0
  96. #define iswritable(x) \
  97. ( (x) != IAC && \
  98. (telnet->opt_states[o_we_bin.index] == ACTIVE || (x) != CR))
  99. static const char *telopt(int opt)
  100. {
  101. #define telnet_str(x,y) case TELOPT_##x: return #x;
  102. switch (opt) {
  103. TELOPTS(telnet_str)
  104. default:
  105. return "<unknown>";
  106. }
  107. #undef telnet_str
  108. }
  109. struct Opt {
  110. int send; /* what we initially send */
  111. int nsend; /* -ve send if requested to stop it */
  112. int ack, nak; /* +ve and -ve acknowledgements */
  113. int option; /* the option code */
  114. int index; /* index into telnet->opt_states[] */
  115. enum {
  116. REQUESTED, ACTIVE, INACTIVE, REALLY_INACTIVE
  117. } initial_state;
  118. };
  119. enum {
  120. OPTINDEX_NAWS,
  121. OPTINDEX_TSPEED,
  122. OPTINDEX_TTYPE,
  123. OPTINDEX_OENV,
  124. OPTINDEX_NENV,
  125. OPTINDEX_ECHO,
  126. OPTINDEX_WE_SGA,
  127. OPTINDEX_THEY_SGA,
  128. OPTINDEX_WE_BIN,
  129. OPTINDEX_THEY_BIN,
  130. NUM_OPTS
  131. };
  132. static const struct Opt o_naws =
  133. { WILL, WONT, DO, DONT, TELOPT_NAWS, OPTINDEX_NAWS, REQUESTED };
  134. static const struct Opt o_tspeed =
  135. { WILL, WONT, DO, DONT, TELOPT_TSPEED, OPTINDEX_TSPEED, REQUESTED };
  136. static const struct Opt o_ttype =
  137. { WILL, WONT, DO, DONT, TELOPT_TTYPE, OPTINDEX_TTYPE, REQUESTED };
  138. static const struct Opt o_oenv =
  139. { WILL, WONT, DO, DONT, TELOPT_OLD_ENVIRON, OPTINDEX_OENV, INACTIVE };
  140. static const struct Opt o_nenv =
  141. { WILL, WONT, DO, DONT, TELOPT_NEW_ENVIRON, OPTINDEX_NENV, REQUESTED };
  142. static const struct Opt o_echo =
  143. { DO, DONT, WILL, WONT, TELOPT_ECHO, OPTINDEX_ECHO, REQUESTED };
  144. static const struct Opt o_we_sga =
  145. { WILL, WONT, DO, DONT, TELOPT_SGA, OPTINDEX_WE_SGA, REQUESTED };
  146. static const struct Opt o_they_sga =
  147. { DO, DONT, WILL, WONT, TELOPT_SGA, OPTINDEX_THEY_SGA, REQUESTED };
  148. static const struct Opt o_we_bin =
  149. { WILL, WONT, DO, DONT, TELOPT_BINARY, OPTINDEX_WE_BIN, INACTIVE };
  150. static const struct Opt o_they_bin =
  151. { DO, DONT, WILL, WONT, TELOPT_BINARY, OPTINDEX_THEY_BIN, INACTIVE };
  152. static const struct Opt *const opts[] = {
  153. &o_naws, &o_tspeed, &o_ttype, &o_oenv, &o_nenv, &o_echo,
  154. &o_we_sga, &o_they_sga, &o_we_bin, &o_they_bin, NULL
  155. };
  156. typedef struct Telnet Telnet;
  157. struct Telnet {
  158. Socket *s;
  159. bool closed_on_socket_error;
  160. Seat *seat;
  161. LogContext *logctx;
  162. Ldisc *ldisc;
  163. int term_width, term_height;
  164. int opt_states[NUM_OPTS];
  165. bool echoing, editing;
  166. bool activated;
  167. size_t bufsize;
  168. bool in_synch;
  169. int sb_opt;
  170. strbuf *sb_buf;
  171. bool session_started;
  172. enum {
  173. TOP_LEVEL, SEENIAC, SEENWILL, SEENWONT, SEENDO, SEENDONT,
  174. SEENSB, SUBNEGOT, SUBNEG_IAC, SEENCR
  175. } state;
  176. Conf *conf;
  177. Pinger *pinger;
  178. Plug plug;
  179. Backend backend;
  180. };
  181. #define TELNET_MAX_BACKLOG 4096
  182. #define SB_DELTA 1024
  183. static void c_write(Telnet *telnet, const void *buf, size_t len)
  184. {
  185. size_t backlog = seat_stdout(telnet->seat, buf, len);
  186. sk_set_frozen(telnet->s, backlog > TELNET_MAX_BACKLOG);
  187. }
  188. static void log_option(Telnet *telnet, const char *sender, int cmd, int option)
  189. {
  190. /*
  191. * The strange-looking "<?""?>" below is there to avoid a
  192. * trigraph - a double question mark followed by > maps to a
  193. * closing brace character!
  194. */
  195. logeventf(telnet->logctx, "%s:\t%s %s", sender,
  196. (cmd == WILL ? "WILL" : cmd == WONT ? "WONT" :
  197. cmd == DO ? "DO" : cmd == DONT ? "DONT" : "<?""?>"),
  198. telopt(option));
  199. }
  200. static void send_opt(Telnet *telnet, int cmd, int option)
  201. {
  202. unsigned char b[3];
  203. b[0] = IAC;
  204. b[1] = cmd;
  205. b[2] = option;
  206. telnet->bufsize = sk_write(telnet->s, b, 3);
  207. log_option(telnet, "client", cmd, option);
  208. }
  209. static void deactivate_option(Telnet *telnet, const struct Opt *o)
  210. {
  211. if (telnet->opt_states[o->index] == REQUESTED ||
  212. telnet->opt_states[o->index] == ACTIVE)
  213. send_opt(telnet, o->nsend, o->option);
  214. telnet->opt_states[o->index] = REALLY_INACTIVE;
  215. }
  216. /*
  217. * Generate side effects of enabling or disabling an option.
  218. */
  219. static void option_side_effects(
  220. Telnet *telnet, const struct Opt *o, bool enabled)
  221. {
  222. if (o->option == TELOPT_ECHO && o->send == DO)
  223. telnet->echoing = !enabled;
  224. else if (o->option == TELOPT_SGA && o->send == DO)
  225. telnet->editing = !enabled;
  226. if (telnet->ldisc) /* cause ldisc to notice the change */
  227. ldisc_echoedit_update(telnet->ldisc);
  228. /* Ensure we get the minimum options */
  229. if (!telnet->activated) {
  230. if (telnet->opt_states[o_echo.index] == INACTIVE) {
  231. telnet->opt_states[o_echo.index] = REQUESTED;
  232. send_opt(telnet, o_echo.send, o_echo.option);
  233. }
  234. if (telnet->opt_states[o_we_sga.index] == INACTIVE) {
  235. telnet->opt_states[o_we_sga.index] = REQUESTED;
  236. send_opt(telnet, o_we_sga.send, o_we_sga.option);
  237. }
  238. if (telnet->opt_states[o_they_sga.index] == INACTIVE) {
  239. telnet->opt_states[o_they_sga.index] = REQUESTED;
  240. send_opt(telnet, o_they_sga.send, o_they_sga.option);
  241. }
  242. telnet->activated = true;
  243. }
  244. }
  245. static void activate_option(Telnet *telnet, const struct Opt *o)
  246. {
  247. if (o->send == WILL && o->option == TELOPT_NAWS)
  248. backend_size(&telnet->backend,
  249. telnet->term_width, telnet->term_height);
  250. if (o->send == WILL &&
  251. (o->option == TELOPT_NEW_ENVIRON ||
  252. o->option == TELOPT_OLD_ENVIRON)) {
  253. /*
  254. * We may only have one kind of ENVIRON going at a time.
  255. * This is a hack, but who cares.
  256. */
  257. deactivate_option(telnet, o->option ==
  258. TELOPT_NEW_ENVIRON ? &o_oenv : &o_nenv);
  259. }
  260. option_side_effects(telnet, o, true);
  261. }
  262. static void refused_option(Telnet *telnet, const struct Opt *o)
  263. {
  264. if (o->send == WILL && o->option == TELOPT_NEW_ENVIRON &&
  265. telnet->opt_states[o_oenv.index] == INACTIVE) {
  266. send_opt(telnet, WILL, TELOPT_OLD_ENVIRON);
  267. telnet->opt_states[o_oenv.index] = REQUESTED;
  268. }
  269. option_side_effects(telnet, o, false);
  270. }
  271. static void proc_rec_opt(Telnet *telnet, int cmd, int option)
  272. {
  273. const struct Opt *const *o;
  274. log_option(telnet, "server", cmd, option);
  275. for (o = opts; *o; o++) {
  276. if ((*o)->option == option && (*o)->ack == cmd) {
  277. switch (telnet->opt_states[(*o)->index]) {
  278. case REQUESTED:
  279. telnet->opt_states[(*o)->index] = ACTIVE;
  280. activate_option(telnet, *o);
  281. break;
  282. case ACTIVE:
  283. break;
  284. case INACTIVE:
  285. telnet->opt_states[(*o)->index] = ACTIVE;
  286. send_opt(telnet, (*o)->send, option);
  287. activate_option(telnet, *o);
  288. break;
  289. case REALLY_INACTIVE:
  290. send_opt(telnet, (*o)->nsend, option);
  291. break;
  292. }
  293. return;
  294. } else if ((*o)->option == option && (*o)->nak == cmd) {
  295. switch (telnet->opt_states[(*o)->index]) {
  296. case REQUESTED:
  297. telnet->opt_states[(*o)->index] = INACTIVE;
  298. refused_option(telnet, *o);
  299. break;
  300. case ACTIVE:
  301. telnet->opt_states[(*o)->index] = INACTIVE;
  302. send_opt(telnet, (*o)->nsend, option);
  303. option_side_effects(telnet, *o, false);
  304. break;
  305. case INACTIVE:
  306. case REALLY_INACTIVE:
  307. break;
  308. }
  309. return;
  310. }
  311. }
  312. /*
  313. * If we reach here, the option was one we weren't prepared to
  314. * cope with. If the request was positive (WILL or DO), we send
  315. * a negative ack to indicate refusal. If the request was
  316. * negative (WONT / DONT), we must do nothing.
  317. */
  318. if (cmd == WILL || cmd == DO)
  319. send_opt(telnet, (cmd == WILL ? DONT : WONT), option);
  320. }
  321. static void process_subneg(Telnet *telnet)
  322. {
  323. unsigned char *b, *p, *q;
  324. int var, value, n, bsize;
  325. char *e, *eval, *ekey, *user;
  326. switch (telnet->sb_opt) {
  327. case TELOPT_TSPEED:
  328. if (telnet->sb_buf->len == 1 && telnet->sb_buf->u[0] == TELQUAL_SEND) {
  329. char *termspeed = conf_get_str(telnet->conf, CONF_termspeed);
  330. b = snewn(20 + strlen(termspeed), unsigned char);
  331. b[0] = IAC;
  332. b[1] = SB;
  333. b[2] = TELOPT_TSPEED;
  334. b[3] = TELQUAL_IS;
  335. strcpy((char *)(b + 4), termspeed);
  336. n = 4 + strlen(termspeed);
  337. b[n] = IAC;
  338. b[n + 1] = SE;
  339. telnet->bufsize = sk_write(telnet->s, b, n + 2);
  340. logevent(telnet->logctx, "server:\tSB TSPEED SEND");
  341. logeventf(telnet->logctx, "client:\tSB TSPEED IS %s", termspeed);
  342. sfree(b);
  343. } else
  344. logevent(telnet->logctx, "server:\tSB TSPEED <something weird>");
  345. break;
  346. case TELOPT_TTYPE:
  347. if (telnet->sb_buf->len == 1 && telnet->sb_buf->u[0] == TELQUAL_SEND) {
  348. char *termtype = conf_get_str(telnet->conf, CONF_termtype);
  349. b = snewn(20 + strlen(termtype), unsigned char);
  350. b[0] = IAC;
  351. b[1] = SB;
  352. b[2] = TELOPT_TTYPE;
  353. b[3] = TELQUAL_IS;
  354. for (n = 0; termtype[n]; n++)
  355. b[n + 4] = (termtype[n] >= 'a' && termtype[n] <= 'z' ?
  356. termtype[n] + 'A' - 'a' :
  357. termtype[n]);
  358. b[n + 4] = IAC;
  359. b[n + 5] = SE;
  360. telnet->bufsize = sk_write(telnet->s, b, n + 6);
  361. b[n + 4] = 0;
  362. logevent(telnet->logctx, "server:\tSB TTYPE SEND");
  363. logeventf(telnet->logctx, "client:\tSB TTYPE IS %s", b + 4);
  364. sfree(b);
  365. } else
  366. logevent(telnet->logctx, "server:\tSB TTYPE <something weird>\r\n");
  367. break;
  368. case TELOPT_OLD_ENVIRON:
  369. case TELOPT_NEW_ENVIRON:
  370. p = telnet->sb_buf->u;
  371. q = p + telnet->sb_buf->len;
  372. if (p < q && *p == TELQUAL_SEND) {
  373. p++;
  374. logeventf(telnet->logctx, "server:\tSB %s SEND",
  375. telopt(telnet->sb_opt));
  376. if (telnet->sb_opt == TELOPT_OLD_ENVIRON) {
  377. if (conf_get_bool(telnet->conf, CONF_rfc_environ)) {
  378. value = RFC_VALUE;
  379. var = RFC_VAR;
  380. } else {
  381. value = BSD_VALUE;
  382. var = BSD_VAR;
  383. }
  384. /*
  385. * Try to guess the sense of VAR and VALUE.
  386. */
  387. while (p < q) {
  388. if (*p == RFC_VAR) {
  389. value = RFC_VALUE;
  390. var = RFC_VAR;
  391. } else if (*p == BSD_VAR) {
  392. value = BSD_VALUE;
  393. var = BSD_VAR;
  394. }
  395. p++;
  396. }
  397. } else {
  398. /*
  399. * With NEW_ENVIRON, the sense of VAR and VALUE
  400. * isn't in doubt.
  401. */
  402. value = RFC_VALUE;
  403. var = RFC_VAR;
  404. }
  405. bsize = 20;
  406. for (eval = conf_get_str_strs(telnet->conf, CONF_environmt,
  407. NULL, &ekey);
  408. eval != NULL;
  409. eval = conf_get_str_strs(telnet->conf, CONF_environmt,
  410. ekey, &ekey))
  411. bsize += strlen(ekey) + strlen(eval) + 2;
  412. user = get_remote_username(telnet->conf);
  413. if (user)
  414. bsize += 6 + strlen(user);
  415. b = snewn(bsize, unsigned char);
  416. b[0] = IAC;
  417. b[1] = SB;
  418. b[2] = telnet->sb_opt;
  419. b[3] = TELQUAL_IS;
  420. n = 4;
  421. for (eval = conf_get_str_strs(telnet->conf, CONF_environmt,
  422. NULL, &ekey);
  423. eval != NULL;
  424. eval = conf_get_str_strs(telnet->conf, CONF_environmt,
  425. ekey, &ekey)) {
  426. b[n++] = var;
  427. for (e = ekey; *e; e++)
  428. b[n++] = *e;
  429. b[n++] = value;
  430. for (e = eval; *e; e++)
  431. b[n++] = *e;
  432. }
  433. if (user) {
  434. b[n++] = var;
  435. b[n++] = 'U';
  436. b[n++] = 'S';
  437. b[n++] = 'E';
  438. b[n++] = 'R';
  439. b[n++] = value;
  440. for (e = user; *e; e++)
  441. b[n++] = *e;
  442. }
  443. b[n++] = IAC;
  444. b[n++] = SE;
  445. telnet->bufsize = sk_write(telnet->s, b, n);
  446. if (n == 6) {
  447. logeventf(telnet->logctx, "client:\tSB %s IS <nothing>",
  448. telopt(telnet->sb_opt));
  449. } else {
  450. logeventf(telnet->logctx, "client:\tSB %s IS:",
  451. telopt(telnet->sb_opt));
  452. for (eval = conf_get_str_strs(telnet->conf, CONF_environmt,
  453. NULL, &ekey);
  454. eval != NULL;
  455. eval = conf_get_str_strs(telnet->conf, CONF_environmt,
  456. ekey, &ekey)) {
  457. logeventf(telnet->logctx, "\t%s=%s", ekey, eval);
  458. }
  459. if (user)
  460. logeventf(telnet->logctx, "\tUSER=%s", user);
  461. }
  462. sfree(b);
  463. sfree(user);
  464. }
  465. break;
  466. }
  467. }
  468. static void do_telnet_read(Telnet *telnet, const char *buf, size_t len)
  469. {
  470. strbuf *outbuf = strbuf_new_nm();
  471. while (len--) {
  472. int c = (unsigned char) *buf++;
  473. switch (telnet->state) {
  474. case TOP_LEVEL:
  475. case SEENCR:
  476. if (c == NUL && telnet->state == SEENCR)
  477. telnet->state = TOP_LEVEL;
  478. else if (c == IAC)
  479. telnet->state = SEENIAC;
  480. else {
  481. if (!telnet->in_synch)
  482. put_byte(outbuf, c);
  483. #if 1
  484. /* I can't get the F***ing winsock to insert the urgent IAC
  485. * into the right position! Even with SO_OOBINLINE it gives
  486. * it to recv too soon. And of course the DM byte (that
  487. * arrives in the same packet!) appears several K later!!
  488. *
  489. * Oh well, we do get the DM in the right place so I'll
  490. * just stop hiding on the next 0xf2 and hope for the best.
  491. */
  492. else if (c == DM)
  493. telnet->in_synch = false;
  494. #endif
  495. if (c == CR && telnet->opt_states[o_they_bin.index] != ACTIVE)
  496. telnet->state = SEENCR;
  497. else
  498. telnet->state = TOP_LEVEL;
  499. }
  500. break;
  501. case SEENIAC:
  502. if (c == DO)
  503. telnet->state = SEENDO;
  504. else if (c == DONT)
  505. telnet->state = SEENDONT;
  506. else if (c == WILL)
  507. telnet->state = SEENWILL;
  508. else if (c == WONT)
  509. telnet->state = SEENWONT;
  510. else if (c == SB)
  511. telnet->state = SEENSB;
  512. else if (c == DM) {
  513. telnet->in_synch = false;
  514. telnet->state = TOP_LEVEL;
  515. } else {
  516. /* ignore everything else; print it if it's IAC */
  517. if (c == IAC) {
  518. put_byte(outbuf, c);
  519. }
  520. telnet->state = TOP_LEVEL;
  521. }
  522. break;
  523. case SEENWILL:
  524. proc_rec_opt(telnet, WILL, c);
  525. telnet->state = TOP_LEVEL;
  526. break;
  527. case SEENWONT:
  528. proc_rec_opt(telnet, WONT, c);
  529. telnet->state = TOP_LEVEL;
  530. break;
  531. case SEENDO:
  532. proc_rec_opt(telnet, DO, c);
  533. telnet->state = TOP_LEVEL;
  534. break;
  535. case SEENDONT:
  536. proc_rec_opt(telnet, DONT, c);
  537. telnet->state = TOP_LEVEL;
  538. break;
  539. case SEENSB:
  540. telnet->sb_opt = c;
  541. strbuf_clear(telnet->sb_buf);
  542. telnet->state = SUBNEGOT;
  543. break;
  544. case SUBNEGOT:
  545. if (c == IAC)
  546. telnet->state = SUBNEG_IAC;
  547. else {
  548. subneg_addchar:
  549. put_byte(telnet->sb_buf, c);
  550. telnet->state = SUBNEGOT; /* in case we came here by goto */
  551. }
  552. break;
  553. case SUBNEG_IAC:
  554. if (c != SE)
  555. goto subneg_addchar; /* yes, it's a hack, I know, but... */
  556. else {
  557. process_subneg(telnet);
  558. telnet->state = TOP_LEVEL;
  559. }
  560. break;
  561. }
  562. if (outbuf->len >= 4096) {
  563. c_write(telnet, outbuf->u, outbuf->len);
  564. strbuf_clear(outbuf);
  565. }
  566. }
  567. if (outbuf->len)
  568. c_write(telnet, outbuf->u, outbuf->len);
  569. strbuf_free(outbuf);
  570. }
  571. static void telnet_log(Plug *plug, PlugLogType type, SockAddr *addr, int port,
  572. const char *error_msg, int error_code)
  573. {
  574. Telnet *telnet = container_of(plug, Telnet, plug);
  575. backend_socket_log(telnet->seat, telnet->logctx, type, addr, port,
  576. error_msg, error_code, telnet->conf,
  577. telnet->session_started);
  578. }
  579. static void telnet_closing(Plug *plug, const char *error_msg, int error_code,
  580. bool calling_back)
  581. {
  582. Telnet *telnet = container_of(plug, Telnet, plug);
  583. /*
  584. * We don't implement independent EOF in each direction for Telnet
  585. * connections; as soon as we get word that the remote side has
  586. * sent us EOF, we wind up the whole connection.
  587. */
  588. if (telnet->s) {
  589. sk_close(telnet->s);
  590. telnet->s = NULL;
  591. if (error_msg)
  592. telnet->closed_on_socket_error = true;
  593. seat_notify_remote_exit(telnet->seat);
  594. }
  595. if (error_msg) {
  596. logevent(telnet->logctx, error_msg);
  597. seat_connection_fatal(telnet->seat, "%s", error_msg);
  598. }
  599. /* Otherwise, the remote side closed the connection normally. */
  600. }
  601. static void telnet_receive(
  602. Plug *plug, int urgent, const char *data, size_t len)
  603. {
  604. Telnet *telnet = container_of(plug, Telnet, plug);
  605. if (urgent)
  606. telnet->in_synch = true;
  607. telnet->session_started = true;
  608. do_telnet_read(telnet, data, len);
  609. }
  610. static void telnet_sent(Plug *plug, size_t bufsize)
  611. {
  612. Telnet *telnet = container_of(plug, Telnet, plug);
  613. telnet->bufsize = bufsize;
  614. }
  615. static const PlugVtable Telnet_plugvt = {
  616. .log = telnet_log,
  617. .closing = telnet_closing,
  618. .receive = telnet_receive,
  619. .sent = telnet_sent,
  620. };
  621. /*
  622. * Called to set up the Telnet connection.
  623. *
  624. * Returns an error message, or NULL on success.
  625. *
  626. * Also places the canonical host name into `realhost'. It must be
  627. * freed by the caller.
  628. */
  629. static char *telnet_init(const BackendVtable *vt, Seat *seat,
  630. Backend **backend_handle, LogContext *logctx,
  631. Conf *conf, const char *host, int port,
  632. char **realhost, bool nodelay, bool keepalive)
  633. {
  634. SockAddr *addr;
  635. const char *err;
  636. Telnet *telnet;
  637. char *loghost;
  638. int addressfamily;
  639. /* No local authentication phase in this protocol */
  640. seat_set_trust_status(seat, false);
  641. telnet = snew(Telnet);
  642. telnet->plug.vt = &Telnet_plugvt;
  643. telnet->backend.vt = vt;
  644. telnet->conf = conf_copy(conf);
  645. telnet->s = NULL;
  646. telnet->closed_on_socket_error = false;
  647. telnet->echoing = true;
  648. telnet->editing = true;
  649. telnet->activated = false;
  650. telnet->sb_buf = strbuf_new();
  651. telnet->seat = seat;
  652. telnet->logctx = logctx;
  653. telnet->term_width = conf_get_int(telnet->conf, CONF_width);
  654. telnet->term_height = conf_get_int(telnet->conf, CONF_height);
  655. telnet->state = TOP_LEVEL;
  656. telnet->ldisc = NULL;
  657. telnet->pinger = NULL;
  658. telnet->session_started = true;
  659. *backend_handle = &telnet->backend;
  660. /*
  661. * Try to find host.
  662. */
  663. addressfamily = conf_get_int(telnet->conf, CONF_addressfamily);
  664. addr = name_lookup(host, port, realhost, telnet->conf, addressfamily,
  665. telnet->logctx, "Telnet connection");
  666. if ((err = sk_addr_error(addr)) != NULL) {
  667. sk_addr_free(addr);
  668. return dupstr(err);
  669. }
  670. if (port < 0)
  671. port = 23; /* default telnet port */
  672. /*
  673. * Open socket.
  674. */
  675. telnet->s = new_connection(addr, *realhost, port, false, true, nodelay,
  676. keepalive, &telnet->plug, telnet->conf);
  677. if ((err = sk_socket_error(telnet->s)) != NULL)
  678. return dupstr(err);
  679. telnet->pinger = pinger_new(telnet->conf, &telnet->backend);
  680. /*
  681. * Initialise option states.
  682. */
  683. if (conf_get_bool(telnet->conf, CONF_passive_telnet)) {
  684. const struct Opt *const *o;
  685. for (o = opts; *o; o++)
  686. telnet->opt_states[(*o)->index] = INACTIVE;
  687. } else {
  688. const struct Opt *const *o;
  689. for (o = opts; *o; o++) {
  690. telnet->opt_states[(*o)->index] = (*o)->initial_state;
  691. if (telnet->opt_states[(*o)->index] == REQUESTED)
  692. send_opt(telnet, (*o)->send, (*o)->option);
  693. }
  694. telnet->activated = true;
  695. }
  696. /*
  697. * Set up SYNCH state.
  698. */
  699. telnet->in_synch = false;
  700. /*
  701. * We can send special commands from the start.
  702. */
  703. seat_update_specials_menu(telnet->seat);
  704. /*
  705. * loghost overrides realhost, if specified.
  706. */
  707. loghost = conf_get_str(telnet->conf, CONF_loghost);
  708. if (*loghost) {
  709. char *colon;
  710. sfree(*realhost);
  711. *realhost = dupstr(loghost);
  712. colon = host_strrchr(*realhost, ':');
  713. if (colon)
  714. *colon++ = '\0';
  715. }
  716. return NULL;
  717. }
  718. static void telnet_free(Backend *be)
  719. {
  720. Telnet *telnet = container_of(be, Telnet, backend);
  721. strbuf_free(telnet->sb_buf);
  722. if (telnet->s)
  723. sk_close(telnet->s);
  724. if (telnet->pinger)
  725. pinger_free(telnet->pinger);
  726. conf_free(telnet->conf);
  727. sfree(telnet);
  728. }
  729. /*
  730. * Reconfigure the Telnet backend. There's no immediate action
  731. * necessary, in this backend: we just save the fresh config for
  732. * any subsequent negotiations.
  733. */
  734. static void telnet_reconfig(Backend *be, Conf *conf)
  735. {
  736. Telnet *telnet = container_of(be, Telnet, backend);
  737. pinger_reconfig(telnet->pinger, telnet->conf, conf);
  738. conf_free(telnet->conf);
  739. telnet->conf = conf_copy(conf);
  740. }
  741. /*
  742. * Called to send data down the Telnet connection.
  743. */
  744. static size_t telnet_send(Backend *be, const char *buf, size_t len)
  745. {
  746. Telnet *telnet = container_of(be, Telnet, backend);
  747. unsigned char *p, *end;
  748. static const unsigned char iac[2] = { IAC, IAC };
  749. static const unsigned char cr[2] = { CR, NUL };
  750. #if 0
  751. static const unsigned char nl[2] = { CR, LF };
  752. #endif
  753. if (telnet->s == NULL)
  754. return 0;
  755. p = (unsigned char *)buf;
  756. end = (unsigned char *)(buf + len);
  757. while (p < end) {
  758. unsigned char *q = p;
  759. while (p < end && iswritable(*p))
  760. p++;
  761. telnet->bufsize = sk_write(telnet->s, q, p - q);
  762. while (p < end && !iswritable(*p)) {
  763. telnet->bufsize =
  764. sk_write(telnet->s, *p == IAC ? iac : cr, 2);
  765. p++;
  766. }
  767. }
  768. return telnet->bufsize;
  769. }
  770. /*
  771. * Called to query the current socket sendability status.
  772. */
  773. static size_t telnet_sendbuffer(Backend *be)
  774. {
  775. Telnet *telnet = container_of(be, Telnet, backend);
  776. return telnet->bufsize;
  777. }
  778. /*
  779. * Called to set the size of the window from Telnet's POV.
  780. */
  781. static void telnet_size(Backend *be, int width, int height)
  782. {
  783. Telnet *telnet = container_of(be, Telnet, backend);
  784. unsigned char b[24];
  785. int n;
  786. telnet->term_width = width;
  787. telnet->term_height = height;
  788. if (telnet->s == NULL || telnet->opt_states[o_naws.index] != ACTIVE)
  789. return;
  790. n = 0;
  791. b[n++] = IAC;
  792. b[n++] = SB;
  793. b[n++] = TELOPT_NAWS;
  794. b[n++] = telnet->term_width >> 8;
  795. if (b[n-1] == IAC) b[n++] = IAC; /* duplicate any IAC byte occurs */
  796. b[n++] = telnet->term_width & 0xFF;
  797. if (b[n-1] == IAC) b[n++] = IAC; /* duplicate any IAC byte occurs */
  798. b[n++] = telnet->term_height >> 8;
  799. if (b[n-1] == IAC) b[n++] = IAC; /* duplicate any IAC byte occurs */
  800. b[n++] = telnet->term_height & 0xFF;
  801. if (b[n-1] == IAC) b[n++] = IAC; /* duplicate any IAC byte occurs */
  802. b[n++] = IAC;
  803. b[n++] = SE;
  804. telnet->bufsize = sk_write(telnet->s, b, n);
  805. logeventf(telnet->logctx, "client:\tSB NAWS %d,%d",
  806. telnet->term_width, telnet->term_height);
  807. }
  808. /*
  809. * Send Telnet special codes.
  810. */
  811. static void telnet_special(Backend *be, SessionSpecialCode code, int arg)
  812. {
  813. Telnet *telnet = container_of(be, Telnet, backend);
  814. unsigned char b[2];
  815. if (telnet->s == NULL)
  816. return;
  817. b[0] = IAC;
  818. switch (code) {
  819. case SS_AYT:
  820. b[1] = AYT;
  821. telnet->bufsize = sk_write(telnet->s, b, 2);
  822. break;
  823. case SS_BRK:
  824. b[1] = BREAK;
  825. telnet->bufsize = sk_write(telnet->s, b, 2);
  826. break;
  827. case SS_EC:
  828. b[1] = EC;
  829. telnet->bufsize = sk_write(telnet->s, b, 2);
  830. break;
  831. case SS_EL:
  832. b[1] = EL;
  833. telnet->bufsize = sk_write(telnet->s, b, 2);
  834. break;
  835. case SS_GA:
  836. b[1] = GA;
  837. telnet->bufsize = sk_write(telnet->s, b, 2);
  838. break;
  839. case SS_NOP:
  840. b[1] = NOP;
  841. telnet->bufsize = sk_write(telnet->s, b, 2);
  842. break;
  843. case SS_ABORT:
  844. b[1] = ABORT;
  845. telnet->bufsize = sk_write(telnet->s, b, 2);
  846. break;
  847. case SS_AO:
  848. b[1] = AO;
  849. telnet->bufsize = sk_write(telnet->s, b, 2);
  850. break;
  851. case SS_IP:
  852. b[1] = IP;
  853. telnet->bufsize = sk_write(telnet->s, b, 2);
  854. break;
  855. case SS_SUSP:
  856. b[1] = SUSP;
  857. telnet->bufsize = sk_write(telnet->s, b, 2);
  858. break;
  859. case SS_EOR:
  860. b[1] = EOR;
  861. telnet->bufsize = sk_write(telnet->s, b, 2);
  862. break;
  863. case SS_EOF:
  864. b[1] = xEOF;
  865. telnet->bufsize = sk_write(telnet->s, b, 2);
  866. break;
  867. case SS_EOL:
  868. /* In BINARY mode, CR-LF becomes just CR -
  869. * and without the NUL suffix too. */
  870. if (telnet->opt_states[o_we_bin.index] == ACTIVE)
  871. telnet->bufsize = sk_write(telnet->s, "\r", 1);
  872. else
  873. telnet->bufsize = sk_write(telnet->s, "\r\n", 2);
  874. break;
  875. case SS_SYNCH:
  876. b[1] = DM;
  877. telnet->bufsize = sk_write(telnet->s, b, 1);
  878. telnet->bufsize = sk_write_oob(telnet->s, b + 1, 1);
  879. break;
  880. case SS_PING:
  881. if (telnet->opt_states[o_they_sga.index] == ACTIVE) {
  882. b[1] = NOP;
  883. telnet->bufsize = sk_write(telnet->s, b, 2);
  884. }
  885. break;
  886. default:
  887. break; /* never heard of it */
  888. }
  889. }
  890. static const SessionSpecial *telnet_get_specials(Backend *be)
  891. {
  892. static const SessionSpecial specials[] = {
  893. {"Are You There", SS_AYT},
  894. {"Break", SS_BRK},
  895. {"Synch", SS_SYNCH},
  896. {"Erase Character", SS_EC},
  897. {"Erase Line", SS_EL},
  898. {"Go Ahead", SS_GA},
  899. {"No Operation", SS_NOP},
  900. {NULL, SS_SEP},
  901. {"Abort Process", SS_ABORT},
  902. {"Abort Output", SS_AO},
  903. {"Interrupt Process", SS_IP},
  904. {"Suspend Process", SS_SUSP},
  905. {NULL, SS_SEP},
  906. {"End Of Record", SS_EOR},
  907. {"End Of File", SS_EOF},
  908. {NULL, SS_EXITMENU}
  909. };
  910. return specials;
  911. }
  912. static bool telnet_connected(Backend *be)
  913. {
  914. Telnet *telnet = container_of(be, Telnet, backend);
  915. return telnet->s != NULL;
  916. }
  917. static bool telnet_sendok(Backend *be)
  918. {
  919. /* Telnet *telnet = container_of(be, Telnet, backend); */
  920. return true;
  921. }
  922. static void telnet_unthrottle(Backend *be, size_t backlog)
  923. {
  924. Telnet *telnet = container_of(be, Telnet, backend);
  925. sk_set_frozen(telnet->s, backlog > TELNET_MAX_BACKLOG);
  926. }
  927. static bool telnet_ldisc(Backend *be, int option)
  928. {
  929. Telnet *telnet = container_of(be, Telnet, backend);
  930. if (option == LD_ECHO)
  931. return telnet->echoing;
  932. if (option == LD_EDIT)
  933. return telnet->editing;
  934. return false;
  935. }
  936. static void telnet_provide_ldisc(Backend *be, Ldisc *ldisc)
  937. {
  938. Telnet *telnet = container_of(be, Telnet, backend);
  939. telnet->ldisc = ldisc;
  940. }
  941. static int telnet_exitcode(Backend *be)
  942. {
  943. Telnet *telnet = container_of(be, Telnet, backend);
  944. if (telnet->s != NULL)
  945. return -1; /* still connected */
  946. else if (telnet->closed_on_socket_error)
  947. return INT_MAX; /* a socket error counts as an unclean exit */
  948. else
  949. /* Telnet doesn't transmit exit codes back to the client */
  950. return 0;
  951. }
  952. /*
  953. * cfg_info for Telnet does nothing at all.
  954. */
  955. static int telnet_cfg_info(Backend *be)
  956. {
  957. return 0;
  958. }
  959. const BackendVtable telnet_backend = {
  960. .init = telnet_init,
  961. .free = telnet_free,
  962. .reconfig = telnet_reconfig,
  963. .send = telnet_send,
  964. .sendbuffer = telnet_sendbuffer,
  965. .size = telnet_size,
  966. .special = telnet_special,
  967. .get_specials = telnet_get_specials,
  968. .connected = telnet_connected,
  969. .exitcode = telnet_exitcode,
  970. .sendok = telnet_sendok,
  971. .ldisc_option_state = telnet_ldisc,
  972. .provide_ldisc = telnet_provide_ldisc,
  973. .unthrottle = telnet_unthrottle,
  974. .cfg_info = telnet_cfg_info,
  975. .id = "telnet",
  976. .displayname = "Telnet",
  977. .protocol = PROT_TELNET,
  978. .default_port = 23,
  979. };