AuthenticatingTelnetProtocol pour créer un serveur Telnet
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 :
Simple_Telnet_Server.py
(2.5 Kb)
|
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
et voici le message d'erreur s'affichant dans la console du serveur code: D:\workspace\Twisted_example>Telnet_Server_with_auth.py
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
Telnet_Server_with_auth.py
(5.8 Kb)
|




