X-Git-Url: https://mudpy.org/gitweb?p=mudpy.git;a=blobdiff_plain;f=mudpy%2Ftelnet.py;h=35fb1c697290f7b86e97cbca155fd25b7aa69069;hp=e483c13deecccbe2bc54f540a361fbf1444e2582;hb=7aa0e226d74b56f955cb328d5e7f03d7d3d32efb;hpb=0f8e071859e2325f62bd19d989ab5ac3aa8a075d diff --git a/mudpy/telnet.py b/mudpy/telnet.py index e483c13..35fb1c6 100644 --- a/mudpy/telnet.py +++ b/mudpy/telnet.py @@ -1,6 +1,6 @@ """Telnet functions and constants for the mudpy engine.""" -# Copyright (c) 2004-2019 mudpy authors. Permission to use, copy, +# Copyright (c) 2004-2020 mudpy authors. Permission to use, copy, # modify, and distribute this software is granted under terms # provided in the LICENSE file distributed with this software. @@ -24,11 +24,11 @@ option_names = { TELOPT_LINEMODE: "line mode", } -# TODO(fungi): implement support for RFC 1091 terminal type information supported = ( TELOPT_BINARY, TELOPT_ECHO, TELOPT_SGA, + TELOPT_TTYPE, TELOPT_EOR, TELOPT_NAWS, TELOPT_LINEMODE @@ -80,6 +80,14 @@ party_names = { US: "us", } +# RFC 1091 commands +IS = 0 +SEND = 1 +ttype_command_names = { + IS: "is", + SEND: "send", +} + def log(message, user): """Log debugging info for Telnet client/server interactions.""" @@ -163,6 +171,17 @@ def disable(user, telopt, party): user.telopts[(telopt, party)] = WANTNO +def request_ttype(user): + """Clear and request the terminal type.""" + + # only actually request if the corresponding telopt is enabled + if is_enabled(user, TELOPT_TTYPE, HIM): + # set to the empty string to indicate it's been requested + user.ttype = "" + user.send(telnet_proto(IAC, SB, TELOPT_TTYPE, SEND, IAC, SE), raw=True) + log('Sent terminal type request to', user) + + def negotiate_telnet_options(user): """Reply to and remove telnet negotiation options from partial_input.""" @@ -245,11 +264,14 @@ def negotiate_telnet_options(user): # subnegotiation options elif len_text > position + 4 and command is SB: telopt = text[position + 2] - if telopt is TELOPT_NAWS: - user.columns = ( - text[position + 3] * 256 + text[position + 4]) end_subnegotiation = text.find(telnet_proto(IAC, SE), position) if end_subnegotiation > 0: + if telopt is TELOPT_NAWS: + user.columns = ( + text[position + 3] * 256 + text[position + 4]) + elif telopt is TELOPT_TTYPE and text[position + 3] is IS: + user.ttype = ( + text[position + 4:end_subnegotiation]).decode("ascii") text = text[:position] + text[end_subnegotiation + 2:] else: position += 1