Files
WindTerm/src/Protocols/TelnetProtocol.h
T

206 lines
9.1 KiB
C++

/*
* Copyright 2020, WindTerm.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef TELNETPROTOCOL_H
#define TELNETPROTOCOL_H
#pragma once
#include <vector>
#include "Protocol.h"
typedef unsigned char uchar;
/* TELNET Command Codes: */
constexpr uchar TELCMD_XEOF = 236; /* End of file: EOF is already used */
constexpr uchar TELCMD_SUSP = 237; /* Suspend process */
constexpr uchar TELCMD_ABORT = 238; /* Abort process */
constexpr uchar TELCMD_EOR = 239; /* end of record (transparent mode) */
constexpr uchar TELCMD_SE = 240; /* end sub negotiation */
constexpr uchar TELCMD_NOP = 241; /* nop */
constexpr uchar TELCMD_DM = 242; /* data mark--for connect. cleaning */
constexpr uchar TELCMD_BREAK = 243; /* break */
constexpr uchar TELCMD_IP = 244; /* interrupt process--permanently */
constexpr uchar TELCMD_AO = 245; /* abort output--but let prog finish*/
constexpr uchar TELCMD_AYT = 246; /* are you there */
constexpr uchar TELCMD_EC = 247; /* erase the current character */
constexpr uchar TELCMD_EL = 248; /* erase the current line */
constexpr uchar TELCMD_GA = 249; /* you may reverse the line */
constexpr uchar TELCMD_SB = 250; /* interpret as subnegotiation */
constexpr uchar TELCMD_WILL = 251; /* I will use option */
constexpr uchar TELCMD_WONT = 252; /* I won't use option */
constexpr uchar TELCMD_DO = 253; /* please, you use option */
constexpr uchar TELCMD_DONT = 254; /* you are not to use option */
constexpr uchar TELCMD_IAC = 255; /* interpret as command */
/* The telnet options represented as strings */
constexpr uchar TELOPT_BINARY = 0; // Binary Transmission - RFC 856
constexpr uchar TELOPT_ECHO = 1; // Echo - RFC 857
constexpr uchar TELOPT_RCP = 2; // Reconnection
constexpr uchar TELOPT_SGA = 3; // Suppress Go Ahead - RFC 858
constexpr uchar TELOPT_NAMS = 4; // Approx Message Size Negotiation
constexpr uchar TELOPT_STATUS = 5; // Status - RFC 859
constexpr uchar TELOPT_TM = 6; // Timing Mark - RFC 860
constexpr uchar TELOPT_RCTE = 7; // Remote controlled transmission and echo - RFC 563,726
constexpr uchar TELOPT_NAOL = 8; // Negotiate about output line width - NIC50005
constexpr uchar TELOPT_NAOP = 9; // Negotiate about output page size - NIC50005
constexpr uchar TELOPT_NAOCRD = 10; // Negotiate about CR disposition - RFC 652
constexpr uchar TELOPT_NAOHTS = 11; // Negotiate about horizontal tabstops - RFC 653
constexpr uchar TELOPT_NAOHTD = 12; // Negotiate about horizontal tab disposition - RFC 654
constexpr uchar TELOPT_NAOFFD = 13; // Negotiate about formfeed disposition - RFC 655
constexpr uchar TELOPT_NAOVTS = 14; // Negotiate about vertical tab stops - RFC 656
constexpr uchar TELOPT_NAOVTD = 15; // Negotiate about vertical tab disposition - RFC 657
constexpr uchar TELOPT_NAOLFD = 16; // Negotiate about output LF disposition - RFC 658
constexpr uchar TELOPT_XASCII = 17; // Extended ascic character set - RFC 698
constexpr uchar TELOPT_LOGOUT = 18; // Force logout - RFC 727
constexpr uchar TELOPT_BM = 19; // Byte Macro - RFC 735
constexpr uchar TELOPT_DET = 20; // Data Entry Terminal - RFC 732,1043
constexpr uchar TELOPT_SUPDUP = 21; // SUPDUP Protocol - RFC 734,736
constexpr uchar TELOPT_SUPDUPOUTPUT = 22; // SUPDUP Output - RFC 749
constexpr uchar TELOPT_SNDLOC = 23; // Send Location - RFC 779
constexpr uchar TELOPT_TTYPE = 24; // Terminal Type - RFC 1091
constexpr uchar TELOPT_EOR = 25; // End of Record - RFC 885
constexpr uchar TELOPT_TUID = 26; // TACACS User Identification - RFC 927
constexpr uchar TELOPT_OUTMRK = 27; // Output Marking - RFC 933
constexpr uchar TELOPT_TTYLOC = 28; // Terminal Location Number - RFC 946
constexpr uchar TELOPT_3270REGIME = 29; // Telnet 3270 Regime - RFC 1041
constexpr uchar TELOPT_X3PAD = 30; // X.3 PAD - RFC 1053
constexpr uchar TELOPT_NAWS = 31; // Negotiate window size - RFC 1073
constexpr uchar TELOPT_TSPEED = 32; // Terminal Speed - RFC 1079
constexpr uchar TELOPT_LFLOW = 33; // Remote Flow Control - RFC 1372
constexpr uchar TELOPT_LINEMODE = 34; // Linemode option - RFC 1184
constexpr uchar TELOPT_XDISPLOC = 35; // X Display Location - RFC 1096
constexpr uchar TELOPT_OLD_ENVIRON = 36; // Environment Option - RFC 1408
constexpr uchar TELOPT_AUTHENTICATION = 37; // Authenticate - RFC 1416,2941,2942,2943,2951
constexpr uchar TELOPT_ENCRYPT = 38; // Encryption Option - RFC 2946
constexpr uchar TELOPT_NEW_ENVIRON = 39; // New Environment Option - RFC 1572
constexpr uchar TELOPT_TN3270E = 40; // TN3270 enhancements - RFC 2355
constexpr uchar TELOPT_XAUTH = 41; // XAUTH
constexpr uchar TELOPT_CHARSET = 42; // Negotiate charset to use - RFC 2066
constexpr uchar TELOPT_RSP = 43; // Telnet remote serial port
constexpr uchar TELOPT_COM_PORT_OPTION = 44; // Com port control option - RFC 2217
constexpr uchar TELOPT_SLE = 45; // Telnet suppress local echo
constexpr uchar TELOPT_STARTTLS = 46; // Telnet Start TLS
constexpr uchar TELOPT_KERMIT = 47; // Automatic Kermit file transfer - RFC 2840
constexpr uchar TELOPT_SEND_URL = 48; // Send URL
constexpr uchar TELOPT_FORWARD_X = 49; // X forwarding
constexpr uchar TELOPT_MCCP1 = 85; // Mud Compression Protocol (v1)
constexpr uchar TELOPT_MCCP2 = 86; // Mud Compression Protocol (v2)
constexpr uchar TELOPT_MSP = 90; // Mud Sound Protocol
constexpr uchar TELOPT_MXP = 91; // Mud eXtension Protocol
constexpr uchar TELOPT_ZMP = 93; // Zenith Mud Protocol
constexpr uchar TELOPT_PRAGMA_LOGON = 138; // Telnet option pragma logon
constexpr uchar TELOPT_SSPI_LOGON = 139; // Telnet option SSPI login
constexpr uchar TELOPT_PRAGMA_HEARTBEAT = 140; // Telnet option pragma heartbeat
constexpr uchar TELOPT_GMCP = 201; // Generic Mud Communication Protocol
constexpr uchar TELOPT_EXOPL = 255; // extended-options-list - RFC 861
/* Option Subnegotiation Constants: */
constexpr uchar TELSUB_IS = 0; // An option IS
constexpr uchar TELSUB_SEND = 1; // Send an option
constexpr uchar TELSUB_INFO = 2; // Environ: informational version of IS
constexpr uchar TELSUB_NAME = 3;
/* Keyboard Command Characters: */
constexpr char TELKEY_LF = '\n'; // Line Feed
constexpr char TELKEY_CR = '\r'; // Carriage Return
constexpr char TELKEY_BEL = '\a'; // Bell (attention signal)
constexpr char TELKEY_BS = '\b'; // Back Space
constexpr char TELKEY_HT = '\t'; // Horizontal Tab
constexpr char TELKEY_VT = '\v'; // Vertical Tab
constexpr char TELKEY_FF = '\f'; // Form Feed
enum TelnetOptionIndex : uchar {
TELOPT_INDEX_NAWS,
TELOPT_INDEX_TSPEED,
TELOPT_INDEX_TTYPE,
TELOPT_INDEX_NEW_ENVIRON,
TELOPT_INDEX_LFLOW,
TELOPT_INDEX_LINEMODE,
TELOPT_INDEX_ECHO,
TELOPT_INDEX_SERVER_SGA,
TELOPT_INDEX_CLIENT_SGA,
TELOPT_INDEX_SERVER_BIN,
TELOPT_INDEX_CLIENT_BIN,
TELOPT_INDEX_MAX
};
enum TelnetAction : uchar {
TELACT_ABORT, // Abort Process
TELACT_AO, // Abort Output
TELACT_AYT, // Are You There
TELACT_BREAK, // serial-line break
TELACT_EC, // Erase Character
TELACT_EL, // Erase Line
TELACT_EOF, // end-of-file on session input
TELACT_EOL, // Telnet end-of-line sequence (CRLF, as opposed to CR NUL that escapes a literal CR)
TELACT_EOR, // End Of Record
TELACT_GA, // Go Ahead
TELACT_IP, // Interrupt Process
TELACT_NOP, // transmit data with no effect
TELACT_SUSP // Suspend Process
};
enum TelnetSide : uchar {
TELNET_SERVER,
TELNET_CLIENT
};
#define BIT_INACTIVE 0x00
#define BIT_ACTIVE 0x01
#define BIT_REQUESTED 0x10
enum TelnetOptionState {
TELOPT_STATE_INACTIVE = BIT_INACTIVE,
TELOPT_STATE_ACTIVE = BIT_ACTIVE,
TELOPT_STATE_INACTIVE_REQUESTED = BIT_INACTIVE | BIT_REQUESTED,
TELOPT_STATE_ACTIVE_REQUESTED = BIT_ACTIVE | BIT_REQUESTED
};
struct TelnetOption {
int nTelnetOption;
TelnetSide eTelnetSide;
TelnetOptionState eOptionState;
TelnetOption() :
nTelnetOption(-1),
eTelnetSide(TELNET_SERVER),
eOptionState(TELOPT_STATE_INACTIVE)
{}
void Init(uchar _nTelnetOption, TelnetSide _eTelnetSide, TelnetOptionState _eOptionState)
{
nTelnetOption = _nTelnetOption;
eTelnetSide = _eTelnetSide;
eOptionState = _eOptionState;
}
};
typedef std::vector<TelnetOption> TelnetOptionVector;
typedef std::vector<TelnetOptionState> TelnetOptionStateVector;
class TelnetProtocol : public Protocol
{
public:
TelnetProtocol();
std::string GetCommandName(uchar chTelnetCmd);
std::string GetOptionName(uchar chTelnetOpt);
TelnetOptionVector &GetOptionVector();
};
#endif // TELNETPROTOCOL_H