AuthenticatingTelnetProtocol pour créer un serveur Telnet

Document Actions
Réponses: 1   Visites: 1809
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

AuthenticatingTelnetProtocol pour créer un serveur Telnet

Posté par filoupython le 18/08/2009 10:27
Bonjour, Je suis nouveau sur ce forum. J'espère y trouver de l'aide et dans la mesure du possible pouvoir aider les autres ... J'ai déjà réussi à créer un serveur telnet pour windows en python. Celui-ci à la particularité de pourvoir démarrer des programmes graphiques s'affichant sur l'écran du serveur. (Ex: si le client tape "notepad" dans sa console, le programme notepad s'affichera sur le bureau windows du serveur). Mon serveur à presque tout ce qu'il me faut sauf l'authentification par login/mot de passe. Je me suis inspiré du code source "simplecred.py" que l'on trouve à [url href="http://books.google.be/books?id=sUviL0XxgMEC&pg=PA88&lpg=PA88&dq=simplecred.py&source=bl&ots=c3lbxazei5&sig=mQt1vuUJw7cbGCNf5mwhsrBsfz4&hl=fr&ei=C2KKSsnnAZnbjQekuoRd&sa=X&oi=book_result&ct=result&resnum=5#v=onepage&q=simplecred.py&f=false"]cette adresse[/url] (livre O'Relly Twisted network programming essentials). J'ai essayé d'utiliser "AuthenticatingTelnetProtocol" mais je n'y arrive pas. Le serveur démarre mais donne un message d'erreur lorsque l'on essaye de s'y connecter. Voici le code de mon serveur avec authentification et plus bas le message d'eeur dans la console du serveur: [code] from zope.interface import Interface, implements from twisted.internet.protocol import ServerFactory, Protocol from twisted.conch.telnet import AuthenticatingTelnetProtocol, StatefulTelnetProtocol, ITelnetProtocol from twisted.cred import portal, checkers, credentials, error as credError from twisted.protocols import basic from twisted.internet import protocol, reactor, defer from zope.interface import Interface, implements class PasswordDictChecker(object): implements(checkers.ICredentialsChecker) credentialInterfaces = (credentials.IUsernamePassword,) ## credentialInterfaces = (ITelnetProtocol,) def __init__(self, passwords): "passwords: a dict-like object mapping usernames to passwords" print "DEBUG - PasswordDictChecker - __init__" self.passwords = passwords print "DEBUG - PasswordDictChecker - self.passwords", self.passwords def requestAvatarId(self, credentials): print "DEBUG - PasswordDictChecker - requestAvatarId - credentials", credentials username = credentials.username if self.passwords.has_key(username): if credentials.password == self.passwords[username]: return defer.succeed(username) else: return defer.fail( credError.UnauthorizedLogin("Bad password")) else: return defer.fail( credError.UnauthorizedLogin("No such user")) class INamedUserAvatar(Interface): "should have attributes username and fullname" print "DEBUG - INamedUserAvatar :", Interface class NamedUserAvatar: implements(INamedUserAvatar) def __init__(self, username, fullname): self.username = username self.fullname = fullname print "DEBUG - NamedUserAvatar - __init__ :", username, fullname class INamedUserAvatar2(ITelnetProtocol): "should have attributes username and fullname" #print "DEBUG - INamedUserAvatar :", Interface class NamedUserAvatar2: implements(INamedUserAvatar2) def __init__(self, username, fullname): self.username = username self.fullname = fullname print "DEBUG - NamedUserAvatar - __init__ :", username, fullname class TestRealm: print "DEBUG - class TestRealm" implements(portal.IRealm) print "DEBUG - class TestRealm - after implements" def __init__(self, users): print "DEBUG - class TestRealm - __init__ users", users self.users = users def requestAvatar(self, avatarId, mind, *interfaces): print "DEBUG - class TestRealm - requestAvatar" print "*interfaces", interfaces if INamedUserAvatar in interfaces: print "DEBUG: requestAvatar - avatarId :", avatarId print "DEBUG: requestAvatar - self.users[avatarId] :", self.users[avatarId] fullname = self.users[avatarId] logout = lambda: None print "DEBUG: INamedUserAvatar :",INamedUserAvatar print "DEBUG: NamedUserAvatar(avatarId, fullname) :", NamedUserAvatar(avatarId, fullname) return (INamedUserAvatar, NamedUserAvatar(avatarId, fullname), logout) elif INamedUserAvatar2 in interfaces: print "DEBUG2: requestAvatar - avatarId :", avatarId print "DEBUG2: requestAvatar - self.users[avatarId] :", self.users[avatarId] fullname = self.users[avatarId] logout = lambda: None print "DEBUG2: INamedUserAvatar :",ITelnetProtocol print "DEBUG2: NamedUserAvatar(avatarId, fullname) :", TelnetProtocol(avatarId, fullname) return (INamedUserAvatar2, NamedUserAvatar2(avatarId, fullname), logout) else: print "DEBUG: requestAvatar - requestAvatar -else :", avatarId raise KeyError("None of the requested interfaces is supported") class LoginTestProtocol(AuthenticatingTelnetProtocol): print "DEBUG: LoginTestProtocol" class LoginTestFactory(protocol.ServerFactory): protocol = LoginTestProtocol def __init__(self, portal): print "DEBUG: LoginTestFactory - __init__ - portal:" self.portal = portal print "DEBUG: LoginTestFactory - __init__ - portal after", repr(self.portal) users = { 'admin': 'Admin User', 'user1': 'Joe Smith', 'user2': 'Bob King', } passwords = { 'admin': 'aaa', 'user1': 'bbb', 'user2': 'ccc' } if __name__ == "__main__": p = portal.Portal(TestRealm(users)) p.registerChecker(PasswordDictChecker(passwords)) factory = LoginTestFactory(p) reactor.listenTCP(2323, factory) reactor.run( ) [/code] et voici le message d'erreur s'affichant dans la console du serveur [code] D:\workspace\Twisted_example>Telnet_Server_with_auth.py DEBUG - INamedUserAvatar : DEBUG - class TestRealm DEBUG - class TestRealm - after implements DEBUG: LoginTestProtocol DEBUG - class TestRealm - __init__ users {'admin': 'Admin User', 'user2': 'Bob King', 'user1': 'Joe Smith'} DEBUG - PasswordDictChecker - __init__ DEBUG - PasswordDictChecker - self.passwords {'admin': 'aaa', 'user2': 'ccc', 'user1': 'bbb'} DEBUG: LoginTestFactory - __init__ - portal: DEBUG: LoginTestFactory - __init__ - portal after Traceback (most recent call last): File "C:\Python25\lib\site-packages\twisted\python\log.py", line 69, in callWithContext return context.call({ILogContext: newCtx}, func, *args, **kw) File "C:\Python25\lib\site-packages\twisted\python\context.py", line 59, in callWithContext return self.currentContext().callWithContext(ctx, func, *args, **kw) File "C:\Python25\lib\site-packages\twisted\python\context.py", line 37, in callWithContext return func(*args,**kw) File "C:\Python25\lib\site-packages\twisted\internet\selectreactor.py", line 146, in _doReadOrWrite why = getattr(selectable, method)() --- --- File "C:\Python25\lib\site-packages\twisted\internet\tcp.py", line 932, in doRead protocol = self.factory.buildProtocol(self._buildAddr(addr)) File "C:\Python25\lib\site-packages\twisted\internet\protocol.py", line 98, in buildProtocol p = self.protocol() exceptions.TypeError: __init__() takes exactly 2 arguments (1 given) [/code] Cela fait maintenant deux semaine que j'essaye de l'intéger mais je cromprends pas pourquoi cela ne fonctionne pas. Si quelqu'un pouvait me dire comment faire ... Merci d'avance Philippe

Re: AuthenticatingTelnetProtocol pour créer un serveur Telnet

Posté par filoupython le 18/08/2009 10:32
En espérant que mon message s'affiche correctement


Bonjour,

Je suis nouveau sur ce forum.
J'espère y trouver de l'aide et dans la mesure du possible pouvoir aider les autres ...

J'ai déjà réussi à créer un serveur telnet pour windows en python.
Celui-ci à la particularité de pourvoir démarrer des programmes graphiques s'affichant sur l'écran du serveur. (Ex: si le client tape "notepad" dans sa console, le programme notepad s'affichera sur le bureau windows du serveur).
Mon serveur à presque tout ce qu'il me faut sauf l'authentification par login/mot de passe.

Je me suis inspiré du code source "simplecred.py" que l'on trouve à cette adresse (livre O'Relly Twisted network programming essentials).

J'ai essayé d'utiliser "AuthenticatingTelnetProtocol" mais je n'y arrive pas.
Le serveur démarre mais donne un message d'erreur lorsque l'on essaye de s'y connecter.

Voici le code de mon serveur avec authentification et plus bas le message d'eeur dans la console du serveur:

code:
from zope.interface import Interface, implements

from twisted.internet.protocol import ServerFactory, Protocol
from twisted.conch.telnet import AuthenticatingTelnetProtocol, StatefulTelnetProtocol, ITelnetProtocol


from twisted.cred import portal, checkers, credentials, error as credError
from twisted.protocols import basic
from twisted.internet import protocol, reactor, defer
from zope.interface import Interface, implements

class PasswordDictChecker(object):
    implements(checkers.ICredentialsChecker)
    credentialInterfaces = (credentials.IUsernamePassword,)
##    credentialInterfaces = (ITelnetProtocol,)

    def __init__(self, passwords):
        "passwords: a dict-like object mapping usernames to passwords"
        print "DEBUG - PasswordDictChecker - __init__"
        self.passwords = passwords
        print "DEBUG - PasswordDictChecker - self.passwords", self.passwords

    def requestAvatarId(self, credentials):
        print "DEBUG - PasswordDictChecker - requestAvatarId - credentials", credentials
        username = credentials.username
        if self.passwords.has_key(username):
            if credentials.password == self.passwords:
return defer.succeed(username)
else:
return defer.fail(
credError.UnauthorizedLogin("Bad password"))
else:
return defer.fail(
credError.UnauthorizedLogin("No such user"))

class INamedUserAvatar(Interface):
"should have attributes username and fullname"
print "DEBUG - INamedUserAvatar :", Interface

class NamedUserAvatar:
implements(INamedUserAvatar)
def __init__(self, username, fullname):
self.username = username
self.fullname = fullname
print "DEBUG - NamedUserAvatar - __init__ :", username, fullname

class INamedUserAvatar2(ITelnetProtocol):
"should have attributes username and fullname"
#print "DEBUG - INamedUserAvatar :", Interface

class NamedUserAvatar2:
implements(INamedUserAvatar2)
def __init__(self, username, fullname):
self.username = username
self.fullname = fullname
print "DEBUG - NamedUserAvatar - __init__ :", username, fullname


class TestRealm:
print "DEBUG - class TestRealm"
implements(portal.IRealm)
print "DEBUG - class TestRealm - after implements"

def __init__(self, users):
print "DEBUG - class TestRealm - __init__ users", users
self.users = users

def requestAvatar(self, avatarId, mind, *interfaces):
print "DEBUG - class TestRealm - requestAvatar"
print "*interfaces", interfaces
if INamedUserAvatar in interfaces:
print "DEBUG: requestAvatar - avatarId :", avatarId
print "DEBUG: requestAvatar - self.users:", self.users
fullname = self.users
logout = lambda: None
print "DEBUG: INamedUserAvatar :",INamedUserAvatar
print "DEBUG: NamedUserAvatar(avatarId, fullname) :", NamedUserAvatar(avatarId, fullname)
return (INamedUserAvatar,
NamedUserAvatar(avatarId, fullname),

logout)
elif INamedUserAvatar2 in interfaces:
print "DEBUG2: requestAvatar - avatarId :", avatarId
print "DEBUG2: requestAvatar - self.users:", self.users
fullname = self.users
logout = lambda: None
print "DEBUG2: INamedUserAvatar :",ITelnetProtocol
print "DEBUG2: NamedUserAvatar(avatarId, fullname) :", TelnetProtocol(avatarId, fullname)
return (INamedUserAvatar2, NamedUserAvatar2(avatarId, fullname), logout)
else:
print "DEBUG: requestAvatar - requestAvatar -else :", avatarId
raise KeyError("None of the requested interfaces is supported")

class LoginTestProtocol(AuthenticatingTelnetProtocol):
print "DEBUG: LoginTestProtocol"

class LoginTestFactory(protocol.ServerFactory):
protocol = LoginTestProtocol

def __init__(self, portal):
print "DEBUG: LoginTestFactory - __init__ - portal:"
self.portal = portal
print "DEBUG: LoginTestFactory - __init__ - portal after", repr(self.portal)



users = {
'admin': 'Admin User',
'user1': 'Joe Smith',
'user2': 'Bob King',
}

passwords = {
'admin': 'aaa',
'user1': 'bbb',
'user2': 'ccc'
}

if __name__ == "__main__":
p = portal.Portal(TestRealm(users))
p.registerChecker(PasswordDictChecker(passwords))
factory = LoginTestFactory(p)
reactor.listenTCP(2323, factory)
reactor.run( )


et voici le message d'erreur s'affichant dans la console du serveur
code:
D:\workspace\Twisted_example>Telnet_Server_with_auth.py
DEBUG - INamedUserAvatar : <InterfaceClass zope.interface.Interface>
DEBUG - class TestRealm
DEBUG - class TestRealm - after implements
DEBUG: LoginTestProtocol
DEBUG - class TestRealm - __init__ users {'admin': 'Admin User', 'user2': 'Bob King', 'user1': 'Joe Smith'}
DEBUG - PasswordDictChecker - __init__
DEBUG - PasswordDictChecker - self.passwords {'admin': 'aaa', 'user2': 'ccc', 'user1': 'bbb'}
DEBUG: LoginTestFactory - __init__ - portal:
DEBUG: LoginTestFactory - __init__ - portal after <twisted.cred.portal.Portal instance at 0x00F11CD8>
Traceback (most recent call last):
  File "C:\Python25\lib\site-packages\twisted\python\log.py", line 69, in callWithContext
    return context.call({ILogContext: newCtx}, func, *args, **kw)
  File "C:\Python25\lib\site-packages\twisted\python\context.py", line 59, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "C:\Python25\lib\site-packages\twisted\python\context.py", line 37, in callWithContext
    return func(*args,**kw)
  File "C:\Python25\lib\site-packages\twisted\internet\selectreactor.py", line 146, in _doReadOrWrite
    why = getattr(selectable, method)()
--- <exception caught here> ---
  File "C:\Python25\lib\site-packages\twisted\internet\tcp.py", line 932, in doRead
    protocol = self.factory.buildProtocol(self._buildAddr(addr))
  File "C:\Python25\lib\site-packages\twisted\internet\protocol.py", line 98, in buildProtocol
    p = self.protocol()
exceptions.TypeError: __init__() takes exactly 2 arguments (1 given)


Cela fait maintenant deux semaine que j'essaye de l'intéger mais je cromprends pas pourquoi cela ne fonctionne pas.

Si quelqu'un pouvait me dire comment faire ...

Merci d'avance

Philippe

Python.org : Le site officiel du langage Python.
Zope.org : Le site web officiel de Zope.
Daily Python-URL : Actus de l'univers Python.
Tribute to Zyons : Zyons notre ami et membre fondateur de l'Afpy, nous quittait en 2005.