2

Jessica McKellar と Abe Fetting による本 Twisted Network Programming Essentials 2nd edition に行きます。次のツイストされた信用認証の例 9-1 に行き詰まっています。コードを 1 行ずつ、1 文字ずつ再確認しました。コードが実行され、telnet クライアントに接続して「ユーザー パス」を入力すると、ログインできません。承認されていないというメッセージが表示されます。スクリプト自体は、エラー メッセージや例外を生成しません。

ありがとう

import sys
from zope.interface import implements, Interface

from twisted.cred import checkers, credentials, portal
from twisted.internet import protocol, reactor
from twisted.protocols import basic
from twisted.python.log import startLogging; startLogging(sys.stdout)

class IPortocolAvatar(Interface):
    def logout():
        """
        Clean up per-login resource allocated to this avatar.
        """

class EchoAvatar(object):
    implements(IPortocolAvatar)

    def logout(self):
        pass

class Echo(basic.LineReceiver):
    portal = None
    avatar = None
    logout = None

    def connectionLost(self, reason):
        if self.logout:
            self.logout()
            self.avatar = None
            self.logout = None

    def lineReceived(self, line):
        if not self.avatar:
            # print "line [32]: %s" % (line,)
            username, password = line.strip().split(" ")
            self.tryLogin(username, password)

        else:
            self.sendLine(line)

    def tryLogin(self, username, password):
        self.portal.login(credentials.UsernamePassword(username, password), None, PortocolAvatar).addCallbacks(self._cbLogin, self._ebLogin)

    def _cbLogin(self, (interface, avatar, logout)):
        self.avatar = avatar
        self.logout = logout
        self.sendLine("Login sucessful, please proceed.")

    def _ebLogin(self, failure):
        self.sendLine("Login denied, goodbye.")
        self.transport.loseConnection()

class EchoFactory(protocol.Factory):
    def __init__(self, portal):
        self.portal = portal

    def buildProtocol(self, addr):
        proto = Echo()
        proto.portal = self.portal
        return proto

class Realm(object):
    implements(portal.IRealm)

    def requestAvatar(self, avatarId, mind, *interfaces):
        if IPortocolAvatar in interfaces:
            avatar = EchoAvatar()
            return IPortocolAvatar, avatar, avatar.logout

        raise NotImplementedError(
            "This realm only supports the IPortocolAvatar interface.")

realm = Realm()
myPortal = portal.Portal(realm)
checker = checkers.InMemoryUsernamePasswordDatabaseDontUse()
checker.addUser("user", "pass")
myPortal.registerChecker(checker)

reactor.listenTCP(8000, EchoFactory(myPortal))
reactor.run()
4

2 に答える 2

3

tryLogin( ProtocolAvatar-> )にタイプミスがありますIProtocolAvatar:

def tryLogin(self, username, password):
    self.portal.login(credentials.UsernamePassword(username, password), None, IProtocolAvatar).addCallbacks(self._cbLogin, self._ebLogin)
    #                                                                         ^

アップデート

別のタイプミスがあります: IPortocolAvatar-> IProtocolAvatar.

サーバーを実行した後、次のテスト クライアント コードを試してください。

import telnetlib
import time

t = telnetlib.Telnet('localhost', 8000)
t.write(b'user pass\r\n')
t.write(b'blah blah\r\n')
time.sleep(1)
print(t.read_eager())
于 2013-10-04T01:52:48.653 に答える