Index: twisted/internet/passport.py =================================================================== RCS file: /cvs/Twisted/twisted/internet/passport.py,v retrieving revision 1.14 diff -u -u -r1.14 passport.py --- twisted/internet/passport.py 2001/10/09 06:53:41 1.14 +++ twisted/internet/passport.py 2001/10/23 16:30:59 @@ -296,7 +296,12 @@ md = md5.new() md.update(plaintext) userPass = md.digest() - return (userPass == self.hashedPassword) + req = defer.Deferred() + if userPass == self.hashedPassword: + req.callback(self) + else: + req.errback(self) + return req # TODO: service discovery through listing of self.keyring. Index: twisted/reality/plumbing.py =================================================================== RCS file: /cvs/Twisted/twisted/reality/plumbing.py,v retrieving revision 1.10 diff -u -u -r1.10 plumbing.py --- twisted/reality/plumbing.py 2001/09/06 23:36:25 1.10 +++ twisted/reality/plumbing.py 2001/10/23 16:31:00 @@ -64,36 +64,41 @@ return 'Command' return "Pending" + def loginSuccessful(self, ident): + # The identity checks out. + characters = [] + # XXX REFACTOR: Hmm. Is this next bit common behavior? + r = self.factory.reality + nm = r.getServiceName() + for serviceName, perspectiveName in identity.getAllKeys(): + if serviceName == nm: + characters.append(r.getPerspectiveNamed(perspectiveName)) + lc = len(characters) + if lc == 1: + p = characters[0] + elif lc > 1: + p = characters[0] + self.transport.write("TODO: character selection menu\r\n") + else: + raise passport.Unauthorized("that identity has no TR characters") + + p = p.attached(self, identity) + self.player = p + self.identity = identity + self.transport.write("Hello "+self.player.name+", welcome to Reality!\r\n"+ + telnet.IAC+telnet.WONT+telnet.ECHO) + self.mode = "Command" + + def loginFailure(self, ident): + log.msg("incorrect password") + self.transport.loseConnection() + def loggedIn(self, identity): """The player's identity has been retrieved. Now, check their password. """ - if identity.verifyPlainPassword(self.pw): - # The identity checks out. - characters = [] - # XXX REFACTOR: Hmm. Is this next bit common behavior? - r = self.factory.reality - nm = r.getServiceName() - for serviceName, perspectiveName in identity.getAllKeys(): - if serviceName == nm: - characters.append(r.getPerspectiveNamed(perspectiveName)) - lc = len(characters) - if lc == 1: - p = characters[0] - elif lc > 1: - p = characters[0] - self.transport.write("TODO: character selection menu\r\n") - else: - raise passport.Unauthorized("that identity has no TR characters") - - p = p.attached(self, identity) - self.player = p - self.identity = identity - self.transport.write("Hello "+self.player.name+", welcome to Reality!\r\n"+ - telnet.IAC+telnet.WONT+telnet.ECHO) - self.mode = "Command" - else: - log.msg("incorrect password") - self.transport.loseConnection() + pwrq = identity.verifyPlainPassword(self.pw) + pwrq.addCallbacks(self.loginSuccessful, self.loginFailure) + pwrq.arm() def notLoggedIn(self, err): log.msg('requested bad username') Index: twisted/web/guard.py =================================================================== RCS file: /cvs/Twisted/twisted/web/guard.py,v retrieving revision 1.1 diff -u -u -r1.1 guard.py --- twisted/web/guard.py 2001/09/08 11:09:43 1.1 +++ twisted/web/guard.py 2001/10/23 16:31:01 @@ -21,6 +21,7 @@ # Twisted Imports from twisted.internet import passport +from twisted.python import defer # Sibling Imports import error @@ -40,22 +41,51 @@ def __init__(self, reqauth): self.reqauth = reqauth - def gotIdentity(self, ident, password, request, perspectiveName): - if ident.verifyPlainPassword(password): - try: - perspective = ident.getPerspectiveForKey(self.reqauth.serviceName, perspectiveName) - except KeyError: - traceback.print_exc() - else: - resKey = string.join(['AUTH',self.reqauth.serviceName]+request.prepath, '_') - setattr(request.getSession(), resKey, perspective) - return self.reqauth.reallyRender(request) + def loginSuccessful(self, ident, request, perspectiveName): + try: + perspective = ident.getPerspectiveForKey(self.reqauth.serviceName, perspectiveName) + except KeyError: + traceback.print_exc() + # TODO: render the form as if an exception were thrown from the + # data processing step... + request.write(""" +