about summary refs log tree commit diff stats
path: root/src/xmpp
diff options
context:
space:
mode:
authorMichael Vetter <jubalh@iodoru.org>2021-04-14 22:47:58 +0200
committerMichael Vetter <jubalh@iodoru.org>2021-04-14 22:47:58 +0200
commit8c50b63e56a3baf315b6989eef65f47b2f59282a (patch)
tree37bc7413267ea1e9d104d9e4cd24dfe3d3ffe9c0 /src/xmpp
parent558d672733c3bee3395b0236b8454a6af853301e (diff)
downloadprofani-tty-8c50b63e56a3baf315b6989eef65f47b2f59282a.tar.gz
Goodbye beautiful IDs
It was a great ride!

IDs look instead of
`TE5BTDc2ZTc3YTMwZGU3MDgzMzllOTliNGExNjVmMjZkMTY1ZmUyZGEyNTUxMjVmODBkMmQzOGMxYWI2ZjAxNzdiM2Q=`
more like `7HcnNSoO1MVvb0p9a9e293152922853e910b8b1a65bb26e225a0568` now.

Regards https://github.com/profanity-im/profanity/issues/1520

We still has our identifier into it to filter MUC reflected messages.

profident maybe should be changed to be longer or be generated upon each
start.
Diffstat (limited to 'src/xmpp')
-rw-r--r--src/xmpp/connection.c32
-rw-r--r--src/xmpp/connection.h2
-rw-r--r--src/xmpp/message.c14
3 files changed, 18 insertions, 30 deletions
diff --git a/src/xmpp/connection.c b/src/xmpp/connection.c
index c188498c..e25b8f6f 100644
--- a/src/xmpp/connection.c
+++ b/src/xmpp/connection.c
@@ -514,26 +514,20 @@ connection_free_uuid(char* uuid)
 char*
 connection_create_stanza_id(void)
 {
-    char* uuid = connection_create_uuid();
+    char* rndid = get_random_string(CON_RAND_ID_LEN);
 
-    assert(uuid != NULL);
+    assert(rndid != NULL);
 
-    gchar* hmac = g_compute_hmac_for_string(G_CHECKSUM_SHA256,
+    gchar* hmac = g_compute_hmac_for_string(G_CHECKSUM_SHA1,
                                             (guchar*)prof_identifier, strlen(prof_identifier),
-                                            uuid, strlen(uuid));
+                                            rndid, strlen(rndid));
 
-    GString* signature = g_string_new("");
-    g_string_printf(signature, "%s%s", uuid, hmac);
+    char *ret = g_strdup_printf("%s%s", rndid, hmac);
 
-    free(uuid);
+    free(rndid);
     g_free(hmac);
 
-    char* b64 = g_base64_encode((unsigned char*)signature->str, signature->len);
-    g_string_free(signature, TRUE);
-
-    assert(b64 != NULL);
-
-    return b64;
+    return ret;
 }
 
 char*
@@ -748,18 +742,12 @@ _random_bytes_close(void)
 static void
 _compute_identifier(const char* barejid)
 {
-    gchar* hmac = g_compute_hmac_for_string(G_CHECKSUM_SHA256,
-                                            (guchar*)profanity_instance_id, strlen(profanity_instance_id),
-                                            barejid, strlen(barejid));
-
-    char* b64 = g_base64_encode((guchar*)hmac, XMPP_SHA1_DIGEST_SIZE);
-    assert(b64 != NULL);
-    g_free(hmac);
-
     //in case of reconnect (lost connection)
     free(prof_identifier);
 
-    prof_identifier = b64;
+    prof_identifier = g_compute_hmac_for_string(G_CHECKSUM_SHA256,
+                                            (guchar*)profanity_instance_id, strlen(profanity_instance_id),
+                                            barejid, strlen(barejid));
 }
 
 const char*
diff --git a/src/xmpp/connection.h b/src/xmpp/connection.h
index d638d037..cab579f7 100644
--- a/src/xmpp/connection.h
+++ b/src/xmpp/connection.h
@@ -38,6 +38,8 @@
 
 #include "xmpp/xmpp.h"
 
+#define CON_RAND_ID_LEN 15
+
 void connection_init(void);
 void connection_shutdown(void);
 void connection_check_events(void);
diff --git a/src/xmpp/message.c b/src/xmpp/message.c
index 33d58cde..4f093bcf 100644
--- a/src/xmpp/message.c
+++ b/src/xmpp/message.c
@@ -1564,26 +1564,24 @@ message_is_sent_by_us(const ProfMessage* const message, bool checkOID)
         }
 
         if (tmp_id != NULL) {
-            gsize tmp_len;
-            char* tmp = (char*)g_base64_decode(tmp_id, &tmp_len);
+            gsize tmp_len = strlen(tmp_id);
 
-            // our client sents at least 36 (uuid) + identifier
-            if (tmp_len > 36) {
-                char* uuid = g_strndup(tmp, 36);
+            // our client sents at CON_RAND_ID_LEN + identifier
+            if (tmp_len > CON_RAND_ID_LEN) {
+                char* uuid = g_strndup(tmp_id, CON_RAND_ID_LEN);
                 const char* prof_identifier = connection_get_profanity_identifier();
 
-                gchar* hmac = g_compute_hmac_for_string(G_CHECKSUM_SHA256,
+                gchar* hmac = g_compute_hmac_for_string(G_CHECKSUM_SHA1,
                                                         (guchar*)prof_identifier, strlen(prof_identifier),
                                                         uuid, strlen(uuid));
 
-                if (g_strcmp0(&tmp[36], hmac) == 0) {
+                if (g_strcmp0(&tmp_id[CON_RAND_ID_LEN], hmac) == 0) {
                     ret = TRUE;
                 }
 
                 g_free(uuid);
                 g_free(hmac);
             }
-            free(tmp);
         }
     }