updates.
[silc.git] / apps / silcd / idlist.h
index cbdf64f8dd45d0229b09ca9dcf6e1422ffb27b09..0fd6207b0f5a1413b0dde7b919d6f92636605707 100644 (file)
@@ -26,6 +26,20 @@ typedef struct SilcServerEntryStruct *SilcServerEntry;
 typedef struct SilcClientEntryStruct *SilcClientEntry;
 typedef struct SilcChannelEntryStruct *SilcChannelEntry;
 
+/* Context for holding cache information to periodically purge
+   the cache. */
+typedef struct {
+  SilcIDCache cache;
+  void *timeout_queue;
+} *SilcIDListPurge;
+
+/* Channel key re-key context. */
+typedef struct {
+  void *context;
+  SilcChannelEntry channel;
+  unsigned int key_len;
+} *SilcServerChannelRekey;
+
 /*
    Generic ID list data structure.
 
@@ -44,16 +58,17 @@ typedef struct {
   SilcCipher send_key;
   SilcCipher receive_key;
 
+  /* Hash selected in the SKE protocol, NULL if not needed at all */
+  SilcHash hash;
+
   /* HMAC and raw key data */
   SilcHmac hmac;
   unsigned char *hmac_key;
   unsigned int hmac_key_len;
 
-  /* PKCS and public key */
-  SilcPKCS pkcs;
+  /* public key */
   SilcPublicKey public_key;
 
-  unsigned short cmd_ident;  /* Current command identifier, 0 not used */
   long last_receive;         /* Time last received data */
   long last_sent;           /* Time last sent data */
   unsigned char registered;  /* Boolean whether connection is registered */
@@ -98,6 +113,12 @@ typedef struct {
        the server SILC will ever need. These are also the informations
        that is broadcasted between servers and routers in the SILC network.
 
+   char *server_info
+   char *motd
+
+       Server info (from INFO command) saved temporarily and motd (from
+       MOTD command) saved temporarily.
+
    SilcServerEntry router
 
        This is a pointer back to the server list. This is the router server 
@@ -124,6 +145,8 @@ struct SilcServerEntryStruct {
   char *server_name;
   int server_type;
   SilcServerID *id;
+  char *server_info;
+  char *motd;
 
   /* Pointer to the router */
   SilcServerEntry router;
@@ -194,8 +217,7 @@ typedef struct SilcChannelClientEntryStruct {
 
    char username
 
-       Client's (meaning user's) real name. This is defined in following 
-       manner:
+       Client's usename. This is defined in the following manner:
 
        Server type   List type      Contents
        ====================================================
@@ -242,24 +264,21 @@ typedef struct SilcChannelClientEntryStruct {
        not allow any command to be exeucted more than once in about
        2 seconds. This is result of normal time().
 
+   char fast_command
+
+       Counter to check command bursts.  By default, up to 5 commands
+       are allowed before limiting the execution.  See command flags
+       for more detail.
+
    SilcServerEntry router
 
        This is a pointer to the server list. This is the router server whose 
        cell this client is coming from. This is used to route messages to 
        this client.
 
-   SilcCipher session_key
-
-       The actual session key established by key exchange protcol between
-       connecting parties. This is used for both encryption and decryption.
+   SilcList channels
 
-   SilcPKCS pkcs
-
-       PKCS of the client. This maybe NULL.
-
-   SilcHmac hmac
-
-       MAC key used to compute MAC's for packets. 
+       List of channels this client has joined.
 
    void *connection
 
@@ -280,6 +299,7 @@ struct SilcClientEntryStruct {
   int mode;
 
   long last_command;
+  char fast_command;
 
   /* Pointer to the router */
   SilcServerEntry router;
@@ -342,6 +362,21 @@ struct SilcClientEntryStruct {
        Default cipher of the channel. If this is NULL then server picks
        the cipher to be used. This can be set at SILC_COMMAND_JOIN.
 
+   char *hmac_name
+
+       Default hmac of the channel. If this is NULL then server picks
+       the cipher to be used. This can be set at SILC_COMMAND_JOIN.
+
+   SilcPublicKey founder_key
+   SilcAuthMethod founder_method
+   unsigned char *founder_passwd
+   unsigned int founder_passwd_len
+
+       If the SILC_CMODE_FOUNDER_AUTH has been set then these will include
+       the founder's public key, authentication method and the password
+       if the method is SILC_AUTH_PASSWORD.  If it is SILC_AUTH_PUBLIC_KEY
+       then the `founder_passwd' is NULL.
+
    SilcServerEntry router
 
        This is a pointer to the server list. This is the router server 
@@ -362,6 +397,14 @@ struct SilcClientEntryStruct {
        Current initial vector. Initial vector is received always along
        with the channel packet. By default this is filled with NULL.
 
+   SilcHmac hmac;
+
+       HMAC of the channel.
+
+   SilcServerChannelRekey rekey
+
+       Channel key re-key context.
+
 */
 struct SilcChannelEntryStruct {
   char *channel_name;
@@ -370,16 +413,17 @@ struct SilcChannelEntryStruct {
   int global_users;
   char *topic;
   char *cipher;
+  char *hmac_name;
 
-  /* Data that is related to different channel modes. */
-  struct {
-    unsigned int user_limit;
-    unsigned char *passphrase;
-    unsigned char *ban_list;
-    unsigned char *invite_list;
-    unsigned char *cipher;
-    unsigned int key_len;
-  } mode_data;
+  SilcPublicKey founder_key;
+  SilcAuthMethod founder_method;
+  unsigned char *founder_passwd;
+  unsigned int founder_passwd_len;
+
+  unsigned int user_limit;
+  unsigned char *passphrase;
+  char *invite_list;
+  char *ban_list;
 
   /* List of users on channel */
   SilcList user_list;
@@ -392,6 +436,9 @@ struct SilcChannelEntryStruct {
   unsigned char *key;
   unsigned int key_len;
   unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
+  SilcHmac hmac;
+
+  SilcServerChannelRekey rekey;
 };
 
 /* 
@@ -455,6 +502,7 @@ typedef struct {
 /* Prototypes */
 void silc_idlist_add_data(void *entry, SilcIDListData idata);
 void silc_idlist_del_data(void *entry);
+SILC_TASK_CALLBACK_GLOBAL(silc_idlist_purge);
 SilcServerEntry 
 silc_idlist_add_server(SilcIDList id_list, 
                       char *server_name, int server_type,
@@ -464,25 +512,29 @@ SilcServerEntry
 silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id,
                              SilcIDCacheEntry *ret_entry);
 SilcServerEntry
+silc_idlist_find_server_by_name(SilcIDList id_list, char *name,
+                               SilcIDCacheEntry *ret_entry);
+SilcServerEntry
+silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname,
+                               int port, SilcIDCacheEntry *ret_entry);
+SilcServerEntry
 silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
                              SilcServerID *new_id);
-void silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry);
+int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry);
 SilcClientEntry
 silc_idlist_add_client(SilcIDList id_list, unsigned char *nickname, 
-                      char *username, char *userinfo, SilcClientID *id, 
+                      unsigned int nickname_len, char *username, 
+                      char *userinfo, SilcClientID *id, 
                       SilcServerEntry router, void *connection);
-void silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry);
-SilcClientEntry *
-silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
-                                   char *server, unsigned int *clients_count);
-SilcClientEntry *
-silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
-                               SilcHash md5hash,
-                               unsigned int *clients_count);
-SilcClientEntry
-silc_idlist_find_client_by_nickname(SilcIDList id_list, char *nickname,
-                                   char *server,
-                                   SilcIDCacheEntry *ret_entry);
+int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry);
+int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
+                                       char *server, 
+                                       SilcClientEntry **clients,
+                                       unsigned int *clients_count);
+int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
+                                   SilcHash md5hash,
+                                   SilcClientEntry **clients,
+                                   unsigned int *clients_count);
 SilcClientEntry
 silc_idlist_find_client_by_hash(SilcIDList id_list, char *nickname,
                                SilcHash md5hash, SilcIDCacheEntry *ret_entry);
@@ -492,10 +544,12 @@ silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id,
 SilcClientEntry
 silc_idlist_replace_client_id(SilcIDList id_list, SilcClientID *old_id,
                              SilcClientID *new_id);
+void silc_idlist_client_destructor(SilcIDCache cache,
+                                  SilcIDCacheEntry entry);
 SilcChannelEntry
 silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
                        SilcChannelID *id, SilcServerEntry router,
-                       SilcCipher channel_key);
+                       SilcCipher channel_key, SilcHmac hmac);
 int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry);
 SilcChannelEntry
 silc_idlist_find_channel_by_name(SilcIDList id_list, char *name,
@@ -503,5 +557,11 @@ silc_idlist_find_channel_by_name(SilcIDList id_list, char *name,
 SilcChannelEntry
 silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id,
                               SilcIDCacheEntry *ret_entry);
+SilcChannelEntry
+silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id,
+                              SilcChannelID *new_id);
+SilcChannelEntry *
+silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id,
+                        unsigned int *channels_count);
 
 #endif