# Copyright (C) 2019 Philipp Hörist # Copyright (C) 2019 Pavel R. # This file is part of Gajim OTR Plugin. # # Gajim OTR Plugin is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published # by the Free Software Foundation; version 3 only. # # This software is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You can always obtain full license text at . # TODO: OTR state notifications # TODO: Fingerprints authentication GUI # TODO: SMP authentication GUI ERROR = None import logging from gajim.common import app from gajim.plugins import GajimPlugin try: from otrplugin.otr import OTR except: ERROR = 'Error importing python3-potr module. Make sure it is installed.' log = logging.getLogger('gajim.p.otr') class OTRPlugin(GajimPlugin): def init(self): self.encryption_name = OTR.ENCRYPTION_NAME self.description = 'Provides Off-the-Record encryption' self.activatable = not ERROR self.available_text = ERROR self.sessions = {} self.session = lambda account: self.sessions.setdefault(account, OTR(account, logger = log)) self.gui_extension_points = { 'encrypt' + self.encryption_name: (self._encrypt_message, None), 'decrypt': (self._decrypt_message, None), } @staticmethod def activate_encryption(ctl): return True @staticmethod def encrypt_file(file, account, callback): callback(file) def _encrypt_message(self, con, event, callback): if not event.message or event.type_ != 'chat': return # drop empty or non-chat messages log.debug('encrypting message: %s' % event) otr = self.session(event.account) otr._encrypt(event, callback) def _decrypt_message(self, con, event, callback): if event.name == 'mam-message-received': event.msgtxt = '' # drop mam messages because we cannot decrypt it post-factum if not event.msgtxt or not event.msgtxt.startswith("?OTR"): return # drop messages without OTR tag log.debug('received otr message: %s' % event) otr = self.session(event.account) otr._decrypt(event, callback)