X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fidlist.h;h=9766921f6bccc33bd186a26f2e80d6153af8f0c1;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=e1f39ec1b7878f7351f9153a749969fea2732552;hpb=318d79b391bf6288e3e28c840217a7097f3d0392;p=silc.git diff --git a/apps/silcd/idlist.h b/apps/silcd/idlist.h index e1f39ec1..9766921f 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,87 @@ 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; + SilcUInt32 timeout; +} *SilcIDListPurge; + +/* Channel key re-key context. */ +typedef struct { + void *context; + SilcChannelEntry channel; + SilcUInt32 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; + SilcUInt32 enc_key_len; + int ske_group; + bool pfs; + SilcUInt32 timeout; + void *context; +} *SilcServerRekey; + +/* ID List Entry status type and all the types. */ +typedef SilcUInt8 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; + + /* HMAC */ + SilcHmac hmac_send; + SilcHmac hmac_receive; + + /* Packet sequence numbers */ + SilcUInt32 psn_send; + SilcUInt32 psn_receive; + + /* Hash selected in the SKE protocol, NULL if not needed at all */ + SilcHash hash; + + /* Public key */ + SilcPublicKey public_key; + unsigned char fingerprint[20]; + + /* Re-key context */ + SilcServerRekey rekey; + + 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 +126,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 + SilcUInt8 server_type Type of the server. SILC_SERVER or SILC_ROUTER are the possible choices for this. @@ -61,9 +146,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,30 +172,50 @@ typedef struct SilcChannelEntryStruct *SilcChannelEntry; */ struct SilcServerEntryStruct { + /* Generic data structure. DO NOT add anything before this! */ + SilcIDListDataStruct data; + char *server_name; - int server_type; + SilcUInt8 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; }; +/* + SILC Channel Client entry structure. + + 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: + + SilcClientEntry client + + Pointer to the client list. This is the client currently on channel. + + SilcUInt32 mode + + Client's current mode on the channel. + + SilcChannelEntry channel + + Back pointer back to channel. As this structure is also used by + SilcClientEntry we have this here for fast access to the channel when + used by SilcClientEntry. + +*/ +typedef struct SilcChannelClientEntryStruct { + SilcClientEntry client; + SilcUInt32 mode; + SilcChannelEntry channel; +} *SilcChannelClientEntry; + /* SILC Client entry object. @@ -127,10 +234,21 @@ struct SilcServerEntryStruct { 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 ==================================================== @@ -166,27 +284,22 @@ struct SilcServerEntryStruct { nickname. Nickname is not relevant information that would need to be saved as plain. - int mode + SilcUInt32 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 + SilcUInt8 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 @@ -194,18 +307,11 @@ struct SilcServerEntryStruct { cell this client is coming from. This is used to route messages to this client. - SilcCipher session_key + SilcHashTable channels; - The actual session key established by key exchange protcol between - connecting parties. This is used for both encryption and decryption. - - SilcPKCS pkcs - - 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 @@ -214,59 +320,42 @@ struct SilcServerEntryStruct { but as just said, this is usually pointer to the socket connection list. + SilcUInt16 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; + SilcUInt32 mode; - /* Time of last accesses of the client */ - long last_receive; long last_command; - - /* TRUE when client is registered to server */ - int registered; + SilcUInt8 fast_command; /* Pointer to the router */ SilcServerEntry router; - /* Pointers to channels this client has joined */ - SilcChannelEntry *channel; - unsigned int channel_count; - - /* 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; -}; - -/* - SILC Channel Client entry structure. - - 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: - - SilcClientEntry client - Pointer to the client list. This is the client currently on channel. - - int mode - - Client's current mode on the channel. - -*/ -typedef struct SilcChannelClientEntryStruct { - SilcClientEntry client; - int mode; -} *SilcChannelClientEntry; + /* data.status is RESOLVING and this includes the resolving command + reply identifier. */ + SilcUInt16 resolve_cmd_ident; +}; /* SILC Channel entry object. @@ -290,16 +379,17 @@ typedef struct SilcChannelClientEntryStruct { Logical name of the channel. - int mode + SilcUInt32 mode - Current mode of the channel. + Current mode of the channel. See lib/silccore/silcchannel.h for + all modes. SilcChannelID *id 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 @@ -313,6 +403,32 @@ typedef struct SilcChannelClientEntryStruct { Current topic of the channel. + char *cipher + + 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 + SilcUInt32 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 @@ -324,7 +440,7 @@ typedef struct SilcChannelClientEntryStruct { The key of the channel (the cipher actually). unsigned char *key - unsigned int key_len + SilcUInt32 key_len Raw key data of the channel key. @@ -333,17 +449,37 @@ typedef struct SilcChannelClientEntryStruct { 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; - int mode; + SilcUInt32 mode; SilcChannelID *id; - int global_users; + bool global_users; char *topic; + char *cipher; + char *hmac_name; + + SilcPublicKey founder_key; + SilcAuthMethod founder_method; + unsigned char *founder_passwd; + SilcUInt32 founder_passwd_len; - /* List of users on channel */ - SilcChannelClientEntry user_list; - unsigned int user_list_count; + SilcUInt32 user_limit; + unsigned char *passphrase; + char *invite_list; + char *ban_list; + + /* All users on this channel */ + SilcHashTable user_list; + SilcUInt32 user_count; /* Pointer to the router */ SilcServerEntry router; @@ -351,8 +487,14 @@ struct SilcChannelEntryStruct { /* Channel keys */ SilcCipher channel_key; unsigned char *key; - unsigned int key_len; + SilcUInt32 key_len; unsigned char iv[SILC_CIPHER_MAX_IV_SIZE]; + SilcHmac hmac; + + SilcServerChannelRekey rekey; + + unsigned long created; + bool disabled; }; /* @@ -398,7 +540,7 @@ typedef struct SilcIDListStruct { } *SilcIDList; /* - Temporary ID Entry object. + ID Entry for Unknown connections. This is used during authentication phases where we still don't know what kind of connection remote connection is, hence, we will use this @@ -409,58 +551,72 @@ 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, + 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_id(SilcIDList id_list, SilcServerID *id); +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); + SilcServerEntry router, void *connection, + int expire); +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, + SilcUInt32 *clients_count); +int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname, + SilcHash md5hash, + SilcClientEntry **clients, + SilcUInt32 *clients_count); SilcClientEntry -silc_idlist_find_client_by_nickname(SilcIDList id_list, char *nickname, - char *server); -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 expire); +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, + SilcUInt32 *channels_count); #endif