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-28 00:22:36 +0400
committerDavid Rousselie <dax@happycoders.org>2007-06-28 00:22:36 +0400
commit620b500e0bed3f6f294c255a974859607768bdb9 (patch)
tree714e292433075a3a5d0a10389c98ad85b71dc0d1
parent545b0dca1c031c76d684723e930765baac860d1c (diff)
some module refactoring
darcs-hash:20070627202236-86b55-8a2b80e157cdfb307943c9e2643fc0cd97e87ec7.gz
-rw-r--r--src/jmc/jabber/__init__.py31
-rw-r--r--src/jmc/jabber/component.py161
-rw-r--r--src/jmc/jabber/message.py108
-rw-r--r--src/jmc/jabber/presence.py84
-rw-r--r--src/jmc/jabber/tests/component.py13
-rw-r--r--src/jmc/model/account.py4
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):