Hello,
Thanks to your help, the server now requests a username and password for the
authentication.
Once the password has been enterred, nothing happened on the client side. I'm
even not able to escape from the client. I have to ctrl-c in the server console.
If I well understood the doc, for each state of the connection a method is
called: telnet_User called when state = 'User', telnet_Password called when
state = 'Password' and at the end telnet_Command (to be written by me).
I have added my "telnet_Command" method into my ITelnetProtocol implementation
return by requestAvatar, but it is never called.
In the telnet_Password method, the deferred calls _cbLogin in case of good
authentication or _ebLogin.
I could verify that _cbLogin is well called but it seems the application blocks
in.
The method looks like this:
def _cbLogin(self, ial):
interface, protocol, logout = ial
assert interface is ITelnetProtocol
self.protocol = protocol
self.logout = logout
self.state = 'Command'
protocol.makeConnection(self.transport)
self.transport.protocol = protocol
I almost sure this has to do with what requestAvatar returns in my Realm class:
class Realm:
implements(portal.IRealm)
def requestAvatar(self, avatarId, mind, *interfaces):
if ITelnetProtocol in interfaces:
av = MyTelnet()
return ITelnetProtocol, av, lambda:None
raise NotImplementedError("Only IProtocolUser interface is supported by
this realm")
MyTelnet being a derived class of StatefulTelnetProtocol.
Is it what you explained in your previous reply?
>AuthenticatingTelnetProtocol is an ITelnetProtocol implementation. So,
>it needs to be hooked up to an ITelnetTransport implementation, as all
>ITelnetProtocol implementations need to.
>
>However, since the only thing it knows how to do is handle
>authentication, it also wants to get /another/ ITelnetProtocol
>implementation out of the portal you give it. After authentication
>succeeds, that new ITelnetProtocol implementation will be given control
>of the connection and the AuthenticatingTelnetProtocol will get out of
>the way.
>
>So you end up with one telnet transport and two telnet protocols.
I think I did all you said but I'm not able to get it work. Do you have another
idea?
Thanks in advance.
Here is the log on the server:
2009-09-01 22:37:35+0200 [-] Log opened.
2009-09-01 22:37:35+0200 [-] twisted.internet.protocol.ServerFactory starting
on 4738
2009-09-01 22:37:35+0200 [-] Starting factory
<twisted.internet.protocol.ServerFactory instance at 0x00D82DA0>
2009-09-01 22:37:57+0200 [twisted.internet.protocol.ServerFactory] state User
2009-09-01 22:38:01+0200 [TelnetTransport,0,127.0.0.1] state User
2009-09-01 22:38:02+0200 [TelnetTransport,0,127.0.0.1] state Password
2009-09-01 22:38:02+0200 [TelnetTransport,0,127.0.0.1] BEGUG in requestAvatar:
av = <__main__.MyTelnet instance at 0x00E757D8>
2009-09-01 22:38:02+0200 [TelnetTransport,0,127.0.0.1] BEGUG in _cbLogin: ial =
(<InterfaceClass twisted.conch.telnet.ITelnetProtocol>, <__main__.MyTelnet
instance at 0x00E757D8>, None)
2009-09-01 22:38:02+0200 [TelnetTransport,0,127.0.0.1] BEGUG in _cbLogin: state
= Command
2009-09-01 22:38:02+0200 [TelnetTransport,0,127.0.0.1] BEGUG in
telnet_Password: deferred d = <Deferred at 0xe75b48 current result: None>
Regards,
Philippe
_______________________________________________
Twisted-Python mailing list
[email protected]
http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-python