GNUnet 0.29.1-7-g14698f198
 
Loading...
Searching...
No Matches
gnunet-service-messenger_member_session.c File Reference
Include dependency graph for gnunet-service-messenger_member_session.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_MESSENGER_SrvMemberSessionHistoryEntry
 

Functions

struct GNUNET_MESSENGER_SrvMemberSession * create_member_session (struct GNUNET_MESSENGER_Member *member, const struct GNUNET_CRYPTO_BlindablePublicKey *pubkey)
 Creates and allocates a new member session of a member with a given public key.
 
static struct GNUNET_MESSENGER_MemberStore * get_session_member_store (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 
static struct GNUNET_MESSENGER_SrvRoom * get_session_room (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 
static void check_member_session_completion (struct GNUNET_MESSENGER_SrvMemberSession *session)
 
static enum GNUNET_GenericReturnValue iterate_copy_history (void *cls, const struct GNUNET_HashCode *key, void *value)
 
struct GNUNET_MESSENGER_SrvMemberSession * switch_member_session (struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 Creates and allocates a new member session closing and replacing a given other session of the same member.
 
void destroy_member_session (struct GNUNET_MESSENGER_SrvMemberSession *session)
 Destroys a member session and frees its memory fully.
 
enum GNUNET_GenericReturnValue reset_member_session (struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash)
 Resets a given member session which re-opens a member session for new usage.
 
void close_member_session (struct GNUNET_MESSENGER_SrvMemberSession *session)
 Closes a given member session which opens the request for completion of the given member session.
 
enum GNUNET_GenericReturnValue is_member_session_closed (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns if the given member session has been closed.
 
enum GNUNET_GenericReturnValue is_member_session_completed (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns if the given member session has been completed.
 
struct GNUNET_TIME_Absolute get_member_session_start (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the timestamp of the member session's start.
 
const struct GNUNET_HashCode * get_member_session_key (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the key of the room a given member session belongs to.
 
const struct GNUNET_ShortHashCode * get_member_session_id (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the member id of a given member session.
 
const struct GNUNET_CRYPTO_BlindablePublicKey * get_member_session_public_key (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the public key of a given member session.
 
const struct GNUNET_HashCode * get_member_session_context (const struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the member context of a given member session.
 
struct GNUNET_MESSENGER_Contact * get_member_session_contact (struct GNUNET_MESSENGER_SrvMemberSession *session)
 Returns the contact which is connected to a given member session.
 
enum GNUNET_GenericReturnValue verify_member_session_as_sender (const struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 Verifies a given member session as sender of a selected message and its hash.
 
enum GNUNET_GenericReturnValue check_member_session_history (const struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash, enum GNUNET_GenericReturnValue ownership)
 Checks the history of a session for a specific message which is identified by its hash and if the ownership flag is set, if the message is owned by the sessions contact.
 
static void update_member_chain_history (struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash, enum GNUNET_GenericReturnValue ownership)
 
void update_member_session_history (struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 Adds a given message to the history of a session using the messages hash.
 
static void clear_member_chain_history (struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash)
 
void clear_member_session_history (struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash)
 Removes a message from the history of a session using the messages hash.
 
static void load_member_session_history (struct GNUNET_MESSENGER_SrvMemberSession *session, const char *path)
 
void load_member_session (struct GNUNET_MESSENGER_Member *member, const char *directory)
 Loads data from a directory into a new allocated and created member session of a member if the required information can be read from the content of the given directory.
 
static struct GNUNET_MESSENGER_SrvMemberSession * get_cycle_safe_next_session (struct GNUNET_MESSENGER_SrvMemberSession *session, struct GNUNET_MESSENGER_SrvMemberSession *next)
 
void load_member_session_next (struct GNUNET_MESSENGER_SrvMemberSession *session, const char *directory)
 Loads the connection from one session to another through the next attribute.
 
static enum GNUNET_GenericReturnValue iterate_save_member_session_history_hentries (void *cls, const struct GNUNET_HashCode *key, void *value)
 
static void save_member_session_history (struct GNUNET_MESSENGER_SrvMemberSession *session, const char *path)
 
void save_member_session (struct GNUNET_MESSENGER_SrvMemberSession *session, const char *directory)
 Saves data from a member session into a directory which can be load to restore the member session completely.
 

Function Documentation

◆ create_member_session()

struct GNUNET_MESSENGER_SrvMemberSession * create_member_session ( struct GNUNET_MESSENGER_Member *  member,
const struct GNUNET_CRYPTO_BlindablePublicKey *  pubkey 
)

Creates and allocates a new member session of a member with a given public key.

If the creation fails, NULL gets returned.

Parameters
[in,out]memberMember
[in]pubkeyPublic key
Returns
New member session

Definition at line 35 of file gnunet-service-messenger_member_session.c.

37{
39
40 if ((! member) || (! pubkey) || (! (member->store)))
41 return NULL;
42
43 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Create new member session!\n");
44
46 session->member = member;
47
48 GNUNET_memcpy (&(session->public_key), pubkey, sizeof(session->public_key));
49
51 get_member_session_key (session),
52 get_member_session_id (session),
53 &(session->context));
54
55 {
57
58 store = get_member_contact_store (member->store);
59
60 session->contact = get_store_contact (
61 store,
64 }
65
66 if (! (session->contact))
67 {
68 GNUNET_free (session);
69 return NULL;
70 }
71
73
75
76 init_list_messages (&(session->messages));
77
78 session->prev = NULL;
79 session->next = NULL;
80
81 session->start = GNUNET_TIME_absolute_get ();
82
83 session->closed = GNUNET_NO;
84 session->completed = GNUNET_NO;
85
86 return session;
87}
static struct GNUNET_CRYPTO_BlindablePublicKey pubkey
Public key of the zone to look in.
void init_list_messages(struct GNUNET_MESSENGER_ListMessages *messages)
Initializes list of message hashes as empty list.
const struct GNUNET_ShortHashCode * get_member_session_id(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the member id of a given member session.
const struct GNUNET_CRYPTO_BlindablePublicKey * get_member_session_public_key(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the public key of a given member session.
const struct GNUNET_HashCode * get_member_session_context(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the member context of a given member session.
const struct GNUNET_HashCode * get_member_session_key(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the key of the room a given member session belongs to.
struct GNUNET_MESSENGER_ContactStore * get_member_contact_store(struct GNUNET_MESSENGER_MemberStore *store)
Returns the used contact store of a given member store.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
#define GNUNET_log(kind,...)
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
@ GNUNET_NO
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition time.c:111
void increase_contact_rc(struct GNUNET_MESSENGER_Contact *contact)
Increases the reference counter of a given contact which is zero as default.
void get_context_from_member(const struct GNUNET_HashCode *key, const struct GNUNET_ShortHashCode *id, struct GNUNET_HashCode *context)
Calculates the context hash of a member in a room and returns it.
struct GNUNET_MESSENGER_Contact * get_store_contact(struct GNUNET_MESSENGER_ContactStore *store, const struct GNUNET_HashCode *context, const struct GNUNET_CRYPTO_BlindablePublicKey *pubkey)
Returns a contact using a specific public key.
struct GNUNET_MESSENGER_MemberStore * store
struct GNUNET_MESSENGER_SrvMemberSession * next
struct GNUNET_MESSENGER_SrvMemberSession * prev
struct GNUNET_CRYPTO_BlindablePublicKey public_key

References GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_MESSENGER_SrvMemberSession::completed, GNUNET_MESSENGER_SrvMemberSession::contact, GNUNET_MESSENGER_SrvMemberSession::context, get_context_from_member(), get_member_contact_store(), get_member_session_context(), get_member_session_id(), get_member_session_key(), get_member_session_public_key(), get_store_contact(), GNUNET_CONTAINER_multihashmap_create(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_memcpy, GNUNET_new, GNUNET_NO, GNUNET_TIME_absolute_get(), GNUNET_MESSENGER_SrvMemberSession::history, increase_contact_rc(), init_list_messages(), GNUNET_MESSENGER_SrvMemberSession::member, GNUNET_MESSENGER_SrvMemberSession::messages, GNUNET_MESSENGER_SrvMemberSession::next, GNUNET_MESSENGER_SrvMemberSession::prev, pubkey, GNUNET_MESSENGER_SrvMemberSession::public_key, GNUNET_MESSENGER_SrvMemberSession::start, and GNUNET_MESSENGER_Member::store.

Referenced by load_member_session(), and try_member_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_session_member_store()

static struct GNUNET_MESSENGER_MemberStore * get_session_member_store ( const struct GNUNET_MESSENGER_SrvMemberSession *  session)
static

Definition at line 91 of file gnunet-service-messenger_member_session.c.

93{
94 struct GNUNET_MESSENGER_Member *member;
95
96 GNUNET_assert (session);
97
98 member = session->member;
99
100 GNUNET_assert (member);
101
102 return member->store;
103}
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.

References GNUNET_assert, GNUNET_MESSENGER_SrvMemberSession::member, and GNUNET_MESSENGER_Member::store.

Referenced by check_member_session_completion(), destroy_member_session(), get_member_session_key(), get_session_room(), load_member_session_next(), reset_member_session(), and switch_member_session().

Here is the caller graph for this function:

◆ get_session_room()

static struct GNUNET_MESSENGER_SrvRoom * get_session_room ( const struct GNUNET_MESSENGER_SrvMemberSession *  session)
static

Definition at line 107 of file gnunet-service-messenger_member_session.c.

108{
109 struct GNUNET_MESSENGER_MemberStore *store;
110
111 GNUNET_assert (session);
112
113 store = get_session_member_store (session);
114
115 GNUNET_assert (store);
116
117 return store->room;
118}
static struct GNUNET_MESSENGER_MemberStore * get_session_member_store(const struct GNUNET_MESSENGER_SrvMemberSession *session)

References get_session_member_store(), GNUNET_assert, and GNUNET_MESSENGER_MemberStore::room.

Referenced by check_member_session_completion().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_member_session_completion()

static void check_member_session_completion ( struct GNUNET_MESSENGER_SrvMemberSession *  session)
static

Definition at line 122 of file gnunet-service-messenger_member_session.c.

124{
125 const struct GNUNET_HashCode *start;
126 const struct GNUNET_HashCode *end;
127 struct GNUNET_MESSENGER_MessageStore *msg_store;
128 struct GNUNET_CONTAINER_MultiHashMap *completion;
131
132 GNUNET_assert (session);
133
135 "Check session history (%s) for completion.\n",
137
138 if (! session->messages.tail)
139 {
140 session->completed = GNUNET_YES;
141 goto completion;
142 }
143 else if (GNUNET_YES == session->completed)
144 goto completion;
145
146 start = &(session->messages.head->hash);
147 end = &(session->messages.tail->hash);
148
149 msg_store = get_srv_room_message_store (get_session_room (session));
151
152 if (! completion)
153 goto completion;
154
155 init_list_messages (&level);
156 add_to_list_messages (&level, end);
157
159
160 while (level.head)
161 {
162 struct GNUNET_MESSENGER_ListMessage *element;
163
164 for (element = level.head; element; element = element->next)
165 {
166 const struct GNUNET_MESSENGER_MessageLink *link;
167
169 msg_store, &(element->hash),
170 GNUNET_NO);
171
172 if (! link)
173 continue;
174
176 link->first)))
177 {
178 add_to_list_messages (&list, &(link->first));
179 GNUNET_CONTAINER_multihashmap_put (completion, &(link->first), NULL,
181 }
182
183 if ((GNUNET_YES == link->multiple) &&
185 link->second)
186 )))
187 {
188 add_to_list_messages (&list, &(link->second));
189 GNUNET_CONTAINER_multihashmap_put (completion, &(link->second), NULL,
191 }
192 }
193
194 clear_list_messages (&level);
195
196 for (element = list.head; element; element = element->next)
197 {
198 if (GNUNET_YES != check_member_session_history (session, &(element->hash),
199 GNUNET_YES))
200 continue;
201
202 if (0 == GNUNET_CRYPTO_hash_cmp (&(element->hash), start))
203 {
204 session->completed = GNUNET_YES;
205 break;
206 }
207 }
208
209 if (GNUNET_YES != session->completed)
210 copy_list_messages (&level, &list);
211
213 }
214
216
217completion:
219 {
220 struct GNUNET_MESSENGER_MemberStore *member_store;
221 struct GNUNET_MESSENGER_ContactStore *store;
222
223 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Completed session history (%s)\n",
225
226 member_store = get_session_member_store (session);
227 store = get_member_contact_store (member_store);
228
229 if ((session->contact) && (GNUNET_YES == decrease_contact_rc (
230 session->contact)))
232 store,
233 session->contact,
235
236 session->contact = NULL;
237 }
238}
static int start
Set if we are to start default services (including ARM).
Definition gnunet-arm.c:38
static int list
Set if we should print a list of currently running services.
Definition gnunet-arm.c:68
static int end
Set if we are to shutdown all services (including ARM).
Definition gnunet-arm.c:33
void clear_list_messages(struct GNUNET_MESSENGER_ListMessages *messages)
Clears the list of message hashes.
void copy_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const struct GNUNET_MESSENGER_ListMessages *origin)
Copies all message hashes from an origin to another list.
void add_to_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const struct GNUNET_HashCode *hash)
Adds a specific hash from a message to the end of the list.
static struct GNUNET_MESSENGER_SrvRoom * get_session_room(const struct GNUNET_MESSENGER_SrvMemberSession *session)
enum GNUNET_GenericReturnValue is_member_session_completed(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns if the given member session has been completed.
enum GNUNET_GenericReturnValue check_member_session_history(const struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash, enum GNUNET_GenericReturnValue ownership)
Checks the history of a session for a specific message which is identified by its hash and if the own...
const struct GNUNET_MESSENGER_MessageLink * get_store_message_link(struct GNUNET_MESSENGER_MessageStore *store, const struct GNUNET_HashCode *hash, enum GNUNET_GenericReturnValue deleted_only)
Returns the message link from a message store matching a given hash.
struct GNUNET_MESSENGER_MessageStore * get_srv_room_message_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used message store of a given room.
int GNUNET_CRYPTO_hash_cmp(const struct GNUNET_HashCode *h1, const struct GNUNET_HashCode *h2)
Compare function for HashCodes, producing a total ordering of all hashcodes.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_contains(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Check if the map contains any value under the given key (including values that are NULL).
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST
, ' bother checking if a value already exists (faster than GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE...
@ GNUNET_YES
const char * GNUNET_sh2s(const struct GNUNET_ShortHashCode *shc)
Convert a short hash value to a string (for printing debug messages).
enum GNUNET_GenericReturnValue decrease_contact_rc(struct GNUNET_MESSENGER_Contact *contact)
Decreases the reference counter if possible (can not underflow!) of a given contact and returns GNUNE...
void remove_store_contact(struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET_MESSENGER_Contact *contact, const struct GNUNET_HashCode *context)
Removes a contact from the store which uses a given member context.
Internal representation of the hash map.
A 512-bit hashcode.
struct GNUNET_MESSENGER_ListMessage * next
struct GNUNET_MESSENGER_ListMessage * head
struct GNUNET_MESSENGER_ListMessage * tail

References add_to_list_messages(), check_member_session_history(), clear_list_messages(), GNUNET_MESSENGER_SrvMemberSession::completed, GNUNET_MESSENGER_SrvMemberSession::contact, copy_list_messages(), decrease_contact_rc(), end, GNUNET_MESSENGER_MessageLink::first, get_member_contact_store(), get_member_session_context(), get_member_session_id(), get_session_member_store(), get_session_room(), get_srv_room_message_store(), get_store_message_link(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_contains(), GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_CRYPTO_hash_cmp(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_NO, GNUNET_sh2s(), GNUNET_YES, GNUNET_MESSENGER_ListMessage::hash, GNUNET_MESSENGER_ListMessages::head, init_list_messages(), is_member_session_completed(), list, GNUNET_MESSENGER_SrvMemberSession::messages, GNUNET_MESSENGER_MessageLink::multiple, GNUNET_MESSENGER_ListMessage::next, remove_store_contact(), GNUNET_MESSENGER_MessageLink::second, start, and GNUNET_MESSENGER_ListMessages::tail.

Referenced by close_member_session(), switch_member_session(), and update_member_session_history().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ iterate_copy_history()

static enum GNUNET_GenericReturnValue iterate_copy_history ( void *  cls,
const struct GNUNET_HashCode *  key,
void *  value 
)
static

Definition at line 242 of file gnunet-service-messenger_member_session.c.

245{
247
248 GNUNET_assert ((cls) && (key));
249
250 next = cls;
251
254
255 return GNUNET_YES;
256}
struct GNUNET_HashCode key
The key used in the DHT.
static char * value
Value of the record to add/remove.

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_YES, GNUNET_MESSENGER_SrvMemberSession::history, key, GNUNET_MESSENGER_SrvMemberSession::next, and value.

Referenced by switch_member_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ switch_member_session()

struct GNUNET_MESSENGER_SrvMemberSession * switch_member_session ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
const struct GNUNET_MESSENGER_Message *  message,
const struct GNUNET_HashCode *  hash 
)

Creates and allocates a new member session closing and replacing a given other session of the same member.

The new session could have significant changes to the members public key or its member id depending on the used message to switch session. The new session will be linked to the old one.

Parameters
[in,out]sessionOld member session
[in]messageMessage
[in]hashHash of message
Returns
New member session

Definition at line 260 of file gnunet-service-messenger_member_session.c.

263{
264 struct GNUNET_MESSENGER_MemberStore *store;
266
267 if ((! session) || (! message) || (! hash))
268 return NULL;
269
272
273 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Switch member session!\n");
274
275 store = get_session_member_store (session);
277
278 if (GNUNET_MESSENGER_KIND_ID == message->header.kind)
279 {
280 next->member = add_store_member (store,
281 &(message->body.id.id));
282 if (! next->member)
283 {
285 "Failed to switch member session to ID: %s\n",
286 GNUNET_sh2s (&(message->body.id.id)));
287
289 return NULL;
290 }
291 }
292 else
293 {
294 if (! session->member)
295 {
297 "Failed to switch member session\n");
298
300 return NULL;
301 }
302
303 next->member = session->member;
304 }
305
306 if (GNUNET_MESSENGER_KIND_KEY == message->header.kind)
307 GNUNET_memcpy (&(next->public_key), &(message->body.key.key),
308 sizeof(next->public_key));
309 else
311 sizeof(next->public_key));
312
316 &(next->context));
317
324
326
327 if (! (next->contact))
328 {
330 return NULL;
331 }
332
334
337 GNUNET_NO);
338
340 next);
341
343 copy_list_messages (&(next->messages), &(session->messages));
344
345 session->next = next;
346 next->prev = session;
347 next->next = NULL;
348
350
351 session->closed = GNUNET_YES;
354
356
357 return next;
358}
static void check_member_session_completion(struct GNUNET_MESSENGER_SrvMemberSession *session)
static enum GNUNET_GenericReturnValue iterate_copy_history(void *cls, const struct GNUNET_HashCode *key, void *value)
struct GNUNET_MESSENGER_Contact * get_member_session_contact(struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the contact which is connected to a given member session.
struct GNUNET_MESSENGER_Member * add_store_member(struct GNUNET_MESSENGER_MemberStore *store, const struct GNUNET_ShortHashCode *id)
Adds a member to a store under a specific id and returns it on success.
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
unsigned int GNUNET_CONTAINER_multihashmap_size(const struct GNUNET_CONTAINER_MultiHashMap *map)
Get the number of key-value pairs in the map.
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_MESSENGER_KIND_KEY
The key kind.
@ GNUNET_MESSENGER_KIND_ID
The id kind.
void update_store_contact(struct GNUNET_MESSENGER_ContactStore *store, struct GNUNET_MESSENGER_Contact *contact, const struct GNUNET_HashCode *context, const struct GNUNET_HashCode *next_context, const struct GNUNET_CRYPTO_BlindablePublicKey *pubkey)
Moves a contact from the store to another location matching a given public key and member context.
struct GNUNET_MESSENGER_MessageId id
struct GNUNET_MESSENGER_MessageKey key
enum GNUNET_MESSENGER_MessageKind kind
The kind of the message.
struct GNUNET_ShortHashCode id
The new id which will replace the senders id in a room.
struct GNUNET_CRYPTO_BlindablePublicKey key
The new blindable public key which replaces the current senders public key.
struct GNUNET_MESSENGER_MessageHeader header
Header.
struct GNUNET_MESSENGER_MessageBody body
Body.

References add_store_member(), GNUNET_MESSENGER_Message::body, check_member_session_completion(), GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_MESSENGER_SrvMemberSession::completed, GNUNET_MESSENGER_SrvMemberSession::contact, GNUNET_MESSENGER_SrvMemberSession::context, copy_list_messages(), get_context_from_member(), get_member_contact_store(), get_member_session_contact(), get_member_session_context(), get_member_session_id(), get_member_session_key(), get_member_session_public_key(), get_session_member_store(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_CONTAINER_multihashmap_size(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_log, GNUNET_memcpy, GNUNET_MESSENGER_KIND_ID, GNUNET_MESSENGER_KIND_KEY, GNUNET_new, GNUNET_NO, GNUNET_sh2s(), GNUNET_TIME_absolute_get(), GNUNET_YES, GNUNET_MESSENGER_Message::header, GNUNET_MESSENGER_SrvMemberSession::history, GNUNET_MESSENGER_MessageId::id, GNUNET_MESSENGER_MessageBody::id, increase_contact_rc(), init_list_messages(), iterate_copy_history(), GNUNET_MESSENGER_MessageKey::key, GNUNET_MESSENGER_MessageBody::key, GNUNET_MESSENGER_MessageHeader::kind, GNUNET_MESSENGER_SrvMemberSession::member, GNUNET_MESSENGER_SrvMemberSession::messages, GNUNET_MESSENGER_SrvMemberSession::next, GNUNET_MESSENGER_SrvMemberSession::prev, GNUNET_MESSENGER_SrvMemberSession::public_key, GNUNET_MESSENGER_SrvMemberSession::start, and update_store_contact().

Referenced by handle_member_session_switch().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ destroy_member_session()

void destroy_member_session ( struct GNUNET_MESSENGER_SrvMemberSession *  session)

Destroys a member session and frees its memory fully.

Parameters
[in,out]sessionMember session

Definition at line 362 of file gnunet-service-messenger_member_session.c.

363{
364 struct GNUNET_MESSENGER_MemberStore *store;
365 struct GNUNET_MESSENGER_Contact *contact;
366
367 GNUNET_assert (session);
368
370
371 clear_list_messages (&(session->messages));
372
373 store = get_session_member_store (session);
374 contact = get_member_session_contact (session);
375
376 if ((contact) && (GNUNET_YES == decrease_contact_rc (contact)))
379 contact,
381
382 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Free member session!\n");
383 GNUNET_free (session);
384}

References clear_list_messages(), decrease_contact_rc(), get_member_contact_store(), get_member_session_contact(), get_member_session_context(), get_session_member_store(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_YES, GNUNET_MESSENGER_SrvMemberSession::history, GNUNET_MESSENGER_SrvMemberSession::messages, and remove_store_contact().

Referenced by iterate_destroy_session(), and remove_room_member_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ reset_member_session()

enum GNUNET_GenericReturnValue reset_member_session ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
const struct GNUNET_HashCode *  hash 
)

Resets a given member session which re-opens a member session for new usage.

Every connection to other sessions will be be dropped. The member sessions messages will be cleared but old history from uncompleted sessions however can be reused!

Parameters
[in,out]sessionMember session
[in]hashHash of initial message (JOIN message!)
Returns
GNUNET_OK on success, GNUNET_SYSERR otherwise

Definition at line 388 of file gnunet-service-messenger_member_session.c.

390{
391 struct GNUNET_MESSENGER_Contact *contact;
392
393 GNUNET_assert ((session) && (hash));
394
395 {
396 struct GNUNET_MESSENGER_MemberStore *member_store;
397 struct GNUNET_MESSENGER_ContactStore *store;
398
399 member_store = get_session_member_store (session);
400 store = get_member_contact_store (member_store);
401 contact = get_store_contact (
402 store,
405 }
406
407 if (! contact)
408 return GNUNET_SYSERR;
409
410 if (contact == session->contact)
411 goto clear_messages;
412
413 session->contact = contact;
414 increase_contact_rc (session->contact);
415
416clear_messages:
417 clear_list_messages (&(session->messages));
418 add_to_list_messages (&(session->messages), hash);
419
420 session->next = NULL;
421 session->closed = GNUNET_NO;
422 session->completed = GNUNET_NO;
423
424 return GNUNET_OK;
425}
@ GNUNET_OK
@ GNUNET_SYSERR

References add_to_list_messages(), clear_list_messages(), GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_MESSENGER_SrvMemberSession::completed, GNUNET_MESSENGER_SrvMemberSession::contact, get_member_contact_store(), get_member_session_context(), get_member_session_public_key(), get_session_member_store(), get_store_contact(), GNUNET_assert, GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, increase_contact_rc(), GNUNET_MESSENGER_SrvMemberSession::messages, and GNUNET_MESSENGER_SrvMemberSession::next.

Referenced by handle_message_join().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ close_member_session()

void close_member_session ( struct GNUNET_MESSENGER_SrvMemberSession *  session)

Closes a given member session which opens the request for completion of the given member session.

Closing a session may complete a session and can't be used without a reset! (

See also
reset_member_session() )
Parameters
[in,out]sessionMember session

Definition at line 429 of file gnunet-service-messenger_member_session.c.

430{
431 GNUNET_assert (session);
432
433 session->closed = GNUNET_YES;
435}

References check_member_session_completion(), GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_assert, and GNUNET_YES.

Referenced by handle_message_leave().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_member_session_closed()

enum GNUNET_GenericReturnValue is_member_session_closed ( const struct GNUNET_MESSENGER_SrvMemberSession *  session)

Returns if the given member session has been closed.

Parameters
[in]sessionMember session
Returns
GNUNET_YES or GNUNET_NO

Definition at line 439 of file gnunet-service-messenger_member_session.c.

441{
442 GNUNET_assert (session);
443
444 return session->closed;
445}

References GNUNET_MESSENGER_SrvMemberSession::closed, and GNUNET_assert.

◆ is_member_session_completed()

enum GNUNET_GenericReturnValue is_member_session_completed ( const struct GNUNET_MESSENGER_SrvMemberSession *  session)

Returns if the given member session has been completed.

A completed member session can't verify any message as its own and it won't add any message to its history.

Parameters
[in]sessionMember session
Returns
GNUNET_YES or GNUNET_NO

Definition at line 449 of file gnunet-service-messenger_member_session.c.

451{
452 GNUNET_assert (session);
453
454 return session->completed;
455}

References GNUNET_MESSENGER_SrvMemberSession::completed, and GNUNET_assert.

Referenced by check_member_session_completion(), iterate_epoch_session_members(), iterate_forward_members(), iterate_notify_about_members(), iterate_update_member_sessions(), update_member_session_history(), and verify_member_session_as_sender().

Here is the caller graph for this function:

◆ get_member_session_start()

struct GNUNET_TIME_Absolute get_member_session_start ( const struct GNUNET_MESSENGER_SrvMemberSession *  session)

Returns the timestamp of the member session's start.

Parameters
[in]sessionMember session
Returns
Absolute timestamp

Definition at line 459 of file gnunet-service-messenger_member_session.c.

461{
462 GNUNET_assert (session);
463
464 if (session->prev)
465 return get_member_session_start (session->prev);
466
467 return session->start;
468}
struct GNUNET_TIME_Absolute get_member_session_start(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the timestamp of the member session's start.

References get_member_session_start(), and GNUNET_assert.

Referenced by get_member_session_start(), and solve_srv_room_member_collisions().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_member_session_key()

const struct GNUNET_HashCode * get_member_session_key ( const struct GNUNET_MESSENGER_SrvMemberSession *  session)

Returns the key of the room a given member session belongs to.

Parameters
[in]sessionMember session
Returns
Key of room

Definition at line 472 of file gnunet-service-messenger_member_session.c.

473{
474 const struct GNUNET_MESSENGER_MemberStore *store;
475
476 GNUNET_assert ((session) && (session->member));
477
478 store = get_session_member_store (session);
479
480 return get_member_store_key (store);
481}
const struct GNUNET_HashCode * get_member_store_key(const struct GNUNET_MESSENGER_MemberStore *store)
Returns the shared secret you need to access a room of the store.

References get_member_store_key(), get_session_member_store(), GNUNET_assert, and GNUNET_MESSENGER_SrvMemberSession::member.

Referenced by create_member_session(), and switch_member_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_member_session_id()

const struct GNUNET_ShortHashCode * get_member_session_id ( const struct GNUNET_MESSENGER_SrvMemberSession *  session)

Returns the member id of a given member session.

Parameters
[in]sessionMember session
Returns
Member id

Definition at line 485 of file gnunet-service-messenger_member_session.c.

486{
487 GNUNET_assert (session);
488
489 return get_member_id (session->member);
490}
const struct GNUNET_ShortHashCode * get_member_id(const struct GNUNET_MESSENGER_Member *member)
Returns the current id of a given member.

References get_member_id(), GNUNET_assert, and GNUNET_MESSENGER_SrvMemberSession::member.

Referenced by check_member_session_completion(), create_member_session(), delete_srv_room_message(), find_member_session_in_room(), iterate_epoch_session_members(), iterate_notify_about_members(), notify_about_members(), remove_room_member_session(), request_room_message_step(), save_member_session(), send_message_join(), switch_member_session(), traverse_epoch_session_message(), update_member_session_history(), and verify_member_session_as_sender().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_member_session_public_key()

const struct GNUNET_CRYPTO_BlindablePublicKey * get_member_session_public_key ( const struct GNUNET_MESSENGER_SrvMemberSession *  session)

Returns the public key of a given member session.

Parameters
[in]sessionMember session
Returns
Public key

Definition at line 494 of file gnunet-service-messenger_member_session.c.

496{
497 GNUNET_assert (session);
498
499 return &(session->public_key);
500}

References GNUNET_assert, and GNUNET_MESSENGER_SrvMemberSession::public_key.

Referenced by add_member_session(), create_member_session(), handle_message_id(), iterate_member_sessions_it(), notify_srv_handle_message(), remove_member_session(), remove_room_member_session(), reset_member_session(), save_member_session(), switch_member_session(), and verify_member_session_as_sender().

Here is the caller graph for this function:

◆ get_member_session_context()

const struct GNUNET_HashCode * get_member_session_context ( const struct GNUNET_MESSENGER_SrvMemberSession *  session)

Returns the member context of a given member session.

Parameters
[in]sessionMember session
Returns
Member context as hash

Definition at line 504 of file gnunet-service-messenger_member_session.c.

506{
507 GNUNET_assert (session);
508
509 return &(session->context);
510}

References GNUNET_MESSENGER_SrvMemberSession::context, and GNUNET_assert.

Referenced by check_member_session_completion(), create_member_session(), destroy_member_session(), get_next_member_session_context(), reset_member_session(), and switch_member_session().

Here is the caller graph for this function:

◆ get_member_session_contact()

struct GNUNET_MESSENGER_Contact * get_member_session_contact ( struct GNUNET_MESSENGER_SrvMemberSession *  session)

Returns the contact which is connected to a given member session.

Parameters
[in]sessionMember session
Returns
Contact

Definition at line 514 of file gnunet-service-messenger_member_session.c.

515{
516 GNUNET_assert (session);
517
518 return session->contact;
519}

References GNUNET_MESSENGER_SrvMemberSession::contact, and GNUNET_assert.

Referenced by destroy_member_session(), and switch_member_session().

Here is the caller graph for this function:

◆ verify_member_session_as_sender()

enum GNUNET_GenericReturnValue verify_member_session_as_sender ( const struct GNUNET_MESSENGER_SrvMemberSession *  session,
const struct GNUNET_MESSENGER_Message *  message,
const struct GNUNET_HashCode *  hash 
)

Verifies a given member session as sender of a selected message and its hash.

The function returns GNUNET_OK if the message session is verified as sender, otherwise GNUNET_SYSERR.

See also
is_member_session_completed() for verification.
Parameters
[in]sessionMember session
[in]messageMessage
[in]hashHash of message
Returns
GNUNET_OK on success, otherwise GNUNET_SYSERR

Definition at line 523 of file gnunet-service-messenger_member_session.c.

527{
528 GNUNET_assert ((session) && (message) && (hash));
529
531 {
532 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Check message (%s) using history!\n",
533 GNUNET_h2s (hash));
534
535 if (GNUNET_YES == check_member_session_history (session, hash, GNUNET_YES))
536 return GNUNET_OK;
537 else
538 return GNUNET_SYSERR;
539 }
540
541 if (0 != GNUNET_memcmp (get_member_session_id (session),
542 &(message->header.sender_id)))
543 return GNUNET_SYSERR;
544
545 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Check message (%s) using key: %s\n",
546 GNUNET_h2s (hash),
549
550 return verify_message (message, hash, get_member_session_public_key (
551 session));
552}
char * GNUNET_CRYPTO_blindable_public_key_to_string(const struct GNUNET_CRYPTO_BlindablePublicKey *key)
Creates a (Base32) string representation of the public key.
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
enum GNUNET_GenericReturnValue verify_message(const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash, const struct GNUNET_CRYPTO_BlindablePublicKey *key)
Verifies the signature of a given message and its hash with a specific public key.
struct GNUNET_ShortHashCode sender_id
The senders id inside of the room the message was sent in.

References check_member_session_history(), get_member_session_id(), get_member_session_public_key(), GNUNET_assert, GNUNET_CRYPTO_blindable_public_key_to_string(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_memcmp, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, GNUNET_MESSENGER_Message::header, is_member_session_completed(), GNUNET_MESSENGER_MessageHeader::sender_id, and verify_message().

Referenced by iterate_search_session(), and update_member_session_history().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_member_session_history()

enum GNUNET_GenericReturnValue check_member_session_history ( const struct GNUNET_MESSENGER_SrvMemberSession *  session,
const struct GNUNET_HashCode *  hash,
enum GNUNET_GenericReturnValue  ownership 
)

Checks the history of a session for a specific message which is identified by its hash and if the ownership flag is set, if the message is owned by the sessions contact.

Parameters
[in]sessionMember session
[in]hashHash of message
[in]ownershipOwnership flag
Returns
GNUNET_YES if found, otherwise GNUNET_NO

Definition at line 556 of file gnunet-service-messenger_member_session.c.

560{
561 GNUNET_assert ((session) && (hash));
562
563 if (GNUNET_YES == ownership)
564 return (NULL != GNUNET_CONTAINER_multihashmap_get (session->history, hash)?
566 else
567 return GNUNET_CONTAINER_multihashmap_contains (session->history, hash);
568}
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_contains(), GNUNET_CONTAINER_multihashmap_get(), GNUNET_NO, GNUNET_YES, and GNUNET_MESSENGER_SrvMemberSession::history.

Referenced by check_member_session_completion(), delete_srv_room_message(), notify_about_members(), recv_message_request(), request_room_message_step(), and verify_member_session_as_sender().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_member_chain_history()

static void update_member_chain_history ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
const struct GNUNET_HashCode *  hash,
enum GNUNET_GenericReturnValue  ownership 
)
static

Definition at line 572 of file gnunet-service-messenger_member_session.c.

575{
576 GNUNET_assert ((session) && (hash));
577
579 (GNUNET_YES == ownership?
580 session : NULL),
582 && (session->next))
583 update_member_chain_history (session->next, hash, ownership);
584}
static void update_member_chain_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash, enum GNUNET_GenericReturnValue ownership)

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_OK, GNUNET_YES, GNUNET_MESSENGER_SrvMemberSession::history, GNUNET_MESSENGER_SrvMemberSession::next, and update_member_chain_history().

Referenced by update_member_chain_history(), and update_member_session_history().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_member_session_history()

void update_member_session_history ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
const struct GNUNET_MESSENGER_Message *  message,
const struct GNUNET_HashCode *  hash 
)

Adds a given message to the history of a session using the messages hash.

The ownership will be set automatically.

See also
is_member_session_completed() for updating a history.
Parameters
[in,out]sessionMember session
[in]messageMessage
[in]hashHash of message

Definition at line 588 of file gnunet-service-messenger_member_session.c.

592{
593 GNUNET_assert ((session) && (message) && (hash));
594
596 {
598 "Updating session history (%s) failed: Session already completed!\n",
600 return;
601 }
602
604 "Updating sessions history (%s) += (%s)\n",
605 GNUNET_sh2s (get_member_session_id (session)), GNUNET_h2s (hash));
606
607 if (GNUNET_OK == verify_member_session_as_sender (session, message, hash))
608 {
609 if (GNUNET_YES == is_message_session_bound (message))
610 add_to_list_messages (&(session->messages), hash);
611
613 }
614 else
615 update_member_chain_history (session, hash, GNUNET_NO);
616
617 if (GNUNET_YES == session->closed)
619}
enum GNUNET_GenericReturnValue verify_member_session_as_sender(const struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
Verifies a given member session as sender of a selected message and its hash.
@ GNUNET_ERROR_TYPE_WARNING
enum GNUNET_GenericReturnValue is_message_session_bound(const struct GNUNET_MESSENGER_Message *message)
Returns if the message should be bound to a member session.

References add_to_list_messages(), check_member_session_completion(), GNUNET_MESSENGER_SrvMemberSession::closed, get_member_session_id(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_WARNING, GNUNET_h2s(), GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_sh2s(), GNUNET_YES, is_member_session_completed(), is_message_session_bound(), GNUNET_MESSENGER_SrvMemberSession::messages, update_member_chain_history(), and verify_member_session_as_sender().

Referenced by iterate_update_member_sessions().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ clear_member_chain_history()

static void clear_member_chain_history ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
const struct GNUNET_HashCode *  hash 
)
static

Definition at line 623 of file gnunet-service-messenger_member_session.c.

625{
626 GNUNET_assert ((session) && (hash));
627
628 if ((0 < GNUNET_CONTAINER_multihashmap_remove_all (session->history, hash)) &&
629 (session->next))
630 clear_member_session_history (session->next, hash);
631}
void clear_member_session_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash)
Removes a message from the history of a session using the messages hash.
int GNUNET_CONTAINER_multihashmap_remove_all(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Remove all entries for the given key from the map.

References clear_member_session_history(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_remove_all(), GNUNET_MESSENGER_SrvMemberSession::history, and GNUNET_MESSENGER_SrvMemberSession::next.

Referenced by clear_member_session_history().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ clear_member_session_history()

void clear_member_session_history ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
const struct GNUNET_HashCode *  hash 
)

Removes a message from the history of a session using the messages hash.

Parameters
[in,out]sessionMember session
[in]hashHash of message

Definition at line 635 of file gnunet-service-messenger_member_session.c.

637{
638 GNUNET_assert ((session) && (hash));
639
640 clear_member_chain_history (session, hash);
641}
static void clear_member_chain_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash)

References clear_member_chain_history(), and GNUNET_assert.

Referenced by clear_member_chain_history().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ load_member_session_history()

static void load_member_session_history ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
const char *  path 
)
static

Definition at line 651 of file gnunet-service-messenger_member_session.c.

653{
656
657 GNUNET_assert ((session) && (path));
658
659 if (GNUNET_YES != GNUNET_DISK_file_test (path))
660 return;
661
662 {
663 enum GNUNET_DISK_AccessPermissions permission;
664
667 }
668
669 if (! handle)
670 return;
671
673
674 do {
676 ssize_t len;
677
678 len = GNUNET_DISK_file_read (handle, &(entry.hash), sizeof(entry.hash));
679
680 if (len != sizeof(entry.hash))
681 break;
682
683 len = GNUNET_DISK_file_read (handle, &(entry.ownership),
684 sizeof(entry.ownership));
685
686 if (len != sizeof(entry.ownership))
687 break;
688
689 status = GNUNET_CONTAINER_multihashmap_put (session->history, &(entry.hash),
690 (entry.ownership? session :
691 NULL),
693 } while (status == GNUNET_OK);
694
696}
static int status
The program status; 0 for success.
Definition gnunet-nse.c:39
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition gnunet-vpn.c:35
struct GNUNET_DISK_FileHandle * GNUNET_DISK_file_open(const char *fn, enum GNUNET_DISK_OpenFlags flags, enum GNUNET_DISK_AccessPermissions perm)
Open a file.
Definition disk.c:1308
enum GNUNET_GenericReturnValue GNUNET_DISK_file_test(const char *fil)
Check that fil corresponds to a filename (of a file that exists and that is not a directory).
Definition disk.c:557
off_t GNUNET_DISK_file_seek(const struct GNUNET_DISK_FileHandle *h, off_t offset, enum GNUNET_DISK_Seek whence)
Move the read/write pointer in a file.
Definition disk.c:219
GNUNET_DISK_AccessPermissions
File access permissions, UNIX-style.
enum GNUNET_GenericReturnValue GNUNET_DISK_file_close(struct GNUNET_DISK_FileHandle *h)
Close an open file.
Definition disk.c:1386
ssize_t GNUNET_DISK_file_read(const struct GNUNET_DISK_FileHandle *h, void *result, size_t len)
Read the contents of a binary file into a buffer.
Definition disk.c:704
@ GNUNET_DISK_OPEN_READ
Open the file for reading.
@ GNUNET_DISK_PERM_USER_READ
Owner can read.
@ GNUNET_DISK_PERM_USER_WRITE
Owner can write.
@ GNUNET_DISK_SEEK_SET
Seek an absolute position (from the start of the file).
GNUNET_GenericReturnValue
Named constants for return values.
Handle used to access files (and pipes).

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST, GNUNET_DISK_file_close(), GNUNET_DISK_file_open(), GNUNET_DISK_file_read(), GNUNET_DISK_file_seek(), GNUNET_DISK_file_test(), GNUNET_DISK_OPEN_READ, GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_DISK_SEEK_SET, GNUNET_OK, GNUNET_YES, handle, GNUNET_MESSENGER_SrvMemberSessionHistoryEntry::hash, GNUNET_MESSENGER_SrvMemberSession::history, GNUNET_MESSENGER_SrvMemberSessionHistoryEntry::ownership, and status.

Referenced by load_member_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ load_member_session()

void load_member_session ( struct GNUNET_MESSENGER_Member *  member,
const char *  directory 
)

Loads data from a directory into a new allocated and created member session of a member if the required information can be read from the content of the given directory.

Parameters
[out]memberMember
[in]directoryPath to a directory

Definition at line 700 of file gnunet-service-messenger_member_session.c.

702{
703 char *config_file;
704 struct GNUNET_MESSENGER_SrvMemberSession *session;
706
707 GNUNET_assert ((member) && (directory));
708
709 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
710
711 session = NULL;
712
714 goto free_config;
715
717 "Load session configuration of member: %s\n", config_file);
718
720
721 if (! cfg)
722 goto free_config;
723
725 {
727 enum GNUNET_GenericReturnValue key_result;
728 unsigned long long numeric_value;
729 char *key_data;
730
732 "key", &key_data))
733 goto destroy_config;
734
736 &key);
737 GNUNET_free (key_data);
738
739 if (GNUNET_OK != key_result)
740 goto destroy_config;
741
742 session = create_member_session (member, &key);
743
744 if (! session)
745 goto destroy_config;
746
748 "start",
749 &numeric_value))
750 session->start.abs_value_us = numeric_value;
751
753 "closed",
754 &numeric_value))
755 session->closed = (GNUNET_YES == numeric_value? GNUNET_YES : GNUNET_NO);
756
758 "completed",
759 &numeric_value))
760 session->completed = (GNUNET_YES == numeric_value? GNUNET_YES :
761 GNUNET_NO);
762 }
763
764destroy_config:
766
767free_config:
769
770 if (! session)
771 return;
772
773 {
774 char *history_file;
775 GNUNET_asprintf (&history_file, "%s%s", directory, "history.map");
776
777 load_member_session_history (session, history_file);
778 GNUNET_free (history_file);
779 }
780
781 {
782 char *messages_file;
783 GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list");
784
785 load_list_messages (&(session->messages), messages_file);
786 GNUNET_free (messages_file);
787 }
788
789 add_member_session (member, session);
790}
static struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition gnunet-arm.c:108
static char * config_file
Set to the name of the config file used.
Definition gnunet-arm.c:83
void load_list_messages(struct GNUNET_MESSENGER_ListMessages *messages, const char *path)
Loads the list of message hashes from a file under a given path.
void add_member_session(struct GNUNET_MESSENGER_Member *member, struct GNUNET_MESSENGER_SrvMemberSession *session)
Adds a given member session to its member.
struct GNUNET_MESSENGER_SrvMemberSession * create_member_session(struct GNUNET_MESSENGER_Member *member, const struct GNUNET_CRYPTO_BlindablePublicKey *pubkey)
Creates and allocates a new member session of a member with a given public key.
static void load_member_session_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const char *path)
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(const struct GNUNET_OS_ProjectData *pd)
Create a new configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
void GNUNET_CONFIGURATION_destroy(struct GNUNET_CONFIGURATION_Handle *cfg)
Destroy configuration object.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_string(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, char **value)
Get a configuration value that should be a string.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_parse(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Parse a configuration file, add all of the options in the file to the configuration environment.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_blindable_public_key_from_string(const char *str, struct GNUNET_CRYPTO_BlindablePublicKey *key)
Parses a (Base32) string representation of the public key.
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
An identity key as per LSD0001.
uint64_t abs_value_us
The actual value.

References GNUNET_TIME_Absolute::abs_value_us, add_member_session(), cfg, GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_MESSENGER_SrvMemberSession::completed, config_file, create_member_session(), GNUNET_asprintf(), GNUNET_assert, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_get_value_number(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_parse(), GNUNET_CRYPTO_blindable_public_key_from_string(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_NO, GNUNET_OK, GNUNET_OS_project_data_gnunet(), GNUNET_YES, key, load_list_messages(), load_member_session_history(), GNUNET_MESSENGER_SrvMemberSession::messages, and GNUNET_MESSENGER_SrvMemberSession::start.

Referenced by callback_scan_for_sessions().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_cycle_safe_next_session()

static struct GNUNET_MESSENGER_SrvMemberSession * get_cycle_safe_next_session ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
struct GNUNET_MESSENGER_SrvMemberSession *  next 
)
static

Definition at line 794 of file gnunet-service-messenger_member_session.c.

796{
798
799 if (! next)
800 return NULL;
801
802 for (check = next; check; check = check->next)
803 if (check == session)
804 return NULL;
805
806 return next;
807}

References GNUNET_MESSENGER_SrvMemberSession::next.

Referenced by load_member_session_next().

Here is the caller graph for this function:

◆ load_member_session_next()

void load_member_session_next ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
const char *  directory 
)

Loads the connection from one session to another through the next attribute.

Necessary information will be loaded from a configuration file inside of a given directory.

Parameters
[in,out]sessionMember session
[in]directoryPath to a directory

Definition at line 811 of file gnunet-service-messenger_member_session.c.

813{
815 char *config_file;
816
817
818 GNUNET_assert ((session) && (directory));
819
820 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
821
823 goto free_config;
824
826 "Load next session configuration of member: %s\n", config_file);
827
829
830 if (! cfg)
831 goto free_config;
832
834 {
835 struct GNUNET_CRYPTO_BlindablePublicKey next_key;
836 enum GNUNET_GenericReturnValue key_result;
838 char *key_data;
839
841 "next_key",
842 &key_data))
843 goto destroy_config;
844
845 key_result = GNUNET_CRYPTO_blindable_public_key_from_string (key_data, &
846 next_key);
847 GNUNET_free (key_data);
848
849 if (GNUNET_OK != key_result)
850 goto destroy_config;
851
852 if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "session", "next_id",
853 &next_id, sizeof(next_id)))
854 goto destroy_config;
855
856 {
857 struct GNUNET_MESSENGER_MemberStore *store;
858 struct GNUNET_MESSENGER_Member *member;
859
861 member = get_store_member (store, &next_id);
862
864 session,
865 member? get_member_session (member, &next_key) : NULL);
866 }
867
868 if (session->next)
869 session->next->prev = session;
870 }
871
872destroy_config:
874
875free_config:
877}
static char * next_id
Command-line option for namespace publishing: identifier for updates to this publication.
struct GNUNET_MESSENGER_SrvMemberSession * get_member_session(const struct GNUNET_MESSENGER_Member *member, const struct GNUNET_CRYPTO_BlindablePublicKey *public_key)
Returns the member session of a member identified by a given public key.
static struct GNUNET_MESSENGER_SrvMemberSession * get_cycle_safe_next_session(struct GNUNET_MESSENGER_SrvMemberSession *session, struct GNUNET_MESSENGER_SrvMemberSession *next)
struct GNUNET_MESSENGER_Member * get_store_member(const struct GNUNET_MESSENGER_MemberStore *store, const struct GNUNET_ShortHashCode *id)
Returns the member in a store identified by a given id.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_data(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, void *buf, size_t buf_size)
Get Crockford32-encoded fixed-size binary data from a configuration.
A 256-bit hashcode.

References cfg, config_file, get_cycle_safe_next_session(), get_member_session(), get_session_member_store(), get_store_member(), GNUNET_asprintf(), GNUNET_assert, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_get_data(), GNUNET_CONFIGURATION_get_value_string(), GNUNET_CONFIGURATION_parse(), GNUNET_CRYPTO_blindable_public_key_from_string(), GNUNET_DISK_file_test(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_OK, GNUNET_OS_project_data_gnunet(), GNUNET_YES, GNUNET_MESSENGER_SrvMemberSession::next, next_id, GNUNET_MESSENGER_SrvMemberSession::prev, and GNUNET_MESSENGER_Member::store.

Referenced by iterate_load_next_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ iterate_save_member_session_history_hentries()

static enum GNUNET_GenericReturnValue iterate_save_member_session_history_hentries ( void *  cls,
const struct GNUNET_HashCode *  key,
void *  value 
)
static

Definition at line 881 of file gnunet-service-messenger_member_session.c.

884{
886 unsigned char ownership;
887
888 GNUNET_assert ((cls) && (key));
889
890 handle = cls;
891 ownership = value? GNUNET_YES : GNUNET_NO;
892
894 GNUNET_DISK_file_write (handle, &ownership, sizeof(ownership));
895
896 return GNUNET_YES;
897}
ssize_t GNUNET_DISK_file_write(const struct GNUNET_DISK_FileHandle *h, const void *buffer, size_t n)
Write a buffer to a file.
Definition disk.c:745

References GNUNET_assert, GNUNET_DISK_file_write(), GNUNET_NO, GNUNET_YES, handle, key, and value.

Referenced by save_member_session_history().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ save_member_session_history()

static void save_member_session_history ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
const char *  path 
)
static

Definition at line 901 of file gnunet-service-messenger_member_session.c.

903{
905
906 GNUNET_assert ((session) && (path));
907
908 {
909 enum GNUNET_DISK_AccessPermissions permission;
910
912
914 path,
916 permission);
917 }
918
919 if (! handle)
920 return;
921
923
925 session->history,
927 handle);
928
931}
static enum GNUNET_GenericReturnValue iterate_save_member_session_history_hentries(void *cls, const struct GNUNET_HashCode *key, void *value)
enum GNUNET_GenericReturnValue GNUNET_DISK_file_sync(const struct GNUNET_DISK_FileHandle *h)
Write file changes to disk.
Definition disk.c:1507
@ GNUNET_DISK_OPEN_WRITE
Open the file for writing.
@ GNUNET_DISK_OPEN_CREATE
Create file if it doesn't exist.

References GNUNET_assert, GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_DISK_file_close(), GNUNET_DISK_file_open(), GNUNET_DISK_file_seek(), GNUNET_DISK_file_sync(), GNUNET_DISK_OPEN_CREATE, GNUNET_DISK_OPEN_WRITE, GNUNET_DISK_PERM_USER_READ, GNUNET_DISK_PERM_USER_WRITE, GNUNET_DISK_SEEK_SET, handle, GNUNET_MESSENGER_SrvMemberSession::history, and iterate_save_member_session_history_hentries().

Referenced by save_member_session().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ save_member_session()

void save_member_session ( struct GNUNET_MESSENGER_SrvMemberSession *  session,
const char *  directory 
)

Saves data from a member session into a directory which can be load to restore the member session completely.

Parameters
[in]sessionMember session
[in]directoryPath to a directory

Definition at line 935 of file gnunet-service-messenger_member_session.c.

937{
939 char *config_file;
940 char *key_data;
941
942 GNUNET_assert ((session) && (directory));
943
944 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
945
947 "Save session configuration of member: %s\n", config_file);
948
950
951 if (! cfg)
952 goto free_config;
953
956
957 if (key_data)
958 {
959 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "key", key_data);
960 GNUNET_free (key_data);
961 }
962
963 if (session->next)
964 {
966 session->next);
967
968 char *next_id_data = GNUNET_STRINGS_data_to_string_alloc (next_id,
969 sizeof(*next_id));
970
971 if (next_id_data)
972 {
973 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_id",
974 next_id_data);
975 GNUNET_free (next_id_data);
976 }
977
980
981 if (key_data)
982 {
983 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_key",
984 key_data);
985 GNUNET_free (key_data);
986 }
987 }
988
989 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "start",
990 session->start.abs_value_us);
991
992 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "closed",
993 session->closed);
994 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "completed",
995 session->completed);
996
999
1000free_config:
1002
1003 {
1004 char *history_file;
1005 GNUNET_asprintf (&history_file, "%s%s", directory, "history.map");
1006
1007 save_member_session_history (session, history_file);
1008 GNUNET_free (history_file);
1009 }
1010
1011 {
1012 char *messages_file;
1013 GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list");
1014
1015 save_list_messages (&(session->messages), messages_file);
1016 GNUNET_free (messages_file);
1017 }
1018}
void save_list_messages(const struct GNUNET_MESSENGER_ListMessages *messages, const char *path)
Saves the list of message hashes to a file under a given path.
static void save_member_session_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const char *path)
void GNUNET_CONFIGURATION_set_value_string(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, const char *value)
Set a configuration value that should be a string.
void GNUNET_CONFIGURATION_set_value_number(struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long number)
Set a configuration value that should be a number.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.
char * GNUNET_STRINGS_data_to_string_alloc(const void *buf, size_t size)
Return the base32crockford encoding of the given buffer.
Definition strings.c:818

References GNUNET_TIME_Absolute::abs_value_us, cfg, GNUNET_MESSENGER_SrvMemberSession::closed, GNUNET_MESSENGER_SrvMemberSession::completed, config_file, get_member_session_id(), get_member_session_public_key(), GNUNET_asprintf(), GNUNET_assert, GNUNET_CONFIGURATION_create(), GNUNET_CONFIGURATION_destroy(), GNUNET_CONFIGURATION_set_value_number(), GNUNET_CONFIGURATION_set_value_string(), GNUNET_CONFIGURATION_write(), GNUNET_CRYPTO_blindable_public_key_to_string(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_OS_project_data_gnunet(), GNUNET_STRINGS_data_to_string_alloc(), GNUNET_MESSENGER_SrvMemberSession::messages, GNUNET_MESSENGER_SrvMemberSession::next, next_id, save_list_messages(), save_member_session_history(), and GNUNET_MESSENGER_SrvMemberSession::start.

Referenced by iterate_save_session().

Here is the call graph for this function:
Here is the caller graph for this function: