aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTheJackiMonster <thejackimonster@gmail.com>2021-05-24 01:30:17 +0200
committerTheJackiMonster <thejackimonster@gmail.com>2021-06-11 13:47:57 +0200
commitd0eec6097f79c7fb3ea8b5d8bb0dcca1da1f85a6 (patch)
treec0cc57a0f066bc1d3c528323c33903038747eca8 /src
parent2549225b825f34b0dfbe9f4a13f134963f3ba58d (diff)
downloadgnunet-d0eec6097f79c7fb3ea8b5d8bb0dcca1da1f85a6.tar.gz
gnunet-d0eec6097f79c7fb3ea8b5d8bb0dcca1da1f85a6.zip
-moved messenger service out of experimental
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com> -moved out of experimental, included protocol versions into ports and fixed byte-order of 32bit integers in messages Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am4
-rw-r--r--src/include/gnunet_messenger_service.h21
-rw-r--r--src/messenger/gnunet-service-messenger_list_messages.c2
-rw-r--r--src/messenger/gnunet-service-messenger_list_messages.h2
-rw-r--r--src/messenger/gnunet-service-messenger_room.c4
-rw-r--r--src/messenger/gnunet-service-messenger_tunnel.c4
-rw-r--r--src/messenger/messenger_api.c46
-rw-r--r--src/messenger/messenger_api_message.c18
-rw-r--r--src/messenger/messenger_api_room.c36
-rw-r--r--src/messenger/messenger_api_room.h11
-rw-r--r--src/messenger/messenger_api_util.c16
-rw-r--r--src/messenger/messenger_api_util.h14
12 files changed, 165 insertions, 13 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 5fd00e3f5..07b9cf1e9 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -8,8 +8,7 @@ endif
8 8
9if HAVE_EXPERIMENTAL 9if HAVE_EXPERIMENTAL
10 EXP_DIR = \ 10 EXP_DIR = \
11 rps \ 11 rps
12 messenger
13 #abd FTBFS 12 #abd FTBFS
14if HAVE_ABE 13if HAVE_ABE
15 EXP_DIR += \ 14 EXP_DIR += \
@@ -101,5 +100,6 @@ SUBDIRS = \
101 pt \ 100 pt \
102 secretsharing \ 101 secretsharing \
103 reclaim \ 102 reclaim \
103 messenger \
104 $(EXP_DIR) \ 104 $(EXP_DIR) \
105 integration-tests 105 integration-tests
diff --git a/src/include/gnunet_messenger_service.h b/src/include/gnunet_messenger_service.h
index 0576e239f..ad5cc4f12 100644
--- a/src/include/gnunet_messenger_service.h
+++ b/src/include/gnunet_messenger_service.h
@@ -50,6 +50,8 @@ extern "C" {
50 50
51/** 51/**
52 * Version number of GNUnet Messenger API. 52 * Version number of GNUnet Messenger API.
53 *
54 * Current version of the Messenger: 0.1
53 */ 55 */
54#define GNUNET_MESSENGER_VERSION 0x00000001 56#define GNUNET_MESSENGER_VERSION 0x00000001
55 57
@@ -219,6 +221,10 @@ struct GNUNET_MESSENGER_MessageInfo
219 221
220 /** 222 /**
221 * The version of GNUnet Messenger API. 223 * The version of GNUnet Messenger API.
224 *
225 * The sixteen lower bits represent the lower version number while the sixteen higher bits
226 * represent the higher version number. A different higher version number implies imcompatibility
227 * to lower versions while differences in the lower version can still be supported potentially.
222 */ 228 */
223 uint32_t messenger_version; 229 uint32_t messenger_version;
224}; 230};
@@ -672,6 +678,21 @@ void
672GNUNET_MESSENGER_close_room (struct GNUNET_MESSENGER_Room *room); 678GNUNET_MESSENGER_close_room (struct GNUNET_MESSENGER_Room *room);
673 679
674/** 680/**
681 * Searches for a specific <i>contact</i> in a given <i>room</i> and calls a selected <i>callback</i> with a given
682 * closure for each of them containing the contact as a member. The callback will receive a room matching the condition
683 * and the given contact. The function returns the amount of rooms iterated with the given callback.
684 *
685 * @param[in] handle Messenger handle to use
686 * @param[in] contact Contact handle
687 * @param[in] callback Function called for each room
688 * @param[in] cls Closure for the <i>callback</i> handler
689 * @return Amount of rooms iterated
690 */
691int
692GNUNET_MESSENGER_find_rooms (const struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_MESSENGER_Contact *contact,
693 GNUNET_MESSENGER_MemberCallback callback, void *cls);
694
695/**
675 * Get the contact of a member in a <i>room</i> which sent a specific message identified with a given <i>hash</i>. 696 * Get the contact of a member in a <i>room</i> which sent a specific message identified with a given <i>hash</i>.
676 * 697 *
677 * Notice that contacts are independent of rooms but will be removed if all rooms containing these contacts get closed. 698 * Notice that contacts are independent of rooms but will be removed if all rooms containing these contacts get closed.
diff --git a/src/messenger/gnunet-service-messenger_list_messages.c b/src/messenger/gnunet-service-messenger_list_messages.c
index bb6086e41..2666ccdab 100644
--- a/src/messenger/gnunet-service-messenger_list_messages.c
+++ b/src/messenger/gnunet-service-messenger_list_messages.c
@@ -125,7 +125,7 @@ load_list_messages (struct GNUNET_MESSENGER_ListMessages *messages, const char *
125} 125}
126 126
127void 127void
128save_list_messages (struct GNUNET_MESSENGER_ListMessages *messages, const char *path) 128save_list_messages (const struct GNUNET_MESSENGER_ListMessages *messages, const char *path)
129{ 129{
130 GNUNET_assert((messages) && (path)); 130 GNUNET_assert((messages) && (path));
131 131
diff --git a/src/messenger/gnunet-service-messenger_list_messages.h b/src/messenger/gnunet-service-messenger_list_messages.h
index 9ace84cbf..93ec203ea 100644
--- a/src/messenger/gnunet-service-messenger_list_messages.h
+++ b/src/messenger/gnunet-service-messenger_list_messages.h
@@ -104,6 +104,6 @@ load_list_messages (struct GNUNET_MESSENGER_ListMessages *messages, const char *
104 * @param[in] path Path of file 104 * @param[in] path Path of file
105 */ 105 */
106void 106void
107save_list_messages (struct GNUNET_MESSENGER_ListMessages *messages, const char *path); 107save_list_messages (const struct GNUNET_MESSENGER_ListMessages *messages, const char *path);
108 108
109#endif //GNUNET_SERVICE_MESSENGER_LIST_MESSAGES_H 109#endif //GNUNET_SERVICE_MESSENGER_LIST_MESSAGES_H
diff --git a/src/messenger/gnunet-service-messenger_room.c b/src/messenger/gnunet-service-messenger_room.c
index e8fe5b1f3..c3a5e3a4b 100644
--- a/src/messenger/gnunet-service-messenger_room.c
+++ b/src/messenger/gnunet-service-messenger_room.c
@@ -329,7 +329,9 @@ open_room (struct GNUNET_MESSENGER_SrvRoom *room, struct GNUNET_MESSENGER_SrvHan
329 struct GNUNET_MessageHeader, NULL), 329 struct GNUNET_MessageHeader, NULL),
330 GNUNET_MQ_handler_end() }; 330 GNUNET_MQ_handler_end() };
331 331
332 room->port = GNUNET_CADET_open_port (cadet, key, callback_room_connect, room, NULL, callback_tunnel_disconnect, 332 struct GNUNET_HashCode port;
333 convert_messenger_key_to_port(key, &port);
334 room->port = GNUNET_CADET_open_port (cadet, &port, callback_room_connect, room, NULL, callback_tunnel_disconnect,
333 handlers); 335 handlers);
334 336
335 if (room->port) 337 if (room->port)
diff --git a/src/messenger/gnunet-service-messenger_tunnel.c b/src/messenger/gnunet-service-messenger_tunnel.c
index 80d8dfa5e..b9d063813 100644
--- a/src/messenger/gnunet-service-messenger_tunnel.c
+++ b/src/messenger/gnunet-service-messenger_tunnel.c
@@ -235,7 +235,9 @@ connect_tunnel (struct GNUNET_MESSENGER_SrvTunnel *tunnel)
235 struct GNUNET_MessageHeader, NULL), 235 struct GNUNET_MessageHeader, NULL),
236 GNUNET_MQ_handler_end() }; 236 GNUNET_MQ_handler_end() };
237 237
238 tunnel->channel = GNUNET_CADET_channel_create (cadet, tunnel, door, key, NULL, callback_tunnel_disconnect, handlers); 238 struct GNUNET_HashCode port;
239 convert_messenger_key_to_port(key, &port);
240 tunnel->channel = GNUNET_CADET_channel_create (cadet, tunnel, door, &port, NULL, callback_tunnel_disconnect, handlers);
239 241
240 return GNUNET_YES; 242 return GNUNET_YES;
241} 243}
diff --git a/src/messenger/messenger_api.c b/src/messenger/messenger_api.c
index b42bb40cc..0536a3154 100644
--- a/src/messenger/messenger_api.c
+++ b/src/messenger/messenger_api.c
@@ -574,6 +574,50 @@ GNUNET_MESSENGER_close_room (struct GNUNET_MESSENGER_Room *room)
574 send_close_room (room->handle, room); 574 send_close_room (room->handle, room);
575} 575}
576 576
577struct GNUNET_MESSENGER_RoomFind
578{
579 struct GNUNET_MESSENGER_Contact *contact;
580 GNUNET_MESSENGER_MemberCallback callback;
581 size_t counter;
582 void *cls;
583};
584
585static int
586iterate_find_room (void* cls, const struct GNUNET_HashCode *key, void *value)
587{
588 struct GNUNET_MESSENGER_RoomFind *find = cls;
589 struct GNUNET_MESSENGER_Room *room = value;
590
591 if ((find->counter > 0) && ((!find->contact) || (GNUNET_YES == find_room_member(room, find->contact))))
592 {
593 find->counter--;
594
595 if (!find->callback)
596 return GNUNET_YES;
597
598 return find->callback(find->cls, room, find->contact);
599 }
600 else
601 return GNUNET_NO;
602}
603
604int
605GNUNET_MESSENGER_find_rooms (const struct GNUNET_MESSENGER_Handle *handle, const struct GNUNET_MESSENGER_Contact *contact,
606 GNUNET_MESSENGER_MemberCallback callback, void *cls)
607{
608 if (!handle)
609 return GNUNET_SYSERR;
610
611 struct GNUNET_MESSENGER_RoomFind find;
612
613 find.contact = contact;
614 find.callback = callback;
615 find.counter = (contact? contact->rc : SIZE_MAX);
616 find.cls = cls;
617
618 return GNUNET_CONTAINER_multihashmap_iterate(handle->rooms, iterate_find_room, &find);
619}
620
577struct GNUNET_MESSENGER_Contact* 621struct GNUNET_MESSENGER_Contact*
578GNUNET_MESSENGER_get_sender (const struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash) 622GNUNET_MESSENGER_get_sender (const struct GNUNET_MESSENGER_Room *room, const struct GNUNET_HashCode *hash)
579{ 623{
@@ -693,7 +737,7 @@ GNUNET_MESSENGER_get_message (const struct GNUNET_MESSENGER_Room *room, const st
693 737
694int 738int
695GNUNET_MESSENGER_iterate_members (struct GNUNET_MESSENGER_Room *room, GNUNET_MESSENGER_MemberCallback callback, 739GNUNET_MESSENGER_iterate_members (struct GNUNET_MESSENGER_Room *room, GNUNET_MESSENGER_MemberCallback callback,
696 void* cls) 740 void *cls)
697{ 741{
698 if (!room) 742 if (!room)
699 return GNUNET_SYSERR; 743 return GNUNET_SYSERR;
diff --git a/src/messenger/messenger_api_message.c b/src/messenger/messenger_api_message.c
index d65b80576..facd7b093 100644
--- a/src/messenger/messenger_api_message.c
+++ b/src/messenger/messenger_api_message.c
@@ -373,11 +373,14 @@ static void
373encode_message_body (enum GNUNET_MESSENGER_MessageKind kind, const struct GNUNET_MESSENGER_MessageBody *body, 373encode_message_body (enum GNUNET_MESSENGER_MessageKind kind, const struct GNUNET_MESSENGER_MessageBody *body,
374 uint16_t length, char *buffer, uint16_t offset) 374 uint16_t length, char *buffer, uint16_t offset)
375{ 375{
376 uint32_t version;
376 switch (kind) 377 switch (kind)
377 { 378 {
378 case GNUNET_MESSENGER_KIND_INFO: 379 case GNUNET_MESSENGER_KIND_INFO:
380 version = GNUNET_htobe32(body->info.messenger_version);
381
379 encode_step_key(buffer, offset, &(body->info.host_key), length); 382 encode_step_key(buffer, offset, &(body->info.host_key), length);
380 encode_step(buffer, offset, &(body->info.messenger_version)); 383 encode_step(buffer, offset, &version);
381 break; 384 break;
382 case GNUNET_MESSENGER_KIND_JOIN: 385 case GNUNET_MESSENGER_KIND_JOIN:
383 encode_step_key(buffer, offset, &(body->join.key), length); 386 encode_step_key(buffer, offset, &(body->join.key), length);
@@ -452,7 +455,7 @@ encode_message (const struct GNUNET_MESSENGER_Message *message, uint16_t length,
452 if (GNUNET_YES == include_signature) 455 if (GNUNET_YES == include_signature)
453 encode_step_signature(buffer, offset, &(message->header.signature), length); 456 encode_step_signature(buffer, offset, &(message->header.signature), length);
454 457
455 const kind_t kind = (kind_t) message->header.kind; 458 const kind_t kind = GNUNET_htobe32((kind_t) message->header.kind);
456 459
457 encode_step(buffer, offset, &(message->header.timestamp)); 460 encode_step(buffer, offset, &(message->header.timestamp));
458 encode_step(buffer, offset, &(message->header.sender_id)); 461 encode_step(buffer, offset, &(message->header.sender_id));
@@ -468,7 +471,7 @@ encode_short_message (const struct GNUNET_MESSENGER_ShortMessage *message, uint1
468 struct GNUNET_HashCode hash; 471 struct GNUNET_HashCode hash;
469 uint16_t offset = sizeof(hash); 472 uint16_t offset = sizeof(hash);
470 473
471 const kind_t kind = (kind_t) message->kind; 474 const kind_t kind = GNUNET_htobe32((kind_t) message->kind);
472 475
473 encode_step(buffer, offset, &kind); 476 encode_step(buffer, offset, &kind);
474 477
@@ -526,11 +529,14 @@ decode_message_body (enum GNUNET_MESSENGER_MessageKind *kind, struct GNUNET_MESS
526 529
527 length -= padding; 530 length -= padding;
528 531
532 uint32_t version;
529 switch (*kind) 533 switch (*kind)
530 { 534 {
531 case GNUNET_MESSENGER_KIND_INFO: { 535 case GNUNET_MESSENGER_KIND_INFO: {
532 decode_step_key(buffer, offset, &(body->info.host_key), length); 536 decode_step_key(buffer, offset, &(body->info.host_key), length);
533 decode_step(buffer, offset, &(body->info.messenger_version)); 537 decode_step(buffer, offset, &version);
538
539 body->info.messenger_version = GNUNET_be32toh(version);
534 break; 540 break;
535 } case GNUNET_MESSENGER_KIND_JOIN: { 541 } case GNUNET_MESSENGER_KIND_JOIN: {
536 decode_step_key(buffer, offset, &(body->join.key), length); 542 decode_step_key(buffer, offset, &(body->join.key), length);
@@ -618,7 +624,7 @@ decode_message (struct GNUNET_MESSENGER_Message *message, uint16_t length, const
618 decode_step(buffer, offset, &(message->header.previous)); 624 decode_step(buffer, offset, &(message->header.previous));
619 decode_step(buffer, offset, &kind); 625 decode_step(buffer, offset, &kind);
620 626
621 message->header.kind = (enum GNUNET_MESSENGER_MessageKind) kind; 627 message->header.kind = (enum GNUNET_MESSENGER_MessageKind) GNUNET_be32toh(kind);
622 628
623 if (count < get_message_kind_size (message->header.kind)) 629 if (count < get_message_kind_size (message->header.kind))
624 return GNUNET_NO; 630 return GNUNET_NO;
@@ -655,7 +661,7 @@ decode_short_message (struct GNUNET_MESSENGER_ShortMessage *message, uint16_t le
655 661
656 decode_step(buffer, offset, &kind); 662 decode_step(buffer, offset, &kind);
657 663
658 message->kind = (enum GNUNET_MESSENGER_MessageKind) kind; 664 message->kind = (enum GNUNET_MESSENGER_MessageKind) GNUNET_be32toh(kind);
659 665
660 if (length < get_short_message_size (message, GNUNET_NO)) 666 if (length < get_short_message_size (message, GNUNET_NO))
661 return GNUNET_NO; 667 return GNUNET_NO;
diff --git a/src/messenger/messenger_api_room.c b/src/messenger/messenger_api_room.c
index 5b7edee60..6779984bd 100644
--- a/src/messenger/messenger_api_room.c
+++ b/src/messenger/messenger_api_room.c
@@ -305,3 +305,39 @@ iterate_room_members (struct GNUNET_MESSENGER_Room *room, GNUNET_MESSENGER_Membe
305 305
306 return GNUNET_CONTAINER_multishortmap_iterate(room->members, iterate_local_members, &call); 306 return GNUNET_CONTAINER_multishortmap_iterate(room->members, iterate_local_members, &call);
307} 307}
308
309struct GNUNET_MESSENGER_MemberFind
310{
311 struct GNUNET_MESSENGER_Contact *contact;
312 int result;
313};
314
315static int
316iterate_find_member (void* cls, const struct GNUNET_ShortHashCode *key, void *value)
317{
318 struct GNUNET_MESSENGER_MemberFind *find = cls;
319 struct GNUNET_MESSENGER_Contact *contact = value;
320
321 if (contact == find->contact)
322 {
323 find->result = GNUNET_YES;
324 return GNUNET_NO;
325 }
326
327 return GNUNET_YES;
328}
329
330int
331find_room_member (const struct GNUNET_MESSENGER_Room *room, const struct GNUNET_MESSENGER_Contact *contact)
332{
333 GNUNET_assert(room);
334
335 struct GNUNET_MESSENGER_MemberFind find;
336
337 find.contact = contact;
338 find.result = GNUNET_NO;
339
340 GNUNET_CONTAINER_multishortmap_iterate(room->members, iterate_find_member, &find);
341
342 return find.result;
343}
diff --git a/src/messenger/messenger_api_room.h b/src/messenger/messenger_api_room.h
index eb41cf740..634052272 100644
--- a/src/messenger/messenger_api_room.h
+++ b/src/messenger/messenger_api_room.h
@@ -126,4 +126,15 @@ int
126iterate_room_members (struct GNUNET_MESSENGER_Room *room, GNUNET_MESSENGER_MemberCallback callback, 126iterate_room_members (struct GNUNET_MESSENGER_Room *room, GNUNET_MESSENGER_MemberCallback callback,
127 void* cls); 127 void* cls);
128 128
129/**
130 * Checks through all members of a given <i>room</i> if a specific <i>contact</i> is found and
131 * returns a result depending on that.
132 *
133 * @param[in] room Room
134 * @param[in] contact
135 * @return #GNUNET_YES if found, otherwise #GNUNET_NO
136 */
137int
138find_room_member (const struct GNUNET_MESSENGER_Room *room, const struct GNUNET_MESSENGER_Contact *contact);
139
129#endif //GNUNET_MESSENGER_API_ROOM_H 140#endif //GNUNET_MESSENGER_API_ROOM_H
diff --git a/src/messenger/messenger_api_util.c b/src/messenger/messenger_api_util.c
index 68e15d789..4ad00c45e 100644
--- a/src/messenger/messenger_api_util.c
+++ b/src/messenger/messenger_api_util.c
@@ -82,3 +82,19 @@ get_anonymous_public_key ()
82 82
83 return &public_key; 83 return &public_key;
84} 84}
85
86void
87convert_messenger_key_to_port(const struct GNUNET_HashCode *key, struct GNUNET_HashCode *port)
88{
89 static uint32_t version_value = 0;
90 static struct GNUNET_HashCode version;
91
92 if (!version_value) {
93 version_value = (uint32_t) (GNUNET_MESSENGER_VERSION);
94 version_value = ((version_value >> 16) & 0xFFFF);
95 version_value = GNUNET_htole32(version_value);
96 GNUNET_CRYPTO_hash(&version_value, sizeof(version_value), &version);
97 }
98
99 GNUNET_CRYPTO_hash_sum(key, &version, port);
100}
diff --git a/src/messenger/messenger_api_util.h b/src/messenger/messenger_api_util.h
index c70a3601f..af562a1e8 100644
--- a/src/messenger/messenger_api_util.h
+++ b/src/messenger/messenger_api_util.h
@@ -32,6 +32,7 @@
32#include "gnunet_crypto_lib.h" 32#include "gnunet_crypto_lib.h"
33#include "gnunet_disk_lib.h" 33#include "gnunet_disk_lib.h"
34#include "gnunet_identity_service.h" 34#include "gnunet_identity_service.h"
35#include "gnunet_messenger_service.h"
35 36
36/** 37/**
37 * Starts an urgent task to close a CADET channel asynchronously. 38 * Starts an urgent task to close a CADET channel asynchronously.
@@ -61,4 +62,17 @@ generate_free_member_id (struct GNUNET_ShortHashCode *id, const struct GNUNET_CO
61const struct GNUNET_IDENTITY_PublicKey* 62const struct GNUNET_IDENTITY_PublicKey*
62get_anonymous_public_key (); 63get_anonymous_public_key ();
63 64
65/**
66 * Converts a Messenger service key of a room to the specific port which
67 * gets used for the CADET channels.
68 *
69 * The port includes upper bits of the #GNUNET_MESSENGER_VERSION to
70 * reduce the chance of incompatible connections.
71 *
72 * @param[in] key Messenger service room key
73 * @param[out] port CADET service port
74 */
75void
76convert_messenger_key_to_port(const struct GNUNET_HashCode *key, struct GNUNET_HashCode *port);
77
64#endif //GNUNET_SERVICE_MESSENGER_UTIL_H 78#endif //GNUNET_SERVICE_MESSENGER_UTIL_H