<html><head><style type="text/css"><!-- DIV {margin:0px;} --></style></head><body><div style="font-family:tahoma,new york,times,serif;font-size:12pt"><div><style type="text/css"><!--DIV {margin:0px;}--></style><div style="font-family: tahoma,new york,times,serif; font-size: 12pt;"><div style="font-family: tahoma,new york,times,serif;">Hello,<br>
<br>
I have created a telnet server in python.<br>
<br>
Maybe you wonder why to create a telnet server while Windows has one?
Because the windows telnet server does not allow to interract with the
desktop. If you try to start a GUI app, it will start and run but will
not be displayed on the server desktop.<br>
<br>
My telnet server will allow to start a GUI application interracting with the windows desktop of the server.<br>
Ex. : typing "notepad" in the telnet console will pop up the notepad on the Windows desktop of the server.<br>
<br>
At the time this server works but has no authentication feature implemented.<br>
<br>
I would like to implement the authentication using AuthenticatingTelnetProtocol and credential.<br>I found the "<a rel="nofollow" target="_blank" href="http://twistedmatrix.com/projects/core/documentation/examples/cred.py">cred.py</a>" example on the twistedmatrix website (in the example section) and looked fine as starting point.<br><br>I quite well understand this expample.<br><br>I modified the code as follow but always got the same error message when a connectiion is attempted.<br>I have been trying since two weeks but I cannot get it work.<br><br>Is there a problem with "AuthenticatingTelnetProtocol"<br><br>The error message:<br>
************************************************************<br>
D:\workspace\twisted&gt;telnet_cred.py<br>
2009-08-20 08:57:11+0200 [-] Log opened.<br>
2009-08-20 08:57:11+0200 [-] __main__.ServerFactory starting on 4738<br>
2009-08-20 08:57:11+0200 [-] Starting factory &lt;__main__.ServerFactory instance at 0x00D79C60&gt;<br>
2009-08-20 08:57:15+0200 [__main__.ServerFactory] DEBUG: buildProtocol - addr IPv4Address(TCP, '127.0.0.1', 4978)<br>
2009-08-20 08:57:15+0200 [__main__.ServerFactory] Unhandled Error<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Traceback (most recent call last):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File "C:\Python25\lib\site-packages\twisted\python\log.py", line 69, in callWithContext<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return context.call({ILogContext: newCtx}, func, *args, **kw)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File "C:\Python25\lib\site-packages\twisted\python\context.py", line 59, in callWithContext<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return self.currentContext().callWithContext(ctx, func, *args, **kw)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File "C:\Python25\lib\site-packages\twisted\python\context.py", line 37, in callWithContext<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return func(*args,**kw)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File "C:\Python25\lib\site-packages\twisted\internet\selectreactor.py", line 146, in _doReadOrWrite<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; why = getattr(selectable, method)()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --- &lt;exception caught here&gt; ---<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File "C:\Python25\lib\site-packages\twisted\internet\tcp.py", line 932, in doRead<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protocol = self.factory.buildProtocol(self._buildAddr(addr))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File "D:\workspace\twisted\telnet_cred.py", line 130, in buildProtocol<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = protocol.ServerFactory.buildProtocol(self, addr)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File "C:\Python25\lib\site-packages\twisted\internet\protocol.py", line 98, in buildProtocol<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = self.protocol()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exceptions.TypeError: __init__() takes exactly 2 arguments (1 given)<br>
************************************************************<br>
<br>The modified code:<br>************************************************************<br><br># Copyright (c) 2001-2004 Twisted Matrix Laboratories.<br># See LICENSE for details.<br><br><br><br>import sys<br>from zope.interface import implements, Interface<br><br>from twisted.protocols import basic<br>from twisted.internet import protocol<br>from twisted.python import log<br><br>from twisted.cred import error<br>from twisted.cred import portal<br>from twisted.cred import checkers<br>from twisted.cred import credentials<br><br>from twisted.conch.telnet import AuthenticatingTelnetProtocol, ITelnetProtocol, TelnetProtocol<br><br>class IProtocolUser(Interface):<br>&nbsp;&nbsp;&nbsp; def getPrivileges():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """Return a list of privileges this user has."""<br><br>&nbsp;&nbsp;&nbsp; def logout():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; """Cleanup per-login resources allocated to this avatar"""<br><br>class
 AnonymousUser:<br>&nbsp;&nbsp;&nbsp; implements(IProtocolUser)<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; def getPrivileges(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return [1, 2, 3]<br><br>&nbsp;&nbsp;&nbsp; def logout(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Cleaning up anonymous user resources"<br><br>class RegularUser:<br>&nbsp;&nbsp;&nbsp; implements(IProtocolUser)<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; def getPrivileges(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return [1, 2, 3, 5, 6]<br><br>&nbsp;&nbsp;&nbsp; def logout(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Cleaning up regular user resources"<br><br>class Administrator:<br>&nbsp;&nbsp;&nbsp; implements(IProtocolUser)<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; def getPrivileges(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return range(50)<br><br>&nbsp;&nbsp;&nbsp; def
 logout(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Cleaning up administrator resources"<br><br>class Protocol(basic.LineReceiver):<br>&nbsp;&nbsp;&nbsp; user = None<br>&nbsp;&nbsp;&nbsp; portal = None<br>&nbsp;&nbsp;&nbsp; avatar = None<br>&nbsp;&nbsp;&nbsp; logout = None<br><br>&nbsp;&nbsp;&nbsp; def connectionMade(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine("Login with USER &lt;name&gt; followed by PASS &lt;password&gt; or ANON")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine("Check privileges with PRIVS")<br><br>&nbsp;&nbsp;&nbsp; def connectionLost(self, reason):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.logout:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.logout()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.avatar = None<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.logout =
 None<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; def lineReceived(self, line):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f = getattr(self, 'cmd_' + line.upper().split()[0])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if f:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f(*line.split()[1:])<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except TypeError:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine("Wrong number of arguments.")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine("Server error (probably your fault)")<br><br>&nbsp;&nbsp;&nbsp; def cmd_ANON(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if
 self.portal:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.portal.login(credentials.Anonymous(), None, IProtocolUser<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ).addCallbacks(self._cbLogin, self._ebLogin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine("DENIED")<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; def cmd_USER(self, name):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.user = name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine("Alright.&nbsp; Now PASS?")<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; def cmd_PASS(self, password):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if not self.user:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 self.sendLine("USER required before PASS")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if self.portal:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.portal.login(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; credentials.UsernamePassword(self.user, password),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; None,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IProtocolUser<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ).addCallbacks(self._cbLogin, self._ebLogin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine("DENIED")<br><br>&nbsp;&nbsp;&nbsp; def cmd_PRIVS(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine("You have the following privileges: ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine(" ".join(map(str, self.avatar.getPrivileges())))<br><br>&nbsp;&nbsp;&nbsp; def _cbLogin(self, (interface, avatar, logout)):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assert interface is IProtocolUser<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.avatar = avatar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.logout = logout<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine("Login successful.&nbsp; Available commands: PRIVS")<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; def _ebLogin(self,
 failure):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; failure.trap(error.UnauthorizedLogin)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.sendLine("Login denied!&nbsp; Go away.")<br><br>class ServerFactory(protocol.ServerFactory):<br>##&nbsp;&nbsp;&nbsp; protocol = Protocol<br>&nbsp;&nbsp;&nbsp; protocol = AuthenticatingTelnetProtocol<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; def __init__(self, portal):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.portal = portal<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; def buildProtocol(self, addr):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "DEBUG: buildProtocol - addr", addr<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = protocol.ServerFactory.buildProtocol(self, addr)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "DEBUG2: buildProtocol - addr", addr<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p.portal = self.portal<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return
 p<br><br>class Realm:<br>&nbsp;&nbsp;&nbsp; implements(portal.IRealm)<br><br>&nbsp;&nbsp;&nbsp; def requestAvatar(self, avatarId, mind, *interfaces):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if IProtocolUser in interfaces:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if avatarId == checkers.ANONYMOUS:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; av = AnonymousUser()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif avatarId.isupper():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Capitalized usernames are administrators.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; av = Administrator()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 av = RegularUser()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return IProtocolUser, av, av.logout<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif ITelnetProtocol in interfaces:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "BEGUG: aaaa"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if avatarId.isupper():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; av = TelnetProtocol()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ITelnetProtocol, av, None<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; raise NotImplementedError("Only IProtocolUser interface is supported by this realm")<br><br>def main():<br>&nbsp;&nbsp;&nbsp; r = Realm()<br>&nbsp;&nbsp;&nbsp; p = portal.Portal(r)<br>&nbsp;&nbsp;&nbsp; c = checkers.InMemoryUsernamePasswordDatabaseDontUse()<br>&nbsp;&nbsp;&nbsp; c.addUser("auser",
 "thepass")<br>&nbsp;&nbsp;&nbsp; c.addUser("SECONDUSER", "secret")<br>&nbsp;&nbsp;&nbsp; p.registerChecker(c)<br>&nbsp;&nbsp;&nbsp; p.registerChecker(checkers.AllowAnonymousAccess())<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; f = ServerFactory(p)<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; log.startLogging(sys.stdout)<br><br>&nbsp;&nbsp;&nbsp; from twisted.internet import reactor<br>&nbsp;&nbsp;&nbsp; reactor.listenTCP(4738, f)<br>&nbsp;&nbsp;&nbsp; reactor.run()<br><br>if __name__ == '__main__':<br>&nbsp;&nbsp;&nbsp; main()<br><br>************************************************************<br><br>If someone could help me.<br><br>Philippe<br></div></div><br>



      </div></div><br>



      </body></html>