[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.
- [gnunet] branch master updated (c24030b2d -> d821d81f7), gnunet, 2024/01/20
- [gnunet] 04/08: MESSENGER: Add recipient to message callback, gnunet, 2024/01/20
- [gnunet] 03/08: MESSENGER: Implement automatic transcription of private messages,
gnunet <=
- [gnunet] 02/08: MESSENGER: Add transcript and tag message kinds, gnunet, 2024/01/20
- [gnunet] 01/08: MESSENGER: Cleanup includes in code, gnunet, 2024/01/20
- [gnunet] 06/08: MESSENGER: Store recipient information for each message locally, gnunet, 2024/01/20
- [gnunet] 05/08: MESSENGER: Implement handling transcript messages, gnunet, 2024/01/20
- [gnunet] 07/08: MESSENGER: Drop transcript when sending private messages to own key, gnunet, 2024/01/20
- [gnunet] 08/08: -adjust log output, gnunet, 2024/01/20