GNUnet 0.26.2-16-ge86b66bd5
 
Loading...
Searching...
No Matches
gnunet-service-messenger.c File Reference
Include dependency graph for gnunet-service-messenger.c:

Go to the source code of this file.

Data Structures

struct  GNUNET_MESSENGER_Client
 

Functions

static void handle_create (void *cls, const struct GNUNET_MESSENGER_CreateMessage *msg)
 
static void handle_destroy (void *cls, const struct GNUNET_MESSENGER_DestroyMessage *msg)
 
static enum GNUNET_GenericReturnValue check_room_initial_key (const struct GNUNET_MESSENGER_RoomMessage *msg)
 
static void initialize_handle_via_key (struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_MESSENGER_RoomMessage *msg)
 
static enum GNUNET_GenericReturnValue check_room_open (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
 
static void handle_room_open (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
 
static enum GNUNET_GenericReturnValue check_room_entry (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
 
static void handle_room_entry (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
 
static void handle_room_close (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
 
static void handle_room_sync (void *cls, const struct GNUNET_MESSENGER_RoomMessage *msg)
 
static enum GNUNET_GenericReturnValue check_send_message (void *cls, const struct GNUNET_MESSENGER_SendMessage *msg)
 
static void handle_send_message (void *cls, const struct GNUNET_MESSENGER_SendMessage *msg)
 
static void callback_found_message (void *cls, struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
 
static void handle_get_message (void *cls, const struct GNUNET_MESSENGER_GetMessage *msg)
 
static void * callback_client_connect (void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
 
static void callback_client_disconnect (void *cls, struct GNUNET_SERVICE_Client *client, void *internal_cls)
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *config, struct GNUNET_SERVICE_Handle *service)
 Setup MESSENGER internals.
 
 GNUNET_SERVICE_MAIN (GNUNET_OS_project_data_gnunet(), GNUNET_MESSENGER_SERVICE_NAME, GNUNET_SERVICE_OPTION_NONE, &run, &callback_client_connect, &callback_client_disconnect, NULL, GNUNET_MQ_hd_fixed_size(create, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_CREATE, struct GNUNET_MESSENGER_CreateMessage, NULL), GNUNET_MQ_hd_fixed_size(destroy, GNUNET_MESSAGE_TYPE_MESSENGER_CONNECTION_DESTROY, struct GNUNET_MESSENGER_DestroyMessage, NULL), GNUNET_MQ_hd_var_size(room_open, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN, struct GNUNET_MESSENGER_RoomMessage, NULL), GNUNET_MQ_hd_var_size(room_entry, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY, struct GNUNET_MESSENGER_RoomMessage, NULL), GNUNET_MQ_hd_fixed_size(room_close, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE, struct GNUNET_MESSENGER_RoomMessage, NULL), GNUNET_MQ_hd_var_size(send_message, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SEND_MESSAGE, struct GNUNET_MESSENGER_SendMessage, NULL), GNUNET_MQ_hd_fixed_size(get_message, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE, struct GNUNET_MESSENGER_GetMessage, NULL), GNUNET_MQ_hd_fixed_size(room_sync, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SYNC, struct GNUNET_MESSENGER_RoomMessage, NULL), GNUNET_MQ_handler_end())
 Define "main" method using service macro.
 

Variables

struct GNUNET_MESSENGER_Servicemessenger
 

Function Documentation

◆ handle_create()

static void handle_create ( void *  cls,
const struct GNUNET_MESSENGER_CreateMessage msg 
)
static

Definition at line 42 of file gnunet-service-messenger.c.

44{
45 struct GNUNET_MESSENGER_Client *msg_client;
46
47 GNUNET_assert (cls);
48
49 msg_client = cls;
50
51 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Handle created\n");
52
54}
#define GNUNET_log(kind,...)
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
@ GNUNET_ERROR_TYPE_DEBUG
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition service.c:2433
struct GNUNET_SERVICE_Client * client

References GNUNET_MESSENGER_Client::client, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, and GNUNET_SERVICE_client_continue().

Here is the call graph for this function:

◆ handle_destroy()

static void handle_destroy ( void *  cls,
const struct GNUNET_MESSENGER_DestroyMessage msg 
)
static

Definition at line 58 of file gnunet-service-messenger.c.

60{
61 struct GNUNET_MESSENGER_Client *msg_client;
62
63 GNUNET_assert (cls);
64
65 msg_client = cls;
66
67 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Handle destroyed\n");
68
70}
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition service.c:2462

References GNUNET_MESSENGER_Client::client, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, and GNUNET_SERVICE_client_drop().

Here is the call graph for this function:

◆ check_room_initial_key()

static enum GNUNET_GenericReturnValue check_room_initial_key ( const struct GNUNET_MESSENGER_RoomMessage msg)
static

Definition at line 74 of file gnunet-service-messenger.c.

75{
76 uint16_t full_length;
77 uint16_t msg_length;
78 const char *msg_buffer;
79
81
82 full_length = ntohs (msg->header.size);
83
84 if (full_length < sizeof(*msg))
85 return GNUNET_NO;
86
87 msg_length = full_length - sizeof(*msg);
88 msg_buffer = ((const char*) msg) + sizeof(*msg);
89
90 if (0 == msg_length)
91 return GNUNET_OK;
92
93 {
95 size_t key_len;
96
98 msg_length,
99 &key, &key_len
100 ))
101 return GNUNET_NO;
102
103 return key_len == msg_length ? GNUNET_OK : GNUNET_NO;
104 }
105}
struct GNUNET_MessageHeader * msg
Definition 005.c:2
struct GNUNET_HashCode key
The key used in the DHT.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_read_blindable_pk_from_buffer(const void *buffer, size_t len, struct GNUNET_CRYPTO_BlindablePublicKey *key, size_t *read)
Reads a GNUNET_CRYPTO_BlindablePublicKey from a compact buffer.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
@ GNUNET_OK
@ GNUNET_NO
An identity key as per LSD0001.

References GNUNET_assert, GNUNET_CRYPTO_read_blindable_pk_from_buffer(), GNUNET_NO, GNUNET_OK, key, msg, and GNUNET_MessageHeader::size.

Referenced by check_room_entry(), and check_room_open().

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

◆ initialize_handle_via_key()

static void initialize_handle_via_key ( struct GNUNET_MESSENGER_SrvHandle handle,
const struct GNUNET_MESSENGER_RoomMessage msg 
)
static

Definition at line 109 of file gnunet-service-messenger.c.

111{
112 uint16_t full_length;
113 uint16_t msg_length;
114 const char *msg_buffer;
115
116 GNUNET_assert ((handle) && (msg));
117
118 full_length = ntohs (msg->header.size);
119 msg_length = full_length - sizeof(*msg);
120 msg_buffer = ((const char*) msg) + sizeof(*msg);
121
122 if (msg_length > 0)
123 {
125 size_t key_len;
126
128 msg_length,
129 &key,
130 &key_len))
132 else
134 "Initialization failed while reading invalid key!\n");
135 }
136 else
137 GNUNET_log (GNUNET_ERROR_TYPE_WARNING, "Initialization is missing key!\n");
138}
void set_srv_handle_key(struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_CRYPTO_BlindablePublicKey *key)
Sets the public key of a given handle.
static struct GNUNET_VPN_Handle * handle
Handle to vpn service.
Definition gnunet-vpn.c:35
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR

References GNUNET_assert, GNUNET_CRYPTO_read_blindable_pk_from_buffer(), GNUNET_ERROR_TYPE_ERROR, GNUNET_ERROR_TYPE_WARNING, GNUNET_log, GNUNET_OK, handle, key, msg, set_srv_handle_key(), and GNUNET_MessageHeader::size.

Referenced by handle_room_entry(), and handle_room_open().

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

◆ check_room_open()

static enum GNUNET_GenericReturnValue check_room_open ( void *  cls,
const struct GNUNET_MESSENGER_RoomMessage msg 
)
static

Definition at line 142 of file gnunet-service-messenger.c.

144{
146}
static enum GNUNET_GenericReturnValue check_room_initial_key(const struct GNUNET_MESSENGER_RoomMessage *msg)

References check_room_initial_key(), and msg.

Here is the call graph for this function:

◆ handle_room_open()

static void handle_room_open ( void *  cls,
const struct GNUNET_MESSENGER_RoomMessage msg 
)
static

Definition at line 150 of file gnunet-service-messenger.c.

152{
153 struct GNUNET_MESSENGER_Client *msg_client;
154
155 GNUNET_assert ((cls) && (msg));
156
157 msg_client = cls;
158
159 initialize_handle_via_key (msg_client->handle, msg);
160
161 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Opening room: %s\n", GNUNET_h2s (
162 &(msg->key)));
163
164 if (GNUNET_YES == open_srv_handle_room (msg_client->handle, &(msg->key)))
165 {
166 struct GNUNET_HashCode prev, epoch;
167 const struct GNUNET_ShortHashCode *member_id;
169 struct GNUNET_MQ_Envelope *env;
170
171 sync_srv_handle_messages (msg_client->handle, &(msg->key), &(msg->previous),
172 &prev, &epoch);
173
174 member_id = get_srv_handle_member_id (msg_client->handle, &(msg->key));
175
176 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Opening room with member id: %s\n",
177 GNUNET_sh2s (member_id));
178
180 GNUNET_memcpy (&(response->key), &(msg->key), sizeof(response->key));
181 GNUNET_memcpy (&(response->previous), &prev, sizeof(response->previous));
182 GNUNET_memcpy (&(response->epoch), &epoch, sizeof(response->epoch));
183 GNUNET_MQ_send (msg_client->handle->mq, env);
184 }
185 else
186 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Opening room failed: %s\n",
187 GNUNET_h2s (&(msg->key)));
188
190}
struct GNUNET_MQ_Envelope * env
Definition 005.c:1
static struct MHD_Response * response
Our canonical response.
static void initialize_handle_via_key(struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_MESSENGER_RoomMessage *msg)
void sync_srv_handle_messages(struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key, const struct GNUNET_HashCode *prev, struct GNUNET_HashCode *hash, struct GNUNET_HashCode *epoch)
Returns the latest merged hash from a room of a given handle using a specific key and the handles own...
const struct GNUNET_ShortHashCode * get_srv_handle_member_id(const struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
Returns the member id of a given handle in a specific room.
enum GNUNET_GenericReturnValue open_srv_handle_room(struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
Makes a given handle a member of the room using a specific key and opens the room from the handles se...
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
@ GNUNET_YES
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).
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition mq.c:305
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN
A 512-bit hashcode.
struct GNUNET_MESSENGER_SrvHandle * handle
General message to confirm interaction with a room.
struct GNUNET_MQ_Envelope * prev
Messages are stored in a linked list Each queue has its own list of envelopes.
Definition mq.c:45
A 256-bit hashcode.

References GNUNET_MESSENGER_Client::client, env, get_srv_handle_member_id(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_OPEN, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), GNUNET_sh2s(), GNUNET_YES, GNUNET_MESSENGER_Client::handle, initialize_handle_via_key(), GNUNET_MESSENGER_SrvHandle::mq, msg, open_srv_handle_room(), GNUNET_MQ_Envelope::prev, response, and sync_srv_handle_messages().

Here is the call graph for this function:

◆ check_room_entry()

static enum GNUNET_GenericReturnValue check_room_entry ( void *  cls,
const struct GNUNET_MESSENGER_RoomMessage msg 
)
static

Definition at line 194 of file gnunet-service-messenger.c.

196{
198}

References check_room_initial_key(), and msg.

Here is the call graph for this function:

◆ handle_room_entry()

static void handle_room_entry ( void *  cls,
const struct GNUNET_MESSENGER_RoomMessage msg 
)
static

Definition at line 202 of file gnunet-service-messenger.c.

204{
205 struct GNUNET_MESSENGER_Client *msg_client;
206
207 GNUNET_assert ((cls) && (msg));
208
209 msg_client = cls;
210
211 initialize_handle_via_key (msg_client->handle, msg);
212
213 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Entering room: %s, %s\n", GNUNET_h2s (
214 &(msg->key)), GNUNET_i2s (&(msg->door)));
215
216 if (GNUNET_YES == entry_srv_handle_room (msg_client->handle, &(msg->door),
217 &(msg->key)))
218 {
219 struct GNUNET_HashCode prev, epoch;
220 const struct GNUNET_ShortHashCode *member_id;
222 struct GNUNET_MQ_Envelope *env;
223
224 sync_srv_handle_messages (msg_client->handle, &(msg->key), &(msg->previous),
225 &prev, &epoch);
226
227 member_id = get_srv_handle_member_id (msg_client->handle, &(msg->key));
228
229 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Entering room with member id: %s\n",
230 GNUNET_sh2s (member_id));
231
233 GNUNET_memcpy (&(response->door), &(msg->door), sizeof(response->door));
234 GNUNET_memcpy (&(response->key), &(msg->key), sizeof(response->key));
235 GNUNET_memcpy (&(response->previous), &prev, sizeof(response->previous));
236 GNUNET_memcpy (&(response->epoch), &epoch, sizeof(response->epoch));
237 GNUNET_MQ_send (msg_client->handle->mq, env);
238 }
239 else
240 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Entrance into room failed: %s, %s\n",
241 GNUNET_h2s (&(msg->key)),
242 GNUNET_i2s (&(msg->door)));
243
245}
enum GNUNET_GenericReturnValue entry_srv_handle_room(struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_PeerIdentity *door, const struct GNUNET_HashCode *key)
Makes a given handle a member of the room using a specific key and enters the room through a tunnel t...
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY

References GNUNET_MESSENGER_Client::client, entry_srv_handle_room(), env, get_srv_handle_member_id(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_h2s(), GNUNET_i2s(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_ENTRY, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), GNUNET_sh2s(), GNUNET_YES, GNUNET_MESSENGER_Client::handle, initialize_handle_via_key(), GNUNET_MESSENGER_SrvHandle::mq, msg, GNUNET_MQ_Envelope::prev, response, and sync_srv_handle_messages().

Here is the call graph for this function:

◆ handle_room_close()

static void handle_room_close ( void *  cls,
const struct GNUNET_MESSENGER_RoomMessage msg 
)
static

Definition at line 249 of file gnunet-service-messenger.c.

251{
252 struct GNUNET_MESSENGER_Client *msg_client;
253
254 GNUNET_assert (cls);
255
256 msg_client = cls;
257
258 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Closing room: %s\n", GNUNET_h2s (
259 &(msg->key)));
260
261 if (GNUNET_YES == close_srv_handle_room (msg_client->handle, &(msg->key)))
262 {
264 struct GNUNET_MQ_Envelope *env;
265
266 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Closing room succeeded: %s\n",
267 GNUNET_h2s (&(msg->key)));
268
270 GNUNET_memcpy (&(response->key), &(msg->key), sizeof(response->key));
271 GNUNET_memcpy (&(response->previous), &(msg->previous),
272 sizeof(response->previous));
273 GNUNET_memcpy (&(response->epoch), &(msg->epoch), sizeof(response->epoch));
274 GNUNET_MQ_send (msg_client->handle->mq, env);
275 }
276 else
277 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Closing room failed: %s\n",
278 GNUNET_h2s (&(msg->key)));
279
281}
enum GNUNET_GenericReturnValue close_srv_handle_room(struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key)
Removes the membership of the room using a specific key and closes it if no other handle from this se...
#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE

References GNUNET_MESSENGER_Client::client, close_srv_handle_room(), env, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_CLOSE, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), GNUNET_YES, GNUNET_MESSENGER_Client::handle, GNUNET_MESSENGER_SrvHandle::mq, msg, and response.

Here is the call graph for this function:

◆ handle_room_sync()

static void handle_room_sync ( void *  cls,
const struct GNUNET_MESSENGER_RoomMessage msg 
)
static

Definition at line 285 of file gnunet-service-messenger.c.

287{
288 struct GNUNET_MESSENGER_Client *msg_client;
289
290 GNUNET_assert (cls);
291
292 msg_client = cls;
293
294 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Syncing room: %s\n", GNUNET_h2s (
295 &(msg->key)));
296
297 {
298 struct GNUNET_HashCode prev, epoch;
300 struct GNUNET_MQ_Envelope *env;
301
302 sync_srv_handle_messages (msg_client->handle, &(msg->key), &(msg->previous),
303 &prev, &epoch);
304
306 GNUNET_memcpy (&(response->key), &(msg->key), sizeof(response->key));
307 GNUNET_memcpy (&(response->previous), &prev, sizeof(response->previous));
308 GNUNET_memcpy (&(response->epoch), &epoch, sizeof(response->epoch));
309 GNUNET_MQ_send (msg_client->handle->mq, env);
310 }
311
313}
#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SYNC

References GNUNET_MESSENGER_Client::client, env, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_SYNC, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_SERVICE_client_continue(), GNUNET_MESSENGER_Client::handle, GNUNET_MESSENGER_SrvHandle::mq, msg, GNUNET_MQ_Envelope::prev, response, and sync_srv_handle_messages().

Here is the call graph for this function:

◆ check_send_message()

static enum GNUNET_GenericReturnValue check_send_message ( void *  cls,
const struct GNUNET_MESSENGER_SendMessage msg 
)
static

Definition at line 317 of file gnunet-service-messenger.c.

319{
320 uint16_t full_length;
321 uint16_t msg_length;
322 const char *msg_buffer;
323 struct GNUNET_MESSENGER_Message message;
324
326
327 full_length = ntohs (msg->header.size);
328
329 if (full_length < sizeof(*msg))
330 return GNUNET_NO;
331
332 msg_length = full_length - sizeof(*msg);
333 msg_buffer = ((const char*) msg) + sizeof(*msg);
334
336 GNUNET_YES))
337 {
338 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Too short message: %s\n", GNUNET_h2s (
339 &(msg->key)));
340 return GNUNET_NO;
341 }
342
343 if (GNUNET_YES != decode_message (&message, msg_length, msg_buffer,
345 NULL))
346 {
347 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Decoding message failed: %s\n",
348 GNUNET_h2s (
349 &(msg->key)));
350 return GNUNET_NO;
351 }
352
353 {
354 enum GNUNET_GenericReturnValue allowed;
355 allowed = filter_message_sending (&message);
356
357 if (GNUNET_SYSERR == allowed)
359 "Sending message not allowed: %s to %s\n",
360 GNUNET_MESSENGER_name_of_kind (message.header.kind),
361 GNUNET_h2s (&(msg->key)));
362
363 cleanup_message (&message);
364 return GNUNET_SYSERR != allowed? GNUNET_OK : GNUNET_NO;
365 }
366}
GNUNET_GenericReturnValue
Named constants for return values.
@ GNUNET_SYSERR
const char * GNUNET_MESSENGER_name_of_kind(enum GNUNET_MESSENGER_MessageKind kind)
Get the name of a message kind.
@ GNUNET_MESSENGER_KIND_UNKNOWN
The unknown kind.
enum GNUNET_GenericReturnValue filter_message_sending(const struct GNUNET_MESSENGER_Message *message)
Returns whether a specific kind of message should be sent by a client.
uint16_t get_message_kind_size(enum GNUNET_MESSENGER_MessageKind kind, enum GNUNET_GenericReturnValue include_header)
Returns the minimal size in bytes to encode a message of a specific kind.
enum GNUNET_GenericReturnValue decode_message(struct GNUNET_MESSENGER_Message *message, uint16_t length, const char *buffer, enum GNUNET_GenericReturnValue include_header, uint16_t *padding)
Decodes a message from a given buffer of a maximal length in bytes.
void cleanup_message(struct GNUNET_MESSENGER_Message *message)
Frees the messages body memory.

References cleanup_message(), decode_message(), filter_message_sending(), get_message_kind_size(), GNUNET_assert, GNUNET_ERROR_TYPE_ERROR, GNUNET_h2s(), GNUNET_log, GNUNET_MESSENGER_KIND_UNKNOWN, GNUNET_MESSENGER_name_of_kind(), GNUNET_NO, GNUNET_OK, GNUNET_SYSERR, GNUNET_YES, GNUNET_MESSENGER_Message::header, GNUNET_MESSENGER_MessageHeader::kind, msg, and GNUNET_MessageHeader::size.

Here is the call graph for this function:

◆ handle_send_message()

static void handle_send_message ( void *  cls,
const struct GNUNET_MESSENGER_SendMessage msg 
)
static

Definition at line 370 of file gnunet-service-messenger.c.

372{
373 struct GNUNET_MESSENGER_Client *msg_client;
374 const struct GNUNET_HashCode *key;
375 const char *msg_buffer;
376 uint16_t msg_length;
377
378 GNUNET_assert ((cls) && (msg));
379
380 msg_client = cls;
381
382 key = &(msg->key);
383 msg_buffer = ((const char*) msg) + sizeof(*msg);
384 msg_length = ntohs (msg->header.size) - sizeof(*msg);
385
386 {
387 struct GNUNET_MESSENGER_Message message;
388 decode_message (&message, msg_length, msg_buffer, GNUNET_YES, NULL);
389
390 if ((GNUNET_YES != msg_client->handle->service->group_keys) &&
391 (GNUNET_MESSENGER_KIND_GROUP == message.header.kind))
392 goto skip_message;
393
394 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Sending message: %s to %s (by %s)\n",
395 GNUNET_MESSENGER_name_of_kind (message.header.kind),
396 GNUNET_h2s (key),
397 GNUNET_sh2s (&(message.header.sender_id)));
398
399 if (GNUNET_YES != send_srv_handle_message (msg_client->handle, key, &message
400 ))
401 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Sending message failed: %s to %s\n",
402 GNUNET_MESSENGER_name_of_kind (message.header.kind),
403 GNUNET_h2s (key));
404
405skip_message:
406 cleanup_message (&message);
407 }
408
410}
enum GNUNET_GenericReturnValue send_srv_handle_message(struct GNUNET_MESSENGER_SrvHandle *handle, const struct GNUNET_HashCode *key, const struct GNUNET_MESSENGER_Message *message)
Sends a message from a given handle to the room using a specific key.
@ GNUNET_MESSENGER_KIND_GROUP
The group kind.
enum GNUNET_GenericReturnValue group_keys
struct GNUNET_MESSENGER_Service * service

References cleanup_message(), GNUNET_MESSENGER_Client::client, decode_message(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_h2s(), GNUNET_log, GNUNET_MESSENGER_KIND_GROUP, GNUNET_MESSENGER_name_of_kind(), GNUNET_SERVICE_client_continue(), GNUNET_sh2s(), GNUNET_YES, GNUNET_MESSENGER_Service::group_keys, GNUNET_MESSENGER_Client::handle, GNUNET_MESSENGER_Message::header, key, GNUNET_MESSENGER_MessageHeader::kind, msg, send_srv_handle_message(), GNUNET_MESSENGER_MessageHeader::sender_id, GNUNET_MESSENGER_SrvHandle::service, and GNUNET_MessageHeader::size.

Here is the call graph for this function:

◆ callback_found_message()

static void callback_found_message ( void *  cls,
struct GNUNET_MESSENGER_SrvRoom room,
const struct GNUNET_MESSENGER_Message message,
const struct GNUNET_HashCode hash 
)
static

Definition at line 414 of file gnunet-service-messenger.c.

418{
419 struct GNUNET_MESSENGER_Client *msg_client;
420 struct GNUNET_MESSENGER_SenderSession session;
421
422 GNUNET_assert ((cls) && (room) && (hash));
423
424 msg_client = cls;
425
426 if (! message)
427 {
429 struct GNUNET_MQ_Envelope *env;
430
432 "Notifying client about missing message: %s\n",
433 GNUNET_h2s (hash));
434
437 GNUNET_memcpy (&(response->key), &(room->key), sizeof(room->key));
438 GNUNET_memcpy (&(response->hash), hash, sizeof(*hash));
439 GNUNET_MQ_send (msg_client->handle->mq, env);
440 return;
441 }
442
443 if (GNUNET_YES == is_peer_message (message))
444 {
445 struct GNUNET_MESSENGER_PeerStore *store;
446
447 store = get_srv_room_peer_store (room);
448 session.peer = get_store_peer_of (store, message, hash);
449
450 if (! session.peer)
451 {
453 "Peer session from sender of message (%s) unknown!\n",
454 GNUNET_h2s (hash));
455 return;
456 }
457 }
458 else
459 {
460 struct GNUNET_MESSENGER_MemberStore *store;
461 struct GNUNET_MESSENGER_Member *member;
462
464 member = get_store_member_of (store, message);
465
466 if (! member)
467 {
468 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Sender of message (%s) unknown!\n",
469 GNUNET_h2s (hash));
470 return;
471 }
472
473 session.member = get_member_session_of (member, message, hash);
474
475 if (! session.member)
476 {
478 "Member session from sender of message (%s) unknown!\n",
479 GNUNET_h2s (hash));
480 return;
481 }
482 }
483
484 {
485 const struct GNUNET_MESSENGER_MessageStore *message_store;
486 const struct GNUNET_HashCode *epoch;
487
488 message_store = get_srv_room_message_store (room);
489 epoch = get_store_message_epoch (message_store, hash);
490
491 if (GNUNET_NO == msg_client->handle->service->local_request)
492 notify_srv_handle_message (msg_client->handle, room, &session, message,
493 hash, epoch, GNUNET_NO);
494 else
495 handle_service_message (msg_client->handle->service, room, &session,
496 message, hash, epoch, GNUNET_NO);
497 }
498}
void notify_srv_handle_message(struct GNUNET_MESSENGER_SrvHandle *handle, struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_MESSENGER_SenderSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash, const struct GNUNET_HashCode *epoch, enum GNUNET_GenericReturnValue recent)
Notifies the handle that a new message was received or sent.
struct GNUNET_MESSENGER_MemberSession * get_member_session_of(struct GNUNET_MESSENGER_Member *member, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
Returns the member session of a member using a public key which can verify the signature of a given m...
struct GNUNET_MESSENGER_Member * get_store_member_of(struct GNUNET_MESSENGER_MemberStore *store, const struct GNUNET_MESSENGER_Message *message)
Returns the member of a store using a sender id of a given message.
const struct GNUNET_HashCode * get_store_message_epoch(const struct GNUNET_MESSENGER_MessageStore *store, const struct GNUNET_HashCode *hash)
Returns the epoch hash of a message from a message store matching a given hash.
struct GNUNET_PeerIdentity * get_store_peer_of(struct GNUNET_MESSENGER_PeerStore *store, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
Returns the peer identity inside the store which verifies the signature of a given message as valid.
struct GNUNET_MESSENGER_MessageStore * get_srv_room_message_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used message store of a given room.
struct GNUNET_MESSENGER_PeerStore * get_srv_room_peer_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used peer store of a given room.
struct GNUNET_MESSENGER_MemberStore * get_srv_room_member_store(struct GNUNET_MESSENGER_SrvRoom *room)
Returns the used member store of a given room.
void handle_service_message(struct GNUNET_MESSENGER_Service *service, struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_MESSENGER_SenderSession *session, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash, const struct GNUNET_HashCode *epoch, enum GNUNET_GenericReturnValue recent)
Sends a received or sent message with a given hash to each handle of a service which is currently mem...
#define GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE
enum GNUNET_GenericReturnValue is_peer_message(const struct GNUNET_MESSENGER_Message *message)
Returns whether a specific kind of message can be sent by the service without usage of a clients priv...
Message to request something from a room.
struct GNUNET_MESSENGER_MemberStore * store
enum GNUNET_GenericReturnValue local_request

References env, get_member_session_of(), get_srv_room_member_store(), get_srv_room_message_store(), get_srv_room_peer_store(), get_store_member_of(), get_store_message_epoch(), get_store_peer_of(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_MESSENGER_ROOM_GET_MESSAGE, GNUNET_MQ_msg, GNUNET_MQ_send(), GNUNET_NO, GNUNET_YES, GNUNET_MESSENGER_Client::handle, handle_service_message(), is_peer_message(), GNUNET_MESSENGER_SrvRoom::key, GNUNET_MESSENGER_Service::local_request, GNUNET_MESSENGER_SenderSession::member, GNUNET_MESSENGER_SrvHandle::mq, notify_srv_handle_message(), GNUNET_MESSENGER_SenderSession::peer, response, GNUNET_MESSENGER_SrvHandle::service, and GNUNET_MESSENGER_Member::store.

Referenced by handle_get_message().

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

◆ handle_get_message()

static void handle_get_message ( void *  cls,
const struct GNUNET_MESSENGER_GetMessage msg 
)
static

Definition at line 502 of file gnunet-service-messenger.c.

504{
505 struct GNUNET_MESSENGER_Client *msg_client;
506 struct GNUNET_MESSENGER_SrvRoom *room;
507 const struct GNUNET_ShortHashCode *member_id;
508 struct GNUNET_MESSENGER_Member *member;
510 struct GNUNET_MESSENGER_MemberSession *session;
511
512 GNUNET_assert ((cls) && (msg));
513
514 msg_client = cls;
515
516 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Requesting message from room: %s\n",
517 GNUNET_h2s (&(msg->key)));
518 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Requested message: %s\n",
519 GNUNET_h2s (&(msg->hash)));
520
521 room = get_service_room (messenger, &(msg->key));
522
523 if (! room)
524 {
525 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, "Room not found: %s\n", GNUNET_h2s (
526 &(msg->key)));
527 goto end_handling;
528 }
529
530 {
531 struct GNUNET_MESSENGER_MemberStore *member_store;
532 member_store = get_srv_room_member_store (room);
533
534 member_id = get_srv_handle_member_id (msg_client->handle,
535 &(msg->key));
536
537 member = get_store_member (member_store, member_id);
538 }
539
540 if (! member)
541 {
543 "Member not valid to request a message! (%s)\n",
544 GNUNET_sh2s (member_id));
545 goto end_handling;
546 }
547
548 pubkey = get_srv_handle_key (msg_client->handle);
549
550 if (! pubkey)
551 {
553 "Handle needs to have a public key to request a message! (%s)\n",
554 GNUNET_sh2s (member_id));
555 goto end_handling;
556 }
557
558 session = get_member_session (member, pubkey);
559
560 if (! session)
561 {
563 "Session not valid to request a message! (%s)\n",
564 GNUNET_sh2s (member_id));
565 goto end_handling;
566 }
567
569 msg_client);
570
571end_handling:
573}
static struct GNUNET_CRYPTO_BlindablePublicKey pubkey
Public key of the zone to look in.
struct GNUNET_MESSENGER_Service * messenger
static void callback_found_message(void *cls, struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_MESSENGER_Message *message, const struct GNUNET_HashCode *hash)
const struct GNUNET_CRYPTO_BlindablePublicKey * get_srv_handle_key(const struct GNUNET_MESSENGER_SrvHandle *handle)
Returns the public key of a given handle.
struct GNUNET_MESSENGER_MemberSession * 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.
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 request_srv_room_message(struct GNUNET_MESSENGER_SrvRoom *room, const struct GNUNET_HashCode *hash, const struct GNUNET_MESSENGER_MemberSession *session, GNUNET_MESSENGER_MessageRequestCallback callback, void *cls)
Requests a message from a room identified by a given hash.
struct GNUNET_MESSENGER_SrvRoom * get_service_room(const struct GNUNET_MESSENGER_Service *service, const struct GNUNET_HashCode *key)
Returns the room identified by a given key for a service.

References callback_found_message(), GNUNET_MESSENGER_Client::client, get_member_session(), get_service_room(), get_srv_handle_key(), get_srv_handle_member_id(), get_srv_room_member_store(), get_store_member(), GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_h2s(), GNUNET_log, GNUNET_SERVICE_client_continue(), GNUNET_sh2s(), GNUNET_MESSENGER_Client::handle, messenger, msg, pubkey, request_srv_room_message(), and GNUNET_MESSENGER_MemberStore::room.

Here is the call graph for this function:

◆ callback_client_connect()

static void * callback_client_connect ( void *  cls,
struct GNUNET_SERVICE_Client client,
struct GNUNET_MQ_Handle mq 
)
static

Definition at line 577 of file gnunet-service-messenger.c.

580{
581 struct GNUNET_MESSENGER_Client *msg_client;
582
583 GNUNET_assert ((client) && (mq));
584
585 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "New client connected to service!\n");
586
587 msg_client = GNUNET_new (struct GNUNET_MESSENGER_Client);
588
589 msg_client->client = client;
590 msg_client->handle = add_service_handle (messenger, mq);
591
592 return msg_client;
593}
struct GNUNET_MESSENGER_SrvHandle * add_service_handle(struct GNUNET_MESSENGER_Service *service, struct GNUNET_MQ_Handle *mq)
Creates and adds a new handle to a service using a given message queue.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static struct GNUNET_MQ_Handle * mq
Our connection to the resolver service, created on-demand, but then persists until error or shutdown.

References add_service_handle(), GNUNET_MESSENGER_Client::client, GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_new, GNUNET_MESSENGER_Client::handle, messenger, and mq.

Here is the call graph for this function:

◆ callback_client_disconnect()

static void callback_client_disconnect ( void *  cls,
struct GNUNET_SERVICE_Client client,
void *  internal_cls 
)
static

Definition at line 597 of file gnunet-service-messenger.c.

600{
601 struct GNUNET_MESSENGER_Client *msg_client;
602
603 GNUNET_assert (internal_cls);
604
605 msg_client = internal_cls;
606
608
609 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Client disconnected from service!\n");
610
611 GNUNET_free (msg_client);
612}
void remove_service_handle(struct GNUNET_MESSENGER_Service *service, struct GNUNET_MESSENGER_SrvHandle *handle)
Removes a handle from a service and destroys it.
#define GNUNET_free(ptr)
Wrapper around free.

References GNUNET_assert, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_MESSENGER_Client::handle, messenger, and remove_service_handle().

Here is the call graph for this function:

◆ run()

static void run ( void *  cls,
const struct GNUNET_CONFIGURATION_Handle config,
struct GNUNET_SERVICE_Handle service 
)
static

Setup MESSENGER internals.

Parameters
[in/out]cls closure
[in]configconfiguration to use
[in/out]service the initialized service

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

626{
628
630
631 if (! messenger)
633}
const struct GNUNET_CONFIGURATION_Handle * config
static struct GNUNET_SERVICE_Handle * service
Handle to our service instance.
struct GNUNET_MESSENGER_Service * create_service(const struct GNUNET_CONFIGURATION_Handle *config, struct GNUNET_SERVICE_Handle *service_handle)
Creates and allocates a new service using a given config and a GNUnet service handle.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition scheduler.c:572

References config, create_service(), GNUNET_assert, GNUNET_SCHEDULER_shutdown(), messenger, and service.

Here is the call graph for this function:

◆ GNUNET_SERVICE_MAIN()

Variable Documentation

◆ messenger