5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
7 Copyright (C) 1997 - 2001 Pekka Riikonen
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
24 /* Forward declarations */
25 typedef struct SilcServerEntryStruct *SilcServerEntry;
26 typedef struct SilcClientEntryStruct *SilcClientEntry;
27 typedef struct SilcChannelEntryStruct *SilcChannelEntry;
29 /* Context for holding cache information to periodically purge
33 SilcSchedule schedule;
36 /* Channel key re-key context. */
39 SilcChannelEntry channel;
41 } *SilcServerChannelRekey;
43 /* Generic rekey context for connections */
45 /* Current sending encryption key, provided for re-key. The `pfs'
46 is TRUE if the Perfect Forward Secrecy is performed in re-key. */
47 unsigned char *send_enc_key;
56 Generic ID list data structure.
58 This structure is included in all ID list entries and it includes data
59 pointers that are common to all ID entries. This structure is always
60 defined to the first field in the ID entries and is used to explicitly
61 cast to this type without first explicitly casting to correct ID entry
62 type. Hence, the ID list entry is casted to this type to get this data
63 from the ID entry (which is usually opaque pointer).
65 Note that some of the fields may be NULL.
69 /* Send and receive symmetric keys */
71 SilcCipher receive_key;
74 SilcServerRekey rekey;
76 /* Hash selected in the SKE protocol, NULL if not needed at all */
81 SilcHmac hmac_receive;
84 SilcPublicKey public_key;
86 long last_receive; /* Time last received data */
87 long last_sent; /* Time last sent data */
88 bool registered; /* Boolean whether connection is registered */
89 } *SilcIDListData, SilcIDListDataStruct;
92 SILC Server entry object.
94 This entry holds information about servers in SILC network. However,
95 contents of this entry is highly dependent of what kind of server we are
96 (normal server or router server) and whether the entry is used as a local
97 list or a global list. These factors dictates the contents of this entry.
99 This entry is defined as follows:
101 Server type List type Contents
102 =======================================================================
103 server local list Server itself
104 server global list NULL
105 router local list All servers is the cell
106 router global list All servers in the SILC network
108 Following short description of the fields:
110 SilcIDListDataStruct data
112 Generic data structure to hold data common to all ID entries.
116 Logical name of the server. There is no limit of the length of the
117 server name. This is usually the same name as defined in DNS.
121 Type of the server. SILC_SERVER or SILC_ROUTER are the possible
126 ID of the server. This includes all the relevant information about
127 the server SILC will ever need. These are also the informations
128 that is broadcasted between servers and routers in the SILC network.
133 Server info (from INFO command) saved temporarily and motd (from
134 MOTD command) saved temporarily.
136 SilcServerEntry router
138 This is a pointer back to the server list. This is the router server
139 where this server is connected to. If this is the router itself and
140 it doesn't have a route this is NULL.
143 SilcCipher receive_key
145 Data sending and receiving keys.
149 A pointer, usually, to the socket list for fast referencing to
150 the data used in connection with this server. This may be anything
151 but as just said, this is usually pointer to the socket connection
155 struct SilcServerEntryStruct {
156 /* Generic data structure. DO NOT add anything before this! */
157 SilcIDListDataStruct data;
165 /* Pointer to the router */
166 SilcServerEntry router;
168 /* Connection data */
173 SILC Channel Client entry structure.
175 This entry used only by the SilcChannelEntry object and it holds
176 information about current clients (ie. users) on channel. Following
177 short description of the fields:
179 SilcClientEntry client
181 Pointer to the client list. This is the client currently on channel.
185 Client's current mode on the channel.
187 SilcChannelEntry channel
189 Back pointer back to channel. As this structure is also used by
190 SilcClientEntry we have this here for fast access to the channel when
191 used by SilcClientEntry.
194 typedef struct SilcChannelClientEntryStruct {
195 SilcClientEntry client;
197 SilcChannelEntry channel;
198 } *SilcChannelClientEntry;
201 SILC Client entry object.
203 This entry holds information about connected clients ie. users in the SILC
204 network. The contents of this entrt is depended on whether we are normal
205 server or router server and whether the list is a local or global list.
207 This entry is defined as follows:
209 Server type List type Contents
210 =======================================================================
211 server local list All clients in server
212 server global list NULL
213 router local list All clients in cell
214 router global list All clients in SILC
216 Following short description of the fields:
218 SilcIDListDataStruct data
220 Generic data structure to hold data common to all ID entries.
222 unsigned char *nickname
224 The nickname of the client.
228 The name of the server where the client is from. MAy be NULL.
232 Client's usename. This is defined in the following manner:
234 Server type List type Contents
235 ====================================================
236 server local list User's name
237 router local list NULL
238 router global list NULL
240 Router doesn't hold this information since it is not vital data
241 for the router. If this information is needed by the client it is
242 fetched when it is needed.
246 Information about user. This is free information and can be virtually
247 anything. This is defined in following manner:
249 Server type List type Contents
250 ====================================================
251 server local list User's information
252 router local list NULL
253 router global list NULL
255 Router doesn't hold this information since it is not vital data
256 for the router. If this information is needed by the client it is
257 fetched when it is needed.
261 ID of the client. This includes all the information SILC will ever
262 need. Notice that no nickname of the user is saved anywhere. This is
263 beacuse of SilcClientID includes 88 bit hash value of the user's
264 nickname which can be used to track down specific user by their
265 nickname. Nickname is not relevant information that would need to be
270 Client's mode. Client maybe for example server operator or
271 router operator (SILC operator).
275 Time of last time client executed command. We are strict and will
276 not allow any command to be exeucted more than once in about
277 2 seconds. This is result of normal time().
281 Counter to check command bursts. By default, up to 5 commands
282 are allowed before limiting the execution. See command flags
285 SilcServerEntry router
287 This is a pointer to the server list. This is the router server whose
288 cell this client is coming from. This is used to route messages to
291 SilcHashTable channels;
293 All the channels this client has joined. The context saved in the
294 hash table shares memory with the channel entrys `user_list' hash
299 A pointer, usually, to the socket list for fast referencing to
300 the data used in connection with this client. This may be anything
301 but as just said, this is usually pointer to the socket connection
305 struct SilcClientEntryStruct {
306 /* Generic data structure. DO NOT add anything before this! */
307 SilcIDListDataStruct data;
309 unsigned char *nickname;
319 /* Pointer to the router */
320 SilcServerEntry router;
322 /* All channels this client has joined */
323 SilcHashTable channels;
325 /* Connection data */
330 SILC Channel entry object.
332 This entry holds information about channels in SILC network. The contents
333 of this entry is depended on whether we are normal server or router server
334 and whether the list is a local or global list.
336 This entry is defined as follows:
338 Server type List type Contents
339 =======================================================================
340 server local list All channels in server
341 server global list NULL
342 router local list All channels in cell
343 router global list All channels in SILC
345 Following short description of the fields:
349 Logical name of the channel.
353 Current mode of the channel. See lib/silccore/silcchannel.h for
358 ID of the channel. This includes all the information SILC will ever
363 Boolean value to tell whether there are users outside this server
364 on this channel. This is set to TRUE if router sends message to
365 the server that there are users outside your server on your
366 channel as well. This way server knows that messages needs to be
367 sent to the router for further routing. If this is a normal
368 server and this channel is not created on this server this field
369 is always TRUE. If this server is a router this field is ignored.
373 Current topic of the channel.
377 Default cipher of the channel. If this is NULL then server picks
378 the cipher to be used. This can be set at SILC_COMMAND_JOIN.
382 Default hmac of the channel. If this is NULL then server picks
383 the cipher to be used. This can be set at SILC_COMMAND_JOIN.
385 SilcPublicKey founder_key
386 SilcAuthMethod founder_method
387 unsigned char *founder_passwd
388 uint32 founder_passwd_len
390 If the SILC_CMODE_FOUNDER_AUTH has been set then these will include
391 the founder's public key, authentication method and the password
392 if the method is SILC_AUTH_PASSWORD. If it is SILC_AUTH_PUBLIC_KEY
393 then the `founder_passwd' is NULL.
395 SilcHashTable user_list
397 All users joined on this channel. Note that the context saved to
398 this entry shares memory with the client entrys `channels' hash
401 SilcServerEntry router
403 This is a pointer to the server list. This is the router server
404 whose cell this channel belongs to. This is used to route messages
407 SilcCipher channel_key
409 The key of the channel (the cipher actually).
414 Raw key data of the channel key.
416 unsigned char iv[SILC_CIPHER_MAX_IV_SIZE]
418 Current initial vector. Initial vector is received always along
419 with the channel packet. By default this is filled with NULL.
425 SilcServerChannelRekey rekey
427 Channel key re-key context.
430 struct SilcChannelEntryStruct {
439 SilcPublicKey founder_key;
440 SilcAuthMethod founder_method;
441 unsigned char *founder_passwd;
442 uint32 founder_passwd_len;
445 unsigned char *passphrase;
449 /* All users on this channel */
450 SilcHashTable user_list;
452 /* Pointer to the router */
453 SilcServerEntry router;
456 SilcCipher channel_key;
459 unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
462 SilcServerChannelRekey rekey;
468 As for remainder these lists are defined as follows:
470 Entry list (cache) Server type List type Contents
471 =======================================================================
472 servers server local list Server itself
473 servers server global list NULL
474 servers router local list All servers in cell
475 servers router global list All servers in SILC
477 clients server local list All clients in server
478 clients server global list NULL
479 clients router local list All clients in cell
480 clients router global list All clients in SILC
482 channels server local list All channels in server
483 channels server global list NULL
484 channels router local list All channels in cell
485 channels router global list All channels in SILC
487 As seen on the list normal server never defines a global list. This is
488 because of normal server don't know anything about anything global data,
489 they get it from the router if and when they need it. Routers, on the
490 other hand, always define local and global lists because routers really
491 know all the relevant data in the SILC network.
493 This object is used as local and global list by the server/router.
494 Above table shows how this is defined on different conditions.
496 This object holds pointers to the ID cache system. Every ID cache entry
497 has a specific context pointer to allocated entry (server, client or
501 typedef struct SilcIDListStruct {
504 SilcIDCache channels;
508 ID Entry for Unknown connections.
510 This is used during authentication phases where we still don't know
511 what kind of connection remote connection is, hence, we will use this
512 structure instead until we know what type of connection remote end is.
514 This is not in any list. This is always individually allocated and
519 /* Generic data structure. DO NOT add anything before this! */
520 SilcIDListDataStruct data;
524 void silc_idlist_add_data(void *entry, SilcIDListData idata);
525 void silc_idlist_del_data(void *entry);
526 SILC_TASK_CALLBACK_GLOBAL(silc_idlist_purge);
528 silc_idlist_add_server(SilcIDList id_list,
529 char *server_name, int server_type,
530 SilcServerID *id, SilcServerEntry router,
533 silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id,
534 bool registered, SilcIDCacheEntry *ret_entry);
536 silc_idlist_find_server_by_name(SilcIDList id_list, char *name,
537 bool registered, SilcIDCacheEntry *ret_entry);
539 silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname,
540 int port, bool registered,
541 SilcIDCacheEntry *ret_entry);
543 silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
544 SilcServerID *new_id);
545 int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry);
547 silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username,
548 char *userinfo, SilcClientID *id,
549 SilcServerEntry router, void *connection);
550 int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry);
551 int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
553 SilcClientEntry **clients,
554 uint32 *clients_count);
555 int silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
557 SilcClientEntry **clients,
558 uint32 *clients_count);
560 silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id,
561 bool registered, SilcIDCacheEntry *ret_entry);
563 silc_idlist_replace_client_id(SilcIDList id_list, SilcClientID *old_id,
564 SilcClientID *new_id);
565 void silc_idlist_client_destructor(SilcIDCache cache,
566 SilcIDCacheEntry entry);
568 silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
569 SilcChannelID *id, SilcServerEntry router,
570 SilcCipher channel_key, SilcHmac hmac);
571 int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry);
573 silc_idlist_find_channel_by_name(SilcIDList id_list, char *name,
574 SilcIDCacheEntry *ret_entry);
576 silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id,
577 SilcIDCacheEntry *ret_entry);
579 silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id,
580 SilcChannelID *new_id);
582 silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id,
583 uint32 *channels_count);