about summary refs log tree commit diff stats
path: root/src/event
diff options
context:
space:
mode:
authorMichael Vetter <jubalh@iodoru.org>2019-11-12 14:12:10 +0100
committerMichael Vetter <jubalh@iodoru.org>2019-11-13 09:39:07 +0100
commit87f9bacffa32ac199cffd5f80d4bf8e73dcb1c4c (patch)
treec27212b97d555c9e0edd1faa15f4705be17a9538 /src/event
parent750355acc4b88ca28be8f796e406ab5cc35a5c97 (diff)
downloadprofani-tty-87f9bacffa32ac199cffd5f80d4bf8e73dcb1c4c.tar.gz
Filter RTL unicode characters out
Gajim sends \u200E and \u200F for RTL.
It is planned that Gajim stops doing this and uses some GTK feature to
get the same result.

However users expressed the whish that we filter out such characters in
incoming messages before displaying them to make Profanity more robust.

I'm still not sure whether I like the solution because it means a lot of
allocating/deallocating upon every new message.

Fix https://github.com/profanity-im/profanity/issues/1220
Diffstat (limited to 'src/event')
-rw-r--r--src/event/server_events.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/event/server_events.c b/src/event/server_events.c
index f8f73d36..5c6703c5 100644
--- a/src/event/server_events.c
+++ b/src/event/server_events.c
@@ -68,6 +68,8 @@
 
 #include "ui/ui.h"
 
+static void _clean_incoming_message(ProfMessage *message);
+
 void
 sv_ev_login_account_success(char *account_name, gboolean secured)
 {
@@ -326,6 +328,7 @@ sv_ev_room_message(ProfMessage *message)
 
     GList *triggers = prefs_message_get_triggers(message->plain);
 
+    _clean_incoming_message(message);
     mucwin_incoming_msg(mucwin, message, mentions, triggers);
 
     g_slist_free(mentions);
@@ -397,6 +400,8 @@ sv_ev_incoming_private_message(ProfMessage *message)
         ProfWin *window = wins_new_private(message->jid->fulljid);
         privatewin = (ProfPrivateWin*)window;
     }
+
+    _clean_incoming_message(message);
     privwin_incoming_msg(privatewin, message);
     chat_log_msg_in(message);
 
@@ -418,6 +423,8 @@ sv_ev_delayed_private_message(ProfMessage *message)
         ProfWin *window = wins_new_private(message->jid->fulljid);
         privatewin = (ProfPrivateWin*)window;
     }
+
+    _clean_incoming_message(message);
     privwin_incoming_msg(privatewin, message);
     chat_log_msg_in(message);
 
@@ -529,6 +536,7 @@ _sv_ev_incoming_pgp(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message
     message->plain = p_gpg_decrypt(message->encrypted);
     if (message->plain) {
         message->enc = PROF_MSG_ENC_PGP;
+        _clean_incoming_message(message);
         chatwin_incoming_msg(chatwin, message, new_win);
         if (logit) {
             chat_log_pgp_msg_in(message);
@@ -543,6 +551,7 @@ _sv_ev_incoming_pgp(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message
         }
         message->enc = PROF_MSG_ENC_PLAIN;
         message->plain = strdup(message->body);
+        _clean_incoming_message(message);
         chatwin_incoming_msg(chatwin, message, new_win);
         chat_log_msg_in(message);
         chatwin->pgp_recv = FALSE;
@@ -564,6 +573,7 @@ _sv_ev_incoming_otr(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message
             message->enc = PROF_MSG_ENC_PLAIN;
         }
 
+        _clean_incoming_message(message);
         chatwin_incoming_msg(chatwin, message, new_win);
 
         chat_log_otr_msg_in(message);
@@ -578,6 +588,7 @@ _sv_ev_incoming_otr(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message
 static void
 _sv_ev_incoming_omemo(ProfChatWin *chatwin, gboolean new_win, ProfMessage *message, gboolean logit)
 {
+    _clean_incoming_message(message);
     chatwin_incoming_msg(chatwin, message, new_win);
     if (logit) {
         chat_log_omemo_msg_in(message);
@@ -592,6 +603,7 @@ _sv_ev_incoming_plain(ProfChatWin *chatwin, gboolean new_win, ProfMessage *messa
     if (message->body) {
         message->enc = PROF_MSG_ENC_PLAIN;
         message->plain = strdup(message->body);
+        _clean_incoming_message(message);
         chatwin_incoming_msg(chatwin, message, new_win);
         if (logit) {
             chat_log_msg_in(message);
@@ -1412,3 +1424,21 @@ sv_ev_bookmark_autojoin(Bookmark *bookmark)
 
     free(nick);
 }
+
+static void
+_clean_incoming_message(ProfMessage *message)
+{
+    if (strstr(message->plain, "\u200E")) {
+        char **split = g_strsplit(message->plain, "\u200E", -1);
+        free(message->plain);
+        message->plain = g_strjoinv("", split);
+        g_strfreev(split);
+    }
+
+    if (strstr(message->plain, "\u200F")) {
+        char **split = g_strsplit(message->plain, "\u200F", -1);
+        free(message->plain);
+        message->plain = g_strjoinv("", split);
+        g_strfreev(split);
+    }
+}