X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Fsilcd%2Fidlist.h;h=bd526b9368ba5732f09953162312f6e7ad15724a;hp=52d3307e7bb9eb4e887cee156701b93644f20811;hb=e5d8d3db6caa344b3d419b884556c21b15e7d123;hpb=856ad4ebd2611d8f3d22264c55de48332bf4e3ec diff --git a/apps/silcd/idlist.h b/apps/silcd/idlist.h index 52d3307e..bd526b93 100644 --- a/apps/silcd/idlist.h +++ b/apps/silcd/idlist.h @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2000 Pekka Riikonen + Copyright (C) 1997 - 2001 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,6 +26,81 @@ 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; + SilcSchedule schedule; +} *SilcIDListPurge; + +/* Channel key re-key context. */ +typedef struct { + void *context; + SilcChannelEntry channel; + uint32 key_len; + SilcTask task; +} *SilcServerChannelRekey; + +/* Generic rekey context for connections */ +typedef struct { + /* Current sending encryption key, provided for re-key. The `pfs' + is TRUE if the Perfect Forward Secrecy is performed in re-key. */ + unsigned char *send_enc_key; + uint32 enc_key_len; + int ske_group; + bool pfs; + uint32 timeout; + void *context; +} *SilcServerRekey; + +/* ID List Entry status type and all the types. */ +typedef uint8 SilcIDListStatus; +#define SILC_IDLIST_STATUS_NONE 0x00 /* No status */ +#define SILC_IDLIST_STATUS_REGISTERED 0x01 /* Entry is registered */ +#define SILC_IDLIST_STATUS_RESOLVED 0x02 /* Entry info is resolved */ +#define SILC_IDLIST_STATUS_RESOLVING 0x04 /* Entry is being resolved + with WHOIS or IDENTIFY */ +#define SILC_IDLIST_STATUS_DISABLED 0x08 /* Entry is disabled */ + +/* + Generic ID list data structure. + + This structure is included in all ID list entries and it includes data + pointers that are common to all ID entries. This structure is always + defined to the first field in the ID entries and is used to explicitly + type cast to this type without first explicitly casting to correct ID + entry type. Hence, the ID list entry is type casted to this type to + get this data from the ID entry (which is usually opaque pointer). + + Note that some of the fields may be NULL. + +*/ +typedef struct { + /* Send and receive symmetric keys */ + SilcCipher send_key; + SilcCipher receive_key; + + /* Re-key context */ + SilcServerRekey rekey; + + /* Hash selected in the SKE protocol, NULL if not needed at all */ + SilcHash hash; + + /* HMAC */ + SilcHmac hmac_send; + SilcHmac hmac_receive; + + /* Public key */ + SilcPublicKey public_key; + + long last_receive; /* Time last received data */ + long last_sent; /* Time last sent data */ + + unsigned long created; /* Time when entry was created */ + + SilcIDListStatus status; /* Status mask of the entry */ +} *SilcIDListData, SilcIDListDataStruct; + /* SILC Server entry object. @@ -45,12 +120,16 @@ typedef struct SilcChannelEntryStruct *SilcChannelEntry; Following short description of the fields: + SilcIDListDataStruct data + + Generic data structure to hold data common to all ID entries. + char *server_name Logical name of the server. There is no limit of the length of the server name. This is usually the same name as defined in DNS. - int server_type + uint8 server_type Type of the server. SILC_SERVER or SILC_ROUTER are the possible choices for this. @@ -61,9 +140,11 @@ typedef struct SilcChannelEntryStruct *SilcChannelEntry; the server SILC will ever need. These are also the informations that is broadcasted between servers and routers in the SILC network. - long last_receive + char *server_info + char *motd - Time when data was received from the server last time. + Server info (from INFO command) saved temporarily and motd (from + MOTD command) saved temporarily. SilcServerEntry router @@ -85,26 +166,18 @@ typedef struct SilcChannelEntryStruct *SilcChannelEntry; */ struct SilcServerEntryStruct { + /* Generic data structure. DO NOT add anything before this! */ + SilcIDListDataStruct data; + char *server_name; - int server_type; + uint8 server_type; SilcServerID *id; - long last_receive; - - /* TRUE when server is registered to server */ - int registered; + char *server_info; + char *motd; /* Pointer to the router */ SilcServerEntry router; - /* Keys */ - SilcCipher send_key; - SilcCipher receive_key; - SilcPKCS pkcs; - SilcPublicKey public_key; - SilcHmac hmac; - unsigned char *hmac_key; - unsigned int hmac_key_len; - /* Connection data */ void *connection; }; @@ -114,13 +187,13 @@ struct SilcServerEntryStruct { This entry used only by the SilcChannelEntry object and it holds information about current clients (ie. users) on channel. Following - short description of the fields: + short description of the fields: SilcClientEntry client Pointer to the client list. This is the client currently on channel. - unsigned int mode + uint32 mode Client's current mode on the channel. @@ -130,21 +203,11 @@ struct SilcServerEntryStruct { SilcClientEntry we have this here for fast access to the channel when used by SilcClientEntry. - struct SilcChannelClientEntryStruct *client_list - struct SilcChannelClientEntryStruct *channel_list - - List member pointers. This structure is used by channel entry and - client entry thus we must have separate list member pointers for - them since we are using same entry for both lists (the entry is not - duplicated). SilcList requires this. - */ typedef struct SilcChannelClientEntryStruct { SilcClientEntry client; - unsigned int mode; + uint32 mode; SilcChannelEntry channel; - struct SilcChannelClientEntryStruct *client_list; - struct SilcChannelClientEntryStruct *channel_list; } *SilcChannelClientEntry; /* @@ -165,10 +228,21 @@ typedef struct SilcChannelClientEntryStruct { Following short description of the fields: + SilcIDListDataStruct data + + Generic data structure to hold data common to all ID entries. + + unsigned char *nickname + + The nickname of the client. + + char *servername + + The name of the server where the client is from. MAy be NULL. + 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 ==================================================== @@ -204,27 +278,22 @@ typedef struct SilcChannelClientEntryStruct { nickname. Nickname is not relevant information that would need to be saved as plain. - int mode + uint32 mode Client's mode. Client maybe for example server operator or router operator (SILC operator). - long last_receive - - Time of last time data was received from the client. This is - result of normal time(). - long last_command Time of last time client executed command. We are strict and will not allow any command to be exeucted more than once in about 2 seconds. This is result of normal time(). - int registered + uint8 fast_command - Boolean value to indicate whether this client has registered itself - to the server. After KE and authentication protocols has been - successfully completed will client become registered. + 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 @@ -232,18 +301,11 @@ typedef struct SilcChannelClientEntryStruct { 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. - - SilcPKCS pkcs + SilcHashTable channels; - PKCS of the client. This maybe NULL. - - SilcHmac hmac - - MAC key used to compute MAC's for packets. + All the channels this client has joined. The context saved in the + hash table shares memory with the channel entrys `user_list' hash + table. void *connection @@ -252,36 +314,41 @@ typedef struct SilcChannelClientEntryStruct { but as just said, this is usually pointer to the socket connection list. + uint16 resolve_cmd_ident + + Command identifier for the entry when the entry's data.status + is SILC_IDLIST_STATUS_RESOLVING. If this entry is asked to be + resolved when the status is set then the resolver may attach to + this command identifier and handle the process after the resolving + is over. + */ struct SilcClientEntryStruct { - char *nickname; + /* Generic data structure. DO NOT add anything before this! */ + SilcIDListDataStruct data; + + unsigned char *nickname; + char *servername; char *username; char *userinfo; SilcClientID *id; - int mode; + uint32 mode; - /* Time of last accesses of the client */ - long last_receive; long last_command; - - /* TRUE when client is registered to server */ - int registered; + uint8 fast_command; /* Pointer to the router */ SilcServerEntry router; - /* List of channels client has joined to */ - SilcList channels; - - /* Keys */ - SilcCipher send_key; - SilcCipher receive_key; - SilcPKCS pkcs; - SilcHmac hmac; - SilcPublicKey public_key; + /* All channels this client has joined */ + SilcHashTable channels; /* Connection data */ void *connection; + + /* data.status is RESOLVING and this includes the resolving command + reply identifier. */ + uint16 resolve_cmd_ident; }; /* @@ -306,7 +373,7 @@ struct SilcClientEntryStruct { Logical name of the channel. - unsigned int mode + uint32 mode Current mode of the channel. See lib/silccore/silcchannel.h for all modes. @@ -316,7 +383,7 @@ struct SilcClientEntryStruct { ID of the channel. This includes all the information SILC will ever need. - int global_users + bool global_users Boolean value to tell whether there are users outside this server on this channel. This is set to TRUE if router sends message to @@ -335,6 +402,27 @@ 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 + uint32 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. + + SilcHashTable user_list + + All users joined on this channel. Note that the context saved to + this entry shares memory with the client entrys `channels' hash + table. + SilcServerEntry router This is a pointer to the server list. This is the router server @@ -346,7 +434,7 @@ struct SilcClientEntryStruct { The key of the channel (the cipher actually). unsigned char *key - unsigned int key_len + uint32 key_len Raw key data of the channel key. @@ -355,27 +443,36 @@ 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; - unsigned int mode; + uint32 mode; SilcChannelID *id; - int global_users; + bool 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; + uint32 founder_passwd_len; - /* List of users on channel */ - SilcList user_list; + uint32 user_limit; + unsigned char *passphrase; + char *invite_list; + char *ban_list; + + /* All users on this channel */ + SilcHashTable user_list; /* Pointer to the router */ SilcServerEntry router; @@ -383,8 +480,13 @@ struct SilcChannelEntryStruct { /* Channel keys */ SilcCipher channel_key; unsigned char *key; - unsigned int key_len; + uint32 key_len; unsigned char iv[SILC_CIPHER_MAX_IV_SIZE]; + SilcHmac hmac; + + SilcServerChannelRekey rekey; + + unsigned long created; }; /* @@ -441,61 +543,70 @@ typedef struct SilcIDListStruct { */ typedef struct { - SilcCipher send_key; - SilcCipher receive_key; - SilcPKCS pkcs; - SilcPublicKey public_key; - - SilcHmac hmac; - unsigned char *hmac_key; - unsigned int hmac_key_len; - - /* SilcComp comp */ + /* Generic data structure. DO NOT add anything before this! */ + SilcIDListDataStruct data; } *SilcUnknownEntry; /* 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, SilcServerID *id, SilcServerEntry router, - SilcCipher send_key, SilcCipher receive_key, - SilcPKCS pkcs, SilcHmac hmac, - SilcPublicKey public_key, void *connection); + void *connection); SilcServerEntry -silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id); +silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id, + bool registered, SilcIDCacheEntry *ret_entry); +SilcServerEntry +silc_idlist_find_server_by_name(SilcIDList id_list, char *name, + bool registered, SilcIDCacheEntry *ret_entry); +SilcServerEntry +silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname, + int port, bool registered, + SilcIDCacheEntry *ret_entry); SilcServerEntry silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id, SilcServerID *new_id); +int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry); SilcClientEntry -silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, +silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, char *userinfo, SilcClientID *id, - SilcServerEntry router, - SilcCipher send_key, SilcCipher receive_key, - SilcPKCS pkcs, SilcHmac hmac, - SilcPublicKey public_key, 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_find_client_by_nickname(SilcIDList id_list, char *nickname, - char *server); + SilcServerEntry router, void *connection); +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, + uint32 *clients_count); +int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname, + SilcHash md5hash, + SilcClientEntry **clients, + uint32 *clients_count); SilcClientEntry -silc_idlist_find_client_by_hash(SilcIDList id_list, char *nickname, - SilcHash md5hash); -SilcClientEntry -silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id); +silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id, + bool registered, SilcIDCacheEntry *ret_entry); 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); -void silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry); + 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, + SilcIDCacheEntry *ret_entry); SilcChannelEntry -silc_idlist_find_channel_by_name(SilcIDList id_list, char *name); +silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id, + SilcIDCacheEntry *ret_entry); SilcChannelEntry -silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id); +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, + uint32 *channels_count); #endif