diff --git a/src/jmc/jabber/component.py b/src/jmc/jabber/component.py index d5a33da..5a73d6b 100644 --- a/src/jmc/jabber/component.py +++ b/src/jmc/jabber/component.py @@ -29,7 +29,7 @@ from sqlobject import * from pyxmpp.message import Message -from jcl.model.account import Account, PresenceAccount +from jcl.model.account import Account, PresenceAccount, LegacyJID from jcl.jabber.component import Handler, DefaultSubscribeHandler, \ DefaultUnsubscribeHandler, DefaultPresenceHandler from jcl.jabber.feeder import FeederComponent, Feeder, MessageSender, \ @@ -235,6 +235,8 @@ class SendMailMessageHandler(MailHandler): 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)\s*:\s*(?P.*)") @@ -280,7 +282,9 @@ class RootSendMailMessageHandler(SendMailMessageHandler): body=lang_class.send_mail_error_no_to_header_body)] class MailSubscribeHandler(DefaultSubscribeHandler, MailHandler): - """Use DefaultSubscribeHandler handle method and MailHandler filter""" + """Use DefaultSubscribeHandler handle method and MailHandler filter. + Filter email address in JID. Accept and add to LegacyJID table. + """ def __init__(self): DefaultSubscribeHandler.__init__(self) @@ -290,10 +294,17 @@ class MailSubscribeHandler(DefaultSubscribeHandler, MailHandler): return MailHandler.filter(self, stanza, lang_class) def handle(self, stanza, lang_class, accounts): - return DefaultSubscribeHandler.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""" + """Use DefaultUnsubscribeHandler handle method and MailHandler filter. + """ def __init__(self): DefaultUnsubscribeHandler.__init__(self) @@ -303,7 +314,12 @@ class MailUnsubscribeHandler(DefaultUnsubscribeHandler, MailHandler): return MailHandler.filter(self, stanza, lang_class) def handle(self, stanza, lang_class, accounts): - return DefaultUnsubscribeHandler.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): diff --git a/src/jmc/jabber/tests/component.py b/src/jmc/jabber/tests/component.py index 3717b2b..c5c0b11 100644 --- a/src/jmc/jabber/tests/component.py +++ b/src/jmc/jabber/tests/component.py @@ -32,7 +32,7 @@ from pyxmpp.presence import Presence from pyxmpp.message import Message from jcl.model import account -from jcl.model.account import Account, PresenceAccount +from jcl.model.account import Account, PresenceAccount, LegacyJID from jcl.jabber.tests.component import DefaultSubscribeHandler_TestCase, \ DefaultUnsubscribeHandler_TestCase from jcl.jabber.tests.feeder import FeederMock, SenderMock @@ -781,11 +781,67 @@ class MailSubscribeHandler_TestCase(DefaultSubscribeHandler_TestCase, MailHandle def setUp(self): MailHandler_TestCase.setUp(self) self.handler = MailSubscribeHandler() + account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL) + LegacyJID.createTable(ifNotExists=True) + del account.hub.threadConnection + def test_handle(self): + account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL) + account11 = SMTPAccount(user_jid="user1@test.com", + name="account11", + jid="account11@jcl.test.com") + presence = Presence(from_jid="user1@test.com", + to_jid="user1%test.com@jcl.test.com", + stanza_type="subscribe") + result = self.handler.handle(presence, Lang.en, [account11]) + legacy_jids = LegacyJID.select() + self.assertEquals(legacy_jids.count(), 1) + del account.hub.threadConnection + class MailUnsubscribeHandler_TestCase(DefaultUnsubscribeHandler_TestCase, MailHandler_TestCase): def setUp(self): MailHandler_TestCase.setUp(self) self.handler = MailUnsubscribeHandler() + account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL) + LegacyJID.createTable(ifNotExists=True) + del account.hub.threadConnection + + def test_handle(self): + account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL) + account11 = SMTPAccount(user_jid="user1@test.com", + name="account11", + jid="account11@jcl.test.com") + account12 = SMTPAccount(user_jid="user1@test.com", + name="account12", + jid="account12@jcl.test.com") + account2 = SMTPAccount(user_jid="user2@test.com", + name="account2", + jid="account2@jcl.test.com") + presence = Presence(from_jid="user1@test.com", + to_jid="u111%test.com@jcl.test.com", + stanza_type="unsubscribe") + legacy_jid111 = LegacyJID(legacy_address="u111@test.com", + jid="u111%test.com@jcl.test.com", + account=account11) + legacy_jid112 = LegacyJID(legacy_address="u112@test.com", + jid="u112%test.com@jcl.test.com", + account=account11) + legacy_jid121 = LegacyJID(legacy_address="u121@test.com", + jid="u121%test.com@jcl.test.com", + account=account12) + legacy_jid122 = LegacyJID(legacy_address="u122@test.com", + jid="u122%test.com@jcl.test.com", + account=account12) + legacy_jid21 = LegacyJID(legacy_address="u21@test.com", + jid="u21%test.com@jcl.test.com", + account=account2) + result = self.handler.handle(presence, Lang.en, [account11]) + legacy_jids = LegacyJID.select() + self.assertEquals(legacy_jids.count(), 4) + removed_legacy_jid = LegacyJID.select(\ + LegacyJID.q.jid == "u111%test.com@jcl.test.com") + self.assertEquals(removed_legacy_jid.count(), 0) + del account.hub.threadConnection class MailFeederHandler_TestCase(unittest.TestCase): def setUp(self):