aboutsummaryrefslogtreecommitdiff
path: root/src/chat/chat.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/chat/chat.c')
-rw-r--r--src/chat/chat.c103
1 files changed, 46 insertions, 57 deletions
diff --git a/src/chat/chat.c b/src/chat/chat.c
index 1e90a6369..74dde678c 100644
--- a/src/chat/chat.c
+++ b/src/chat/chat.c
@@ -194,10 +194,10 @@ transmit_acknowledge_request (void *cls, size_t size, void *buf)
194 receipt->author = src->received_msg->sender; 194 receipt->author = src->received_msg->sender;
195 receipt->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CHAT_RECEIPT); 195 receipt->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_CHAT_RECEIPT);
196 receipt->purpose.size = 196 receipt->purpose.size =
197 htonl (msg_size - 197 htonl (msg_size - sizeof (struct GNUNET_MessageHeader) -
198 sizeof (struct GNUNET_MessageHeader) -
199 sizeof (uint32_t) - sizeof (struct GNUNET_CRYPTO_RsaSignature)); 198 sizeof (uint32_t) - sizeof (struct GNUNET_CRYPTO_RsaSignature));
200 msg_len = ntohs (src->received_msg->header.size) - 199 msg_len =
200 ntohs (src->received_msg->header.size) -
201 sizeof (struct ReceiveNotificationMessage); 201 sizeof (struct ReceiveNotificationMessage);
202 GNUNET_CRYPTO_hash (&src->received_msg[1], msg_len, &receipt->content); 202 GNUNET_CRYPTO_hash (&src->received_msg[1], msg_len, &receipt->content);
203 GNUNET_assert (GNUNET_OK == 203 GNUNET_assert (GNUNET_OK ==
@@ -269,9 +269,9 @@ process_result (struct GNUNET_CHAT_Room *room,
269 if (GNUNET_NO == room->is_joined) 269 if (GNUNET_NO == room->is_joined)
270 { 270 {
271 GNUNET_CRYPTO_rsa_key_get_public (room->my_private_key, &pkey); 271 GNUNET_CRYPTO_rsa_key_get_public (room->my_private_key, &pkey);
272 if (0 == memcmp (&join_msg->public_key, 272 if (0 ==
273 &pkey, 273 memcmp (&join_msg->public_key, &pkey,
274 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded))) 274 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded)))
275 { 275 {
276 room->join_callback (room->join_callback_cls); 276 room->join_callback (room->join_callback_cls);
277 room->is_joined = GNUNET_YES; 277 room->is_joined = GNUNET_YES;
@@ -285,8 +285,8 @@ process_result (struct GNUNET_CHAT_Room *room,
285 } 285 }
286 } 286 }
287 else 287 else
288 room->member_list_callback (room->member_list_callback_cls, 288 room->member_list_callback (room->member_list_callback_cls, meta,
289 meta, &join_msg->public_key, 289 &join_msg->public_key,
290 ntohl (join_msg->msg_options)); 290 ntohl (join_msg->msg_options));
291 break; 291 break;
292 case GNUNET_MESSAGE_TYPE_CHAT_LEAVE_NOTIFICATION: 292 case GNUNET_MESSAGE_TYPE_CHAT_LEAVE_NOTIFICATION:
@@ -299,9 +299,8 @@ process_result (struct GNUNET_CHAT_Room *room,
299 return; 299 return;
300 } 300 }
301 leave_msg = (struct LeaveNotificationMessage *) reply; 301 leave_msg = (struct LeaveNotificationMessage *) reply;
302 room->member_list_callback (room->member_list_callback_cls, 302 room->member_list_callback (room->member_list_callback_cls, NULL,
303 NULL, &leave_msg->user, 303 &leave_msg->user, GNUNET_CHAT_MSG_OPTION_NONE);
304 GNUNET_CHAT_MSG_OPTION_NONE);
305 GNUNET_CRYPTO_hash (&leave_msg->user, 304 GNUNET_CRYPTO_hash (&leave_msg->user,
306 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), 305 sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded),
307 &id); 306 &id);
@@ -346,21 +345,20 @@ process_result (struct GNUNET_CHAT_Room *room,
346 msg_len = size - sizeof (struct ReceiveNotificationMessage); 345 msg_len = size - sizeof (struct ReceiveNotificationMessage);
347 if (0 != (ntohl (received_msg->msg_options) & GNUNET_CHAT_MSG_PRIVATE)) 346 if (0 != (ntohl (received_msg->msg_options) & GNUNET_CHAT_MSG_PRIVATE))
348 { 347 {
349 if (-1 == GNUNET_CRYPTO_rsa_decrypt (room->my_private_key, 348 if (-1 ==
350 &received_msg->encrypted_key, 349 GNUNET_CRYPTO_rsa_decrypt (room->my_private_key,
351 &key, 350 &received_msg->encrypted_key, &key,
352 sizeof (struct 351 sizeof (struct
353 GNUNET_CRYPTO_AesSessionKey))) 352 GNUNET_CRYPTO_AesSessionKey)))
354 { 353 {
355 GNUNET_break (0); 354 GNUNET_break (0);
356 return; 355 return;
357 } 356 }
358 msg_len = GNUNET_CRYPTO_aes_decrypt (&received_msg[1], 357 msg_len =
359 msg_len, 358 GNUNET_CRYPTO_aes_decrypt (&received_msg[1], msg_len, &key,
360 &key, 359 (const struct
361 (const struct 360 GNUNET_CRYPTO_AesInitializationVector *)
362 GNUNET_CRYPTO_AesInitializationVector 361 INITVALUE, decrypted_msg);
363 *) INITVALUE, decrypted_msg);
364 message_content = decrypted_msg; 362 message_content = decrypted_msg;
365 } 363 }
366 else 364 else
@@ -378,17 +376,15 @@ process_result (struct GNUNET_CHAT_Room *room,
378 { 376 {
379 pos = room->members; 377 pos = room->members;
380 while ((NULL != pos) && 378 while ((NULL != pos) &&
381 (0 != memcmp (&pos->id, 379 (0 !=
382 &received_msg->sender, sizeof (GNUNET_HashCode)))) 380 memcmp (&pos->id, &received_msg->sender,
381 sizeof (GNUNET_HashCode))))
383 pos = pos->next; 382 pos = pos->next;
384 GNUNET_assert (NULL != pos); 383 GNUNET_assert (NULL != pos);
385 sender = &received_msg->sender; 384 sender = &received_msg->sender;
386 meta = pos->meta; 385 meta = pos->meta;
387 } 386 }
388 room->message_callback (room->message_callback_cls, 387 room->message_callback (room->message_callback_cls, room, sender, meta,
389 room,
390 sender,
391 meta,
392 message_content, 388 message_content,
393 GNUNET_TIME_absolute_ntoh (received_msg->timestamp), 389 GNUNET_TIME_absolute_ntoh (received_msg->timestamp),
394 ntohl (received_msg->msg_options)); 390 ntohl (received_msg->msg_options));
@@ -406,15 +402,15 @@ process_result (struct GNUNET_CHAT_Room *room,
406 } 402 }
407 receipt = (struct ConfirmationReceiptMessage *) reply; 403 receipt = (struct ConfirmationReceiptMessage *) reply;
408 if (NULL != room->confirmation_callback) 404 if (NULL != room->confirmation_callback)
409 room->confirmation_callback (room->confirmation_cls, 405 room->confirmation_callback (room->confirmation_cls, room,
410 room,
411 ntohl (receipt->sequence_number), 406 ntohl (receipt->sequence_number),
412 GNUNET_TIME_absolute_ntoh 407 GNUNET_TIME_absolute_ntoh (receipt->
413 (receipt->timestamp), &receipt->target); 408 timestamp),
409 &receipt->target);
414 break; 410 break;
415 default: 411 default:
416 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, 412 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Unknown message type: '%u'\n"),
417 _("Unknown message type: '%u'\n"), ntohs (reply->type)); 413 ntohs (reply->type));
418 GNUNET_break_op (0); 414 GNUNET_break_op (0);
419 break; 415 break;
420 } 416 }
@@ -448,9 +444,8 @@ receive_results (void *cls, const struct GNUNET_MessageHeader *msg)
448 if (NULL == chat_room->client) 444 if (NULL == chat_room->client)
449 return; /* fatal error */ 445 return; /* fatal error */
450 /* continue receiving */ 446 /* continue receiving */
451 GNUNET_CLIENT_receive (chat_room->client, 447 GNUNET_CLIENT_receive (chat_room->client, &receive_results, chat_room,
452 &receive_results, 448 GNUNET_TIME_UNIT_FOREVER_REL);
453 chat_room, GNUNET_TIME_UNIT_FOREVER_REL);
454} 449}
455 450
456 451
@@ -557,17 +552,15 @@ transmit_join_request (void *cls, size_t size, void *buf)
557 memcpy (room, chat_room->room_name, room_len); 552 memcpy (room, chat_room->room_name, room_len);
558 meta = &room[room_len]; 553 meta = &room[room_len];
559 if (GNUNET_SYSERR == 554 if (GNUNET_SYSERR ==
560 GNUNET_CONTAINER_meta_data_serialize (chat_room->member_info, 555 GNUNET_CONTAINER_meta_data_serialize (chat_room->member_info, &meta,
561 &meta,
562 meta_len, 556 meta_len,
563 GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL)) 557 GNUNET_CONTAINER_META_DATA_SERIALIZE_FULL))
564 { 558 {
565 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Could not serialize metadata\n")); 559 GNUNET_log (GNUNET_ERROR_TYPE_ERROR, _("Could not serialize metadata\n"));
566 return 0; 560 return 0;
567 } 561 }
568 GNUNET_CLIENT_receive (chat_room->client, 562 GNUNET_CLIENT_receive (chat_room->client, &receive_results, chat_room,
569 &receive_results, 563 GNUNET_TIME_UNIT_FOREVER_REL);
570 chat_room, GNUNET_TIME_UNIT_FOREVER_REL);
571 return size_of_join; 564 return size_of_join;
572} 565}
573 566
@@ -580,15 +573,15 @@ rejoin_room (struct GNUNET_CHAT_Room *chat_room)
580{ 573{
581 size_t size_of_join; 574 size_t size_of_join;
582 575
583 size_of_join = sizeof (struct JoinRequestMessage) + 576 size_of_join =
577 sizeof (struct JoinRequestMessage) +
584 GNUNET_CONTAINER_meta_data_get_serialized_size (chat_room->member_info) + 578 GNUNET_CONTAINER_meta_data_get_serialized_size (chat_room->member_info) +
585 strlen (chat_room->room_name); 579 strlen (chat_room->room_name);
586 if (NULL == 580 if (NULL ==
587 GNUNET_CLIENT_notify_transmit_ready (chat_room->client, 581 GNUNET_CLIENT_notify_transmit_ready (chat_room->client, size_of_join,
588 size_of_join,
589 GNUNET_CONSTANTS_SERVICE_TIMEOUT, 582 GNUNET_CONSTANTS_SERVICE_TIMEOUT,
590 GNUNET_YES, 583 GNUNET_YES, &transmit_join_request,
591 &transmit_join_request, chat_room)) 584 chat_room))
592 return GNUNET_SYSERR; 585 return GNUNET_SYSERR;
593 return GNUNET_OK; 586 return GNUNET_OK;
594} 587}
@@ -603,8 +596,8 @@ GNUNET_CHAT_leave_room (struct GNUNET_CHAT_Room *chat_room)
603 struct MemberList *pos; 596 struct MemberList *pos;
604 597
605#if DEBUG_CHAT 598#if DEBUG_CHAT
606 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 599 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Leaving the room '%s'\n",
607 "Leaving the room '%s'\n", chat_room->room_name); 600 chat_room->room_name);
608#endif 601#endif
609 GNUNET_CLIENT_disconnect (chat_room->client, GNUNET_NO); 602 GNUNET_CLIENT_disconnect (chat_room->client, GNUNET_NO);
610 GNUNET_free (chat_room->room_name); 603 GNUNET_free (chat_room->room_name);
@@ -650,8 +643,7 @@ GNUNET_CHAT_join_room (const struct GNUNET_CONFIGURATION_Handle *cfg,
650 struct GNUNET_CONTAINER_MetaData *member_info, 643 struct GNUNET_CONTAINER_MetaData *member_info,
651 const char *room_name, 644 const char *room_name,
652 enum GNUNET_CHAT_MsgOptions msg_options, 645 enum GNUNET_CHAT_MsgOptions msg_options,
653 GNUNET_CHAT_JoinCallback joinCallback, 646 GNUNET_CHAT_JoinCallback joinCallback, void *join_cls,
654 void *join_cls,
655 GNUNET_CHAT_MessageCallback messageCallback, 647 GNUNET_CHAT_MessageCallback messageCallback,
656 void *message_cls, 648 void *message_cls,
657 GNUNET_CHAT_MemberListCallback memberCallback, 649 GNUNET_CHAT_MemberListCallback memberCallback,
@@ -778,8 +770,7 @@ transmit_send_request (void *cls, size_t size, void *buf)
778 msg_to_send->purpose.purpose = 770 msg_to_send->purpose.purpose =
779 htonl (GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE); 771 htonl (GNUNET_SIGNATURE_PURPOSE_CHAT_MESSAGE);
780 msg_to_send->purpose.size = 772 msg_to_send->purpose.size =
781 htonl (msg_size - 773 htonl (msg_size - sizeof (struct GNUNET_MessageHeader) -
782 sizeof (struct GNUNET_MessageHeader) -
783 sizeof (struct GNUNET_CRYPTO_RsaSignature)); 774 sizeof (struct GNUNET_CRYPTO_RsaSignature));
784 GNUNET_assert (GNUNET_OK == 775 GNUNET_assert (GNUNET_OK ==
785 GNUNET_CRYPTO_rsa_sign (smc->chat_room->my_private_key, 776 GNUNET_CRYPTO_rsa_sign (smc->chat_room->my_private_key,
@@ -802,8 +793,7 @@ transmit_send_request (void *cls, size_t size, void *buf)
802 * @param sequence_number where to write the sequence id of the message 793 * @param sequence_number where to write the sequence id of the message
803 */ 794 */
804void 795void
805GNUNET_CHAT_send_message (struct GNUNET_CHAT_Room *room, 796GNUNET_CHAT_send_message (struct GNUNET_CHAT_Room *room, const char *message,
806 const char *message,
807 enum GNUNET_CHAT_MsgOptions options, 797 enum GNUNET_CHAT_MsgOptions options,
808 const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded 798 const struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded
809 *receiver, uint32_t * sequence_number) 799 *receiver, uint32_t * sequence_number)
@@ -824,8 +814,7 @@ GNUNET_CHAT_send_message (struct GNUNET_CHAT_Room *room,
824 smc->receiver = receiver; 814 smc->receiver = receiver;
825 smc->sequence_number = room->sequence_number; 815 smc->sequence_number = room->sequence_number;
826 msg_size = strlen (message) + sizeof (struct TransmitRequestMessage); 816 msg_size = strlen (message) + sizeof (struct TransmitRequestMessage);
827 GNUNET_CLIENT_notify_transmit_ready (room->client, 817 GNUNET_CLIENT_notify_transmit_ready (room->client, msg_size,
828 msg_size,
829 GNUNET_CONSTANTS_SERVICE_TIMEOUT, 818 GNUNET_CONSTANTS_SERVICE_TIMEOUT,
830 GNUNET_YES, &transmit_send_request, smc); 819 GNUNET_YES, &transmit_send_request, smc);
831} 820}