Implemented INVITE and BAN announcing.
authorPekka Riikonen <priikone@silcnet.org>
Wed, 8 Oct 2003 09:53:46 +0000 (09:53 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Wed, 8 Oct 2003 09:53:46 +0000 (09:53 +0000)
CHANGES
apps/silcd/server.c
apps/silcd/server.h
apps/silcd/server_util.c
doc/draft-riikonen-silc-pp-08.nroff

diff --git a/CHANGES b/CHANGES
index fa51fec26527dd0e2abda8b2eaf9ccd56e7c292e..cbaa6ef1695d47b31929ac06a0eef770a7f768bf 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -5,6 +5,9 @@ Wed Oct  8 09:32:12 CEST 2003  Pekka Riikonen <priikone@silcnet.org>
          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 <priikone@silcnet.org>
 
        * Backup router protocol version 1.2 implemented.  Testing still
index d8c49346678f5c70a5c146cb79314c9e95b93610..6b1b7dc71a98cb98ab182eb9d8939e4ed8a0acfd 100644 (file)
@@ -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);
 }
 
index 1204b2449f59feb6bf3406b17db736bb5130ff97..8cdf3b0352f35603cc4f4520f8a4d7f5b80628d4 100644 (file)
@@ -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,
index 5429e4218d6e1ae62798cc2b9c214ac72834aa06..fd79ade6c64b95ba98f435a34e0e2b5396e80192 100644 (file)
@@ -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);
index fb1f734ec85195e74105d1fbd166b1025bf4563e..ab7998cc211f430f6a9146a9cbfe083413959759 100644 (file)
@@ -1385,6 +1385,9 @@ sent inside arguments are actually Public Key Payloads.
       The <invite list> format is defined in [SILC4] with
       SILC_COMMAND_INVITE command.  When this notify is destined to
       a client the <add | del> and <invite list> MUST NOT be sent.
+      When <add | del> 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 <ban list> indicates the information to be
       added to or removed from the ban list.  The <ban list> format
       format is defined in [SILC4] with SILC_COMMAND_BAN command.
+      When <add | del> 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