gnunet-svn
[Top][All Lists]
Advanced

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

[gnunet] branch master updated (c24030b2d -> d821d81f7)


From: gnunet
Subject: [gnunet] branch master updated (c24030b2d -> d821d81f7)
Date: Sat, 20 Jan 2024 10:08:29 +0100

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

thejackimonster pushed a change to branch master
in repository gnunet.

    from c24030b2d explain GNUNET_JSON_parse_free() better
     new f239edd23 MESSENGER: Cleanup includes in code
     new 63cf392a5 MESSENGER: Add transcript and tag message kinds
     new 75023517a MESSENGER: Implement automatic transcription of private 
messages
     new 02ab26ff0 MESSENGER: Add recipient to message callback
     new 596af28f1 MESSENGER: Implement handling transcript messages
     new f44e76ba4 MESSENGER: Store recipient information for each message 
locally
     new bddc8307f MESSENGER: Drop transcript when sending private messages to 
own key
     new d821d81f7 -adjust log output

The 8 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 src/cli/messenger/gnunet-messenger.c               |   9 +-
 src/include/gnunet_messenger_service.h             |  81 +++++++-
 src/service/messenger/gnunet-service-messenger.c   |   4 +-
 src/service/messenger/gnunet-service-messenger.h   |   5 +-
 .../messenger/gnunet-service-messenger_handle.c    |   5 +-
 .../messenger/gnunet-service-messenger_handle.h    |   6 +-
 .../gnunet-service-messenger_list_handles.h        |   4 +-
 .../gnunet-service-messenger_list_messages.c       |   4 +-
 .../gnunet-service-messenger_list_messages.h       |   4 +-
 .../messenger/gnunet-service-messenger_member.c    |   4 +-
 .../messenger/gnunet-service-messenger_member.h    |   7 +-
 .../gnunet-service-messenger_member_session.h      |   4 +-
 .../gnunet-service-messenger_member_store.c        |   4 +-
 .../gnunet-service-messenger_member_store.h        |   6 +-
 .../gnunet-service-messenger_message_handle.c      |   4 +-
 .../gnunet-service-messenger_message_handle.h      |   7 +-
 .../gnunet-service-messenger_message_kind.c        |   6 +-
 .../gnunet-service-messenger_message_kind.h        |   5 +-
 .../gnunet-service-messenger_message_recv.c        |   3 +-
 .../gnunet-service-messenger_message_recv.h        |   6 +-
 .../gnunet-service-messenger_message_send.h        |   7 +-
 .../gnunet-service-messenger_message_state.h       |   5 +-
 .../messenger/gnunet-service-messenger_operation.h |   3 +-
 .../messenger/gnunet-service-messenger_room.c      |   8 +-
 .../messenger/gnunet-service-messenger_room.h      |  12 +-
 .../messenger/gnunet-service-messenger_service.c   |   7 +-
 .../messenger/gnunet-service-messenger_service.h   |   7 +-
 .../messenger/gnunet-service-messenger_tunnel.c    |   3 +-
 src/service/messenger/messenger_api.c              | 206 ++++++++++++++-------
 .../messenger/messenger_api_cmd_start_service.c    |  27 +--
 src/service/messenger/messenger_api_contact.h      |   3 +-
 .../messenger/messenger_api_contact_store.h        |   3 +-
 src/service/messenger/messenger_api_handle.h       |   4 +-
 src/service/messenger/messenger_api_message.c      | 168 +++++++++++++++--
 src/service/messenger/messenger_api_message.h      |  25 ++-
 src/service/messenger/messenger_api_message_kind.c |   4 +-
 src/service/messenger/messenger_api_message_kind.h |   6 +-
 .../messenger/messenger_api_queue_messages.c       |  25 ++-
 .../messenger/messenger_api_queue_messages.h       |  15 +-
 src/service/messenger/messenger_api_room.c         |  20 +-
 src/service/messenger/messenger_api_room.h         |  18 +-
 src/service/messenger/messenger_api_util.c         |   5 +-
 src/service/messenger/messenger_api_util.h         |   4 +-
 43 files changed, 550 insertions(+), 213 deletions(-)

diff --git a/src/cli/messenger/gnunet-messenger.c 
b/src/cli/messenger/gnunet-messenger.c
index 6258ce712..e3c10d509 100644
--- a/src/cli/messenger/gnunet-messenger.c
+++ b/src/cli/messenger/gnunet-messenger.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
@@ -46,21 +46,26 @@ void
 on_message (void *cls,
             struct GNUNET_MESSENGER_Room *room,
             const struct GNUNET_MESSENGER_Contact *sender,
+            const struct GNUNET_MESSENGER_Contact *recipient,
             const struct GNUNET_MESSENGER_Message *message,
             const struct GNUNET_HashCode *hash,
             enum GNUNET_MESSENGER_MessageFlags flags)
 {
   const char *sender_name = GNUNET_MESSENGER_contact_get_name (sender);
+  const char *recipient_name = GNUNET_MESSENGER_contact_get_name (recipient);
 
   if (! sender_name)
     sender_name = "anonymous";
 
+  if (! recipient_name)
+    recipient_name = "anonymous";
+
   printf ("[%s ->", GNUNET_h2s (&(message->header.previous)));
   printf (" %s]", GNUNET_h2s (hash));
   printf ("[%s] ", GNUNET_sh2s (&(message->header.sender_id)));
 
   if (flags & GNUNET_MESSENGER_FLAG_PRIVATE)
-    printf ("*");
+    printf ("*( '%s' ) ", recipient_name);
 
   switch (message->header.kind)
   {
diff --git a/src/include/gnunet_messenger_service.h 
b/src/include/gnunet_messenger_service.h
index 5457e8ddb..e0ccea27a 100644
--- a/src/include/gnunet_messenger_service.h
+++ b/src/include/gnunet_messenger_service.h
@@ -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
@@ -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;
   };
 };
 
@@ -637,6 +697,7 @@ enum GNUNET_MESSENGER_ConnectionFlags
  * @param[in/out] cls Closure from #GNUNET_MESSENGER_connect
  * @param[in] room Room handle
  * @param[in] sender Sender of message
+ * @param[in] recipient Recipient of message
  * @param[in] message Newly received or sent message
  * @param[in] hash Hash identifying the message
  * @param[in] flags Flags of the message
@@ -647,6 +708,8 @@ typedef void
                                      const struct
                                      GNUNET_MESSENGER_Contact *sender,
                                      const struct
+                                     GNUNET_MESSENGER_Contact *recipient,
+                                     const struct
                                      GNUNET_MESSENGER_Message *message,
                                      const struct GNUNET_HashCode *hash,
                                      enum GNUNET_MESSENGER_MessageFlags flags);
@@ -828,6 +891,20 @@ const struct GNUNET_MESSENGER_Contact*
 GNUNET_MESSENGER_get_sender (const struct GNUNET_MESSENGER_Room *room,
                              const struct GNUNET_HashCode *hash);
 
+/**
+ * Get the contact of a member in a <i>room</i> which has been targeted as 
recipient of a specific message identified 
+ * with a given <i>hash</i>.
+ *
+ * Notice that contacts are independent of rooms but will be removed if all 
rooms containing these contacts get closed.
+ *
+ * @param[in] room Room handle
+ * @param[in] hash Hash identifying a message
+ * @return Contact handle, NULL otherwise
+ */
+const struct GNUNET_MESSENGER_Contact*
+GNUNET_MESSENGER_get_recipient (const struct GNUNET_MESSENGER_Room *room,
+                                const struct GNUNET_HashCode *hash);
+
 /**
  * Get the name used by the <i>contact</i>.
  *
@@ -876,7 +953,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/gnunet-service-messenger.c 
b/src/service/messenger/gnunet-service-messenger.c
index f613b8b14..2cbc8933d 100644
--- a/src/service/messenger/gnunet-service-messenger.c
+++ b/src/service/messenger/gnunet-service-messenger.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
@@ -26,9 +26,9 @@
 #include "gnunet-service-messenger.h"
 
 #include "gnunet-service-messenger_handle.h"
+#include "gnunet-service-messenger_room.h"
 #include "gnunet-service-messenger_service.h"
 #include "messenger_api_message.h"
-#include "messenger_api_message_kind.h"
 
 struct GNUNET_MESSENGER_Client
 {
diff --git a/src/service/messenger/gnunet-service-messenger.h 
b/src/service/messenger/gnunet-service-messenger.h
index 821836fdf..c3e762734 100644
--- a/src/service/messenger/gnunet-service-messenger.h
+++ b/src/service/messenger/gnunet-service-messenger.h
@@ -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
@@ -26,9 +26,6 @@
 #ifndef GNUNET_SERVICE_MESSENGER_H
 #define GNUNET_SERVICE_MESSENGER_H
 
-#include "gnunet_cadet_service.h"
-#include "gnunet_identity_service.h"
-#include "gnunet_protocols.h"
 #include "gnunet_util_lib.h"
 
 /**
diff --git a/src/service/messenger/gnunet-service-messenger_handle.c 
b/src/service/messenger/gnunet-service-messenger_handle.c
index 9cd460fd3..55548c0fb 100644
--- a/src/service/messenger/gnunet-service-messenger_handle.c
+++ b/src/service/messenger/gnunet-service-messenger_handle.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
@@ -27,7 +27,8 @@
 #include "gnunet-service-messenger_handle.h"
 
 #include "gnunet-service-messenger.h"
-#include "messenger_api_message_kind.h"
+#include "gnunet-service-messenger_room.h"
+
 #include "messenger_api_util.h"
 
 struct GNUNET_MESSENGER_NextMemberId
diff --git a/src/service/messenger/gnunet-service-messenger_handle.h 
b/src/service/messenger/gnunet-service-messenger_handle.h
index ce9244771..46e9c4b63 100644
--- a/src/service/messenger/gnunet-service-messenger_handle.h
+++ b/src/service/messenger/gnunet-service-messenger_handle.h
@@ -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
@@ -26,15 +26,11 @@
 #ifndef GNUNET_SERVICE_MESSENGER_HANDLE_H
 #define GNUNET_SERVICE_MESSENGER_HANDLE_H
 
-#include "gnunet_cadet_service.h"
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
 
 #include "gnunet-service-messenger_service.h"
 #include "gnunet-service-messenger_sender_session.h"
 
-#include "messenger_api_message.h"
-
 struct GNUNET_MESSENGER_SrvHandle
 {
   struct GNUNET_MESSENGER_Service *service;
diff --git a/src/service/messenger/gnunet-service-messenger_list_handles.h 
b/src/service/messenger/gnunet-service-messenger_list_handles.h
index 43c754d6c..64dee6544 100644
--- a/src/service/messenger/gnunet-service-messenger_list_handles.h
+++ b/src/service/messenger/gnunet-service-messenger_list_handles.h
@@ -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
@@ -26,7 +26,7 @@
 #ifndef GNUNET_SERVICE_MESSENGER_LIST_HANDLES_H
 #define GNUNET_SERVICE_MESSENGER_LIST_HANDLES_H
 
-#include "gnunet_util_lib.h"
+#include "gnunet_common.h"
 
 struct GNUNET_MESSENGER_SrvHandle;
 
diff --git a/src/service/messenger/gnunet-service-messenger_list_messages.c 
b/src/service/messenger/gnunet-service-messenger_list_messages.c
index c140b8480..0cb4e5787 100644
--- a/src/service/messenger/gnunet-service-messenger_list_messages.c
+++ b/src/service/messenger/gnunet-service-messenger_list_messages.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
@@ -25,6 +25,8 @@
 
 #include "gnunet-service-messenger_list_messages.h"
 
+#include "gnunet_util_lib.h"
+
 void
 init_list_messages (struct GNUNET_MESSENGER_ListMessages *messages)
 {
diff --git a/src/service/messenger/gnunet-service-messenger_list_messages.h 
b/src/service/messenger/gnunet-service-messenger_list_messages.h
index ccdfa1c99..133091506 100644
--- a/src/service/messenger/gnunet-service-messenger_list_messages.h
+++ b/src/service/messenger/gnunet-service-messenger_list_messages.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2020--2021 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
@@ -26,7 +26,7 @@
 #ifndef GNUNET_SERVICE_MESSENGER_LIST_MESSAGES_H
 #define GNUNET_SERVICE_MESSENGER_LIST_MESSAGES_H
 
-#include "gnunet_util_lib.h"
+#include "gnunet_common.h"
 
 struct GNUNET_MESSENGER_ListMessage
 {
diff --git a/src/service/messenger/gnunet-service-messenger_member.c 
b/src/service/messenger/gnunet-service-messenger_member.c
index 19cc9559d..0940c42ce 100644
--- a/src/service/messenger/gnunet-service-messenger_member.c
+++ b/src/service/messenger/gnunet-service-messenger_member.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
@@ -28,6 +28,8 @@
 
 #include "gnunet-service-messenger_member_session.h"
 
+#include "messenger_api_util.h"
+
 struct GNUNET_MESSENGER_Member*
 create_member (struct GNUNET_MESSENGER_MemberStore *store,
                const struct GNUNET_ShortHashCode *id)
diff --git a/src/service/messenger/gnunet-service-messenger_member.h 
b/src/service/messenger/gnunet-service-messenger_member.h
index 1f239aa21..0e5afaa6a 100644
--- a/src/service/messenger/gnunet-service-messenger_member.h
+++ b/src/service/messenger/gnunet-service-messenger_member.h
@@ -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
@@ -26,12 +26,7 @@
 #ifndef GNUNET_SERVICE_MESSENGER_MEMBER_H
 #define GNUNET_SERVICE_MESSENGER_MEMBER_H
 
-#include "messenger_api_contact.h"
-
-#include "gnunet-service-messenger_list_messages.h"
 #include "gnunet-service-messenger_member_store.h"
-#include "messenger_api_message.h"
-#include "messenger_api_util.h"
 
 struct GNUNET_MESSENGER_Member
 {
diff --git a/src/service/messenger/gnunet-service-messenger_member_session.h 
b/src/service/messenger/gnunet-service-messenger_member_session.h
index 85ce44e28..8cd944afa 100644
--- a/src/service/messenger/gnunet-service-messenger_member_session.h
+++ b/src/service/messenger/gnunet-service-messenger_member_session.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021, 2023 GNUnet e.V.
+   Copyright (C) 2021--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
@@ -27,9 +27,9 @@
 #define GNUNET_SERVICE_MESSENGER_MEMBER_SESSION_H
 
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
 #include "gnunet_time_lib.h"
 
+#include "gnunet-service-messenger_list_messages.h"
 #include "gnunet-service-messenger_member.h"
 
 #include "messenger_api_contact.h"
diff --git a/src/service/messenger/gnunet-service-messenger_member_store.c 
b/src/service/messenger/gnunet-service-messenger_member_store.c
index 732e3f9a3..fb45147f4 100644
--- a/src/service/messenger/gnunet-service-messenger_member_store.c
+++ b/src/service/messenger/gnunet-service-messenger_member_store.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
@@ -30,6 +30,8 @@
 #include "gnunet-service-messenger_service.h"
 #include "gnunet-service-messenger_room.h"
 
+#include "messenger_api_message.h"
+
 void
 init_member_store (struct GNUNET_MESSENGER_MemberStore *store,
                    struct GNUNET_MESSENGER_SrvRoom *room)
diff --git a/src/service/messenger/gnunet-service-messenger_member_store.h 
b/src/service/messenger/gnunet-service-messenger_member_store.h
index 161c93818..181593e6b 100644
--- a/src/service/messenger/gnunet-service-messenger_member_store.h
+++ b/src/service/messenger/gnunet-service-messenger_member_store.h
@@ -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
@@ -27,8 +27,8 @@
 #define GNUNET_SERVICE_MESSENGER_MEMBER_STORE_H
 
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
-#include "messenger_api_message.h"
+
+#include "gnunet_messenger_service.h"
 
 struct GNUNET_MESSENGER_SrvRoom;
 
diff --git a/src/service/messenger/gnunet-service-messenger_message_handle.c 
b/src/service/messenger/gnunet-service-messenger_message_handle.c
index e730e12fe..d9ee1ef13 100644
--- a/src/service/messenger/gnunet-service-messenger_message_handle.c
+++ b/src/service/messenger/gnunet-service-messenger_message_handle.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
@@ -25,6 +25,8 @@
 
 #include "gnunet-service-messenger_message_handle.h"
 
+#include "gnunet-service-messenger_room.h"
+
 static void
 handle_member_session_switch (struct GNUNET_MESSENGER_MemberSession *session,
                               const struct GNUNET_MESSENGER_Message *message,
diff --git a/src/service/messenger/gnunet-service-messenger_message_handle.h 
b/src/service/messenger/gnunet-service-messenger_message_handle.h
index f76ae356a..a66c45192 100644
--- a/src/service/messenger/gnunet-service-messenger_message_handle.h
+++ b/src/service/messenger/gnunet-service-messenger_message_handle.h
@@ -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
@@ -26,12 +26,7 @@
 #ifndef GNUNET_SERVICE_MESSENGER_MESSAGE_HANDLE_H
 #define GNUNET_SERVICE_MESSENGER_MESSAGE_HANDLE_H
 
-#include "gnunet_util_lib.h"
-
 #include "gnunet-service-messenger_sender_session.h"
-#include "gnunet-service-messenger_tunnel.h"
-#include "messenger_api_message.h"
-#include "messenger_api_message_kind.h"
 
 /**
  * Handles a received or sent join message to make changes of current member 
information.
diff --git a/src/service/messenger/gnunet-service-messenger_message_kind.c 
b/src/service/messenger/gnunet-service-messenger_message_kind.c
index a7932a068..f1a79b321 100644
--- a/src/service/messenger/gnunet-service-messenger_message_kind.c
+++ b/src/service/messenger/gnunet-service-messenger_message_kind.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
@@ -25,7 +25,9 @@
 
 #include "gnunet-service-messenger_message_kind.h"
 
-#include "messenger_api_util.h"
+#include "gnunet-service-messenger_room.h"
+
+#include "messenger_api_message.h"
 
 struct GNUNET_MESSENGER_Message*
 create_message_info (struct GNUNET_MESSENGER_Service *service)
diff --git a/src/service/messenger/gnunet-service-messenger_message_kind.h 
b/src/service/messenger/gnunet-service-messenger_message_kind.h
index 972149288..7fc7a7cc0 100644
--- a/src/service/messenger/gnunet-service-messenger_message_kind.h
+++ b/src/service/messenger/gnunet-service-messenger_message_kind.h
@@ -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
@@ -27,10 +27,7 @@
 #define GNUNET_SERVICE_MESSENGER_MESSAGE_KIND_H
 
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
-#include "gnunet_time_lib.h"
 
-#include "messenger_api_message.h"
 #include "gnunet-service-messenger_service.h"
 
 /**
diff --git a/src/service/messenger/gnunet-service-messenger_message_recv.c 
b/src/service/messenger/gnunet-service-messenger_message_recv.c
index b51b91d55..53e96b524 100644
--- a/src/service/messenger/gnunet-service-messenger_message_recv.c
+++ b/src/service/messenger/gnunet-service-messenger_message_recv.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
@@ -25,6 +25,7 @@
 
 #include "gnunet-service-messenger_message_recv.h"
 
+#include "gnunet-service-messenger_basement.h"
 #include "gnunet-service-messenger_message_kind.h"
 #include "gnunet-service-messenger_operation.h"
 
diff --git a/src/service/messenger/gnunet-service-messenger_message_recv.h 
b/src/service/messenger/gnunet-service-messenger_message_recv.h
index 2c6cda4ad..58eb1d5cc 100644
--- a/src/service/messenger/gnunet-service-messenger_message_recv.h
+++ b/src/service/messenger/gnunet-service-messenger_message_recv.h
@@ -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
@@ -26,11 +26,7 @@
 #ifndef GNUNET_SERVICE_MESSENGER_MESSAGE_RECV_H
 #define GNUNET_SERVICE_MESSENGER_MESSAGE_RECV_H
 
-#include "gnunet_util_lib.h"
-
-#include "gnunet-service-messenger_member_session.h"
 #include "gnunet-service-messenger_tunnel.h"
-#include "messenger_api_message.h"
 
 /**
  * Handles a received info message to change the current member id to the one 
generated by
diff --git a/src/service/messenger/gnunet-service-messenger_message_send.h 
b/src/service/messenger/gnunet-service-messenger_message_send.h
index 0118dac99..ee4d8b0a4 100644
--- a/src/service/messenger/gnunet-service-messenger_message_send.h
+++ b/src/service/messenger/gnunet-service-messenger_message_send.h
@@ -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
@@ -26,10 +26,7 @@
 #ifndef GNUNET_SERVICE_MESSENGER_MESSAGE_SEND_H
 #define GNUNET_SERVICE_MESSENGER_MESSAGE_SEND_H
 
-#include "gnunet_util_lib.h"
-
-#include "gnunet-service-messenger_tunnel.h"
-#include "messenger_api_message.h"
+#include "gnunet-service-messenger_room.h"
 
 /**
  * Handles a sent join message to ensure growth of the decentralized room 
structure.
diff --git a/src/service/messenger/gnunet-service-messenger_message_state.h 
b/src/service/messenger/gnunet-service-messenger_message_state.h
index fc1ccfac8..9723c7654 100644
--- a/src/service/messenger/gnunet-service-messenger_message_state.h
+++ b/src/service/messenger/gnunet-service-messenger_message_state.h
@@ -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
@@ -26,9 +26,8 @@
 #ifndef GNUNET_SERVICE_MESSENGER_MESSAGE_STATE_H
 #define GNUNET_SERVICE_MESSENGER_MESSAGE_STATE_H
 
-#include "gnunet_util_lib.h"
+#include "gnunet_messenger_service.h"
 
-#include "messenger_api_message.h"
 #include "gnunet-service-messenger_list_messages.h"
 
 struct GNUNET_MESSENGER_MessageState
diff --git a/src/service/messenger/gnunet-service-messenger_operation.h 
b/src/service/messenger/gnunet-service-messenger_operation.h
index 0e02cdf6a..26282bea8 100644
--- a/src/service/messenger/gnunet-service-messenger_operation.h
+++ b/src/service/messenger/gnunet-service-messenger_operation.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2021, 2023 GNUnet e.V.
+   Copyright (C) 2021--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
@@ -26,7 +26,6 @@
 #ifndef GNUNET_SERVICE_MESSENGER_OPERATION_H
 #define GNUNET_SERVICE_MESSENGER_OPERATION_H
 
-#include "gnunet_configuration_lib.h"
 #include "gnunet_util_lib.h"
 #include "gnunet_scheduler_lib.h"
 #include "gnunet_time_lib.h"
diff --git a/src/service/messenger/gnunet-service-messenger_room.c 
b/src/service/messenger/gnunet-service-messenger_room.c
index 8ff8b1af7..1b8ce37ce 100644
--- a/src/service/messenger/gnunet-service-messenger_room.c
+++ b/src/service/messenger/gnunet-service-messenger_room.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
@@ -26,20 +26,16 @@
 #include "platform.h"
 #include "gnunet-service-messenger_room.h"
 
+#include "gnunet-service-messenger_basement.h"
 #include "gnunet-service-messenger_member.h"
 #include "gnunet-service-messenger_sender_session.h"
-
 #include "gnunet-service-messenger_message_kind.h"
 #include "gnunet-service-messenger_message_handle.h"
 #include "gnunet-service-messenger_message_send.h"
-
 #include "gnunet-service-messenger_operation.h"
-
-#include "gnunet-service-messenger.h"
 #include "gnunet-service-messenger_service.h"
 #include "gnunet-service-messenger_tunnel.h"
 
-#include "messenger_api_message.h"
 #include "messenger_api_util.h"
 
 static void
diff --git a/src/service/messenger/gnunet-service-messenger_room.h 
b/src/service/messenger/gnunet-service-messenger_room.h
index c3063748d..8b20051be 100644
--- a/src/service/messenger/gnunet-service-messenger_room.h
+++ b/src/service/messenger/gnunet-service-messenger_room.h
@@ -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
@@ -28,21 +28,19 @@
 
 #include "gnunet_cadet_service.h"
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
 
 #include "gnunet_messenger_service.h"
-#include "gnunet-service-messenger_basement.h"
 #include "gnunet-service-messenger_handle.h"
 #include "gnunet-service-messenger_message_state.h"
 #include "gnunet-service-messenger_list_messages.h"
-
-#include "messenger_api_list_tunnels.h"
-#include "messenger_api_peer_store.h"
-
 #include "gnunet-service-messenger_member_store.h"
 #include "gnunet-service-messenger_message_store.h"
 #include "gnunet-service-messenger_operation_store.h"
 
+#include "messenger_api_list_tunnels.h"
+#include "messenger_api_message.h"
+#include "messenger_api_peer_store.h"
+
 #define GNUNET_MESSENGER_IDLE_DELAY GNUNET_TIME_relative_multiply \
           (GNUNET_TIME_relative_get_second_ (), 5)
 
diff --git a/src/service/messenger/gnunet-service-messenger_service.c 
b/src/service/messenger/gnunet-service-messenger_service.c
index e6c9866df..c10d2c5c6 100644
--- a/src/service/messenger/gnunet-service-messenger_service.c
+++ b/src/service/messenger/gnunet-service-messenger_service.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,8 +24,11 @@
  */
 
 #include "gnunet-service-messenger_service.h"
-#include "gnunet-service-messenger.h"
+
 #include "gnunet-service-messenger_message_kind.h"
+#include "gnunet-service-messenger_room.h"
+
+#include "messenger_api_util.h"
 
 static void
 callback_shutdown_service (void *cls)
diff --git a/src/service/messenger/gnunet-service-messenger_service.h 
b/src/service/messenger/gnunet-service-messenger_service.h
index 82a72ea9e..403dfcc23 100644
--- a/src/service/messenger/gnunet-service-messenger_service.h
+++ b/src/service/messenger/gnunet-service-messenger_service.h
@@ -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
@@ -28,14 +28,13 @@
 
 #include "gnunet_configuration_lib.h"
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
 
 #include "gnunet-service-messenger_list_handles.h"
+#include "gnunet-service-messenger_sender_session.h"
 
 #include "messenger_api_contact_store.h"
 
-#include "gnunet-service-messenger_room.h"
-#include "gnunet-service-messenger_sender_session.h"
+struct GNUNET_MESSENGER_SrvRoom;
 
 struct GNUNET_MESSENGER_Service
 {
diff --git a/src/service/messenger/gnunet-service-messenger_tunnel.c 
b/src/service/messenger/gnunet-service-messenger_tunnel.c
index 87395797d..4080cfa46 100644
--- a/src/service/messenger/gnunet-service-messenger_tunnel.c
+++ b/src/service/messenger/gnunet-service-messenger_tunnel.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
@@ -30,6 +30,7 @@
 #include "gnunet-service-messenger_message_store.h"
 #include "gnunet-service-messenger_operation_store.h"
 #include "gnunet-service-messenger_operation.h"
+
 #include "messenger_api_util.h"
 
 struct GNUNET_MESSENGER_SrvTunnel*
diff --git a/src/service/messenger/messenger_api.c 
b/src/service/messenger/messenger_api.c
index 7fd873211..2981b1a71 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,13 +24,14 @@
  */
 
 #include "gnunet_common.h"
-#include "gnunet_identity_service.h"
+#include "gnunet_core_service.h"
 #include "gnunet_messenger_service.h"
 
 #include "gnunet-service-messenger.h"
 
 #include "gnunet_reclaim_service.h"
 #include "messenger_api_contact.h"
+#include "messenger_api_contact_store.h"
 #include "messenger_api_handle.h"
 #include "messenger_api_message.h"
 #include "messenger_api_message_kind.h"
@@ -72,6 +73,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";
   }
@@ -174,7 +183,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,
@@ -210,8 +220,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);
 }
 
 
@@ -297,33 +306,61 @@ handle_recv_message (void *cls,
 
   struct GNUNET_MESSENGER_Room *room = get_handle_room (handle, key);
 
-  if (room)
+  if (!room)
   {
-    struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store (
-      handle);
+    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Unknown room for this client: %s\n",
+                GNUNET_h2s (key));
+    
+    goto skip_message;
+  }
 
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
-                "Raw contact from sender and context: (%s : %s)\n",
-                GNUNET_h2s (sender), GNUNET_h2s_full (context));
+  struct GNUNET_MESSENGER_ContactStore *store = get_handle_contact_store (
+    handle);
 
-    struct GNUNET_MESSENGER_Contact *contact = get_store_contact_raw (
-      store, context, sender
-      );
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+              "Raw contact from sender and context: (%s : %s)\n",
+              GNUNET_h2s (sender), GNUNET_h2s_full (context));
 
-    contact = handle_room_message (room, contact, private_message ?
-                                   private_message : &message, hash, flags);
+  struct GNUNET_MESSENGER_Contact *contact = get_store_contact_raw (
+    store, context, sender);
+  
+  struct GNUNET_MESSENGER_Contact *recipient = NULL;
 
-    const struct GNUNET_MESSENGER_Message *stored_message = get_room_message (
-      room, hash);
+  if (!private_message)
+    goto skip_recipient;
 
-    if (handle->msg_callback)
-      handle->msg_callback (handle->msg_cls, room, contact, stored_message,
-                            hash, flags);
+  const struct GNUNET_CRYPTO_PublicKey *recipient_key;
+
+  if (GNUNET_MESSENGER_KIND_TRANSCRIPT == private_message->header.kind)
+  {
+    struct GNUNET_MESSENGER_Message *transcript;
+
+    recipient_key = &(private_message->body.transcript.key);
+    transcript = read_transcript_message(private_message);
+
+    if (transcript)
+    {
+      destroy_message(private_message);
+      private_message = transcript;
+    }
   }
   else
-    GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Unknown room for this client: %s\n",
-                GNUNET_h2s (key));
+    recipient_key = get_handle_pubkey(handle);
+
+  recipient = get_store_contact(store, context, recipient_key);
+
+skip_recipient:
+  contact = handle_room_message (room, contact, recipient, private_message ?
+                                 private_message : &message, hash, flags);
+
+  const struct GNUNET_MESSENGER_Message *stored_message = get_room_message (
+    room, hash);
 
+  if (handle->msg_callback)
+    handle->msg_callback (handle->msg_cls, room, contact, recipient,
+                          stored_message, hash, flags);
+
+skip_message:
   cleanup_message (&message);
 
   if (private_message)
@@ -359,8 +396,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);
 }
 
 
@@ -656,6 +692,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);
@@ -689,6 +726,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);
@@ -700,7 +740,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;
@@ -715,7 +756,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;
@@ -731,6 +772,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))
@@ -740,10 +783,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;
@@ -780,8 +844,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;
 }
 
@@ -831,8 +894,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;
 }
 
@@ -929,10 +991,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);
 }
 
 
@@ -1011,6 +1070,17 @@ GNUNET_MESSENGER_get_sender (const struct 
GNUNET_MESSENGER_Room *room,
 }
 
 
+const struct GNUNET_MESSENGER_Contact*
+GNUNET_MESSENGER_get_recipient (const struct GNUNET_MESSENGER_Room *room,
+                                const struct GNUNET_HashCode *hash)
+{
+  if ((! room) || (! hash))
+    return NULL;
+
+  return get_room_recipient (room, hash);
+}
+
+
 const char*
 GNUNET_MESSENGER_contact_get_name (const struct
                                    GNUNET_MESSENGER_Contact *contact)
@@ -1049,8 +1119,10 @@ 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;
+  const struct GNUNET_CRYPTO_PublicKey *pubkey;
+
   char *original_name;
-  char *changed_name = NULL;
 
   if (GNUNET_MESSENGER_KIND_NAME != message->header.kind)
     goto skip_naming;
@@ -1065,44 +1137,41 @@ 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);
-
-    if (GNUNET_YES != encrypt_message (message, public_key))
-    {
-      GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
-                  "Sending message aborted: Encryption failed!\n");
+  if (!public_key)
+    goto skip_encryption;
 
-      destroy_message (message);
-      message = original;
-
-      goto reset_naming;
-    }
-  }
+  pubkey = get_handle_pubkey (room->handle);
 
-  enqueue_message_to_room (room, message);
+  if (0 != GNUNET_memcmp(pubkey, public_key))
+    transcript = transcribe_message (message, public_key);
 
-reset_naming:
-  if (changed_name)
-    GNUNET_free (changed_name);
+  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);
 
-  if (GNUNET_MESSENGER_KIND_NAME != message->header.kind)
+    destroy_message (message);
     return;
+  }
 
-  message->body.name.name = original_name;
+skip_encryption:
+  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))
@@ -1140,7 +1209,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);
 }
 
 
@@ -1196,9 +1265,9 @@ check_ticket_audience (void *cls,
   struct GNUNET_MESSENGER_CheckTicket *check = cls;
 
   const struct GNUNET_CRYPTO_PublicKey *key;
-  key = get_contact_key(contact);
+  key = get_non_anonymous_key (get_contact_key (contact));
 
-  if (0 == GNUNET_memcmp(key, check->audience))
+  if ((key) && (0 == GNUNET_memcmp(key, check->audience)))
   {
     check->result = GNUNET_YES;
     return GNUNET_NO;
@@ -1216,7 +1285,7 @@ GNUNET_MESSENGER_send_ticket (struct 
GNUNET_MESSENGER_Room *room,
     return;
 
   const struct GNUNET_CRYPTO_PublicKey *pubkey;
-  pubkey = get_handle_pubkey(room->handle);
+  pubkey = get_handle_pubkey (room->handle);
 
   if (0 != GNUNET_memcmp(pubkey, &(ticket->identity)))
   {
@@ -1241,7 +1310,7 @@ GNUNET_MESSENGER_send_ticket (struct 
GNUNET_MESSENGER_Room *room,
     return;
   }
 
-  struct GNUNET_MESSENGER_Message *message = create_message_ticket(
+  struct GNUNET_MESSENGER_Message *message = create_message_ticket (
     &(ticket->rnd)
   );
 
@@ -1253,5 +1322,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_cmd_start_service.c 
b/src/service/messenger/messenger_api_cmd_start_service.c
index a35d338fd..4c9ce2849 100644
--- a/src/service/messenger/messenger_api_cmd_start_service.c
+++ b/src/service/messenger/messenger_api_cmd_start_service.c
@@ -1,21 +1,21 @@
 /*
-      This file is part of GNUnet
-      Copyright (C) 2023 GNUnet e.V.
+   This file is part of GNUnet
+   Copyright (C) 2023--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
-      by the Free Software Foundation, either version 3 of the License,
-      or (at your option) any later version.
+   GNUnet is free software: you can redistribute it and/or modify it
+   under the terms of the GNU Affero General Public License as published
+   by the Free Software Foundation, either version 3 of the License,
+   or (at your option) any later version.
 
-      GNUnet is distributed in the hope that it will be useful, but
-      WITHOUT ANY WARRANTY; without even the implied warranty of
-      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-      Affero General Public License for more details.
+   GNUnet is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Affero General Public License for more details.
 
-      You should have received a copy of the GNU Affero General Public License
-      along with this program.  If not, see <http://www.gnu.org/licenses/>.
+   You should have received a copy of the GNU Affero General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-     SPDX-License-Identifier: AGPL3.0-or-later
+   SPDX-License-Identifier: AGPL3.0-or-later
  */
 
 /**
@@ -35,6 +35,7 @@ static void
 on_message_cb (void *cls,
                struct GNUNET_MESSENGER_Room *room,
                const struct GNUNET_MESSENGER_Contact *sender,
+               const struct GNUNET_MESSENGER_Contact *recipient,
                const struct GNUNET_MESSENGER_Message *message,
                const struct GNUNET_HashCode *hash,
                enum GNUNET_MESSENGER_MessageFlags flags)
diff --git a/src/service/messenger/messenger_api_contact.h 
b/src/service/messenger/messenger_api_contact.h
index 2ef049200..d3bb38e96 100644
--- a/src/service/messenger/messenger_api_contact.h
+++ b/src/service/messenger/messenger_api_contact.h
@@ -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
@@ -27,7 +27,6 @@
 #define GNUNET_MESSENGER_API_CONTACT_H
 
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
 
 struct GNUNET_MESSENGER_Contact
 {
diff --git a/src/service/messenger/messenger_api_contact_store.h 
b/src/service/messenger/messenger_api_contact_store.h
index f9982f3f3..6b61f3e4f 100644
--- a/src/service/messenger/messenger_api_contact_store.h
+++ b/src/service/messenger/messenger_api_contact_store.h
@@ -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
@@ -27,7 +27,6 @@
 #define GNUNET_MESSENGER_API_CONTACT_STORE_H
 
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
 
 struct GNUNET_MESSENGER_Contact;
 
diff --git a/src/service/messenger/messenger_api_handle.h 
b/src/service/messenger/messenger_api_handle.h
index 0d4c945c0..1a2763020 100644
--- a/src/service/messenger/messenger_api_handle.h
+++ b/src/service/messenger/messenger_api_handle.h
@@ -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
@@ -26,9 +26,7 @@
 #ifndef GNUNET_MESSENGER_API_HANDLE_H
 #define GNUNET_MESSENGER_API_HANDLE_H
 
-#include "gnunet_cadet_service.h"
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
 
 #include "gnunet_messenger_service.h"
 
diff --git a/src/service/messenger/messenger_api_message.c 
b/src/service/messenger/messenger_api_message.c
index 486a0e081..884adabed 100644
--- a/src/service/messenger/messenger_api_message.c
+++ b/src/service/messenger/messenger_api_message.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,11 @@
  */
 
 #include "messenger_api_message.h"
+
+#include "gnunet_common.h"
 #include "gnunet_messenger_service.h"
+#include "gnunet_signatures.h"
+#include <stdint.h>
 
 struct GNUNET_MESSENGER_MessageSignature
 {
@@ -61,6 +65,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;
   }
@@ -95,11 +106,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;
@@ -116,10 +137,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);
@@ -127,6 +150,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;
   }
@@ -226,8 +256,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);
@@ -248,6 +276,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;
   }
@@ -295,7 +329,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);
@@ -303,6 +337,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;
   }
@@ -447,7 +488,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);
@@ -472,9 +513,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));
@@ -504,6 +546,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;
   }
@@ -696,6 +752,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;
@@ -998,7 +1065,7 @@ decrypt_message (struct GNUNET_MESSENGER_Message *message,
                                           message->body.privacy.data,
                                           encoded_length))
   {
-    GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Decrypting message failed!\n");
+    GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Decrypting message failed!\n");
 
     return GNUNET_NO;
   }
@@ -1020,6 +1087,73 @@ 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));
+
+  if (GNUNET_YES == is_service_message (message))
+    return NULL;
+
+  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_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,
@@ -1131,6 +1265,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_NO;
+  case GNUNET_MESSENGER_KIND_TAG:
+    return GNUNET_NO;
   default:
     return GNUNET_SYSERR;
   }
@@ -1178,6 +1316,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;
diff --git a/src/service/messenger/messenger_api_message.h 
b/src/service/messenger/messenger_api_message.h
index 41684c6b6..a19eb36ba 100644
--- a/src/service/messenger/messenger_api_message.h
+++ b/src/service/messenger/messenger_api_message.h
@@ -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
@@ -27,8 +27,6 @@
 #define GNUNET_MESSENGER_API_MESSAGE_H
 
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
-#include "gnunet_signatures.h"
 
 #include "gnunet_messenger_service.h"
 
@@ -246,6 +244,27 @@ 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 recipient 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);
+
+/**
+ * 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,
diff --git a/src/service/messenger/messenger_api_message_kind.c 
b/src/service/messenger/messenger_api_message_kind.c
index c9cf227a2..43baefe66 100644
--- a/src/service/messenger/messenger_api_message_kind.c
+++ b/src/service/messenger/messenger_api_message_kind.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
@@ -25,7 +25,7 @@
 
 #include "messenger_api_message_kind.h"
 
-#include "messenger_api_util.h"
+#include "messenger_api_message.h"
 
 struct GNUNET_MESSENGER_Message*
 create_message_join (const struct GNUNET_CRYPTO_PrivateKey *key)
diff --git a/src/service/messenger/messenger_api_message_kind.h 
b/src/service/messenger/messenger_api_message_kind.h
index 20e3cba83..5edb1c06e 100644
--- a/src/service/messenger/messenger_api_message_kind.h
+++ b/src/service/messenger/messenger_api_message_kind.h
@@ -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
@@ -29,12 +29,8 @@
 #include "gnunet_messenger_service.h"
 #include "gnunet_reclaim_lib.h"
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
 #include "gnunet_time_lib.h"
 
-#include "messenger_api_message.h"
-#include "gnunet-service-messenger_service.h"
-
 /**
  * Creates and allocates a new join message containing the clients public 
<i>key</i>.
  * (all values are stored as copy)
diff --git a/src/service/messenger/messenger_api_queue_messages.c 
b/src/service/messenger/messenger_api_queue_messages.c
index cda5e5629..876bed939 100644
--- a/src/service/messenger/messenger_api_queue_messages.c
+++ b/src/service/messenger/messenger_api_queue_messages.c
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2023 GNUnet e.V.
+   Copyright (C) 2023--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
@@ -25,6 +25,9 @@
 
 #include "messenger_api_queue_messages.h"
 
+#include "gnunet_messenger_service.h"
+#include "messenger_api_message.h"
+
 void
 init_queue_messages (struct GNUNET_MESSENGER_QueueMessages *messages)
 {
@@ -49,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);
   }
 
@@ -60,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));
@@ -71,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));
@@ -91,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 64ded85ce..0512e2f71 100644
--- a/src/service/messenger/messenger_api_queue_messages.h
+++ b/src/service/messenger/messenger_api_queue_messages.h
@@ -1,6 +1,6 @@
 /*
    This file is part of GNUnet.
-   Copyright (C) 2023 GNUnet e.V.
+   Copyright (C) 2023--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
@@ -26,18 +26,17 @@
 #ifndef GNUNET_MESSENGER_API_QUEUE_MESSAGES_H
 #define GNUNET_MESSENGER_API_QUEUE_MESSAGES_H
 
-#include "gnunet_identity_service.h"
 #include "gnunet_util_lib.h"
 
-#include "messenger_api_message.h"
-
 struct GNUNET_MESSENGER_QueueMessage
 {
   struct GNUNET_MESSENGER_QueueMessage *prev;
   struct GNUNET_MESSENGER_QueueMessage *next;
 
   struct GNUNET_CRYPTO_PrivateKey sender;
+  
   struct GNUNET_MESSENGER_Message *message;
+  struct GNUNET_MESSENGER_Message *transcript;
 };
 
 struct GNUNET_MESSENGER_QueueMessages
@@ -69,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);
 
 /**
@@ -82,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
diff --git a/src/service/messenger/messenger_api_room.c 
b/src/service/messenger/messenger_api_room.c
index ea19879ec..e7de430ae 100644
--- a/src/service/messenger/messenger_api_room.c
+++ b/src/service/messenger/messenger_api_room.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
@@ -26,6 +26,7 @@
 #include "messenger_api_room.h"
 
 #include "messenger_api_handle.h"
+#include "messenger_api_message.h"
 
 struct GNUNET_MESSENGER_Room*
 create_room (struct GNUNET_MESSENGER_Handle *handle,
@@ -177,6 +178,21 @@ get_room_sender (const struct GNUNET_MESSENGER_Room *room,
 }
 
 
+struct GNUNET_MESSENGER_Contact*
+get_room_recipient (const struct GNUNET_MESSENGER_Room *room,
+                    const struct GNUNET_HashCode *hash)
+{
+  GNUNET_assert ((room) && (hash));
+
+  struct GNUNET_MESSENGER_RoomMessageEntry *entry =
+    GNUNET_CONTAINER_multihashmap_get (
+      room->messages, hash
+      );
+
+  return (entry? entry->recipient : NULL);
+}
+
+
 static struct GNUNET_MESSENGER_Contact*
 handle_join_message (struct GNUNET_MESSENGER_Room *room,
                      struct GNUNET_MESSENGER_Contact *sender,
@@ -353,6 +369,7 @@ handle_delete_message (struct GNUNET_MESSENGER_Room *room,
 struct GNUNET_MESSENGER_Contact*
 handle_room_message (struct GNUNET_MESSENGER_Room *room,
                      struct GNUNET_MESSENGER_Contact *sender,
+                     struct GNUNET_MESSENGER_Contact *recipient,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash,
                      enum GNUNET_MESSENGER_MessageFlags flags)
@@ -395,6 +412,7 @@ handle_room_message (struct GNUNET_MESSENGER_Room *room,
     return sender;
 
   entry->sender = sender;
+  entry->recipient = recipient;
   entry->message = copy_message (message);
 
   if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put (room->messages, hash,
diff --git a/src/service/messenger/messenger_api_room.h 
b/src/service/messenger/messenger_api_room.h
index 19cef2131..855405337 100644
--- a/src/service/messenger/messenger_api_room.h
+++ b/src/service/messenger/messenger_api_room.h
@@ -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
@@ -32,12 +32,12 @@
 
 #include "messenger_api_list_tunnels.h"
 #include "messenger_api_contact.h"
-#include "messenger_api_message.h"
 #include "messenger_api_queue_messages.h"
 
 struct GNUNET_MESSENGER_RoomMessageEntry
 {
   struct GNUNET_MESSENGER_Contact *sender;
+  struct GNUNET_MESSENGER_Contact *recipient;
   struct GNUNET_MESSENGER_Message *message;
 };
 
@@ -133,6 +133,18 @@ struct GNUNET_MESSENGER_Contact*
 get_room_sender (const struct GNUNET_MESSENGER_Room *room,
                  const struct GNUNET_HashCode *hash);
 
+/**
+ * Returns a messages recipient locally stored from a map for a given 
<i>hash</i> in a <i>room</i>. If no
+ * matching message is found or the message has not been privately received, 
NULL gets returned.
+ *
+ * @param[in] room Room
+ * @param[in] hash Hash of message
+ * @return Contact of recipient or NULL
+ */
+struct GNUNET_MESSENGER_Contact*
+get_room_recipient (const struct GNUNET_MESSENGER_Room *room,
+                    const struct GNUNET_HashCode *hash);
+
 /**
  * Handles a <i>message</i> with a given <i>hash</i> in a <i>room</i> for the 
client API to update
  * members and its information. The function also stores the message in map 
locally for access afterwards.
@@ -142,6 +154,7 @@ get_room_sender (const struct GNUNET_MESSENGER_Room *room,
  *
  * @param[in,out] room Room
  * @param[in,out] sender Contact of sender
+ * @param[in,out] recipient Contact of recipient
  * @param[in] message Message
  * @param[in] hash Hash of message
  * @param[in] flags Flags of message
@@ -150,6 +163,7 @@ get_room_sender (const struct GNUNET_MESSENGER_Room *room,
 struct GNUNET_MESSENGER_Contact*
 handle_room_message (struct GNUNET_MESSENGER_Room *room,
                      struct GNUNET_MESSENGER_Contact *sender,
+                     struct GNUNET_MESSENGER_Contact *recipient,
                      const struct GNUNET_MESSENGER_Message *message,
                      const struct GNUNET_HashCode *hash,
                      enum GNUNET_MESSENGER_MessageFlags flags);
diff --git a/src/service/messenger/messenger_api_util.c 
b/src/service/messenger/messenger_api_util.c
index 6cdeb647b..1d38f87a1 100644
--- a/src/service/messenger/messenger_api_util.c
+++ b/src/service/messenger/messenger_api_util.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
@@ -25,6 +25,9 @@
 
 #include "messenger_api_util.h"
 
+#include "gnunet_identity_service.h"
+#include "gnunet_messenger_service.h"
+
 static void
 callback_close_channel (void *cls)
 {
diff --git a/src/service/messenger/messenger_api_util.h 
b/src/service/messenger/messenger_api_util.h
index a8b4e9150..877491c93 100644
--- a/src/service/messenger/messenger_api_util.h
+++ b/src/service/messenger/messenger_api_util.h
@@ -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
@@ -28,8 +28,6 @@
 
 #include "gnunet_cadet_service.h"
 #include "gnunet_util_lib.h"
-#include "gnunet_identity_service.h"
-#include "gnunet_messenger_service.h"
 
 /**
  * Starts an urgent task to close a CADET channel asynchronously.

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