summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuben Pollan <meskio@sindominio.net>2017-07-24 19:21:40 +0200
committerKali Kaneko <kali@leap.se>2017-08-24 17:15:20 -0400
commit3f620e20f0b18246a26aa8e0ec4c3719719700ce (patch)
tree27e64a1e7be68045eca497cab63397c419206b9c
parent00a9de84771b27e62515ce6d878d182c8f053de5 (diff)
[feat] add mail.add_msg API call
- Resolves: #8973
-rw-r--r--src/leap/bitmask/cli/mail.py29
-rw-r--r--src/leap/bitmask/core/dispatcher.py12
-rw-r--r--src/leap/bitmask/core/mail_services.py17
3 files changed, 56 insertions, 2 deletions
diff --git a/src/leap/bitmask/cli/mail.py b/src/leap/bitmask/cli/mail.py
index b6d6cd16..933f72a9 100644
--- a/src/leap/bitmask/cli/mail.py
+++ b/src/leap/bitmask/cli/mail.py
@@ -35,6 +35,7 @@ SUBCOMMANDS:
disable Stop service
status Display status about service
get_token Returns token for the mail service
+ add_msg Add a msg file to a mailbox
'''.format(name=command.appname)
@@ -74,6 +75,34 @@ SUBCOMMANDS:
return self._send(command.default_dict_printer)
+ def add_msg(self, raw_args):
+ parser = argparse.ArgumentParser(
+ description='Bitmask email status',
+ prog='%s %s %s' % tuple(sys.argv[:3]))
+ parser.add_argument('-u', '--userid', default='',
+ help='Select the userid of the mail')
+ parser.add_argument('-m', '--mailbox', default='',
+ help='Select the mailbox to add the email')
+ parser.add_argument('file', nargs=1,
+ help='file where the mail is stored')
+ subargs = parser.parse_args(raw_args)
+
+ if subargs.userid:
+ userid = subargs.userid
+ else:
+ userid = self.cfg.get('bonafide', 'active', default=None)
+
+ mailbox = ''
+ if subargs.mailbox:
+ mailbox = subargs.mailbox
+
+ with open(subargs.file[0], 'r') as msgfile:
+ rawmsg = msgfile.read()
+
+ self.data += ['add_msg', userid, mailbox, rawmsg]
+
+ return self._send(command.default_dict_printer)
+
def mixnet_status(self, raw_args):
parser = argparse.ArgumentParser(
description='Bitmask mixnet status',
diff --git a/src/leap/bitmask/core/dispatcher.py b/src/leap/bitmask/core/dispatcher.py
index 1e364ec1..508a925d 100644
--- a/src/leap/bitmask/core/dispatcher.py
+++ b/src/leap/bitmask/core/dispatcher.py
@@ -282,6 +282,18 @@ class MailCmd(SubCommand):
d = mail.do_mixnet_status(userid, address)
return d
+ @register_method('dict')
+ def do_ADD_MSG(self, mail, *parts, **kw):
+ try:
+ userid = parts[2]
+ mailbox = parts[3]
+ msg = parts[4]
+ except IndexError:
+ raise DispatchError(
+ 'wrong number of arguments: expected 3, got none')
+ d = mail.do_add_msg(userid, msg, mailbox)
+ return d
+
class WebUICmd(SubCommand):
diff --git a/src/leap/bitmask/core/mail_services.py b/src/leap/bitmask/core/mail_services.py
index 043f8487..584aa8b6 100644
--- a/src/leap/bitmask/core/mail_services.py
+++ b/src/leap/bitmask/core/mail_services.py
@@ -614,6 +614,16 @@ class StandardMailService(service.MultiService, HookableService):
token = self._service_tokens.get(userid)
return {'user': userid, 'token': token}
+ def do_add_msg(self, userid, raw_msg, mailbox=None):
+ if not mailbox:
+ mailbox = INBOX_NAME
+
+ account = self._get_account(userid)
+ d = account.get_collection_by_mailbox(mailbox)
+ d.addCallback(lambda collection: collection.add_msg(raw_msg))
+ d.addCallback(lambda _: {'added': True})
+ return d
+
# access to containers
def get_soledad_session(self, userid):
@@ -642,13 +652,16 @@ class StandardMailService(service.MultiService, HookableService):
json.dump(token_dict, ftokens)
def _maybe_start_pixelated(self, passthrough, userid, soledad, keymanager):
- incoming = self.getServiceNamed('incoming_mail')
- account = incoming.getServiceNamed(userid).account
+ account = self._get_account(userid)
if HAS_MUA and pixelizer.HAS_PIXELATED:
pixelizer.start_pixelated_user_agent(
userid, soledad, keymanager, account)
return passthrough
+ def _get_account(self, userid):
+ incoming = self.getServiceNamed('incoming_mail')
+ return incoming.getServiceNamed(userid).account
+
class IMAPService(service.Service):