about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--Makefile.am8
-rw-r--r--configure.ac13
-rw-r--r--src/command/cmd_defs.c20
-rw-r--r--src/command/cmd_funcs.c23
-rw-r--r--src/command/cmd_funcs.h2
-rw-r--r--src/omemo/omemo.c10
6 files changed, 75 insertions, 1 deletions
diff --git a/Makefile.am b/Makefile.am
index c1784f32..226f9bad 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -69,6 +69,7 @@ unittest_sources = \
 	src/ui/ui.h \
 	src/otr/otr.h \
 	src/pgp/gpg.h \
+	src/omemo/omemo.h \
 	src/command/cmd_defs.h src/command/cmd_defs.c \
 	src/command/cmd_funcs.h src/command/cmd_funcs.c \
 	src/command/cmd_ac.h src/command/cmd_ac.c \
@@ -168,6 +169,9 @@ otr3_sources = \
 otr4_sources = \
 	src/otr/otrlib.h src/otr/otrlibv4.c src/otr/otr.h src/otr/otr.c
 
+omemo_sources = \
+	src/omemo/omemo.h src/omemo/omemo.c
+
 if BUILD_PYTHON_API
 core_sources += $(python_sources)
 unittest_sources += $(python_sources)
@@ -204,6 +208,10 @@ core_sources += $(otr4_sources)
 endif
 endif
 
+if BUILD_OMEMO
+core_sources += $(omemo_sources)
+endif
+
 AM_CFLAGS = @AM_CFLAGS@ -I$(srcdir)/src
 
 bin_PROGRAMS = profanity
diff --git a/configure.ac b/configure.ac
index 0b8e4512..9cce9840 100644
--- a/configure.ac
+++ b/configure.ac
@@ -60,6 +60,8 @@ AC_ARG_ENABLE([otr],
     [AS_HELP_STRING([--enable-otr], [enable otr encryption])])
 AC_ARG_ENABLE([pgp],
     [AS_HELP_STRING([--enable-pgp], [enable pgp])])
+AC_ARG_ENABLE([omemo],
+    [AS_HELP_STRING([--enable-omemo], [enable omemo encryption])])
 AC_ARG_WITH([xscreensaver],
     [AS_HELP_STRING([--with-xscreensaver], [use libXScrnSaver to determine idle time])])
 AC_ARG_WITH([themes],
@@ -264,6 +266,17 @@ if test "x$enable_otr" != xno; then
             [AC_MSG_NOTICE([libotr not found, otr encryption support not enabled])])])
 fi
 
+AM_CONDITIONAL([BUILD_OMEMO], [false])
+if test "x$enable_omemo" != xno; then
+    AC_CHECK_LIB([signal-protocol-c], [signal_context_create],
+        [AM_CONDITIONAL([BUILD_OMEMO], [true])
+         AC_DEFINE([HAVE_LIBSIGNAL_PROTOCOL], [1], [Have omemo]),
+         LIBS="-lsignal-protocol-c $LIBS"],
+        [AS_IF([test "x$enable_omemo" = xyes],
+            [AC_MSG_ERROR([libsignal-protocol-c is required for omemo support])],
+            [AC_MSG_NOTICE([libsignal-protocol-c not found, omemo support not enabled])])])
+fi
+
 AS_IF([test "x$with_themes" = xno],
     [THEMES_INSTALL="false"],
     [THEMES_INSTALL="true"])
diff --git a/src/command/cmd_defs.c b/src/command/cmd_defs.c
index 4447020b..23ab2ebf 100644
--- a/src/command/cmd_defs.c
+++ b/src/command/cmd_defs.c
@@ -2328,7 +2328,25 @@ static struct cmd_t command_defs[] =
         CMD_EXAMPLES(
             "/cmd list",
             "/cmd exec ping")
-    }
+    },
+
+    { "/omemo",
+        parse_args, 1, 3, NULL,
+        CMD_SUBFUNCS(
+            { "init", cmd_omemo_init })
+        CMD_NOMAINFUNC
+        CMD_TAGS(
+            CMD_TAG_CHAT,
+            CMD_TAG_UI)
+        CMD_SYN(
+            "/omemo init")
+        CMD_DESC(
+            "Omemo commands to manage keys, and perform encryption during chat sessions.")
+        CMD_ARGS(
+            { "init", "Initialize omemo" })
+        CMD_EXAMPLES(
+            "/omemo init")
+    },
 };
 
 static GHashTable *search_index;
diff --git a/src/command/cmd_funcs.c b/src/command/cmd_funcs.c
index b2f0ee7f..97ce2025 100644
--- a/src/command/cmd_funcs.c
+++ b/src/command/cmd_funcs.c
@@ -85,6 +85,10 @@
 #include "pgp/gpg.h"
 #endif
 
+#ifdef HAVE_LIBSIGNAL_PROTOCOL
+#include "omemo/omemo.h"
+#endif
+
 #ifdef HAVE_GTK
 #include "ui/tray.h"
 #endif
@@ -7872,3 +7876,22 @@ _cmd_set_boolean_preference(gchar *arg, const char *const command,
     g_string_free(enabled, TRUE);
     g_string_free(disabled, TRUE);
 }
+
+gboolean
+cmd_omemo_init(ProfWin *window, const char *const command, gchar **args)
+{
+#ifdef HAVE_LIBSIGNAL_PROTOCOL
+    if (connection_get_status() != JABBER_CONNECTED) {
+        cons_show("You must be connected with an account to initialize omemo");
+        return TRUE;
+    }
+
+    ProfAccount *account = accounts_get_account(session_get_account_name());
+    omemo_init(account);
+    cons_show("Initialized omemo");
+    return TRUE;
+#else
+    cons_show("This version of Profanity has not been built with Omemo support enabled");
+    return TRUE;
+#endif
+}
diff --git a/src/command/cmd_funcs.h b/src/command/cmd_funcs.h
index 89166ba1..fb81721d 100644
--- a/src/command/cmd_funcs.h
+++ b/src/command/cmd_funcs.h
@@ -214,4 +214,6 @@ gboolean cmd_wins_swap(ProfWin *window, const char *const command, gchar **args)
 
 gboolean cmd_form_field(ProfWin *window, char *tag, gchar **args);
 
+gboolean cmd_omemo_init(ProfWin *window, const char *const command, gchar **args);
+
 #endif
diff --git a/src/omemo/omemo.c b/src/omemo/omemo.c
new file mode 100644
index 00000000..a0da5639
--- /dev/null
+++ b/src/omemo/omemo.c
@@ -0,0 +1,10 @@
+#include <signal/signal_protocol.h>
+
+#include "config/account.h"
+
+void
+omemo_init(ProfAccount *account)
+{
+	signal_context *global_context;
+	signal_context_create(&global_context, NULL);
+}