Philipp Hörist pushed to branch master at gajim / gajim
Commits: 12389f40 by Philipp Hörist at 2019-02-19T19:38:57Z Remove unused code
- - - - - 12d909d6 by Philipp Hörist at 2019-02-19T19:38:57Z LastActivity: Use BaseModule and StanzaHandler
- - - - - 0963f444 by Philipp Hörist at 2019-02-19T23:31:24Z Use nbxmpp's parsed EME data
- - - - - e3f8f050 by Philipp Hörist at 2019-02-19T23:31:28Z Zeroconf: Fix missing attrs
- - - - -
8 changed files:
- gajim/common/const.py - gajim/common/modules/last_activity.py - gajim/common/modules/mam.py - gajim/common/modules/message.py - gajim/common/modules/misc.py - gajim/common/modules/util.py - gajim/common/zeroconf/client_zeroconf.py - gajim/common/zeroconf/connection_handlers_zeroconf.py
Changes:
===================================== gajim/common/const.py ===================================== @@ -200,6 +200,23 @@ class MUCUser(IntEnum): AFFILIATION_TEXT = 4
+EME_MESSAGES = { + 'urn:xmpp:otr:0': + _('This message was encrypted with OTR ' + 'and could not be decrypted.'), + 'jabber:x:encrypted': + _('This message was encrypted with Legacy ' + 'OpenPGP and could not be decrypted. You can install ' + 'the PGP plugin to handle those messages.'), + 'urn:xmpp:openpgp:0': + _('This message was encrypted with ' + 'OpenPGP for XMPP and could not be decrypted.'), + 'fallback': + _('This message was encrypted with %s ' + 'and could not be decrypted.') +} + + ACTIVITIES = { 'doing_chores': { 'category': _('Doing Chores'),
===================================== gajim/common/modules/last_activity.py ===================================== @@ -17,31 +17,37 @@ import logging
import nbxmpp +from nbxmpp.structs import StanzaHandler
from gajim.common import app from gajim.common import idle +from gajim.common.modules.base import BaseModule
log = logging.getLogger('gajim.c.m.last_activity')
-class LastActivity: +class LastActivity(BaseModule): def __init__(self, con): - self._con = con - self._account = con.name + BaseModule.__init__(self, con)
- self.handlers = [('iq', self._answer_request, 'get', nbxmpp.NS_LAST)] + self.handlers = [ + StanzaHandler(name='iq', + typ='get', + callback=self._answer_request, + ns=nbxmpp.NS_LAST), + ]
- def _answer_request(self, _con, stanza): - log.info('Request from %s', stanza.getFrom()) - if not app.account_is_connected(self._account): - return + def _answer_request(self, _con, stanza, properties): + log.info('Request from %s', properties.jid)
allow_send = app.config.get_per( 'accounts', self._account, 'send_idle_time') if app.is_installed('IDLE') and allow_send: iq = stanza.buildReply('result') query = iq.setQuery() - query.attrs['seconds'] = idle.Monitor.get_idle_sec() + seconds = idle.Monitor.get_idle_sec() + query.attrs['seconds'] = seconds + log.info('Respond with seconds: %s', seconds) else: iq = stanza.buildReply('error') err = nbxmpp.ErrorNode(nbxmpp.ERR_SERVICE_UNAVAILABLE)
===================================== gajim/common/modules/mam.py ===================================== @@ -33,7 +33,7 @@ from gajim.common.helpers import AdditionalDataDict from gajim.common.modules.misc import parse_delay from gajim.common.modules.misc import parse_oob from gajim.common.modules.misc import parse_correction -from gajim.common.modules.misc import parse_eme +from gajim.common.modules.util import get_eme_message
log = logging.getLogger('gajim.c.m.archiving')
@@ -170,11 +170,9 @@ class MAM: else: app.plugin_manager.extension_point( 'decrypt', self._con, event, self._decryption_finished) - if not event.encrypted: - eme = parse_eme(event.message) - if eme is not None: - event.msgtxt = eme + if properties.eme is not None: + event.msgtxt = get_eme_message(properties.eme) self._decryption_finished(event)
raise nbxmpp.NodeProcessed
===================================== gajim/common/modules/message.py ===================================== @@ -28,10 +28,10 @@ from gajim.common.nec import NetworkIncomingEvent from gajim.common.nec import NetworkEvent from gajim.common.helpers import AdditionalDataDict from gajim.common.const import KindConstant +from gajim.common.modules.util import get_eme_message from gajim.common.modules.security_labels import parse_securitylabel from gajim.common.modules.user_nickname import parse_nickname from gajim.common.modules.misc import parse_delay -from gajim.common.modules.misc import parse_eme from gajim.common.modules.misc import parse_correction from gajim.common.modules.misc import parse_attention from gajim.common.modules.misc import parse_form @@ -187,9 +187,8 @@ class Message: app.plugin_manager.extension_point( 'decrypt', self._con, event, self._on_message_decrypted) if not event.encrypted: - eme = parse_eme(event.stanza) - if eme is not None: - event.msgtxt = eme + if properties.eme is not None: + event.msgtxt = get_eme_message(properties.eme) self._on_message_decrypted(event)
def _on_message_decrypted(self, event):
===================================== gajim/common/modules/misc.py ===================================== @@ -19,50 +19,11 @@ import logging import nbxmpp
from gajim.common import app -from gajim.common.i18n import _ from gajim.common.modules.date_and_time import parse_datetime
log = logging.getLogger('gajim.c.m.misc')
-# XEP-0380: Explicit Message Encryption - -_eme_namespaces = { - 'urn:xmpp:otr:0': - _('This message was encrypted with OTR ' - 'and could not be decrypted.'), - 'jabber:x:encrypted': - _('This message was encrypted with Legacy ' - 'OpenPGP and could not be decrypted. You can install ' - 'the PGP plugin to handle those messages.'), - 'urn:xmpp:openpgp:0': - _('This message was encrypted with ' - 'OpenPGP for XMPP and could not be decrypted.'), - 'fallback': - _('This message was encrypted with %s ' - 'and could not be decrypted.') -} - - -def parse_eme(stanza): - enc_tag = stanza.getTag('encryption', namespace=nbxmpp.NS_EME) - if enc_tag is None: - return - - ns = enc_tag.getAttr('namespace') - if ns is None: - log.warning('No namespace on EME message') - return - - if ns in _eme_namespaces: - log.info('Found not decrypted message: %s', ns) - return _eme_namespaces.get(ns) - - enc_name = enc_tag.getAttr('name') - log.info('Found not decrypted message: %s', enc_name or ns) - return _eme_namespaces.get('fallback') % enc_name or ns - - # XEP-0203: Delayed Delivery
def parse_delay(stanza, epoch=True, convert='utc', from_=None, not_from=None): @@ -157,24 +118,3 @@ def parse_xhtml(stanza): if app.config.get('ignore_incoming_xhtml'): return None return stanza.getXHTML() - - -# XEP-0319: Last User Interaction in Presence - -def parse_idle(stanza): - idle_tag = stanza.getTag('idle', namespace=nbxmpp.NS_IDLE) - if idle_tag is None: - return - - since = idle_tag.getAttr('since') - if since is None: - log.warning('No since attr in idle node') - log.warning(stanza) - return - - timestamp = parse_datetime(since, convert='utc', epoch=True) - if timestamp is None: - log.warning('Invalid timestamp received: %s', since) - log.warning(stanza) - - return timestamp
===================================== gajim/common/modules/util.py ===================================== @@ -20,6 +20,7 @@ from functools import wraps from functools import partial
from gajim.common import app +from gajim.common.const import EME_MESSAGES
def from_xs_boolean(value: Union[str, bool]) -> bool: @@ -73,3 +74,10 @@ def store_publish(func): return return func(self, *args, **kwargs) return func_wrapper + + +def get_eme_message(eme_data): + try: + return EME_MESSAGES[eme_data.namespace] + except KeyError: + return EME_MESSAGES['fallback'] % eme_data.name
===================================== gajim/common/zeroconf/client_zeroconf.py ===================================== @@ -28,6 +28,7 @@ from unittest.mock import Mock import nbxmpp from nbxmpp import dispatcher_nb from nbxmpp import simplexml +from nbxmpp.structs import StanzaHandler from nbxmpp.plugin import PlugIn from nbxmpp.idlequeue import IdleObject from nbxmpp.transports_nb import DATA_RECEIVED @@ -322,8 +323,10 @@ class P2PClient(IdleObject):
def _register_handlers(self): self._caller.peerhost = self.Connection._sock.getsockname() - self.RegisterHandler('message', lambda conn, - data: self._caller._messageCB(self.Server, conn, data)) + + self.RegisterHandler(*StanzaHandler(name='message', + callback=self._caller._messageCB)) + self.RegisterHandler('iq', self._caller._siSetCB, 'set', nbxmpp.NS_SI) self.RegisterHandler('iq', self._caller._siErrorCB, 'error', nbxmpp.NS_SI)
===================================== gajim/common/zeroconf/connection_handlers_zeroconf.py ===================================== @@ -27,14 +27,13 @@ import nbxmpp from gajim.common import app
from gajim.common.protocol.bytestream import ConnectionSocks5BytestreamZeroconf -from gajim.common.zeroconf.zeroconf import Constant from gajim.common import connection_handlers from gajim.common.i18n import _ from gajim.common.helpers import AdditionalDataDict from gajim.common.nec import NetworkIncomingEvent, NetworkEvent from gajim.common.const import KindConstant from gajim.common.modules.user_nickname import parse_nickname -from gajim.common.modules.misc import parse_eme +from gajim.common.modules.util import get_eme_message from gajim.common.modules.misc import parse_correction from gajim.common.modules.misc import parse_attention from gajim.common.modules.misc import parse_oob @@ -65,11 +64,14 @@ class ConnectionHandlersZeroconf(ConnectionSocks5BytestreamZeroconf, connection_handlers.ConnectionJingle.__init__(self) connection_handlers.ConnectionHandlersBase.__init__(self)
- def _messageCB(self, ip, con, stanza): + def _messageCB(self, con, stanza, properties): """ Called when we receive a message """ - log.debug('Zeroconf MessageCB') + log.info('Zeroconf MessageCB') + + # Dont trust from attr set by sender + stanza.setFrom(con._owner.to)
app.nec.push_incoming_event(NetworkEvent( 'raw-message-received', @@ -85,13 +87,6 @@ class ConnectionHandlersZeroconf(ConnectionSocks5BytestreamZeroconf,
fjid = str(stanza.getFrom())
- if fjid is None: - for key in self.connection.zeroconf.contacts: - if ip == self.connection.zeroconf.contacts[key][ - Constant.ADDRESS]: - fjid = key - break - jid, resource = app.get_room_and_nick_from_fjid(fjid)
thread_id = stanza.getThread() @@ -118,6 +113,7 @@ class ConnectionHandlersZeroconf(ConnectionSocks5BytestreamZeroconf, 'jid': jid, 'resource': resource, 'unique_id': id_, + 'message_id': properties.id, 'mtype': type_, 'msgtxt': msgtxt, 'thread_id': thread_id, @@ -132,9 +128,8 @@ class ConnectionHandlersZeroconf(ConnectionSocks5BytestreamZeroconf, app.plugin_manager.extension_point( 'decrypt', self, event, self._on_message_decrypted) if not event.encrypted: - eme = parse_eme(event.stanza) - if eme is not None: - event.msgtxt = eme + if properties.eme is not None: + event.msgtxt = get_eme_message(properties.eme) self._on_message_decrypted(event)
def _on_message_decrypted(self, event):
View it on GitLab: https://dev.gajim.org/gajim/gajim/compare/72fc96ae6374db9e438a439f2d64874031...