aboutsummaryrefslogtreecommitdiff
path: root/src/messenger/gnunet-service-messenger_message_handle.c
diff options
context:
space:
mode:
authorTheJackiMonster <thejackimonster@gmail.com>2020-11-01 22:57:28 +0100
committerTheJackiMonster <thejackimonster@gmail.com>2021-03-06 01:30:37 +0100
commit2925310d67483aca6e055e1ce0593c6463cd6c72 (patch)
tree2cc8aacafc25563cdccde2eee9a90f9ca257d405 /src/messenger/gnunet-service-messenger_message_handle.c
parent82b864a64679b0a735201724907cdf2b7e4e16c3 (diff)
downloadgnunet-2925310d67483aca6e055e1ce0593c6463cd6c72.tar.gz
gnunet-2925310d67483aca6e055e1ce0593c6463cd6c72.zip
-added core functionality of the messenger service
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> formatting messenger code Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -completed core functionality of messenger service Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -code cleanup and reuse Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> +added structure to memberships of rooms Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -implemented member permission checks and deletion of messages Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -moved solving requests out of updating last messages (also forward before update) Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -reduced complexity of permisson check and changed load/save of rooms Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -added save/load for accessed keys and basement peers of a room Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -implemented save/load for members with their history and session Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -abstracted management of egos and contacts Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -fix warning Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -abstracted management of members Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -fixed and adjusted test case Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -separated handling of direct and anonymous contacts Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -messenger added member-sessions which fix multiple edge cases, also additional cleanup Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -updated docs and fixed memory leak Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -changed info messages and added protocol version exchange Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -adjusted client api to use contacts from sessions Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -added more logging and fixed wrong session usage Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -adjusted comm0 test case and removed adding members from checking messages Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -fixed test-case for peer exchange Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -getting multiple peers connected in test-case with cadet Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -fixed wrong assert and added tunnel version check -simplified handling and forwarding Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -fixed merging last messages and cycling info messages Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -automated adding sessions and members Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -corrected use of identity keys and signatures Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -adding local joining on entering external room Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -fixed test-case comm0 Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -added more test-cases with generic setup Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -fixed multiple simultaneous channels blocking each other Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -making test-cases more precise Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -added check of members in test-cases, reduced merge messages Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -unified delayed operations: requests, deletions and merges Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -finished handling of operations Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -fixed member session historystorage, added request permission check and padding for transmission Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -improved padding and removed automatic recursive requests Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -implemented filter for sending messages and added private messages to API level Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -wrong setups fixed with proper ego lookups Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -fixed problem with anonymous ego and changed to discrete-level padding Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -added links to replace deleted messages, added local deletion and fixed anonymous id changing Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -added session completion and removal through completion process Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
Diffstat (limited to 'src/messenger/gnunet-service-messenger_message_handle.c')
-rw-r--r--src/messenger/gnunet-service-messenger_message_handle.c108
1 files changed, 50 insertions, 58 deletions
diff --git a/src/messenger/gnunet-service-messenger_message_handle.c b/src/messenger/gnunet-service-messenger_message_handle.c
index 1652435c8..c22e51fbf 100644
--- a/src/messenger/gnunet-service-messenger_message_handle.c
+++ b/src/messenger/gnunet-service-messenger_message_handle.c
@@ -1,6 +1,6 @@
1/* 1/*
2 This file is part of GNUnet. 2 This file is part of GNUnet.
3 Copyright (C) 2020 GNUnet e.V. 3 Copyright (C) 2020--2021 GNUnet e.V.
4 4
5 GNUnet is free software: you can redistribute it and/or modify it 5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published 6 under the terms of the GNU Affero General Public License as published
@@ -25,75 +25,59 @@
25 25
26#include "gnunet-service-messenger_message_handle.h" 26#include "gnunet-service-messenger_message_handle.h"
27 27
28void 28static void
29handle_message_join (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, 29handle_session_switch (struct GNUNET_MESSENGER_MemberSession *session,
30 struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) 30 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
31{ 31{
32 struct GNUNET_MESSENGER_SrvContact *contact = get_room_contact (room, &(message->header.sender_id)); 32 struct GNUNET_MESSENGER_MemberSession *next = switch_member_session(session, message, hash);
33
34 if (!contact)
35 add_room_contact (room, &(message->header.sender_id), &(message->body.join.key));
36
37 struct GNUNET_MESSENGER_MemberInfo *info = get_room_member_info (room, &(message->header.sender_id));
38
39 if (!info)
40 {
41 info = GNUNET_new(struct GNUNET_MESSENGER_MemberInfo);
42
43 info->access = GNUNET_MESSENGER_MEMBER_UNKNOWN;
44 init_list_messages (&(info->session_messages));
45 }
46 else
47 clear_list_messages (&(info->session_messages));
48 33
49 if (GNUNET_YES == GNUNET_CONTAINER_multishortmap_put (room->member_infos, &(message->header.sender_id), info, 34 if (next != session)
50 GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) 35 add_member_session(next->member, next);
51 add_to_list_messages (&(info->session_messages), hash);
52} 36}
53 37
54void 38void
55handle_message_leave (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, 39handle_message_join (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_MemberSession *session,
56 struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) 40 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
57{ 41{
58 struct GNUNET_MESSENGER_MemberInfo *info = get_room_member_info (room, &(message->header.sender_id)); 42 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Member (%s) joins room (%s).\n",
43 GNUNET_sh2s (&(message->header.sender_id)), GNUNET_h2s(get_room_key(room)));
59 44
60 if (info) 45 if (GNUNET_OK != reset_member_session(session, hash))
61 clear_list_messages (&(info->session_messages)); 46 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Resetting member session failed!\n");
62} 47}
63 48
64void 49void
65handle_message_name (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, 50handle_message_leave (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_MemberSession *session,
66 struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) 51 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
67{ 52{
68 struct GNUNET_MESSENGER_SrvContact *contact = get_room_contact (room, &(message->header.sender_id)); 53 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Member (%s) leaves room (%s).\n",
54 GNUNET_sh2s (&(message->header.sender_id)), GNUNET_h2s(get_room_key(room)));
69 55
70 if (contact) 56 close_member_session(session);
71 set_contact_name (contact, message->body.name.name);
72
73 struct GNUNET_MESSENGER_MemberInfo *info = get_room_member_info (room, &(message->header.sender_id));
74
75 if (info)
76 add_to_list_messages (&(info->session_messages), hash);
77} 57}
78 58
79void 59void
80handle_message_key (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, 60handle_message_name (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_MemberSession *session,
81 struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) 61 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
82{ 62{
83 struct GNUNET_MESSENGER_SrvContact *contact = get_room_contact (room, &(message->header.sender_id)); 63 struct GNUNET_MESSENGER_Contact *contact = get_member_session_contact(session);
84 64
85 if (contact) 65 if (!contact)
86 swap_service_contact_by_pubkey (room->service, contact, &(message->body.key.key)); 66 return;
87 67
88 struct GNUNET_MESSENGER_MemberInfo *info = get_room_member_info (room, &(message->header.sender_id)); 68 set_contact_name (contact, message->body.name.name);
69}
89 70
90 if (info) 71void
91 add_to_list_messages (&(info->session_messages), hash); 72handle_message_key (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_MemberSession *session,
73 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
74{
75 handle_session_switch (session, message, hash);
92} 76}
93 77
94void 78void
95handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, 79handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_MemberSession *session,
96 struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) 80 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
97{ 81{
98 if (GNUNET_NO == contains_list_tunnels (&(room->basement), &(message->body.peer.peer))) 82 if (GNUNET_NO == contains_list_tunnels (&(room->basement), &(message->body.peer.peer)))
99 add_to_list_tunnels (&(room->basement), &(message->body.peer.peer)); 83 add_to_list_tunnels (&(room->basement), &(message->body.peer.peer));
@@ -103,20 +87,15 @@ handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSEN
103} 87}
104 88
105void 89void
106handle_message_id (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, 90handle_message_id (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_MemberSession *session,
107 struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) 91 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
108{ 92{
109 struct GNUNET_MESSENGER_MemberInfo *info = get_room_member_info (room, &(message->header.sender_id)); 93 handle_session_switch (session, message, hash);
110
111 if (info)
112 add_to_list_messages (&(info->session_messages), hash);
113
114 switch_room_member_id (room, &(message->header.sender_id), &(message->body.id.id), hash);
115} 94}
116 95
117void 96void
118handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, 97handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_MemberSession *session,
119 struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) 98 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
120{ 99{
121 struct GNUNET_MESSENGER_ListTunnel *element = find_list_tunnels (&(room->basement), &(message->body.peer.peer), NULL); 100 struct GNUNET_MESSENGER_ListTunnel *element = find_list_tunnels (&(room->basement), &(message->body.peer.peer), NULL);
122 101
@@ -128,3 +107,16 @@ handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSEN
128 if (room->peer_message) 107 if (room->peer_message)
129 rebuild_room_basement_structure (room); 108 rebuild_room_basement_structure (room);
130} 109}
110
111void
112handle_message_delete (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_MemberSession *session,
113 const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
114{
115 struct GNUNET_TIME_Relative delay = GNUNET_TIME_relative_ntoh (message->body.delete.delay);
116 struct GNUNET_TIME_Absolute action = GNUNET_TIME_absolute_ntoh (message->header.timestamp);
117
118 action = GNUNET_TIME_absolute_add (action, delay);
119 delay = GNUNET_TIME_absolute_get_difference (GNUNET_TIME_absolute_get (), action);
120
121 delete_room_message (room, session, &(message->body.delete.hash), delay);
122}