some module refactoring
darcs-hash:20070627202236-86b55-8a2b80e157cdfb307943c9e2643fc0cd97e87ec7.gz
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
108
src/jmc/jabber/message.py
Normal file
108
src/jmc/jabber/message.py
Normal file
@@ -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)]
|
||||
|
||||
84
src/jmc/jabber/presence.py
Normal file
84
src/jmc/jabber/presence.py
Normal file
@@ -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
|
||||
@@ -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":
|
||||
|
||||
@@ -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):
|
||||
|
||||
Reference in New Issue
Block a user