about summary refs log tree commit diff stats
path: root/src/omemo/omemo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/omemo/omemo.c')
-rw-r--r--src/omemo/omemo.c77
1 files changed, 62 insertions, 15 deletions
diff --git a/src/omemo/omemo.c b/src/omemo/omemo.c
index b85029ee..06174da5 100644
--- a/src/omemo/omemo.c
+++ b/src/omemo/omemo.c
@@ -14,6 +14,7 @@
 
 #include "config/account.h"
 #include "config/files.h"
+#include "config/preferences.h"
 #include "log.h"
 #include "omemo/crypto.h"
 #include "omemo/omemo.h"
@@ -922,21 +923,6 @@ omemo_known_device_identities(const char *const jid)
 }
 
 gboolean
-omemo_is_trusted_jid(const char *const jid)
-{
-    GHashTable *trusted = g_hash_table_lookup(omemo_ctx.identity_key_store.trusted, jid);
-    if (!trusted) {
-        return FALSE;
-    }
-
-    if (g_hash_table_size(trusted) > 0) {
-        return TRUE;
-    }
-
-    return FALSE;
-}
-
-gboolean
 omemo_is_trusted_identity(const char *const jid, const char *const fingerprint)
 {
     GHashTable *known_identities = g_hash_table_lookup(omemo_ctx.known_devices, jid);
@@ -1197,6 +1183,67 @@ omemo_fingerprint_autocomplete_reset(void)
     autocomplete_reset(omemo_ctx.fingerprint_ac);
 }
 
+gboolean
+omemo_automatic_start(const char *const recipient)
+{
+    gboolean result;
+    char *account_name = session_get_account_name();
+    ProfAccount *account = accounts_get_account(account_name);
+    prof_omemopolicy_t policy;
+
+    if (account->omemo_policy) {
+        // check default account setting
+        if (g_strcmp0(account->omemo_policy, "manual") == 0) {
+            policy = PROF_OMEMOPOLICY_MANUAL;
+        }
+        if (g_strcmp0(account->omemo_policy, "opportunistic") == 0) {
+            policy = PROF_OMEMOPOLICY_AUTOMATIC;
+        }
+        if (g_strcmp0(account->omemo_policy, "always") == 0) {
+            policy = PROF_OMEMOPOLICY_ALWAYS;
+        }
+    } else {
+        // check global setting
+        char *pref_omemo_policy = prefs_get_string(PREF_OMEMO_POLICY);
+
+        // pref defaults to manual
+        policy = PROF_OMEMOPOLICY_AUTOMATIC;
+
+        if (strcmp(pref_omemo_policy, "manual") == 0) {
+            policy = PROF_OMEMOPOLICY_MANUAL;
+        } else if (strcmp(pref_omemo_policy, "always") == 0) {
+            policy = PROF_OMEMOPOLICY_ALWAYS;
+        }
+
+        prefs_free_string(pref_omemo_policy);
+    }
+
+    switch (policy) {
+        case PROF_OMEMOPOLICY_MANUAL:
+            result = FALSE;
+            break;
+        case PROF_OMEMOPOLICY_AUTOMATIC:
+            if (g_list_find_custom(account->omemo_enabled, recipient, (GCompareFunc)g_strcmp0)) {
+                result = TRUE;
+            } else if (g_list_find_custom(account->omemo_disabled, recipient, (GCompareFunc)g_strcmp0)) {
+                result = FALSE;
+            } else {
+                return FALSE;
+            }
+            break;
+        case PROF_OMEMOPOLICY_ALWAYS:
+            if (g_list_find_custom(account->omemo_disabled, recipient, (GCompareFunc)g_strcmp0)) {
+                result = FALSE;
+            } else {
+                return TRUE;
+            }
+            break;
+    }
+
+    account_free(account);
+    return result;
+}
+
 static gboolean
 _load_identity(void)
 {