105 lines
3.4 KiB
Python
105 lines
3.4 KiB
Python
# Copyright (C) 2019 Philipp Hörist <philipp AT hoerist.com>
|
|
# Copyright (C) 2019 Pavel R. <pd at narayana dot im>
|
|
# Copyright (C) 2022 Bohdan Horbeshko <bodqhrohro@gmail.com>
|
|
|
|
# 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: Fingerprints authentication GUI
|
|
# TODO: SMP authentication GUI
|
|
ERROR = None
|
|
|
|
import logging
|
|
from gajim.plugins import GajimPlugin
|
|
from gajim.common import app
|
|
from gajim.common.modules.contacts import BareContact
|
|
from gi.repository import Gtk
|
|
|
|
log = logging.getLogger('gajim.p.otr')
|
|
|
|
try: from Cryptodome import *
|
|
except ImportError as e:
|
|
log.error(e)
|
|
ERROR = 'Cryptodome is missing'
|
|
|
|
if not ERROR:
|
|
try:
|
|
from . import module
|
|
except Exception as error:
|
|
log.error(error)
|
|
ERROR = 'Error: %s' % error
|
|
|
|
# ...
|
|
class OTRPlugin(GajimPlugin):
|
|
log = logging.getLogger('gajim.p.otr')
|
|
|
|
# init plugin #
|
|
def init(self):
|
|
self.activatable = (not ERROR)
|
|
if ERROR:
|
|
self.available_text = (ERROR)
|
|
return
|
|
self.encryption_name = 'OTR'
|
|
self.description = 'Provides Off-the-Record encryption'
|
|
self.modules = [module]
|
|
self.gui_extension_points = {
|
|
'encrypt' + self.encryption_name: (self._encrypt_message, None),
|
|
'message_actions_box': (self._actions_hack_activate, self._actions_hack_deactivate),
|
|
'switch_contact': (self._switch_contact, None),
|
|
}
|
|
|
|
@staticmethod
|
|
def get_otr(account):
|
|
return app.connections[account].get_module('OTR')
|
|
|
|
# activate encryption #
|
|
@staticmethod
|
|
def activate_encryption(ctl):
|
|
return True
|
|
|
|
# encrypt file (just return same file)
|
|
@staticmethod
|
|
def encrypt_file(file, account, callback):
|
|
callback(file)
|
|
|
|
def toggle_otr(self):
|
|
pass
|
|
|
|
# encrypt message #
|
|
def _encrypt_message(self,con,event,callback):
|
|
if not event.message or event.type_ != 'chat': return # drop empty and non-chat messages
|
|
otr = self.get_otr(event.account)
|
|
otr.otr.encrypt(event,callback)
|
|
|
|
def _actions_hack_activate(self, grid, box):
|
|
self.switch_box = Gtk.VBox()
|
|
label = Gtk.Label(label='OTR')
|
|
self.switch = Gtk.Switch()
|
|
self.switch_box.pack_start(label, False, True, 0)
|
|
self.switch_box.pack_start(self.switch, True, True, 0)
|
|
box.pack_start(self.switch_box, False, True, 0)
|
|
self.switch.connect('activate', self.toggle_otr)
|
|
self._update_switch_visibility(app.window.get_chat_stack()._get_current_contact())
|
|
|
|
def _actions_hack_deactivate(self, grid, box):
|
|
box.remove(self.switch_box)
|
|
|
|
def _update_switch_visibility(self, contact):
|
|
if isinstance(contact, BareContact):
|
|
self.switch_box.show_all()
|
|
else:
|
|
self.switch_box.hide()
|
|
|
|
def _switch_contact(self, contact):
|
|
self._update_switch_visibility(contact)
|