Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dax/jmc.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Rousselie <dax@happycoders.org>2007-06-19 20:05:57 +0400
committerDavid Rousselie <dax@happycoders.org>2007-06-19 20:05:57 +0400
commit9da0d0a7d1db7bbd191ec9a41518dddbfebe2876 (patch)
tree0e0ba24ca5ae1afaeeb6a98bb66418ef133db6f2
parent1e1fd5c67d1916f63ad970b6c7948d5b4facc24c (diff)
Add Extended Stanza Addressing support
Add 'replyto' address in messages sent by JMC darcs-hash:20070619160557-86b55-3a7a8db7567ca91cc05e0b029c8bcae04fbaeec0.gz
-rw-r--r--src/jmc/jabber/component.py34
-rw-r--r--src/jmc/jabber/tests/component.py79
2 files changed, 94 insertions, 19 deletions
diff --git a/src/jmc/jabber/component.py b/src/jmc/jabber/component.py
index c0fa13b..60029e2 100644
--- a/src/jmc/jabber/component.py
+++ b/src/jmc/jabber/component.py
@@ -28,6 +28,7 @@ import sys
from sqlobject import *
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, \
@@ -156,7 +157,8 @@ class MailFeeder(Feeder):
mail_index = _account.get_next_mail_index(mail_list)
while mail_index is not None:
(body, email_from) = _account.get_mail(mail_index)
- result.append((default_lang_class.new_mail_subject\
+ result.append((email_from,
+ default_lang_class.new_mail_subject\
% (email_from),
body))
mail_index = _account.get_next_mail_index(mail_list)
@@ -172,7 +174,8 @@ class MailFeeder(Feeder):
mail_index = _account.get_next_mail_index(mail_list)
new_mail_count += 1
if body != "":
- result.append((default_lang_class.new_digest_subject\
+ result.append((None,
+ default_lang_class.new_digest_subject\
% (new_mail_count),
body))
else:
@@ -191,15 +194,34 @@ class MailFeeder(Feeder):
self.component.send_error(_account, e)
return result
-class MailSender(MessageSender, HeadlineSender):
+class MailSender(HeadlineSender):
"""Send emails messages to jabber users"""
- def send(self, to_account, subject, body):
+ def send(self, to_account, data):
+ """Call MessageSender send method"""
+ MessageSender.send(self, to_account, data)
+
+ def create_message(self, to_account, data):
"""Send given emails (in data) as Jabber messages"""
+ email_from, subject, body = data
if to_account.action == MailAccount.RETRIEVE:
- MessageSender.send(self, to_account, subject, body)
+ message = MessageSender.create_message(self, to_account,
+ (subject, body))
+ msg_node = message.get_node()
+ addresses_node = msg_node.newChild(None, "addresses", None)
+ address_ns = addresses_node.newNs("http://jabber.org/protocol/address", None)
+ addresses_node.setNs(address_ns)
+ replyto_address_node = addresses_node.newChild(address_ns, "address", None)
+ replyto_address_node.setProp("type", "replyto")
+ replyto_jid = email_from.replace('@', '%', 1) + "@" \
+ + unicode(JID(to_account.jid).domain)
+ replyto_address_node.setProp("jid", replyto_jid)
elif to_account.action == MailAccount.DIGEST:
- HeadlineSender.send(self, to_account, subject, body)
+ message = HeadlineSender.create_message(self, to_account,
+ subject, body)
+ else:
+ message = None
+ return message
class MailHandler(Handler):
"""Define filter for email address in JID"""
diff --git a/src/jmc/jabber/tests/component.py b/src/jmc/jabber/tests/component.py
index 5aea2af..1bd20fa 100644
--- a/src/jmc/jabber/tests/component.py
+++ b/src/jmc/jabber/tests/component.py
@@ -42,7 +42,7 @@ from jmc.model.account import MailAccount, IMAPAccount, POP3Account, \
from jmc.jabber.component import MailComponent, SendMailMessageHandler, \
RootSendMailMessageHandler, MailHandler, MailSubscribeHandler, \
MailUnsubscribeHandler, NoAccountError, MailFeederHandler, \
- MailPresenceHandler, MailAccountManager
+ MailPresenceHandler, MailAccountManager, MailSender
from jmc.lang import Lang
if sys.platform == "win32":
@@ -145,10 +145,10 @@ class MockPOP3Account(MockMailAccount, POP3Account):
class MockSMTPAccount(object):
def __init__(self):
self.default_from = "user1@test.com"
-
+
def create_email(self, from_email, to_email, subject, body):
return (from_email, to_email, subject, body)
-
+
def send_email(self, email):
self.email = email
@@ -339,12 +339,12 @@ class MailComponent_TestCase(unittest.TestCase):
def test_feed_retrieve_mail(self):
def mock_get_mail(index):
- return [("body1", "from1@test.com"), \
+ return [("body1", "from1@test.com"),
("body2", "from2@test.com")][index]
account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
- account11 = MockIMAPAccount(user_jid = "test1@test.com", \
- name = "account11", \
- jid = "account11@jmc.test.com")
+ account11 = MockIMAPAccount(user_jid="test1@test.com",
+ name="account11",
+ jid="account11@jmc.test.com")
account11._action = MailAccount.RETRIEVE
account11.status = account.ONLINE
account11.first_check = False
@@ -360,14 +360,18 @@ class MailComponent_TestCase(unittest.TestCase):
self.assertTrue(account11.has_connected)
self.assertEquals(len(self.comp.stream.sent), 0)
self.assertEquals(len(result), 2)
- self.assertEquals(result[0][0], \
+ self.assertEquals(result[0][0],
+ "from1@test.com")
+ self.assertEquals(result[0][1],
account11.default_lang_class.new_mail_subject \
% ("from1@test.com"))
- self.assertEquals(result[0][1], "body1")
- self.assertEquals(result[1][0], \
+ self.assertEquals(result[0][2], "body1")
+ self.assertEquals(result[1][0],
+ "from2@test.com")
+ self.assertEquals(result[1][1], \
account11.default_lang_class.new_mail_subject \
% ("from2@test.com"))
- self.assertEquals(result[1][1], "body2")
+ self.assertEquals(result[1][2], "body2")
del account.hub.threadConnection
def test_feed_digest_no_mail(self):
@@ -414,10 +418,10 @@ class MailComponent_TestCase(unittest.TestCase):
self.assertTrue(account11.has_connected)
self.assertEquals(len(self.comp.stream.sent), 0)
self.assertEquals(len(result), 1)
- self.assertEquals(result[0][0], \
+ self.assertEquals(result[0][1], \
account11.default_lang_class.new_digest_subject \
% (2))
- self.assertEquals(result[0][1], \
+ self.assertEquals(result[0][2], \
"body1\n----------------------------------\nbody2\n----------------------------------\n")
del account.hub.threadConnection
@@ -677,6 +681,54 @@ class RootSendMailMessageHandler_TestCase(unittest.TestCase):
self.assertEquals(result[0].get_body(),
Lang.en.send_mail_error_no_to_header_body)
+class MailSender_TestCase(unittest.TestCase):
+ def setUp(self):
+ if os.path.exists(DB_PATH):
+ os.unlink(DB_PATH)
+ account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
+ Account.createTable(ifNotExists=True)
+ PresenceAccount.createTable(ifNotExists=True)
+ MailAccount.createTable(ifNotExists=True)
+ IMAPAccount.createTable(ifNotExists=True)
+ POP3Account.createTable(ifNotExists=True)
+ del account.hub.threadConnection
+
+ def tearDown(self):
+ account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
+ POP3Account.dropTable(ifExists=True)
+ IMAPAccount.dropTable(ifExists=True)
+ MailAccount.dropTable(ifExists=True)
+ PresenceAccount.dropTable(ifExists=True)
+ Account.dropTable(ifExists=True)
+ del TheURIOpener.cachedURIs['sqlite://' + DB_URL]
+ account.hub.threadConnection.close()
+ del account.hub.threadConnection
+ if os.path.exists(DB_PATH):
+ os.unlink(DB_PATH)
+
+ def test_create_message(self):
+ mail_sender = MailSender()
+ account.hub.threadConnection = connectionForURI('sqlite://' + DB_URL)
+ account11 = IMAPAccount(user_jid="test1@test.com",
+ name="account11",
+ jid="account11@jmc.test.com")
+ account11.online_action = MailAccount.RETRIEVE
+ account11.status = account.ONLINE
+ message = mail_sender.create_message(account11, ("from@test.com",
+ "subject",
+ "message body"))
+ self.assertEquals(message.get_to(), account11.user_jid)
+ del account.hub.threadConnection
+ self.assertEquals(message.get_subject(), "subject")
+ self.assertEquals(message.get_body(), "message body")
+ addresses = message.xpath_eval("add:addresses/add:address",
+ {"add": "http://jabber.org/protocol/address"})
+ self.assertEquals(len(addresses), 1)
+ self.assertEquals(addresses[0].prop("type"),
+ "replyto")
+ self.assertEquals(addresses[0].prop("jid"),
+ "from%test.com@jmc.test.com")
+
class MailHandler_TestCase(unittest.TestCase):
def setUp(self):
self.handler = MailHandler()
@@ -927,6 +979,7 @@ def suite():
suite.addTest(unittest.makeSuite(SendMailMessageHandler_TestCase, 'test'))
suite.addTest(unittest.makeSuite(MailAccountManager_TestCase, 'test'))
suite.addTest(unittest.makeSuite(RootSendMailMessageHandler_TestCase, 'test'))
+ suite.addTest(unittest.makeSuite(MailSender_TestCase, 'test'))
suite.addTest(unittest.makeSuite(MailHandler_TestCase, 'test'))
suite.addTest(unittest.makeSuite(MailUnsubscribeHandler_TestCase, 'test'))
suite.addTest(unittest.makeSuite(MailSubscribeHandler_TestCase, 'test'))