Browse IMAP folders in service discorvery (IMAP connection not yet implemented)
darcs-hash:20071011204051-86b55-b2e67101f0396919e907fe98c42b9034bc3142d7.gz
This commit is contained in:
@@ -25,14 +25,22 @@ import logging
|
|||||||
|
|
||||||
from pyxmpp.jid import JID
|
from pyxmpp.jid import JID
|
||||||
|
|
||||||
|
from sqlobject.sqlbuilder import AND
|
||||||
|
|
||||||
import jcl.jabber as jabber
|
import jcl.jabber as jabber
|
||||||
|
import jcl.model as model
|
||||||
from jcl.model import account
|
from jcl.model import account
|
||||||
from jcl.model.account import PresenceAccount
|
from jcl.model.account import Account, User, PresenceAccount
|
||||||
from jcl.jabber.disco import RootDiscoGetInfoHandler
|
from jcl.jabber.disco import \
|
||||||
|
AccountTypeDiscoGetInfoHandler, AccountDiscoGetInfoHandler
|
||||||
from jcl.jabber.feeder import FeederComponent, Feeder, MessageSender, \
|
from jcl.jabber.feeder import FeederComponent, Feeder, MessageSender, \
|
||||||
HeadlineSender, FeederHandler
|
HeadlineSender, FeederHandler
|
||||||
|
from jcl.jabber.command import CommandRootDiscoGetInfoHandler
|
||||||
|
from jcl.jabber.component import AccountManager
|
||||||
|
|
||||||
from jmc.jabber.disco import MailRootDiscoGetInfoHandler
|
from jmc.jabber.disco import MailRootDiscoGetInfoHandler, \
|
||||||
|
IMAPAccountDiscoGetItemsHandler, MailAccountTypeDiscoGetInfoHandler, \
|
||||||
|
IMAPAccountDiscoGetInfoHandler
|
||||||
from jmc.jabber.message import SendMailMessageHandler, \
|
from jmc.jabber.message import SendMailMessageHandler, \
|
||||||
RootSendMailMessageHandler
|
RootSendMailMessageHandler
|
||||||
from jmc.jabber.presence import MailSubscribeHandler, \
|
from jmc.jabber.presence import MailSubscribeHandler, \
|
||||||
@@ -41,6 +49,47 @@ from jmc.model.account import MailAccount, IMAPAccount, POP3Account, \
|
|||||||
SMTPAccount
|
SMTPAccount
|
||||||
from jmc.lang import Lang
|
from jmc.lang import Lang
|
||||||
|
|
||||||
|
class MailAccountManager(AccountManager):
|
||||||
|
def account_get_register(self, info_query,
|
||||||
|
name,
|
||||||
|
from_jid,
|
||||||
|
account_type,
|
||||||
|
lang_class):
|
||||||
|
"""Handle get_register on an IMAP account.
|
||||||
|
Return a preinitialized form.
|
||||||
|
account_type contains 'account_type + imap_dir'"""
|
||||||
|
splitted_node = account_type.split("/")
|
||||||
|
splitted_node_len = len(splitted_node)
|
||||||
|
if splitted_node_len == 1 or \
|
||||||
|
splitted_node[0] != "IMAP":
|
||||||
|
return AccountManager.account_get_register(self,
|
||||||
|
info_query,
|
||||||
|
name, from_jid,
|
||||||
|
account_type,
|
||||||
|
lang_class)
|
||||||
|
else:
|
||||||
|
info_query = info_query.make_result_response()
|
||||||
|
model.db_connect()
|
||||||
|
imap_dir = "/".join(splitted_node[1:])
|
||||||
|
bare_from_jid = from_jid.bare()
|
||||||
|
_account = account.get_account_filter(\
|
||||||
|
AND(AND(User.q.jid == unicode(bare_from_jid),
|
||||||
|
Account.q.userID == User.q.id),
|
||||||
|
IMAPAccount.q.mailbox == imap_dir),
|
||||||
|
account_class=IMAPAccount)
|
||||||
|
query = info_query.new_query("jabber:iq:register")
|
||||||
|
if _account is not None:
|
||||||
|
self.generate_registration_form_init(lang_class,
|
||||||
|
_account).as_xml(query)
|
||||||
|
else:
|
||||||
|
result = self.generate_registration_form(\
|
||||||
|
lang_class,
|
||||||
|
IMAPAccount,
|
||||||
|
bare_from_jid)
|
||||||
|
result["mailbox"].value = imap_dir
|
||||||
|
result.as_xml(query)
|
||||||
|
return [info_query]
|
||||||
|
|
||||||
class MailComponent(FeederComponent):
|
class MailComponent(FeederComponent):
|
||||||
"""Jabber Mail Component main implementation"""
|
"""Jabber Mail Component main implementation"""
|
||||||
|
|
||||||
@@ -51,7 +100,8 @@ class MailComponent(FeederComponent):
|
|||||||
port,
|
port,
|
||||||
config,
|
config,
|
||||||
config_file,
|
config_file,
|
||||||
lang=Lang()):
|
lang=Lang(),
|
||||||
|
account_manager_class=MailAccountManager):
|
||||||
"""Use FeederComponent behavior and setup feeder and sender
|
"""Use FeederComponent behavior and setup feeder and sender
|
||||||
attributes.
|
attributes.
|
||||||
"""
|
"""
|
||||||
@@ -62,7 +112,8 @@ class MailComponent(FeederComponent):
|
|||||||
port,
|
port,
|
||||||
config,
|
config,
|
||||||
config_file,
|
config_file,
|
||||||
lang=lang)
|
lang=lang,
|
||||||
|
account_manager_class=account_manager_class)
|
||||||
self.handler = MailFeederHandler(MailFeeder(self), MailSender(self))
|
self.handler = MailFeederHandler(MailFeeder(self), MailSender(self))
|
||||||
self.account_manager.account_classes = (IMAPAccount,
|
self.account_manager.account_classes = (IMAPAccount,
|
||||||
POP3Account,
|
POP3Account,
|
||||||
@@ -73,9 +124,20 @@ class MailComponent(FeederComponent):
|
|||||||
self.presence_unsubscribe_handlers += [[MailUnsubscribeHandler(self)]]
|
self.presence_unsubscribe_handlers += [[MailUnsubscribeHandler(self)]]
|
||||||
self.presence_available_handlers += [[MailPresenceHandler(self)]]
|
self.presence_available_handlers += [[MailPresenceHandler(self)]]
|
||||||
self.presence_unavailable_handlers += [[MailPresenceHandler(self)]]
|
self.presence_unavailable_handlers += [[MailPresenceHandler(self)]]
|
||||||
|
self.disco_get_items_handlers[0] += [IMAPAccountDiscoGetItemsHandler(self)]
|
||||||
jabber.replace_handlers(self.disco_get_info_handlers,
|
jabber.replace_handlers(self.disco_get_info_handlers,
|
||||||
RootDiscoGetInfoHandler,
|
CommandRootDiscoGetInfoHandler,
|
||||||
MailRootDiscoGetInfoHandler(self))
|
MailRootDiscoGetInfoHandler(self))
|
||||||
|
jabber.replace_handlers(self.disco_get_info_handlers,
|
||||||
|
AccountTypeDiscoGetInfoHandler,
|
||||||
|
MailAccountTypeDiscoGetInfoHandler(self))
|
||||||
|
jabber.replace_handlers(self.disco_get_info_handlers,
|
||||||
|
AccountDiscoGetInfoHandler,
|
||||||
|
IMAPAccountDiscoGetInfoHandler(self))
|
||||||
|
# for hg in self.disco_get_items_handlers:
|
||||||
|
# print "----"
|
||||||
|
# for h in hg:
|
||||||
|
# print str(h)
|
||||||
|
|
||||||
class MailFeeder(Feeder):
|
class MailFeeder(Feeder):
|
||||||
"""Email check"""
|
"""Email check"""
|
||||||
|
|||||||
@@ -20,7 +20,18 @@
|
|||||||
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
##
|
##
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from pyxmpp.jid import JID
|
||||||
|
from pyxmpp.jabber.disco import DiscoItems, DiscoItem
|
||||||
|
|
||||||
|
from jcl import jabber
|
||||||
|
from jcl.model import account
|
||||||
from jcl.jabber.command import CommandRootDiscoGetInfoHandler
|
from jcl.jabber.command import CommandRootDiscoGetInfoHandler
|
||||||
|
from jcl.jabber.disco import AccountTypeDiscoGetInfoHandler, \
|
||||||
|
AccountDiscoGetInfoHandler, DiscoHandler
|
||||||
|
|
||||||
|
from jmc.model.account import IMAPAccount
|
||||||
|
|
||||||
class MailRootDiscoGetInfoHandler(CommandRootDiscoGetInfoHandler):
|
class MailRootDiscoGetInfoHandler(CommandRootDiscoGetInfoHandler):
|
||||||
def handle(self, stanza, lang_class, node, disco_obj, data):
|
def handle(self, stanza, lang_class, node, disco_obj, data):
|
||||||
@@ -30,3 +41,89 @@ class MailRootDiscoGetInfoHandler(CommandRootDiscoGetInfoHandler):
|
|||||||
disco_infos[0].add_feature("jabber:iq:gateway")
|
disco_infos[0].add_feature("jabber:iq:gateway")
|
||||||
disco_infos[0].add_identity(self.component.name, "headline", "newmail")
|
disco_infos[0].add_identity(self.component.name, "headline", "newmail")
|
||||||
return disco_infos
|
return disco_infos
|
||||||
|
|
||||||
|
class MailAccountTypeDiscoGetInfoHandler(AccountTypeDiscoGetInfoHandler):
|
||||||
|
def handle(self, stanza, lang_class, node, disco_obj, data):
|
||||||
|
disco_infos = AccountTypeDiscoGetInfoHandler.handle(self, stanza,
|
||||||
|
lang_class,
|
||||||
|
node, disco_obj,
|
||||||
|
data)
|
||||||
|
if node == "IMAP" and account.get_accounts(stanza.get_from().bare(),
|
||||||
|
IMAPAccount).count() > 0:
|
||||||
|
disco_infos[0].add_feature("http://jabber.org/protocol/disco#info")
|
||||||
|
disco_infos[0].add_feature("http://jabber.org/protocol/disco#items")
|
||||||
|
return disco_infos
|
||||||
|
|
||||||
|
class IMAPAccountDiscoGetInfoHandler(AccountDiscoGetInfoHandler):
|
||||||
|
def handle(self, stanza, lang_class, node, disco_obj, data):
|
||||||
|
disco_infos = AccountDiscoGetInfoHandler.handle(self, stanza,
|
||||||
|
lang_class,
|
||||||
|
node, disco_obj,
|
||||||
|
data)
|
||||||
|
splitted_node = node.split("/")
|
||||||
|
splitted_node_len = len(splitted_node)
|
||||||
|
if splitted_node_len > 1 and \
|
||||||
|
splitted_node[0] == "IMAP":
|
||||||
|
_account = account.get_account(stanza.get_from().bare(),
|
||||||
|
splitted_node[1],
|
||||||
|
IMAPAccount)
|
||||||
|
if _account is not None:
|
||||||
|
disco_infos[0].add_feature("http://jabber.org/protocol/disco#info")
|
||||||
|
if splitted_node_len > 2:
|
||||||
|
imap_dir = "/".join(splitted_node[2:])
|
||||||
|
if len(_account.ls_dir(imap_dir)) > 0:
|
||||||
|
disco_infos[0].add_feature("http://jabber.org/protocol/disco#items")
|
||||||
|
else:
|
||||||
|
disco_infos[0].add_feature("http://jabber.org/protocol/disco#items")
|
||||||
|
return disco_infos
|
||||||
|
|
||||||
|
class IMAPAccountDiscoGetItemsHandler(DiscoHandler):
|
||||||
|
def __init__(self, component):
|
||||||
|
DiscoHandler.__init__(self, component)
|
||||||
|
self.__logger = logging.getLogger("jcl.jabber.IMAPAccountDiscoGetItemsHandler")
|
||||||
|
|
||||||
|
def filter(self, stanza, lang_class, node=None):
|
||||||
|
if node is None:
|
||||||
|
return None
|
||||||
|
splitted_node = node.split("/")
|
||||||
|
splitted_node_len = len(splitted_node)
|
||||||
|
if splitted_node_len < 2:
|
||||||
|
return None
|
||||||
|
account_type = splitted_node[0]
|
||||||
|
if account_type != "IMAP":
|
||||||
|
return None
|
||||||
|
account_name = splitted_node[1]
|
||||||
|
if splitted_node_len == 2:
|
||||||
|
imap_dir = None
|
||||||
|
else:
|
||||||
|
imap_dir = "/".join(splitted_node[2:])
|
||||||
|
return (account_type, account_name, imap_dir)
|
||||||
|
|
||||||
|
def handle(self, stanza, lang_class, node, disco_obj, data):
|
||||||
|
"""Discovery get_items on an IMAP account"""
|
||||||
|
account_type, account_name, imap_dir = data
|
||||||
|
bare_from_jid = stanza.get_from().bare()
|
||||||
|
self.__logger.debug("Listing " + str(imap_dir) + " IMAP directory")
|
||||||
|
account_class = self.component.account_manager.get_account_class(account_type)
|
||||||
|
_account = account.get_account(bare_from_jid, account_name,
|
||||||
|
account_class=account_class)
|
||||||
|
if account_class is not None and _account is not None:
|
||||||
|
disco_items = DiscoItems()
|
||||||
|
if imap_dir is None:
|
||||||
|
# TODO : test if INBOX really exist, is it possible to retrieve default dir from IMAP ?
|
||||||
|
DiscoItem(disco_items,
|
||||||
|
JID(unicode(_account.jid) + "/" + account_type
|
||||||
|
+ "/INBOX"),
|
||||||
|
account_type + "/" + account_name + "/INBOX",
|
||||||
|
"INBOX")
|
||||||
|
else:
|
||||||
|
for subdir in _account.ls_dir(imap_dir):
|
||||||
|
DiscoItem(disco_items,
|
||||||
|
JID(unicode(_account.jid) + "/" + account_type + \
|
||||||
|
"/" + imap_dir + "/" + subdir),
|
||||||
|
account_type + "/" + account_name + "/" + imap_dir
|
||||||
|
+ "/" + subdir,
|
||||||
|
subdir)
|
||||||
|
return [disco_items]
|
||||||
|
return []
|
||||||
|
# TODO : implement get_info on imap_Dir
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ from sqlobject.dbconnection import TheURIOpener
|
|||||||
|
|
||||||
from pyxmpp.presence import Presence
|
from pyxmpp.presence import Presence
|
||||||
from pyxmpp.message import Message
|
from pyxmpp.message import Message
|
||||||
|
from pyxmpp.iq import Iq
|
||||||
|
|
||||||
from jcl.tests import JCLTestCase
|
from jcl.tests import JCLTestCase
|
||||||
import jcl.model as model
|
import jcl.model as model
|
||||||
@@ -143,9 +144,16 @@ class MockIMAPAccount(MockMailAccount, IMAPAccount):
|
|||||||
IMAPAccount._init(self, *args, **kw)
|
IMAPAccount._init(self, *args, **kw)
|
||||||
MockMailAccount._init(self)
|
MockMailAccount._init(self)
|
||||||
|
|
||||||
|
def ls_dir(self, imap_dir):
|
||||||
|
if imap_dir == "INBOX":
|
||||||
|
return ["dir1", "dir2"]
|
||||||
|
elif imap_dir == "INBOX/dir1":
|
||||||
|
return ["subdir1", "subdir2"]
|
||||||
|
return []
|
||||||
|
|
||||||
class MockPOP3Account(MockMailAccount, POP3Account):
|
class MockPOP3Account(MockMailAccount, POP3Account):
|
||||||
def _init(self, *args, **kw):
|
def _init(self, *args, **kw):
|
||||||
IMAPAccount._init(self, *args, **kw)
|
POP3Account._init(self, *args, **kw)
|
||||||
MockMailAccount._init(self)
|
MockMailAccount._init(self)
|
||||||
|
|
||||||
class MockSMTPAccount(object):
|
class MockSMTPAccount(object):
|
||||||
@@ -514,6 +522,286 @@ class MailComponent_TestCase(JCLTestCase):
|
|||||||
self.assertTrue(account11.marked_all_as_read)
|
self.assertTrue(account11.marked_all_as_read)
|
||||||
model.db_disconnect()
|
model.db_disconnect()
|
||||||
|
|
||||||
|
def test_disco_get_info_imap_node(self):
|
||||||
|
self.comp.stream = MockStream()
|
||||||
|
self.comp.stream_class = MockStream
|
||||||
|
account11 = MockIMAPAccount(user=User(jid="user1@test.com"),
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jmc.test.com")
|
||||||
|
info_query = Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="jcl.test.com/IMAP")
|
||||||
|
disco_info = self.comp.disco_get_info("IMAP", info_query)
|
||||||
|
self.assertEquals(len(self.comp.stream.sent), 0)
|
||||||
|
self.assertTrue(disco_info.has_feature("jabber:iq:register"))
|
||||||
|
self.assertTrue(disco_info.has_feature("http://jabber.org/protocol/disco#info"))
|
||||||
|
self.assertTrue(disco_info.has_feature("http://jabber.org/protocol/disco#items"))
|
||||||
|
|
||||||
|
def test_disco_get_info_imap_node_no_account(self):
|
||||||
|
self.comp.stream = MockStream()
|
||||||
|
self.comp.stream_class = MockStream
|
||||||
|
account11 = MockPOP3Account(user=User(jid="user1@test.com"),
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jmc.test.com")
|
||||||
|
account21 = MockIMAPAccount(user=User(jid="user2@test.com"),
|
||||||
|
name="account21",
|
||||||
|
jid="account21@jmc.test.com")
|
||||||
|
info_query = Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="jcl.test.com/IMAP")
|
||||||
|
disco_info = self.comp.disco_get_info("IMAP", info_query)
|
||||||
|
self.assertEquals(len(self.comp.stream.sent), 0)
|
||||||
|
self.assertTrue(disco_info.has_feature("jabber:iq:register"))
|
||||||
|
self.assertFalse(disco_info.has_feature("http://jabber.org/protocol/disco#info"))
|
||||||
|
self.assertFalse(disco_info.has_feature("http://jabber.org/protocol/disco#items"))
|
||||||
|
|
||||||
|
def test_disco_get_info_imap_long_node(self):
|
||||||
|
self.comp.stream = MockStream()
|
||||||
|
self.comp.stream_class = MockStream
|
||||||
|
account11 = MockIMAPAccount(user=User(jid="user1@test.com"),
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jmc.test.com")
|
||||||
|
info_query = Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="account11@jcl.test.com/IMAP")
|
||||||
|
disco_info = self.comp.disco_get_info("IMAP/account11",
|
||||||
|
info_query)
|
||||||
|
self.assertEquals(len(self.comp.stream.sent), 0)
|
||||||
|
self.assertTrue(disco_info.has_feature("jabber:iq:register"))
|
||||||
|
self.assertTrue(disco_info.has_feature("http://jabber.org/protocol/disco#info"))
|
||||||
|
self.assertTrue(disco_info.has_feature("http://jabber.org/protocol/disco#items"))
|
||||||
|
|
||||||
|
def test_disco_get_info_not_imap_long_node(self):
|
||||||
|
self.comp.stream = MockStream()
|
||||||
|
self.comp.stream_class = MockStream
|
||||||
|
account11 = MockPOP3Account(user=User(jid="user1@test.com"),
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jmc.test.com")
|
||||||
|
info_query = Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="account11@jcl.test.com/POP3")
|
||||||
|
disco_info = self.comp.disco_get_info("POP3/account11",
|
||||||
|
info_query)
|
||||||
|
self.assertEquals(len(self.comp.stream.sent), 0)
|
||||||
|
self.assertTrue(disco_info.has_feature("jabber:iq:register"))
|
||||||
|
self.assertFalse(disco_info.has_feature("http://jabber.org/protocol/disco#info"))
|
||||||
|
self.assertFalse(disco_info.has_feature("http://jabber.org/protocol/disco#items"))
|
||||||
|
|
||||||
|
def test_disco_get_info_imap_dir_node(self):
|
||||||
|
self.comp.stream = MockStream()
|
||||||
|
self.comp.stream_class = MockStream
|
||||||
|
account11 = MockIMAPAccount(user=User(jid="user1@test.com"),
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jmc.test.com")
|
||||||
|
account11.mailbox = "INBOX/dir1"
|
||||||
|
info_query = Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="account11@jcl.test.com/IMAP/INBOX")
|
||||||
|
disco_info = self.comp.disco_get_info("IMAP/account11/INBOX",
|
||||||
|
info_query)
|
||||||
|
self.assertEquals(len(self.comp.stream.sent), 0)
|
||||||
|
self.assertTrue(disco_info.has_feature("jabber:iq:register"))
|
||||||
|
self.assertTrue(disco_info.has_feature("http://jabber.org/protocol/disco#info"))
|
||||||
|
self.assertTrue(disco_info.has_feature("http://jabber.org/protocol/disco#items"))
|
||||||
|
|
||||||
|
def test_disco_get_info_imap_dir_node_already_registered(self):
|
||||||
|
self.comp.stream = MockStream()
|
||||||
|
self.comp.stream_class = MockStream
|
||||||
|
account11 = MockIMAPAccount(user=User(jid="user1@test.com"),
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jmc.test.com")
|
||||||
|
account11.mailbox = "INBOX"
|
||||||
|
info_query = Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="account11@jcl.test.com/IMAP/INBOX")
|
||||||
|
disco_info = self.comp.disco_get_info("IMAP/account11/INBOX",
|
||||||
|
info_query)
|
||||||
|
self.assertEquals(len(self.comp.stream.sent), 0)
|
||||||
|
self.assertTrue(disco_info.has_feature("jabber:iq:register"))
|
||||||
|
self.assertTrue(disco_info.has_feature("http://jabber.org/protocol/disco#info"))
|
||||||
|
self.assertTrue(disco_info.has_feature("http://jabber.org/protocol/disco#items"))
|
||||||
|
|
||||||
|
def test_disco_get_info_imap_dir_node_last_subdir(self):
|
||||||
|
self.comp.stream = MockStream()
|
||||||
|
self.comp.stream_class = MockStream
|
||||||
|
account11 = MockIMAPAccount(user=User(jid="user1@test.com"),
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jmc.test.com")
|
||||||
|
account11.mailbox = "INBOX/dir1/subdir1"
|
||||||
|
info_query = Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="account11@jcl.test.com/IMAP/INBOX/dir1/subdir1")
|
||||||
|
disco_info = self.comp.disco_get_info("IMAP/account11/INBOX/dir1/subdir1",
|
||||||
|
info_query)
|
||||||
|
self.assertEquals(len(self.comp.stream.sent), 0)
|
||||||
|
self.assertTrue(disco_info.has_feature("jabber:iq:register"))
|
||||||
|
self.assertTrue(disco_info.has_feature("http://jabber.org/protocol/disco#info"))
|
||||||
|
self.assertFalse(disco_info.has_feature("http://jabber.org/protocol/disco#items"))
|
||||||
|
|
||||||
|
def test_disco_get_items_base_imap_account(self):
|
||||||
|
account11 = MockIMAPAccount(user=User(jid="user1@test.com"),
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jcl.test.com")
|
||||||
|
info_query = Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="account11@jcl.test.com/IMAP")
|
||||||
|
disco_items = self.comp.disco_get_items("IMAP/account11", info_query)
|
||||||
|
self.assertEquals(len(disco_items.get_items()), 1)
|
||||||
|
disco_item = disco_items.get_items()[0]
|
||||||
|
self.assertEquals(unicode(disco_item.get_jid()), unicode(account11.jid)
|
||||||
|
+ "/IMAP/INBOX")
|
||||||
|
self.assertEquals(disco_item.get_node(), "IMAP/" + account11.name + "/INBOX")
|
||||||
|
self.assertEquals(disco_item.get_name(), "INBOX")
|
||||||
|
|
||||||
|
def test_disco_get_items_inbox_imap_account(self):
|
||||||
|
account11 = MockIMAPAccount(user=User(jid="user1@test.com"),
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jcl.test.com")
|
||||||
|
info_query = Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="account11@jcl.test.com/IMAP/INBOX")
|
||||||
|
disco_items = self.comp.disco_get_items("IMAP/account11/INBOX", info_query)
|
||||||
|
self.assertEquals(len(disco_items.get_items()), 2)
|
||||||
|
disco_item = disco_items.get_items()[0]
|
||||||
|
self.assertEquals(unicode(disco_item.get_jid()), unicode(account11.jid)
|
||||||
|
+ "/IMAP/INBOX/dir1")
|
||||||
|
self.assertEquals(disco_item.get_node(), "IMAP/" + account11.name + "/INBOX"
|
||||||
|
+ "/dir1")
|
||||||
|
self.assertEquals(disco_item.get_name(), "dir1")
|
||||||
|
disco_item = disco_items.get_items()[1]
|
||||||
|
self.assertEquals(unicode(disco_item.get_jid()), unicode(account11.jid)
|
||||||
|
+ "/IMAP/INBOX/dir2")
|
||||||
|
self.assertEquals(disco_item.get_node(), "IMAP/" + account11.name + "/INBOX"
|
||||||
|
+ "/dir2")
|
||||||
|
self.assertEquals(disco_item.get_name(), "dir2")
|
||||||
|
|
||||||
|
def test_disco_get_items_subdir_imap_account(self):
|
||||||
|
account11 = MockIMAPAccount(user=User(jid="user1@test.com"),
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jcl.test.com")
|
||||||
|
info_query = Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="account11@jcl.test.com/IMAP")
|
||||||
|
disco_items = self.comp.disco_get_items("IMAP/account11/INBOX/dir1", info_query)
|
||||||
|
self.assertEquals(len(disco_items.get_items()), 2)
|
||||||
|
disco_item = disco_items.get_items()[0]
|
||||||
|
self.assertEquals(unicode(disco_item.get_jid()), unicode(account11.jid)
|
||||||
|
+ "/IMAP/INBOX/dir1/subdir1")
|
||||||
|
self.assertEquals(disco_item.get_node(), "IMAP/" + account11.name + "/INBOX"
|
||||||
|
+ "/dir1/subdir1")
|
||||||
|
self.assertEquals(disco_item.get_name(), "subdir1")
|
||||||
|
disco_item = disco_items.get_items()[1]
|
||||||
|
self.assertEquals(unicode(disco_item.get_jid()), unicode(account11.jid)
|
||||||
|
+ "/IMAP/INBOX/dir1/subdir2")
|
||||||
|
self.assertEquals(disco_item.get_node(), "IMAP/" + account11.name + "/INBOX"
|
||||||
|
+ "/dir1/subdir2")
|
||||||
|
self.assertEquals(disco_item.get_name(), "subdir2")
|
||||||
|
|
||||||
|
def test_account_get_register_imap_dir_already_registered(self):
|
||||||
|
model.db_connect()
|
||||||
|
self.comp.stream = MockStream()
|
||||||
|
self.comp.stream_class = MockStream
|
||||||
|
user1 = User(jid="user1@test.com")
|
||||||
|
account1 = MockIMAPAccount(user=user1,
|
||||||
|
name="account1",
|
||||||
|
jid="account1@jcl.test.com")
|
||||||
|
account1.mailbox = "INBOX"
|
||||||
|
account11 = MockIMAPAccount(user=user1,
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jcl.test.com")
|
||||||
|
account11.mailbox = "INBOX/dir1"
|
||||||
|
account21 = MockIMAPAccount(user=User(jid="user2@test.com"),
|
||||||
|
name="account21",
|
||||||
|
jid="account21@jcl.test.com")
|
||||||
|
model.db_disconnect()
|
||||||
|
self.comp.handle_get_register(Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="account1@jcl.test.com/IMAP/INBOX/dir1"))
|
||||||
|
self.assertEquals(len(self.comp.stream.sent), 1)
|
||||||
|
iq_sent = self.comp.stream.sent[0]
|
||||||
|
self.assertEquals(iq_sent.get_to(), "user1@test.com")
|
||||||
|
titles = iq_sent.xpath_eval("jir:query/jxd:x/jxd:title",
|
||||||
|
{"jir" : "jabber:iq:register",
|
||||||
|
"jxd" : "jabber:x:data"})
|
||||||
|
self.assertEquals(len(titles), 1)
|
||||||
|
self.assertEquals(titles[0].content,
|
||||||
|
Lang.en.register_title)
|
||||||
|
instructions = iq_sent.xpath_eval("jir:query/jxd:x/jxd:instructions",
|
||||||
|
{"jir" : "jabber:iq:register",
|
||||||
|
"jxd" : "jabber:x:data"})
|
||||||
|
self.assertEquals(len(instructions), 1)
|
||||||
|
self.assertEquals(instructions[0].content,
|
||||||
|
Lang.en.register_instructions)
|
||||||
|
fields = iq_sent.xpath_eval("jir:query/jxd:x/jxd:field",
|
||||||
|
{"jir" : "jabber:iq:register",
|
||||||
|
"jxd" : "jabber:x:data"})
|
||||||
|
self.assertEquals(len(fields), 16)
|
||||||
|
field = fields[0]
|
||||||
|
self.assertEquals(field.prop("type"), "hidden")
|
||||||
|
self.assertEquals(field.prop("var"), "name")
|
||||||
|
self.assertEquals(field.prop("label"), Lang.en.account_name)
|
||||||
|
self.assertEquals(field.children.name, "value")
|
||||||
|
self.assertEquals(field.children.content, "account11")
|
||||||
|
self.assertEquals(field.children.next.name, "required")
|
||||||
|
field = fields[15]
|
||||||
|
self.assertEquals(field.prop("type"), "text-single")
|
||||||
|
self.assertEquals(field.prop("var"), "mailbox")
|
||||||
|
self.assertEquals(field.prop("label"), Lang.en.field_mailbox)
|
||||||
|
self.assertEquals(field.children.name, "value")
|
||||||
|
self.assertEquals(field.children.content, "INBOX/dir1")
|
||||||
|
|
||||||
|
def test_account_get_register_imap_dir_new(self):
|
||||||
|
model.db_connect()
|
||||||
|
self.comp.stream = MockStream()
|
||||||
|
self.comp.stream_class = MockStream
|
||||||
|
user1 = User(jid="user1@test.com")
|
||||||
|
account1 = MockIMAPAccount(user=user1,
|
||||||
|
name="account1",
|
||||||
|
jid="account1@jcl.test.com")
|
||||||
|
account1.maildir = "INBOX"
|
||||||
|
account11 = MockIMAPAccount(user=user1,
|
||||||
|
name="account11",
|
||||||
|
jid="account11@jcl.test.com")
|
||||||
|
account11.maildir = "INBOX/dir1"
|
||||||
|
account21 = MockIMAPAccount(user=User(jid="user2@test.com"),
|
||||||
|
name="account21",
|
||||||
|
jid="account21@jcl.test.com")
|
||||||
|
model.db_disconnect()
|
||||||
|
self.comp.handle_get_register(Iq(stanza_type="get",
|
||||||
|
from_jid="user1@test.com",
|
||||||
|
to_jid="account1@jcl.test.com/IMAP/INBOX/dir1/subdir1"))
|
||||||
|
self.assertEquals(len(self.comp.stream.sent), 1)
|
||||||
|
iq_sent = self.comp.stream.sent[0]
|
||||||
|
self.assertEquals(iq_sent.get_to(), "user1@test.com")
|
||||||
|
titles = iq_sent.xpath_eval("jir:query/jxd:x/jxd:title",
|
||||||
|
{"jir" : "jabber:iq:register",
|
||||||
|
"jxd" : "jabber:x:data"})
|
||||||
|
self.assertEquals(len(titles), 1)
|
||||||
|
self.assertEquals(titles[0].content,
|
||||||
|
Lang.en.register_title)
|
||||||
|
instructions = iq_sent.xpath_eval("jir:query/jxd:x/jxd:instructions",
|
||||||
|
{"jir" : "jabber:iq:register",
|
||||||
|
"jxd" : "jabber:x:data"})
|
||||||
|
self.assertEquals(len(instructions), 1)
|
||||||
|
self.assertEquals(instructions[0].content,
|
||||||
|
Lang.en.register_instructions)
|
||||||
|
fields = iq_sent.xpath_eval("jir:query/jxd:x/jxd:field",
|
||||||
|
{"jir" : "jabber:iq:register",
|
||||||
|
"jxd" : "jabber:x:data"})
|
||||||
|
self.assertEquals(len(fields), 16)
|
||||||
|
field = fields[0]
|
||||||
|
self.assertEquals(field.prop("type"), "text-single")
|
||||||
|
self.assertEquals(field.prop("var"), "name")
|
||||||
|
self.assertEquals(field.prop("label"), Lang.en.account_name)
|
||||||
|
self.assertEquals(field.children.name, "required")
|
||||||
|
self.assertEquals(field.children.next, None)
|
||||||
|
field = fields[15]
|
||||||
|
self.assertEquals(field.prop("type"), "text-single")
|
||||||
|
self.assertEquals(field.prop("var"), "mailbox")
|
||||||
|
self.assertEquals(field.prop("label"), Lang.en.field_mailbox)
|
||||||
|
self.assertEquals(field.children.name, "value")
|
||||||
|
self.assertEquals(field.children.content, "INBOX/dir1/subdir1")
|
||||||
|
|
||||||
class SendMailMessageHandler_TestCase(unittest.TestCase):
|
class SendMailMessageHandler_TestCase(unittest.TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.handler = SendMailMessageHandler(None)
|
self.handler = SendMailMessageHandler(None)
|
||||||
|
|||||||
Reference in New Issue
Block a user