aboutsummaryrefslogtreecommitdiff
path: root/src/service/messenger/gnunet-service-messenger_member_session.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/service/messenger/gnunet-service-messenger_member_session.h')
-rw-r--r--src/service/messenger/gnunet-service-messenger_member_session.h297
1 files changed, 297 insertions, 0 deletions
diff --git a/src/service/messenger/gnunet-service-messenger_member_session.h b/src/service/messenger/gnunet-service-messenger_member_session.h
new file mode 100644
index 000000000..a039cc781
--- /dev/null
+++ b/src/service/messenger/gnunet-service-messenger_member_session.h
@@ -0,0 +1,297 @@
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2021, 2023 GNUnet e.V.
4
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
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
9
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
20/**
21 * @author Tobias Frisch
22 * @file src/messenger/gnunet-service-messenger_member_session.h
23 * @brief GNUnet MESSENGER service
24 */
25
26#ifndef GNUNET_SERVICE_MESSENGER_MEMBER_SESSION_H
27#define GNUNET_SERVICE_MESSENGER_MEMBER_SESSION_H
28
29#include "platform.h"
30#include "gnunet_util_lib.h"
31#include "gnunet_identity_service.h"
32#include "gnunet_time_lib.h"
33
34#include "gnunet-service-messenger_member.h"
35
36#include "messenger_api_contact.h"
37
38struct GNUNET_MESSENGER_MemberSession
39{
40 struct GNUNET_MESSENGER_Member *member;
41
42 struct GNUNET_CRYPTO_PublicKey public_key;
43 struct GNUNET_HashCode context;
44
45 struct GNUNET_MESSENGER_Contact *contact;
46
47 struct GNUNET_CONTAINER_MultiHashMap *history;
48 struct GNUNET_MESSENGER_ListMessages messages;
49
50 struct GNUNET_MESSENGER_MemberSession *prev;
51 struct GNUNET_MESSENGER_MemberSession *next;
52
53 struct GNUNET_TIME_Absolute start;
54
55 int closed;
56 int completed;
57};
58
59/**
60 * Creates and allocates a new member session of a <i>member</i> with a given
61 * public key.
62 *
63 * If the creation fails, NULL gets returned.
64 *
65 * @param[in,out] member Member
66 * @param[in] pubkey Public key of EGO
67 * @return New member session
68 */
69struct GNUNET_MESSENGER_MemberSession*
70create_member_session (struct GNUNET_MESSENGER_Member *member,
71 const struct GNUNET_CRYPTO_PublicKey *pubkey);
72
73/**
74 * Creates and allocates a new member session closing and replacing a given
75 * other <i>session</i> of the same member. The new session could have significant
76 * changes to the members public key or its member id depending on the used
77 * <i>message</i> to switch session. The new session will be linked to the old
78 * one.
79 *
80 * @param[in,out] session Old member session
81 * @param[in] message Message
82 * @param[in] hash Hash of message
83 * @return New member session
84 */
85struct GNUNET_MESSENGER_MemberSession*
86switch_member_session (struct GNUNET_MESSENGER_MemberSession *session,
87 const struct GNUNET_MESSENGER_Message *message,
88 const struct GNUNET_HashCode *hash);
89
90/**
91 * Destroys a member session and frees its memory fully.
92 *
93 * @param[in,out] session Member session
94 */
95void
96destroy_member_session (struct GNUNET_MESSENGER_MemberSession *session);
97
98/**
99 * Resets a given member <i>session</i> which re-opens a member
100 * session for new usage. Every connection to other sessions will be
101 * be dropped. The member sessions messages will be cleared but old
102 * history from uncompleted sessions however can be reused!
103 *
104 * @param[in,out] session Member session
105 * @param[in] hash Hash of initial message (JOIN message!)
106 * @return #GNUNET_OK on success, #GNUNET_SYSERR otherwise
107 */
108int
109reset_member_session (struct GNUNET_MESSENGER_MemberSession *session,
110 const struct GNUNET_HashCode *hash);
111
112/**
113 * Closes a given member <i>session</i> which opens the request
114 * for completion of the given member session.
115 *
116 * Closing a session may complete a session and can't be used without
117 * a reset! ( @see #reset_member_session() )
118 *
119 * @param[in,out] session Member session
120 */
121void
122close_member_session (struct GNUNET_MESSENGER_MemberSession *session);
123
124/**
125 * Returns if the given member <i>session</i> has been closed.
126 *
127 * @param[in] session Member session
128 * @return #GNUNET_YES or #GNUNET_NO
129 */
130int
131is_member_session_closed (const struct GNUNET_MESSENGER_MemberSession *session);
132
133/**
134 * Returns if the given member <i>session</i> has been completed.
135 *
136 * A completed member session can't verify any message as its own and
137 * it won't add any message to its history.
138 *
139 * @param[in] session Member session
140 * @return #GNUNET_YES or #GNUNET_NO
141 */
142int
143is_member_session_completed (const struct
144 GNUNET_MESSENGER_MemberSession *session);
145
146/**
147 * Returns the timestamp of the member <i>session</i>'s start.
148 *
149 * @param[in] session Member session
150 * @return Absolute timestamp
151 */
152struct GNUNET_TIME_Absolute
153get_member_session_start (const struct GNUNET_MESSENGER_MemberSession *session);
154
155/**
156 * Returns the key of the room a given member <i>session</i> belongs to.
157 *
158 * @param[in] session Member session
159 * @return Key of room
160 */
161const struct GNUNET_HashCode*
162get_member_session_key (const struct GNUNET_MESSENGER_MemberSession *session);
163
164/**
165 * Returns the member id of a given member <i>session</i>.
166 *
167 * @param[in] session Member session
168 * @return Member id
169 */
170const struct GNUNET_ShortHashCode*
171get_member_session_id (const struct GNUNET_MESSENGER_MemberSession *session);
172
173/**
174 * Returns the public key from an EGO of a given member <i>session</i>.
175 *
176 * @param[in] session Member session
177 * @return Public key of EGO
178 */
179const struct GNUNET_CRYPTO_PublicKey*
180get_member_session_public_key (const struct
181 GNUNET_MESSENGER_MemberSession *session);
182
183/**
184 * Returns the member context of a given member <i>session</i>.
185 *
186 * @param[in] session Member session
187 * @return Member context as hash
188 */
189const struct GNUNET_HashCode*
190get_member_session_context (const struct
191 GNUNET_MESSENGER_MemberSession *session);
192
193/**
194 * Returns the contact which is connected to a given member <i>session</i>.
195 *
196 * @param[in] session Member session
197 * @return Contact
198 */
199struct GNUNET_MESSENGER_Contact*
200get_member_session_contact (struct GNUNET_MESSENGER_MemberSession *session);
201
202/**
203 * Verifies a given member <i>session</i> as sender of a selected <i>message</i> and
204 * its <i>hash</i>. The function returns #GNUNET_OK if the message session is verified
205 * as sender, otherwise #GNUNET_SYSERR.
206 *
207 * @see #is_member_session_completed() for verification.
208 *
209 * @param[in] session Member session
210 * @param[in] message Message
211 * @param[in] hash Hash of message
212 * @return #GNUNET_OK on success, otherwise #GNUNET_SYSERR
213 */
214int
215verify_member_session_as_sender (const struct
216 GNUNET_MESSENGER_MemberSession *session,
217 const struct GNUNET_MESSENGER_Message *message,
218 const struct GNUNET_HashCode *hash);
219
220/**
221 * Checks the history of a <i>session</i> for a specific message which is identified
222 * by its <i>hash</i> and if the <i>ownership</i> flag is set, if the message is
223 * owned by the sessions contact.
224 *
225 * @param[in] session Member session
226 * @param[in] hash Hash of message
227 * @param[in] ownership Ownership flag
228 * @return #GNUNET_YES if found, otherwise #GNUNET_NO
229 */
230int
231check_member_session_history (const struct
232 GNUNET_MESSENGER_MemberSession *session,
233 const struct GNUNET_HashCode *hash,
234 int ownership);
235
236/**
237 * Adds a given <i>message</i> to the history of a <i>session</i> using the messages
238 * <i>hash</i>. The ownership will be set automatically.
239 *
240 * @see #is_member_session_completed() for updating a history.
241 *
242 * @param[in,out] session Member session
243 * @param[in] message Message
244 * @param[in] hash Hash of message
245 */
246void
247update_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
248 const struct GNUNET_MESSENGER_Message *message,
249 const struct GNUNET_HashCode *hash);
250
251/**
252 * Removes a message from the history of a <i>session</i> using the messages
253 * <i>hash</i>.
254 *
255 * @param[in,out] session Member session
256 * @param[in] hash Hash of message
257 */
258void
259clear_member_session_history (struct GNUNET_MESSENGER_MemberSession *session,
260 const struct GNUNET_HashCode *hash);
261
262/**
263 * Loads data from a <i>directory</i> into a new allocated and created member
264 * session of a <i>member</i> if the required information can be read from the
265 * content of the given directory.
266 *
267 * @param[out] member Member
268 * @param[in] directory Path to a directory
269 */
270void
271load_member_session (struct GNUNET_MESSENGER_Member *member,
272 const char *directory);
273
274/**
275 * Loads the connection from one <i>session</i> to another through the
276 * next attribute. Necessary information will be loaded from a configuration
277 * file inside of a given <i>directory</i>.
278 *
279 * @param[in,out] session Member session
280 * @param[in] directory Path to a directory
281 */
282void
283load_member_session_next (struct GNUNET_MESSENGER_MemberSession *session,
284 const char *directory);
285
286/**
287 * Saves data from a member <i>session</i> into a <i>directory</i> which can be
288 * load to restore the member session completely.
289 *
290 * @param[in] session Member session
291 * @param[in] directory Path to a directory
292 */
293void
294save_member_session (struct GNUNET_MESSENGER_MemberSession *session,
295 const char *directory);
296
297#endif //GNUNET_SERVICE_MESSENGER_MEMBER_SESSION_H