5 Author: Pekka Riikonen <priikone@silcnet.org>
7 Copyright (C) 1997 - 2005, 2007 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 #include "serverconfig.h"
26 /* Context for holding cache information to periodically purge
33 /* Channel key re-key context. */
35 SilcChannelEntry channel;
38 } *SilcServerChannelRekey;
40 /* ID List Entry status flags. */
41 typedef SilcUInt8 SilcIDListStatus;
42 #define SILC_IDLIST_STATUS_NONE 0x00 /* No status */
43 #define SILC_IDLIST_STATUS_REGISTERED 0x01 /* Entry is registered */
44 #define SILC_IDLIST_STATUS_RESOLVED 0x02 /* Entry info is resolved */
45 #define SILC_IDLIST_STATUS_RESOLVING 0x04 /* Entry is being resolved
46 with WHOIS or IDENTIFY */
47 #define SILC_IDLIST_STATUS_DISABLED 0x08 /* Entry is disabled */
48 #define SILC_IDLIST_STATUS_RESUMED 0x10 /* Entry is resumed */
49 #define SILC_IDLIST_STATUS_LOCAL 0x20 /* Entry locally connected */
50 #define SILC_IDLIST_STATUS_RESUME_RES 0x40 /* Entry resolved while
52 #define SILC_IDLIST_STATUS_NOATTR 0x80 /* Entry does not support
53 attributes in WHOIS */
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 type cast to this type without first explicitly casting to correct ID
62 entry type. Hence, the ID list entry is type casted to this type to
63 get this data from the ID entry (which is usually opaque pointer).
65 Note that some of the fields may be NULL.
68 struct SilcIDListDataObject {
69 SilcConnectionType conn_type; /* Connection type */
70 SilcServerConnection sconn; /* Connection context */
71 SilcSKERekeyMaterial rekey; /* Rekey material */
75 SilcPublicKey public_key;
76 unsigned char fingerprint[20];
78 long last_receive; /* Time last received data */
79 long last_sent; /* Time last sent data */
81 unsigned long created; /* Time when entry was created */
83 SilcIDListStatus status; /* Status mask of the entry */
87 SILC Server entry object.
89 This entry holds information about servers in SILC network. However,
90 contents of this entry is highly dependent of what kind of server we are
91 (normal server or router server) and whether the entry is used as a local
92 list or a global list. These factors dictates the contents of this entry.
94 This entry is defined as follows:
96 Server type List type Contents
97 =======================================================================
98 server local list Server itself
99 server global list NULL
100 router local list All servers is the cell
101 router global list All servers in the SILC network
103 Following short description of the fields:
105 SilcIDListDataStruct data
107 Generic data structure to hold data common to all ID entries.
111 Logical name of the server. There is no limit of the length of the
112 server name. This is usually the same name as defined in DNS.
114 SilcUInt8 server_type
116 Type of the server. SILC_SERVER or SILC_ROUTER are the possible
121 ID of the server. This includes all the relevant information about
122 the server SILC will ever need. These are also the informations
123 that is broadcasted between servers and routers in the SILC network.
128 Server info (from INFO command) saved temporarily and motd (from
129 MOTD command) saved temporarily.
131 SilcServerEntry router
133 This is a pointer back to the server list. This is the router server
134 where this server is connected to. If this is the router itself and
135 it doesn't have a route this is NULL.
138 SilcCipher receive_key
140 Data sending and receiving keys.
144 A pointer, usually, to the socket list for fast referencing to
145 the data used in connection with this server. This may be anything
146 but as just said, this is usually pointer to the socket connection
150 struct SilcServerEntryStruct {
151 /* Generic data structure. DO NOT add anything before this! */
152 SilcIDListDataStruct data;
155 SilcUInt8 server_type;
160 /* Pointer to the router */
161 SilcServerEntry router;
163 /* Connection data */
168 SILC Channel Client entry structure.
170 This entry used only by the SilcChannelEntry object and it holds
171 information about current clients (ie. users) on channel. Following
172 short description of the fields:
174 SilcClientEntry client
176 Pointer to the client list. This is the client currently on channel.
180 Client's current mode on the channel.
182 SilcChannelEntry channel
184 Back pointer back to channel. As this structure is also used by
185 SilcClientEntry we have this here for fast access to the channel when
186 used by SilcClientEntry.
189 typedef struct SilcChannelClientEntryStruct {
190 SilcClientEntry client;
192 SilcChannelEntry channel;
193 } *SilcChannelClientEntry;
196 SILC Client entry object.
198 This entry holds information about connected clients ie. users in the SILC
199 network. The contents of this entrt is depended on whether we are normal
200 server or router server and whether the list is a local or global list.
202 This entry is defined as follows:
204 Server type List type Contents
205 =======================================================================
206 server local list All clients in server
207 server global list NULL
208 router local list All clients in cell
209 router global list All clients in SILC
211 Following short description of the fields:
213 SilcIDListDataStruct data
215 Generic data structure to hold data common to all ID entries.
217 unsigned char *nickname
219 The nickname of the client. This is nickname in original format,
220 not casefolded or normalized. However, it is checked to assure
221 that prohibited characters do not exist. The casefolded version
226 The name of the server where the client is from. MAy be NULL.
230 Client's usename. This is defined in the following manner:
232 Server type List type Contents
233 ====================================================
234 server local list User's name
235 router local list NULL
236 router global list NULL
238 Router doesn't hold this information since it is not vital data
239 for the router. If this information is needed by the client it is
240 fetched when it is needed.
244 Information about user. This is free information and can be virtually
245 anything. This is defined in following manner:
247 Server type List type Contents
248 ====================================================
249 server local list User's information
250 router local list NULL
251 router global list NULL
253 Router doesn't hold this information since it is not vital data
254 for the router. If this information is needed by the client it is
255 fetched when it is needed.
259 ID of the client. This includes all the information SILC will ever
260 need. Notice that no nickname of the user is saved anywhere. This is
261 beacuse of SilcClientID includes 88 bit hash value of the user's
262 nickname which can be used to track down specific user by their
263 nickname. Nickname is not relevant information that would need to be
268 Client's mode. Client maybe for example server operator or
269 router operator (SILC operator).
273 Time of last time client executed command. We are strict and will
274 not allow any command to be exeucted more than once in about
275 2 seconds. This is result of normal time().
277 SilcUInt8 fast_command
279 Counter to check command bursts. By default, up to 5 commands
280 are allowed before limiting the execution. See command flags
283 SilcServerEntry router
285 This is a pointer to the server list. This is the router server whose
286 cell this client is coming from. This is used to route messages to
289 SilcHashTable channels;
291 All the channels this client has joined. The context saved in the
292 hash table shares memory with the channel entrys `user_list' hash
297 A pointer, usually, to the socket list for fast referencing to
298 the data used in connection with this client. This may be anything
299 but as just said, this is usually pointer to the socket connection
302 SilcUInt16 resolve_cmd_ident
304 Command identifier for the entry when the entry's data.status
305 is SILC_IDLIST_STATUS_RESOLVING. If this entry is asked to be
306 resolved when the status is set then the resolver may attach to
307 this command identifier and handle the process after the resolving
311 struct SilcClientEntryStruct {
312 /* Generic data structure. DO NOT add anything before this! */
313 SilcIDListDataStruct data;
315 unsigned char *nickname;
323 SilcUInt8 fast_command;
325 /* Requested Attributes */
326 unsigned char *attrs;
327 SilcUInt16 attrs_len;
329 /* Pointer to the router */
330 SilcServerEntry router;
332 /* All channels this client has joined */
333 SilcHashTable channels;
335 /* Connection data */
338 /* Last time updated/accessed */
339 unsigned long updated;
341 /* data.status is RESOLVING and this includes the resolving command
343 SilcUInt16 resolve_cmd_ident;
345 /* we need this so nobody can resume more than once at the same time -
346 * server crashes, really odd behaviour, ... */
347 SilcClientEntry resuming_client;
351 SILC Channel entry object.
353 This entry holds information about channels in SILC network. The contents
354 of this entry is depended on whether we are normal server or router server
355 and whether the list is a local or global list.
357 This entry is defined as follows:
359 Server type List type Contents
360 =======================================================================
361 server local list All channels in server
362 server global list NULL
363 router local list All channels in cell
364 router global list All channels in SILC
366 Following short description of the fields:
370 Logical name of the channel. This is the original format, not
371 the casefolded or normalized. However, this is checked to assure
372 that prohibited characters do not exist. The casefolded version
377 Current mode of the channel. See lib/silccore/silcchannel.h for
382 ID of the channel. This includes all the information SILC will ever
385 SilcBool global_users
387 Boolean value to tell whether there are users outside this server
388 on this channel. This is set to TRUE if router sends message to
389 the server that there are users outside your server on your
390 channel as well. This way server knows that messages needs to be
391 sent to the router for further routing. If this is a normal
392 server and this channel is not created on this server this field
393 is always TRUE. If this server is a router this field is ignored.
397 Current topic of the channel.
401 Default cipher of the channel. If this is NULL then server picks
402 the cipher to be used. This can be set at SILC_COMMAND_JOIN.
406 Default hmac of the channel. If this is NULL then server picks
407 the cipher to be used. This can be set at SILC_COMMAND_JOIN.
409 SilcPublicKey founder_key
411 If the SILC_CMODE_FOUNDER_AUTH has been set then this will include
412 the founder's public key. When the mode and this key is set the
413 channel is also permanent channel and cannot be destroyed.
415 SilcHashTable user_list
417 All users joined on this channel. Note that the context saved to
418 this entry shares memory with the client entrys `channels' hash
421 SilcServerEntry router
423 This is a pointer to the server list. This is the router server
424 whose cell this channel belongs to. This is used to route messages
428 SilcCipher receive_key
430 The key of the channel (the cipher actually).
435 Raw key data of the channel key.
437 unsigned char iv[SILC_CIPHER_MAX_IV_SIZE]
439 Current initial vector. Initial vector is received always along
440 with the channel packet. By default this is filled with NULL.
446 SilcServerChannelRekey rekey
448 Channel key re-key context.
451 struct SilcChannelEntryStruct {
458 SilcPublicKey founder_key;
459 SilcHashTable channel_pubkeys;
461 SilcUInt32 user_limit;
462 unsigned char *passphrase;
463 SilcHashTable invite_list;
464 SilcHashTable ban_list;
466 /* All users on this channel */
467 SilcHashTable user_list;
468 SilcUInt32 user_count;
470 /* Pointer to the router */
471 SilcServerEntry router;
475 SilcCipher receive_key;
480 SilcServerChannelRekey rekey;
481 unsigned long created;
482 unsigned long updated;
485 unsigned int global_users : 1;
486 unsigned int disabled : 1;
487 unsigned int users_resolved : 1;
493 As for remainder these lists are defined as follows:
495 Entry list (cache) Server type List type Contents
496 =======================================================================
497 servers server local list Server itself
498 servers server global list NULL
499 servers router local list All servers in cell
500 servers router global list All servers in SILC
502 clients server local list All clients in server
503 clients server global list NULL
504 clients router local list All clients in cell
505 clients router global list All clients in SILC
507 channels server local list All channels in server
508 channels server global list NULL
509 channels router local list All channels in cell
510 channels router global list All channels in SILC
512 As seen on the list normal server never defines a global list. This is
513 because of normal server don't know anything about anything global data,
514 they get it from the router if and when they need it. Routers, on the
515 other hand, always define local and global lists because routers really
516 know all the relevant data in the SILC network.
518 This object is used as local and global list by the server/router.
519 Above table shows how this is defined on different conditions.
521 This object holds pointers to the ID cache system. Every ID cache entry
522 has a specific context pointer to allocated entry (server, client or
526 struct SilcIDListStruct {
529 SilcIDCache channels;
533 ID Entry for Unknown connections.
535 This is used during authentication phases where we still don't know
536 what kind of connection remote connection is, hence, we will use this
537 structure instead until we know what type of connection remote end is.
539 This is not in any list. This is always individually allocated and
544 /* Generic data structure. DO NOT add anything before this! */
545 SilcIDListDataStruct data;
546 SilcAsyncOperation op;
547 SilcServerConfigRef cconfig;
548 SilcServerConfigRef sconfig;
549 SilcServerConfigRef rconfig;
551 const char *hostname;
557 void silc_idlist_add_data(void *entry, SilcIDListData idata);
558 void silc_idlist_del_data(void *entry);
559 SILC_TASK_CALLBACK(silc_idlist_purge);
561 silc_idlist_add_server(SilcIDList id_list,
562 char *server_name, int server_type,
563 SilcServerID *id, SilcServerEntry router,
566 silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id,
567 SilcBool registered, SilcIDCacheEntry *ret_entry);
569 silc_idlist_find_server_by_name(SilcIDList id_list, char *name,
570 SilcBool registered, SilcIDCacheEntry *ret_entry);
572 silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname,
573 int port, SilcBool registered,
574 SilcIDCacheEntry *ret_entry);
576 silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
577 SilcServerID *new_id);
578 int silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry);
579 void silc_idlist_server_destructor(SilcIDCache cache,
580 SilcIDCacheEntry entry,
584 silc_idlist_add_client(SilcIDList id_list, char *nickname, char *username,
585 char *userinfo, SilcClientID *id,
586 SilcServerEntry router, void *connection);
587 int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry);
588 int silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
590 SilcClientEntry **clients,
591 SilcUInt32 *clients_count);
592 int silc_idlist_get_clients_by_hash(SilcIDList id_list,
593 char *nickname, char *server,
595 SilcClientEntry **clients,
596 SilcUInt32 *clients_count);
598 silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id,
599 SilcBool registered, SilcIDCacheEntry *ret_entry);
601 silc_idlist_replace_client_id(SilcServer server,
602 SilcIDList id_list, SilcClientID *old_id,
603 SilcClientID *new_id, const char *nickname);
604 void silc_idlist_client_destructor(SilcIDCache cache,
605 SilcIDCacheEntry entry,
609 silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
610 SilcChannelID *id, SilcServerEntry router,
611 SilcCipher send_key, SilcCipher receive_key,
613 void silc_idlist_channel_destructor(SilcIDCache cache,
614 SilcIDCacheEntry entry,
617 int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry);
619 silc_idlist_find_channel_by_name(SilcIDList id_list, char *name,
620 SilcIDCacheEntry *ret_entry);
622 silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id,
623 SilcIDCacheEntry *ret_entry);
625 silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id,
626 SilcChannelID *new_id);
628 silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id,
629 SilcUInt32 *channels_count);