# Slixmpp: The Slick XMPP Library# Copyright (C) 2016 Emmanuel Gil Peyrot <linkmauve@linkmauve.fr># This file is part of Slixmpp.# See the file LICENSE for copying permission.importloggingimportslixmppfromslixmpp.stanzaimportMessagefromslixmpp.xmlstream.handlerimportCallbackfromslixmpp.xmlstream.matcherimportStanzaPathfromslixmpp.xmlstreamimportregister_stanza_plugin,ElementBase,ETfromslixmpp.pluginsimportBasePluginfromslixmpp.plugins.xep_0380importstanza,Encryptionlog=logging.getLogger(__name__)
[docs]classXEP_0380(BasePlugin):""" XEP-0380: Explicit Message Encryption """name='xep_0380'description='XEP-0380: Explicit Message Encryption'dependencies={'xep_0030'}default_config={'template':'This message is encrypted with {name} ({namespace})',}mechanisms={'jabber:x:encrypted':'Legacy OpenPGP','urn:xmpp:ox:0':'OpenPGP for XMPP','urn:xmpp:otr:0':'OTR','eu.siacs.conversations.axolotl':'Legacy OMEMO','urn:xmpp:omemo:0':'OMEMO',}defplugin_init(self):self.xmpp.register_handler(Callback('Explicit Message Encryption',StanzaPath('message/eme'),self._handle_eme))register_stanza_plugin(Message,Encryption)defsession_bind(self,jid):self.xmpp.plugin['xep_0030'].add_feature(Encryption.namespace)defhas_eme(self,msg):returnmsg.xml.find('{%s}encryption'%Encryption.namespace)isnotNonedefadd_eme(self,msg:Message,namespace:str)->Message:msg['eme']['name']=self.mechanisms[namespace]msg['eme']['namespace']=namespacereturnmsgdefreplace_body_with_eme(self,msg):eme=msg['eme']namespace=eme['namespace']name=self.mechanisms[namespace]ifnamespaceinself.mechanismselseeme['name']body=self.config['template'].format(name=name,namespace=namespace)msg['body']=bodydef_handle_eme(self,msg):self.xmpp.event('message_encryption',msg)