diff --git a/sat/core/sat_main.py b/sat/core/sat_main.py
index 954c3cf9..5aae9fc2 100644
--- a/sat/core/sat_main.py
+++ b/sat/core/sat_main.py
@@ -17,6 +17,10 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+from glob import glob
+import sys
+import os.path
+import uuid
import sat
from sat.core.i18n import _, languageSwitch
from sat.core import patches
@@ -30,7 +34,6 @@ from sat.core import xmpp
from sat.core import exceptions
from sat.core.log import getLogger
-log = getLogger(__name__)
from sat.core.constants import Const as C
from sat.memory import memory
from sat.memory import cache
@@ -41,10 +44,6 @@ from sat.tools.common import dynamic_import
from sat.tools.common import regex
from sat.stdui import ui_contact_list, ui_profile_manager
import sat.plugins
-from glob import glob
-import sys
-import os.path
-import uuid
try:
@@ -52,6 +51,7 @@ try:
except ImportError:
from ordereddict import OrderedDict
+log = getLogger(__name__)
class SAT(service.Service):
def __init__(self):
@@ -206,9 +206,14 @@ class SAT(service.Service):
)
)
sys.exit(1)
+ self._addBaseMenus()
self.initialised.callback(None)
log.info(_(u"Backend is ready"))
+ def _addBaseMenus(self):
+ """Add base menus"""
+ encryption.EncryptionHandler._importMenus(self)
+
def _unimport_plugin(self, plugin_path):
"""remove a plugin from sys.modules if it is there"""
try:
@@ -932,7 +937,7 @@ class SAT(service.Service):
d_list = defer.DeferredList(d_list)
# XXX: 10 seconds may be too low for slow connections (e.g. mobiles)
# but for discovery, that's also the time the user will wait the first time
- # before seing the page.
+ # before seing the page, if something goes wrong.
d_list.addTimeout(10, reactor)
infos_data = yield d_list
@@ -1188,14 +1193,8 @@ class SAT(service.Service):
"""
return tuple((p.lower().strip() for p in path))
- def importMenu(
- self,
- path,
- callback,
- security_limit=C.NO_SECURITY_LIMIT,
- help_string="",
- type_=C.MENU_GLOBAL,
- ):
+ def importMenu(self, path, callback, security_limit=C.NO_SECURITY_LIMIT,
+ help_string="", type_=C.MENU_GLOBAL):
"""register a new menu for frontends
@param path(iterable[unicode]): path to go to the menu
diff --git a/sat/memory/encryption.py b/sat/memory/encryption.py
index f805c79f..5d97954d 100644
--- a/sat/memory/encryption.py
+++ b/sat/memory/encryption.py
@@ -17,12 +17,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
+from functools import partial
from sat.core.i18n import D_, _
from sat.core.constants import Const as C
from sat.core import exceptions
from collections import namedtuple
from sat.core.log import getLogger
from sat.tools.common import data_format
+from twisted.words.protocols.jabber import jid
from twisted.internet import defer
from twisted.python import failure
import copy
@@ -257,7 +259,7 @@ class EncryptionHandler(object):
"""Stop an encryption session with an entity
@param entity(jid.JID): entity with who the encryption session must be stopped
- must be bare jid is the algorithm encrypt for all devices
+ must be bare jid if the algorithm encrypt for all devices
@param namespace(unicode): namespace of the session to stop
when specified, used to check we stop the right encryption session
"""
@@ -357,6 +359,59 @@ class EncryptionHandler(object):
else:
return defer.maybeDeferred(get_trust_ui, self.client, entity_jid)
+ ## Menus ##
+
+ @classmethod
+ def _importMenus(cls, host):
+ host.importMenu(
+ (D_(u"Encryption"), D_(u"unencrypted (plain text)")),
+ partial(cls._onMenuUnencrypted, host=host),
+ security_limit=0,
+ help_string=D_(u"End encrypted session"),
+ type_=C.MENU_SINGLE,
+ )
+ for plg in cls.getPlugins():
+ host.importMenu(
+ (D_(u"Encryption"), plg.name),
+ partial(cls._onMenuName, host=host, plg=plg),
+ security_limit=0,
+ help_string=D_(u"Start {name} session").format(name=plg.name),
+ type_=C.MENU_SINGLE,
+ )
+ host.importMenu(
+ (D_(u"Encryption"), D_(u"⛨ {name} trust").format(name=plg.name)),
+ partial(cls._onMenuTrust, host=host, plg=plg),
+ security_limit=0,
+ help_string=D_(u"Manage {name} trust").format(name=plg.name),
+ type_=C.MENU_SINGLE,
+ )
+
+ @classmethod
+ def _onMenuUnencrypted(cls, data, host, profile):
+ client = host.getClient(profile)
+ peer_jid = jid.JID(data[u'jid']).userhostJID()
+ d = client.encryption.stop(peer_jid)
+ d.addCallback(lambda __: {})
+ return d
+
+ @classmethod
+ def _onMenuName(cls, data, host, plg, profile):
+ client = host.getClient(profile)
+ peer_jid = jid.JID(data[u'jid'])
+ if not plg.directed:
+ peer_jid = peer_jid.userhostJID()
+ d = client.encryption.start(peer_jid, plg.namespace, replace=True)
+ d.addCallback(lambda __: {})
+ return d
+
+ @classmethod
+ @defer.inlineCallbacks
+ def _onMenuTrust(cls, data, host, plg, profile):
+ client = host.getClient(profile)
+ peer_jid = jid.JID(data[u'jid']).userhostJID()
+ ui = yield client.encryption.getTrustUI(peer_jid, plg.namespace)
+ defer.returnValue({u'xmlui': ui.toXml()})
+
## Triggers ##
def setEncryptionFlag(self, mess_data):