# 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: Fingerprints authentication GUI
# TODO: SMP authentication GUI
ERROR = None
import logging
from gajim . plugins import GajimPlugin
from gajim . common import app
try : from . otr import *
except ImportError : ERROR = ' python3-potr is missing '
# ...
class OTRPlugin ( GajimPlugin ) :
log = logging . getLogger ( ' gajim.p.otr ' )
# init plugin #
def init ( self ) :
self . encryption_name = ' OTR '
self . description = ' Provides Off-the-Record encryption '
self . activatable = ( not ERROR )
self . available_text = ( ERROR )
self . instances = { }
self . getinstance = lambda acct : self . instances . get ( acct ) or self . instances . setdefault ( acct , OTR ( self , acct ) )
self . gui_extension_points = {
' encrypt ' + self . encryption_name : ( self . _encrypt_message , None ) ,
' decrypt ' : ( self . _decrypt_message , None ) ,
}
# activate encryption #
@staticmethod
def activate_encryption ( ctl ) :
return True
# encrypt file (just return same file)
@staticmethod
def encrypt_file ( file , account , callback ) :
callback ( file )
# 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 . getinstance ( event . conn . name )
otr . encrypt ( event , callback )
# decrypt message #
def _decrypt_message ( self , con , event , callback ) :
if ( event . encrypted ) or ( event . name [ 0 : 2 ] == ' gc ' ) or not ( event . msgtxt or ' ' ) . startswith ( ' ?OTR ' ) : return # skip non-OTR messages..
if ( event . name [ 0 : 3 ] == ' mam ' ) : return setattr ( event , ' msgtxt ' , ' ' ) # skip MAM messages (we can not decrypt OTR out of session)..
if ( app . config . get_per ( ' encryption ' , ' %s - %s ' % ( event . conn . name , event . jid ) , ' encryption ' ) != self . encryption_name ) : return # skip all when encryption not set to OTR
otr = self . getinstance ( event . conn . name )
otr . decrypt ( event , callback )