summaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
Diffstat (limited to 'plugins')
-rw-r--r--plugins/omemo_plugin.py124
1 files changed, 124 insertions, 0 deletions
diff --git a/plugins/omemo_plugin.py b/plugins/omemo_plugin.py
new file mode 100644
index 00000000..8852aa2b
--- /dev/null
+++ b/plugins/omemo_plugin.py
@@ -0,0 +1,124 @@
+#! /usr/bin/env python3
+# -*- coding: utf-8 -*-
+# vim:fenc=utf-8
+#
+# Copyright © 2018 Maxime “pep” Buquet <pep@bouah.net>
+#
+# Distributed under terms of the zlib license.
+"""
+ OMEMO Plugin.
+"""
+
+import os
+import asyncio
+import textwrap
+from poezio.plugin import BasePlugin
+from poezio.tabs import ConversationTab
+from poezio.config import CACHE_DIR
+
+
+class Plugin(BasePlugin):
+ def init(self):
+ self.info = lambda i: self.api.information(i, 'Info')
+ self.xmpp = self.core.xmpp
+
+ self.info('CACHE_DIR: %r' % CACHE_DIR)
+
+ self.xmpp.register_plugin(
+ 'xep_0384', {
+ 'cache_dir': os.path.join(CACHE_DIR, 'omemo.sqlite'),
+ })
+ self.info('FOO')
+
+ self.api.add_command(
+ 'omemo',
+ self.command_status,
+ help='Display contextual information status',
+ )
+
+ self.api.add_tab_command(
+ ConversationTab,
+ 'omemo_enable',
+ self.command_enable,
+ help='Enable OMEMO encryption',
+ )
+
+ self.api.add_tab_command(
+ ConversationTab,
+ 'omemo_disable',
+ self.command_disable,
+ help='Disable OMEMO encryption',
+ )
+
+ self.api.add_tab_command(
+ ConversationTab,
+ 'omemo_toggle',
+ self.command_toggle,
+ help='Toggle OMEMO encryption state',
+ )
+
+ self.api.add_command(
+ 'omemo_clear_devices',
+ self.command_clear_devices,
+ help='Clear all other OMEMO devices',
+ )
+
+ self.api.add_event_handler(
+ 'conversation_say_after',
+ self.on_conversation_say_after,
+ )
+
+ self.api.add_event_handler(
+ 'conversation_msg',
+ self.on_conversation_msg,
+ )
+
+ def command_status(self, _args):
+ """Display contextual information depending on currenttab."""
+ tab = self.api.current_tab()
+ self.info('OMEMO!')
+
+ def command_enable(self, _args):
+ pass
+
+ def command_disable(self, args):
+ pass
+
+ def command_toggle(self, _args):
+ pass
+
+ def command_clear_devices(self, _args):
+ asyncio.ensure_future(self.xmpp['xep_0384'].clear_device_list())
+ info = """
+ Device list has been reset.
+ Your other devices will reannounce themselves next time they get
+ online, but they might not be able to read encrypted messages in the
+ meantime.
+ """
+ self.info(textwrap.dedent(info).strip())
+
+ def on_conversation_say_after(self, message, tab):
+ """
+ Outbound messages
+ """
+
+ # Check encryption status globally and to the contact, if enabled, add
+ # ['omemo_encrypt'] attribute to message and send. Maybe delete
+ # ['body'] and tab.add_message ourselves to specify typ=0 so messages
+ # are not logged.
+
+ fromjid = message['from']
+ self.xmpp['xep_0384'].encrypt_message(message)
+ self.info('Foo1')
+
+ def on_conversation_msg(self, message, _tab):
+ """
+ Inbound messages
+ """
+
+ # Check if encrypted, and if so replace message['body'] with
+ # plaintext.
+
+ self.info('Foo2')
+ if self.xmpp['xep_0384'].is_encrypted(message):
+ self.xmpp['xep_0384'].decrypt_message(message)