| 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
 | 
| 
 |