diff options
Diffstat (limited to 'src/messenger/gnunet-service-messenger_message_send.c')
-rw-r--r-- | src/messenger/gnunet-service-messenger_message_send.c | 97 |
1 files changed, 96 insertions, 1 deletions
diff --git a/src/messenger/gnunet-service-messenger_message_send.c b/src/messenger/gnunet-service-messenger_message_send.c index 09039758b..40ff95cef 100644 --- a/src/messenger/gnunet-service-messenger_message_send.c +++ b/src/messenger/gnunet-service-messenger_message_send.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 |
@@ -26,9 +26,73 @@ | |||
26 | #include "platform.h" | 26 | #include "platform.h" |
27 | #include "gnunet-service-messenger_message_send.h" | 27 | #include "gnunet-service-messenger_message_send.h" |
28 | 28 | ||
29 | #include "gnunet-service-messenger_handle.h" | ||
29 | #include "gnunet-service-messenger_member.h" | 30 | #include "gnunet-service-messenger_member.h" |
30 | #include "gnunet-service-messenger_member_session.h" | 31 | #include "gnunet-service-messenger_member_session.h" |
31 | #include "gnunet-service-messenger_operation.h" | 32 | #include "gnunet-service-messenger_operation.h" |
33 | #include "gnunet-service-messenger_room.h" | ||
34 | |||
35 | struct GNUNET_MESSENGER_MemberNotify | ||
36 | { | ||
37 | struct GNUNET_MESSENGER_SrvRoom *room; | ||
38 | struct GNUNET_MESSENGER_SrvHandle *handle; | ||
39 | struct GNUNET_MESSENGER_MemberSession *session; | ||
40 | }; | ||
41 | |||
42 | static void | ||
43 | notify_about_members (struct GNUNET_MESSENGER_MemberNotify *notify, | ||
44 | struct GNUNET_MESSENGER_MemberSession *session, | ||
45 | struct GNUNET_CONTAINER_MultiHashMap *map, | ||
46 | int check_permission) | ||
47 | { | ||
48 | if (session->prev) | ||
49 | notify_about_members (notify, session->prev, map, GNUNET_YES); | ||
50 | |||
51 | struct GNUNET_MESSENGER_MessageStore *message_store = get_srv_room_message_store(notify->room); | ||
52 | struct GNUNET_MESSENGER_ListMessage *element; | ||
53 | |||
54 | for (element = session->messages.head; element; element = element->next) | ||
55 | { | ||
56 | if (GNUNET_YES == GNUNET_CONTAINER_multihashmap_contains(map, &(element->hash))) | ||
57 | continue; | ||
58 | |||
59 | if ((GNUNET_YES == check_permission) && | ||
60 | (GNUNET_YES != check_member_session_history(notify->session, &(element->hash), GNUNET_NO))) | ||
61 | continue; | ||
62 | |||
63 | if (GNUNET_OK != GNUNET_CONTAINER_multihashmap_put(map, &(element->hash), NULL, | ||
64 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST)) | ||
65 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "Notification of session message could be duplicated!\n"); | ||
66 | |||
67 | const struct GNUNET_MESSENGER_Message *message = get_store_message(message_store, &(element->hash)); | ||
68 | |||
69 | if ((!message) || (GNUNET_YES == is_peer_message (message))) | ||
70 | continue; | ||
71 | |||
72 | struct GNUNET_MESSENGER_SenderSession sender; | ||
73 | sender.member = session; | ||
74 | |||
75 | notify_srv_handle_message (notify->handle, notify->room, &sender, message, &(element->hash)); | ||
76 | } | ||
77 | } | ||
78 | |||
79 | static int | ||
80 | iterate_notify_about_members (void *cls, | ||
81 | const struct GNUNET_IDENTITY_PublicKey *public_key, | ||
82 | struct GNUNET_MESSENGER_MemberSession *session) | ||
83 | { | ||
84 | struct GNUNET_MESSENGER_MemberNotify *notify = cls; | ||
85 | |||
86 | if ((notify->session == session) || (GNUNET_YES == is_member_session_completed(session))) | ||
87 | return GNUNET_YES; | ||
88 | |||
89 | struct GNUNET_CONTAINER_MultiHashMap *map = GNUNET_CONTAINER_multihashmap_create(4, GNUNET_NO); | ||
90 | |||
91 | notify_about_members (notify, session, map, GNUNET_NO); | ||
92 | |||
93 | GNUNET_CONTAINER_multihashmap_destroy(map); | ||
94 | return GNUNET_YES; | ||
95 | } | ||
32 | 96 | ||
33 | void | 97 | void |
34 | send_message_join (struct GNUNET_MESSENGER_SrvRoom *room, | 98 | send_message_join (struct GNUNET_MESSENGER_SrvRoom *room, |
@@ -36,10 +100,41 @@ send_message_join (struct GNUNET_MESSENGER_SrvRoom *room, | |||
36 | const struct GNUNET_MESSENGER_Message *message, | 100 | const struct GNUNET_MESSENGER_Message *message, |
37 | const struct GNUNET_HashCode *hash) | 101 | const struct GNUNET_HashCode *hash) |
38 | { | 102 | { |
103 | set_srv_handle_key(handle, &(message->body.join.key)); | ||
104 | |||
105 | struct GNUNET_MESSENGER_MemberStore *member_store = get_srv_room_member_store(room); | ||
106 | struct GNUNET_MESSENGER_Member *member = add_store_member(member_store, &(message->header.sender_id)); | ||
107 | |||
108 | struct GNUNET_MESSENGER_MemberSession *session = get_member_session_of (member, message, hash); | ||
109 | |||
110 | if (!session) | ||
111 | { | ||
112 | GNUNET_log(GNUNET_ERROR_TYPE_WARNING, "A valid session is required to join a room!\n"); | ||
113 | goto skip_member_notification; | ||
114 | } | ||
115 | |||
116 | struct GNUNET_MESSENGER_MemberNotify notify; | ||
117 | |||
118 | notify.room = room; | ||
119 | notify.handle = handle; | ||
120 | notify.session = session; | ||
121 | |||
122 | iterate_store_members(get_srv_room_member_store(room), iterate_notify_about_members, ¬ify); | ||
123 | |||
124 | skip_member_notification: | ||
39 | check_srv_room_peer_status(room, NULL); | 125 | check_srv_room_peer_status(room, NULL); |
40 | } | 126 | } |
41 | 127 | ||
42 | void | 128 | void |
129 | send_message_key (struct GNUNET_MESSENGER_SrvRoom *room, | ||
130 | struct GNUNET_MESSENGER_SrvHandle *handle, | ||
131 | const struct GNUNET_MESSENGER_Message *message, | ||
132 | const struct GNUNET_HashCode *hash) | ||
133 | { | ||
134 | set_srv_handle_key(handle, &(message->body.key.key)); | ||
135 | } | ||
136 | |||
137 | void | ||
43 | send_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, | 138 | send_message_peer (struct GNUNET_MESSENGER_SrvRoom *room, |
44 | struct GNUNET_MESSENGER_SrvHandle *handle, | 139 | struct GNUNET_MESSENGER_SrvHandle *handle, |
45 | const struct GNUNET_MESSENGER_Message *message, | 140 | const struct GNUNET_MESSENGER_Message *message, |