diff options
author | David Rousselie <dax@happycoders.org> | 2007-06-28 00:22:36 +0400 |
---|---|---|
committer | David Rousselie <dax@happycoders.org> | 2007-06-28 00:22:36 +0400 |
commit | 620b500e0bed3f6f294c255a974859607768bdb9 (patch) | |
tree | 714e292433075a3a5d0a10389c98ad85b71dc0d1 | |
parent | 545b0dca1c031c76d684723e930765baac860d1c (diff) |
some module refactoring
darcs-hash:20070627202236-86b55-8a2b80e157cdfb307943c9e2643fc0cd97e87ec7.gz
-rw-r--r-- | src/jmc/jabber/__init__.py | 31 | ||||
-rw-r--r-- | src/jmc/jabber/component.py | 161 | ||||
-rw-r--r-- | src/jmc/jabber/message.py | 108 | ||||
-rw-r--r-- | src/jmc/jabber/presence.py | 84 | ||||
-rw-r--r-- | src/jmc/jabber/tests/component.py | 13 | ||||
-rw-r--r-- | src/jmc/model/account.py | 4 |
6 files changed, 240 insertions, 161 deletions
diff --git a/src/jmc/jabber/__init__.py b/src/jmc/jabber/__init__.py index e90a3dc..68578b1 100644 --- a/src/jmc/jabber/__init__.py +++ b/src/jmc/jabber/__init__.py @@ -1,2 +1,33 @@ """Jabber component classes""" __revision__ = "" + +import re + +from jcl.jabber import Handler +from jcl.model.account import Account + +from jmc.model.account import NoAccountError, SMTPAccount + +class MailHandler(Handler): + """Define filter for email address in JID""" + + def __init__(self): + Handler.__init__(self) + self.dest_jid_regexp = re.compile(".*%.*") + + def filter(self, stanza, lang_class): + """Return empty array if JID match '.*%.*@componentJID'""" + node = stanza.get_to().node + if node is not None and self.dest_jid_regexp.match(node): + bare_from_jid = unicode(stanza.get_from().bare()) + accounts = Account.select(Account.q.user_jid == bare_from_jid) + if accounts.count() == 0: + raise NoAccountError() + else: + default_account = accounts.newClause(\ + SMTPAccount.q.default_account == True) + if default_account.count() > 0: + return default_account + else: + return accounts + return None diff --git a/src/jmc/jabber/component.py b/src/jmc/jabber/component.py index 8590a94..43ba2c4 100644 --- a/src/jmc/jabber/component.py +++ b/src/jmc/jabber/component.py @@ -31,19 +31,18 @@ from pyxmpp.message import Message from pyxmpp.jid import JID from jcl.model.account import Account, PresenceAccount, LegacyJID -from jcl.jabber.component import Handler, DefaultSubscribeHandler, \ - DefaultUnsubscribeHandler, DefaultPresenceHandler, AccountManager +from jcl.jabber.component import Handler, AccountManager from jcl.jabber.feeder import FeederComponent, Feeder, MessageSender, \ HeadlineSender, FeederHandler +from jmc.jabber.message import SendMailMessageHandler, \ + RootSendMailMessageHandler +from jmc.jabber.presence import MailSubscribeHandler, \ + MailUnsubscribeHandler, MailPresenceHandler from jmc.model.account import MailAccount, IMAPAccount, POP3Account, \ SMTPAccount from jmc.lang import Lang -class NoAccountError(Exception): - """Error raised when no corresponding account is found.""" - pass - class MailComponent(FeederComponent): """Jabber Mail Component main implementation""" @@ -224,156 +223,6 @@ class MailSender(HeadlineSender): message = None return message -class MailHandler(Handler): - """Define filter for email address in JID""" - - def __init__(self): - Handler.__init__(self) - self.dest_jid_regexp = re.compile(".*%.*") - - def filter(self, stanza, lang_class): - """Return empty array if JID match '.*%.*@componentJID'""" - node = stanza.get_to().node - if node is not None and self.dest_jid_regexp.match(node): - bare_from_jid = unicode(stanza.get_from().bare()) - accounts = Account.select(Account.q.user_jid == bare_from_jid) - if accounts.count() == 0: - raise NoAccountError() - else: - default_account = accounts.newClause(\ - SMTPAccount.q.default_account == True) - if default_account.count() > 0: - return default_account - else: - return accounts - return None - -class MailPresenceHandler(DefaultPresenceHandler): - """Define filter for legacy JIDs presence handling""" - def __init__(self): - Handler.__init__(self) - self.dest_jid_regexp = re.compile(".*%.*") - - def filter(self, stanza, lang_class): - """Return empty array if JID match '.*%.*@componentJID'""" - node = stanza.get_to().node - if node is not None and self.dest_jid_regexp.match(node): - bare_from_jid = unicode(stanza.get_from().bare()) - return [] # Not None - return None - -class SendMailMessageHandler(MailHandler): - def __init__(self): - MailHandler.__init__(self) - self.__logger = logging.getLogger(\ - "jmc.jabber.component.SendMailMessageHandler") - - def send_mail_result(self, message, lang_class, to_email): - return [Message(from_jid=message.get_to(), - to_jid=message.get_from(), - subject=lang_class.send_mail_ok_subject, - body=lang_class.send_mail_ok_body % (to_email))] - - def handle(self, message, lang_class, accounts): - to_node = message.get_to().node - to_email = to_node.replace('%', '@', 1) - accounts[0].send_email(\ - accounts[0].create_email(accounts[0].default_from, - to_email, - message.get_subject(), - message.get_body())) - return self.send_mail_result(message, lang_class, to_email) - -class RootSendMailMessageHandler(SendMailMessageHandler): - """Handle message sent to root JID""" - - def __init__(self): - SendMailMessageHandler.__init__(self) - self.to_regexp = re.compile("^\s*(to|TO|To)\s*:\s*(?P<to_email>.*)") - self.__logger = logging.getLogger(\ - "jmc.jabber.component.RootSendMailMessageHandler") - - def filter(self, message, lang_class): - name = message.get_to().node - bare_from_jid = unicode(message.get_from().bare()) - accounts = SMTPAccount.select(\ - AND(SMTPAccount.q.default_account == True, - SMTPAccount.q.user_jid == bare_from_jid)) - if accounts.count() != 1: - self.__logger.error("No default account found for user " + - str(bare_from_jid)) - if accounts.count() == 0: - accounts = SMTPAccount.select(\ - SMTPAccount.q.user_jid == bare_from_jid) - return accounts - - def handle(self, message, lang_class, accounts): - to_email = None - lines = message.get_body().split('\n') - message_body = [] - while to_email is None \ - and lines: - line = lines.pop(0) - match = self.to_regexp.match(line) - if match: - to_email = match.group("to_email") - else: - message_body.append(line) - message_body.extend(lines) - if to_email is not None: - accounts[0].send_email(\ - accounts[0].create_email(accounts[0].default_from, - to_email, - message.get_subject(), - "\n".join(message_body))) - return self.send_mail_result(message, lang_class, to_email) - else: - return [Message(from_jid=message.get_to(), - to_jid=message.get_from(), - stanza_type="error", - subject=lang_class.send_mail_error_no_to_header_subject, - body=lang_class.send_mail_error_no_to_header_body)] - -class MailSubscribeHandler(DefaultSubscribeHandler, MailHandler): - """Use DefaultSubscribeHandler handle method and MailHandler filter. - Filter email address in JID. Accept and add to LegacyJID table. - """ - - def __init__(self): - DefaultSubscribeHandler.__init__(self) - MailHandler.__init__(self) - - def filter(self, stanza, lang_class): - return MailHandler.filter(self, stanza, lang_class) - - def handle(self, stanza, lang_class, accounts): - result = DefaultSubscribeHandler.handle(self, stanza, lang_class, accounts) - to_node = stanza.get_to().node - to_email = to_node.replace('%', '@', 1) - LegacyJID(legacy_address=to_email, - jid=unicode(stanza.get_to()), - account=accounts[0]) - return result - -class MailUnsubscribeHandler(DefaultUnsubscribeHandler, MailHandler): - """Use DefaultUnsubscribeHandler handle method and MailHandler filter. - """ - - def __init__(self): - DefaultUnsubscribeHandler.__init__(self) - MailHandler.__init__(self) - - def filter(self, stanza, lang_class): - return MailHandler.filter(self, stanza, lang_class) - - def handle(self, stanza, lang_class, accounts): - result = DefaultUnsubscribeHandler.handle(self, stanza, lang_class, accounts) - legacy_jid = LegacyJID.select(\ - LegacyJID.q.jid == unicode(stanza.get_to())) - if legacy_jid.count() == 1: - legacy_jid[0].destroySelf() - return result - class MailFeederHandler(FeederHandler): def filter(self, stanza, lang_class): """Return only email account type to check mail from diff --git a/src/jmc/jabber/message.py b/src/jmc/jabber/message.py new file mode 100644 index 0000000..46843b8 --- /dev/null +++ b/src/jmc/jabber/message.py @@ -0,0 +1,108 @@ +## +## message.py +## Login : David Rousselie <dax@happycoders.org> +## Started on Wed Jun 27 22:08:23 2007 David Rousselie +## $Id$ +## +## Copyright (C) 2007 David Rousselie +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +## + +import logging +import re + +from sqlobject.sqlbuilder import AND + +from pyxmpp.message import Message + +from jmc.jabber import MailHandler +from jmc.model.account import SMTPAccount + +class SendMailMessageHandler(MailHandler): + def __init__(self): + MailHandler.__init__(self) + self.__logger = logging.getLogger(\ + "jmc.jabber.component.SendMailMessageHandler") + + def send_mail_result(self, message, lang_class, to_email): + return [Message(from_jid=message.get_to(), + to_jid=message.get_from(), + subject=lang_class.send_mail_ok_subject, + body=lang_class.send_mail_ok_body % (to_email))] + + def handle(self, stanza, lang_class, data): + message = stanza + accounts = data + to_node = message.get_to().node + to_email = to_node.replace('%', '@', 1) + accounts[0].send_email(\ + accounts[0].create_email(accounts[0].default_from, + to_email, + message.get_subject(), + message.get_body())) + return self.send_mail_result(message, lang_class, to_email) + +class RootSendMailMessageHandler(SendMailMessageHandler): + """Handle message sent to root JID""" + + def __init__(self): + SendMailMessageHandler.__init__(self) + self.to_regexp = re.compile("^\s*(to|TO|To)\s*:\s*(?P<to_email>.*)") + self.__logger = logging.getLogger(\ + "jmc.jabber.component.RootSendMailMessageHandler") + + def filter(self, stanza, lang_class): + name = stanza.get_to().node + bare_from_jid = unicode(stanza.get_from().bare()) + accounts = SMTPAccount.select(\ + AND(SMTPAccount.q.default_account == True, + SMTPAccount.q.user_jid == bare_from_jid)) + if accounts.count() != 1: + self.__logger.error("No default account found for user " + + str(bare_from_jid)) + if accounts.count() == 0: + accounts = SMTPAccount.select(\ + SMTPAccount.q.user_jid == bare_from_jid) + return accounts + + def handle(self, stanza, lang_class, data): + message = stanza + accounts = data + to_email = None + lines = message.get_body().split('\n') + message_body = [] + while to_email is None \ + and lines: + line = lines.pop(0) + match = self.to_regexp.match(line) + if match: + to_email = match.group("to_email") + else: + message_body.append(line) + message_body.extend(lines) + if to_email is not None: + accounts[0].send_email(\ + accounts[0].create_email(accounts[0].default_from, + to_email, + message.get_subject(), + "\n".join(message_body))) + return self.send_mail_result(message, lang_class, to_email) + else: + return [Message(from_jid=message.get_to(), + to_jid=message.get_from(), + stanza_type="error", + subject=lang_class.send_mail_error_no_to_header_subject, + body=lang_class.send_mail_error_no_to_header_body)] + diff --git a/src/jmc/jabber/presence.py b/src/jmc/jabber/presence.py new file mode 100644 index 0000000..9f9a49b --- /dev/null +++ b/src/jmc/jabber/presence.py @@ -0,0 +1,84 @@ +## +## presence.py +## Login : David Rousselie <dax@happycoders.org> +## Started on Wed Jun 27 22:05:08 2007 David Rousselie +## $Id$ +## +## Copyright (C) 2007 David Rousselie +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +## + +import re + +from jcl.jabber.presence import DefaultPresenceHandler, \ + DefaultSubscribeHandler, DefaultUnsubscribeHandler +from jcl.model.account import LegacyJID + +from jcl.jabber import Handler +from jmc.jabber import MailHandler + +class MailPresenceHandler(DefaultPresenceHandler): + """Define filter for legacy JIDs presence handling""" + def __init__(self): + Handler.__init__(self) + self.dest_jid_regexp = re.compile(".*%.*") + + def filter(self, stanza, lang_class): + """Return empty array if JID match '.*%.*@componentJID'""" + node = stanza.get_to().node + if node is not None and self.dest_jid_regexp.match(node): + bare_from_jid = unicode(stanza.get_from().bare()) + return [] # Not None + return None + +class MailSubscribeHandler(DefaultSubscribeHandler, MailHandler): + """Use DefaultSubscribeHandler handle method and MailHandler filter. + Filter email address in JID. Accept and add to LegacyJID table. + """ + + def __init__(self): + DefaultSubscribeHandler.__init__(self) + MailHandler.__init__(self) + + def filter(self, stanza, lang_class): + return MailHandler.filter(self, stanza, lang_class) + + def handle(self, stanza, lang_class, accounts): + result = DefaultSubscribeHandler.handle(self, stanza, lang_class, accounts) + to_node = stanza.get_to().node + to_email = to_node.replace('%', '@', 1) + LegacyJID(legacy_address=to_email, + jid=unicode(stanza.get_to()), + account=accounts[0]) + return result + +class MailUnsubscribeHandler(DefaultUnsubscribeHandler, MailHandler): + """Use DefaultUnsubscribeHandler handle method and MailHandler filter. + """ + + def __init__(self): + DefaultUnsubscribeHandler.__init__(self) + MailHandler.__init__(self) + + def filter(self, stanza, lang_class): + return MailHandler.filter(self, stanza, lang_class) + + def handle(self, stanza, lang_class, accounts): + result = DefaultUnsubscribeHandler.handle(self, stanza, lang_class, accounts) + legacy_jid = LegacyJID.select(\ + LegacyJID.q.jid == unicode(stanza.get_to())) + if legacy_jid.count() == 1: + legacy_jid[0].destroySelf() + return result diff --git a/src/jmc/jabber/tests/component.py b/src/jmc/jabber/tests/component.py index 389d13f..0f577dd 100644 --- a/src/jmc/jabber/tests/component.py +++ b/src/jmc/jabber/tests/component.py @@ -38,11 +38,14 @@ from jcl.jabber.tests.component import DefaultSubscribeHandler_TestCase, \ from jcl.jabber.tests.feeder import FeederMock, SenderMock from jmc.model.account import MailAccount, IMAPAccount, POP3Account, \ - SMTPAccount -from jmc.jabber.component import MailComponent, SendMailMessageHandler, \ - RootSendMailMessageHandler, MailHandler, MailSubscribeHandler, \ - MailUnsubscribeHandler, NoAccountError, MailFeederHandler, \ - MailPresenceHandler, MailAccountManager, MailSender + SMTPAccount, NoAccountError +from jmc.jabber import MailHandler +from jmc.jabber.message import SendMailMessageHandler, \ + RootSendMailMessageHandler +from jmc.jabber.presence import MailSubscribeHandler, \ + MailUnsubscribeHandler, MailPresenceHandler +from jmc.jabber.component import MailComponent, MailFeederHandler, \ + MailAccountManager, MailSender from jmc.lang import Lang if sys.platform == "win32": diff --git a/src/jmc/model/account.py b/src/jmc/model/account.py index e0c0b92..a0cd3ed 100644 --- a/src/jmc/model/account.py +++ b/src/jmc/model/account.py @@ -45,6 +45,10 @@ from jmc.lang import Lang IMAP4_TIMEOUT = 10 POP3_TIMEOUT = 10 +class NoAccountError(Exception): + """Error raised when no corresponding account is found.""" + pass + ## All MY* classes are implemented to add a timeout (settimeout) ## while connecting class MYIMAP4(imaplib.IMAP4): |