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