Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
- 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
typedef struct SilcClientEntryStruct *SilcClientEntry;
typedef struct SilcChannelEntryStruct *SilcChannelEntry;
+/*
+ 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
+ cast to this type without first explicitly casting to correct ID entry
+ type. Hence, the ID list entry is 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 and raw key data */
+ SilcHmac hmac;
+ unsigned char *hmac_key;
+ unsigned int hmac_key_len;
+
+ /* PKCS and public key */
+ SilcPKCS pkcs;
+ SilcPublicKey public_key;
+
+ long last_receive; /* Time last received data */
+ long last_sent; /* Time last sent data */
+ unsigned char registered; /* Boolean whether connection is registered */
+} *SilcIDListData, SilcIDListDataStruct;
+
/*
SILC Server entry object.
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
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
*/
struct SilcServerEntryStruct {
+ /* Generic data structure. DO NOT add anything before this! */
+ SilcIDListDataStruct data;
+
char *server_name;
int server_type;
SilcServerID *id;
- /* TRUE when server is registered to server */
- int registered;
-
/* 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.
+
+ unsigned int 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.
+
+ 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;
+ SilcChannelEntry channel;
+ struct SilcChannelClientEntryStruct *client_list;
+ struct SilcChannelClientEntryStruct *channel_list;
+} *SilcChannelClientEntry;
+
/*
SILC Client entry object.
Following short description of the fields:
+ SilcIDListDataStruct data
+
+ Generic data structure to hold data common to all ID entries.
+
char username
Client's (meaning user's) real name. This is defined in following
Client's mode. Client maybe for example server operator or
router operator (SILC operator).
- SilcServerEntry router
+ long last_command
- 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.
+ 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().
- SilcCipher session_key
+ char fast_command
- The actual session key established by key exchange protcol between
- connecting parties. This is used for both encryption and decryption.
+ Counter to check command bursts. By default, up to 5 commands
+ are allowed before limiting the execution. See command flags
+ for more detail.
- SilcPKCS pkcs
+ SilcServerEntry router
- PKCS of the client. This maybe NULL.
+ 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.
- SilcHmac hmac
- unsigned char *hmac_key
- unsigned int hmac_key_len
+ SilcList channels
- MAC key used to compute MAC's for packets.
+ List of channels this client has joined.
void *connection
*/
struct SilcClientEntryStruct {
- char *nickname;
+ /* Generic data structure. DO NOT add anything before this! */
+ SilcIDListDataStruct data;
+
+ unsigned char *nickname;
char *username;
char *userinfo;
SilcClientID *id;
int mode;
- /* TRUE when client is registered to server */
- int registered;
+ long last_command;
+ char 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;
- unsigned char *hmac_key;
- unsigned int hmac_key_len;
+ /* List of channels client has joined to */
+ SilcList 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;
-
/*
SILC Channel entry object.
Logical name of the channel.
- int mode
+ unsigned int mode
- Current mode of the channel.
+ Current mode of the channel. See lib/silccore/silcchannel.h for
+ all modes.
SilcChannelID *id
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.
+
SilcServerEntry router
This is a pointer to the server list. This is the router server
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.
+
*/
struct SilcChannelEntryStruct {
char *channel_name;
- int mode;
+ unsigned int mode;
SilcChannelID *id;
int global_users;
char *topic;
+ char *cipher;
+
+ /* 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;
/* List of users on channel */
- SilcChannelClientEntry user_list;
- unsigned int user_list_count;
+ SilcList user_list;
/* Pointer to the router */
SilcServerEntry router;
unsigned char *key;
unsigned int key_len;
unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
+ SilcHmac hmac;
};
/*
} *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
*/
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);
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,
+ 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);
SilcClientEntry
-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);
+silc_idlist_add_client(SilcIDList id_list, unsigned char *nickname,
+ char *username, char *userinfo, SilcClientID *id,
+ SilcServerEntry router, void *connection);
+int 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);
+ char *server,
+ SilcIDCacheEntry *ret_entry);
+SilcClientEntry
+silc_idlist_find_client_by_hash(SilcIDList id_list, char *nickname,
+ SilcHash md5hash, SilcIDCacheEntry *ret_entry);
SilcClientEntry
-silc_idlist_find_client_by_hash(SilcIDList id_list, unsigned char *hash,
- SilcHash md5hash);
+silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id,
+ SilcIDCacheEntry *ret_entry);
SilcClientEntry
-silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id);
+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);
#endif