gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] 03/08: MESSENGER: Implement automatic transcription of private


From: gnunet
Subject: [gnunet] 03/08: MESSENGER: Implement automatic transcription of private messages
Date: Sat, 20 Jan 2024 10:08:32 +0100

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

thejackimonster pushed a commit to branch master
in repository gnunet.

commit 75023517a747083670642ed489fc3b34729f6113
Author: TheJackiMonster <thejackimonster@gmail.com>
AuthorDate: Sat Jan 20 00:45:44 2024 +0100

    MESSENGER: Implement automatic transcription of private messages
    
    Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
---
 src/include/gnunet_messenger_service.h             |  2 +-
 src/service/messenger/messenger_api.c              | 93 +++++++++++++---------
 src/service/messenger/messenger_api_message.c      | 36 ++++++++-
 src/service/messenger/messenger_api_message.h      | 12 +++
 .../messenger/messenger_api_queue_messages.c       | 21 ++++-
 .../messenger/messenger_api_queue_messages.h       | 10 ++-
 6 files changed, 128 insertions(+), 46 deletions(-)

diff --git a/src/include/gnunet_messenger_service.h 
b/src/include/gnunet_messenger_service.h
index 497a430c2..4d3f4419e 100644
--- a/src/include/gnunet_messenger_service.h
+++ b/src/include/gnunet_messenger_service.h
@@ -936,7 +936,7 @@ GNUNET_MESSENGER_contact_get_id (const struct 
GNUNET_MESSENGER_Contact *contact)
  */
 void
 GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room,
-                               struct GNUNET_MESSENGER_Message *message,
+                               const struct GNUNET_MESSENGER_Message *message,
                                const struct GNUNET_MESSENGER_Contact *contact);
 
 /**
diff --git a/src/service/messenger/messenger_api.c 
b/src/service/messenger/messenger_api.c
index 9f31ebb00..269fb2999 100644
--- a/src/service/messenger/messenger_api.c
+++ b/src/service/messenger/messenger_api.c
@@ -182,7 +182,8 @@ handle_room_sync (void *cls,
 
 static void
 enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room,
-                         struct GNUNET_MESSENGER_Message *message);
+                         struct GNUNET_MESSENGER_Message *message,
+                         struct GNUNET_MESSENGER_Message *transcript);
 
 static void
 handle_member_id (void *cls,
@@ -218,8 +219,7 @@ handle_member_id (void *cls,
   if (! message)
     return;
 
-  enqueue_message_to_room (room, message);
-  destroy_message (message);
+  enqueue_message_to_room (room, message, NULL);
 }
 
 
@@ -367,8 +367,7 @@ handle_miss_message (void *cls,
   if (! message)
     return;
 
-  enqueue_message_to_room (room, message);
-  destroy_message (message);
+  enqueue_message_to_room (room, message, NULL);
 }
 
 
@@ -664,6 +663,7 @@ GNUNET_MESSENGER_disconnect (struct GNUNET_MESSENGER_Handle 
*handle)
 static void
 send_message_to_room (struct GNUNET_MESSENGER_Room *room,
                       struct GNUNET_MESSENGER_Message *message,
+                      struct GNUNET_MESSENGER_Message *transcript,
                       const struct GNUNET_CRYPTO_PrivateKey *key)
 {
   const struct GNUNET_ShortHashCode *sender_id = get_room_sender_id (room);
@@ -697,6 +697,9 @@ send_message_to_room (struct GNUNET_MESSENGER_Room *room,
   hash_message (message, msg_length, msg_buffer, &hash);
   sign_message (message, msg_length, msg_buffer, &hash, key);
 
+  if (transcript)
+    GNUNET_memcpy (&(transcript->body.transcript.hash), &hash, sizeof(hash));
+
   GNUNET_memcpy (&(room->last_message), &hash, sizeof(room->last_message));
 
   GNUNET_MQ_send (room->handle->mq, env);
@@ -708,7 +711,8 @@ send_message_to_room (struct GNUNET_MESSENGER_Room *room,
 
 static void
 enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room,
-                         struct GNUNET_MESSENGER_Message *message)
+                         struct GNUNET_MESSENGER_Message *message,
+                         struct GNUNET_MESSENGER_Message *transcript)
 {
   const struct GNUNET_CRYPTO_PrivateKey *key = get_handle_key (room->handle);
   enum GNUNET_GenericReturnValue priority;
@@ -723,7 +727,7 @@ enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room,
     break;
   }
 
-  enqueue_to_messages (&(room->queue), key, message, priority);
+  enqueue_to_messages (&(room->queue), key, message, transcript, priority);
 
   if (GNUNET_YES != is_room_available (room))
     return;
@@ -739,6 +743,8 @@ static enum GNUNET_GenericReturnValue
 dequeue_messages_from_room (struct GNUNET_MESSENGER_Room *room)
 {
   struct GNUNET_MESSENGER_Message *message = NULL;
+  struct GNUNET_MESSENGER_Message *transcript = NULL;
+  struct GNUNET_CRYPTO_PublicKey pubkey;
   struct GNUNET_CRYPTO_PrivateKey key;
 
   if (GNUNET_YES != is_room_available (room))
@@ -748,10 +754,31 @@ dequeue_messages_from_room (struct GNUNET_MESSENGER_Room 
*room)
     if (message)
       destroy_message (message);
 
-    message = dequeue_from_messages (&(room->queue), &key);
+    message = dequeue_from_messages (&(room->queue), &key, &transcript);
+
+    if (!message)
+    {
+      message = transcript;
+      continue;
+    }
+    
+    send_message_to_room (room, message, transcript, &key);
+
+    if (!transcript)
+      continue;
+
+    GNUNET_CRYPTO_key_get_public(&key, &pubkey);
+    
+    if (GNUNET_YES == encrypt_message(transcript, &pubkey))
+      send_message_to_room (room, transcript, NULL, &key);
+    else
+    {
+      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
+                  "Sending transcript aborted: Encryption failed!\n");
+
+      destroy_message (transcript);
+    }
 
-    if (message)
-      send_message_to_room (room, message, &key);
   } while (message);
 
   return GNUNET_YES;
@@ -788,8 +815,7 @@ iterate_send_name_to_room (void *cls,
   if (! message)
     return GNUNET_NO;
 
-  enqueue_message_to_room (room, message);
-  destroy_message (message);
+  enqueue_message_to_room (room, message, NULL);
   return GNUNET_YES;
 }
 
@@ -839,8 +865,7 @@ iterate_send_key_to_room (void *cls,
   if (! message)
     return GNUNET_NO;
 
-  enqueue_message_to_room (room, message);
-  destroy_message (message);
+  enqueue_message_to_room (room, message, NULL);
   return GNUNET_YES;
 }
 
@@ -937,10 +962,7 @@ GNUNET_MESSENGER_close_room (struct GNUNET_MESSENGER_Room 
*room)
   struct GNUNET_MESSENGER_Message *message = create_message_leave ();
 
   if (message)
-  {
-    enqueue_message_to_room (room, message);
-    destroy_message (message);
-  }
+    enqueue_message_to_room (room, message, NULL);
 }
 
 
@@ -1057,8 +1079,9 @@ send_message_to_room_with_key (struct 
GNUNET_MESSENGER_Room *room,
                                struct GNUNET_MESSENGER_Message *message,
                                const struct GNUNET_CRYPTO_PublicKey 
*public_key)
 {
+  struct GNUNET_MESSENGER_Message *transcript = NULL;
+
   char *original_name;
-  char *changed_name = NULL;
 
   if (GNUNET_MESSENGER_KIND_NAME != message->header.kind)
     goto skip_naming;
@@ -1073,44 +1096,37 @@ send_message_to_room_with_key (struct 
GNUNET_MESSENGER_Room *room,
   if ((handle_name) && (GNUNET_YES == room->use_handle_name) &&
       ((! original_name) || (0 == strlen (original_name))))
   {
-    changed_name = GNUNET_strdup (handle_name);
-    message->body.name.name = changed_name;
+    if (original_name)
+      GNUNET_free (original_name);
+
+    message->body.name.name = GNUNET_strdup (handle_name);
   }
 
 skip_naming:
   if (public_key)
   {
-    struct GNUNET_MESSENGER_Message *original = message;
-    message = copy_message (original);
+    transcript = transcribe_message (message, public_key);
 
     if (GNUNET_YES != encrypt_message (message, public_key))
     {
       GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
                   "Sending message aborted: Encryption failed!\n");
+      
+      if (transcript)
+        destroy_message(transcript);
 
       destroy_message (message);
-      message = original;
-
-      goto reset_naming;
+      return;
     }
   }
 
-  enqueue_message_to_room (room, message);
-
-reset_naming:
-  if (changed_name)
-    GNUNET_free (changed_name);
-
-  if (GNUNET_MESSENGER_KIND_NAME != message->header.kind)
-    return;
-
-  message->body.name.name = original_name;
+  enqueue_message_to_room (room, message, transcript);
 }
 
 
 void
 GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room,
-                               struct GNUNET_MESSENGER_Message *message,
+                               const struct GNUNET_MESSENGER_Message *message,
                                const struct GNUNET_MESSENGER_Contact *contact)
 {
   if ((! room) || (! message))
@@ -1148,7 +1164,7 @@ GNUNET_MESSENGER_send_message (struct 
GNUNET_MESSENGER_Room *room,
   else
     public_key = NULL;
 
-  send_message_to_room_with_key (room, message, public_key);
+  send_message_to_room_with_key (room, copy_message(message), public_key);
 }
 
 
@@ -1261,5 +1277,4 @@ GNUNET_MESSENGER_send_ticket (struct 
GNUNET_MESSENGER_Room *room,
   }
 
   send_message_to_room_with_key (room, message, &(ticket->audience));
-  destroy_message (message);
 }
diff --git a/src/service/messenger/messenger_api_message.c 
b/src/service/messenger/messenger_api_message.c
index c7762d925..181431189 100644
--- a/src/service/messenger/messenger_api_message.c
+++ b/src/service/messenger/messenger_api_message.c
@@ -25,6 +25,7 @@
 
 #include "messenger_api_message.h"
 
+#include "gnunet_common.h"
 #include "gnunet_messenger_service.h"
 #include "gnunet_signatures.h"
 
@@ -1085,6 +1086,39 @@ decrypt_message (struct GNUNET_MESSENGER_Message 
*message,
 }
 
 
+struct GNUNET_MESSENGER_Message*
+transcribe_message (const struct GNUNET_MESSENGER_Message *message,
+                    const struct GNUNET_CRYPTO_PublicKey *key)
+{
+  GNUNET_assert ((message) && (key));
+
+  struct GNUNET_MESSENGER_Message *transcript = create_message(
+    GNUNET_MESSENGER_KIND_TRANSCRIPT);
+
+  if (!transcript)
+  {
+    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Transcribing message failed!\n");
+    return NULL;
+  }
+  
+  GNUNET_memcpy(&(transcript->body.transcript.key), key, 
sizeof(transcript->body.transcript.key));
+
+  struct GNUNET_MESSENGER_ShortMessage shortened;
+
+  fold_short_message (message, &shortened);
+
+  const uint16_t data_length = get_short_message_size (
+    &shortened, GNUNET_YES);
+
+  transcript->body.transcript.data = GNUNET_malloc (data_length);
+  transcript->body.transcript.length = data_length;
+
+  encode_short_message (&shortened, data_length, 
transcript->body.transcript.data);
+
+  return transcript;
+}
+
+
 struct GNUNET_MQ_Envelope*
 pack_message (struct GNUNET_MESSENGER_Message *message,
               struct GNUNET_HashCode *hash,
@@ -1197,7 +1231,7 @@ is_service_message (const struct GNUNET_MESSENGER_Message 
*message)
   case GNUNET_MESSENGER_KIND_TICKET:
     return GNUNET_NO;
   case GNUNET_MESSENGER_KIND_TRANSCRIPT:
-    return GNUNET_YES; // Allow access to self encrypted messages!
+    return GNUNET_NO;
   case GNUNET_MESSENGER_KIND_TAG:
     return GNUNET_NO;
   default:
diff --git a/src/service/messenger/messenger_api_message.h 
b/src/service/messenger/messenger_api_message.h
index a9e33ddc2..afcd2deec 100644
--- a/src/service/messenger/messenger_api_message.h
+++ b/src/service/messenger/messenger_api_message.h
@@ -244,6 +244,18 @@ enum GNUNET_GenericReturnValue
 decrypt_message (struct GNUNET_MESSENGER_Message *message,
                  const struct GNUNET_CRYPTO_PrivateKey *key);
 
+/**
+ * Transcribes a <i>message</i> as a new transcript message using a given 
public
+ * <i>key</i> from the receipient of the encrypted message content.
+ *
+ * @param[in] message Message
+ * @param[in] key Public key
+ * @return Message transcript
+ */
+struct GNUNET_MESSENGER_Message*
+transcribe_message (const struct GNUNET_MESSENGER_Message *message,
+                    const struct GNUNET_CRYPTO_PublicKey *key);
+
 typedef void (*GNUNET_MESSENGER_SignFunction)(
   const void *cls,
   struct GNUNET_MESSENGER_Message *message,
diff --git a/src/service/messenger/messenger_api_queue_messages.c 
b/src/service/messenger/messenger_api_queue_messages.c
index 4b153a524..876bed939 100644
--- a/src/service/messenger/messenger_api_queue_messages.c
+++ b/src/service/messenger/messenger_api_queue_messages.c
@@ -25,6 +25,7 @@
 
 #include "messenger_api_queue_messages.h"
 
+#include "gnunet_messenger_service.h"
 #include "messenger_api_message.h"
 
 void
@@ -51,6 +52,9 @@ clear_queue_messages (struct GNUNET_MESSENGER_QueueMessages 
*messages)
     if (element->message)
       destroy_message (element->message);
 
+    if (element->transcript)
+      destroy_message (element->transcript);
+
     GNUNET_free (element);
   }
 
@@ -62,7 +66,8 @@ clear_queue_messages (struct GNUNET_MESSENGER_QueueMessages 
*messages)
 void
 enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
                      const struct GNUNET_CRYPTO_PrivateKey *sender,
-                     const struct GNUNET_MESSENGER_Message *message,
+                     struct GNUNET_MESSENGER_Message *message,
+                     struct GNUNET_MESSENGER_Message *transcript,
                      enum GNUNET_GenericReturnValue priority)
 {
   GNUNET_assert ((messages) && (message));
@@ -73,7 +78,8 @@ enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages 
*messages,
   if (! element)
     return;
 
-  element->message = copy_message (message);
+  element->message = message;
+  element->transcript = transcript;
 
   if (sender)
     GNUNET_memcpy (&(element->sender), sender, sizeof (element->sender));
@@ -93,17 +99,26 @@ enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages 
*messages,
 
 struct GNUNET_MESSENGER_Message*
 dequeue_from_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
-                       struct GNUNET_CRYPTO_PrivateKey *sender)
+                       struct GNUNET_CRYPTO_PrivateKey *sender,
+                       struct GNUNET_MESSENGER_Message **transcript)
 {
   GNUNET_assert (messages);
 
   struct GNUNET_MESSENGER_QueueMessage *element = messages->head;
 
   if (! element)
+  {
+    if (transcript)
+      *transcript = NULL;
+
     return NULL;
+  }
 
   struct GNUNET_MESSENGER_Message *message = element->message;
 
+  if (transcript)
+    *transcript = element->transcript;
+
   GNUNET_CONTAINER_DLL_remove (messages->head, messages->tail, element);
 
   if (sender)
diff --git a/src/service/messenger/messenger_api_queue_messages.h 
b/src/service/messenger/messenger_api_queue_messages.h
index 416c91a7a..0512e2f71 100644
--- a/src/service/messenger/messenger_api_queue_messages.h
+++ b/src/service/messenger/messenger_api_queue_messages.h
@@ -34,7 +34,9 @@ struct GNUNET_MESSENGER_QueueMessage
   struct GNUNET_MESSENGER_QueueMessage *next;
 
   struct GNUNET_CRYPTO_PrivateKey sender;
+  
   struct GNUNET_MESSENGER_Message *message;
+  struct GNUNET_MESSENGER_Message *transcript;
 };
 
 struct GNUNET_MESSENGER_QueueMessages
@@ -66,12 +68,14 @@ clear_queue_messages (struct GNUNET_MESSENGER_QueueMessages 
*messages);
  * @param[in,out] messages Queue of messages
  * @param[in] sender Private sender key
  * @param[in] message Message
+ * @param[in] transcript Message transcript
  * @param[in] priority Whether the message has priority
  */
 void
 enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
                      const struct GNUNET_CRYPTO_PrivateKey *sender,
-                     const struct GNUNET_MESSENGER_Message *message,
+                     struct GNUNET_MESSENGER_Message *message,
+                     struct GNUNET_MESSENGER_Message *transcript,
                      enum GNUNET_GenericReturnValue priority);
 
 /**
@@ -79,10 +83,12 @@ enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages 
*messages,
  *
  * @param[in,out] messages Queue of messages
  * @param[out] sender Private sender key
+ * @param[out] transcript Message transcript
  * @return Message from front or NULL
  */
 struct GNUNET_MESSENGER_Message*
 dequeue_from_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
-                       struct GNUNET_CRYPTO_PrivateKey *sender);
+                       struct GNUNET_CRYPTO_PrivateKey *sender,
+                       struct GNUNET_MESSENGER_Message **transcript);
 
 #endif //GNUNET_MESSENGER_API_QUEUE_MESSAGES_H

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