gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnunet] 05/08: MESSENGER: Implement handling transcript messages


From: gnunet
Subject: [gnunet] 05/08: MESSENGER: Implement handling transcript messages
Date: Sat, 20 Jan 2024 10:08:34 +0100

This is an automated email from the git hooks/post-receive script.

thejackimonster pushed a commit to branch master
in repository gnunet.

commit 596af28f16de5bd77e847db8704a5bc26e7d369a
Author: TheJackiMonster <thejackimonster@gmail.com>
AuthorDate: Sat Jan 20 01:32:56 2024 +0100

    MESSENGER: Implement handling transcript messages
    
    Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
 src/service/messenger/messenger_api.c         | 26 ++++++++++++++------
 src/service/messenger/messenger_api_message.c | 35 +++++++++++++++++++++++++++
 src/service/messenger/messenger_api_message.h |  9 +++++++
 3 files changed, 63 insertions(+), 7 deletions(-)

diff --git a/src/service/messenger/messenger_api.c 
b/src/service/messenger/messenger_api.c
index 1528d00d2..ea0d6bca5 100644
--- a/src/service/messenger/messenger_api.c
+++ b/src/service/messenger/messenger_api.c
@@ -326,18 +326,30 @@ handle_recv_message (void *cls,
   
   struct GNUNET_MESSENGER_Contact *recipient = NULL;
 
-  if (private_message)
+  if (!private_message)
+    goto skip_recipient;
+
+  const struct GNUNET_CRYPTO_PublicKey *recipient_key;
+
+  if (GNUNET_MESSENGER_KIND_TRANSCRIPT == private_message->header.kind)
   {
-    const struct GNUNET_CRYPTO_PublicKey *recipient_key;
+    struct GNUNET_MESSENGER_Message *transcript;
 
-    if (GNUNET_MESSENGER_KIND_TRANSCRIPT == private_message->header.kind)
-      recipient_key = &(private_message->body.transcript.key);
-    else
-      recipient_key = get_handle_pubkey(handle);
+    recipient_key = &(private_message->body.transcript.key);
+    transcript = read_transcript_message(private_message);
 
-    recipient = get_store_contact(store, context, recipient_key);
+    if (transcript)
+    {
+      destroy_message(private_message);
+      private_message = transcript;
+    }
   }
+  else
+    recipient_key = get_handle_pubkey(handle);
+
+  recipient = get_store_contact(store, context, recipient_key);
 
+skip_recipient:
   contact = handle_room_message (room, contact, private_message ?
                                   private_message : &message, hash, flags);
 
diff --git a/src/service/messenger/messenger_api_message.c 
b/src/service/messenger/messenger_api_message.c
index 181431189..f28921a81 100644
--- a/src/service/messenger/messenger_api_message.c
+++ b/src/service/messenger/messenger_api_message.c
@@ -28,6 +28,7 @@
 #include "gnunet_common.h"
 #include "gnunet_messenger_service.h"
 #include "gnunet_signatures.h"
+#include <stdint.h>
 
 struct GNUNET_MESSENGER_MessageSignature
 {
@@ -1092,6 +1093,9 @@ transcribe_message (const struct GNUNET_MESSENGER_Message 
*message,
 {
   GNUNET_assert ((message) && (key));
 
+  if (GNUNET_YES == is_service_message (message))
+    return NULL;
+
   struct GNUNET_MESSENGER_Message *transcript = create_message(
     GNUNET_MESSENGER_KIND_TRANSCRIPT);
 
@@ -1119,6 +1123,37 @@ transcribe_message (const struct 
GNUNET_MESSENGER_Message *message,
 }
 
 
+struct GNUNET_MESSENGER_Message*
+read_transcript_message (const struct GNUNET_MESSENGER_Message *transcript)
+{
+  GNUNET_assert (transcript);
+
+  if (GNUNET_MESSENGER_KIND_TRANSCRIPT != transcript->header.kind)
+    return NULL;
+
+  const uint16_t data_length = transcript->body.transcript.length;
+
+  struct GNUNET_MESSENGER_ShortMessage shortened;
+  if (GNUNET_YES != decode_short_message (&shortened,
+                                          data_length,
+                                          transcript->body.transcript.data))
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING,
+                "Decoding decrypted message failed!\n");
+
+    return NULL;
+  }
+
+  struct GNUNET_MESSENGER_Message *message = create_message(shortened.kind);
+
+  if (!message)
+    return NULL;
+
+  unfold_short_message(&shortened, message);
+  return message;
+}
+
+
 struct GNUNET_MQ_Envelope*
 pack_message (struct GNUNET_MESSENGER_Message *message,
               struct GNUNET_HashCode *hash,
diff --git a/src/service/messenger/messenger_api_message.h 
b/src/service/messenger/messenger_api_message.h
index f2d5a3138..a19eb36ba 100644
--- a/src/service/messenger/messenger_api_message.h
+++ b/src/service/messenger/messenger_api_message.h
@@ -256,6 +256,15 @@ struct GNUNET_MESSENGER_Message*
 transcribe_message (const struct GNUNET_MESSENGER_Message *message,
                     const struct GNUNET_CRYPTO_PublicKey *key);
 
+/**
+ * Read the original message from a message <i>transcript</i>.
+ *
+ * @param[in] transcript Message transcript
+ * @return Original message
+ */
+struct GNUNET_MESSENGER_Message*
+read_transcript_message (const struct GNUNET_MESSENGER_Message *transcript);
+
 typedef void (*GNUNET_MESSENGER_SignFunction)(
   const void *cls,
   struct GNUNET_MESSENGER_Message *message,

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]