GNUnet 0.26.2-114-g7c6b613e3
 
Loading...
Searching...
No Matches
gnunet-service-messenger_member_session.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2021--2026 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 */
27
30
32
36{
38
39 if ((! member) || (! pubkey) || (! (member->store)))
40 return NULL;
41
42 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Create new member session!\n");
43
45 session->member = member;
46
47 GNUNET_memcpy (&(session->public_key), pubkey, sizeof(session->public_key));
48
50 get_member_session_key (session),
51 get_member_session_id (session),
52 &(session->context));
53
54 {
56
57 store = get_member_contact_store (member->store);
58
59 session->contact = get_store_contact (
60 store,
63 }
64
65 if (! (session->contact))
66 {
67 GNUNET_free (session);
68 return NULL;
69 }
70
72
74
75 init_list_messages (&(session->messages));
76
77 session->prev = NULL;
78 session->next = NULL;
79
80 session->start = GNUNET_TIME_absolute_get ();
81
82 session->closed = GNUNET_NO;
83 session->completed = GNUNET_NO;
84
85 return session;
86}
87
88
91 session)
92{
93 struct GNUNET_MESSENGER_Member *member;
94
95 GNUNET_assert (session);
96
97 member = session->member;
98
99 GNUNET_assert (member);
100
101 return member->store;
102}
103
104
105static struct GNUNET_MESSENGER_SrvRoom*
107{
108 struct GNUNET_MESSENGER_MemberStore *store;
109
110 GNUNET_assert (session);
111
112 store = get_session_member_store (session);
113
114 GNUNET_assert (store);
115
116 return store->room;
117}
118
119
120static void
122 session)
123{
124 const struct GNUNET_HashCode *start;
125 const struct GNUNET_HashCode *end;
126 struct GNUNET_MESSENGER_MessageStore *msg_store;
127 struct GNUNET_CONTAINER_MultiHashMap *completion;
130
131 GNUNET_assert (session);
132
134 "Check session history (%s) for completion.\n",
136
137 if (! session->messages.tail)
138 {
139 session->completed = GNUNET_YES;
140 goto completion;
141 }
142 else if (GNUNET_YES == session->completed)
143 goto completion;
144
145 start = &(session->messages.head->hash);
146 end = &(session->messages.tail->hash);
147
148 msg_store = get_srv_room_message_store (get_session_room (session));
150
151 if (! completion)
152 goto completion;
153
154 init_list_messages (&level);
155 add_to_list_messages (&level, end);
156
158
159 while (level.head)
160 {
161 struct GNUNET_MESSENGER_ListMessage *element;
162
163 for (element = level.head; element; element = element->next)
164 {
165 const struct GNUNET_MESSENGER_MessageLink *link;
166
168 msg_store, &(element->hash),
169 GNUNET_NO);
170
171 if (! link)
172 continue;
173
175 link->first)))
176 {
177 add_to_list_messages (&list, &(link->first));
178 GNUNET_CONTAINER_multihashmap_put (completion, &(link->first), NULL,
180 }
181
182 if ((GNUNET_YES == link->multiple) &&
184 link->second)
185 )))
186 {
187 add_to_list_messages (&list, &(link->second));
188 GNUNET_CONTAINER_multihashmap_put (completion, &(link->second), NULL,
190 }
191 }
192
193 clear_list_messages (&level);
194
195 for (element = list.head; element; element = element->next)
196 {
197 if (GNUNET_YES != check_member_session_history (session, &(element->hash),
198 GNUNET_YES))
199 continue;
200
201 if (0 == GNUNET_CRYPTO_hash_cmp (&(element->hash), start))
202 {
203 session->completed = GNUNET_YES;
204 break;
205 }
206 }
207
208 if (GNUNET_YES != session->completed)
209 copy_list_messages (&level, &list);
210
212 }
213
215
216completion:
218 {
219 struct GNUNET_MESSENGER_MemberStore *member_store;
220 struct GNUNET_MESSENGER_ContactStore *store;
221
222 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Completed session history (%s)\n",
224
225 member_store = get_session_member_store (session);
226 store = get_member_contact_store (member_store);
227
228 if ((session->contact) && (GNUNET_YES == decrease_contact_rc (
229 session->contact)))
231 store,
232 session->contact,
234
235 session->contact = NULL;
236 }
237}
238
239
242 const struct GNUNET_HashCode *key,
243 void *value)
244{
246
247 GNUNET_assert ((cls) && (key));
248
249 next = cls;
250
253
254 return GNUNET_YES;
255}
256
257
260 const struct GNUNET_MESSENGER_Message *message,
261 const struct GNUNET_HashCode *hash)
262{
263 struct GNUNET_MESSENGER_MemberStore *store;
265
266 if ((! session) || (! message) || (! hash))
267 return NULL;
268
271
272 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Switch member session!\n");
273
274 store = get_session_member_store (session);
276
277 if (GNUNET_MESSENGER_KIND_ID == message->header.kind)
278 {
279 next->member = add_store_member (store,
280 &(message->body.id.id));
281 if (! next->member)
282 {
284 "Failed to switch member session to ID: %s\n",
285 GNUNET_sh2s (&(message->body.id.id)));
286
288 return NULL;
289 }
290 }
291 else
292 next->member = session->member;
293
294 if (GNUNET_MESSENGER_KIND_KEY == message->header.kind)
295 GNUNET_memcpy (&(next->public_key), &(message->body.key.key),
296 sizeof(next->public_key));
297 else
299 sizeof(next->public_key));
300
304 &(next->context));
305
312
314
315 if (! (next->contact))
316 {
318 return NULL;
319 }
320
322
325 GNUNET_NO);
326
328 next);
329
331 copy_list_messages (&(next->messages), &(session->messages));
332
333 session->next = next;
334 next->prev = session;
335 next->next = NULL;
336
338
339 session->closed = GNUNET_YES;
342
344
345 return next;
346}
347
348
349void
351{
352 struct GNUNET_MESSENGER_MemberStore *store;
353 struct GNUNET_MESSENGER_Contact *contact;
354
355 GNUNET_assert (session);
356
358
359 clear_list_messages (&(session->messages));
360
361 store = get_session_member_store (session);
362 contact = get_member_session_contact (session);
363
364 if ((contact) && (GNUNET_YES == decrease_contact_rc (contact)))
367 contact,
369
370 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Free member session!\n");
371 GNUNET_free (session);
372}
373
374
377 const struct GNUNET_HashCode *hash)
378{
379 struct GNUNET_MESSENGER_Contact *contact;
380
381 GNUNET_assert ((session) && (hash));
382
383 {
384 struct GNUNET_MESSENGER_MemberStore *member_store;
385 struct GNUNET_MESSENGER_ContactStore *store;
386
387 member_store = get_session_member_store (session);
388 store = get_member_contact_store (member_store);
389 contact = get_store_contact (
390 store,
393 }
394
395 if (! contact)
396 return GNUNET_SYSERR;
397
398 if (contact == session->contact)
399 goto clear_messages;
400
401 session->contact = contact;
402 increase_contact_rc (session->contact);
403
404clear_messages:
405 clear_list_messages (&(session->messages));
406 add_to_list_messages (&(session->messages), hash);
407
408 session->next = NULL;
409 session->closed = GNUNET_NO;
410 session->completed = GNUNET_NO;
411
412 return GNUNET_OK;
413}
414
415
416void
418{
419 GNUNET_assert (session);
420
421 session->closed = GNUNET_YES;
423}
424
425
428 session)
429{
430 GNUNET_assert (session);
431
432 return session->closed;
433}
434
435
439{
440 GNUNET_assert (session);
441
442 return session->completed;
443}
444
445
448 session)
449{
450 GNUNET_assert (session);
451
452 if (session->prev)
453 return get_member_session_start (session->prev);
454
455 return session->start;
456}
457
458
459const struct GNUNET_HashCode*
461{
462 const struct GNUNET_MESSENGER_MemberStore *store;
463
464 GNUNET_assert ((session) && (session->member));
465
466 store = get_session_member_store (session);
467
468 return get_member_store_key (store);
469}
470
471
472const struct GNUNET_ShortHashCode*
474{
475 GNUNET_assert (session);
476
477 return get_member_id (session->member);
478}
479
480
484{
485 GNUNET_assert (session);
486
487 return &(session->public_key);
488}
489
490
491const struct GNUNET_HashCode*
494{
495 GNUNET_assert (session);
496
497 return &(session->context);
498}
499
500
503{
504 GNUNET_assert (session);
505
506 return session->contact;
507}
508
509
513 const struct GNUNET_MESSENGER_Message *message,
514 const struct GNUNET_HashCode *hash)
515{
516 GNUNET_assert ((session) && (message) && (hash));
517
519 {
520 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Check message (%s) using history!\n",
521 GNUNET_h2s (hash));
522
523 if (GNUNET_YES == check_member_session_history (session, hash, GNUNET_YES))
524 return GNUNET_OK;
525 else
526 return GNUNET_SYSERR;
527 }
528
529 if (0 != GNUNET_memcmp (get_member_session_id (session),
530 &(message->header.sender_id)))
531 return GNUNET_SYSERR;
532
533 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Check message (%s) using key: %s\n",
534 GNUNET_h2s (hash),
537
538 return verify_message (message, hash, get_member_session_public_key (
539 session));
540}
541
542
546 const struct GNUNET_HashCode *hash,
547 enum GNUNET_GenericReturnValue ownership)
548{
549 GNUNET_assert ((session) && (hash));
550
551 if (GNUNET_YES == ownership)
552 return (NULL != GNUNET_CONTAINER_multihashmap_get (session->history, hash)?
554 else
555 return GNUNET_CONTAINER_multihashmap_contains (session->history, hash);
556}
557
558
559static void
561 const struct GNUNET_HashCode *hash,
562 enum GNUNET_GenericReturnValue ownership)
563{
564 GNUNET_assert ((session) && (hash));
565
567 (GNUNET_YES == ownership?
568 session : NULL),
570 && (session->next))
571 update_member_chain_history (session->next, hash, ownership);
572}
573
574
575void
577 ,
578 const struct GNUNET_MESSENGER_Message *message,
579 const struct GNUNET_HashCode *hash)
580{
581 GNUNET_assert ((session) && (message) && (hash));
582
584 return;
585
587 "Updating sessions history (%s) += (%s)\n",
588 GNUNET_sh2s (get_member_session_id (session)), GNUNET_h2s (hash));
589
590 if (GNUNET_OK == verify_member_session_as_sender (session, message, hash))
591 {
592 if (GNUNET_YES == is_message_session_bound (message))
593 add_to_list_messages (&(session->messages), hash);
594
596 }
597 else
598 update_member_chain_history (session, hash, GNUNET_NO);
599
600 if (GNUNET_YES == session->closed)
602}
603
604
605static void
607 const struct GNUNET_HashCode *hash)
608{
609 GNUNET_assert ((session) && (hash));
610
611 if ((0 < GNUNET_CONTAINER_multihashmap_remove_all (session->history, hash)) &&
612 (session->next))
613 clear_member_session_history (session->next, hash);
614}
615
616
617void
619 const struct GNUNET_HashCode *hash)
620{
621 GNUNET_assert ((session) && (hash));
622
623 clear_member_chain_history (session, hash);
624}
625
626
632
633static void
635 const char *path)
636{
639
640 GNUNET_assert ((session) && (path));
641
642 if (GNUNET_YES != GNUNET_DISK_file_test (path))
643 return;
644
645 {
646 enum GNUNET_DISK_AccessPermissions permission;
647
650 }
651
652 if (! handle)
653 return;
654
656
657 do {
659 ssize_t len;
660
661 len = GNUNET_DISK_file_read (handle, &(entry.hash), sizeof(entry.hash));
662
663 if (len != sizeof(entry.hash))
664 break;
665
666 len = GNUNET_DISK_file_read (handle, &(entry.ownership),
667 sizeof(entry.ownership));
668
669 if (len != sizeof(entry.ownership))
670 break;
671
673 (entry.ownership? session :
674 NULL),
676 } while (status == GNUNET_OK);
677
679}
680
681
682void
684 const char *directory)
685{
686 char *config_file;
687 struct GNUNET_MESSENGER_SrvMemberSession *session;
689
690 GNUNET_assert ((member) && (directory));
691
692 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
693
694 session = NULL;
695
697 goto free_config;
698
700 "Load session configuration of member: %s\n", config_file);
701
703
704 if (! cfg)
705 goto free_config;
706
708 {
710 enum GNUNET_GenericReturnValue key_result;
711 unsigned long long numeric_value;
712 char *key_data;
713
715 "key", &key_data))
716 goto destroy_config;
717
719 ;
720 GNUNET_free (key_data);
721
722 if (GNUNET_OK != key_result)
723 goto destroy_config;
724
725 session = create_member_session (member, &key);
726
728 "start",
729 &numeric_value))
730 session->start.abs_value_us = numeric_value;
731
733 "closed",
734 &numeric_value))
735 session->closed = (GNUNET_YES == numeric_value? GNUNET_YES : GNUNET_NO);
736
738 "completed",
739 &numeric_value))
740 session->completed = (GNUNET_YES == numeric_value? GNUNET_YES :
741 GNUNET_NO);
742 }
743
744destroy_config:
746
747free_config:
749
750 if (! session)
751 return;
752
753 {
754 char *history_file;
755 GNUNET_asprintf (&history_file, "%s%s", directory, "history.map");
756
757 load_member_session_history (session, history_file);
758 GNUNET_free (history_file);
759 }
760
761 {
762 char *messages_file;
763 GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list");
764
765 load_list_messages (&(session->messages), messages_file);
766 GNUNET_free (messages_file);
767 }
768
769 add_member_session (member, session);
770}
771
772
776{
778
779 if (! next)
780 return NULL;
781
782 for (check = next; check; check = check->next)
783 if (check == session)
784 return NULL;
785
786 return next;
787}
788
789
790void
792 const char *directory)
793{
795 char *config_file;
796
797
798 GNUNET_assert ((session) && (directory));
799
800 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
801
803 goto free_config;
804
806 "Load next session configuration of member: %s\n", config_file);
807
809
810 if (! cfg)
811 goto free_config;
812
814 {
815 struct GNUNET_CRYPTO_BlindablePublicKey next_key;
816 enum GNUNET_GenericReturnValue key_result;
818 char *key_data;
819
821 "next_key",
822 &key_data))
823 goto destroy_config;
824
825 key_result = GNUNET_CRYPTO_blindable_public_key_from_string (key_data, &
826 next_key);
827 GNUNET_free (key_data);
828
829 if (GNUNET_OK != key_result)
830 goto destroy_config;
831
832 if (GNUNET_OK != GNUNET_CONFIGURATION_get_data (cfg, "session", "next_id",
833 &next_id, sizeof(next_id)))
834 goto destroy_config;
835
836 {
837 struct GNUNET_MESSENGER_MemberStore *store;
838 struct GNUNET_MESSENGER_Member *member;
839
841 member = get_store_member (store, &next_id);
842
844 session,
845 member? get_member_session (member, &next_key) : NULL);
846 }
847
848 if (session->next)
849 session->next->prev = session;
850 }
851
852destroy_config:
854
855free_config:
857}
858
859
862 const struct GNUNET_HashCode *key,
863 void *value)
864{
866 unsigned char ownership;
867
868 GNUNET_assert ((cls) && (key));
869
870 handle = cls;
871 ownership = value? GNUNET_YES : GNUNET_NO;
872
874 GNUNET_DISK_file_write (handle, &ownership, sizeof(ownership));
875
876 return GNUNET_YES;
877}
878
879
880static void
882 const char *path)
883{
885
886 GNUNET_assert ((session) && (path));
887
888 {
889 enum GNUNET_DISK_AccessPermissions permission;
890
892
894 path,
896 permission);
897 }
898
899 if (! handle)
900 return;
901
903
905 session->history,
907 handle);
908
911}
912
913
914void
916 const char *directory)
917{
919 char *config_file;
920 char *key_data;
921
922 GNUNET_assert ((session) && (directory));
923
924 GNUNET_asprintf (&config_file, "%s%s", directory, "session.cfg");
925
927 "Save session configuration of member: %s\n", config_file);
928
930
931 if (! cfg)
932 goto free_config;
933
936
937 if (key_data)
938 {
939 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "key", key_data);
940 GNUNET_free (key_data);
941 }
942
943 if (session->next)
944 {
946 session->next);
947
948 char *next_id_data = GNUNET_STRINGS_data_to_string_alloc (next_id,
949 sizeof(*next_id));
950
951 if (next_id_data)
952 {
953 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_id",
954 next_id_data);
955 GNUNET_free (next_id_data);
956 }
957
960
961 if (key_data)
962 {
963 GNUNET_CONFIGURATION_set_value_string (cfg, "session", "next_key",
964 key_data);
965 GNUNET_free (key_data);
966 }
967 }
968
969 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "start",
970 session->start.abs_value_us);
971
972 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "closed",
973 session->closed);
974 GNUNET_CONFIGURATION_set_value_number (cfg, "session", "completed",
975 session->completed);
976
979
980free_config:
982
983 {
984 char *history_file;
985 GNUNET_asprintf (&history_file, "%s%s", directory, "history.map");
986
987 save_member_session_history (session, history_file);
988 GNUNET_free (history_file);
989 }
990
991 {
992 char *messages_file;
993 GNUNET_asprintf (&messages_file, "%s%s", directory, "messages.list");
994
995 save_list_messages (&(session->messages), messages_file);
996 GNUNET_free (messages_file);
997 }
998}
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 struct GNUNET_CONFIGURATION_Handle * cfg
Our configuration.
Definition gnunet-arm.c:108
static int end
Set if we are to shutdown all services (including ARM).
Definition gnunet-arm.c:33
static char * config_file
Set to the name of the config file used.
Definition gnunet-arm.c:83
struct GNUNET_HashCode key
The key used in the DHT.
static struct GNUNET_CRYPTO_BlindablePublicKey pubkey
Public key of the zone to look in.
static char * value
Value of the record to add/remove.
static int status
The program status; 0 for success.
Definition gnunet-nse.c:39
static char * next_id
Command-line option for namespace publishing: identifier for updates to this publication.
void clear_list_messages(struct GNUNET_MESSENGER_ListMessages *messages)
Clears the list of message hashes.
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 init_list_messages(struct GNUNET_MESSENGER_ListMessages *messages)
Initializes list of message hashes as empty list.
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 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.
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.
const struct GNUNET_ShortHashCode * get_member_id(const struct GNUNET_MESSENGER_Member *member)
Returns the current id of a given member.
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.
void add_member_session(struct GNUNET_MESSENGER_Member *member, struct GNUNET_MESSENGER_SrvMemberSession *session)
Adds a given member session to its member.
static struct GNUNET_MESSENGER_SrvRoom * get_session_room(const struct GNUNET_MESSENGER_SrvMemberSession *session)
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.
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.
void destroy_member_session(struct GNUNET_MESSENGER_SrvMemberSession *session)
Destroys a member session and frees its memory fully.
enum GNUNET_GenericReturnValue is_member_session_completed(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns if the given member session has been completed.
const struct GNUNET_ShortHashCode * get_member_session_id(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the member id of a given member session.
static enum GNUNET_GenericReturnValue iterate_save_member_session_history_hentries(void *cls, const struct GNUNET_HashCode *key, void *value)
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.
static void check_member_session_completion(struct GNUNET_MESSENGER_SrvMemberSession *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.
static enum GNUNET_GenericReturnValue iterate_copy_history(void *cls, const struct GNUNET_HashCode *key, void *value)
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.
struct GNUNET_MESSENGER_Contact * get_member_session_contact(struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the contact which is connected to a given member session.
static void save_member_session_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const char *path)
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 me...
static struct GNUNET_MESSENGER_MemberStore * get_session_member_store(const struct GNUNET_MESSENGER_SrvMemberSession *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 requir...
struct GNUNET_TIME_Absolute get_member_session_start(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the timestamp of the member session's start.
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.
static void clear_member_chain_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash)
const struct GNUNET_HashCode * get_member_session_context(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns the member context of a given member session.
static void update_member_chain_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const struct GNUNET_HashCode *hash, enum GNUNET_GenericReturnValue ownership)
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.
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...
static void load_member_session_history(struct GNUNET_MESSENGER_SrvMemberSession *session, const char *path)
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.
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.
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 com...
enum GNUNET_GenericReturnValue is_member_session_closed(const struct GNUNET_MESSENGER_SrvMemberSession *session)
Returns if the given member session has been closed.
struct GNUNET_MESSENGER_ContactStore * get_member_contact_store(struct GNUNET_MESSENGER_MemberStore *store)
Returns the used contact store of a given member store.
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.
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.
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.
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.
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition gnunet-vpn.c:35
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.
struct GNUNET_CONFIGURATION_Handle * GNUNET_CONFIGURATION_create(const struct GNUNET_OS_ProjectData *pd)
Create a new configuration object.
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.
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.
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_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_CONFIGURATION_write(struct GNUNET_CONFIGURATION_Handle *cfg, const char *filename)
Write configuration file.
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
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
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_sync(const struct GNUNET_DISK_FileHandle *h)
Write file changes to disk.
Definition disk.c:1507
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_OPEN_WRITE
Open the file for writing.
@ GNUNET_DISK_OPEN_CREATE
Create file if it doesn't exist.
@ 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).
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).
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.
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
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.
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.
unsigned int GNUNET_CONTAINER_multihashmap_size(const struct GNUNET_CONTAINER_MultiHashMap *map)
Get the number of key-value pairs in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_FAST
, ' bother checking if a value already exists (faster than GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE...
#define GNUNET_log(kind,...)
char * GNUNET_CRYPTO_blindable_public_key_to_string(const struct GNUNET_CRYPTO_BlindablePublicKey *key)
Creates a (Base32) string representation of the public key.
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.
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_NO
@ GNUNET_SYSERR
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
const char * GNUNET_sh2s(const struct GNUNET_ShortHashCode *shc)
Convert a short hash value to a string (for printing debug messages).
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
int int GNUNET_asprintf(char **buf, const char *format,...) __attribute__((format(printf
Like asprintf, just portable.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
@ GNUNET_MESSENGER_KIND_KEY
The key kind.
@ GNUNET_MESSENGER_KIND_ID
The id kind.
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
char * GNUNET_STRINGS_data_to_string_alloc(const void *buf, size_t size)
Return the base32crockford encoding of the given buffer.
Definition strings.c:812
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition time.c:111
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 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.
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.
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.
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.
enum GNUNET_GenericReturnValue is_message_session_bound(const struct GNUNET_MESSENGER_Message *message)
Returns if the message should be bound to a member session.
Internal representation of the hash map.
An identity key as per LSD0001.
Handle used to access files (and pipes).
A 512-bit hashcode.
struct GNUNET_MESSENGER_ListMessage * next
struct GNUNET_MESSENGER_ListMessage * head
struct GNUNET_MESSENGER_ListMessage * tail
struct GNUNET_MESSENGER_MemberStore * store
struct GNUNET_MESSENGER_MessageId id
struct GNUNET_MESSENGER_MessageKey key
enum GNUNET_MESSENGER_MessageKind kind
The kind of the message.
struct GNUNET_ShortHashCode sender_id
The senders id inside of the room the message was sent in.
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.
struct GNUNET_MESSENGER_SrvMemberSession * next
struct GNUNET_MESSENGER_SrvMemberSession * prev
struct GNUNET_CRYPTO_BlindablePublicKey public_key
A 256-bit hashcode.
Time for absolute times used by GNUnet, in microseconds.
uint64_t abs_value_us
The actual value.