[Twisted-Python] PB checkers bug?
Steve Freitas
sflist at ihonk.com
Wed Jul 27 22:22:50 MDT 2005
Hi all,
I didn't get a reply to my earlier post about inventing mad crazy
checkers, so I decided to just use the IUsernamePassword interface, but
I'm stuck, because it appears PB won't allow me to use only that
interface. If I try, it dies like this:
Traceback (most recent call last):
Failure: twisted.cred.error.UnhandledCredentials: No checker for
twisted.cred.credentials.IUsernameHashedPassword,
twisted.spread.pb.IUsernameMD5Password,
twisted.spread.interfaces.IJellyable
To reproduce the error, all you have to do is tweak
InMemoryUsernamePasswordDatabaseDontUse to only implement
IUsernamePassword. I've prepared the code below for a client and a
server to demonstrate the issue. Am I just missing something? If not,
should the inability to use IUsernamePassword alone be filed as a bug?
Anybody?
Thanks,
Steve
-----------------
This is the server:
#!/usr/bin/python
from twisted.cred import checkers, credentials, portal
from twisted.internet import reactor
from twisted.spread import pb
from zope import interface
class MyRealm:
__implements__ = portal.IRealm
def requestAvatar(self, avatarId, mind, *interfaces):
print "Success! We'll never get here. :-("
return pb.IPerspective, pb.Avatar(), lambda: reactor.stop()
# So we use a simple checker...
the_checker = \
checkers.InMemoryUsernamePasswordDatabaseDontUse(client1='abc')
# ...and now let's perform the problematic modification:
the_checker.credentialInterfaces = (credentials.IUsernamePassword,)
the_realm = MyRealm()
the_portal = portal.Portal(the_realm)
the_portal.registerChecker(the_checker)
the_factory = pb.PBServerFactory(the_portal)
reactor.listenTCP(8800, the_factory)
reactor.run()
-----------------
This is the client:
#!/usr/bin/python
from twisted.spread import pb
from twisted.internet import reactor
from twisted.python import log
from twisted.cred import credentials
import sys
log.startLogging(sys.stdout, 0)
the_factory = pb.PBClientFactory()
reactor.connectTCP('localhost', 8800, the_factory)
d = the_factory.login(credentials.UsernamePassword('client1', 'abc'))
d.addCallback(lambda x: log.msg('Success! Won\'t happen.'))
d.addErrback(lambda x: log.msg('We died:', x))
reactor.run()
--
Steve Freitas <sflist at ihonk.com>
More information about the Twisted-Python
mailing list