updates.
[silc.git] / apps / silcd / idlist.h
1 /*
2
3   idlist.h
4
5   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
6
7   Copyright (C) 1997 - 2001 Pekka Riikonen
8
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.
13   
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.
18
19 */
20
21 #ifndef IDLIST_H
22 #define IDLIST_H
23
24 /* Forward declarations */
25 typedef struct SilcServerEntryStruct *SilcServerEntry;
26 typedef struct SilcClientEntryStruct *SilcClientEntry;
27 typedef struct SilcChannelEntryStruct *SilcChannelEntry;
28
29 /* Context for holding cache information to periodically purge
30    the cache. */
31 typedef struct {
32   SilcIDCache cache;
33   void *timeout_queue;
34 } *SilcIDListPurge;
35
36 /*
37    Generic ID list data structure.
38
39    This structure is included in all ID list entries and it includes data
40    pointers that are common to all ID entries.  This structure is always
41    defined to the first field in the ID entries and is used to explicitly
42    cast to this type without first explicitly casting to correct ID entry
43    type.  Hence, the ID list entry is casted to this type to get this data
44    from the ID entry (which is usually opaque pointer).
45
46    Note that some of the fields may be NULL.
47
48 */
49 typedef struct {
50   /* Send and receive symmetric keys */
51   SilcCipher send_key;
52   SilcCipher receive_key;
53
54   /* Hash selected in the SKE protocol, NULL if not needed at all */
55   SilcHash hash;
56
57   /* HMAC and raw key data */
58   SilcHmac hmac;
59   unsigned char *hmac_key;
60   unsigned int hmac_key_len;
61
62   /* PKCS and public key */
63   SilcPKCS pkcs;
64   SilcPublicKey public_key;
65
66   long last_receive;         /* Time last received data */
67   long last_sent;            /* Time last sent data */
68   unsigned char registered;  /* Boolean whether connection is registered */
69 } *SilcIDListData, SilcIDListDataStruct;
70
71 /* 
72    SILC Server entry object.
73
74    This entry holds information about servers in SILC network. However, 
75    contents of this entry is highly dependent of what kind of server we are 
76    (normal server or router server) and whether the entry is used as a local 
77    list or a global list. These factors dictates the contents of this entry.
78
79    This entry is defined as follows:
80
81    Server type   List type      Contents
82    =======================================================================
83    server        local list     Server itself
84    server        global list    NULL
85    router        local list     All servers is the cell
86    router        global list    All servers in the SILC network
87
88    Following short description of the fields:
89
90    SilcIDListDataStruct data
91
92        Generic data structure to hold data common to all ID entries.
93
94    char *server_name
95
96        Logical name of the server. There is no limit of the length of the
97        server name. This is usually the same name as defined in DNS.
98
99    int server_type
100
101        Type of the server. SILC_SERVER or SILC_ROUTER are the possible
102        choices for this.
103
104    SilcServerID *id
105
106        ID of the server. This includes all the relevant information about
107        the server SILC will ever need. These are also the informations
108        that is broadcasted between servers and routers in the SILC network.
109
110    char *server_info
111    char *motd
112
113        Server info (from INFO command) saved temporarily and motd (from
114        MOTD command) saved temporarily.
115
116    SilcServerEntry router
117
118        This is a pointer back to the server list. This is the router server 
119        where this server is connected to. If this is the router itself and 
120        it doesn't have a route this is NULL.
121
122    SilcCipher send_key
123    SilcCipher receive_key
124
125        Data sending and receiving keys.
126
127    void *connection
128
129        A pointer, usually, to the socket list for fast referencing to
130        the data used in connection with this server.  This may be anything
131        but as just said, this is usually pointer to the socket connection
132        list.
133    
134 */
135 struct SilcServerEntryStruct {
136   /* Generic data structure. DO NOT add anything before this! */
137   SilcIDListDataStruct data;
138
139   char *server_name;
140   int server_type;
141   SilcServerID *id;
142   char *server_info;
143   char *motd;
144
145   /* Pointer to the router */
146   SilcServerEntry router;
147
148   /* Connection data */
149   void *connection;
150 };
151
152 /* 
153    SILC Channel Client entry structure.
154
155    This entry used only by the SilcChannelEntry object and it holds
156    information about current clients (ie. users) on channel. Following
157    short description  of the fields:
158
159    SilcClientEntry client
160
161        Pointer to the client list. This is the client currently on channel.
162
163    unsigned int mode
164
165        Client's current mode on the channel.
166
167    SilcChannelEntry channel
168
169        Back pointer back to channel. As this structure is also used by
170        SilcClientEntry we have this here for fast access to the channel when
171        used by SilcClientEntry.
172
173   struct SilcChannelClientEntryStruct *client_list
174   struct SilcChannelClientEntryStruct *channel_list
175
176        List member pointers. This structure is used by channel entry and
177        client entry thus we must have separate list member pointers for
178        them since we are using same entry for both lists (the entry is not
179        duplicated). SilcList requires this.
180
181 */
182 typedef struct SilcChannelClientEntryStruct {
183   SilcClientEntry client;
184   unsigned int mode;
185   SilcChannelEntry channel;
186   struct SilcChannelClientEntryStruct *client_list;
187   struct SilcChannelClientEntryStruct *channel_list;
188 } *SilcChannelClientEntry;
189
190 /* 
191    SILC Client entry object.
192
193    This entry holds information about connected clients ie. users in the SILC
194    network. The contents of this entrt is depended on whether we are normal 
195    server or router server and whether the list is a local or global list.
196
197    This entry is defined as follows:
198
199    Server type   List type      Contents
200    =======================================================================
201    server        local list     All clients in server
202    server        global list    NULL
203    router        local list     All clients in cell
204    router        global list    All clients in SILC
205
206    Following short description of the fields:
207
208    SilcIDListDataStruct data
209
210        Generic data structure to hold data common to all ID entries.
211
212    char username
213
214        Client's usename. This is defined in the following manner:
215
216        Server type   List type      Contents
217        ====================================================
218        server        local list     User's name
219        router        local list     NULL
220        router        global list    NULL
221
222        Router doesn't hold this information since it is not vital data 
223        for the router. If this information is needed by the client it is
224        fetched when it is needed.
225
226    char userinfo
227
228        Information about user. This is free information and can be virtually
229        anything. This is defined in following manner:
230        
231        Server type   List type      Contents
232        ====================================================
233        server        local list     User's information
234        router        local list     NULL
235        router        global list    NULL
236
237        Router doesn't hold this information since it is not vital data 
238        for the router. If this information is needed by the client it is
239        fetched when it is needed.
240
241    SilcClientID *id
242
243        ID of the client. This includes all the information SILC will ever
244        need. Notice that no nickname of the user is saved anywhere. This is
245        beacuse of SilcClientID includes 88 bit hash value of the user's 
246        nickname which can be used to track down specific user by their 
247        nickname. Nickname is not relevant information that would need to be 
248        saved as plain.
249
250    int mode
251
252        Client's mode.  Client maybe for example server operator or
253        router operator (SILC operator).
254
255    long last_command
256
257        Time of last time client executed command. We are strict and will
258        not allow any command to be exeucted more than once in about
259        2 seconds. This is result of normal time().
260
261    char fast_command
262
263        Counter to check command bursts.  By default, up to 5 commands
264        are allowed before limiting the execution.  See command flags
265        for more detail.
266
267    SilcServerEntry router
268
269        This is a pointer to the server list. This is the router server whose 
270        cell this client is coming from. This is used to route messages to 
271        this client.
272
273    SilcList channels
274
275        List of channels this client has joined.
276
277    void *connection
278
279        A pointer, usually, to the socket list for fast referencing to
280        the data used in connection with this client.  This may be anything
281        but as just said, this is usually pointer to the socket connection
282        list.
283
284 */
285 struct SilcClientEntryStruct {
286   /* Generic data structure. DO NOT add anything before this! */
287   SilcIDListDataStruct data;
288
289   unsigned char *nickname;
290   char *username;
291   char *userinfo;
292   SilcClientID *id;
293   int mode;
294
295   long last_command;
296   char fast_command;
297
298   /* Pointer to the router */
299   SilcServerEntry router;
300
301   /* List of channels client has joined to */
302   SilcList channels;
303
304   /* Connection data */
305   void *connection;
306 };
307
308 /* 
309    SILC Channel entry object.
310
311    This entry holds information about channels in SILC network. The contents 
312    of this entry is depended on whether we are normal server or router server 
313    and whether the list is a local or global list.
314
315    This entry is defined as follows:
316
317    Server type   List type      Contents
318    =======================================================================
319    server        local list     All channels in server
320    server        global list    NULL
321    router        local list     All channels in cell
322    router        global list    All channels in SILC
323
324    Following short description of the fields:
325
326    char *channel_name
327
328        Logical name of the channel.
329
330    unsigned int mode
331
332        Current mode of the channel.  See lib/silccore/silcchannel.h for
333        all modes.
334
335    SilcChannelID *id
336
337        ID of the channel. This includes all the information SILC will ever
338        need.
339
340    int global_users
341  
342        Boolean value to tell whether there are users outside this server
343        on this channel. This is set to TRUE if router sends message to
344        the server that there are users outside your server on your
345        channel as well. This way server knows that messages needs to be
346        sent to the router for further routing. If this is a normal 
347        server and this channel is not created on this server this field
348        is always TRUE. If this server is a router this field is ignored.
349
350    char *topic
351
352        Current topic of the channel.
353
354    char *cipher
355
356        Default cipher of the channel. If this is NULL then server picks
357        the cipher to be used. This can be set at SILC_COMMAND_JOIN.
358
359    char *hmac_name
360
361        Default hmac of the channel. If this is NULL then server picks
362        the cipher to be used. This can be set at SILC_COMMAND_JOIN.
363
364    SilcServerEntry router
365
366        This is a pointer to the server list. This is the router server 
367        whose cell this channel belongs to. This is used to route messages 
368        to this channel.
369
370    SilcCipher channel_key
371
372        The key of the channel (the cipher actually).
373
374    unsigned char *key
375    unsigned int key_len
376
377        Raw key data of the channel key.
378
379    unsigned char iv[SILC_CIPHER_MAX_IV_SIZE]
380
381        Current initial vector. Initial vector is received always along
382        with the channel packet. By default this is filled with NULL.
383
384    SilcHmac hmac;
385
386        HMAC of the channel.
387
388 */
389 struct SilcChannelEntryStruct {
390   char *channel_name;
391   unsigned int mode;
392   SilcChannelID *id;
393   int global_users;
394   char *topic;
395   char *cipher;
396   char *hmac_name;
397
398   unsigned int user_limit;
399   unsigned char *passphrase;
400   char *invite_list;
401   char *ban_list;
402
403   /* List of users on channel */
404   SilcList user_list;
405
406   /* Pointer to the router */
407   SilcServerEntry router;
408
409   /* Channel keys */
410   SilcCipher channel_key;
411   unsigned char *key;
412   unsigned int key_len;
413   unsigned char iv[SILC_CIPHER_MAX_IV_SIZE];
414   SilcHmac hmac;
415 };
416
417 /* 
418    SILC ID List object.
419
420    As for remainder these lists are defined as follows:
421
422    Entry list (cache)  Server type   List type      Contents
423    =======================================================================
424    servers             server        local list     Server itself
425    servers             server        global list    NULL
426    servers             router        local list     All servers in cell
427    servers             router        global list    All servers in SILC
428
429    clients             server        local list     All clients in server
430    clients             server        global list    NULL
431    clients             router        local list     All clients in cell
432    clients             router        global list    All clients in SILC
433
434    channels            server        local list     All channels in server
435    channels            server        global list    NULL
436    channels            router        local list     All channels in cell
437    channels            router        global list    All channels in SILC
438
439    As seen on the list normal server never defines a global list. This is
440    because of normal server don't know anything about anything global data,
441    they get it from the router if and when they need it. Routers, on the
442    other hand, always define local and global lists because routers really
443    know all the relevant data in the SILC network.
444
445    This object is used as local and global list by the server/router.
446    Above table shows how this is defined on different conditions.
447
448    This object holds pointers to the ID cache system. Every ID cache entry
449    has a specific context pointer to allocated entry (server, client or
450    channel entry).
451
452 */
453 typedef struct SilcIDListStruct {
454   SilcIDCache servers;
455   SilcIDCache clients;
456   SilcIDCache channels;
457 } *SilcIDList;
458
459 /*
460    ID Entry for Unknown connections.
461
462    This is used during authentication phases where we still don't know 
463    what kind of connection remote connection is, hence, we will use this
464    structure instead until we know what type of connection remote end is.
465
466    This is not in any list. This is always individually allocated and
467    used as such.
468
469 */
470 typedef struct {
471   /* Generic data structure. DO NOT add anything before this! */
472   SilcIDListDataStruct data;
473 } *SilcUnknownEntry;
474
475 /* Prototypes */
476 void silc_idlist_add_data(void *entry, SilcIDListData idata);
477 void silc_idlist_del_data(void *entry);
478 SILC_TASK_CALLBACK_GLOBAL(silc_idlist_purge);
479 SilcServerEntry 
480 silc_idlist_add_server(SilcIDList id_list, 
481                        char *server_name, int server_type,
482                        SilcServerID *id, SilcServerEntry router,
483                        void *connection);
484 SilcServerEntry
485 silc_idlist_find_server_by_id(SilcIDList id_list, SilcServerID *id,
486                               SilcIDCacheEntry *ret_entry);
487 SilcServerEntry
488 silc_idlist_find_server_by_name(SilcIDList id_list, char *name,
489                                 SilcIDCacheEntry *ret_entry);
490 SilcServerEntry
491 silc_idlist_find_server_by_conn(SilcIDList id_list, char *hostname,
492                                 int port, SilcIDCacheEntry *ret_entry);
493 SilcServerEntry
494 silc_idlist_replace_server_id(SilcIDList id_list, SilcServerID *old_id,
495                               SilcServerID *new_id);
496 void silc_idlist_del_server(SilcIDList id_list, SilcServerEntry entry);
497 SilcClientEntry
498 silc_idlist_add_client(SilcIDList id_list, unsigned char *nickname, 
499                        unsigned int nickname_len, char *username, 
500                        char *userinfo, SilcClientID *id, 
501                        SilcServerEntry router, void *connection);
502 int silc_idlist_del_client(SilcIDList id_list, SilcClientEntry entry);
503 SilcClientEntry *
504 silc_idlist_get_clients_by_nickname(SilcIDList id_list, char *nickname,
505                                     char *server, unsigned int *clients_count);
506 SilcClientEntry *
507 silc_idlist_get_clients_by_hash(SilcIDList id_list, char *nickname,
508                                 SilcHash md5hash,
509                                 unsigned int *clients_count);
510 SilcClientEntry
511 silc_idlist_find_client_by_hash(SilcIDList id_list, char *nickname,
512                                 SilcHash md5hash, SilcIDCacheEntry *ret_entry);
513 SilcClientEntry
514 silc_idlist_find_client_by_id(SilcIDList id_list, SilcClientID *id,
515                               SilcIDCacheEntry *ret_entry);
516 SilcClientEntry
517 silc_idlist_replace_client_id(SilcIDList id_list, SilcClientID *old_id,
518                               SilcClientID *new_id);
519 void silc_idlist_client_destructor(SilcIDCache cache,
520                                    SilcIDCacheEntry entry);
521 SilcChannelEntry
522 silc_idlist_add_channel(SilcIDList id_list, char *channel_name, int mode,
523                         SilcChannelID *id, SilcServerEntry router,
524                         SilcCipher channel_key, SilcHmac hmac);
525 int silc_idlist_del_channel(SilcIDList id_list, SilcChannelEntry entry);
526 SilcChannelEntry
527 silc_idlist_find_channel_by_name(SilcIDList id_list, char *name,
528                                  SilcIDCacheEntry *ret_entry);
529 SilcChannelEntry
530 silc_idlist_find_channel_by_id(SilcIDList id_list, SilcChannelID *id,
531                                SilcIDCacheEntry *ret_entry);
532 SilcChannelEntry
533 silc_idlist_replace_channel_id(SilcIDList id_list, SilcChannelID *old_id,
534                                SilcChannelID *new_id);
535 SilcChannelEntry *
536 silc_idlist_get_channels(SilcIDList id_list, SilcChannelID *channel_id,
537                          unsigned int *channels_count);
538
539 #endif