X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fidlist.h;fp=apps%2Fsilcd%2Fidlist.h;h=0000000000000000000000000000000000000000;hb=72c2de619079457f7a68100eb13385275a424a23;hp=25705a9873d20bcda1fd76e17096ae062a7f6052;hpb=e7b6c157b80152bf9fb9266e6bdd93f9fb0db776;p=runtime.git diff --git a/apps/silcd/idlist.h b/apps/silcd/idlist.h deleted file mode 100644 index 25705a98..00000000 --- a/apps/silcd/idlist.h +++ /dev/null @@ -1,634 +0,0 @@ -/* - - idlist.h - - Author: Pekka Riikonen - - Copyright (C) 1997 - 2005, 2007 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 - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - -*/ - -#ifndef IDLIST_H -#define IDLIST_H - -#include "serverconfig.h" - -/* Context for holding cache information to periodically purge - the cache. */ -typedef struct { - SilcIDCache cache; - SilcUInt32 timeout; -} *SilcIDListPurge; - -/* Channel key re-key context. */ -typedef struct { - SilcChannelEntry channel; - SilcUInt32 key_len; - SilcTask task; -} *SilcServerChannelRekey; - -/* ID List Entry status flags. */ -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 */ -#define SILC_IDLIST_STATUS_RESUMED 0x10 /* Entry is resumed */ -#define SILC_IDLIST_STATUS_LOCAL 0x20 /* Entry locally connected */ -#define SILC_IDLIST_STATUS_RESUME_RES 0x40 /* Entry resolved while - resuming */ -#define SILC_IDLIST_STATUS_NOATTR 0x80 /* Entry does not support - attributes in WHOIS */ - -/* - 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. - -*/ -struct SilcIDListDataObject { - SilcConnectionType conn_type; /* Connection type */ - SilcServerConnection sconn; /* Connection context */ - SilcSKERekeyMaterial rekey; /* Rekey material */ - SilcHash hash; - - /* Public key */ - SilcPublicKey public_key; - unsigned char fingerprint[20]; - - 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 */ -}; - -/* - SILC Server entry object. - - This entry holds information about servers in SILC network. However, - contents of this entry is highly dependent of what kind of server we are - (normal server or router server) and whether the entry is used as a local - list or a global list. These factors dictates the contents of this entry. - - This entry is defined as follows: - - Server type List type Contents - ======================================================================= - server local list Server itself - server global list NULL - router local list All servers is the cell - router global list All servers in the SILC network - - 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. - - SilcUInt8 server_type - - Type of the server. SILC_SERVER or SILC_ROUTER are the possible - choices for this. - - SilcServerID *id - - ID of the server. This includes all the relevant information about - 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 - where this server is connected to. If this is the router itself and - it doesn't have a route this is NULL. - - SilcCipher send_key - SilcCipher receive_key - - Data sending and receiving keys. - - void *connection - - A pointer, usually, to the socket list for fast referencing to - the data used in connection with this server. This may be anything - but as just said, this is usually pointer to the socket connection - list. - -*/ -struct SilcServerEntryStruct { - /* Generic data structure. DO NOT add anything before this! */ - SilcIDListDataStruct data; - - char *server_name; - SilcUInt8 server_type; - SilcServerID *id; - char *server_info; - char *motd; - - /* Pointer to the router */ - SilcServerEntry router; - - /* Connection data */ - void *connection; - - void *backup_proto; - unsigned int backup : 1; /* Set when executing backup protocol */ -}; - -/* - 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. - - This entry holds information about connected clients ie. users in the SILC - network. The contents of this entrt is depended on whether we are normal - server or router server and whether the list is a local or global list. - - This entry is defined as follows: - - Server type List type Contents - ======================================================================= - server local list All clients in server - server global list NULL - router local list All clients in cell - router global list All clients in SILC - - 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. This is nickname in original format, - not casefolded or normalized. However, it is checked to assure - that prohibited characters do not exist. The casefolded version - is in the ID Cache. - - char *servername - - The name of the server where the client is from. MAy be NULL. - - char username - - Client's usename. This is defined in the following manner: - - Server type List type Contents - ==================================================== - server local list User's name - router local list NULL - router global list NULL - - Router doesn't hold this information since it is not vital data - for the router. If this information is needed by the client it is - fetched when it is needed. - - char userinfo - - Information about user. This is free information and can be virtually - anything. This is defined in following manner: - - Server type List type Contents - ==================================================== - server local list User's information - router local list NULL - router global list NULL - - Router doesn't hold this information since it is not vital data - for the router. If this information is needed by the client it is - fetched when it is needed. - - SilcClientID *id - - ID of the client. This includes all the information SILC will ever - need. Notice that no nickname of the user is saved anywhere. This is - beacuse of SilcClientID includes 88 bit hash value of the user's - nickname which can be used to track down specific user by their - nickname. Nickname is not relevant information that would need to be - saved as plain. - - SilcUInt32 mode - - Client's mode. Client maybe for example server operator or - router operator (SILC operator). - - 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(). - - SilcUInt8 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. - - SilcHashTable channels; - - 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 - - A pointer, usually, to the socket list for fast referencing to - the data used in connection with this client. This may be anything - 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 { - /* Generic data structure. DO NOT add anything before this! */ - SilcIDListDataStruct data; - - unsigned char *nickname; - char *servername; - char *username; - char *userinfo; - SilcClientID *id; - SilcUInt32 mode; - - long last_command; - SilcUInt8 fast_command; - - /* Requested Attributes */ - unsigned char *attrs; - SilcUInt16 attrs_len; - - /* Pointer to the router */ - SilcServerEntry router; - - /* All channels this client has joined */ - SilcHashTable channels; - - /* Connection data */ - void *connection; - - /* Last time updated/accessed */ - unsigned long updated; - - /* data.status is RESOLVING and this includes the resolving command - reply identifier. */ - SilcUInt16 resolve_cmd_ident; - - /* we need this so nobody can resume more than once at the same time - - * server crashes, really odd behaviour, ... */ - SilcClientEntry resuming_client; -}; - -/* - SILC Channel entry object. - - This entry holds information about channels in SILC network. The contents - of this entry is depended on whether we are normal server or router server - and whether the list is a local or global list. - - This entry is defined as follows: - - Server type List type Contents - ======================================================================= - server local list All channels in server - server global list NULL - router local list All channels in cell - router global list All channels in SILC - - Following short description of the fields: - - char *channel_name - - Logical name of the channel. This is the original format, not - the casefolded or normalized. However, this is checked to assure - that prohibited characters do not exist. The casefolded version - is in the ID Cache. - - SilcUInt32 mode - - 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. - - SilcBool 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 - the server that there are users outside your server on your - channel as well. This way server knows that messages needs to be - sent to the router for further routing. If this is a normal - server and this channel is not created on this server this field - is always TRUE. If this server is a router this field is ignored. - - char *topic - - 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 - - If the SILC_CMODE_FOUNDER_AUTH has been set then this will include - the founder's public key. When the mode and this key is set the - channel is also permanent channel and cannot be destroyed. - - 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 - whose cell this channel belongs to. This is used to route messages - to this channel. - - SilcCipher send_key - SilcCipher receive_key - - The key of the channel (the cipher actually). - - unsigned char *key - SilcUInt32 key_len - - Raw key data of the channel key. - - unsigned char iv[SILC_CIPHER_MAX_IV_SIZE] - - 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; - SilcUInt32 mode; - SilcChannelID *id; - char *topic; - char *cipher; - char *hmac_name; - SilcPublicKey founder_key; - SilcHashTable channel_pubkeys; - - SilcUInt32 user_limit; - unsigned char *passphrase; - SilcHashTable invite_list; - SilcHashTable ban_list; - - /* All users on this channel */ - SilcHashTable user_list; - SilcUInt32 user_count; - - /* Pointer to the router */ - SilcServerEntry router; - - /* Channel keys */ - SilcCipher send_key; - SilcCipher receive_key; - unsigned char *key; - SilcUInt32 key_len; - SilcHmac hmac; - - SilcServerChannelRekey rekey; - unsigned long created; - unsigned long updated; - - /* Flags */ - unsigned int global_users : 1; - unsigned int disabled : 1; - unsigned int users_resolved : 1; -}; - -/* - SILC ID List object. - - As for remainder these lists are defined as follows: - - Entry list (cache) Server type List type Contents - ======================================================================= - servers server local list Server itself - servers server global list NULL - servers router local list All servers in cell - servers router global list All servers in SILC - - clients server local list All clients in server - clients server global list NULL - clients router local list All clients in cell - clients router global list All clients in SILC - - channels server local list All channels in server - channels server global list NULL - channels router local list All channels in cell - channels router global list All channels in SILC - - As seen on the list normal server never defines a global list. This is - because of normal server don't know anything about anything global data, - they get it from the router if and when they need it. Routers, on the - other hand, always define local and global lists because routers really - know all the relevant data in the SILC network. - - This object is used as local and global list by the server/router. - Above table shows how this is defined on different conditions. - - This object holds pointers to the ID cache system. Every ID cache entry - has a specific context pointer to allocated entry (server, client or - channel entry). - -*/ -struct SilcIDListStruct { - SilcIDCache servers; - SilcIDCache clients; - SilcIDCache channels; -}; - -/* - 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 - structure instead until we know what type of connection remote end is. - - This is not in any list. This is always individually allocated and - used as such. - -*/ -typedef struct { - /* Generic data structure. DO NOT add anything before this! */ - SilcIDListDataStruct data; - SilcAsyncOperation op; - SilcServerConfigRef cconfig; - SilcServerConfigRef sconfig; - SilcServerConfigRef rconfig; - SilcServer server; - const char *hostname; - const char *ip; - SilcUInt16 port; -} *SilcUnknownEntry; - -/* Prototypes */ -void silc_idlist_add_data(void *entry, SilcIDListData idata); -void silc_idlist_del_data(void *entry); -SILC_TASK_CALLBACK(silc_idlist_purge); -SilcServerEntry -silc_idlist_add_server(SilcIDList id_list, - char *server_name, int server_type, - SilcServerID *id, SilcServerEntry router, - void *connection); -SilcServerEntry -silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id, - SilcBool registered, SilcIDCacheEntry *ret_entry); -SilcServerEntry -silc_idlist_find_server_by_name(SilcIDList id_list, char *name, - SilcBool registered, SilcIDCacheEntry *ret_entry); -SilcServerEntry -silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname, - int port, SilcBool 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); -void silc_idlist_server_destructor(SilcIDCache cache, - SilcIDCacheEntry entry, - void *dest_context, - void *app_context); -SilcClientEntry -silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username, - char *userinfo, SilcClientID *id, - 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, - SilcUInt32 *clients_count); -int silc_idlist_get_clients_by_hash(SilcIDList id_list, - char *nickname, char *server, - SilcHash md5hash, - SilcClientEntry **clients, - SilcUInt32 *clients_count); -SilcClientEntry -silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id, - SilcBool registered, SilcIDCacheEntry *ret_entry); -SilcClientEntry -silc_idlist_replace_client_id(SilcServer server, - SilcIDList id_list, SilcClientID *old_id, - SilcClientID *new_id, const char *nickname); -void silc_idlist_client_destructor(SilcIDCache cache, - SilcIDCacheEntry entry, - void *dest_context, - void *app_context); -SilcChannelEntry -silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode, - SilcChannelID *id, SilcServerEntry router, - SilcCipher send_key, SilcCipher receive_key, - SilcHmac hmac); -void silc_idlist_channel_destructor(SilcIDCache cache, - SilcIDCacheEntry entry, - void *dest_context, - void *app_context); -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_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, - SilcUInt32 *channels_count); - -#endif