diff options
Diffstat (limited to 'src/service/messenger/gnunet-service-messenger_handle.c')
-rw-r--r-- | src/service/messenger/gnunet-service-messenger_handle.c | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/src/service/messenger/gnunet-service-messenger_handle.c b/src/service/messenger/gnunet-service-messenger_handle.c index c13517603..97414d129 100644 --- a/src/service/messenger/gnunet-service-messenger_handle.c +++ b/src/service/messenger/gnunet-service-messenger_handle.c | |||
@@ -240,6 +240,7 @@ open_srv_handle_room (struct GNUNET_MESSENGER_SrvHandle *handle, | |||
240 | key, | 240 | key, |
241 | NULL, | 241 | NULL, |
242 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE)) | 242 | GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE)) |
243 | |||
243 | return GNUNET_NO; | 244 | return GNUNET_NO; |
244 | 245 | ||
245 | if ((! get_srv_handle_member_id (handle, key)) && | 246 | if ((! get_srv_handle_member_id (handle, key)) && |
@@ -429,8 +430,10 @@ notify_srv_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, | |||
429 | GNUNET_assert ((handle) && (room) && (session) && (message) && (hash)); | 430 | GNUNET_assert ((handle) && (room) && (session) && (message) && (hash)); |
430 | 431 | ||
431 | const struct GNUNET_HashCode *key = get_srv_room_key (room); | 432 | const struct GNUNET_HashCode *key = get_srv_room_key (room); |
433 | const struct GNUNET_ShortHashCode *id = get_srv_handle_member_id (handle, | ||
434 | key); | ||
432 | 435 | ||
433 | if ((! handle->mq) || (! get_srv_handle_member_id (handle, key))) | 436 | if ((! handle->mq) || (! id)) |
434 | { | 437 | { |
435 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, | 438 | GNUNET_log (GNUNET_ERROR_TYPE_WARNING, |
436 | "Notifying client about message requires membership!\n"); | 439 | "Notifying client about message requires membership!\n"); |
@@ -440,6 +443,39 @@ notify_srv_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, | |||
440 | struct GNUNET_HashCode sender; | 443 | struct GNUNET_HashCode sender; |
441 | const struct GNUNET_HashCode *context = NULL; | 444 | const struct GNUNET_HashCode *context = NULL; |
442 | 445 | ||
446 | if (GNUNET_MESSENGER_KIND_TALK != message->header.kind) | ||
447 | goto skip_message_filter; | ||
448 | |||
449 | struct GNUNET_TIME_Absolute timestamp = | ||
450 | GNUNET_TIME_absolute_ntoh(message->header.timestamp); | ||
451 | const struct GNUNET_ShortHashCode *discourse = | ||
452 | &(message->body.talk.discourse); | ||
453 | |||
454 | struct GNUNET_MESSENGER_MemberStore *member_store = | ||
455 | get_srv_room_member_store (room); | ||
456 | |||
457 | if (! member_store) | ||
458 | return; | ||
459 | |||
460 | struct GNUNET_MESSENGER_Member *member = | ||
461 | get_store_member (member_store, id); | ||
462 | |||
463 | if (! member) | ||
464 | return; | ||
465 | |||
466 | struct GNUNET_MESSENGER_Subscription *subscription = | ||
467 | get_member_subscription(member, discourse); | ||
468 | |||
469 | if ((! subscription) || | ||
470 | (GNUNET_YES != has_subscription_of_timestamp(subscription, timestamp))) | ||
471 | { | ||
472 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | ||
473 | "Dropping message for client outside of subscription: %s\n", | ||
474 | GNUNET_h2s (hash)); | ||
475 | return; | ||
476 | } | ||
477 | |||
478 | skip_message_filter: | ||
443 | if (GNUNET_YES == is_peer_message (message)) | 479 | if (GNUNET_YES == is_peer_message (message)) |
444 | { | 480 | { |
445 | const struct GNUNET_PeerIdentity *identity = session->peer; | 481 | const struct GNUNET_PeerIdentity *identity = session->peer; |
@@ -449,8 +485,8 @@ notify_srv_handle_message (struct GNUNET_MESSENGER_SrvHandle *handle, | |||
449 | } | 485 | } |
450 | else | 486 | else |
451 | { | 487 | { |
452 | const struct GNUNET_CRYPTO_PublicKey *pubkey = get_contact_key ( | 488 | const struct GNUNET_CRYPTO_PublicKey *pubkey; |
453 | session->member->contact); | 489 | pubkey = get_member_session_public_key (session->member); |
454 | GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &sender); | 490 | GNUNET_CRYPTO_hash (pubkey, sizeof(*pubkey), &sender); |
455 | 491 | ||
456 | context = get_next_member_session_context (session->member); | 492 | context = get_next_member_session_context (session->member); |
@@ -499,6 +535,10 @@ iterate_next_member_ids (void *cls, | |||
499 | struct GNUNET_MESSENGER_SrvHandle *handle = cls; | 535 | struct GNUNET_MESSENGER_SrvHandle *handle = cls; |
500 | struct GNUNET_MESSENGER_NextMemberId *next = value; | 536 | struct GNUNET_MESSENGER_NextMemberId *next = value; |
501 | 537 | ||
538 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, | ||
539 | "Notifying client about next member id: %s (%s)\n", | ||
540 | GNUNET_sh2s (&(next->id)), GNUNET_h2s (key)); | ||
541 | |||
502 | struct GNUNET_MESSENGER_MemberMessage *msg; | 542 | struct GNUNET_MESSENGER_MemberMessage *msg; |
503 | struct GNUNET_MQ_Envelope *env; | 543 | struct GNUNET_MQ_Envelope *env; |
504 | 544 | ||