core: added a base menu allowing to set encryption session or show the trust management UI.

This commit is contained in:
Goffi 2019-02-24 14:11:08 +01:00
commit d8f6620d00
2 changed files with 69 additions and 15 deletions

View file

@ -17,6 +17,10 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
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

View file

@ -17,12 +17,14 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
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):