Index: third_party/twisted_8_1/twisted/protocols/telnet.py |
diff --git a/third_party/twisted_8_1/twisted/protocols/telnet.py b/third_party/twisted_8_1/twisted/protocols/telnet.py |
deleted file mode 100644 |
index 592d93aa322f6178f4badaf653e5035adfd82bdb..0000000000000000000000000000000000000000 |
--- a/third_party/twisted_8_1/twisted/protocols/telnet.py |
+++ /dev/null |
@@ -1,325 +0,0 @@ |
- |
-# Copyright (c) 2001-2004 Twisted Matrix Laboratories. |
-# See LICENSE for details. |
- |
- |
-"""TELNET implementation, with line-oriented command handling. |
-""" |
- |
-import warnings |
-warnings.warn( |
- "As of Twisted 2.1, twisted.protocols.telnet is deprecated. " |
- "See twisted.conch.telnet for the current, supported API.", |
- DeprecationWarning, |
- stacklevel=2) |
- |
- |
-# System Imports |
-try: |
- from cStringIO import StringIO |
-except ImportError: |
- from StringIO import StringIO |
- |
-# Twisted Imports |
-from twisted import copyright |
-from twisted.internet import protocol |
- |
-# Some utility chars. |
-ESC = chr(27) # ESC for doing fanciness |
-BOLD_MODE_ON = ESC+"[1m" # turn bold on |
-BOLD_MODE_OFF= ESC+"[m" # no char attributes |
- |
- |
-# Characters gleaned from the various (and conflicting) RFCs. Not all of these are correct. |
- |
-NULL = chr(0) # No operation. |
-LF = chr(10) # Moves the printer to the |
- # next print line, keeping the |
- # same horizontal position. |
-CR = chr(13) # Moves the printer to the left |
- # margin of the current line. |
-BEL = chr(7) # Produces an audible or |
- # visible signal (which does |
- # NOT move the print head). |
-BS = chr(8) # Moves the print head one |
- # character position towards |
- # the left margin. |
-HT = chr(9) # Moves the printer to the |
- # next horizontal tab stop. |
- # It remains unspecified how |
- # either party determines or |
- # establishes where such tab |
- # stops are located. |
-VT = chr(11) # Moves the printer to the |
- # next vertical tab stop. It |
- # remains unspecified how |
- # either party determines or |
- # establishes where such tab |
- # stops are located. |
-FF = chr(12) # Moves the printer to the top |
- # of the next page, keeping |
- # the same horizontal position. |
-SE = chr(240) # End of subnegotiation parameters. |
-NOP= chr(241) # No operation. |
-DM = chr(242) # "Data Mark": The data stream portion |
- # of a Synch. This should always be |
- # accompanied by a TCP Urgent |
- # notification. |
-BRK= chr(243) # NVT character Break. |
-IP = chr(244) # The function Interrupt Process. |
-AO = chr(245) # The function Abort Output |
-AYT= chr(246) # The function Are You There. |
-EC = chr(247) # The function Erase Character. |
-EL = chr(248) # The function Erase Line |
-GA = chr(249) # The Go Ahead signal. |
-SB = chr(250) # Indicates that what follows is |
- # subnegotiation of the indicated |
- # option. |
-WILL = chr(251) # Indicates the desire to begin |
- # performing, or confirmation that |
- # you are now performing, the |
- # indicated option. |
-WONT = chr(252) # Indicates the refusal to perform, |
- # or continue performing, the |
- # indicated option. |
-DO = chr(253) # Indicates the request that the |
- # other party perform, or |
- # confirmation that you are expecting |
- # the other party to perform, the |
- # indicated option. |
-DONT = chr(254) # Indicates the demand that the |
- # other party stop performing, |
- # or confirmation that you are no |
- # longer expecting the other party |
- # to perform, the indicated option. |
-IAC = chr(255) # Data Byte 255. |
- |
-# features |
- |
-ECHO = chr(1) # User-to-Server: Asks the server to send |
- # Echos of the transmitted data. |
- |
- # Server-to User: States that the server is |
- # sending echos of the transmitted data. |
- # Sent only as a reply to ECHO or NO ECHO. |
- |
-SUPGA = chr(3) # Supress Go Ahead...? "Modern" telnet servers |
- # are supposed to do this. |
- |
-LINEMODE = chr(34) # I don't care that Jon Postel is dead. |
- |
-HIDE = chr(133) # The intention is that a server will send |
- # this signal to a user system which is |
- # echoing locally (to the user) when the user |
- # is about to type something secret (e.g. a |
- # password). In this case, the user system |
- # is to suppress local echoing or overprint |
- # the input (or something) until the server |
- # sends a NOECHO signal. In situations where |
- # the user system is not echoing locally, |
- # this signal must not be sent by the server. |
- |
- |
-NOECHO= chr(131) # User-to-Server: Asks the server not to |
- # return Echos of the transmitted data. |
- # |
- # Server-to-User: States that the server is |
- # not sending echos of the transmitted data. |
- # Sent only as a reply to ECHO or NO ECHO, |
- # or to end the hide your input. |
- |
- |
- |
-iacBytes = { |
- DO: 'DO', |
- DONT: 'DONT', |
- WILL: 'WILL', |
- WONT: 'WONT', |
- IP: 'IP' |
- } |
- |
-def multireplace(st, dct): |
- for k, v in dct.items(): |
- st = st.replace(k, v) |
- return st |
- |
-class Telnet(protocol.Protocol): |
- """I am a Protocol for handling Telnet connections. I have two |
- sets of special methods, telnet_* and iac_*. |
- |
- telnet_* methods get called on every line sent to me. The method |
- to call is decided by the current mode. The initial mode is 'User'; |
- this means that telnet_User is the first telnet_* method to be called. |
- All telnet_* methods should return a string which specifies the mode |
- to go into next; thus dictating which telnet_* method to call next. |
- For example, the default telnet_User method returns 'Password' to go |
- into Password mode, and the default telnet_Password method returns |
- 'Command' to go into Command mode. |
- |
- The iac_* methods are less-used; they are called when an IAC telnet |
- byte is received. You can define iac_DO, iac_DONT, iac_WILL, iac_WONT, |
- and iac_IP methods to do what you want when one of these bytes is |
- received.""" |
- |
- |
- gotIAC = 0 |
- iacByte = None |
- lastLine = None |
- buffer = '' |
- echo = 0 |
- delimiters = ['\r\n', '\r\000'] |
- mode = "User" |
- |
- def write(self, data): |
- """Send the given data over my transport.""" |
- self.transport.write(data) |
- |
- |
- def connectionMade(self): |
- """I will write a welcomeMessage and loginPrompt to the client.""" |
- self.write(self.welcomeMessage() + self.loginPrompt()) |
- |
- def welcomeMessage(self): |
- """Override me to return a string which will be sent to the client |
- before login.""" |
- x = self.factory.__class__ |
- return ("\r\n" + x.__module__ + '.' + x.__name__ + |
- '\r\nTwisted %s\r\n' % copyright.version |
- ) |
- |
- def loginPrompt(self): |
- """Override me to return a 'login:'-type prompt.""" |
- return "username: " |
- |
- def iacSBchunk(self, chunk): |
- pass |
- |
- def iac_DO(self, feature): |
- pass |
- |
- def iac_DONT(self, feature): |
- pass |
- |
- def iac_WILL(self, feature): |
- pass |
- |
- def iac_WONT(self, feature): |
- pass |
- |
- def iac_IP(self, feature): |
- pass |
- |
- def processLine(self, line): |
- """I call a method that looks like 'telnet_*' where '*' is filled |
- in by the current mode. telnet_* methods should return a string which |
- will become the new mode. If None is returned, the mode will not change. |
- """ |
- mode = getattr(self, "telnet_"+self.mode)(line) |
- if mode is not None: |
- self.mode = mode |
- |
- def telnet_User(self, user): |
- """I take a username, set it to the 'self.username' attribute, |
- print out a password prompt, and switch to 'Password' mode. If |
- you want to do something else when the username is received (ie, |
- create a new user if the user doesn't exist), override me.""" |
- self.username = user |
- self.write(IAC+WILL+ECHO+"password: ") |
- return "Password" |
- |
- def telnet_Password(self, paswd): |
- """I accept a password as an argument, and check it with the |
- checkUserAndPass method. If the login is successful, I call |
- loggedIn().""" |
- self.write(IAC+WONT+ECHO+"*****\r\n") |
- try: |
- checked = self.checkUserAndPass(self.username, paswd) |
- except: |
- return "Done" |
- if not checked: |
- return "Done" |
- self.loggedIn() |
- return "Command" |
- |
- def telnet_Command(self, cmd): |
- """The default 'command processing' mode. You probably want to |
- override me.""" |
- return "Command" |
- |
- def processChunk(self, chunk): |
- """I take a chunk of data and delegate out to telnet_* methods |
- by way of processLine. If the current mode is 'Done', I'll close |
- the connection. """ |
- self.buffer = self.buffer + chunk |
- |
- #yech. |
- for delim in self.delimiters: |
- idx = self.buffer.find(delim) |
- if idx != -1: |
- break |
- |
- while idx != -1: |
- buf, self.buffer = self.buffer[:idx], self.buffer[idx+2:] |
- self.processLine(buf) |
- if self.mode == 'Done': |
- self.transport.loseConnection() |
- |
- for delim in self.delimiters: |
- idx = self.buffer.find(delim) |
- if idx != -1: |
- break |
- |
- def dataReceived(self, data): |
- chunk = StringIO() |
- # silly little IAC state-machine |
- for char in data: |
- if self.gotIAC: |
- # working on an IAC request state |
- if self.iacByte: |
- # we're in SB mode, getting a chunk |
- if self.iacByte == SB: |
- if char == SE: |
- self.iacSBchunk(chunk.getvalue()) |
- chunk = StringIO() |
- del self.iacByte |
- del self.gotIAC |
- else: |
- chunk.write(char) |
- else: |
- # got all I need to know state |
- try: |
- getattr(self, 'iac_%s' % iacBytes[self.iacByte])(char) |
- except KeyError: |
- pass |
- del self.iacByte |
- del self.gotIAC |
- else: |
- # got IAC, this is my W/W/D/D (or perhaps sb) |
- self.iacByte = char |
- elif char == IAC: |
- # Process what I've got so far before going into |
- # the IAC state; don't want to process characters |
- # in an inconsistent state with what they were |
- # received in. |
- c = chunk.getvalue() |
- if c: |
- why = self.processChunk(c) |
- if why: |
- return why |
- chunk = StringIO() |
- self.gotIAC = 1 |
- else: |
- chunk.write(char) |
- # chunks are of a relatively indeterminate size. |
- c = chunk.getvalue() |
- if c: |
- why = self.processChunk(c) |
- if why: |
- return why |
- |
- def loggedIn(self): |
- """Called after the user succesfully logged in. |
- |
- Override in subclasses. |
- """ |
- pass |