gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] 02/08: MESSENGER: Add transcript and tag message kinds


From: gnunet
Subject: [gnunet] 02/08: MESSENGER: Add transcript and tag message kinds
Date: Sat, 20 Jan 2024 10:08:31 +0100

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

thejackimonster pushed a commit to branch master
in repository gnunet.

commit 63cf392a58f9e18e659df727a4fa052d38f62bf5
Author: TheJackiMonster <thejackimonster@gmail.com>
AuthorDate: Fri Jan 19 22:57:32 2024 +0100

    MESSENGER: Add transcript and tag message kinds
    
    Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
 src/include/gnunet_messenger_service.h        | 60 +++++++++++++++++
 src/service/messenger/messenger_api.c         | 12 +++-
 src/service/messenger/messenger_api_message.c | 93 +++++++++++++++++++++++----
 3 files changed, 152 insertions(+), 13 deletions(-)

diff --git a/src/include/gnunet_messenger_service.h 
b/src/include/gnunet_messenger_service.h
index 5457e8ddb..497a430c2 100644
--- a/src/include/gnunet_messenger_service.h
+++ b/src/include/gnunet_messenger_service.h
@@ -207,6 +207,16 @@ enum GNUNET_MESSENGER_MessageKind
    */
   GNUNET_MESSENGER_KIND_TICKET = 17,
 
+  /**
+   * The transcript kind. The message contains a 
#GNUNET_MESSENGER_MessageTranscript body.
+   */
+  GNUNET_MESSENGER_KIND_TRANSCRIPT = 18,
+
+  /**
+   * The tag kind. The message contains a #GNUNET_MESSENGER_MessageTag body.
+   */
+  GNUNET_MESSENGER_KIND_TAG = 19,
+
   /**
    * The unknown kind. The message contains an unknown body.
    */
@@ -536,6 +546,54 @@ struct GNUNET_MESSENGER_MessageTicket
   struct GNUNET_RECLAIM_Identifier identifier;
 };
 
+/**
+ * A transcript message body
+ * This allows reading the content of a sent private message.
+ *
+ * Message-body-size: 68+
+ */
+struct GNUNET_MESSENGER_MessageTranscript
+{
+  /**
+   * The hash of the original message.
+   */
+  struct GNUNET_HashCode hash;
+
+  /**
+   * The key from the recipient of the original message.
+   */
+  struct GNUNET_CRYPTO_PublicKey key;
+
+  /**
+   * The length of the transcribed message.
+   */
+  uint16_t length;
+
+  /**
+   * The data of the transcribed message.
+   */
+  char *data;
+};
+
+/**
+ * A tag message body
+ * This allows tagging a message with a custom tag.
+ *
+ * Message-body-size: 32+
+ */
+struct GNUNET_MESSENGER_MessageTag
+{
+  /**
+   * The hash of the message to tag.
+   */
+  struct GNUNET_HashCode hash;
+
+  /**
+   * The custom tag.
+   */
+  char *tag;
+};
+
 /**
  * The unified body of a #GNUNET_MESSENGER_Message.
  */
@@ -560,6 +618,8 @@ struct GNUNET_MESSENGER_MessageBody
     struct GNUNET_MESSENGER_MessageDelete deletion;
     struct GNUNET_MESSENGER_MessageConnection connection;
     struct GNUNET_MESSENGER_MessageTicket ticket;
+    struct GNUNET_MESSENGER_MessageTranscript transcript;
+    struct GNUNET_MESSENGER_MessageTag tag;
   };
 };
 
diff --git a/src/service/messenger/messenger_api.c 
b/src/service/messenger/messenger_api.c
index 7fd873211..9f31ebb00 100644
--- a/src/service/messenger/messenger_api.c
+++ b/src/service/messenger/messenger_api.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2023 GNUnet e.V.
+   Copyright (C) 2020--2024 GNUnet e.V.
 
    GNUnet is free software: you can redistribute it and/or modify it
    under the terms of the GNU Affero General Public License as published
@@ -24,7 +24,7 @@
  */
 
 #include "gnunet_common.h"
-#include "gnunet_identity_service.h"
+#include "gnunet_core_service.h"
 #include "gnunet_messenger_service.h"
 
 #include "gnunet-service-messenger.h"
@@ -72,6 +72,14 @@ GNUNET_MESSENGER_name_of_kind (enum 
GNUNET_MESSENGER_MessageKind kind)
     return "PRIVATE";
   case GNUNET_MESSENGER_KIND_DELETE:
     return "DELETE";
+  case GNUNET_MESSENGER_KIND_CONNECTION:
+    return "CONNECTION";
+  case GNUNET_MESSENGER_KIND_TICKET:
+    return "TICKET";
+  case GNUNET_MESSENGER_KIND_TRANSCRIPT:
+    return "TRANSCRIPT";
+  case GNUNET_MESSENGER_KIND_TAG:
+    return "TAG";
   default:
     return "UNKNOWN";
   }
diff --git a/src/service/messenger/messenger_api_message.c 
b/src/service/messenger/messenger_api_message.c
index bfab00c02..c7762d925 100644
--- a/src/service/messenger/messenger_api_message.c
+++ b/src/service/messenger/messenger_api_message.c
@@ -63,6 +63,13 @@ create_message (enum GNUNET_MESSENGER_MessageKind kind)
     message->body.privacy.length = 0;
     message->body.privacy.data = NULL;
     break;
+  case GNUNET_MESSENGER_KIND_TRANSCRIPT:
+    message->body.transcript.length = 0;
+    message->body.transcript.data = NULL;
+    break;
+  case GNUNET_MESSENGER_KIND_TAG:
+    message->body.tag.tag = NULL;
+    break;
   default:
     break;
   }
@@ -97,11 +104,21 @@ copy_message (const struct GNUNET_MESSENGER_Message 
*message)
       copy->body.privacy.length) : NULL;
 
     if (copy->body.privacy.data)
-    {
       GNUNET_memcpy (copy->body.privacy.data, message->body.privacy.data,
                      copy->body.privacy.length);
-    }
 
+    break;
+  case GNUNET_MESSENGER_KIND_TRANSCRIPT:
+    copy->body.transcript.data = copy->body.transcript.length ? GNUNET_malloc (
+      copy->body.transcript.length) : NULL;
+    
+    if (copy->body.transcript.data)
+      GNUNET_memcpy (copy->body.transcript.data, message->body.transcript.data,
+                     copy->body.transcript.length);
+    
+    break;
+  case GNUNET_MESSENGER_KIND_TAG:
+    copy->body.tag.tag = GNUNET_strdup (message->body.tag.tag);
     break;
   default:
     break;
@@ -118,10 +135,12 @@ destroy_message_body (enum GNUNET_MESSENGER_MessageKind 
kind,
   switch (kind)
   {
   case GNUNET_MESSENGER_KIND_NAME:
-    GNUNET_free (body->name.name);
+    if (body->name.name)
+      GNUNET_free (body->name.name);
     break;
   case GNUNET_MESSENGER_KIND_TEXT:
-    GNUNET_free (body->text.text);
+    if (body->text.text)
+      GNUNET_free (body->text.text);
     break;
   case GNUNET_MESSENGER_KIND_FILE:
     GNUNET_free (body->file.uri);
@@ -129,6 +148,13 @@ destroy_message_body (enum GNUNET_MESSENGER_MessageKind 
kind,
   case GNUNET_MESSENGER_KIND_PRIVATE:
     GNUNET_free (body->privacy.data);
     break;
+  case GNUNET_MESSENGER_KIND_TRANSCRIPT:
+    GNUNET_free (body->transcript.data);
+    break;
+  case GNUNET_MESSENGER_KIND_TAG:
+    if (body->tag.tag)
+      GNUNET_free (body->tag.tag);
+    break;
   default:
     break;
   }
@@ -228,8 +254,6 @@ get_message_body_kind_size (enum 
GNUNET_MESSENGER_MessageKind kind)
     length += member_size (struct GNUNET_MESSENGER_Message, body.invite.door);
     length += member_size (struct GNUNET_MESSENGER_Message, body.invite.key);
     break;
-  case GNUNET_MESSENGER_KIND_TEXT:
-    break;
   case GNUNET_MESSENGER_KIND_FILE:
     length += member_size (struct GNUNET_MESSENGER_Message, body.file.key);
     length += member_size (struct GNUNET_MESSENGER_Message, body.file.hash);
@@ -250,6 +274,12 @@ get_message_body_kind_size (enum 
GNUNET_MESSENGER_MessageKind kind)
   case GNUNET_MESSENGER_KIND_TICKET:
     length += member_size (struct GNUNET_MESSENGER_Message, 
body.ticket.identifier);
     break;
+  case GNUNET_MESSENGER_KIND_TRANSCRIPT:
+    length += member_size (struct GNUNET_MESSENGER_Message, 
body.transcript.hash);
+    break;
+  case GNUNET_MESSENGER_KIND_TAG:
+    length += member_size (struct GNUNET_MESSENGER_Message, body.tag.hash);
+    break;
   default:
     break;
   }
@@ -297,7 +327,7 @@ get_message_body_size (enum GNUNET_MESSENGER_MessageKind 
kind,
     length += GNUNET_CRYPTO_public_key_get_length (&(body->key.key));
     break;
   case GNUNET_MESSENGER_KIND_TEXT:
-    length += strlen (body->text.text);
+    length += (body->text.text ? strlen (body->text.text) : 0);
     break;
   case GNUNET_MESSENGER_KIND_FILE:
     length += strlen (body->file.uri);
@@ -305,6 +335,13 @@ get_message_body_size (enum GNUNET_MESSENGER_MessageKind 
kind,
   case GNUNET_MESSENGER_KIND_PRIVATE:
     length += body->privacy.length;
     break;
+  case GNUNET_MESSENGER_KIND_TRANSCRIPT:
+    length += GNUNET_CRYPTO_public_key_get_length (&(body->transcript.key));
+    length += body->transcript.length;
+    break;
+  case GNUNET_MESSENGER_KIND_TAG:
+    length += (body->tag.tag ? strlen (body->tag.tag) : 0);
+    break;
   default:
     break;
   }
@@ -449,7 +486,7 @@ encode_message_body (enum GNUNET_MESSENGER_MessageKind kind,
     if (body->name.name)
       encode_step_ext (buffer, offset, body->name.name, min (length - offset,
                                                              strlen (
-                                                               
body->name.name)));
+                                                              
body->name.name)));
     break;
   case GNUNET_MESSENGER_KIND_KEY:
     encode_step_key (buffer, offset, &(body->key.key), length);
@@ -474,9 +511,10 @@ encode_message_body (enum GNUNET_MESSENGER_MessageKind 
kind,
     encode_step (buffer, offset, &(body->invite.key));
     break;
   case GNUNET_MESSENGER_KIND_TEXT:
-    encode_step_ext (buffer, offset, body->text.text, min (length - offset,
-                                                           strlen (
-                                                             
body->text.text)));
+    if (body->text.text)
+      encode_step_ext (buffer, offset, body->text.text, min (length - offset,
+                                                             strlen (
+                                                              
body->text.text)));
     break;
   case GNUNET_MESSENGER_KIND_FILE:
     encode_step (buffer, offset, &(body->file.key));
@@ -506,6 +544,20 @@ encode_message_body (enum GNUNET_MESSENGER_MessageKind 
kind,
   case GNUNET_MESSENGER_KIND_TICKET:
     encode_step (buffer, offset, &(body->ticket.identifier));
     break;
+  case GNUNET_MESSENGER_KIND_TRANSCRIPT:
+    encode_step (buffer, offset, &(body->transcript.hash));
+    encode_step_key (buffer, offset, &(body->transcript.key), length);
+    encode_step_ext (buffer, offset, body->transcript.data, min (length - 
offset,
+                                                                 
body->transcript.
+                                                                 length));
+    break;
+  case GNUNET_MESSENGER_KIND_TAG:
+    encode_step (buffer, offset, &(body->tag.hash));
+    if (body->tag.tag)
+      encode_step_ext (buffer, offset, body->tag.tag, min (length - offset,
+                                                           strlen (
+                                                            body->tag.tag)));
+    break;
   default:
     break;
   }
@@ -698,6 +750,17 @@ decode_message_body (enum GNUNET_MESSENGER_MessageKind 
*kind,
   case GNUNET_MESSENGER_KIND_TICKET:
     decode_step (buffer, offset, &(body->ticket.identifier));
     break;
+  case GNUNET_MESSENGER_KIND_TRANSCRIPT:
+    decode_step (buffer, offset, &(body->transcript.hash));
+    decode_step_key (buffer, offset, &(body->transcript.key), length);
+
+    body->transcript.length = (length - offset);
+    decode_step_malloc (buffer, offset, body->transcript.data, length - 
offset, 0);
+    break;
+  case GNUNET_MESSENGER_KIND_TAG:
+    decode_step (buffer, offset, &(body->tag.hash));
+    decode_step_malloc (buffer, offset, body->tag.tag, length - offset, 1);
+    break;
   default:
     *kind = GNUNET_MESSENGER_KIND_UNKNOWN;
     break;
@@ -1133,6 +1196,10 @@ is_service_message (const struct 
GNUNET_MESSENGER_Message *message)
     return GNUNET_YES; // Reserved for connection handling only!
   case GNUNET_MESSENGER_KIND_TICKET:
     return GNUNET_NO;
+  case GNUNET_MESSENGER_KIND_TRANSCRIPT:
+    return GNUNET_YES; // Allow access to self encrypted messages!
+  case GNUNET_MESSENGER_KIND_TAG:
+    return GNUNET_NO;
   default:
     return GNUNET_SYSERR;
   }
@@ -1180,6 +1247,10 @@ filter_message_sending (const struct 
GNUNET_MESSENGER_Message *message)
   case GNUNET_MESSENGER_KIND_CONNECTION:
     return GNUNET_SYSERR; // Reserved for connection handling only!
   case GNUNET_MESSENGER_KIND_TICKET:
+    return GNUNET_NO; // Use #GNUNET_MESSENGER_send_ticket(...) instead!
+  case GNUNET_MESSENGER_KIND_TRANSCRIPT:
+    return GNUNET_NO; // Use #GNUNET_MESSENGER_send_message(...) with a 
contact instead!
+  case GNUNET_MESSENGER_KIND_TAG:
     return GNUNET_YES;
   default:
     return GNUNET_SYSERR;

-- 
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]