Wed Nov 27 21:51:52 CET 2002 Jochen Eisinger <c0ffee@penguin-breeder.org>
authorJochen Eisinger <coffee@silcnet.org>
Wed, 27 Nov 2002 20:56:42 +0000 (20:56 +0000)
committerJochen Eisinger <coffee@silcnet.org>
Wed, 27 Nov 2002 20:56:42 +0000 (20:56 +0000)
* Display INVITE and BAN lists as specified by SILC 1.2

CHANGES
apps/irssi/src/fe-common/silc/module-formats.c
apps/irssi/src/fe-common/silc/module-formats.h
apps/irssi/src/silc/core/client_ops.c

diff --git a/CHANGES b/CHANGES
index e72fca62b1415a15dfd4110957e16c8b478f443d..15b5754a1a0b6e5b2a5ba452179847fc62ff473f 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+Wed Nov 27 21:51:52 CET 2002  Jochen Eisinger <c0ffee@penguin-breeder.org>
+
+       * Display INVITE and BAN lists as specified by SILC 1.2
+
 Wed Nov 27 16:01:11 CET 2002  Pekka Riikonen <priikone@silcnet.org>
 
        * Do not send invite list back unless asked (when sending
index cf0632a68f57de46fe8e5d26e3e4346f0669dc46..050f4e6c3328008c7653f5af291860f217de6a6d 100644 (file)
@@ -38,10 +38,11 @@ FORMAT_REC fecommon_silc_formats[] = {
        { "notice", "{notice $0-}", 2, { 0, 0 } },
        { "ownaction", "{ownaction $0-}", 2, { 0, 0 } },
        { "ownnotice", "{ownnotice $0-}", 2, { 0, 0 } },
-       { "invite_list", "channel {channel $0} invite list: $1", 2, { 0, 0 } },
-       { "no_invite_list", "channel {channel $0} invite list not set", 1, { 0 } },
-       { "ban_list", "channel {channel $0} ban list: $1", 2, { 0, 0 } },
-       { "no_ban_list", "channel {channel $0} ban list not set", 1, { 0 } },
+       { "inviteban_list", "channel {channel $0} $1 list:", 2, { 0, 0 } },
+       { "inviteban_string", "$0 - {channel $1}: $2 {ban $3}", 4, { 1, 0, 0, 0 } },
+       { "inviteban_pubkey", "$0 - {channel $1}: $2 Fingerprint (SHA1) {ban $3} (Babbleprint (SHA1)  {ban $4})", 5, { 1, 0, 0, 0, 0 } },
+       { "inviteban_reget", "Resolving incomplete information found in the $0 list for {channel $1}.", 2, { 0, 0 } },
+       { "no_inviteban_list", "channel {channel $0} $1 list not set", 2, { 0, 0 } },
        { "inviting", "Inviting {nick $0} to channel {channel $1}", 2, { 0, 0 } },
        { "kicked_you", "You have been kicked off channel {channel $0} by {nick $1} ($2)", 3, { 0, 0, 0 } },
        { "kicked", "{nick $0} has been kicked off channel {channel $1} by {nick $2} ($3)", 4, { 0, 0, 0, 0 } },
index 035b8cbc48797711412787767a896c2d3c01d2ad..27c92de0ea31c77028cc75fb4facb1f3ce425248 100644 (file)
@@ -35,10 +35,11 @@ enum {
   SILCTXT_CHANNEL_NOTICE,
   SILCTXT_CHANNEL_OWNACTION,
   SILCTXT_CHANNEL_OWNNOTICE,
-  SILCTXT_CHANNEL_INVITE_LIST,
-  SILCTXT_CHANNEL_NO_INVITE_LIST,
-  SILCTXT_CHANNEL_BAN_LIST,
-  SILCTXT_CHANNEL_NO_BAN_LIST,
+  SILCTXT_CHANNEL_INVITEBAN_LIST,
+  SILCTXT_CHANNEL_INVITEBAN_STRING,
+  SILCTXT_CHANNEL_INVITEBAN_PUBKEY,
+  SILCTXT_CHANNEL_INVITEBAN_REGET,
+  SILCTXT_CHANNEL_NO_INVITEBAN_LIST,
   SILCTXT_CHANNEL_INVITING,
   SILCTXT_CHANNEL_KICKED_YOU,
   SILCTXT_CHANNEL_KICKED,
index 2e54f674610fe2828c071bbd8025ea9b5af8097a..ab7236a81dfad24d2d98d625c6108d327ced045d 100644 (file)
@@ -1102,6 +1102,118 @@ void silc_getkey_cb(bool success, void *context)
   silc_free(getkey);
 }
 
+/* Parse an invite or ban list */
+void  silc_parse_inviteban_list(SilcClient client,
+                               SilcClientConnection conn,
+                               SILC_SERVER_REC *server, 
+                               SilcChannelEntry channel, 
+                               const char *list_type,
+                               SilcArgumentPayload list)
+{
+  unsigned char *tmp;
+  SilcUInt32 type, len;
+  SILC_CHANNEL_REC *chanrec = silc_channel_find_entry(server, channel);
+  int counter=0, resolving = FALSE;
+
+  if (!silc_argument_get_arg_num(list)) {
+    printformat_module("fe-common/silc", server,
+                      (chanrec ? chanrec->visible_name : NULL),
+                      MSGLEVEL_CRAP, SILCTXT_CHANNEL_NO_INVITEBAN_LIST,
+                      channel->channel_name, list_type);
+    return;
+  }
+  
+  printformat_module("fe-common/silc", server,
+                    (chanrec ? chanrec->visible_name : NULL),
+                    MSGLEVEL_CRAP, SILCTXT_CHANNEL_INVITEBAN_LIST,
+                    channel->channel_name, list_type);
+
+  /* parse the list */
+  tmp = silc_argument_get_first_arg(list, &type, &len);
+  while (tmp) {
+    switch (type) {
+      case 1:
+       {
+         /* an invite string */
+         unsigned char **list;
+         int i=0;
+               
+         if (tmp[len-1] == ',')
+           tmp[len-1] = '\0';
+         
+         list = g_strsplit(tmp, ",", -1);
+         while (list[i])
+           printformat_module("fe-common/silc", server,
+                              (chanrec ? chanrec->visible_name : NULL),
+                              MSGLEVEL_CRAP, SILCTXT_CHANNEL_INVITEBAN_STRING,
+                              ++counter, channel->channel_name, list_type,
+                              list[i++]);
+         g_strfreev(list);
+       }
+       break;
+
+      case 2:
+       {
+         /* a public key */
+         char *fingerprint, *babbleprint;
+
+         fingerprint = silc_hash_fingerprint(NULL, tmp, len);
+         babbleprint = silc_hash_fingerprint(NULL, tmp, len);
+
+         printformat_module("fe-common/silc", server,
+                            (chanrec ? chanrec->visible_name : NULL),
+                            MSGLEVEL_CRAP, SILCTXT_CHANNEL_INVITEBAN_PUBKEY,
+                            ++counter, channel->channel_name, list_type,
+                            fingerprint, babbleprint);
+       }
+       break;
+       
+      case 3:
+       {
+         /* a client ID */
+         SilcClientID *client_id;
+         SilcClientEntry client_entry;
+         
+         client_id = silc_id_payload_parse_id(tmp, len, NULL);
+                         
+         if (client_id == NULL) {
+           silc_say_error("Invalid data in %s list encountered", list_type);
+           break;
+         }
+
+         client_entry = silc_client_get_client_by_id(client, conn, client_id);
+
+         if (client_entry) {
+           printformat_module("fe-common/silc", server,
+                              (chanrec ? chanrec->visible_name : NULL),
+                              MSGLEVEL_CRAP, SILCTXT_CHANNEL_INVITEBAN_STRING,
+                              ++counter, channel->channel_name, list_type,
+                              client_entry->nickname);
+         } else {
+           resolving = TRUE;
+           silc_client_get_client_by_id_resolve(client, conn, client_id,
+                                                NULL, NULL, NULL);
+         }
+
+         silc_free(client_id);
+       }
+       break;
+       
+      default:
+       /* "trash" */
+       silc_say_error("Unkown type in %s list: %u (len %u)",
+                      list_type, type, len);
+    }
+    tmp = silc_argument_get_next_arg(list, &type, &len);
+  }
+
+  if (resolving)
+    printformat_module("fe-common/silc", server, 
+                      (chanrec ? chanrec->visible_name : NULL),
+                      MSGLEVEL_CRAP, SILCTXT_CHANNEL_INVITEBAN_REGET,
+                      list_type, channel->channel_name);
+}
+
 /* Command reply handler. This function is called always in the command reply
    function. If error occurs it will be called as well. Normal scenario
    is that it will be called after the received command data has been parsed
@@ -1326,28 +1438,26 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
   case SILC_COMMAND_INVITE:
     {
       SilcChannelEntry channel;
-      char *invite_list;
-      SilcArgumentPayload args;
-      int argc = 0;
+      SilcBuffer payload;
+      SilcArgumentPayload invite_list;
+      SilcUInt32 argc;
       
       if (!success)
        return;
       
       channel = va_arg(vp, SilcChannelEntry);
-      invite_list = va_arg(vp, char *);
-
-      args = silc_command_get_args(cmd_payload);
-      if (args)
-       argc = silc_argument_get_arg_num(args);
-
-      if (invite_list)
-       printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
-                          SILCTXT_CHANNEL_INVITE_LIST, channel->channel_name,
-                          invite_list);
-      else if (argc == 3)
-       printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
-                          SILCTXT_CHANNEL_NO_INVITE_LIST, 
-                          channel->channel_name);
+      payload = va_arg(vp, SilcBuffer);
+
+      if (payload) {
+       SILC_GET16_MSB(argc, payload->data);
+       invite_list = silc_argument_payload_parse(payload->data + 2, 
+                                                 payload->len - 2, argc);
+       if (invite_list) {
+         silc_parse_inviteban_list(client, conn, server, channel, 
+                                   "invite", invite_list);
+         silc_argument_payload_free(invite_list);
+       }
+      }
     }
     break;
 
@@ -1624,22 +1734,26 @@ silc_command_reply(SilcClient client, SilcClientConnection conn,
   case SILC_COMMAND_BAN:
     {
       SilcChannelEntry channel;
-      char *ban_list;
+      SilcBuffer payload;
+      SilcArgumentPayload ban_list;
+      SilcUInt32 argc;
       
       if (!success)
        return;
       
       channel = va_arg(vp, SilcChannelEntry);
-      ban_list = va_arg(vp, char *);
-      
-      if (ban_list)
-       printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
-                          SILCTXT_CHANNEL_BAN_LIST, channel->channel_name,
-                          ban_list);
-      else
-       printformat_module("fe-common/silc", server, NULL, MSGLEVEL_CRAP,
-                          SILCTXT_CHANNEL_NO_BAN_LIST, 
-                          channel->channel_name);
+      payload = va_arg(vp, SilcBuffer);
+
+      if (payload) {
+       SILC_GET16_MSB(argc, payload->data);
+       ban_list = silc_argument_payload_parse(payload->data + 2, 
+                                              payload->len - 2, argc);
+       if (ban_list) {
+         silc_parse_inviteban_list(client, conn, server, channel, 
+                                   "ban", ban_list);
+         silc_argument_payload_free(ban_list);
+       }
+      }
     }
     break;