From 3fde1862c8cca4b23b442a4d548336c4e40d8868 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Wed, 8 Oct 2003 09:53:46 +0000 Subject: [PATCH] Implemented INVITE and BAN announcing. --- CHANGES | 3 + apps/silcd/server.c | 127 +++++++++++++++++++++++++++- apps/silcd/server.h | 2 + apps/silcd/server_util.c | 4 +- doc/draft-riikonen-silc-pp-08.nroff | 6 ++ 5 files changed, 139 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index fa51fec2..cbaa6ef1 100644 --- a/CHANGES +++ b/CHANGES @@ -5,6 +5,9 @@ Wed Oct 8 09:32:12 CEST 2003 Pekka Riikonen code. Affected files silcd/packet_[send|receive].[ch], command.c, server.c and server_util.c. + * Implemented INVITE and BAN announcing. Affected files are + silcd/server.[ch], server_util.c. + Sun Oct 5 20:22:08 EEST 2003 Pekka Riikonen * Backup router protocol version 1.2 implemented. Testing still diff --git a/apps/silcd/server.c b/apps/silcd/server.c index d8c49346..6b1b7dc7 100644 --- a/apps/silcd/server.c +++ b/apps/silcd/server.c @@ -4342,6 +4342,66 @@ void silc_server_announce_get_channel_topic(SilcServer server, } } +/* Returns channel's invite and ban lists */ + +void silc_server_announce_get_inviteban(SilcServer server, + SilcChannelEntry channel, + SilcBuffer *invite, + SilcBuffer *ban) +{ + SilcBuffer list, idp, idp2, tmp2; + SilcUInt32 type; + SilcHashTableList htl; + const unsigned char a[1] = { 0x03 }; + + idp = silc_id_payload_encode((void *)channel->id, SILC_ID_CHANNEL); + + /* Encode invite list */ + if (channel->invite_list && silc_hash_table_count(channel->invite_list)) { + list = silc_buffer_alloc_size(2); + type = silc_hash_table_count(channel->invite_list); + SILC_PUT16_MSB(type, list->data); + silc_hash_table_list(channel->invite_list, &htl); + while (silc_hash_table_get(&htl, (void **)&type, (void **)&tmp2)) + list = silc_argument_payload_encode_one(list, tmp2->data, tmp2->len, + type); + silc_hash_table_list_reset(&htl); + + idp2 = silc_id_payload_encode(server->id, SILC_ID_SERVER); + *invite = + silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_INVITE, 5, + idp->data, idp->len, + channel->channel_name, + strlen(channel->channel_name), + idp2->data, idp2->len, + a, 1, + list->data, list->len); + silc_buffer_free(idp2); + silc_buffer_free(list); + } + + /* Encode ban list */ + if (channel->ban_list && silc_hash_table_count(channel->ban_list)) { + list = silc_buffer_alloc_size(2); + type = silc_hash_table_count(channel->ban_list); + SILC_PUT16_MSB(type, list->data); + silc_hash_table_list(channel->ban_list, &htl); + while (silc_hash_table_get(&htl, (void **)&type, (void **)&tmp2)) + list = silc_argument_payload_encode_one(list, tmp2->data, tmp2->len, + type); + silc_hash_table_list_reset(&htl); + + *ban = + silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_BAN, 3, + idp->data, idp->len, + a, 1, + list->data, list->len); + silc_buffer_free(list); + } + + silc_buffer_free(idp); +} + /* Returns assembled packets for channel users of the `channel'. */ void silc_server_announce_get_channel_users(SilcServer server, @@ -4461,6 +4521,8 @@ void silc_server_announce_get_channels(SilcServer server, SilcBuffer **channel_users_modes, SilcUInt32 *channel_users_modes_c, SilcBuffer **channel_topics, + SilcBuffer **channel_invites, + SilcBuffer **channel_bans, SilcChannelID ***channel_ids, unsigned long creation_time) { @@ -4539,8 +4601,19 @@ void silc_server_announce_get_channels(SilcServer server, (*channel_topics)[i] = NULL; silc_server_announce_get_channel_topic(server, channel, &(*channel_topics)[i]); - (*channel_users_modes_c)++; + /* Channel's invite and ban list */ + *channel_invites = silc_realloc(*channel_invites, + sizeof(**channel_invites) * (i + 1)); + (*channel_invites)[i] = NULL; + *channel_bans = silc_realloc(*channel_bans, + sizeof(**channel_bans) * (i + 1)); + (*channel_bans)[i] = NULL; + silc_server_announce_get_inviteban(server, channel, + &(*channel_invites)[i], + &(*channel_bans)[i]); + + (*channel_users_modes_c)++; silc_free(cid); i++; @@ -4569,6 +4642,8 @@ void silc_server_announce_channels(SilcServer server, SilcBuffer channels = NULL, *channel_modes = NULL, channel_users = NULL; SilcBuffer *channel_users_modes = NULL; SilcBuffer *channel_topics = NULL; + SilcBuffer *channel_invites = NULL; + SilcBuffer *channel_bans = NULL; SilcUInt32 channel_users_modes_c = 0; SilcChannelID **channel_ids = NULL; @@ -4581,6 +4656,8 @@ void silc_server_announce_channels(SilcServer server, &channel_users_modes, &channel_users_modes_c, &channel_topics, + &channel_invites, + &channel_bans, &channel_ids, creation_time); /* Get channels and channel users in global list */ @@ -4591,6 +4668,8 @@ void silc_server_announce_channels(SilcServer server, &channel_users_modes, &channel_users_modes_c, &channel_topics, + &channel_invites, + &channel_bans, &channel_ids, creation_time); if (channels) { @@ -4687,6 +4766,52 @@ void silc_server_announce_channels(SilcServer server, silc_free(channel_topics); } + if (channel_invites) { + int i; + + for (i = 0; i < channel_users_modes_c; i++) { + if (!channel_invites[i]) + continue; + + silc_buffer_push(channel_invites[i], + channel_invites[i]->data - + channel_invites[i]->head); + SILC_LOG_HEXDUMP(("channel invite list"), channel_invites[i]->data, + channel_invites[i]->len); + silc_server_packet_send_dest(server, remote, + SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST, + channel_ids[i], SILC_ID_CHANNEL, + channel_invites[i]->data, + channel_invites[i]->len, + FALSE); + silc_buffer_free(channel_invites[i]); + } + silc_free(channel_invites); + } + + if (channel_bans) { + int i; + + for (i = 0; i < channel_users_modes_c; i++) { + if (!channel_bans[i]) + continue; + + silc_buffer_push(channel_bans[i], + channel_bans[i]->data - + channel_bans[i]->head); + SILC_LOG_HEXDUMP(("channel ban list"), channel_bans[i]->data, + channel_bans[i]->len); + silc_server_packet_send_dest(server, remote, + SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST, + channel_ids[i], SILC_ID_CHANNEL, + channel_bans[i]->data, + channel_bans[i]->len, + FALSE); + silc_buffer_free(channel_bans[i]); + } + silc_free(channel_bans); + } + silc_free(channel_ids); } diff --git a/apps/silcd/server.h b/apps/silcd/server.h index 1204b244..8cdf3b03 100644 --- a/apps/silcd/server.h +++ b/apps/silcd/server.h @@ -209,6 +209,8 @@ void silc_server_announce_get_channels(SilcServer server, SilcBuffer **channel_users_modes, SilcUInt32 *channel_users_modes_c, SilcBuffer **channel_topics, + SilcBuffer **channel_invites, + SilcBuffer **channel_bans, SilcChannelID ***channel_ids, unsigned long creation_time); void silc_server_announce_servers(SilcServer server, bool global, diff --git a/apps/silcd/server_util.c b/apps/silcd/server_util.c index 5429e421..fd79ade6 100644 --- a/apps/silcd/server_util.c +++ b/apps/silcd/server_util.c @@ -1821,10 +1821,10 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list, SilcHashTableList htl; SILC_LOG_DEBUG(("Processing invite/ban for %s action", - action == 0x00 ? "ADD" : "DEL")); + action == 0x01 ? "DEL" : "ADD")); /* Add the information to invite list */ - if (action == 0x00) { + if (action == 0x00 || action == 0x03) { /* Traverse all arguments and add to the hash table according to their type. */ tmp = silc_argument_get_first_arg(args, &type, &len); diff --git a/doc/draft-riikonen-silc-pp-08.nroff b/doc/draft-riikonen-silc-pp-08.nroff index fb1f734e..ab7998cc 100644 --- a/doc/draft-riikonen-silc-pp-08.nroff +++ b/doc/draft-riikonen-silc-pp-08.nroff @@ -1385,6 +1385,9 @@ sent inside arguments are actually Public Key Payloads. The format is defined in [SILC4] with SILC_COMMAND_INVITE command. When this notify is destined to a client the and MUST NOT be sent. + When is used to announce information during server + connecting phase the argument type MUST be 0x03. See section + 4.2.1 in [SILC1] for more information. 2 SILC_NOTIFY_TYPE_JOIN @@ -1665,6 +1668,9 @@ sent inside arguments are actually Public Key Payloads. from ban list. The indicates the information to be added to or removed from the ban list. The format format is defined in [SILC4] with SILC_COMMAND_BAN command. + When is used to announce information during server + connecting phase the argument type MUST be 0x03. See section + 4.2.1 in [SILC1] for more information. 16 SILC_NOTIFY_TYPE_ERROR -- 2.24.0