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:
parent
3fc6de121a
commit
1cb7461f99
1 changed files with 121 additions and 57 deletions
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue