aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheJackiMonster <thejackimonster@gmail.com>2024-01-20 00:45:44 +0100
committerTheJackiMonster <thejackimonster@gmail.com>2024-01-20 00:45:44 +0100
commit75023517a747083670642ed489fc3b34729f6113 (patch)
treea6c439d7b169194d7314ce9aea851296c5d50d14
parent63cf392a58f9e18e659df727a4fa052d38f62bf5 (diff)
downloadgnunet-75023517a747083670642ed489fc3b34729f6113.tar.gz
gnunet-75023517a747083670642ed489fc3b34729f6113.zip
MESSENGER: Implement automatic transcription of private messages
Signed-off-by: TheJackiMonster <thejackimonster@gmail.com>
-rw-r--r--src/include/gnunet_messenger_service.h2
-rw-r--r--src/service/messenger/messenger_api.c93
-rw-r--r--src/service/messenger/messenger_api_message.c36
-rw-r--r--src/service/messenger/messenger_api_message.h12
-rw-r--r--src/service/messenger/messenger_api_queue_messages.c21
-rw-r--r--src/service/messenger/messenger_api_queue_messages.h10
6 files changed, 128 insertions, 46 deletions
diff --git a/src/include/gnunet_messenger_service.h b/src/include/gnunet_messenger_service.h
index 497a430c2..4d3f4419e 100644
--- a/src/include/gnunet_messenger_service.h
+++ b/src/include/gnunet_messenger_service.h
@@ -936,7 +936,7 @@ GNUNET_MESSENGER_contact_get_id (const struct GNUNET_MESSENGER_Contact *contact)
936 */ 936 */
937void 937void
938GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room, 938GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room,
939 struct GNUNET_MESSENGER_Message *message, 939 const struct GNUNET_MESSENGER_Message *message,
940 const struct GNUNET_MESSENGER_Contact *contact); 940 const struct GNUNET_MESSENGER_Contact *contact);
941 941
942/** 942/**
diff --git a/src/service/messenger/messenger_api.c b/src/service/messenger/messenger_api.c
index 9f31ebb00..269fb2999 100644
--- a/src/service/messenger/messenger_api.c
+++ b/src/service/messenger/messenger_api.c
@@ -182,7 +182,8 @@ handle_room_sync (void *cls,
182 182
183static void 183static void
184enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room, 184enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room,
185 struct GNUNET_MESSENGER_Message *message); 185 struct GNUNET_MESSENGER_Message *message,
186 struct GNUNET_MESSENGER_Message *transcript);
186 187
187static void 188static void
188handle_member_id (void *cls, 189handle_member_id (void *cls,
@@ -218,8 +219,7 @@ handle_member_id (void *cls,
218 if (! message) 219 if (! message)
219 return; 220 return;
220 221
221 enqueue_message_to_room (room, message); 222 enqueue_message_to_room (room, message, NULL);
222 destroy_message (message);
223} 223}
224 224
225 225
@@ -367,8 +367,7 @@ handle_miss_message (void *cls,
367 if (! message) 367 if (! message)
368 return; 368 return;
369 369
370 enqueue_message_to_room (room, message); 370 enqueue_message_to_room (room, message, NULL);
371 destroy_message (message);
372} 371}
373 372
374 373
@@ -664,6 +663,7 @@ GNUNET_MESSENGER_disconnect (struct GNUNET_MESSENGER_Handle *handle)
664static void 663static void
665send_message_to_room (struct GNUNET_MESSENGER_Room *room, 664send_message_to_room (struct GNUNET_MESSENGER_Room *room,
666 struct GNUNET_MESSENGER_Message *message, 665 struct GNUNET_MESSENGER_Message *message,
666 struct GNUNET_MESSENGER_Message *transcript,
667 const struct GNUNET_CRYPTO_PrivateKey *key) 667 const struct GNUNET_CRYPTO_PrivateKey *key)
668{ 668{
669 const struct GNUNET_ShortHashCode *sender_id = get_room_sender_id (room); 669 const struct GNUNET_ShortHashCode *sender_id = get_room_sender_id (room);
@@ -697,6 +697,9 @@ send_message_to_room (struct GNUNET_MESSENGER_Room *room,
697 hash_message (message, msg_length, msg_buffer, &hash); 697 hash_message (message, msg_length, msg_buffer, &hash);
698 sign_message (message, msg_length, msg_buffer, &hash, key); 698 sign_message (message, msg_length, msg_buffer, &hash, key);
699 699
700 if (transcript)
701 GNUNET_memcpy (&(transcript->body.transcript.hash), &hash, sizeof(hash));
702
700 GNUNET_memcpy (&(room->last_message), &hash, sizeof(room->last_message)); 703 GNUNET_memcpy (&(room->last_message), &hash, sizeof(room->last_message));
701 704
702 GNUNET_MQ_send (room->handle->mq, env); 705 GNUNET_MQ_send (room->handle->mq, env);
@@ -708,7 +711,8 @@ send_message_to_room (struct GNUNET_MESSENGER_Room *room,
708 711
709static void 712static void
710enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room, 713enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room,
711 struct GNUNET_MESSENGER_Message *message) 714 struct GNUNET_MESSENGER_Message *message,
715 struct GNUNET_MESSENGER_Message *transcript)
712{ 716{
713 const struct GNUNET_CRYPTO_PrivateKey *key = get_handle_key (room->handle); 717 const struct GNUNET_CRYPTO_PrivateKey *key = get_handle_key (room->handle);
714 enum GNUNET_GenericReturnValue priority; 718 enum GNUNET_GenericReturnValue priority;
@@ -723,7 +727,7 @@ enqueue_message_to_room (struct GNUNET_MESSENGER_Room *room,
723 break; 727 break;
724 } 728 }
725 729
726 enqueue_to_messages (&(room->queue), key, message, priority); 730 enqueue_to_messages (&(room->queue), key, message, transcript, priority);
727 731
728 if (GNUNET_YES != is_room_available (room)) 732 if (GNUNET_YES != is_room_available (room))
729 return; 733 return;
@@ -739,6 +743,8 @@ static enum GNUNET_GenericReturnValue
739dequeue_messages_from_room (struct GNUNET_MESSENGER_Room *room) 743dequeue_messages_from_room (struct GNUNET_MESSENGER_Room *room)
740{ 744{
741 struct GNUNET_MESSENGER_Message *message = NULL; 745 struct GNUNET_MESSENGER_Message *message = NULL;
746 struct GNUNET_MESSENGER_Message *transcript = NULL;
747 struct GNUNET_CRYPTO_PublicKey pubkey;
742 struct GNUNET_CRYPTO_PrivateKey key; 748 struct GNUNET_CRYPTO_PrivateKey key;
743 749
744 if (GNUNET_YES != is_room_available (room)) 750 if (GNUNET_YES != is_room_available (room))
@@ -748,10 +754,31 @@ dequeue_messages_from_room (struct GNUNET_MESSENGER_Room *room)
748 if (message) 754 if (message)
749 destroy_message (message); 755 destroy_message (message);
750 756
751 message = dequeue_from_messages (&(room->queue), &key); 757 message = dequeue_from_messages (&(room->queue), &key, &transcript);
758
759 if (!message)
760 {
761 message = transcript;
762 continue;
763 }
764
765 send_message_to_room (room, message, transcript, &key);
766
767 if (!transcript)
768 continue;
769
770 GNUNET_CRYPTO_key_get_public(&key, &pubkey);
771
772 if (GNUNET_YES == encrypt_message(transcript, &pubkey))
773 send_message_to_room (room, transcript, NULL, &key);
774 else
775 {
776 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
777 "Sending transcript aborted: Encryption failed!\n");
778
779 destroy_message (transcript);
780 }
752 781
753 if (message)
754 send_message_to_room (room, message, &key);
755 } while (message); 782 } while (message);
756 783
757 return GNUNET_YES; 784 return GNUNET_YES;
@@ -788,8 +815,7 @@ iterate_send_name_to_room (void *cls,
788 if (! message) 815 if (! message)
789 return GNUNET_NO; 816 return GNUNET_NO;
790 817
791 enqueue_message_to_room (room, message); 818 enqueue_message_to_room (room, message, NULL);
792 destroy_message (message);
793 return GNUNET_YES; 819 return GNUNET_YES;
794} 820}
795 821
@@ -839,8 +865,7 @@ iterate_send_key_to_room (void *cls,
839 if (! message) 865 if (! message)
840 return GNUNET_NO; 866 return GNUNET_NO;
841 867
842 enqueue_message_to_room (room, message); 868 enqueue_message_to_room (room, message, NULL);
843 destroy_message (message);
844 return GNUNET_YES; 869 return GNUNET_YES;
845} 870}
846 871
@@ -937,10 +962,7 @@ GNUNET_MESSENGER_close_room (struct GNUNET_MESSENGER_Room *room)
937 struct GNUNET_MESSENGER_Message *message = create_message_leave (); 962 struct GNUNET_MESSENGER_Message *message = create_message_leave ();
938 963
939 if (message) 964 if (message)
940 { 965 enqueue_message_to_room (room, message, NULL);
941 enqueue_message_to_room (room, message);
942 destroy_message (message);
943 }
944} 966}
945 967
946 968
@@ -1057,8 +1079,9 @@ send_message_to_room_with_key (struct GNUNET_MESSENGER_Room *room,
1057 struct GNUNET_MESSENGER_Message *message, 1079 struct GNUNET_MESSENGER_Message *message,
1058 const struct GNUNET_CRYPTO_PublicKey *public_key) 1080 const struct GNUNET_CRYPTO_PublicKey *public_key)
1059{ 1081{
1082 struct GNUNET_MESSENGER_Message *transcript = NULL;
1083
1060 char *original_name; 1084 char *original_name;
1061 char *changed_name = NULL;
1062 1085
1063 if (GNUNET_MESSENGER_KIND_NAME != message->header.kind) 1086 if (GNUNET_MESSENGER_KIND_NAME != message->header.kind)
1064 goto skip_naming; 1087 goto skip_naming;
@@ -1073,44 +1096,37 @@ send_message_to_room_with_key (struct GNUNET_MESSENGER_Room *room,
1073 if ((handle_name) && (GNUNET_YES == room->use_handle_name) && 1096 if ((handle_name) && (GNUNET_YES == room->use_handle_name) &&
1074 ((! original_name) || (0 == strlen (original_name)))) 1097 ((! original_name) || (0 == strlen (original_name))))
1075 { 1098 {
1076 changed_name = GNUNET_strdup (handle_name); 1099 if (original_name)
1077 message->body.name.name = changed_name; 1100 GNUNET_free (original_name);
1101
1102 message->body.name.name = GNUNET_strdup (handle_name);
1078 } 1103 }
1079 1104
1080skip_naming: 1105skip_naming:
1081 if (public_key) 1106 if (public_key)
1082 { 1107 {
1083 struct GNUNET_MESSENGER_Message *original = message; 1108 transcript = transcribe_message (message, public_key);
1084 message = copy_message (original);
1085 1109
1086 if (GNUNET_YES != encrypt_message (message, public_key)) 1110 if (GNUNET_YES != encrypt_message (message, public_key))
1087 { 1111 {
1088 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 1112 GNUNET_log (GNUNET_ERROR_TYPE_ERROR,
1089 "Sending message aborted: Encryption failed!\n"); 1113 "Sending message aborted: Encryption failed!\n");
1114
1115 if (transcript)
1116 destroy_message(transcript);
1090 1117
1091 destroy_message (message); 1118 destroy_message (message);
1092 message = original; 1119 return;
1093
1094 goto reset_naming;
1095 } 1120 }
1096 } 1121 }
1097 1122
1098 enqueue_message_to_room (room, message); 1123 enqueue_message_to_room (room, message, transcript);
1099
1100reset_naming:
1101 if (changed_name)
1102 GNUNET_free (changed_name);
1103
1104 if (GNUNET_MESSENGER_KIND_NAME != message->header.kind)
1105 return;
1106
1107 message->body.name.name = original_name;
1108} 1124}
1109 1125
1110 1126
1111void 1127void
1112GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room, 1128GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room,
1113 struct GNUNET_MESSENGER_Message *message, 1129 const struct GNUNET_MESSENGER_Message *message,
1114 const struct GNUNET_MESSENGER_Contact *contact) 1130 const struct GNUNET_MESSENGER_Contact *contact)
1115{ 1131{
1116 if ((! room) || (! message)) 1132 if ((! room) || (! message))
@@ -1148,7 +1164,7 @@ GNUNET_MESSENGER_send_message (struct GNUNET_MESSENGER_Room *room,
1148 else 1164 else
1149 public_key = NULL; 1165 public_key = NULL;
1150 1166
1151 send_message_to_room_with_key (room, message, public_key); 1167 send_message_to_room_with_key (room, copy_message(message), public_key);
1152} 1168}
1153 1169
1154 1170
@@ -1261,5 +1277,4 @@ GNUNET_MESSENGER_send_ticket (struct GNUNET_MESSENGER_Room *room,
1261 } 1277 }
1262 1278
1263 send_message_to_room_with_key (room, message, &(ticket->audience)); 1279 send_message_to_room_with_key (room, message, &(ticket->audience));
1264 destroy_message (message);
1265} 1280}
diff --git a/src/service/messenger/messenger_api_message.c b/src/service/messenger/messenger_api_message.c
index c7762d925..181431189 100644
--- a/src/service/messenger/messenger_api_message.c
+++ b/src/service/messenger/messenger_api_message.c
@@ -25,6 +25,7 @@
25 25
26#include "messenger_api_message.h" 26#include "messenger_api_message.h"
27 27
28#include "gnunet_common.h"
28#include "gnunet_messenger_service.h" 29#include "gnunet_messenger_service.h"
29#include "gnunet_signatures.h" 30#include "gnunet_signatures.h"
30 31
@@ -1085,6 +1086,39 @@ decrypt_message (struct GNUNET_MESSENGER_Message *message,
1085} 1086}
1086 1087
1087 1088
1089struct GNUNET_MESSENGER_Message*
1090transcribe_message (const struct GNUNET_MESSENGER_Message *message,
1091 const struct GNUNET_CRYPTO_PublicKey *key)
1092{
1093 GNUNET_assert ((message) && (key));
1094
1095 struct GNUNET_MESSENGER_Message *transcript = create_message(
1096 GNUNET_MESSENGER_KIND_TRANSCRIPT);
1097
1098 if (!transcript)
1099 {
1100 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Transcribing message failed!\n");
1101 return NULL;
1102 }
1103
1104 GNUNET_memcpy(&(transcript->body.transcript.key), key, sizeof(transcript->body.transcript.key));
1105
1106 struct GNUNET_MESSENGER_ShortMessage shortened;
1107
1108 fold_short_message (message, &shortened);
1109
1110 const uint16_t data_length = get_short_message_size (
1111 &shortened, GNUNET_YES);
1112
1113 transcript->body.transcript.data = GNUNET_malloc (data_length);
1114 transcript->body.transcript.length = data_length;
1115
1116 encode_short_message (&shortened, data_length, transcript->body.transcript.data);
1117
1118 return transcript;
1119}
1120
1121
1088struct GNUNET_MQ_Envelope* 1122struct GNUNET_MQ_Envelope*
1089pack_message (struct GNUNET_MESSENGER_Message *message, 1123pack_message (struct GNUNET_MESSENGER_Message *message,
1090 struct GNUNET_HashCode *hash, 1124 struct GNUNET_HashCode *hash,
@@ -1197,7 +1231,7 @@ is_service_message (const struct GNUNET_MESSENGER_Message *message)
1197 case GNUNET_MESSENGER_KIND_TICKET: 1231 case GNUNET_MESSENGER_KIND_TICKET:
1198 return GNUNET_NO; 1232 return GNUNET_NO;
1199 case GNUNET_MESSENGER_KIND_TRANSCRIPT: 1233 case GNUNET_MESSENGER_KIND_TRANSCRIPT:
1200 return GNUNET_YES; // Allow access to self encrypted messages! 1234 return GNUNET_NO;
1201 case GNUNET_MESSENGER_KIND_TAG: 1235 case GNUNET_MESSENGER_KIND_TAG:
1202 return GNUNET_NO; 1236 return GNUNET_NO;
1203 default: 1237 default:
diff --git a/src/service/messenger/messenger_api_message.h b/src/service/messenger/messenger_api_message.h
index a9e33ddc2..afcd2deec 100644
--- a/src/service/messenger/messenger_api_message.h
+++ b/src/service/messenger/messenger_api_message.h
@@ -244,6 +244,18 @@ enum GNUNET_GenericReturnValue
244decrypt_message (struct GNUNET_MESSENGER_Message *message, 244decrypt_message (struct GNUNET_MESSENGER_Message *message,
245 const struct GNUNET_CRYPTO_PrivateKey *key); 245 const struct GNUNET_CRYPTO_PrivateKey *key);
246 246
247/**
248 * Transcribes a <i>message</i> as a new transcript message using a given public
249 * <i>key</i> from the receipient of the encrypted message content.
250 *
251 * @param[in] message Message
252 * @param[in] key Public key
253 * @return Message transcript
254 */
255struct GNUNET_MESSENGER_Message*
256transcribe_message (const struct GNUNET_MESSENGER_Message *message,
257 const struct GNUNET_CRYPTO_PublicKey *key);
258
247typedef void (*GNUNET_MESSENGER_SignFunction)( 259typedef void (*GNUNET_MESSENGER_SignFunction)(
248 const void *cls, 260 const void *cls,
249 struct GNUNET_MESSENGER_Message *message, 261 struct GNUNET_MESSENGER_Message *message,
diff --git a/src/service/messenger/messenger_api_queue_messages.c b/src/service/messenger/messenger_api_queue_messages.c
index 4b153a524..876bed939 100644
--- a/src/service/messenger/messenger_api_queue_messages.c
+++ b/src/service/messenger/messenger_api_queue_messages.c
@@ -25,6 +25,7 @@
25 25
26#include "messenger_api_queue_messages.h" 26#include "messenger_api_queue_messages.h"
27 27
28#include "gnunet_messenger_service.h"
28#include "messenger_api_message.h" 29#include "messenger_api_message.h"
29 30
30void 31void
@@ -51,6 +52,9 @@ clear_queue_messages (struct GNUNET_MESSENGER_QueueMessages *messages)
51 if (element->message) 52 if (element->message)
52 destroy_message (element->message); 53 destroy_message (element->message);
53 54
55 if (element->transcript)
56 destroy_message (element->transcript);
57
54 GNUNET_free (element); 58 GNUNET_free (element);
55 } 59 }
56 60
@@ -62,7 +66,8 @@ clear_queue_messages (struct GNUNET_MESSENGER_QueueMessages *messages)
62void 66void
63enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages, 67enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
64 const struct GNUNET_CRYPTO_PrivateKey *sender, 68 const struct GNUNET_CRYPTO_PrivateKey *sender,
65 const struct GNUNET_MESSENGER_Message *message, 69 struct GNUNET_MESSENGER_Message *message,
70 struct GNUNET_MESSENGER_Message *transcript,
66 enum GNUNET_GenericReturnValue priority) 71 enum GNUNET_GenericReturnValue priority)
67{ 72{
68 GNUNET_assert ((messages) && (message)); 73 GNUNET_assert ((messages) && (message));
@@ -73,7 +78,8 @@ enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
73 if (! element) 78 if (! element)
74 return; 79 return;
75 80
76 element->message = copy_message (message); 81 element->message = message;
82 element->transcript = transcript;
77 83
78 if (sender) 84 if (sender)
79 GNUNET_memcpy (&(element->sender), sender, sizeof (element->sender)); 85 GNUNET_memcpy (&(element->sender), sender, sizeof (element->sender));
@@ -93,17 +99,26 @@ enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
93 99
94struct GNUNET_MESSENGER_Message* 100struct GNUNET_MESSENGER_Message*
95dequeue_from_messages (struct GNUNET_MESSENGER_QueueMessages *messages, 101dequeue_from_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
96 struct GNUNET_CRYPTO_PrivateKey *sender) 102 struct GNUNET_CRYPTO_PrivateKey *sender,
103 struct GNUNET_MESSENGER_Message **transcript)
97{ 104{
98 GNUNET_assert (messages); 105 GNUNET_assert (messages);
99 106
100 struct GNUNET_MESSENGER_QueueMessage *element = messages->head; 107 struct GNUNET_MESSENGER_QueueMessage *element = messages->head;
101 108
102 if (! element) 109 if (! element)
110 {
111 if (transcript)
112 *transcript = NULL;
113
103 return NULL; 114 return NULL;
115 }
104 116
105 struct GNUNET_MESSENGER_Message *message = element->message; 117 struct GNUNET_MESSENGER_Message *message = element->message;
106 118
119 if (transcript)
120 *transcript = element->transcript;
121
107 GNUNET_CONTAINER_DLL_remove (messages->head, messages->tail, element); 122 GNUNET_CONTAINER_DLL_remove (messages->head, messages->tail, element);
108 123
109 if (sender) 124 if (sender)
diff --git a/src/service/messenger/messenger_api_queue_messages.h b/src/service/messenger/messenger_api_queue_messages.h
index 416c91a7a..0512e2f71 100644
--- a/src/service/messenger/messenger_api_queue_messages.h
+++ b/src/service/messenger/messenger_api_queue_messages.h
@@ -34,7 +34,9 @@ struct GNUNET_MESSENGER_QueueMessage
34 struct GNUNET_MESSENGER_QueueMessage *next; 34 struct GNUNET_MESSENGER_QueueMessage *next;
35 35
36 struct GNUNET_CRYPTO_PrivateKey sender; 36 struct GNUNET_CRYPTO_PrivateKey sender;
37
37 struct GNUNET_MESSENGER_Message *message; 38 struct GNUNET_MESSENGER_Message *message;
39 struct GNUNET_MESSENGER_Message *transcript;
38}; 40};
39 41
40struct GNUNET_MESSENGER_QueueMessages 42struct GNUNET_MESSENGER_QueueMessages
@@ -66,12 +68,14 @@ clear_queue_messages (struct GNUNET_MESSENGER_QueueMessages *messages);
66 * @param[in,out] messages Queue of messages 68 * @param[in,out] messages Queue of messages
67 * @param[in] sender Private sender key 69 * @param[in] sender Private sender key
68 * @param[in] message Message 70 * @param[in] message Message
71 * @param[in] transcript Message transcript
69 * @param[in] priority Whether the message has priority 72 * @param[in] priority Whether the message has priority
70 */ 73 */
71void 74void
72enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages, 75enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
73 const struct GNUNET_CRYPTO_PrivateKey *sender, 76 const struct GNUNET_CRYPTO_PrivateKey *sender,
74 const struct GNUNET_MESSENGER_Message *message, 77 struct GNUNET_MESSENGER_Message *message,
78 struct GNUNET_MESSENGER_Message *transcript,
75 enum GNUNET_GenericReturnValue priority); 79 enum GNUNET_GenericReturnValue priority);
76 80
77/** 81/**
@@ -79,10 +83,12 @@ enqueue_to_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
79 * 83 *
80 * @param[in,out] messages Queue of messages 84 * @param[in,out] messages Queue of messages
81 * @param[out] sender Private sender key 85 * @param[out] sender Private sender key
86 * @param[out] transcript Message transcript
82 * @return Message from front or NULL 87 * @return Message from front or NULL
83 */ 88 */
84struct GNUNET_MESSENGER_Message* 89struct GNUNET_MESSENGER_Message*
85dequeue_from_messages (struct GNUNET_MESSENGER_QueueMessages *messages, 90dequeue_from_messages (struct GNUNET_MESSENGER_QueueMessages *messages,
86 struct GNUNET_CRYPTO_PrivateKey *sender); 91 struct GNUNET_CRYPTO_PrivateKey *sender,
92 struct GNUNET_MESSENGER_Message **transcript);
87 93
88#endif //GNUNET_MESSENGER_API_QUEUE_MESSAGES_H 94#endif //GNUNET_MESSENGER_API_QUEUE_MESSAGES_H