diff options
Diffstat (limited to 'src/chat/chat.c')
-rw-r--r-- | src/chat/chat.c | 103 |
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 | */ |
804 | void | 795 | void |
805 | GNUNET_CHAT_send_message (struct GNUNET_CHAT_Room *room, | 796 | GNUNET_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 | } |