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;
+ uint32 key_len;
+} *SilcServerChannelRekey;
+
/*
Generic ID list data structure.
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;
+ uint32 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 */
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
char *server_name;
int server_type;
SilcServerID *id;
+ char *server_info;
+ char *motd;
/* Pointer to the router */
SilcServerEntry router;
Pointer to the client list. This is the client currently on channel.
- unsigned int mode
+ uint32 mode
Client's current mode on the channel.
*/
typedef struct SilcChannelClientEntryStruct {
SilcClientEntry client;
- unsigned int mode;
+ uint32 mode;
SilcChannelEntry channel;
struct SilcChannelClientEntryStruct *client_list;
struct SilcChannelClientEntryStruct *channel_list;
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
====================================================
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.
-
- SilcPKCS pkcs
+ SilcList channels
- 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
int mode;
long last_command;
+ char fast_command;
/* Pointer to the router */
SilcServerEntry router;
Logical name of the channel.
- unsigned int mode
+ uint32 mode
Current mode of the channel. See lib/silccore/silcchannel.h for
all modes.
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.
+
SilcServerEntry router
This is a pointer to the server list. This is the router server
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.
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;
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;
+
+ uint32 user_limit;
+ unsigned char *passphrase;
+ char *invite_list;
+ char *ban_list;
/* List of users on channel */
SilcList user_list;
/* 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;
};
/*
/* 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,
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,
+ uint32 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,
+ 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, 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_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,
+ uint32 *channels_count);
#endif