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