From 84525604eb414fa5eea88f96bfcc9865ce3020eb Mon Sep 17 00:00:00 2001 From: David Rousselie Date: Tue, 22 May 2007 08:00:00 +0200 Subject: [PATCH] Message handler can now handle multiple message types * each message type to be handle must add a filter function and a handler function tuple to the msg_handlers attribut of JCLComponent darcs-hash:20070522060000-86b55-0e8fa4afa2d57743d5cabe1a46cc3d24cc62b294.gz --- src/jcl/jabber/component.py | 47 ++++++++++++++++++------------- src/jcl/jabber/tests/component.py | 4 ++- 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/jcl/jabber/component.py b/src/jcl/jabber/component.py index 6c90d1c..f2cd125 100644 --- a/src/jcl/jabber/component.py +++ b/src/jcl/jabber/component.py @@ -1,4 +1,4 @@ -# -*- coding: UTF-8 -*- +# -*- coding: utf-8 -*- ## ## component.py ## Login : David Rousselie @@ -93,7 +93,8 @@ class JCLComponent(Component, object): self.time_unit = 60 self.queue = Queue(100) self.account_manager = AccountManager(self) - + self.msg_handlers = [] + self.__logger = logging.getLogger("jcl.jabber.JCLComponent") self.lang = lang self.running = False @@ -204,6 +205,24 @@ class JCLComponent(Component, object): self.handle_message) self.send_stanzas(self.account_manager.probe_all_accounts_presence()) + def password_msg_handler_filter(message, _account): + return hasattr(_account, 'password') \ + and hasattr(_account, 'waiting_password_reply') \ + and re.compile("\[PASSWORD\]").search(message.get_subject()) \ + is not None + + def password_msg_handler(message, _account): + lang_class = self.lang.get_lang_class_from_node(message.get_node()) + _account.password = message.get_body() + _account.waiting_password_reply = False + msg = Message(from_jid = _account.jid, \ + to_jid = message.get_from(), \ + stanza_type = "normal", \ + subject = lang_class.password_saved_for_session, \ + body = lang_class.password_saved_for_session) + self.stream.send(msg) + self.msg_handlers += [(password_msg_handler, password_msg_handler_filter)] + def signal_handler(self, signum, frame): """Stop method handler """ @@ -441,27 +460,17 @@ class JCLComponent(Component, object): Handle password response message """ self.__logger.debug("MESSAGE: " + message.get_body()) - lang_class = self.lang.get_lang_class_from_node(message.get_node()) name = message.get_to().node - base_from_jid = unicode(message.get_from().bare()) + bare_from_jid = unicode(message.get_from().bare()) self.db_connect() accounts = Account.select(\ AND(Account.q.name == name, \ - Account.q.user_jid == base_from_jid)) - if accounts.count() == 1: - _account = list(accounts)[0] - if hasattr(_account, 'password') \ - and hasattr(_account, 'waiting_password_reply') \ - and re.compile("\[PASSWORD\]").search(message.get_subject()) \ - is not None: - _account.password = message.get_body() - _account.waiting_password_reply = False - msg = Message(from_jid = _account.jid, \ - to_jid = message.get_from(), \ - stanza_type = "normal", \ - subject = lang_class.password_saved_for_session, \ - body = lang_class.password_saved_for_session) - self.stream.send(msg) + Account.q.user_jid == bare_from_jid)) + if accounts.count() != 1: + print >>sys.stderr, "Account " + name + " for user " + bare_from_jid + " must be uniq" + for (msg_handler, filter_func) in self.msg_handlers: + if filter_func(message, accounts[0]): + msg_handler(message, accounts[0]) self.db_disconnect() return 1 diff --git a/src/jcl/jabber/tests/component.py b/src/jcl/jabber/tests/component.py index 19352fb..576339a 100644 --- a/src/jcl/jabber/tests/component.py +++ b/src/jcl/jabber/tests/component.py @@ -1880,6 +1880,7 @@ class JCLComponent_TestCase(unittest.TestCase): def test_handle_message_password(self): self.comp.stream = MockStream() self.comp.stream_class = MockStream + self.comp.authenticated() account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL) account11 = Account(user_jid = "user1@test.com", \ name = "account11", \ @@ -1901,9 +1902,10 @@ class JCLComponent_TestCase(unittest.TestCase): self.assertEqual(len(messages_sent), 0) def test_handle_message_password_complex(self): - account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL) self.comp.stream = MockStream() self.comp.stream_class = MockStream + self.comp.authenticated() + account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL) account11 = ExampleAccount(user_jid = "user1@test.com", \ name = "account11", \ jid = "account11@jcl.test.com")