From a67bafd0a50710de5fd729dbc5b938ad48580954 Mon Sep 17 00:00:00 2001 From: TheJackiMonster Date: Sat, 13 Aug 2022 22:03:29 +0200 Subject: Make message handling client side more reliable Signed-off-by: TheJackiMonster --- src/gnunet_chat_handle_intern.c | 9 ++++++--- src/gnunet_chat_lib.c | 24 +----------------------- src/gnunet_chat_util.c | 28 ++++++++++++++++++++++++++++ src/gnunet_chat_util.h | 13 +++++++++++++ 4 files changed, 48 insertions(+), 26 deletions(-) diff --git a/src/gnunet_chat_handle_intern.c b/src/gnunet_chat_handle_intern.c index a026617..04afcbc 100644 --- a/src/gnunet_chat_handle_intern.c +++ b/src/gnunet_chat_handle_intern.c @@ -374,7 +374,7 @@ intern_provide_contact_for_member(struct GNUNET_CHAT_Handle *handle, GNUNET_assert((handle) && (handle->contacts)); if (!member) - return GNUNET_OK; + return GNUNET_SYSERR; struct GNUNET_ShortHashCode shorthash; util_shorthash_from_member(member, &shorthash); @@ -584,12 +584,15 @@ on_handle_message (void *cls, (hash)); if ((handle->destruction) || - (GNUNET_OK != handle_request_context_by_room(handle, room)) || - (GNUNET_OK != intern_provide_contact_for_member(handle, sender, NULL))) + (GNUNET_OK != handle_request_context_by_room(handle, room))) return; GNUNET_MESSENGER_get_message(room, &(msg->header.previous)); + if ((GNUNET_CHAT_KIND_UNKNOWN == util_message_kind_from_kind(msg->header.kind)) || + (GNUNET_OK != intern_provide_contact_for_member(handle, sender, NULL))) + return; + struct GNUNET_CHAT_Context *context = GNUNET_CONTAINER_multihashmap_get( handle->contexts, GNUNET_MESSENGER_room_get_key(room) ); diff --git a/src/gnunet_chat_lib.c b/src/gnunet_chat_lib.c index 114f40c..b6911e7 100644 --- a/src/gnunet_chat_lib.c +++ b/src/gnunet_chat_lib.c @@ -1327,29 +1327,7 @@ GNUNET_CHAT_message_get_kind (const struct GNUNET_CHAT_Message *message) if (!(message->msg)) return GNUNET_CHAT_KIND_UNKNOWN; - switch (message->msg->header.kind) - { - case GNUNET_MESSENGER_KIND_JOIN: - return GNUNET_CHAT_KIND_JOIN; - case GNUNET_MESSENGER_KIND_LEAVE: - return GNUNET_CHAT_KIND_LEAVE; - case GNUNET_MESSENGER_KIND_NAME: - case GNUNET_MESSENGER_KIND_KEY: - case GNUNET_MESSENGER_KIND_ID: - return GNUNET_CHAT_KIND_CONTACT; - case GNUNET_MESSENGER_KIND_INVITE: - return GNUNET_CHAT_KIND_INVITATION; - case GNUNET_MESSENGER_KIND_TEXT: - return GNUNET_CHAT_KIND_TEXT; - case GNUNET_MESSENGER_KIND_FILE: - return GNUNET_CHAT_KIND_FILE; - case GNUNET_MESSENGER_KIND_PRIVATE: - return GNUNET_CHAT_KIND_WHISPER; - case GNUNET_MESSENGER_KIND_DELETE: - return GNUNET_CHAT_KIND_DELETION; - default: - return GNUNET_CHAT_KIND_UNKNOWN; - } + return util_message_kind_from_kind(message->msg->header.kind); } diff --git a/src/gnunet_chat_util.c b/src/gnunet_chat_util.c index 26d2985..8a0879b 100644 --- a/src/gnunet_chat_util.c +++ b/src/gnunet_chat_util.c @@ -347,3 +347,31 @@ util_lobby_name (const struct GNUNET_HashCode *hash, GNUNET_free(low); return result; } + +enum GNUNET_CHAT_MessageKind +util_message_kind_from_kind (enum GNUNET_MESSENGER_MessageKind kind) +{ + switch (kind) + { + case GNUNET_MESSENGER_KIND_JOIN: + return GNUNET_CHAT_KIND_JOIN; + case GNUNET_MESSENGER_KIND_LEAVE: + return GNUNET_CHAT_KIND_LEAVE; + case GNUNET_MESSENGER_KIND_NAME: + case GNUNET_MESSENGER_KIND_KEY: + case GNUNET_MESSENGER_KIND_ID: + return GNUNET_CHAT_KIND_CONTACT; + case GNUNET_MESSENGER_KIND_INVITE: + return GNUNET_CHAT_KIND_INVITATION; + case GNUNET_MESSENGER_KIND_TEXT: + return GNUNET_CHAT_KIND_TEXT; + case GNUNET_MESSENGER_KIND_FILE: + return GNUNET_CHAT_KIND_FILE; + case GNUNET_MESSENGER_KIND_PRIVATE: + return GNUNET_CHAT_KIND_WHISPER; + case GNUNET_MESSENGER_KIND_DELETE: + return GNUNET_CHAT_KIND_DELETION; + default: + return GNUNET_CHAT_KIND_UNKNOWN; + } +} diff --git a/src/gnunet_chat_util.h b/src/gnunet_chat_util.h index 8845eab..9229586 100644 --- a/src/gnunet_chat_util.h +++ b/src/gnunet_chat_util.h @@ -32,6 +32,8 @@ #include #include +#include "gnunet_chat_lib.h" + /** * Enum for the types of chat contexts. */ @@ -185,4 +187,15 @@ int util_lobby_name (const struct GNUNET_HashCode *hash, char **name); +/** + * Return the chat related kind for a messages original kind + * from the service. It will return #GNUNET_CHAT_KIND_UNKNOWN + * in case the message kind is not supported. + * + * @param[in] kind Messenger service message kind + * @return Chat message kind or #GNUNET_CHAT_KIND_UNKNOWN_ + */ +enum GNUNET_CHAT_MessageKind +util_message_kind_from_kind (enum GNUNET_MESSENGER_MessageKind kind); + #endif /* GNUNET_CHAT_UTIL_H_ */ -- cgit v1.2.3