Python sleekxmpp线程身份验证

Python sleekxmpp线程身份验证,python,xmpp,Python,Xmpp,所以。。。我有一个简单的聊天客户端,如下所示: class ChatClient(sleekxmpp.ClientXMPP): def __init__(self, jid, password, server): sleekxmpp.ClientXMPP.__init__(self, jid, password, ssl=True) self.add_event_handler("session_start", self.start)

所以。。。我有一个简单的聊天客户端,如下所示:

class ChatClient(sleekxmpp.ClientXMPP):
    def __init__(self, jid, password, server):
        sleekxmpp.ClientXMPP.__init__(self, jid, password, ssl=True)

        self.add_event_handler("session_start", self.start)

        self.register_plugin('xep_0030')
        self.register_plugin('xep_0004')
        self.register_plugin('xep_0060')
        self.register_plugin('xep_0199')

        self.ssl_version = ssl.PROTOCOL_SSLv3
        self.connected = self.connect()
        if self.connected:
            self.process(threaded=True)


    def start(self, event):
        self.send_presence(priority = "-9001")
        self.get_roster(blocking = True, timeout = 3)

    def message(self, targets, msg):
        for target in targets:
            self.send_message(target, msg)
我有一个“验证”功能,确保您正确输入用户名/密码:

def authenticate(username, password, server):
    xmppuser = username + '@' + server
    passTester = ChatClient(xmppuser, password)

    passTester.disconnect(wait = True)
    authenticated = passTester.authenticated
    return authenticated
现在,问题出现在我将聊天客户端作为线程的情况下,我遇到了这样的情况:在服务器有机会实际连接之前,我尝试检查ChatClient.authenticated。如您所见,我试图“等待”断开连接,但发送队列中没有任何内容,因此它会立即断开连接

我尝试过的另一种方法是:

def authenticate(username, password, server):
    xmppuser = username + '@' + server
    passTester = ChatClient(xmppuser, password)

    passTester.message('bogusName', 'ladfhkjdglkhjdfg')
    passTester.disconnect(wait = True)
    authenticated = passTester.authenticated
    return authenticated
现在,我发送了一个虚假的消息,断开连接的呼叫有一些等待。当我使用此代码输入正确的用户名/密码时,断开连接将等待消息发送(包括等待真正的连接),不发送任何内容,并且ChatClient.authenticated设置为True

不幸的是,当我输入错误的用户名/密码时,消息永远不会被发送,断开连接(wait=True)也永远不会断开,因为消息永远不会被发送


其他人有更合适的“身份验证”方法吗?

这将是将
.authenticated
和相关字段更改为
threading.Event
对象的一个很好的理由,这样您就可以在这种情况下使用
wait()
,但我不确定这会在多大程度上破坏现有的用户代码

但除了修改SleekXMPP之外,您需要做的是等待某些事件触发。例如,如果您的客户端成功地进行了身份验证,则将出现一个
session\u start
事件(稍后我可能会添加一个
auth\u success
或类似事件)。同样,如果单个机制的身份验证失败,则将出现
失败\u auth
事件。如果根本没有成功的身份验证方法(这是您感兴趣的),将出现
no\u auth
事件

因此,您可以为这些事件添加处理程序,并让这些处理程序在队列中放置令牌,然后等待所需的令牌到达

class ChatClient(ClientXMPP):
    def __init__(self, ...):
        ...
        self.auth_queue = queue.Queue()
        self.add_event_handler('no_auth', self.failed)

    def start(self, event):
        self.auth_queue.put('success')
        ...

    def failed(self, event):
        self.auth_queue.put('failed')


def authenticate(username, password, server):
    xmppuser = username + '@' + server
    passTester = ChatClient(xmppuser, password)
    try:
        result = passTester.auth_queue.get(timeout=10)
    except queue.Empty:
        result = 'failed'
    passTester.disconnect()
    return result == 'success'
别忘了我们还有聊天室sleek@conference.jabber.org.


--兰斯

谢谢你,我当时正在绞尽脑汁寻找irc频道。我想我没有足够的咖啡来想象你会有一个xmpp房间。明天早上我回去工作时,我会测试这个解决方案并给你一个接受。