aboutsummaryrefslogtreecommitdiff
path: root/src/service/messenger/gnunet-service-messenger_message_handle.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/service/messenger/gnunet-service-messenger_message_handle.c')
-rw-r--r--src/service/messenger/gnunet-service-messenger_message_handle.c115
1 files changed, 72 insertions, 43 deletions
diff --git a/src/service/messenger/gnunet-service-messenger_message_handle.c b/src/service/messenger/gnunet-service-messenger_message_handle.c
index 06b987657..77466b599 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 @@
1/* 1/*
2 This file is part of GNUnet. 2 This file is part of GNUnet.
3 Copyright (C) 2020--2022 GNUnet e.V. 3 Copyright (C) 2020--2023 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
@@ -27,109 +27,133 @@
27#include "gnunet-service-messenger_message_handle.h" 27#include "gnunet-service-messenger_message_handle.h"
28 28
29static void 29static void
30handle_session_switch (struct GNUNET_MESSENGER_MemberSession *session, 30handle_member_session_switch (struct GNUNET_MESSENGER_MemberSession *session,
31 const struct GNUNET_MESSENGER_Message *message, 31 const struct GNUNET_MESSENGER_Message *message,
32 const struct GNUNET_HashCode *hash) 32 const struct GNUNET_HashCode *hash)
33{ 33{
34 struct GNUNET_MESSENGER_MemberSession *next = switch_member_session(session, message, hash); 34 struct GNUNET_MESSENGER_MemberSession *next = switch_member_session (session,
35 message,
36 hash);
35 37
36 if (next != session) 38 if (next != session)
37 add_member_session(next->member, next); 39 add_member_session (next->member, next);
38} 40}
39 41
42
40void 43void
41handle_message_join (struct GNUNET_MESSENGER_SrvRoom *room, 44handle_message_join (struct GNUNET_MESSENGER_SrvRoom *room,
42 struct GNUNET_MESSENGER_MemberSession *session, 45 struct GNUNET_MESSENGER_SenderSession *session,
43 const struct GNUNET_MESSENGER_Message *message, 46 const struct GNUNET_MESSENGER_Message *message,
44 const struct GNUNET_HashCode *hash) 47 const struct GNUNET_HashCode *hash)
45{ 48{
46 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Member (%s) joins room (%s).\n", 49 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Member (%s) joins room (%s).\n",
47 GNUNET_sh2s (&(message->header.sender_id)), GNUNET_h2s(get_srv_room_key(room))); 50 GNUNET_sh2s (&(message->header.sender_id)), GNUNET_h2s (
51 get_srv_room_key (room)));
48 52
49 if (GNUNET_OK != reset_member_session(session, hash)) 53 if (GNUNET_OK != reset_member_session (session->member, hash))
50 GNUNET_log(GNUNET_ERROR_TYPE_ERROR, "Resetting member session failed!\n"); 54 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Resetting member session failed!\n");
51 55
52 solve_srv_room_member_collisions ( 56 solve_srv_room_member_collisions (
53 room, 57 room,
54 &(message->body.join.key), 58 &(message->body.join.key),
55 &(message->header.sender_id), 59 &(message->header.sender_id),
56 GNUNET_TIME_absolute_ntoh(message->header.timestamp) 60 GNUNET_TIME_absolute_ntoh (message->header.timestamp)
57 ); 61 );
58} 62}
59 63
64
60void 65void
61handle_message_leave (struct GNUNET_MESSENGER_SrvRoom *room, 66handle_message_leave (struct GNUNET_MESSENGER_SrvRoom *room,
62 struct GNUNET_MESSENGER_MemberSession *session, 67 struct GNUNET_MESSENGER_SenderSession *session,
63 const struct GNUNET_MESSENGER_Message *message, 68 const struct GNUNET_MESSENGER_Message *message,
64 const struct GNUNET_HashCode *hash) 69 const struct GNUNET_HashCode *hash)
65{ 70{
66 GNUNET_log(GNUNET_ERROR_TYPE_INFO, "Member (%s) leaves room (%s).\n", 71 GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Member (%s) leaves room (%s).\n",
67 GNUNET_sh2s (&(message->header.sender_id)), GNUNET_h2s(get_srv_room_key(room))); 72 GNUNET_sh2s (&(message->header.sender_id)), GNUNET_h2s (
73 get_srv_room_key (room)));
68 74
69 close_member_session(session); 75 close_member_session (session->member);
70} 76}
71 77
78
72void 79void
73handle_message_name (struct GNUNET_MESSENGER_SrvRoom *room, 80handle_message_name (struct GNUNET_MESSENGER_SrvRoom *room,
74 struct GNUNET_MESSENGER_MemberSession *session, 81 struct GNUNET_MESSENGER_SenderSession *session,
75 const struct GNUNET_MESSENGER_Message *message, 82 const struct GNUNET_MESSENGER_Message *message,
76 const struct GNUNET_HashCode *hash) 83 const struct GNUNET_HashCode *hash)
77{ 84{
78 struct GNUNET_MESSENGER_Contact *contact = get_member_session_contact(session); 85 struct GNUNET_MESSENGER_Contact *contact = get_member_session_contact (
86 session->member);
79 87
80 if (!contact) 88 if (! contact)
81 return; 89 return;
82 90
83 set_contact_name (contact, message->body.name.name); 91 set_contact_name (contact, message->body.name.name);
84} 92}
85 93
94
86void 95void
87handle_message_key (struct GNUNET_MESSENGER_SrvRoom *room, 96handle_message_key (struct GNUNET_MESSENGER_SrvRoom *room,
88 struct GNUNET_MESSENGER_MemberSession *session, 97 struct GNUNET_MESSENGER_SenderSession *session,
89 const struct GNUNET_MESSENGER_Message *message, 98 const struct GNUNET_MESSENGER_Message *message,
90 const struct GNUNET_HashCode *hash) 99 const struct GNUNET_HashCode *hash)
91{ 100{
92 handle_session_switch (session, message, hash); 101 handle_member_session_switch (session->member, message, hash);
93} 102}
94 103
104
95void 105void
96handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, 106handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room,
97 struct GNUNET_MESSENGER_MemberSession *session, 107 struct GNUNET_MESSENGER_SenderSession *session,
98 const struct GNUNET_MESSENGER_Message *message, 108 const struct GNUNET_MESSENGER_Message *message,
99 const struct GNUNET_HashCode *hash) 109 const struct GNUNET_HashCode *hash)
100{ 110{
101 if (GNUNET_NO == contains_list_tunnels (&(room->basement), &(message->body.peer.peer))) 111 struct GNUNET_MESSENGER_PeerStore *store = get_srv_room_peer_store (room);
102 add_to_list_tunnels (&(room->basement), &(message->body.peer.peer)); 112
113 if (0 == GNUNET_memcmp (session->peer, &(message->body.peer.peer)))
114 update_store_peer (store, &(message->body.peer.peer));
115
116 if (GNUNET_NO == contains_list_tunnels (&(room->basement),
117 &(message->body.peer.peer)))
118 add_to_list_tunnels (&(room->basement), &(message->body.peer.peer), hash);
103 119
104 if (room->peer_message) 120 if (room->peer_message)
105 rebuild_srv_room_basement_structure (room); 121 rebuild_srv_room_basement_structure (room);
106} 122}
107 123
124
108void 125void
109handle_message_id (struct GNUNET_MESSENGER_SrvRoom *room, 126handle_message_id (struct GNUNET_MESSENGER_SrvRoom *room,
110 struct GNUNET_MESSENGER_MemberSession *session, 127 struct GNUNET_MESSENGER_SenderSession *session,
111 const struct GNUNET_MESSENGER_Message *message, 128 const struct GNUNET_MESSENGER_Message *message,
112 const struct GNUNET_HashCode *hash) 129 const struct GNUNET_HashCode *hash)
113{ 130{
114 handle_session_switch (session, message, hash); 131 handle_member_session_switch (session->member, message, hash);
115 132
116 solve_srv_room_member_collisions ( 133 solve_srv_room_member_collisions (
117 room, 134 room,
118 get_member_session_public_key(session), 135 get_member_session_public_key (session->member),
119 &(message->body.id.id), 136 &(message->body.id.id),
120 GNUNET_TIME_absolute_ntoh(message->header.timestamp) 137 GNUNET_TIME_absolute_ntoh (message->header.timestamp)
121 ); 138 );
122} 139}
123 140
141
124void 142void
125handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, 143handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room,
126 struct GNUNET_MESSENGER_MemberSession *session, 144 struct GNUNET_MESSENGER_SenderSession *session,
127 const struct GNUNET_MESSENGER_Message *message, 145 const struct GNUNET_MESSENGER_Message *message,
128 const struct GNUNET_HashCode *hash) 146 const struct GNUNET_HashCode *hash)
129{ 147{
130 struct GNUNET_MESSENGER_ListTunnel *element = find_list_tunnels (&(room->basement), &(message->body.peer.peer), NULL); 148 struct GNUNET_MESSENGER_PeerStore *store = get_srv_room_peer_store (room);
131 149
132 if (!element) 150 if (0 == GNUNET_memcmp (session->peer, &(message->body.miss.peer)))
151 remove_store_peer (store, &(message->body.miss.peer));
152
153 struct GNUNET_MESSENGER_ListTunnel *element = find_list_tunnels (
154 &(room->basement), &(message->body.miss.peer), NULL);
155
156 if (! element)
133 return; 157 return;
134 158
135 remove_from_list_tunnels (&(room->basement), element); 159 remove_from_list_tunnels (&(room->basement), element);
@@ -138,17 +162,22 @@ handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room,
138 rebuild_srv_room_basement_structure (room); 162 rebuild_srv_room_basement_structure (room);
139} 163}
140 164
165
141void 166void
142handle_message_delete (struct GNUNET_MESSENGER_SrvRoom *room, 167handle_message_delete (struct GNUNET_MESSENGER_SrvRoom *room,
143 struct GNUNET_MESSENGER_MemberSession *session, 168 struct GNUNET_MESSENGER_SenderSession *session,
144 const struct GNUNET_MESSENGER_Message *message, 169 const struct GNUNET_MESSENGER_Message *message,
145 const struct GNUNET_HashCode *hash) 170 const struct GNUNET_HashCode *hash)
146{ 171{
147 struct GNUNET_TIME_Relative delay = GNUNET_TIME_relative_ntoh (message->body.deletion.delay); 172 struct GNUNET_TIME_Relative delay = GNUNET_TIME_relative_ntoh (
148 struct GNUNET_TIME_Absolute action = GNUNET_TIME_absolute_ntoh (message->header.timestamp); 173 message->body.deletion.delay);
174 struct GNUNET_TIME_Absolute action = GNUNET_TIME_absolute_ntoh (
175 message->header.timestamp);
149 176
150 action = GNUNET_TIME_absolute_add (action, delay); 177 action = GNUNET_TIME_absolute_add (action, delay);
151 delay = GNUNET_TIME_absolute_get_difference (GNUNET_TIME_absolute_get (), action); 178 delay = GNUNET_TIME_absolute_get_difference (GNUNET_TIME_absolute_get (),
179 action);
152 180
153 delete_srv_room_message (room, session, &(message->body.deletion.hash), delay); 181 delete_srv_room_message (room, session->member,
182 &(message->body.deletion.hash), delay);
154} 183}