quick frontend (app, chat): encryption handling:

- new QuickApp.ENCRYPTION_HANDLERS class attribute, if True (default), encryption handlers are set
- encryption plugins are retrieved on startup and cached in QuickApp.encryption_plugins list
- QuickChat's encrypted boolean attribute indicate if a session is currently encrypted. This is updated
  automatically if ENCRYPTION_HANDLERS is set
- if ENCRYPTION_HANDLERS is set, messageEncryptionStarted and messageEncryptionStopped are called when
  suitable.
This commit is contained in:
Goffi 2018-08-11 18:24:55 +02:00
commit 1cb7461f99

View file

@ -19,14 +19,14 @@
from sat.core.i18n import _
from sat.core.log import getLogger
log = getLogger(__name__)
from sat.tools.common import data_format
from sat.core import exceptions
from sat_frontends.quick_frontend import quick_widgets
from sat_frontends.quick_frontend.constants import Const as C
from collections import OrderedDict
from sat_frontends.tools import jid
import time
log = getLogger(__name__)
try:
from locale import getlocale
@ -56,19 +56,8 @@ except (
class Message(object):
"""Message metadata"""
def __init__(
self,
parent,
uid,
timestamp,
from_jid,
to_jid,
msg,
subject,
type_,
extra,
profile,
):
def __init__(self, parent, uid, timestamp, from_jid, to_jid, msg, subject, type_,
extra, profile):
self.parent = parent
self.profile = profile
self.uid = uid
@ -269,18 +258,11 @@ class Occupant(object):
class QuickChat(quick_widgets.QuickWidget):
visible_states = ["chat_state"] # FIXME: to be removed, used only in quick_games
def __init__(
self,
host,
target,
type_=C.CHAT_ONE2ONE,
nick=None,
occupants=None,
subject=None,
profiles=None,
):
def __init__(self, host, target, type_=C.CHAT_ONE2ONE, nick=None, occupants=None,
subject=None, profiles=None):
"""
@param type_: can be C.CHAT_ONE2ONE for single conversation or C.CHAT_GROUP for chat à la IRC
@param type_: can be C.CHAT_ONE2ONE for single conversation or C.CHAT_GROUP for
chat à la IRC
"""
self.lang = "" # default language to use for messages
quick_widgets.QuickWidget.__init__(self, host, target, profiles=profiles)
@ -290,6 +272,7 @@ class QuickChat(quick_widgets.QuickWidget):
assert type_ in (C.CHAT_ONE2ONE, C.CHAT_GROUP)
self.current_target = target
self.type = type_
self.encrypted = False # True if this session is currently encrypted
if type_ == C.CHAT_GROUP:
if target.resource:
raise exceptions.InternalError(
@ -332,6 +315,8 @@ class QuickChat(quick_widgets.QuickWidget):
self.historyPrint(profile=self.profile)
if self.subject is not None:
self.setSubject(self.subject)
if self.host.ENCRYPTION_HANDLERS:
self.getEncryptionState()
def onDelete(self):
if self.host.AVATARS_HANDLER:
@ -565,9 +550,27 @@ class QuickChat(quick_widgets.QuickWidget):
errback=_historyGetEb,
)
def messageNew(
self, uid, timestamp, from_jid, to_jid, msg, subject, type_, extra, profile
):
def messageEncryptionGetCb(self, session_data):
if session_data:
session_data = data_format.deserialise(session_data)
self.messageEncryptionStarted(session_data)
def messageEncryptionGetEb(self, failure_):
log.error(_(u"Can't get encryption state: {reason}").format(reason=failure_))
def getEncryptionState(self):
"""Retrieve encryption state with current target.
Once state is retrieved, default messageEncryptionStarted will be called if
suitable
"""
self.host.bridge.messageEncryptionGet(self.target, self.profile,
callback=self.messageEncryptionGetCb,
errback=self.messageEncryptionGetEb)
def messageNew(self, uid, timestamp, from_jid, to_jid, msg, subject, type_, extra,
profile):
if self._locked:
self._cache[uid] = (
uid,
@ -583,7 +586,8 @@ class QuickChat(quick_widgets.QuickWidget):
return
if self.type == C.CHAT_GROUP:
if to_jid.resource and type_ != C.MESS_TYPE_GROUPCHAT:
# we have a private message, we forward it to a private conversation widget
# we have a private message, we forward it to a private conversation
# widget
chat_widget = self.getOrCreatePrivateWidget(to_jid)
chat_widget.messageNew(
uid, timestamp, from_jid, to_jid, msg, subject, type_, extra, profile
@ -612,6 +616,16 @@ class QuickChat(quick_widgets.QuickWidget):
log.warning(u"Delayed message received after history, this should not happen")
self.createMessage(message)
def messageEncryptionStarted(self, session_data):
self.encrypted = True
log.debug(_(u"message encryption started with {target} using {encryption}").format(
target=self.target, encryption=session_data[u'name']))
def messageEncryptionStopped(self, session_data):
self.encrypted = False
log.debug(_(u"message encryption stopped with {target} (was using {encryption})")
.format(target=self.target, encryption=session_data[u'name']))
def createMessage(self, message, append=False):
"""Must be implemented by frontend to create and show a new message widget