diff options
author | TheJackiMonster <thejackimonster@gmail.com> | 2021-03-20 13:53:23 +0100 |
---|---|---|
committer | TheJackiMonster <thejackimonster@gmail.com> | 2021-04-04 17:58:11 +0200 |
commit | ac3aa3cc3a617bc54ed8beb2b5a30c0b95483525 (patch) | |
tree | 6e0444e568722f18501746665a07dfa3434c7ad6 /src/messenger/gnunet-service-messenger_message_recv.c | |
parent | 2413977f917534aa24ef562a28da193a2cdaa343 (diff) | |
download | gnunet-ac3aa3cc3a617bc54ed8beb2b5a30c0b95483525.tar.gz gnunet-ac3aa3cc3a617bc54ed8beb2b5a30c0b95483525.zip |
-multiple fixes and correction regarding messenger service
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-added message states to tunnels
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-fixed requests for deleted messages returning previous ones
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-added automatic solving of member id collissions
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-added light timestamp verification
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-fixed decoding asserts and member session forwarding
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-added permission check for member sessions during local join
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
Diffstat (limited to 'src/messenger/gnunet-service-messenger_message_recv.c')
-rw-r--r-- | src/messenger/gnunet-service-messenger_message_recv.c | 71 |
1 files changed, 54 insertions, 17 deletions
diff --git a/src/messenger/gnunet-service-messenger_message_recv.c b/src/messenger/gnunet-service-messenger_message_recv.c index 8aab805d2..b2a5052d2 100644 --- a/src/messenger/gnunet-service-messenger_message_recv.c +++ b/src/messenger/gnunet-service-messenger_message_recv.c | |||
@@ -27,18 +27,46 @@ | |||
27 | 27 | ||
28 | #include "gnunet-service-messenger_operation.h" | 28 | #include "gnunet-service-messenger_operation.h" |
29 | 29 | ||
30 | static void | ||
31 | forward_about_members (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, | ||
32 | struct GNUNET_MESSENGER_MemberSession *session, struct GNUNET_CONTAINER_MultiHashMap *map) | ||
33 | { | ||
34 | if (session->prev) | ||
35 | forward_about_members (room, tunnel, session->prev, map); | ||
36 | |||
37 | struct GNUNET_MESSENGER_MessageStore *message_store = get_room_message_store(room); | ||
38 | struct GNUNET_MESSENGER_ListMessage *element; | ||
39 | |||
40 | for (element = session->messages.head; element; element = element->next) | ||
41 | { | ||
42 | if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(map, &(element->hash))) | ||
43 | continue; | ||
44 | |||
45 | if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(map, &(element->hash), NULL, | ||
46 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) | ||
47 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Forwarding of session message could be duplicated!\n"); | ||
48 | |||
49 | const struct GNUNET_MESSENGER_Message *message = get_store_message(message_store, &(element->hash)); | ||
50 | |||
51 | if (message) | ||
52 | forward_tunnel_message(tunnel, message, &(element->hash)); | ||
53 | } | ||
54 | } | ||
55 | |||
30 | static int | 56 | static int |
31 | iterate_forward_members (void *cls, const struct GNUNET_IDENTITY_PublicKey *public_key, | 57 | iterate_forward_members (void *cls, const struct GNUNET_IDENTITY_PublicKey *public_key, |
32 | struct GNUNET_MESSENGER_MemberSession *session) | 58 | struct GNUNET_MESSENGER_MemberSession *session) |
33 | { | 59 | { |
34 | struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls; | 60 | struct GNUNET_MESSENGER_SrvTunnel *tunnel = cls; |
35 | struct GNUNET_MESSENGER_SrvRoom *room = tunnel->room; | ||
36 | 61 | ||
37 | struct GNUNET_MESSENGER_ListMessage *element; | 62 | if (GNUNET_YES == is_member_session_completed(session)) |
63 | return GNUNET_YES; | ||
38 | 64 | ||
39 | for (element = session->messages.head; element; element = element->next) | 65 | struct GNUNET_CONTAINER_MultiHashMap *map = GNUNET_CONTAINER_multihashmap_create(4, GNUNET_NO); |
40 | forward_tunnel_message(tunnel, get_room_message(room, NULL, &(element->hash), GNUNET_NO), &(element->hash)); | ||
41 | 66 | ||
67 | forward_about_members (tunnel->room, tunnel, session, map); | ||
68 | |||
69 | GNUNET_CONTAINER_multihashmap_destroy(map); | ||
42 | return GNUNET_YES; | 70 | return GNUNET_YES; |
43 | } | 71 | } |
44 | 72 | ||
@@ -97,32 +125,40 @@ recv_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGE | |||
97 | return GNUNET_YES; | 125 | return GNUNET_YES; |
98 | } | 126 | } |
99 | 127 | ||
100 | int | 128 | static void |
101 | recv_message_request (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, | 129 | callback_found_message (void *cls, struct GNUNET_MESSENGER_SrvRoom *room, |
102 | const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) | 130 | const struct GNUNET_MESSENGER_Message *message, |
131 | const struct GNUNET_HashCode *hash) | ||
103 | { | 132 | { |
104 | const struct GNUNET_MESSENGER_Message *msg = get_room_message ( | 133 | struct GNUNET_MESSENGER_SrvTunnel *tunnel = tunnel; |
105 | room, NULL, &(message->body.request.hash), GNUNET_NO | ||
106 | ); | ||
107 | 134 | ||
108 | if (!msg) | 135 | if (!message) |
109 | { | 136 | { |
110 | struct GNUNET_MESSENGER_OperationStore *operation_store = get_room_operation_store(room); | 137 | struct GNUNET_MESSENGER_OperationStore *operation_store = get_room_operation_store(room); |
111 | 138 | ||
112 | use_store_operation( | 139 | use_store_operation( |
113 | operation_store, | 140 | operation_store, |
114 | &(message->body.request.hash), | 141 | hash, |
115 | GNUNET_MESSENGER_OP_REQUEST, | 142 | GNUNET_MESSENGER_OP_REQUEST, |
116 | GNUNET_MESSENGER_REQUEST_DELAY | 143 | GNUNET_MESSENGER_REQUEST_DELAY |
117 | ); | 144 | ); |
118 | |||
119 | return GNUNET_YES; | ||
120 | } | 145 | } |
146 | else | ||
147 | forward_tunnel_message (tunnel, message, hash); | ||
148 | } | ||
121 | 149 | ||
150 | /* | ||
151 | * Function returns GNUNET_NO to drop forwarding the request. | ||
152 | * It will only be forwarded if it can't be answered! | ||
153 | */ | ||
154 | int | ||
155 | recv_message_request (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvTunnel *tunnel, | ||
156 | const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash) | ||
157 | { | ||
122 | struct GNUNET_MESSENGER_MemberStore *member_store = get_room_member_store(room); | 158 | struct GNUNET_MESSENGER_MemberStore *member_store = get_room_member_store(room); |
123 | struct GNUNET_MESSENGER_Member *member = get_store_member_of(member_store, message); | 159 | struct GNUNET_MESSENGER_Member *member = get_store_member_of(member_store, message); |
124 | 160 | ||
125 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Callback for message (%s)\n", GNUNET_h2s (hash)); | 161 | GNUNET_log(GNUNET_ERROR_TYPE_DEBUG, "Request for message (%s)\n", GNUNET_h2s (hash)); |
126 | 162 | ||
127 | if (!member) | 163 | if (!member) |
128 | return GNUNET_NO; | 164 | return GNUNET_NO; |
@@ -132,7 +168,8 @@ recv_message_request (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSE | |||
132 | if ((!session) || (GNUNET_YES != check_member_session_history(session, hash, GNUNET_NO))) | 168 | if ((!session) || (GNUNET_YES != check_member_session_history(session, hash, GNUNET_NO))) |
133 | return GNUNET_NO; | 169 | return GNUNET_NO; |
134 | 170 | ||
135 | forward_tunnel_message (tunnel, msg, &(message->body.request.hash)); | 171 | if (GNUNET_NO == request_room_message(room, &(message->body.request.hash), session, callback_found_message, tunnel)) |
172 | return GNUNET_YES; | ||
136 | 173 | ||
137 | return GNUNET_NO; | 174 | return GNUNET_NO; |
138 | } | 175 | } |