aa98fd901c
[+] code refactoring & compatibility — aiming Debian's version of Gajim [+] correctly resending messages after session open [+] I love you ♥
64 lines
2.4 KiB
Python
64 lines
2.4 KiB
Python
# Copyright (C) 2019 Philipp Hörist <philipp AT hoerist.com>
|
|
# Copyright (C) 2019 Pavel R. <pd at narayana dot im>
|
|
|
|
# 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 <http://www.gnu.org/licenses/>.
|
|
|
|
# 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)
|