diff options
Diffstat (limited to 'src/service/messenger/gnunet-service-messenger_message_handle.c')
-rw-r--r-- | src/service/messenger/gnunet-service-messenger_message_handle.c | 115 |
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 | ||
29 | static void | 29 | static void |
30 | handle_session_switch (struct GNUNET_MESSENGER_MemberSession *session, | 30 | handle_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 | |||
40 | void | 43 | void |
41 | handle_message_join (struct GNUNET_MESSENGER_SrvRoom *room, | 44 | handle_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 | |||
60 | void | 65 | void |
61 | handle_message_leave (struct GNUNET_MESSENGER_SrvRoom *room, | 66 | handle_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 | |||
72 | void | 79 | void |
73 | handle_message_name (struct GNUNET_MESSENGER_SrvRoom *room, | 80 | handle_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 | |||
86 | void | 95 | void |
87 | handle_message_key (struct GNUNET_MESSENGER_SrvRoom *room, | 96 | handle_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 | |||
95 | void | 105 | void |
96 | handle_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, | 106 | handle_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 | |||
108 | void | 125 | void |
109 | handle_message_id (struct GNUNET_MESSENGER_SrvRoom *room, | 126 | handle_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 | |||
124 | void | 142 | void |
125 | handle_message_miss (struct GNUNET_MESSENGER_SrvRoom *room, | 143 | handle_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 | |||
141 | void | 166 | void |
142 | handle_message_delete (struct GNUNET_MESSENGER_SrvRoom *room, | 167 | handle_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 | } |