about summary refs log tree commit diff stats
path: root/src/command/commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/command/commands.c')
-rw-r--r--src/command/commands.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/src/command/commands.c b/src/command/commands.c
index 0a96d318..c0729630 100644
--- a/src/command/commands.c
+++ b/src/command/commands.c
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 #include <errno.h>
 #include <glib.h>
+#include <libotr/proto.h>
 
 #include "chat_session.h"
 #include "command/commands.h"
@@ -967,7 +968,24 @@ cmd_msg(gchar **args, struct cmd_help_t help)
                     cons_show_error("Failed to encrypt and send message,");
                 }
             } else {
-                message_send(msg, usr_jid);
+                char *policy = prefs_get_string(PREF_OTR_POLICY);
+
+                if (strcmp(policy, "always") == 0) {
+                    cons_show_error("Failed to send message. Please check OTR policy");
+                    return TRUE;
+                } else if (strcmp(policy, "opportunistic") == 0) {
+                    char *otr_base_tag = OTRL_MESSAGE_TAG_BASE;
+                    char *otr_v2_tag = OTRL_MESSAGE_TAG_V2;
+                    int N = strlen(otr_base_tag) + strlen(otr_v2_tag) + strlen(msg) + 1;
+                    char *temp = (char *) malloc( (unsigned) N*sizeof(char *) );
+                    strcpy( temp , msg );
+                    strcat( temp , otr_base_tag);
+                    strcat( temp, otr_v2_tag);
+                    message_send(temp, usr_jid);
+                    free(temp);
+                } else {
+                    message_send(msg, usr_jid);
+                }
                 ui_outgoing_msg("me", usr_jid, msg);
 
                 if (((win_type == WIN_CHAT) || (win_type == WIN_CONSOLE)) && prefs_get_boolean(PREF_CHLOG)) {
@@ -2610,6 +2628,27 @@ cmd_otr(gchar **args, struct cmd_help_t help)
         char *version = otr_libotr_version();
         cons_show("Using libotr version %s", version);
         return TRUE;
+    } else if (strcmp(args[0], "policy") == 0) {
+        if (args[1] == NULL) {
+            char *policy = prefs_get_string(PREF_OTR_POLICY);
+            cons_show("OTR policy is now set to: %s", policy);
+            return TRUE;
+        }
+
+        char *choice = args[1];
+        if (g_strcmp0(choice, "manual") == 0) {
+            prefs_set_string(PREF_OTR_POLICY, "manual");
+            cons_show("OTR policy is now set to: manual");
+        } else if (g_strcmp0(choice, "opportunistic") == 0) {
+            prefs_set_string(PREF_OTR_POLICY, "opportunistic");
+            cons_show("OTR policy is now set to: opportunistic");
+        } else if (g_strcmp0(choice, "always") == 0) {
+            prefs_set_string(PREF_OTR_POLICY, "always");
+            cons_show("OTR policy is now set to: always");
+        } else {
+            cons_show("OTR policy can be set to: manual, opportunistic or always.");
+        }
+        return TRUE;
     }
 
     if (jabber_get_connection_status() != JABBER_CONNECTED) {