#define IDLIST_H
/* Forward declarations */
-typedef struct SilcServerListStruct SilcServerList;
-typedef struct SilcClientListStruct SilcClientList;
-typedef struct SilcChannelListStruct SilcChannelList;
+typedef struct SilcServerEntryStruct *SilcServerEntry;
+typedef struct SilcClientEntryStruct *SilcClientEntry;
+typedef struct SilcChannelEntryStruct *SilcChannelEntry;
/*
- SILC Server list object.
+ SILC Server entry object.
- This list holds information about servers in SILC network. However,
- contents of this list is highly dependent of what kind of server we are
- (normal server or router server) and whether the list is used as a local
- list or a global list. These factors dictates the contents of this list.
+ 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 list is defined as follows:
+ This entry is defined as follows:
Server type List type Contents
=======================================================================
the server SILC will ever need. These are also the informations
that is broadcasted between servers and routers in the SILC network.
- struct SilcServerListStruct *router
+ long last_receive
+
+ Time when data was received from the server last time.
+
+ 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
list.
*/
-struct SilcServerListStruct {
+struct SilcServerEntryStruct {
char *server_name;
int server_type;
SilcServerID *id;
+ long last_receive;
/* TRUE when server is registered to server */
int registered;
/* Pointer to the router */
- struct SilcServerListStruct *router;
+ SilcServerEntry router;
/* Keys */
SilcCipher send_key;
/* Connection data */
void *connection;
-
- struct SilcServerListStruct *next;
- struct SilcServerListStruct *prev;
};
/*
- SILC Client list object.
+ SILC Client entry object.
- This list holds information about connected clients ie. users in the SILC
- network. The contents of this list is depended on whether we are normal
+ 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 list is defined as follows:
+ This entry is defined as follows:
Server type List type Contents
=======================================================================
Client's mode. Client maybe for example server operator or
router operator (SILC operator).
- SilcServerList *router
+ 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
+
+ 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.
+
+ 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
PKCS of the client. This maybe NULL.
SilcHmac hmac
- unsigned char *hmac_key
- unsigned int hmac_key_len
MAC key used to compute MAC's for packets.
list.
*/
-struct SilcClientListStruct {
+struct SilcClientEntryStruct {
char *nickname;
char *username;
char *userinfo;
SilcClientID *id;
int mode;
+ /* Time of last accesses of the client */
+ long last_receive;
+ long last_command;
+
/* TRUE when client is registered to server */
int registered;
/* Pointer to the router */
- SilcServerList *router;
+ SilcServerEntry router;
- /* Pointers to channels this client has joined */
- SilcChannelList **channel;
+ /* List of channels client has joined to */
+ SilcChannelEntry *channel;
unsigned int channel_count;
/* Keys */
SilcCipher receive_key;
SilcPKCS pkcs;
SilcHmac hmac;
- unsigned char *hmac_key;
- unsigned int hmac_key_len;
+ SilcPublicKey public_key;
/* Connection data */
void *connection;
-
- struct SilcClientListStruct *next;
- struct SilcClientListStruct *prev;
};
/*
- SILC Channel Client list structure.
+ SILC Channel Client entry structure.
- This list used only by the SilcChannelList object and it holds information
- about current clients (ie. users) on channel. Following short description
- of the fields:
+ 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:
- SilcClientList client
+ SilcClientEntry client
Pointer to the client list. This is the client currently on channel.
- int mode
+ unsigned int mode
Client's current mode on the channel.
*/
-typedef struct SilcChannelClientListStruct {
- SilcClientList *client;
- int mode;
-} SilcChannelClientList;
+typedef struct SilcChannelClientEntryStruct {
+ SilcClientEntry client;
+ unsigned int mode;
+ struct SilcChannelClientEntryStruct *next;
+} *SilcChannelClientEntry;
/*
- SILC Channel list object.
+ SILC Channel entry object.
- This list holds information about channels in SILC network. The contents
- of this list is depended on whether we are normal server or router server
+ 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 list is defined as follows:
+ This entry is defined as follows:
Server type List type Contents
=======================================================================
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.
- SilcServerList *router
+ 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
whose cell this channel belongs to. This is used to route messages
to this channel.
- SilcCipher send_key
+ SilcCipher channel_key
+ The key of the channel (the cipher actually).
- SilcCipher receive_key
+ unsigned char *key
+ unsigned int 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.
*/
-struct SilcChannelListStruct {
+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 */
- SilcChannelClientList *user_list;
- unsigned int user_list_count;
+ SilcList user_list;
/* Pointer to the router */
- SilcServerList *router;
+ SilcServerEntry router;
/* Channel keys */
SilcCipher channel_key;
unsigned char *key;
unsigned int key_len;
unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
-
- struct SilcChannelListStruct *next;
- struct SilcChannelListStruct *prev;
};
/*
As for remainder these lists are defined as follows:
- List Server type List type Contents
+ 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
+ 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
+ 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
+ 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,
other hand, always define local and global lists because routers really
know all the relevant data in the SILC network.
-*/
-typedef struct SilcIDListStruct {
- SilcServerList *servers;
- SilcClientList *clients;
- SilcChannelList *channels;
+ This object is used as local and global list by the server/router.
+ Above table shows how this is defined on different conditions.
- /* ID Caches. Caches are used to perform fast search on the ID's. */
- SilcIDCache *server_cache[96];
- unsigned int server_cache_count[96];
- SilcIDCache *client_cache[96];
- unsigned int client_cache_count[96];
- SilcIDCache *channel_cache[96];
- unsigned int channel_cache_count[96];
-} SilcIDListObject;
+ 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).
-typedef SilcIDListObject *SilcIDList;
+*/
+typedef struct SilcIDListStruct {
+ SilcIDCache servers;
+ SilcIDCache clients;
+ SilcIDCache channels;
+} *SilcIDList;
/*
- Temporary ID List object.
+ Temporary ID Entry object.
- 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 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.
+ This is not in any list. This is always individually allocated and
+ used as such.
*/
typedef struct {
unsigned int hmac_key_len;
/* SilcComp comp */
-} SilcIDListUnknown;
+} *SilcUnknownEntry;
/* Prototypes */
-void silc_idlist_add_server(SilcServerList **list,
- char *server_name, int server_type,
- SilcServerID *id, SilcServerList *router,
- SilcCipher send_key, SilcCipher receive_key,
- SilcPKCS public_key, SilcHmac hmac,
- SilcServerList **new_idlist);
-void silc_idlist_add_client(SilcClientList **list, char *nickname,
- char *username, char *userinfo,
- SilcClientID *id, SilcServerList *router,
- SilcCipher send_key, SilcCipher receive_key,
- SilcPKCS public_key, SilcHmac hmac,
- SilcClientList **new_idlist);
-void silc_idlist_del_client(SilcClientList **list, SilcClientList *entry);
-SilcClientList *
-silc_idlist_find_client_by_nickname(SilcClientList *list,
- char *nickname,
+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);
+SilcServerEntry
+silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id);
+SilcServerEntry
+silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
+ SilcServerID *new_id);
+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);
+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);
-SilcClientList *
-silc_idlist_find_client_by_hash(SilcClientList *list,
- char *nickname, SilcHash hash);
-SilcClientList *
-silc_idlist_find_client_by_id(SilcClientList *list, SilcClientID *id);
-void silc_idlist_add_channel(SilcChannelList **list,
- char *channel_name, int mode,
- SilcChannelID *id, SilcServerList *router,
- SilcCipher channel_key,
- SilcChannelList **new_idlist);
-SilcChannelList *
-silc_idlist_find_channel_by_id(SilcChannelList *list, SilcChannelID *id);
-void silc_idlist_del_channel(SilcChannelList **list, SilcChannelList *entry);
+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);
+SilcClientEntry
+silc_idlist_replace_client_id(SilcIDList id_list, SilcClientID *old_id,
+ SilcClientID *new_id);
+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);
+SilcChannelEntry
+silc_idlist_find_channel_by_name(SilcIDList id_list, char *name);
+SilcChannelEntry
+silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id);
#endif