updates.
[silc.git] / apps / silcd / server.c
1 /*
2
3   server.c
4
5   Author: Pekka Riikonen <priikone@silcnet.org>
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  * This is the actual SILC server than handles everything relating to
22  * servicing the SILC connections. This is also a SILC router as a router 
23  * is also normal server.
24  */
25 /* $Id$ */
26
27 #include "serverincludes.h"
28 #include "server_internal.h"
29
30 /* Static prototypes */
31 SILC_TASK_CALLBACK(silc_server_connect_router);
32 SILC_TASK_CALLBACK(silc_server_connect_to_router);
33 SILC_TASK_CALLBACK(silc_server_connect_to_router_second);
34 SILC_TASK_CALLBACK(silc_server_connect_to_router_final);
35 SILC_TASK_CALLBACK(silc_server_accept_new_connection);
36 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second);
37 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final);
38 SILC_TASK_CALLBACK(silc_server_packet_process);
39 SILC_TASK_CALLBACK(silc_server_packet_parse_real);
40 SILC_TASK_CALLBACK(silc_server_timeout_remote);
41 SILC_TASK_CALLBACK(silc_server_failure_callback);
42 SILC_TASK_CALLBACK(silc_server_rekey_callback);
43
44 /* Allocates a new SILC server object. This has to be done before the server
45    can be used. After allocation one must call silc_server_init to initialize
46    the server. The new allocated server object is returned to the new_server
47    argument. */
48
49 int silc_server_alloc(SilcServer *new_server)
50 {
51   SilcServer server;
52
53   SILC_LOG_DEBUG(("Allocating new server object"));
54
55   server = silc_calloc(1, sizeof(*server));
56   server->server_type = SILC_SERVER;
57   server->standalone = TRUE;
58   server->local_list = silc_calloc(1, sizeof(*server->local_list));
59   server->global_list = silc_calloc(1, sizeof(*server->global_list));
60   server->pending_commands = silc_dlist_init();
61 #ifdef SILC_SIM
62   server->sim = silc_dlist_init();
63 #endif
64
65   *new_server = server;
66
67   return TRUE;
68 }
69
70 /* Free's the SILC server object. This is called at the very end before
71    the program ends. */
72
73 void silc_server_free(SilcServer server)
74 {
75   if (server) {
76 #ifdef SILC_SIM
77     SilcSimContext *sim;
78 #endif
79
80     silc_free(server->local_list);
81     silc_free(server->global_list);
82     if (server->rng)
83       silc_rng_free(server->rng);
84
85     if (server->pkcs)
86       silc_pkcs_free(server->pkcs);
87
88 #ifdef SILC_SIM
89     while ((sim = silc_dlist_get(server->sim)) != SILC_LIST_END) {
90       silc_dlist_del(server->sim, sim);
91       silc_sim_free(sim);
92     }
93     silc_dlist_uninit(server->sim);
94 #endif
95
96     silc_free(server->params);
97
98     if (server->pending_commands)
99       silc_dlist_uninit(server->pending_commands);
100
101     silc_free(server);
102   }
103 }
104
105 /* Initializes the entire SILC server. This is called always before running
106    the server. This is called only once at the initialization of the program.
107    This binds the server to its listenning port. After this function returns 
108    one should call silc_server_run to start the server. This returns TRUE 
109    when everything is ok to run the server. Configuration file must be
110    read and parsed before calling this. */
111
112 int silc_server_init(SilcServer server)
113 {
114   int *sock = NULL, sock_count, i;
115   SilcServerID *id;
116   SilcServerEntry id_entry;
117   SilcIDListPurge purge;
118   SilcServerConfigSectionListenPort *listen;
119
120   SILC_LOG_DEBUG(("Initializing server"));
121   assert(server);
122   assert(server->config);
123
124   /* Set public and private keys */
125   if (!server->config->server_keys ||
126       !server->config->server_keys->public_key || 
127       !server->config->server_keys->private_key) {
128     SILC_LOG_ERROR(("Server public key and/or private key does not exist"));
129     return FALSE;
130   }
131   server->public_key = server->config->server_keys->public_key;
132   server->private_key = server->config->server_keys->private_key;
133
134   /* XXX After server is made as Silc Server Library this can be given
135      as argument, for now this is hard coded */
136   server->params = silc_calloc(1, sizeof(*server->params));
137   server->params->retry_count = SILC_SERVER_RETRY_COUNT;
138   server->params->retry_interval_min = SILC_SERVER_RETRY_INTERVAL_MIN;
139   server->params->retry_interval_max = SILC_SERVER_RETRY_INTERVAL_MAX;
140   server->params->retry_keep_trying = FALSE;
141   server->params->protocol_timeout = 60;
142   server->params->require_reverse_mapping = FALSE;
143
144   /* Set log files where log message should be saved. */
145   server->config->server = server;
146  
147   /* Register all configured ciphers, PKCS and hash functions. */
148   if (!silc_server_config_register_ciphers(server->config))
149     silc_cipher_register_default();
150   if (!silc_server_config_register_pkcs(server->config))
151     silc_pkcs_register_default();
152   if (!silc_server_config_register_hashfuncs(server->config))
153     silc_hash_register_default();
154   if (!silc_server_config_register_hmacs(server->config))
155     silc_hmac_register_default();
156
157   /* Initialize random number generator for the server. */
158   server->rng = silc_rng_alloc();
159   silc_rng_init(server->rng);
160   silc_rng_global_init(server->rng);
161
162   /* Initialize hash functions for server to use */
163   silc_hash_alloc("md5", &server->md5hash);
164   silc_hash_alloc("sha1", &server->sha1hash);
165
166   /* Initialize none cipher */
167   silc_cipher_alloc("none", &server->none_cipher);
168
169   /* Allocate PKCS context for local public and private keys */
170   silc_pkcs_alloc(server->public_key->name, &server->pkcs);
171   silc_pkcs_public_key_set(server->pkcs, server->public_key);
172   silc_pkcs_private_key_set(server->pkcs, server->private_key);
173
174   /* Create a listening server. Note that our server can listen on multiple
175      ports. All listeners are created here and now. */
176   sock_count = 0;
177   listen = server->config->listen_port;
178   while(listen) {
179     int tmp;
180
181     tmp = silc_net_create_server(server->config->listen_port->port,
182                                  server->config->listen_port->listener_ip);
183
184     if (tmp < 0) {
185       SILC_LOG_ERROR(("Could not create server listener: %s on %d",
186                       server->config->listen_port->listener_ip,
187                       server->config->listen_port->port));
188       goto err0;
189     }
190
191     sock = silc_realloc(sock, sizeof(*sock) * (sock_count + 1));
192     sock[sock_count] = tmp;
193     sock_count++;
194     listen = listen->next;
195   }
196
197   /* Initialize ID caches */
198   server->local_list->clients = 
199     silc_idcache_alloc(0, SILC_ID_CLIENT, silc_idlist_client_destructor);
200   server->local_list->servers = silc_idcache_alloc(0, SILC_ID_SERVER, NULL);
201   server->local_list->channels = silc_idcache_alloc(0, SILC_ID_CHANNEL, NULL);
202
203   /* These are allocated for normal server as well as these hold some 
204      global information that the server has fetched from its router. For 
205      router these are used as they are supposed to be used on router. */
206   server->global_list->clients = 
207     silc_idcache_alloc(0, SILC_ID_CLIENT, silc_idlist_client_destructor);
208   server->global_list->servers = silc_idcache_alloc(0, SILC_ID_SERVER, NULL);
209   server->global_list->channels = silc_idcache_alloc(0, SILC_ID_CHANNEL, NULL);
210
211   /* Allocate the entire socket list that is used in server. Eventually 
212      all connections will have entry in this table (it is a table of 
213      pointers to the actual object that is allocated individually 
214      later). */
215   server->sockets = silc_calloc(SILC_SERVER_MAX_CONNECTIONS,
216                                 sizeof(*server->sockets));
217
218   for (i = 0; i < sock_count; i++) {
219     SilcSocketConnection newsocket = NULL;
220
221     /* Set socket to non-blocking mode */
222     silc_net_set_socket_nonblock(sock[i]);
223     server->sock = sock[i];
224     
225     /* Add ourselves also to the socket table. The entry allocated above
226        is sent as argument for fast referencing in the future. */
227     silc_socket_alloc(sock[i], SILC_SOCKET_TYPE_SERVER, NULL, &newsocket);
228     server->sockets[sock[i]] = newsocket;
229     
230     /* Perform name and address lookups to resolve the listenning address
231        and port. */
232     if (!silc_net_check_local_by_sock(sock[i], &newsocket->hostname, 
233                                       &newsocket->ip)) {
234       if ((server->params->require_reverse_mapping && !newsocket->hostname) ||
235           !newsocket->ip) {
236         SILC_LOG_ERROR(("IP/DNS lookup failed for local host %s",
237                         newsocket->hostname ? newsocket->hostname :
238                         newsocket->ip ? newsocket->ip : ""));
239         server->stat.conn_failures++;
240         goto err0;
241       }
242       if (!newsocket->hostname)
243         newsocket->hostname = strdup(newsocket->ip);
244     }
245     newsocket->port = silc_net_get_local_port(sock[i]);
246
247     /* Create a Server ID for the server. */
248     silc_id_create_server_id(newsocket->ip, newsocket->port, server->rng, &id);
249     if (!id)
250       goto err0;
251     
252     server->id = id;
253     server->id_string = silc_id_id2str(id, SILC_ID_SERVER);
254     server->id_string_len = silc_id_get_len(id, SILC_ID_SERVER);
255     server->id_type = SILC_ID_SERVER;
256     server->server_name = server->config->server_info->server_name;
257
258     /* Add ourselves to the server list. We don't have a router yet 
259        beacuse we haven't established a route yet. It will be done later. 
260        For now, NULL is sent as router. This allocates new entry to
261        the ID list. */
262     id_entry = 
263       silc_idlist_add_server(server->local_list,
264                              server->config->server_info->server_name,
265                              server->server_type, server->id, NULL, NULL);
266     if (!id_entry) {
267       SILC_LOG_ERROR(("Could not add ourselves to cache"));
268       goto err0;
269     }
270     id_entry->data.status |= SILC_IDLIST_STATUS_REGISTERED;
271     
272     /* Put the allocated socket pointer also to the entry allocated above 
273        for fast back-referencing to the socket list. */
274     newsocket->user_data = (void *)id_entry;
275     id_entry->connection = (void *)newsocket;
276     server->id_entry = id_entry;
277   }
278
279   /* Register protocols */
280   silc_server_protocols_register();
281
282   /* Initialize the scheduler. */
283   server->schedule = silc_schedule_init(SILC_SERVER_MAX_CONNECTIONS);
284   if (!server->schedule)
285     goto err0;
286
287   /* Add the first task to the scheduler. This is task that is executed by
288      timeout. It expires as soon as the caller calls silc_server_run. This
289      task performs authentication protocol and key exchange with our
290      primary router. */
291   silc_schedule_task_add(server->schedule, sock[0], 
292                          silc_server_connect_to_router,
293                          (void *)server, 0, 1,
294                          SILC_TASK_TIMEOUT,
295                          SILC_TASK_PRI_NORMAL);
296
297   /* Add listener task to the scheduler. This task receives new connections
298      to the server. This task remains on the queue until the end of the 
299      program. */
300   silc_schedule_task_add(server->schedule, sock[0],
301                          silc_server_accept_new_connection,
302                          (void *)server, 0, 0, 
303                          SILC_TASK_FD,
304                          SILC_TASK_PRI_NORMAL);
305   server->listenning = TRUE;
306
307   /* Send log file configuration */
308   silc_server_config_setlogfiles(server->config, server->schedule);
309
310   /* If server connections has been configured then we must be router as
311      normal server cannot have server connections, only router connections. */
312   if (server->config->servers) {
313     SilcServerConfigSectionServerConnection *ptr = server->config->servers;
314
315     server->server_type = SILC_ROUTER;
316     while (ptr) {
317       if (ptr->backup_router) {
318         server->server_type = SILC_BACKUP_ROUTER;
319         server->backup_router = TRUE;
320         server->id_entry->server_type = SILC_BACKUP_ROUTER;
321         break;
322       }
323       ptr = ptr->next;
324     }
325   }
326
327   /* Register the ID Cache purge task. This periodically purges the ID cache
328      and removes the expired cache entries. */
329
330   /* Clients local list */
331   purge = silc_calloc(1, sizeof(*purge));
332   purge->cache = server->local_list->clients;
333   purge->schedule = server->schedule;
334   purge->timeout = 600;
335   silc_schedule_task_add(purge->schedule, 0, 
336                          silc_idlist_purge,
337                          (void *)purge, purge->timeout, 0,
338                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
339
340   /* Clients global list */
341   purge = silc_calloc(1, sizeof(*purge));
342   purge->cache = server->global_list->clients;
343   purge->schedule = server->schedule;
344   purge->timeout = 300;
345   silc_schedule_task_add(purge->schedule, 0, 
346                          silc_idlist_purge,
347                          (void *)purge, purge->timeout, 0,
348                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
349
350   SILC_LOG_DEBUG(("Server initialized"));
351
352   /* We are done here, return succesfully */
353   return TRUE;
354
355  err0:
356   for (i = 0; i < sock_count; i++)
357     silc_net_close_server(sock[i]);
358
359   return FALSE;
360 }
361
362 /* Fork server to background */
363
364 void silc_server_daemonise(SilcServer server)
365 {
366   int i;
367
368   SILC_LOG_DEBUG(("Forking SILC server to background"));
369
370   i = fork();
371
372   if (i < 0) {
373     SILC_LOG_DEBUG(("fork() failed, cannot proceed"));
374     exit(1);
375   }
376   else if (i) {
377     if (geteuid())
378       SILC_LOG_DEBUG(("Server started as user"));
379     else
380       SILC_LOG_DEBUG(("Server started as root. Dropping privileges."));
381     exit(0);
382   }
383   setsid();
384 }
385
386 /* Drop root privligies. If this cannot be done, die. */
387
388 void silc_server_drop(SilcServer server)
389 {
390   /* Are we executing silcd as root or a regular user? */
391   if (!geteuid()) {
392     struct passwd *pw;
393     struct group *gr;
394     char *user, *group;
395
396     if (!server->config->identity || !server->config->identity->user || 
397         !server->config->identity->group) {
398       fprintf(stderr, "Error:"
399        "\tSILC server must not be run as root.  For the security of your\n"
400        "\tsystem it is strongly suggested that you run SILC under dedicated\n"
401        "\tuser account.  Modify the [Identity] configuration section to run\n"
402        "\tthe server as non-root user.\n");
403       exit(1);
404     }
405
406     /* Get the values given for user and group in configuration file */
407     user=server->config->identity->user;
408     group=server->config->identity->group;
409
410     /* Check whether the user/group information is text */ 
411     if (atoi(user)!=0 || atoi(group)!=0) {
412       SILC_LOG_DEBUG(("Invalid user and/or group information"));
413       SILC_LOG_DEBUG(("User and/or group given as number"));
414       fprintf(stderr, "Invalid user and/or group information\n");
415       fprintf(stderr, "Please assign them as names, not numbers\n");
416       exit(1);
417     }
418
419     /* Catch the nasty incident of string "0" returning 0 from atoi */
420     if (strcmp("0", user)==0 || strcmp("0", group)==0) {
421       SILC_LOG_DEBUG(("User and/or group configured to 0. Unacceptable"));
422       fprintf(stderr, "User and/or group configured to 0. Exiting\n");
423       exit(1);
424     }
425
426     if (!(pw=getpwnam(user))) {
427       fprintf(stderr, "No such user %s found\n", user);
428       exit(1);
429     }
430
431     if (!(gr=getgrnam(group))) {
432       fprintf(stderr, "No such group %s found\n", group);
433       exit(1);
434     }
435
436     /* Check whether user and/or group is set to root. If yes, exit
437        immediately. Otherwise, setgid and setuid server to user.group */
438     if (gr->gr_gid==0 || pw->pw_uid==0) {
439       fprintf(stderr, "Error:"
440        "\tSILC server must not be run as root.  For the security of your\n"
441        "\tsystem it is strongly suggested that you run SILC under dedicated\n"
442        "\tuser account.  Modify the [Identity] configuration section to run\n"
443        "\tthe server as non-root user.\n");
444       exit(1);
445     } else {
446       SILC_LOG_DEBUG(("Changing to group %s", group));
447       if (setgid(gr->gr_gid)==0) {
448         SILC_LOG_DEBUG(("Setgid to %s", group));
449       } else {
450         SILC_LOG_DEBUG(("Setgid to %s failed", group));
451         fprintf(stderr, "Tried to setgid %s but no such group. Exiting\n",
452                 group);
453         exit(1);
454       }
455 #if defined HAVE_SETGROUPS && defined HAVE_INITGROUPS
456       if (setgroups(0, NULL)!=0) {
457         SILC_LOG_DEBUG(("Setgroups to NULL failed"));
458         fprintf(stderr, "Tried to setgroups NULL but failed. Exiting\n");
459         exit(1);
460       }
461       if (initgroups(user, gr->gr_gid)!=0) {
462         SILC_LOG_DEBUG(("Initgroups to user %s (gid=%d) failed", user, gr->gr_gid));
463         fprintf(stderr, "Tried to initgroups %s (gid=%d) but no such user. Exiting\n",
464                 user, gr->gr_gid);
465         exit(1);
466       }
467 #endif
468       SILC_LOG_DEBUG(("Changing to user %s", user));
469       if (setuid(pw->pw_uid)==0) {
470         SILC_LOG_DEBUG(("Setuid to %s", user));
471       } else {
472         SILC_LOG_DEBUG(("Setuid to %s failed", user));
473         fprintf(stderr, "Tried to setuid %s but no such user. Exiting\n",
474                 user);
475         exit(1);
476       }
477     }
478   }
479 }
480
481 /* The heart of the server. This runs the scheduler thus runs the server. 
482    When this returns the server has been stopped and the program will
483    be terminated. */
484
485 void silc_server_run(SilcServer server)
486 {
487   SILC_LOG_DEBUG(("Running server"));
488
489   SILC_LOG_INFO(("SILC Server started"));
490
491   /* Start the scheduler, the heart of the SILC server. When this returns
492      the program will be terminated. */
493   silc_schedule(server->schedule);
494 }
495
496 /* Stops the SILC server. This function is used to shutdown the server. 
497    This is usually called after the scheduler has returned. After stopping 
498    the server one should call silc_server_free. */
499
500 void silc_server_stop(SilcServer server)
501 {
502   SILC_LOG_DEBUG(("Stopping server"));
503
504   if (server->schedule) {
505     silc_schedule_stop(server->schedule);
506     silc_schedule_uninit(server->schedule);
507     server->schedule = NULL;
508   }
509
510   silc_server_protocols_unregister();
511
512   SILC_LOG_DEBUG(("Server stopped"));
513 }
514
515 /* Function that is called when the network connection to a router has
516    been established.  This will continue with the key exchange protocol
517    with the remote router. */
518
519 void silc_server_start_key_exchange(SilcServer server,
520                                     SilcServerConnection sconn,
521                                     int sock)
522 {
523   SilcSocketConnection newsocket;
524   SilcProtocol protocol;
525   SilcServerKEInternalContext *proto_ctx;
526   void *context;
527
528   /* Set socket options */
529   silc_net_set_socket_nonblock(sock);
530   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
531
532   /* Create socket connection for the connection. Even though we
533      know that we are connecting to a router we will mark the socket
534      to be unknown connection until we have executed authentication
535      protocol. */
536   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
537   server->sockets[sock] = newsocket;
538   newsocket->hostname = strdup(sconn->remote_host);
539   newsocket->ip = strdup(sconn->remote_host);
540   newsocket->port = sconn->remote_port;
541   sconn->sock = newsocket;
542
543   /* Allocate internal protocol context. This is sent as context
544      to the protocol. */
545   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
546   proto_ctx->server = (void *)server;
547   proto_ctx->context = (void *)sconn;
548   proto_ctx->sock = newsocket;
549   proto_ctx->rng = server->rng;
550   proto_ctx->responder = FALSE;
551       
552   /* Perform key exchange protocol. silc_server_connect_to_router_second
553      will be called after the protocol is finished. */
554   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
555                       &protocol, proto_ctx,
556                       silc_server_connect_to_router_second);
557   newsocket->protocol = protocol;
558       
559   /* Register a timeout task that will be executed if the protocol
560      is not executed within set limit. */
561   proto_ctx->timeout_task = 
562     silc_schedule_task_add(server->schedule, sock, 
563                        silc_server_timeout_remote,
564                        server, server->params->protocol_timeout,
565                        server->params->protocol_timeout_usec,
566                        SILC_TASK_TIMEOUT,
567                        SILC_TASK_PRI_LOW);
568
569   /* Register the connection for network input and output. This sets
570      that scheduler will listen for incoming packets for this connection 
571      and sets that outgoing packets may be sent to this connection as 
572      well. However, this doesn't set the scheduler for outgoing traffic,
573      it will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
574      later when outgoing data is available. */
575   context = (void *)server;
576   SILC_REGISTER_CONNECTION_FOR_IO(sock);
577   
578   /* Run the protocol */
579   silc_protocol_execute(protocol, server->schedule, 0, 0);
580 }
581
582 /* Timeout callback that will be called to retry connecting to remote
583    router. This is used by both normal and router server. This will wait
584    before retrying the connecting. The timeout is generated by exponential
585    backoff algorithm. */
586
587 SILC_TASK_CALLBACK(silc_server_connect_to_router_retry)
588 {
589   SilcServerConnection sconn = (SilcServerConnection)context;
590   SilcServer server = sconn->server;
591
592   SILC_LOG_INFO(("Retrying connecting to a router"));
593
594   /* Calculate next timeout */
595   if (sconn->retry_count >= 1) {
596     sconn->retry_timeout = sconn->retry_timeout * SILC_SERVER_RETRY_MULTIPLIER;
597     if (sconn->retry_timeout > SILC_SERVER_RETRY_INTERVAL_MAX)
598       sconn->retry_timeout = SILC_SERVER_RETRY_INTERVAL_MAX;
599   } else {
600     sconn->retry_timeout = server->params->retry_interval_min;
601   }
602   sconn->retry_count++;
603   sconn->retry_timeout = sconn->retry_timeout +
604     silc_rng_get_rn32(server->rng) % SILC_SERVER_RETRY_RANDOMIZER;
605
606   /* If we've reached max retry count, give up. */
607   if (sconn->retry_count > server->params->retry_count && 
608       server->params->retry_keep_trying == FALSE) {
609     SILC_LOG_ERROR(("Could not connect to router, giving up"));
610     silc_free(sconn->remote_host);
611     silc_free(sconn);
612     return;
613   }
614
615   /* Wait one before retrying */
616   silc_schedule_task_add(server->schedule, fd, silc_server_connect_router,
617                          context, sconn->retry_timeout, 
618                          server->params->retry_interval_min_usec,
619                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
620 }
621
622 /* Generic routine to use connect to a router. */
623
624 SILC_TASK_CALLBACK(silc_server_connect_router)
625 {    
626   SilcServerConnection sconn = (SilcServerConnection)context;
627   SilcServer server = sconn->server;
628   int sock;
629
630   SILC_LOG_INFO(("Connecting to the %s %s on port %d", 
631                  (sconn->backup ? "backup router" : "router"), 
632                  sconn->remote_host, sconn->remote_port));
633
634   server->router_connect = time(0);
635
636   /* Connect to remote host */
637   sock = silc_net_create_connection(server->config->listen_port->local_ip,
638                                     sconn->remote_port, 
639                                     sconn->remote_host);
640   if (sock < 0) {
641     SILC_LOG_ERROR(("Could not connect to router"));
642     silc_schedule_task_add(server->schedule, fd, 
643                            silc_server_connect_to_router_retry,
644                            context, 0, 1, SILC_TASK_TIMEOUT, 
645                            SILC_TASK_PRI_NORMAL);
646     return;
647   }
648
649   /* Continue with key exchange protocol */
650   silc_server_start_key_exchange(server, sconn, sock);
651 }
652   
653 /* This function connects to our primary router or if we are a router this
654    establishes all our primary routes. This is called at the start of the
655    server to do authentication and key exchange with our router - called
656    from schedule. */
657
658 SILC_TASK_CALLBACK(silc_server_connect_to_router)
659 {
660   SilcServer server = (SilcServer)context;
661   SilcServerConnection sconn;
662   SilcServerConfigSectionServerConnection *ptr;
663
664   SILC_LOG_DEBUG(("Connecting to router(s)"));
665
666   if (server->server_type == SILC_SERVER) {
667     SILC_LOG_DEBUG(("We are normal server"));
668   } else if (server->server_type == SILC_ROUTER) {
669     SILC_LOG_DEBUG(("We are router"));
670   } else {
671     SILC_LOG_DEBUG(("We are backup router/normal server"));
672   }
673
674   /* Create the connections to all our routes */
675   ptr = server->config->routers;
676   while (ptr) {
677     
678     SILC_LOG_DEBUG(("%s connection [%s] %s:%d",
679                     ptr->backup_router ? "Backup router" : "Router",
680                     ptr->initiator ? "Initiator" : "Responder",
681                     ptr->host, ptr->port));
682
683     if (ptr->initiator) {
684       /* Allocate connection object for hold connection specific stuff. */
685       sconn = silc_calloc(1, sizeof(*sconn));
686       sconn->server = server;
687       sconn->remote_host = strdup(ptr->host);
688       sconn->remote_port = ptr->port;
689       sconn->backup = ptr->backup_router;
690       if (sconn->backup) {
691         sconn->backup_replace_ip = strdup(ptr->backup_replace_ip);
692         sconn->backup_replace_port = ptr->backup_replace_port;
693       }
694
695       if (!server->router_conn && !sconn->backup)
696         server->router_conn = sconn;
697
698       silc_schedule_task_add(server->schedule, fd, 
699                              silc_server_connect_router,
700                              (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
701                              SILC_TASK_PRI_NORMAL);
702     }
703
704     if (!ptr->next)
705       return;
706     
707     ptr = ptr->next;
708   }
709
710   SILC_LOG_DEBUG(("No router(s), server will be standalone"));
711   
712   /* There wasn't a configured router, we will continue but we don't
713      have a connection to outside world.  We will be standalone server. */
714   server->standalone = TRUE;
715 }
716
717 /* Second part of connecting to router(s). Key exchange protocol has been
718    executed and now we will execute authentication protocol. */
719
720 SILC_TASK_CALLBACK(silc_server_connect_to_router_second)
721 {
722   SilcProtocol protocol = (SilcProtocol)context;
723   SilcServerKEInternalContext *ctx = 
724     (SilcServerKEInternalContext *)protocol->context;
725   SilcServer server = (SilcServer)ctx->server;
726   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
727   SilcSocketConnection sock = ctx->sock;
728   SilcServerConnAuthInternalContext *proto_ctx;
729   SilcServerConfigSectionServerConnection *conn = NULL;
730
731   SILC_LOG_DEBUG(("Start"));
732
733   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
734       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
735     /* Error occured during protocol */
736     silc_protocol_free(protocol);
737     sock->protocol = NULL;
738     silc_ske_free_key_material(ctx->keymat);
739     if (ctx->packet)
740       silc_packet_context_free(ctx->packet);
741     if (ctx->ske)
742       silc_ske_free(ctx->ske);
743     silc_free(ctx->dest_id);
744     silc_free(ctx);
745     silc_schedule_task_del_by_callback(server->schedule,
746                                        silc_server_failure_callback);
747     silc_server_disconnect_remote(server, sock, "Server closed connection: "
748                                   "Key exchange failed");
749     return;
750   }
751   
752   /* We now have the key material as the result of the key exchange
753      protocol. Take the key material into use. Free the raw key material
754      as soon as we've set them into use. */
755   if (!silc_server_protocol_ke_set_keys(server, ctx->ske, 
756                                         ctx->sock, ctx->keymat,
757                                         ctx->ske->prop->cipher,
758                                         ctx->ske->prop->pkcs,
759                                         ctx->ske->prop->hash,
760                                         ctx->ske->prop->hmac,
761                                         ctx->ske->prop->group,
762                                         ctx->responder)) {
763     silc_protocol_free(protocol);
764     sock->protocol = NULL;
765     silc_ske_free_key_material(ctx->keymat);
766     if (ctx->packet)
767       silc_packet_context_free(ctx->packet);
768     if (ctx->ske)
769       silc_ske_free(ctx->ske);
770     silc_free(ctx->dest_id);
771     silc_free(ctx);
772     silc_schedule_task_del_by_callback(server->schedule,
773                                        silc_server_failure_callback);
774     silc_server_disconnect_remote(server, sock, "Server closed connection: "
775                                   "Key exchange failed");
776     return;
777   }    
778   silc_ske_free_key_material(ctx->keymat);
779
780   /* Allocate internal context for the authentication protocol. This
781      is sent as context for the protocol. */
782   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
783   proto_ctx->server = (void *)server;
784   proto_ctx->context = (void *)sconn;
785   proto_ctx->sock = sock;
786   proto_ctx->ske = ctx->ske;       /* Save SKE object from previous protocol */
787   proto_ctx->dest_id_type = ctx->dest_id_type;
788   proto_ctx->dest_id = ctx->dest_id;
789
790   /* Resolve the authentication method used in this connection. Check if 
791      we find a match from user configured connections */
792   conn = silc_server_config_find_router_conn(server->config,
793                                              sock->hostname,
794                                              sock->port);
795   if (conn) {
796     /* Match found. Use the configured authentication method */
797     proto_ctx->auth_meth = conn->auth_meth;
798     if (conn->auth_data) {
799       proto_ctx->auth_data = strdup(conn->auth_data);
800       proto_ctx->auth_data_len = strlen(conn->auth_data);
801     }
802   } else {
803     SILC_LOG_ERROR(("Could not find connection data for %s (%s) on port",
804                     sock->hostname, sock->ip, sock->port));
805     silc_protocol_free(protocol);
806     sock->protocol = NULL;
807     if (ctx->packet)
808       silc_packet_context_free(ctx->packet);
809     if (ctx->ske)
810       silc_ske_free(ctx->ske);
811     silc_free(ctx->dest_id);
812     silc_free(ctx);
813     silc_schedule_task_del_by_callback(server->schedule,
814                                        silc_server_failure_callback);
815     silc_server_disconnect_remote(server, sock, "Server closed connection: "
816                                   "Key exchange failed");
817     return;
818   }
819
820   /* Free old protocol as it is finished now */
821   silc_protocol_free(protocol);
822   if (ctx->packet)
823     silc_packet_context_free(ctx->packet);
824   silc_free(ctx);
825   sock->protocol = NULL;
826
827   /* Allocate the authentication protocol. This is allocated here
828      but we won't start it yet. We will be receiving party of this
829      protocol thus we will wait that connecting party will make
830      their first move. */
831   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
832                       &sock->protocol, proto_ctx, 
833                       silc_server_connect_to_router_final);
834
835   /* Register timeout task. If the protocol is not executed inside
836      this timelimit the connection will be terminated. Currently
837      this is 15 seconds and is hard coded limit (XXX). */
838   proto_ctx->timeout_task = 
839     silc_schedule_task_add(server->schedule, sock->sock, 
840                        silc_server_timeout_remote,
841                        (void *)server, 15, 0,
842                        SILC_TASK_TIMEOUT,
843                        SILC_TASK_PRI_LOW);
844
845   /* Run the protocol */
846   silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
847 }
848
849 /* Finalizes the connection to router. Registers a server task to the
850    queue so that we can accept new connections. */
851
852 SILC_TASK_CALLBACK(silc_server_connect_to_router_final)
853 {
854   SilcProtocol protocol = (SilcProtocol)context;
855   SilcServerConnAuthInternalContext *ctx = 
856     (SilcServerConnAuthInternalContext *)protocol->context;
857   SilcServer server = (SilcServer)ctx->server;
858   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
859   SilcSocketConnection sock = ctx->sock;
860   SilcServerEntry id_entry;
861   SilcBuffer packet;
862   SilcServerHBContext hb_context;
863   unsigned char *id_string;
864   uint32 id_len;
865   SilcIDListData idata;
866
867   SILC_LOG_DEBUG(("Start"));
868
869   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
870       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
871     /* Error occured during protocol */
872     silc_free(ctx->dest_id);
873     silc_server_disconnect_remote(server, sock, "Server closed connection: "
874                                   "Authentication failed");
875     goto out;
876   }
877
878   /* Add a task to the queue. This task receives new connections to the 
879      server. This task remains on the queue until the end of the program. */
880   if (!server->listenning && !sconn->backup) {
881     silc_schedule_task_add(server->schedule, server->sock, 
882                            silc_server_accept_new_connection,
883                            (void *)server, 0, 0, 
884                            SILC_TASK_FD,
885                            SILC_TASK_PRI_NORMAL);
886     server->listenning = TRUE;
887   }
888
889   /* Send NEW_SERVER packet to the router. We will become registered
890      to the SILC network after sending this packet. */
891   id_string = silc_id_id2str(server->id, SILC_ID_SERVER);
892   id_len = silc_id_get_len(server->id, SILC_ID_SERVER);
893   packet = silc_buffer_alloc(2 + 2 + id_len + strlen(server->server_name));
894   silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
895   silc_buffer_format(packet,
896                      SILC_STR_UI_SHORT(id_len),
897                      SILC_STR_UI_XNSTRING(id_string, id_len),
898                      SILC_STR_UI_SHORT(strlen(server->server_name)),
899                      SILC_STR_UI_XNSTRING(server->server_name,
900                                           strlen(server->server_name)),
901                      SILC_STR_END);
902
903   /* Send the packet */
904   silc_server_packet_send(server, ctx->sock, SILC_PACKET_NEW_SERVER, 0,
905                           packet->data, packet->len, TRUE);
906   silc_buffer_free(packet);
907   silc_free(id_string);
908
909   SILC_LOG_INFO(("Connected to router %s", sock->hostname));
910
911   /* Check that we do not have this ID already */
912   id_entry = silc_idlist_find_server_by_id(server->local_list, 
913                                            ctx->dest_id, TRUE, NULL);
914   if (id_entry) {
915     silc_idcache_del_by_context(server->local_list->servers, id_entry);
916   } else {
917     id_entry = silc_idlist_find_server_by_id(server->global_list, 
918                                              ctx->dest_id, TRUE, NULL);
919     if (id_entry) 
920       silc_idcache_del_by_context(server->global_list->servers, id_entry);
921   }
922
923   SILC_LOG_DEBUG(("New server id(%s)",
924                   silc_id_render(ctx->dest_id, SILC_ID_SERVER)));
925
926   /* Add the connected router to global server list */
927   id_entry = silc_idlist_add_server(server->global_list, 
928                                     strdup(sock->hostname),
929                                     SILC_ROUTER, ctx->dest_id, NULL, sock);
930   if (!id_entry) {
931     silc_free(ctx->dest_id);
932     silc_server_disconnect_remote(server, sock, "Server closed connection: "
933                                   "Authentication failed");
934     goto out;
935   }
936
937   silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
938   silc_free(sock->user_data);
939   sock->user_data = (void *)id_entry;
940   sock->type = SILC_SOCKET_TYPE_ROUTER;
941   idata = (SilcIDListData)sock->user_data;
942   idata->status |= SILC_IDLIST_STATUS_REGISTERED;
943
944   /* Perform keepalive. The `hb_context' will be freed automatically
945      when finally calling the silc_socket_free function. XXX hardcoded 
946      timeout!! */
947   hb_context = silc_calloc(1, sizeof(*hb_context));
948   hb_context->server = server;
949   silc_socket_set_heartbeat(sock, 600, hb_context,
950                             silc_server_perform_heartbeat,
951                             server->schedule);
952
953   /* Register re-key timeout */
954   idata->rekey->timeout = 3600; /* XXX hardcoded */
955   idata->rekey->context = (void *)server;
956   silc_schedule_task_add(server->schedule, sock->sock, 
957                          silc_server_rekey_callback,
958                          (void *)sock, idata->rekey->timeout, 0,
959                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
960
961   if (!sconn->backup) {
962     /* Mark this router our primary router if we're still standalone */
963     if (server->standalone) {
964       server->id_entry->router = id_entry;
965       server->router = id_entry;
966       server->standalone = FALSE;
967     
968       /* If we are router then announce our possible servers. */
969       if (server->server_type == SILC_ROUTER)
970         silc_server_announce_servers(server, FALSE, 0, 
971                                      server->router->connection);
972
973       /* Announce our clients and channels to the router */
974       silc_server_announce_clients(server, 0, server->router->connection);
975       silc_server_announce_channels(server, 0, server->router->connection);
976     }
977   } else {
978     /* Add this server to be our backup router */
979     silc_server_backup_add(server, id_entry, sconn->backup_replace_ip,
980                            sconn->backup_replace_port, FALSE);
981   }
982
983   sock->protocol = NULL;
984
985   /* Call the completion callback to indicate that we've connected to
986      the router */
987   if (sconn->callback)
988     (*sconn->callback)(server, id_entry, sconn->callback_context);
989
990  out:
991   /* Free the temporary connection data context */
992   if (sconn) {
993     silc_free(sconn->remote_host);
994     silc_free(sconn->backup_replace_ip);
995     silc_free(sconn);
996   }
997   if (sconn == server->router_conn)
998     server->router_conn = NULL;
999
1000   /* Free the protocol object */
1001   if (sock->protocol == protocol)
1002     sock->protocol = NULL;
1003   silc_protocol_free(protocol);
1004   if (ctx->packet)
1005     silc_packet_context_free(ctx->packet);
1006   if (ctx->ske)
1007     silc_ske_free(ctx->ske);
1008   silc_free(ctx->auth_data);
1009   silc_free(ctx);
1010 }
1011
1012 /* Host lookup callbcak that is called after the incoming connection's
1013    IP and FQDN lookup is performed. This will actually check the acceptance
1014    of the incoming connection and will register the key exchange protocol
1015    for this connection. */
1016
1017 static void 
1018 silc_server_accept_new_connection_lookup(SilcSocketConnection sock,
1019                                          void *context)
1020 {
1021   SilcServer server = (SilcServer)context;
1022   SilcServerKEInternalContext *proto_ctx;
1023   void *cconfig, *sconfig, *rconfig;
1024   SilcServerConfigSectionDenyConnection *deny;
1025   int port;
1026
1027   SILC_LOG_DEBUG(("Start"));
1028
1029   /* Check whether we could resolve both IP and FQDN. */
1030   if (!sock->ip || (!strcmp(sock->ip, sock->hostname) &&
1031                     server->params->require_reverse_mapping)) {
1032     SILC_LOG_ERROR(("IP/DNS lookup failed %s",
1033                     sock->hostname ? sock->hostname :
1034                     sock->ip ? sock->ip : ""));
1035     server->stat.conn_failures++;
1036     silc_server_disconnect_remote(server, sock,
1037                                   "Server closed connection: Unknown host");
1038     return;
1039   }
1040
1041   /* Register the connection for network input and output. This sets
1042      that scheduler will listen for incoming packets for this connection 
1043      and sets that outgoing packets may be sent to this connection as well.
1044      However, this doesn't set the scheduler for outgoing traffic, it
1045      will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
1046      later when outgoing data is available. */
1047   SILC_REGISTER_CONNECTION_FOR_IO(sock->sock);
1048
1049   SILC_LOG_INFO(("Incoming connection from %s (%s)", sock->hostname,
1050                  sock->ip));
1051
1052   port = server->sockets[server->sock]->port; /* Listenning port */
1053
1054   /* Check whether this connection is denied to connect to us. */
1055   deny = silc_server_config_denied_conn(server->config, sock->ip, port);
1056   if (!deny)
1057     deny = silc_server_config_denied_conn(server->config, sock->hostname,
1058                                           port);
1059   if (deny) {
1060     /* The connection is denied */
1061     SILC_LOG_INFO(("Connection %s (%s) is denied", 
1062                    sock->hostname, sock->ip));
1063     silc_server_disconnect_remote(server, sock, deny->comment ?
1064                                   deny->comment :
1065                                   "Server closed connection: "
1066                                   "Connection refused");
1067     server->stat.conn_failures++;
1068     return;
1069   }
1070
1071   /* Check whether we have configred this sort of connection at all. We
1072      have to check all configurations since we don't know what type of
1073      connection this is. */
1074   if (!(cconfig = silc_server_config_find_client_conn(server->config,
1075                                                       sock->ip, port)))
1076     cconfig = silc_server_config_find_client_conn(server->config,
1077                                                   sock->hostname, 
1078                                                   port);
1079   if (!(sconfig = silc_server_config_find_server_conn(server->config,
1080                                                      sock->ip, 
1081                                                      port)))
1082     sconfig = silc_server_config_find_server_conn(server->config,
1083                                                   sock->hostname,
1084                                                   port);
1085   if (!(rconfig = silc_server_config_find_router_conn(server->config,
1086                                                      sock->ip, port)))
1087     rconfig = silc_server_config_find_router_conn(server->config,
1088                                                   sock->hostname, 
1089                                                   port);
1090   if (!cconfig && !sconfig && !rconfig) {
1091     SILC_LOG_INFO(("Connection %s (%s) is not allowed", 
1092                    sock->hostname, sock->ip));
1093     silc_server_disconnect_remote(server, sock, 
1094                                   "Server closed connection: "
1095                                   "Connection refused");
1096     server->stat.conn_failures++;
1097     return;
1098   }
1099
1100   /* The connection is allowed */
1101
1102   /* Allocate internal context for key exchange protocol. This is
1103      sent as context for the protocol. */
1104   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
1105   proto_ctx->server = context;
1106   proto_ctx->sock = sock;
1107   proto_ctx->rng = server->rng;
1108   proto_ctx->responder = TRUE;
1109   proto_ctx->cconfig = cconfig;
1110   proto_ctx->sconfig = sconfig;
1111   proto_ctx->rconfig = rconfig;
1112
1113   /* Prepare the connection for key exchange protocol. We allocate the
1114      protocol but will not start it yet. The connector will be the
1115      initiator of the protocol thus we will wait for initiation from 
1116      there before we start the protocol. */
1117   server->stat.auth_attempts++;
1118   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
1119                       &sock->protocol, proto_ctx, 
1120                       silc_server_accept_new_connection_second);
1121
1122   /* Register a timeout task that will be executed if the connector
1123      will not start the key exchange protocol within 60 seconds. For
1124      now, this is a hard coded limit. After 60 secs the connection will
1125      be closed if the key exchange protocol has not been started. */
1126   proto_ctx->timeout_task = 
1127     silc_schedule_task_add(server->schedule, sock->sock, 
1128                            silc_server_timeout_remote,
1129                            context, 60, 0,
1130                            SILC_TASK_TIMEOUT,
1131                            SILC_TASK_PRI_LOW);
1132 }
1133
1134 /* Accepts new connections to the server. Accepting new connections are
1135    done in three parts to make it async. */
1136
1137 SILC_TASK_CALLBACK(silc_server_accept_new_connection)
1138 {
1139   SilcServer server = (SilcServer)context;
1140   SilcSocketConnection newsocket;
1141   int sock;
1142
1143   SILC_LOG_DEBUG(("Accepting new connection"));
1144
1145   server->stat.conn_attempts++;
1146
1147   sock = silc_net_accept_connection(server->sock);
1148   if (sock < 0) {
1149     SILC_LOG_ERROR(("Could not accept new connection: %s", strerror(errno)));
1150     server->stat.conn_failures++;
1151     return;
1152   }
1153
1154   /* Check max connections */
1155   if (sock > SILC_SERVER_MAX_CONNECTIONS) {
1156     SILC_LOG_ERROR(("Refusing connection, server is full"));
1157     server->stat.conn_failures++;
1158     return;
1159   }
1160
1161   /* Set socket options */
1162   silc_net_set_socket_nonblock(sock);
1163   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
1164
1165   /* We don't create a ID yet, since we don't know what type of connection
1166      this is yet. But, we do add the connection to the socket table. */
1167   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
1168   server->sockets[sock] = newsocket;
1169
1170   /* Perform asynchronous host lookup. This will lookup the IP and the
1171      FQDN of the remote connection. After the lookup is done the connection
1172      is accepted further. */
1173   silc_socket_host_lookup(newsocket, TRUE, 
1174                           silc_server_accept_new_connection_lookup, context, 
1175                           server->schedule);
1176 }
1177
1178 /* Second part of accepting new connection. Key exchange protocol has been
1179    performed and now it is time to do little connection authentication
1180    protocol to figure out whether this connection is client or server
1181    and whether it has right to access this server (especially server
1182    connections needs to be authenticated). */
1183
1184 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second)
1185 {
1186   SilcProtocol protocol = (SilcProtocol)context;
1187   SilcServerKEInternalContext *ctx = 
1188     (SilcServerKEInternalContext *)protocol->context;
1189   SilcServer server = (SilcServer)ctx->server;
1190   SilcSocketConnection sock = ctx->sock;
1191   SilcServerConnAuthInternalContext *proto_ctx;
1192
1193   SILC_LOG_DEBUG(("Start"));
1194
1195   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
1196       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
1197     /* Error occured during protocol */
1198     silc_protocol_free(protocol);
1199     sock->protocol = NULL;
1200     silc_ske_free_key_material(ctx->keymat);
1201     if (ctx->packet)
1202       silc_packet_context_free(ctx->packet);
1203     if (ctx->ske)
1204       silc_ske_free(ctx->ske);
1205     silc_free(ctx->dest_id);
1206     silc_free(ctx);
1207     silc_schedule_task_del_by_callback(server->schedule,
1208                                        silc_server_failure_callback);
1209     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1210                                   "Key exchange failed");
1211     server->stat.auth_failures++;
1212     return;
1213   }
1214
1215   /* We now have the key material as the result of the key exchange
1216      protocol. Take the key material into use. Free the raw key material
1217      as soon as we've set them into use. */
1218   if (!silc_server_protocol_ke_set_keys(server, ctx->ske, 
1219                                         ctx->sock, ctx->keymat,
1220                                         ctx->ske->prop->cipher,
1221                                         ctx->ske->prop->pkcs,
1222                                         ctx->ske->prop->hash,
1223                                         ctx->ske->prop->hmac,
1224                                         ctx->ske->prop->group,
1225                                         ctx->responder)) {
1226     silc_protocol_free(protocol);
1227     sock->protocol = NULL;
1228     silc_ske_free_key_material(ctx->keymat);
1229     if (ctx->packet)
1230       silc_packet_context_free(ctx->packet);
1231     if (ctx->ske)
1232       silc_ske_free(ctx->ske);
1233     silc_free(ctx->dest_id);
1234     silc_free(ctx);
1235     silc_schedule_task_del_by_callback(server->schedule,
1236                                        silc_server_failure_callback);
1237     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1238                                   "Key exchange failed");
1239     server->stat.auth_failures++;
1240     return;
1241   }    
1242   silc_ske_free_key_material(ctx->keymat);
1243
1244   /* Allocate internal context for the authentication protocol. This
1245      is sent as context for the protocol. */
1246   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
1247   proto_ctx->server = (void *)server;
1248   proto_ctx->sock = sock;
1249   proto_ctx->ske = ctx->ske;    /* Save SKE object from previous protocol */
1250   proto_ctx->responder = TRUE;
1251   proto_ctx->dest_id_type = ctx->dest_id_type;
1252   proto_ctx->dest_id = ctx->dest_id;
1253   proto_ctx->cconfig = ctx->cconfig;
1254   proto_ctx->sconfig = ctx->sconfig;
1255   proto_ctx->rconfig = ctx->rconfig;
1256
1257   /* Free old protocol as it is finished now */
1258   silc_protocol_free(protocol);
1259   if (ctx->packet)
1260     silc_packet_context_free(ctx->packet);
1261   silc_free(ctx);
1262   sock->protocol = NULL;
1263
1264   /* Allocate the authentication protocol. This is allocated here
1265      but we won't start it yet. We will be receiving party of this
1266      protocol thus we will wait that connecting party will make
1267      their first move. */
1268   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
1269                       &sock->protocol, proto_ctx, 
1270                       silc_server_accept_new_connection_final);
1271
1272   /* Register timeout task. If the protocol is not executed inside
1273      this timelimit the connection will be terminated. Currently
1274      this is 60 seconds and is hard coded limit (XXX). */
1275   proto_ctx->timeout_task = 
1276     silc_schedule_task_add(server->schedule, sock->sock, 
1277                            silc_server_timeout_remote,
1278                            (void *)server, 60, 0,
1279                            SILC_TASK_TIMEOUT,
1280                            SILC_TASK_PRI_LOW);
1281 }
1282
1283 /* Final part of accepting new connection. The connection has now
1284    been authenticated and keys has been exchanged. We also know whether
1285    this is client or server connection. */
1286
1287 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final)
1288 {
1289   SilcProtocol protocol = (SilcProtocol)context;
1290   SilcServerConnAuthInternalContext *ctx = 
1291     (SilcServerConnAuthInternalContext *)protocol->context;
1292   SilcServer server = (SilcServer)ctx->server;
1293   SilcSocketConnection sock = ctx->sock;
1294   SilcServerHBContext hb_context;
1295   SilcUnknownEntry entry = (SilcUnknownEntry)sock->user_data;
1296   void *id_entry = NULL;
1297
1298   SILC_LOG_DEBUG(("Start"));
1299
1300   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
1301       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
1302     /* Error occured during protocol */
1303     silc_protocol_free(protocol);
1304     sock->protocol = NULL;
1305     if (ctx->packet)
1306       silc_packet_context_free(ctx->packet);
1307     if (ctx->ske)
1308       silc_ske_free(ctx->ske);
1309     silc_free(ctx->dest_id);
1310     silc_free(ctx);
1311     silc_schedule_task_del_by_callback(server->schedule,
1312                                        silc_server_failure_callback);
1313     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1314                                   "Authentication failed");
1315     server->stat.auth_failures++;
1316     return;
1317   }
1318
1319   entry->data.last_receive = time(NULL);
1320
1321   switch (ctx->conn_type) {
1322   case SILC_SOCKET_TYPE_CLIENT:
1323     {
1324       SilcClientEntry client;
1325
1326       SILC_LOG_DEBUG(("Remote host is client"));
1327       SILC_LOG_INFO(("Connection from %s (%s) is client", sock->hostname,
1328                      sock->ip));
1329
1330       /* Add the client to the client ID cache. The nickname and Client ID
1331          and other information is created after we have received NEW_CLIENT
1332          packet from client. */
1333       client = silc_idlist_add_client(server->local_list, 
1334                                       NULL, NULL, NULL, NULL, NULL, sock, 0);
1335       if (!client) {
1336         SILC_LOG_ERROR(("Could not add new client to cache"));
1337         silc_free(sock->user_data);
1338         silc_server_disconnect_remote(server, sock, 
1339                                       "Server closed connection: "
1340                                       "Authentication failed");
1341         server->stat.auth_failures++;
1342         goto out;
1343       }
1344
1345       /* Statistics */
1346       server->stat.my_clients++;
1347       server->stat.clients++;
1348       if (server->server_type == SILC_ROUTER)
1349         server->stat.cell_clients++;
1350
1351       id_entry = (void *)client;
1352       break;
1353     }
1354   case SILC_SOCKET_TYPE_SERVER:
1355   case SILC_SOCKET_TYPE_ROUTER:
1356     {
1357       SilcServerEntry new_server;
1358       SilcServerConfigSectionServerConnection *conn = 
1359         ctx->conn_type == SILC_SOCKET_TYPE_SERVER ? 
1360         ctx->sconfig : ctx->rconfig;
1361
1362       SILC_LOG_DEBUG(("Remote host is %s", 
1363                       ctx->conn_type == SILC_SOCKET_TYPE_SERVER ? 
1364                       "server" : (conn->backup_router ? 
1365                                   "backup router" : "router")));
1366       SILC_LOG_INFO(("Connection from %s (%s) is %s", sock->hostname,
1367                      sock->ip, ctx->conn_type == SILC_SOCKET_TYPE_SERVER ? 
1368                      "server" : (conn->backup_router ? 
1369                                  "backup router" : "router")));
1370
1371       /* Add the server into server cache. The server name and Server ID
1372          is updated after we have received NEW_SERVER packet from the
1373          server. We mark ourselves as router for this server if we really
1374          are router. */
1375       new_server = 
1376         silc_idlist_add_server((ctx->conn_type == SILC_SOCKET_TYPE_SERVER ?
1377                                 server->local_list : (conn->backup_router ?
1378                                                       server->local_list :
1379                                                       server->global_list)),
1380                                NULL,
1381                                (ctx->conn_type == SILC_SOCKET_TYPE_SERVER ?
1382                                 SILC_SERVER : SILC_ROUTER), 
1383                                NULL, 
1384                                (ctx->conn_type == SILC_SOCKET_TYPE_SERVER ?
1385                                 server->id_entry : (conn->backup_router ? 
1386                                                     server->id_entry : NULL)),
1387                                sock);
1388       if (!new_server) {
1389         SILC_LOG_ERROR(("Could not add new server to cache"));
1390         silc_free(sock->user_data);
1391         silc_server_disconnect_remote(server, sock, 
1392                                       "Server closed connection: "
1393                                       "Authentication failed");
1394         server->stat.auth_failures++;
1395         goto out;
1396       }
1397
1398       /* Statistics */
1399       if (ctx->conn_type == SILC_SOCKET_TYPE_SERVER)
1400         server->stat.my_servers++;
1401       else
1402         server->stat.my_routers++;
1403       server->stat.servers++;
1404
1405       id_entry = (void *)new_server;
1406
1407       /* If the incoming connection is router and marked as backup router
1408          then add it to be one of our backups */
1409       if (ctx->conn_type == SILC_SOCKET_TYPE_ROUTER && conn->backup_router) {
1410         silc_server_backup_add(server, new_server, conn->backup_replace_ip,
1411                                conn->backup_replace_port, conn->backup_local);
1412
1413         /* Change it back to SERVER type since that's what it really is. */
1414         if (conn->backup_local)
1415           ctx->conn_type = SILC_SOCKET_TYPE_SERVER;
1416
1417         new_server->server_type = SILC_BACKUP_ROUTER;
1418       }
1419
1420       /* Check whether this connection is to be our primary router connection
1421          if we do not already have the primary route. */
1422       if (server->standalone && ctx->conn_type == SILC_SOCKET_TYPE_ROUTER) {
1423         if (silc_server_config_is_primary_route(server->config) &&
1424             !conn->initiator)
1425           break;
1426
1427         SILC_LOG_DEBUG(("We are not standalone server anymore"));
1428         server->standalone = FALSE;
1429         if (!server->id_entry->router) {
1430           server->id_entry->router = id_entry;
1431           server->router = id_entry;
1432         }
1433       }
1434
1435       break;
1436     }
1437   default:
1438     break;
1439   }
1440
1441   sock->type = ctx->conn_type;
1442
1443   /* Add the common data structure to the ID entry. */
1444   if (id_entry)
1445     silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
1446       
1447   /* Add to sockets internal pointer for fast referencing */
1448   silc_free(sock->user_data);
1449   sock->user_data = id_entry;
1450
1451   /* Connection has been fully established now. Everything is ok. */
1452   SILC_LOG_DEBUG(("New connection authenticated"));
1453
1454   /* Perform keepalive. The `hb_context' will be freed automatically
1455      when finally calling the silc_socket_free function. XXX hardcoded 
1456      timeout!! */
1457   hb_context = silc_calloc(1, sizeof(*hb_context));
1458   hb_context->server = server;
1459   silc_socket_set_heartbeat(sock, 600, hb_context,
1460                             silc_server_perform_heartbeat,
1461                             server->schedule);
1462
1463  out:
1464   silc_schedule_task_del_by_callback(server->schedule,
1465                                      silc_server_failure_callback);
1466   silc_protocol_free(protocol);
1467   if (ctx->packet)
1468     silc_packet_context_free(ctx->packet);
1469   if (ctx->ske)
1470     silc_ske_free(ctx->ske);
1471   silc_free(ctx->dest_id);
1472   silc_free(ctx);
1473   sock->protocol = NULL;
1474 }
1475
1476 /* This function is used to read packets from network and send packets to
1477    network. This is usually a generic task. */
1478
1479 SILC_TASK_CALLBACK(silc_server_packet_process)
1480 {
1481   SilcServer server = (SilcServer)context;
1482   SilcSocketConnection sock = server->sockets[fd];
1483   SilcIDListData idata;
1484   SilcCipher cipher = NULL;
1485   SilcHmac hmac = NULL;
1486   uint32 sequence = 0;
1487   int ret;
1488
1489   if (!sock)
1490     return;
1491
1492   SILC_LOG_DEBUG(("Processing packet"));
1493
1494   /* Packet sending */
1495
1496   if (type == SILC_TASK_WRITE) {
1497     /* Do not send data to disconnected connection */
1498     if (SILC_IS_DISCONNECTED(sock))
1499       return;
1500
1501     server->stat.packets_sent++;
1502
1503     if (sock->outbuf->data - sock->outbuf->head)
1504      silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
1505
1506     /* Send the packet */
1507     ret = silc_packet_send(sock, TRUE);
1508
1509     /* If returned -2 could not write to connection now, will do
1510        it later. */
1511     if (ret == -2)
1512       return;
1513
1514     if (ret == -1) {
1515       SILC_LOG_ERROR(("Error sending packet to connection "
1516                       "%s:%d [%s]", sock->hostname, sock->port,  
1517                       (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
1518                        sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
1519                        sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
1520                        "Router")));
1521       return;
1522     }
1523     
1524     /* The packet has been sent and now it is time to set the connection
1525        back to only for input. When there is again some outgoing data 
1526        available for this connection it will be set for output as well. 
1527        This call clears the output setting and sets it only for input. */
1528     SILC_SET_CONNECTION_FOR_INPUT(server->schedule, fd);
1529     SILC_UNSET_OUTBUF_PENDING(sock);
1530
1531     silc_buffer_clear(sock->outbuf);
1532     return;
1533   }
1534
1535   /* Packet receiving */
1536
1537   /* Read some data from connection */
1538   ret = silc_packet_receive(sock);
1539   if (ret < 0) {
1540
1541     if (ret == -1)
1542       SILC_LOG_ERROR(("Error receiving packet from connection "
1543                       "%s:%d [%s] %s", sock->hostname, sock->port,  
1544                       (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
1545                        sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
1546                        sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
1547                        "Router"), strerror(errno)));
1548     return;
1549   }    
1550
1551   /* EOF */
1552   if (ret == 0) {
1553     SILC_LOG_DEBUG(("Read EOF"));
1554       
1555     /* If connection is disconnecting already we will finally
1556        close the connection */
1557     if (SILC_IS_DISCONNECTING(sock)) {
1558       if (sock->user_data)
1559         silc_server_free_sock_user_data(server, sock, NULL);
1560       silc_server_close_connection(server, sock);
1561       return;
1562     }
1563       
1564     SILC_LOG_DEBUG(("Premature EOF from connection %d", sock->sock));
1565     SILC_SET_DISCONNECTING(sock);
1566
1567     if (sock->user_data) {
1568       char tmp[128];
1569       if (silc_socket_get_error(sock, tmp, sizeof(tmp) - 1))
1570         silc_server_free_sock_user_data(server, sock, tmp);
1571       else
1572         silc_server_free_sock_user_data(server, sock, NULL);
1573     } else if (server->router_conn && server->router_conn->sock == sock &&
1574              !server->router && server->standalone)
1575       silc_schedule_task_add(server->schedule, 0, 
1576                              silc_server_connect_to_router, 
1577                              server, 1, 0,
1578                              SILC_TASK_TIMEOUT,
1579                              SILC_TASK_PRI_NORMAL);
1580
1581     silc_server_close_connection(server, sock);
1582     return;
1583   }
1584
1585   /* If connection is disconnecting or disconnected we will ignore
1586      what we read. */
1587   if (SILC_IS_DISCONNECTING(sock) || SILC_IS_DISCONNECTED(sock)) {
1588     SILC_LOG_DEBUG(("Ignoring read data from disonnected connection"));
1589     return;
1590   }
1591
1592   server->stat.packets_received++;
1593
1594   /* Get keys and stuff from ID entry */
1595   idata = (SilcIDListData)sock->user_data;
1596   if (idata) {
1597     cipher = idata->receive_key;
1598     hmac = idata->hmac_receive;
1599     sequence = idata->psn_receive;
1600   }
1601  
1602   /* Process the packet. This will call the parser that will then
1603      decrypt and parse the packet. */
1604   ret = silc_packet_receive_process(sock, server->server_type == SILC_ROUTER ? 
1605                                     TRUE : FALSE, cipher, hmac, sequence, 
1606                                     silc_server_packet_parse, server);
1607
1608   /* If this socket connection is not authenticated yet and the packet
1609      processing failed we will drop the connection since it can be
1610      a malicious flooder. */
1611   if (sock->type == SILC_SOCKET_TYPE_UNKNOWN && ret == FALSE &&
1612       (!sock->protocol || sock->protocol->protocol->type ==
1613        SILC_PROTOCOL_SERVER_KEY_EXCHANGE)) {
1614     SILC_LOG_DEBUG(("Bad data sent from unknown connection %d", sock->sock));
1615     SILC_SET_DISCONNECTING(sock);
1616
1617     if (sock->user_data)
1618       silc_server_free_sock_user_data(server, sock, NULL);
1619     silc_server_close_connection(server, sock);
1620   }
1621 }
1622   
1623 /* Parses whole packet, received earlier. */
1624
1625 SILC_TASK_CALLBACK(silc_server_packet_parse_real)
1626 {
1627   SilcPacketParserContext *parse_ctx = (SilcPacketParserContext *)context;
1628   SilcServer server = (SilcServer)parse_ctx->context;
1629   SilcSocketConnection sock = parse_ctx->sock;
1630   SilcPacketContext *packet = parse_ctx->packet;
1631   SilcIDListData idata = (SilcIDListData)sock->user_data;
1632   int ret;
1633
1634   SILC_LOG_DEBUG(("Start"));
1635
1636   /* Parse the packet */
1637   if (parse_ctx->normal)
1638     ret = silc_packet_parse(packet, idata ? idata->receive_key : NULL);
1639   else
1640     ret = silc_packet_parse_special(packet, idata ? idata->receive_key : NULL);
1641
1642   /* If entry is disabled ignore what we got. */
1643   if (ret != SILC_PACKET_RESUME_ROUTER &&
1644       idata && idata->status & SILC_IDLIST_STATUS_DISABLED) {
1645     SILC_LOG_DEBUG(("Connection is disabled"));
1646     goto out;
1647   }
1648
1649   if (ret == SILC_PACKET_NONE)
1650     goto out;
1651
1652   /* Check that the the current client ID is same as in the client's packet. */
1653   if (sock->type == SILC_SOCKET_TYPE_CLIENT) {
1654     SilcClientEntry client = (SilcClientEntry)sock->user_data;
1655     if (client && client->id) {
1656       void *id = silc_id_str2id(packet->src_id, packet->src_id_len,
1657                                 packet->src_id_type);
1658       if (!id || !SILC_ID_CLIENT_COMPARE(client->id, id)) {
1659         silc_free(id);
1660         goto out;
1661       }
1662       silc_free(id);
1663     }
1664   }
1665
1666   if (server->server_type == SILC_ROUTER) {
1667     /* Route the packet if it is not destined to us. Other ID types but
1668        server are handled separately after processing them. */
1669     if (!(packet->flags & SILC_PACKET_FLAG_BROADCAST) &&
1670         packet->dst_id_type == SILC_ID_SERVER && 
1671         sock->type != SILC_SOCKET_TYPE_CLIENT &&
1672         memcmp(packet->dst_id, server->id_string, server->id_string_len)) {
1673       
1674       /* Route the packet to fastest route for the destination ID */
1675       void *id = silc_id_str2id(packet->dst_id, packet->dst_id_len, 
1676                                 packet->dst_id_type);
1677       if (!id)
1678         goto out;
1679       silc_server_packet_route(server,
1680                                silc_server_route_get(server, id,
1681                                                      packet->dst_id_type),
1682                                packet);
1683       silc_free(id);
1684       goto out;
1685     }
1686   }
1687
1688   /* Parse the incoming packet type */
1689   silc_server_packet_parse_type(server, sock, packet);
1690
1691   if (server->server_type == SILC_ROUTER) {
1692     /* Broadcast packet if it is marked as broadcast packet and it is
1693        originated from router and we are router. */
1694     if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
1695         packet->flags & SILC_PACKET_FLAG_BROADCAST &&
1696         !server->standalone) {
1697       /* Broadcast to our primary route */
1698       silc_server_packet_broadcast(server, server->router->connection, packet);
1699
1700       /* If we have backup routers then we need to feed all broadcast
1701          data to those servers. */
1702       silc_server_backup_broadcast(server, sock, packet);
1703     }
1704   }
1705
1706  out:
1707   silc_packet_context_free(packet);
1708   silc_free(parse_ctx);
1709 }
1710
1711 /* Parser callback called by silc_packet_receive_process. This merely
1712    registers timeout that will handle the actual parsing when appropriate. */
1713
1714 bool silc_server_packet_parse(SilcPacketParserContext *parser_context,
1715                               void *context)
1716 {
1717   SilcServer server = (SilcServer)context;
1718   SilcSocketConnection sock = parser_context->sock;
1719   SilcIDListData idata = (SilcIDListData)sock->user_data;
1720
1721   if (idata)
1722     idata->psn_receive = parser_context->packet->sequence + 1;
1723
1724   /* If protocol for this connection is key exchange or rekey then we'll
1725      process all packets synchronously, since there might be packets in
1726      queue that we are not able to decrypt without first processing the
1727      packets before them. */
1728   if ((parser_context->packet->type == SILC_PACKET_REKEY ||
1729        parser_context->packet->type == SILC_PACKET_REKEY_DONE) ||
1730       (sock->protocol && sock->protocol->protocol && 
1731        (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE ||
1732         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY))) {
1733     silc_server_packet_parse_real(server->schedule, 0, sock->sock,
1734                                   parser_context);
1735
1736     /* Reprocess data since we'll return FALSE here.  This is because
1737        the idata->receive_key might have become valid in the last packet
1738        and we want to call this processor with valid cipher. */
1739     if (idata)
1740       silc_packet_receive_process(sock, server->server_type == SILC_ROUTER ? 
1741                                   TRUE : FALSE, idata->receive_key, 
1742                                   idata->hmac_receive, idata->psn_receive, 
1743                                   silc_server_packet_parse, server);
1744     else
1745       silc_packet_receive_process(sock, server->server_type == SILC_ROUTER ? 
1746                                   TRUE : FALSE, NULL, NULL, 0, 
1747                                   silc_server_packet_parse, server);
1748     return FALSE;
1749   }
1750
1751   switch (sock->type) {
1752   case SILC_SOCKET_TYPE_UNKNOWN:
1753   case SILC_SOCKET_TYPE_CLIENT:
1754     /* Parse the packet with timeout */
1755     silc_schedule_task_add(server->schedule, sock->sock,
1756                            silc_server_packet_parse_real,
1757                            (void *)parser_context, 0, 100000,
1758                            SILC_TASK_TIMEOUT,
1759                            SILC_TASK_PRI_NORMAL);
1760     break;
1761   case SILC_SOCKET_TYPE_SERVER:
1762   case SILC_SOCKET_TYPE_ROUTER:
1763     /* Packets from servers are parsed immediately */
1764     silc_server_packet_parse_real(server->schedule, 0, sock->sock,
1765                                   parser_context);
1766     break;
1767   default:
1768     return TRUE;
1769   }
1770
1771   return TRUE;
1772 }
1773
1774 /* Parses the packet type and calls what ever routines the packet type
1775    requires. This is done for all incoming packets. */
1776
1777 void silc_server_packet_parse_type(SilcServer server, 
1778                                    SilcSocketConnection sock,
1779                                    SilcPacketContext *packet)
1780 {
1781   SilcPacketType type = packet->type;
1782   SilcIDListData idata = (SilcIDListData)sock->user_data;
1783
1784   SILC_LOG_DEBUG(("Parsing packet type %d", type));
1785
1786   /* Parse the packet type */
1787   switch (type) {
1788   case SILC_PACKET_DISCONNECT:
1789     SILC_LOG_DEBUG(("Disconnect packet"));
1790     if (packet->flags & SILC_PACKET_FLAG_LIST)
1791       break;
1792     break;
1793
1794   case SILC_PACKET_SUCCESS:
1795     /*
1796      * Success received for something. For now we can have only
1797      * one protocol for connection executing at once hence this
1798      * success message is for whatever protocol is executing currently.
1799      */
1800     SILC_LOG_DEBUG(("Success packet"));
1801     if (packet->flags & SILC_PACKET_FLAG_LIST)
1802       break;
1803     if (sock->protocol)
1804       silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
1805     break;
1806
1807   case SILC_PACKET_FAILURE:
1808     /*
1809      * Failure received for something. For now we can have only
1810      * one protocol for connection executing at once hence this
1811      * failure message is for whatever protocol is executing currently.
1812      */
1813     SILC_LOG_DEBUG(("Failure packet"));
1814     if (packet->flags & SILC_PACKET_FLAG_LIST)
1815       break;
1816     if (sock->protocol) {
1817       SilcServerFailureContext f;
1818       f = silc_calloc(1, sizeof(*f));
1819       f->server = server;
1820       f->sock = sock;
1821       
1822       /* We will wait 5 seconds to process this failure packet */
1823       silc_schedule_task_add(server->schedule, sock->sock,
1824                          silc_server_failure_callback, (void *)f, 5, 0,
1825                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
1826     }
1827     break;
1828
1829   case SILC_PACKET_REJECT:
1830     SILC_LOG_DEBUG(("Reject packet"));
1831     if (packet->flags & SILC_PACKET_FLAG_LIST)
1832       break;
1833     return;
1834     break;
1835
1836   case SILC_PACKET_NOTIFY:
1837     /*
1838      * Received notify packet. Server can receive notify packets from
1839      * router. Server then relays the notify messages to clients if needed.
1840      */
1841     SILC_LOG_DEBUG(("Notify packet"));
1842     if (packet->flags & SILC_PACKET_FLAG_LIST)
1843       silc_server_notify_list(server, sock, packet);
1844     else
1845       silc_server_notify(server, sock, packet);
1846     break;
1847
1848     /* 
1849      * Channel packets
1850      */
1851   case SILC_PACKET_CHANNEL_MESSAGE:
1852     /*
1853      * Received channel message. Channel messages are special packets
1854      * (although probably most common ones) thus they are handled
1855      * specially.
1856      */
1857     SILC_LOG_DEBUG(("Channel Message packet"));
1858     if (packet->flags & SILC_PACKET_FLAG_LIST)
1859       break;
1860     idata->last_receive = time(NULL);
1861     silc_server_channel_message(server, sock, packet);
1862     break;
1863
1864   case SILC_PACKET_CHANNEL_KEY:
1865     /*
1866      * Received key for channel. As channels are created by the router
1867      * the keys are as well. We will distribute the key to all of our
1868      * locally connected clients on the particular channel. Router
1869      * never receives this channel and thus is ignored.
1870      */
1871     SILC_LOG_DEBUG(("Channel Key packet"));
1872     if (packet->flags & SILC_PACKET_FLAG_LIST)
1873       break;
1874     silc_server_channel_key(server, sock, packet);
1875     break;
1876
1877     /*
1878      * Command packets
1879      */
1880   case SILC_PACKET_COMMAND:
1881     /*
1882      * Recived command. Processes the command request and allocates the
1883      * command context and calls the command.
1884      */
1885     SILC_LOG_DEBUG(("Command packet"));
1886     if (packet->flags & SILC_PACKET_FLAG_LIST)
1887       break;
1888     silc_server_command_process(server, sock, packet);
1889     break;
1890
1891   case SILC_PACKET_COMMAND_REPLY:
1892     /*
1893      * Received command reply packet. Received command reply to command. It
1894      * may be reply to command sent by us or reply to command sent by client
1895      * that we've routed further.
1896      */
1897     SILC_LOG_DEBUG(("Command Reply packet"));
1898     if (packet->flags & SILC_PACKET_FLAG_LIST)
1899       break;
1900     silc_server_command_reply(server, sock, packet);
1901     break;
1902
1903     /*
1904      * Private Message packets
1905      */
1906   case SILC_PACKET_PRIVATE_MESSAGE:
1907     /*
1908      * Received private message packet. The packet is coming from either
1909      * client or server.
1910      */
1911     SILC_LOG_DEBUG(("Private Message packet"));
1912     if (packet->flags & SILC_PACKET_FLAG_LIST)
1913       break;
1914     idata->last_receive = time(NULL);
1915     silc_server_private_message(server, sock, packet);
1916     break;
1917
1918   case SILC_PACKET_PRIVATE_MESSAGE_KEY:
1919     /*
1920      * Private message key packet.
1921      */
1922     if (packet->flags & SILC_PACKET_FLAG_LIST)
1923       break;
1924     silc_server_private_message_key(server, sock, packet);
1925     break;
1926
1927     /*
1928      * Key Exchange protocol packets
1929      */
1930   case SILC_PACKET_KEY_EXCHANGE:
1931     SILC_LOG_DEBUG(("KE packet"));
1932     if (packet->flags & SILC_PACKET_FLAG_LIST)
1933       break;
1934
1935     if (sock->protocol && sock->protocol->protocol &&
1936         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1937
1938       SilcServerKEInternalContext *proto_ctx = 
1939         (SilcServerKEInternalContext *)sock->protocol->context;
1940
1941       proto_ctx->packet = silc_packet_context_dup(packet);
1942
1943       /* Let the protocol handle the packet */
1944       silc_protocol_execute(sock->protocol, server->schedule, 0, 100000);
1945     } else {
1946       SILC_LOG_ERROR(("Received Key Exchange packet but no key exchange "
1947                       "protocol active, packet dropped."));
1948     }
1949     break;
1950
1951   case SILC_PACKET_KEY_EXCHANGE_1:
1952     SILC_LOG_DEBUG(("KE 1 packet"));
1953     if (packet->flags & SILC_PACKET_FLAG_LIST)
1954       break;
1955
1956     if (sock->protocol && sock->protocol->protocol &&
1957         (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE ||
1958          sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY)) {
1959
1960       if (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
1961         SilcServerRekeyInternalContext *proto_ctx = 
1962           (SilcServerRekeyInternalContext *)sock->protocol->context;
1963         
1964         if (proto_ctx->packet)
1965           silc_packet_context_free(proto_ctx->packet);
1966         
1967         proto_ctx->packet = silc_packet_context_dup(packet);
1968
1969         /* Let the protocol handle the packet */
1970         silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
1971       } else {
1972         SilcServerKEInternalContext *proto_ctx = 
1973           (SilcServerKEInternalContext *)sock->protocol->context;
1974         
1975         if (proto_ctx->packet)
1976           silc_packet_context_free(proto_ctx->packet);
1977         
1978         proto_ctx->packet = silc_packet_context_dup(packet);
1979         proto_ctx->dest_id_type = packet->src_id_type;
1980         proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1981                                             packet->src_id_type);
1982         if (!proto_ctx->dest_id)
1983           break;
1984
1985         /* Let the protocol handle the packet */
1986         silc_protocol_execute(sock->protocol, server->schedule, 
1987                               0, 100000);
1988       }
1989     } else {
1990       SILC_LOG_ERROR(("Received Key Exchange 1 packet but no key exchange "
1991                       "protocol active, packet dropped."));
1992     }
1993     break;
1994
1995   case SILC_PACKET_KEY_EXCHANGE_2:
1996     SILC_LOG_DEBUG(("KE 2 packet"));
1997     if (packet->flags & SILC_PACKET_FLAG_LIST)
1998       break;
1999
2000     if (sock->protocol && sock->protocol->protocol &&
2001         (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE ||
2002          sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY)) {
2003
2004       if (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
2005         SilcServerRekeyInternalContext *proto_ctx = 
2006           (SilcServerRekeyInternalContext *)sock->protocol->context;
2007         
2008         if (proto_ctx->packet)
2009           silc_packet_context_free(proto_ctx->packet);
2010         
2011         proto_ctx->packet = silc_packet_context_dup(packet);
2012
2013         /* Let the protocol handle the packet */
2014         silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
2015       } else {
2016         SilcServerKEInternalContext *proto_ctx = 
2017           (SilcServerKEInternalContext *)sock->protocol->context;
2018         
2019         if (proto_ctx->packet)
2020           silc_packet_context_free(proto_ctx->packet);
2021         
2022         proto_ctx->packet = silc_packet_context_dup(packet);
2023         proto_ctx->dest_id_type = packet->src_id_type;
2024         proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
2025                                             packet->src_id_type);
2026         if (!proto_ctx->dest_id)
2027           break;
2028
2029         /* Let the protocol handle the packet */
2030         silc_protocol_execute(sock->protocol, server->schedule, 
2031                               0, 100000);
2032       }
2033     } else {
2034       SILC_LOG_ERROR(("Received Key Exchange 2 packet but no key exchange "
2035                       "protocol active, packet dropped."));
2036     }
2037     break;
2038
2039   case SILC_PACKET_CONNECTION_AUTH_REQUEST:
2040     /*
2041      * Connection authentication request packet. When we receive this packet
2042      * we will send to the other end information about our mandatory
2043      * authentication method for the connection. This packet maybe received
2044      * at any time. 
2045      */
2046     SILC_LOG_DEBUG(("Connection authentication request packet"));
2047     if (packet->flags & SILC_PACKET_FLAG_LIST)
2048       break;
2049     silc_server_connection_auth_request(server, sock, packet);
2050     break;
2051
2052     /*
2053      * Connection Authentication protocol packets
2054      */
2055   case SILC_PACKET_CONNECTION_AUTH:
2056     /* Start of the authentication protocol. We receive here the 
2057        authentication data and will verify it. */
2058     SILC_LOG_DEBUG(("Connection auth packet"));
2059     if (packet->flags & SILC_PACKET_FLAG_LIST)
2060       break;
2061
2062     if (sock->protocol && sock->protocol->protocol->type 
2063         == SILC_PROTOCOL_SERVER_CONNECTION_AUTH) {
2064
2065       SilcServerConnAuthInternalContext *proto_ctx = 
2066         (SilcServerConnAuthInternalContext *)sock->protocol->context;
2067
2068       proto_ctx->packet = silc_packet_context_dup(packet);
2069
2070       /* Let the protocol handle the packet */
2071       silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
2072     } else {
2073       SILC_LOG_ERROR(("Received Connection Auth packet but no authentication "
2074                       "protocol active, packet dropped."));
2075     }
2076     break;
2077
2078   case SILC_PACKET_NEW_ID:
2079     /*
2080      * Received New ID packet. This includes some new ID that has been
2081      * created. It may be for client, server or channel. This is the way
2082      * to distribute information about new registered entities in the
2083      * SILC network.
2084      */
2085     SILC_LOG_DEBUG(("New ID packet"));
2086     if (packet->flags & SILC_PACKET_FLAG_LIST)
2087       silc_server_new_id_list(server, sock, packet);
2088     else
2089       silc_server_new_id(server, sock, packet);
2090     break;
2091
2092   case SILC_PACKET_NEW_CLIENT:
2093     /*
2094      * Received new client packet. This includes client information that
2095      * we will use to create initial client ID. After creating new
2096      * ID we will send it to the client.
2097      */
2098     SILC_LOG_DEBUG(("New Client packet"));
2099     if (packet->flags & SILC_PACKET_FLAG_LIST)
2100       break;
2101     silc_server_new_client(server, sock, packet);
2102     break;
2103
2104   case SILC_PACKET_NEW_SERVER:
2105     /*
2106      * Received new server packet. This includes Server ID and some other
2107      * information that we may save. This is received after server has 
2108      * connected to us.
2109      */
2110     SILC_LOG_DEBUG(("New Server packet"));
2111     if (packet->flags & SILC_PACKET_FLAG_LIST)
2112       break;
2113     silc_server_new_server(server, sock, packet);
2114     break;
2115
2116   case SILC_PACKET_NEW_CHANNEL:
2117     /*
2118      * Received new channel packet. Information about new channel in the
2119      * network are distributed using this packet.
2120      */
2121     SILC_LOG_DEBUG(("New Channel packet"));
2122     if (packet->flags & SILC_PACKET_FLAG_LIST)
2123       silc_server_new_channel_list(server, sock, packet);
2124     else
2125       silc_server_new_channel(server, sock, packet);
2126     break;
2127
2128   case SILC_PACKET_HEARTBEAT:
2129     /*
2130      * Received heartbeat.
2131      */
2132     SILC_LOG_DEBUG(("Heartbeat packet"));
2133     if (packet->flags & SILC_PACKET_FLAG_LIST)
2134       break;
2135     break;
2136
2137   case SILC_PACKET_KEY_AGREEMENT:
2138     /*
2139      * Received heartbeat.
2140      */
2141     SILC_LOG_DEBUG(("Key agreement packet"));
2142     if (packet->flags & SILC_PACKET_FLAG_LIST)
2143       break;
2144     silc_server_key_agreement(server, sock, packet);
2145     break;
2146
2147   case SILC_PACKET_REKEY:
2148     /*
2149      * Received re-key packet. The sender wants to regenerate the session
2150      * keys.
2151      */
2152     SILC_LOG_DEBUG(("Re-key packet"));
2153     if (packet->flags & SILC_PACKET_FLAG_LIST)
2154       break;
2155     silc_server_rekey(server, sock, packet);
2156     break;
2157
2158   case SILC_PACKET_REKEY_DONE:
2159     /*
2160      * The re-key is done.
2161      */
2162     SILC_LOG_DEBUG(("Re-key done packet"));
2163     if (packet->flags & SILC_PACKET_FLAG_LIST)
2164       break;
2165
2166     if (sock->protocol && sock->protocol->protocol &&
2167         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
2168
2169       SilcServerRekeyInternalContext *proto_ctx = 
2170         (SilcServerRekeyInternalContext *)sock->protocol->context;
2171
2172       if (proto_ctx->packet)
2173         silc_packet_context_free(proto_ctx->packet);
2174
2175       proto_ctx->packet = silc_packet_context_dup(packet);
2176
2177       /* Let the protocol handle the packet */
2178       silc_protocol_execute(sock->protocol, server->schedule, 0, 0);
2179     } else {
2180       SILC_LOG_ERROR(("Received Re-key done packet but no re-key "
2181                       "protocol active, packet dropped."));
2182     }
2183     break;
2184
2185   case SILC_PACKET_FTP:
2186     /* FTP packet */
2187     SILC_LOG_DEBUG(("FTP packet"));
2188     if (packet->flags & SILC_PACKET_FLAG_LIST)
2189       break;
2190     silc_server_ftp(server, sock, packet);
2191     break;
2192
2193   case SILC_PACKET_RESUME_ROUTER:
2194     /* Resume router packet received. This packet is received for backup
2195        router resuming protocol. */
2196     SILC_LOG_DEBUG(("Resume router packet"));
2197     if (packet->flags & SILC_PACKET_FLAG_LIST)
2198       break;
2199     silc_server_backup_resume_router(server, sock, packet);
2200     break;
2201
2202   default:
2203     SILC_LOG_ERROR(("Incorrect packet type %d, packet dropped", type));
2204     break;
2205   }
2206   
2207 }
2208
2209 /* Creates connection to a remote router. */
2210
2211 void silc_server_create_connection(SilcServer server,
2212                                    char *remote_host, uint32 port)
2213 {
2214   SilcServerConnection sconn;
2215
2216   /* Allocate connection object for hold connection specific stuff. */
2217   sconn = silc_calloc(1, sizeof(*sconn));
2218   sconn->server = server;
2219   sconn->remote_host = strdup(remote_host);
2220   sconn->remote_port = port;
2221
2222   silc_schedule_task_add(server->schedule, 0, 
2223                          silc_server_connect_router,
2224                          (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
2225                          SILC_TASK_PRI_NORMAL);
2226 }
2227
2228 SILC_TASK_CALLBACK(silc_server_close_connection_final)
2229 {
2230   silc_socket_free((SilcSocketConnection)context);
2231 }
2232
2233 /* Closes connection to socket connection */
2234
2235 void silc_server_close_connection(SilcServer server,
2236                                   SilcSocketConnection sock)
2237 {
2238   if (!server->sockets[sock->sock])
2239     return;
2240
2241   SILC_LOG_INFO(("Closing connection %s:%d [%s]", sock->hostname,
2242                   sock->port,
2243                   (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
2244                    sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
2245                    sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
2246                    "Router")));
2247
2248   /* We won't listen for this connection anymore */
2249   silc_schedule_unset_listen_fd(server->schedule, sock->sock);
2250
2251   /* Unregister all tasks */
2252   silc_schedule_task_del_by_fd(server->schedule, sock->sock);
2253
2254   /* Close the actual connection */
2255   silc_net_close_connection(sock->sock);
2256   server->sockets[sock->sock] = NULL;
2257
2258   /* If sock->user_data is NULL then we'll check for active protocols
2259      here since the silc_server_free_sock_user_data has not been called
2260      for this connection. */
2261   if (!sock->user_data) {
2262     /* If any protocol is active cancel its execution. It will call
2263        the final callback which will finalize the disconnection. */
2264     if (sock->protocol) {
2265       silc_protocol_cancel(sock->protocol, server->schedule);
2266       sock->protocol->state = SILC_PROTOCOL_STATE_ERROR;
2267       silc_protocol_execute_final(sock->protocol, server->schedule);
2268       sock->protocol = NULL;
2269       return;
2270     }
2271   }
2272
2273   silc_schedule_task_add(server->schedule, 0, 
2274                          silc_server_close_connection_final,
2275                          (void *)sock, 0, 1, SILC_TASK_TIMEOUT, 
2276                          SILC_TASK_PRI_NORMAL);
2277 }
2278
2279 /* Sends disconnect message to remote connection and disconnects the 
2280    connection. */
2281
2282 void silc_server_disconnect_remote(SilcServer server,
2283                                    SilcSocketConnection sock,
2284                                    const char *fmt, ...)
2285 {
2286   va_list ap;
2287   unsigned char buf[4096];
2288
2289   if (!sock)
2290     return;
2291
2292   memset(buf, 0, sizeof(buf));
2293   va_start(ap, fmt);
2294   vsprintf(buf, fmt, ap);
2295   va_end(ap);
2296
2297   SILC_LOG_DEBUG(("Disconnecting remote host"));
2298
2299   /* Notify remote end that the conversation is over. The notify message
2300      is tried to be sent immediately. */
2301   silc_server_packet_send(server, sock, SILC_PACKET_DISCONNECT, 0,  
2302                           buf, strlen(buf), TRUE);
2303
2304   /* Mark the connection to be disconnected */
2305   SILC_SET_DISCONNECTED(sock);
2306   silc_server_close_connection(server, sock);
2307 }
2308
2309 typedef struct {
2310   SilcServer server;
2311   SilcClientEntry client;
2312 } *FreeClientInternal;
2313
2314 SILC_TASK_CALLBACK(silc_server_free_client_data_timeout)
2315 {
2316   FreeClientInternal i = (FreeClientInternal)context;
2317
2318   silc_idlist_del_data(i->client);
2319   silc_idcache_purge_by_context(i->server->local_list->clients, i->client);
2320   silc_free(i);
2321 }
2322
2323 /* Frees client data and notifies about client's signoff. */
2324
2325 void silc_server_free_client_data(SilcServer server, 
2326                                   SilcSocketConnection sock,
2327                                   SilcClientEntry client, 
2328                                   int notify,
2329                                   const char *signoff)
2330 {
2331   FreeClientInternal i = silc_calloc(1, sizeof(*i));
2332
2333   /* If there is pending outgoing data for the client then purge it
2334      to the network before removing the client entry. */
2335   silc_server_packet_queue_purge(server, sock);
2336
2337   if (!client->id)
2338     return;
2339
2340   /* Send SIGNOFF notify to routers. */
2341   if (notify && !server->standalone && server->router)
2342     silc_server_send_notify_signoff(server, server->router->connection,
2343                                     server->server_type == SILC_SERVER ?
2344                                     FALSE : TRUE, client->id, signoff);
2345     
2346   /* Remove client from all channels */
2347   if (notify)
2348     silc_server_remove_from_channels(server, NULL, client, 
2349                                      TRUE, (char *)signoff, TRUE);
2350   else
2351     silc_server_remove_from_channels(server, NULL, client, 
2352                                      FALSE, NULL, FALSE);
2353     
2354   /* We will not delete the client entry right away. We will take it
2355      into history (for WHOWAS command) for 5 minutes */
2356   i->server = server;
2357   i->client = client;
2358   silc_schedule_task_add(server->schedule, 0, 
2359                          silc_server_free_client_data_timeout,
2360                          (void *)i, 300, 0,
2361                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
2362   client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
2363   client->router = NULL;
2364   client->connection = NULL;
2365
2366   /* Free the client entry and everything in it */
2367   server->stat.my_clients--;
2368   server->stat.clients--;
2369   if (server->server_type == SILC_ROUTER)
2370     server->stat.cell_clients--;
2371 }
2372
2373 /* Frees user_data pointer from socket connection object. This also sends
2374    appropriate notify packets to the network to inform about leaving
2375    entities. */
2376
2377 void silc_server_free_sock_user_data(SilcServer server, 
2378                                      SilcSocketConnection sock,
2379                                      const char *signoff_message)
2380 {
2381   SILC_LOG_DEBUG(("Start"));
2382
2383   switch (sock->type) {
2384   case SILC_SOCKET_TYPE_CLIENT:
2385     {
2386       SilcClientEntry user_data = (SilcClientEntry)sock->user_data;
2387       silc_server_free_client_data(server, sock, user_data, TRUE, 
2388                                    signoff_message);
2389       break;
2390     }
2391   case SILC_SOCKET_TYPE_SERVER:
2392   case SILC_SOCKET_TYPE_ROUTER:
2393     {
2394       SilcServerEntry user_data = (SilcServerEntry)sock->user_data;
2395       SilcServerEntry backup_router = NULL;
2396
2397       if (user_data->id)
2398         backup_router = silc_server_backup_get(server, user_data->id);
2399
2400       /* If this was our primary router connection then we're lost to
2401          the outside world. */
2402       if (server->router == user_data) {
2403         /* Check whether we have a backup router connection */
2404         if (!backup_router || backup_router == user_data) {
2405           silc_schedule_task_add(server->schedule, 0, 
2406                                  silc_server_connect_to_router, 
2407                                  server, 1, 0,
2408                                  SILC_TASK_TIMEOUT,
2409                                  SILC_TASK_PRI_NORMAL);
2410
2411           server->id_entry->router = NULL;
2412           server->router = NULL;
2413           server->standalone = TRUE;
2414           backup_router = NULL;
2415         } else {
2416           SILC_LOG_INFO(("New primary router is backup router %s",
2417                          backup_router->server_name));
2418           SILC_LOG_DEBUG(("New primary router is backup router %s",
2419                           backup_router->server_name));
2420           server->id_entry->router = backup_router;
2421           server->router = backup_router;
2422           server->router_connect = time(0);
2423           server->backup_primary = TRUE;
2424           if (server->server_type == SILC_BACKUP_ROUTER) {
2425             server->server_type = SILC_ROUTER;
2426
2427             /* We'll need to constantly try to reconnect to the primary
2428                router so that we'll see when it comes back online. */
2429             silc_server_backup_reconnect(server, sock->ip, sock->port,
2430                                          silc_server_backup_connected,
2431                                          NULL);
2432           }
2433
2434           /* Mark this connection as replaced */
2435           silc_server_backup_replaced_add(server, user_data->id, 
2436                                           backup_router);
2437         }
2438       } else if (backup_router) {
2439         SILC_LOG_INFO(("Enabling the use of backup router %s",
2440                        backup_router->server_name));
2441         SILC_LOG_DEBUG(("Enabling the use of backup router %s",
2442                         backup_router->server_name));
2443
2444         /* Mark this connection as replaced */
2445         silc_server_backup_replaced_add(server, user_data->id, 
2446                                         backup_router);
2447       }
2448
2449       if (!backup_router) {
2450         /* Free all client entries that this server owns as they will
2451            become invalid now as well. */
2452         if (user_data->id)
2453           silc_server_remove_clients_by_server(server, user_data, TRUE);
2454         if (server->server_type == SILC_SERVER)
2455           silc_server_remove_channels_by_server(server, user_data);
2456       } else {
2457         /* Update the client entries of this server to the new backup
2458            router. This also removes the clients that *really* was owned
2459            by the primary router and went down with the router.  */
2460         silc_server_update_clients_by_server(server, user_data, backup_router,
2461                                              TRUE, TRUE);
2462         silc_server_update_servers_by_server(server, user_data, backup_router);
2463         if (server->server_type == SILC_SERVER)
2464           silc_server_update_channels_by_server(server, user_data, 
2465                                                 backup_router);
2466       }
2467
2468       /* Free the server entry */
2469       silc_server_backup_del(server, user_data);
2470       silc_server_backup_replaced_del(server, user_data);
2471       silc_idlist_del_data(user_data);
2472       if (!silc_idlist_del_server(server->local_list, user_data))
2473         silc_idlist_del_server(server->global_list, user_data);
2474       server->stat.my_servers--;
2475       server->stat.servers--;
2476       if (server->server_type == SILC_ROUTER)
2477         server->stat.cell_servers--;
2478
2479       if (backup_router) {
2480         /* Announce all of our stuff that was created about 5 minutes ago.
2481            The backup router knows all the other stuff already. */
2482         if (server->server_type == SILC_ROUTER)
2483           silc_server_announce_servers(server, FALSE, time(0) - 300,
2484                                        backup_router->connection);
2485
2486         /* Announce our clients and channels to the router */
2487         silc_server_announce_clients(server, time(0) - 300,
2488                                      backup_router->connection);
2489         silc_server_announce_channels(server, time(0) - 300,
2490                                       backup_router->connection);
2491       }
2492       break;
2493     }
2494   default:
2495     {
2496       SilcUnknownEntry user_data = (SilcUnknownEntry)sock->user_data;
2497
2498       silc_idlist_del_data(user_data);
2499       silc_free(user_data);
2500       break;
2501     }
2502   }
2503
2504   /* If any protocol is active cancel its execution */
2505   if (sock->protocol) {
2506     silc_protocol_cancel(sock->protocol, server->schedule);
2507     sock->protocol->state = SILC_PROTOCOL_STATE_ERROR;
2508     silc_protocol_execute_final(sock->protocol, server->schedule);
2509     sock->protocol = NULL;
2510   }
2511
2512   sock->user_data = NULL;
2513 }
2514
2515 /* Removes client from all channels it has joined. This is used when client
2516    connection is disconnected. If the client on a channel is last, the
2517    channel is removed as well. This sends the SIGNOFF notify types. */
2518
2519 void silc_server_remove_from_channels(SilcServer server, 
2520                                       SilcSocketConnection sock,
2521                                       SilcClientEntry client,
2522                                       int notify,
2523                                       char *signoff_message,
2524                                       int keygen)
2525 {
2526   SilcChannelEntry channel;
2527   SilcChannelClientEntry chl;
2528   SilcHashTableList htl;
2529   SilcBuffer clidp;
2530
2531   SILC_LOG_DEBUG(("Start"));
2532
2533   if (!client || !client->id)
2534     return;
2535
2536   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2537
2538   /* Remove the client from all channels. The client is removed from
2539      the channels' user list. */
2540   silc_hash_table_list(client->channels, &htl);
2541   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
2542     channel = chl->channel;
2543
2544     /* Remove channel from client's channel list */
2545     silc_hash_table_del(client->channels, channel);
2546
2547     /* Remove channel if there is no users anymore */
2548     if (server->server_type == SILC_ROUTER &&
2549         silc_hash_table_count(channel->user_list) < 2) {
2550       if (channel->rekey)
2551         silc_schedule_task_del_by_context(server->schedule, channel->rekey);
2552       if (silc_idlist_del_channel(server->local_list, channel))
2553         server->stat.my_channels--;
2554       else 
2555         silc_idlist_del_channel(server->global_list, channel);
2556       continue;
2557     }
2558
2559     /* Remove client from channel's client list */
2560     silc_hash_table_del(channel->user_list, chl->client);
2561
2562     /* If there is no global users on the channel anymore mark the channel
2563        as local channel. Do not check if the removed client is local client. */
2564     if (server->server_type != SILC_ROUTER && channel->global_users && 
2565         chl->client->router && !silc_server_channel_has_global(channel))
2566       channel->global_users = FALSE;
2567
2568     silc_free(chl);
2569     server->stat.my_chanclients--;
2570
2571     /* If there is not at least one local user on the channel then we don't
2572        need the channel entry anymore, we can remove it safely. */
2573     if (server->server_type != SILC_ROUTER &&
2574         !silc_server_channel_has_local(channel)) {
2575       /* Notify about leaving client if this channel has global users. */
2576       if (notify && channel->global_users)
2577         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2578                                            SILC_NOTIFY_TYPE_SIGNOFF, 
2579                                            signoff_message ? 2 : 1,
2580                                            clidp->data, clidp->len,
2581                                            signoff_message, signoff_message ?
2582                                            strlen(signoff_message) : 0);
2583
2584       if (channel->rekey)
2585         silc_schedule_task_del_by_context(server->schedule, channel->rekey);
2586
2587       if (channel->founder_key) {
2588         /* The founder auth data exists, do not remove the channel entry */
2589         SilcChannelClientEntry chl2;
2590         SilcHashTableList htl2;
2591
2592         channel->disabled = TRUE;
2593
2594         silc_hash_table_list(channel->user_list, &htl2);
2595         while (silc_hash_table_get(&htl2, NULL, (void *)&chl2)) {
2596           silc_hash_table_del(chl2->client->channels, channel);
2597           silc_hash_table_del(channel->user_list, chl2->client);
2598           silc_free(chl2);
2599         }
2600         continue;
2601       }
2602
2603       /* Remove the channel entry */
2604       if (silc_idlist_del_channel(server->local_list, channel))
2605         server->stat.my_channels--;
2606       else 
2607         silc_idlist_del_channel(server->global_list, channel);
2608       continue;
2609     }
2610
2611     /* Send notify to channel about client leaving SILC and thus
2612        the entire channel. */
2613     if (notify)
2614       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2615                                          SILC_NOTIFY_TYPE_SIGNOFF, 
2616                                          signoff_message ? 2 : 1,
2617                                          clidp->data, clidp->len,
2618                                          signoff_message, signoff_message ?
2619                                          strlen(signoff_message) : 0);
2620
2621     if (keygen && !(channel->mode & SILC_CHANNEL_MODE_PRIVKEY)) {
2622       /* Re-generate channel key */
2623       if (!silc_server_create_channel_key(server, channel, 0))
2624         return;
2625       
2626       /* Send the channel key to the channel. The key of course is not sent
2627          to the client who was removed from the channel. */
2628       silc_server_send_channel_key(server, client->connection, channel, 
2629                                    server->server_type == SILC_ROUTER ? 
2630                                    FALSE : !server->standalone);
2631     }
2632   }
2633
2634   silc_buffer_free(clidp);
2635 }
2636
2637 /* Removes client from one channel. This is used for example when client
2638    calls LEAVE command to remove itself from the channel. Returns TRUE
2639    if channel still exists and FALSE if the channel is removed when
2640    last client leaves the channel. If `notify' is FALSE notify messages
2641    are not sent. */
2642
2643 int silc_server_remove_from_one_channel(SilcServer server, 
2644                                         SilcSocketConnection sock,
2645                                         SilcChannelEntry channel,
2646                                         SilcClientEntry client,
2647                                         int notify)
2648 {
2649   SilcChannelClientEntry chl;
2650   SilcBuffer clidp;
2651
2652   SILC_LOG_DEBUG(("Start"));
2653
2654   /* Get the entry to the channel, if this client is not on the channel
2655      then return Ok. */
2656   if (!silc_hash_table_find(client->channels, channel, NULL, (void *)&chl))
2657     return TRUE;
2658
2659   /* Remove the client from the channel. The client is removed from
2660      the channel's user list. */
2661
2662   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2663
2664   /* Remove channel from client's channel list */
2665   silc_hash_table_del(client->channels, chl->channel);
2666
2667   /* Remove channel if there is no users anymore */
2668   if (server->server_type == SILC_ROUTER &&
2669       silc_hash_table_count(channel->user_list) < 2) {
2670     if (channel->rekey)
2671       silc_schedule_task_del_by_context(server->schedule, channel->rekey);
2672     if (silc_idlist_del_channel(server->local_list, channel))
2673       server->stat.my_channels--;
2674     else 
2675       silc_idlist_del_channel(server->global_list, channel);
2676     silc_buffer_free(clidp);
2677     return FALSE;
2678   }
2679
2680   /* Remove client from channel's client list */
2681   silc_hash_table_del(channel->user_list, chl->client);
2682   
2683   /* If there is no global users on the channel anymore mark the channel
2684      as local channel. Do not check if the client is local client. */
2685   if (server->server_type != SILC_ROUTER && channel->global_users &&
2686       chl->client->router && !silc_server_channel_has_global(channel))
2687     channel->global_users = FALSE;
2688
2689   silc_free(chl);
2690   server->stat.my_chanclients--;
2691
2692   /* If there is not at least one local user on the channel then we don't
2693      need the channel entry anymore, we can remove it safely. */
2694   if (server->server_type != SILC_ROUTER &&
2695       !silc_server_channel_has_local(channel)) {
2696     /* Notify about leaving client if this channel has global users. */
2697     if (notify && channel->global_users)
2698       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2699                                          SILC_NOTIFY_TYPE_LEAVE, 1,
2700                                          clidp->data, clidp->len);
2701     
2702     silc_buffer_free(clidp);
2703     
2704     if (channel->rekey)
2705       silc_schedule_task_del_by_context(server->schedule, channel->rekey);
2706
2707     if (channel->founder_key) {
2708       /* The founder auth data exists, do not remove the channel entry */
2709       SilcChannelClientEntry chl2;
2710       SilcHashTableList htl2;
2711       
2712       channel->disabled = TRUE;
2713       
2714       silc_hash_table_list(channel->user_list, &htl2);
2715       while (silc_hash_table_get(&htl2, NULL, (void *)&chl2)) {
2716         silc_hash_table_del(chl2->client->channels, channel);
2717         silc_hash_table_del(channel->user_list, chl2->client);
2718         silc_free(chl2);
2719       }
2720       return FALSE;
2721     }
2722
2723     /* Remove the channel entry */
2724     if (silc_idlist_del_channel(server->local_list, channel))
2725       server->stat.my_channels--;
2726     else 
2727       silc_idlist_del_channel(server->global_list, channel);
2728     return FALSE;
2729   }
2730
2731   /* Send notify to channel about client leaving the channel */
2732   if (notify)
2733     silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2734                                        SILC_NOTIFY_TYPE_LEAVE, 1,
2735                                        clidp->data, clidp->len);
2736
2737   silc_buffer_free(clidp);
2738   return TRUE;
2739 }
2740
2741 /* Timeout callback. This is called if connection is idle or for some
2742    other reason is not responding within some period of time. This 
2743    disconnects the remote end. */
2744
2745 SILC_TASK_CALLBACK(silc_server_timeout_remote)
2746 {
2747   SilcServer server = (SilcServer)context;
2748   SilcSocketConnection sock = server->sockets[fd];
2749
2750   SILC_LOG_DEBUG(("Start"));
2751
2752   if (!sock)
2753     return;
2754
2755   /* If we have protocol active we must assure that we call the protocol's
2756      final callback so that all the memory is freed. */
2757   if (sock->protocol) {
2758     silc_protocol_cancel(sock->protocol, server->schedule);
2759     sock->protocol->state = SILC_PROTOCOL_STATE_ERROR;
2760     silc_protocol_execute_final(sock->protocol, server->schedule);
2761     sock->protocol = NULL;
2762     return;
2763   }
2764
2765   if (sock->user_data)
2766     silc_server_free_sock_user_data(server, sock, NULL);
2767
2768   silc_server_disconnect_remote(server, sock, "Server closed connection: "
2769                                 "Connection timeout");
2770 }
2771
2772 /* Creates new channel. Sends NEW_CHANNEL packet to primary route. This
2773    function may be used only by router. In real SILC network all channels
2774    are created by routers thus this function is never used by normal
2775    server. */
2776
2777 SilcChannelEntry silc_server_create_new_channel(SilcServer server, 
2778                                                 SilcServerID *router_id,
2779                                                 char *cipher, 
2780                                                 char *hmac,
2781                                                 char *channel_name,
2782                                                 int broadcast)
2783 {
2784   SilcChannelID *channel_id;
2785   SilcChannelEntry entry;
2786   SilcCipher key;
2787   SilcHmac newhmac;
2788
2789   SILC_LOG_DEBUG(("Creating new channel"));
2790
2791   if (!cipher)
2792     cipher = SILC_DEFAULT_CIPHER;
2793   if (!hmac)
2794     hmac = SILC_DEFAULT_HMAC;
2795
2796   /* Allocate cipher */
2797   if (!silc_cipher_alloc(cipher, &key))
2798     return NULL;
2799
2800   /* Allocate hmac */
2801   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2802     silc_cipher_free(key);
2803     return NULL;
2804   }
2805
2806   channel_name = strdup(channel_name);
2807
2808   /* Create the channel */
2809   if (!silc_id_create_channel_id(server, router_id, server->rng, 
2810                                  &channel_id)) {
2811     silc_free(channel_name);
2812     silc_cipher_free(key);
2813     silc_hmac_free(newhmac);
2814     return NULL;
2815   }
2816   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2817                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2818                                   NULL, key, newhmac, 0);
2819   if (!entry) {
2820     silc_free(channel_name);
2821     silc_cipher_free(key);
2822     silc_hmac_free(newhmac);
2823     return NULL;
2824   }
2825
2826   entry->cipher = strdup(cipher);
2827   entry->hmac_name = strdup(hmac);
2828
2829   /* Now create the actual key material */
2830   if (!silc_server_create_channel_key(server, entry, 
2831                                       silc_cipher_get_key_len(key) / 8)) {
2832     silc_free(channel_name);
2833     silc_cipher_free(key);
2834     silc_hmac_free(newhmac);
2835     silc_free(entry->cipher);
2836     silc_free(entry->hmac_name);
2837     return NULL;
2838   }
2839
2840   /* Notify other routers about the new channel. We send the packet
2841      to our primary route. */
2842   if (broadcast && server->standalone == FALSE)
2843     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2844                                  channel_name, entry->id, 
2845                                  silc_id_get_len(entry->id, SILC_ID_CHANNEL),
2846                                  entry->mode);
2847
2848   server->stat.my_channels++;
2849
2850   return entry;
2851 }
2852
2853 /* Same as above but creates the channel with Channel ID `channel_id. */
2854
2855 SilcChannelEntry 
2856 silc_server_create_new_channel_with_id(SilcServer server, 
2857                                        char *cipher, 
2858                                        char *hmac,
2859                                        char *channel_name,
2860                                        SilcChannelID *channel_id,
2861                                        int broadcast)
2862 {
2863   SilcChannelEntry entry;
2864   SilcCipher key;
2865   SilcHmac newhmac;
2866
2867   SILC_LOG_DEBUG(("Creating new channel"));
2868
2869   if (!cipher)
2870     cipher = SILC_DEFAULT_CIPHER;
2871   if (!hmac)
2872     hmac = SILC_DEFAULT_HMAC;
2873
2874   /* Allocate cipher */
2875   if (!silc_cipher_alloc(cipher, &key))
2876     return NULL;
2877
2878   /* Allocate hmac */
2879   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2880     silc_cipher_free(key);
2881     return NULL;
2882   }
2883
2884   channel_name = strdup(channel_name);
2885
2886   /* Create the channel */
2887   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2888                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2889                                   NULL, key, newhmac, 0);
2890   if (!entry) {
2891     silc_free(channel_name);
2892     return NULL;
2893   }
2894
2895   /* Now create the actual key material */
2896   if (!silc_server_create_channel_key(server, entry, 
2897                                       silc_cipher_get_key_len(key) / 8)) {
2898     silc_free(channel_name);
2899     return NULL;
2900   }
2901
2902   /* Notify other routers about the new channel. We send the packet
2903      to our primary route. */
2904   if (broadcast && server->standalone == FALSE)
2905     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2906                                  channel_name, entry->id, 
2907                                  silc_id_get_len(entry->id, SILC_ID_CHANNEL),
2908                                  entry->mode);
2909
2910   server->stat.my_channels++;
2911
2912   return entry;
2913 }
2914
2915 /* Channel's key re-key timeout callback. */
2916
2917 SILC_TASK_CALLBACK(silc_server_channel_key_rekey)
2918 {
2919   SilcServerChannelRekey rekey = (SilcServerChannelRekey)context;
2920   SilcServer server = (SilcServer)rekey->context;
2921
2922   rekey->task = NULL;
2923
2924   if (!silc_server_create_channel_key(server, rekey->channel, rekey->key_len))
2925     return;
2926
2927   silc_server_send_channel_key(server, NULL, rekey->channel, FALSE);
2928 }
2929
2930 /* Generates new channel key. This is used to create the initial channel key
2931    but also to re-generate new key for channel. If `key_len' is provided
2932    it is the bytes of the key length. */
2933
2934 bool silc_server_create_channel_key(SilcServer server, 
2935                                     SilcChannelEntry channel,
2936                                     uint32 key_len)
2937 {
2938   int i;
2939   unsigned char channel_key[32], hash[32];
2940   uint32 len;
2941
2942   SILC_LOG_DEBUG(("Generating channel key"));
2943
2944   if (channel->mode & SILC_CHANNEL_MODE_PRIVKEY) {
2945     SILC_LOG_DEBUG(("Channel has private keys, will not generate new key"));
2946     return TRUE;
2947   }
2948
2949   if (!channel->channel_key)
2950     if (!silc_cipher_alloc(SILC_DEFAULT_CIPHER, &channel->channel_key)) {
2951       channel->channel_key = NULL;
2952       return FALSE;
2953     }
2954
2955   if (key_len)
2956     len = key_len;
2957   else if (channel->key_len)
2958     len = channel->key_len / 8;
2959   else
2960     len = silc_cipher_get_key_len(channel->channel_key) / 8;
2961
2962   /* Create channel key */
2963   for (i = 0; i < len; i++) channel_key[i] = silc_rng_get_byte(server->rng);
2964   
2965   /* Set the key */
2966   silc_cipher_set_key(channel->channel_key, channel_key, len * 8);
2967
2968   /* Remove old key if exists */
2969   if (channel->key) {
2970     memset(channel->key, 0, channel->key_len / 8);
2971     silc_free(channel->key);
2972   }
2973
2974   /* Save the key */
2975   channel->key_len = len * 8;
2976   channel->key = silc_calloc(len, sizeof(*channel->key));
2977   memcpy(channel->key, channel_key, len);
2978   memset(channel_key, 0, sizeof(channel_key));
2979
2980   /* Generate HMAC key from the channel key data and set it */
2981   if (!channel->hmac)
2982     silc_hmac_alloc(SILC_DEFAULT_HMAC, NULL, &channel->hmac);
2983   silc_hash_make(silc_hmac_get_hash(channel->hmac), channel->key, len, hash);
2984   silc_hmac_set_key(channel->hmac, hash, 
2985                     silc_hash_len(silc_hmac_get_hash(channel->hmac)));
2986   memset(hash, 0, sizeof(hash));
2987
2988   if (server->server_type == SILC_ROUTER) {
2989     if (!channel->rekey)
2990       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
2991     channel->rekey->context = (void *)server;
2992     channel->rekey->channel = channel;
2993     channel->rekey->key_len = key_len;
2994     if (channel->rekey->task)
2995       silc_schedule_task_del(server->schedule, channel->rekey->task);
2996
2997     channel->rekey->task = 
2998       silc_schedule_task_add(server->schedule, 0, 
2999                              silc_server_channel_key_rekey,
3000                              (void *)channel->rekey, 3600, 0,
3001                              SILC_TASK_TIMEOUT,
3002                              SILC_TASK_PRI_NORMAL);
3003   }
3004
3005   return TRUE;
3006 }
3007
3008 /* Saves the channel key found in the encoded `key_payload' buffer. This 
3009    function is used when we receive Channel Key Payload and also when we're
3010    processing JOIN command reply. Returns entry to the channel. */
3011
3012 SilcChannelEntry silc_server_save_channel_key(SilcServer server,
3013                                               SilcBuffer key_payload,
3014                                               SilcChannelEntry channel)
3015 {
3016   SilcChannelKeyPayload payload = NULL;
3017   SilcChannelID *id = NULL;
3018   unsigned char *tmp, hash[32];
3019   uint32 tmp_len;
3020   char *cipher;
3021
3022   SILC_LOG_DEBUG(("Start"));
3023
3024   /* Decode channel key payload */
3025   payload = silc_channel_key_payload_parse(key_payload->data,
3026                                            key_payload->len);
3027   if (!payload) {
3028     SILC_LOG_ERROR(("Bad channel key payload received, dropped"));
3029     channel = NULL;
3030     goto out;
3031   }
3032
3033   /* Get the channel entry */
3034   if (!channel) {
3035
3036     /* Get channel ID */
3037     tmp = silc_channel_key_get_id(payload, &tmp_len);
3038     id = silc_id_str2id(tmp, tmp_len, SILC_ID_CHANNEL);
3039     if (!id) {
3040       channel = NULL;
3041       goto out;
3042     }
3043
3044     channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
3045     if (!channel) {
3046       channel = silc_idlist_find_channel_by_id(server->global_list, id, NULL);
3047       if (!channel) {
3048         SILC_LOG_ERROR(("Received key for non-existent channel"));
3049         goto out;
3050       }
3051     }
3052   }
3053
3054   tmp = silc_channel_key_get_key(payload, &tmp_len);
3055   if (!tmp) {
3056     channel = NULL;
3057     goto out;
3058   }
3059
3060   cipher = silc_channel_key_get_cipher(payload, NULL);
3061   if (!cipher) {
3062     channel = NULL;
3063     goto out;
3064   }
3065
3066   /* Remove old key if exists */
3067   if (channel->key) {
3068     memset(channel->key, 0, channel->key_len / 8);
3069     silc_free(channel->key);
3070     silc_cipher_free(channel->channel_key);
3071   }
3072
3073   /* Create new cipher */
3074   if (!silc_cipher_alloc(cipher, &channel->channel_key)) {
3075     channel->channel_key = NULL;
3076     channel = NULL;
3077     goto out;
3078   }
3079
3080   if (channel->cipher)
3081     silc_free(channel->cipher);
3082   channel->cipher = strdup(cipher);
3083
3084   /* Save the key */
3085   channel->key_len = tmp_len * 8;
3086   channel->key = silc_calloc(tmp_len, sizeof(unsigned char));
3087   memcpy(channel->key, tmp, tmp_len);
3088   silc_cipher_set_key(channel->channel_key, tmp, channel->key_len);
3089
3090   /* Generate HMAC key from the channel key data and set it */
3091   if (!channel->hmac)
3092     silc_hmac_alloc(SILC_DEFAULT_HMAC, NULL, &channel->hmac);
3093   silc_hash_make(silc_hmac_get_hash(channel->hmac), tmp, tmp_len, hash);
3094   silc_hmac_set_key(channel->hmac, hash, 
3095                     silc_hash_len(silc_hmac_get_hash(channel->hmac)));
3096
3097   memset(hash, 0, sizeof(hash));
3098   memset(tmp, 0, tmp_len);
3099
3100   if (server->server_type == SILC_ROUTER) {
3101     if (!channel->rekey)
3102       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
3103     channel->rekey->context = (void *)server;
3104     channel->rekey->channel = channel;
3105     if (channel->rekey->task)
3106       silc_schedule_task_del(server->schedule, channel->rekey->task);
3107
3108     channel->rekey->task = 
3109       silc_schedule_task_add(server->schedule, 0, 
3110                              silc_server_channel_key_rekey,
3111                              (void *)channel->rekey, 3600, 0,
3112                              SILC_TASK_TIMEOUT,
3113                              SILC_TASK_PRI_NORMAL);
3114   }
3115
3116  out:
3117   silc_free(id);
3118   if (payload)
3119     silc_channel_key_payload_free(payload);
3120
3121   return channel;
3122 }
3123
3124 /* Heartbeat callback. This function is set as argument for the
3125    silc_socket_set_heartbeat function. The library will call this function
3126    at the set time interval. */
3127
3128 void silc_server_perform_heartbeat(SilcSocketConnection sock,
3129                                    void *hb_context)
3130 {
3131   SilcServerHBContext hb = (SilcServerHBContext)hb_context;
3132
3133   SILC_LOG_DEBUG(("Sending heartbeat to %s (%s)", sock->hostname,
3134                   sock->ip));
3135
3136   /* Send the heartbeat */
3137   silc_server_send_heartbeat(hb->server, sock);
3138 }
3139
3140 /* Returns assembled of all servers in the given ID list. The packet's
3141    form is dictated by the New ID payload. */
3142
3143 static void silc_server_announce_get_servers(SilcServer server,
3144                                              SilcServerEntry remote,
3145                                              SilcIDList id_list,
3146                                              SilcBuffer *servers,
3147                                              unsigned long creation_time)
3148 {
3149   SilcIDCacheList list;
3150   SilcIDCacheEntry id_cache;
3151   SilcServerEntry entry;
3152   SilcBuffer idp;
3153
3154   /* Go through all clients in the list */
3155   if (silc_idcache_get_all(id_list->servers, &list)) {
3156     if (silc_idcache_list_first(list, &id_cache)) {
3157       while (id_cache) {
3158         entry = (SilcServerEntry)id_cache->context;
3159
3160         /* Do not announce the one we've sending our announcements and
3161            do not announce ourself. Also check the creation time if it's
3162            provided. */
3163         if ((entry == remote) || (entry == server->id_entry) ||
3164             (creation_time && entry->data.created < creation_time)) {
3165           if (!silc_idcache_list_next(list, &id_cache))
3166             break;
3167           continue;
3168         }
3169
3170         idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
3171
3172         *servers = silc_buffer_realloc(*servers, 
3173                                        (*servers ? 
3174                                         (*servers)->truelen + idp->len : 
3175                                         idp->len));
3176         silc_buffer_pull_tail(*servers, ((*servers)->end - (*servers)->data));
3177         silc_buffer_put(*servers, idp->data, idp->len);
3178         silc_buffer_pull(*servers, idp->len);
3179         silc_buffer_free(idp);
3180
3181         if (!silc_idcache_list_next(list, &id_cache))
3182           break;
3183       }
3184     }
3185
3186     silc_idcache_list_free(list);
3187   }
3188 }
3189
3190 static SilcBuffer 
3191 silc_server_announce_encode_notify(SilcNotifyType notify, uint32 argc, ...)
3192 {
3193   va_list ap;
3194   SilcBuffer p;
3195
3196   va_start(ap, argc);
3197   p = silc_notify_payload_encode(notify, argc, ap);
3198   va_end(ap);
3199  
3200   return p;
3201 }
3202
3203 /* This function is used by router to announce existing servers to our
3204    primary router when we've connected to it. If `creation_time' is non-zero
3205    then only the servers that has been created after the `creation_time'
3206    will be announced. */
3207
3208 void silc_server_announce_servers(SilcServer server, bool global,
3209                                   unsigned long creation_time,
3210                                   SilcSocketConnection remote)
3211 {
3212   SilcBuffer servers = NULL;
3213
3214   SILC_LOG_DEBUG(("Announcing servers"));
3215
3216   /* Get servers in local list */
3217   silc_server_announce_get_servers(server, remote->user_data,
3218                                    server->local_list, &servers,
3219                                    creation_time);
3220
3221   if (global)
3222     /* Get servers in global list */
3223     silc_server_announce_get_servers(server, remote->user_data,
3224                                      server->global_list, &servers,
3225                                      creation_time);
3226
3227   if (servers) {
3228     silc_buffer_push(servers, servers->data - servers->head);
3229     SILC_LOG_HEXDUMP(("servers"), servers->data, servers->len);
3230
3231     /* Send the packet */
3232     silc_server_packet_send(server, remote,
3233                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3234                             servers->data, servers->len, TRUE);
3235
3236     silc_buffer_free(servers);
3237   }
3238 }
3239
3240 /* Returns assembled packet of all clients in the given ID list. The
3241    packet's form is dictated by the New ID Payload. */
3242
3243 static void silc_server_announce_get_clients(SilcServer server,
3244                                              SilcIDList id_list,
3245                                              SilcBuffer *clients,
3246                                              SilcBuffer *umodes,
3247                                              unsigned long creation_time)
3248 {
3249   SilcIDCacheList list;
3250   SilcIDCacheEntry id_cache;
3251   SilcClientEntry client;
3252   SilcBuffer idp;
3253   SilcBuffer tmp;
3254   unsigned char mode[4];
3255
3256   /* Go through all clients in the list */
3257   if (silc_idcache_get_all(id_list->clients, &list)) {
3258     if (silc_idcache_list_first(list, &id_cache)) {
3259       while (id_cache) {
3260         client = (SilcClientEntry)id_cache->context;
3261
3262         if (creation_time && client->data.created < creation_time) {
3263           if (!silc_idcache_list_next(list, &id_cache))
3264             break;
3265           continue;
3266         }
3267
3268         idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
3269
3270         *clients = silc_buffer_realloc(*clients, 
3271                                        (*clients ? 
3272                                         (*clients)->truelen + idp->len : 
3273                                         idp->len));
3274         silc_buffer_pull_tail(*clients, ((*clients)->end - (*clients)->data));
3275         silc_buffer_put(*clients, idp->data, idp->len);
3276         silc_buffer_pull(*clients, idp->len);
3277
3278         SILC_PUT32_MSB(client->mode, mode);
3279         tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_UMODE_CHANGE,
3280                                                  2, idp->data, idp->len,
3281                                                  mode, 4);
3282         *umodes = silc_buffer_realloc(*umodes, 
3283                                       (*umodes ? 
3284                                        (*umodes)->truelen + tmp->len :  
3285                                        tmp->len));
3286         silc_buffer_pull_tail(*umodes, ((*umodes)->end - (*umodes)->data));
3287         silc_buffer_put(*umodes, tmp->data, tmp->len);
3288         silc_buffer_pull(*umodes, tmp->len);
3289         silc_buffer_free(tmp);
3290
3291         silc_buffer_free(idp);
3292
3293         if (!silc_idcache_list_next(list, &id_cache))
3294           break;
3295       }
3296     }
3297
3298     silc_idcache_list_free(list);
3299   }
3300 }
3301
3302 /* This function is used to announce our existing clients to our router
3303    when we've connected to it. If `creation_time' is non-zero then only
3304    the clients that has been created after the `creation_time' will be
3305    announced. */
3306
3307 void silc_server_announce_clients(SilcServer server,
3308                                   unsigned long creation_time,
3309                                   SilcSocketConnection remote)
3310 {
3311   SilcBuffer clients = NULL;
3312   SilcBuffer umodes = NULL;
3313
3314   SILC_LOG_DEBUG(("Announcing clients"));
3315
3316   /* Get clients in local list */
3317   silc_server_announce_get_clients(server, server->local_list,
3318                                    &clients, &umodes, creation_time);
3319
3320   /* As router we announce our global list as well */
3321   if (server->server_type == SILC_ROUTER)
3322     silc_server_announce_get_clients(server, server->global_list,
3323                                      &clients, &umodes, creation_time);
3324
3325   if (clients) {
3326     silc_buffer_push(clients, clients->data - clients->head);
3327     SILC_LOG_HEXDUMP(("clients"), clients->data, clients->len);
3328
3329     /* Send the packet */
3330     silc_server_packet_send(server, remote,
3331                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3332                             clients->data, clients->len, TRUE);
3333
3334     silc_buffer_free(clients);
3335   }
3336
3337   if (umodes) {
3338     silc_buffer_push(umodes, umodes->data - umodes->head);
3339     SILC_LOG_HEXDUMP(("umodes"), umodes->data, umodes->len);
3340
3341     /* Send the packet */
3342     silc_server_packet_send(server, remote,
3343                             SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3344                             umodes->data, umodes->len, TRUE);
3345
3346     silc_buffer_free(umodes);
3347   }
3348 }
3349
3350 /* Returns channel's topic for announcing it */
3351
3352 void silc_server_announce_get_channel_topic(SilcServer server,
3353                                             SilcChannelEntry channel,
3354                                             SilcBuffer *topic)
3355 {
3356   SilcBuffer chidp;
3357
3358   if (channel->topic) {
3359     chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
3360     *topic = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_TOPIC_SET, 2,
3361                                                 chidp->data, chidp->len,
3362                                                 channel->topic, 
3363                                                 strlen(channel->topic));
3364     silc_buffer_free(chidp);
3365   }
3366 }
3367
3368 /* Returns assembled packets for channel users of the `channel'. */
3369
3370 void silc_server_announce_get_channel_users(SilcServer server,
3371                                             SilcChannelEntry channel,
3372                                             SilcBuffer *channel_users,
3373                                             SilcBuffer *channel_users_modes)
3374 {
3375   SilcChannelClientEntry chl;
3376   SilcHashTableList htl;
3377   SilcBuffer chidp, clidp;
3378   SilcBuffer tmp;
3379   int len;
3380   unsigned char mode[4];
3381
3382   SILC_LOG_DEBUG(("Start"));
3383
3384   /* Now find all users on the channel */
3385   chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
3386   silc_hash_table_list(channel->user_list, &htl);
3387   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3388     clidp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3389
3390     /* JOIN Notify */
3391     tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_JOIN, 2, 
3392                                              clidp->data, clidp->len,
3393                                              chidp->data, chidp->len);
3394     len = tmp->len;
3395     *channel_users = 
3396       silc_buffer_realloc(*channel_users, 
3397                           (*channel_users ? 
3398                            (*channel_users)->truelen + len : len));
3399     silc_buffer_pull_tail(*channel_users, 
3400                           ((*channel_users)->end - 
3401                            (*channel_users)->data));
3402     
3403     silc_buffer_put(*channel_users, tmp->data, tmp->len);
3404     silc_buffer_pull(*channel_users, len);
3405     silc_buffer_free(tmp);
3406
3407     /* CUMODE notify for mode change on the channel */
3408     SILC_PUT32_MSB(chl->mode, mode);
3409     tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_CUMODE_CHANGE, 
3410                                              3, clidp->data, clidp->len,
3411                                              mode, 4,
3412                                              clidp->data, clidp->len);
3413     len = tmp->len;
3414     *channel_users_modes = 
3415       silc_buffer_realloc(*channel_users_modes, 
3416                           (*channel_users_modes ? 
3417                            (*channel_users_modes)->truelen + len : len));
3418     silc_buffer_pull_tail(*channel_users_modes, 
3419                           ((*channel_users_modes)->end - 
3420                            (*channel_users_modes)->data));
3421     
3422     silc_buffer_put(*channel_users_modes, tmp->data, tmp->len);
3423     silc_buffer_pull(*channel_users_modes, len);
3424     silc_buffer_free(tmp);
3425
3426     silc_buffer_free(clidp);
3427   }
3428   silc_buffer_free(chidp);
3429 }
3430
3431 /* Returns assembled packets for all channels and users on those channels
3432    from the given ID List. The packets are in the form dictated by the
3433    New Channel and New Channel User payloads. */
3434
3435 void silc_server_announce_get_channels(SilcServer server,
3436                                        SilcIDList id_list,
3437                                        SilcBuffer *channels,
3438                                        SilcBuffer *channel_users,
3439                                        SilcBuffer **channel_users_modes,
3440                                        uint32 *channel_users_modes_c,
3441                                        SilcBuffer **channel_topics,
3442                                        SilcChannelID ***channel_ids,
3443                                        unsigned long creation_time)
3444 {
3445   SilcIDCacheList list;
3446   SilcIDCacheEntry id_cache;
3447   SilcChannelEntry channel;
3448   unsigned char *cid;
3449   uint32 id_len;
3450   uint16 name_len;
3451   int len;
3452   int i = *channel_users_modes_c;
3453   bool announce;
3454
3455   SILC_LOG_DEBUG(("Start"));
3456
3457   /* Go through all channels in the list */
3458   if (silc_idcache_get_all(id_list->channels, &list)) {
3459     if (silc_idcache_list_first(list, &id_cache)) {
3460       while (id_cache) {
3461         channel = (SilcChannelEntry)id_cache->context;
3462
3463         if (creation_time && channel->created < creation_time)
3464           announce = FALSE;
3465         else
3466           announce = TRUE;
3467
3468         cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3469         id_len = silc_id_get_len(channel->id, SILC_ID_CHANNEL);
3470         name_len = strlen(channel->channel_name);
3471
3472         if (announce) {
3473           len = 4 + name_len + id_len + 4;
3474           *channels = 
3475             silc_buffer_realloc(*channels, 
3476                                 (*channels ? (*channels)->truelen + 
3477                                  len : len));
3478           silc_buffer_pull_tail(*channels, 
3479                                 ((*channels)->end - (*channels)->data));
3480           silc_buffer_format(*channels,
3481                              SILC_STR_UI_SHORT(name_len),
3482                              SILC_STR_UI_XNSTRING(channel->channel_name, 
3483                                                   name_len),
3484                              SILC_STR_UI_SHORT(id_len),
3485                              SILC_STR_UI_XNSTRING(cid, id_len),
3486                              SILC_STR_UI_INT(channel->mode),
3487                              SILC_STR_END);
3488           silc_buffer_pull(*channels, len);
3489         }
3490
3491         /* Channel user modes */
3492         *channel_users_modes = silc_realloc(*channel_users_modes,
3493                                             sizeof(**channel_users_modes) * 
3494                                             (i + 1));
3495         (*channel_users_modes)[i] = NULL;
3496         *channel_ids = silc_realloc(*channel_ids, 
3497                                     sizeof(**channel_ids) * (i + 1));
3498         (*channel_ids)[i] = NULL;
3499         silc_server_announce_get_channel_users(server, channel,
3500                                                channel_users,
3501                                                &(*channel_users_modes)[i]);
3502         (*channel_ids)[i] = channel->id;
3503
3504         /* Channel's topic */
3505         *channel_topics = silc_realloc(*channel_topics,
3506                                        sizeof(**channel_topics) * (i + 1));
3507         (*channel_topics)[i] = NULL;
3508         silc_server_announce_get_channel_topic(server, channel,
3509                                                &(*channel_topics)[i]);
3510         i++;
3511
3512         if (!silc_idcache_list_next(list, &id_cache))
3513           break;
3514       }
3515
3516       *channel_users_modes_c += i;
3517     }
3518
3519     silc_idcache_list_free(list);
3520   }
3521 }
3522
3523 /* This function is used to announce our existing channels to our router
3524    when we've connected to it. This also announces the users on the
3525    channels to the router. If the `creation_time' is non-zero only the
3526    channels that was created after the `creation_time' are announced.
3527    Note that the channel users are still announced even if the `creation_time'
3528    was provided. */
3529
3530 void silc_server_announce_channels(SilcServer server,
3531                                    unsigned long creation_time,
3532                                    SilcSocketConnection remote)
3533 {
3534   SilcBuffer channels = NULL, channel_users = NULL;
3535   SilcBuffer *channel_users_modes = NULL;
3536   SilcBuffer *channel_topics = NULL;
3537   uint32 channel_users_modes_c = 0;
3538   SilcChannelID **channel_ids = NULL;
3539
3540   SILC_LOG_DEBUG(("Announcing channels and channel users"));
3541
3542   /* Get channels and channel users in local list */
3543   silc_server_announce_get_channels(server, server->local_list,
3544                                     &channels, &channel_users,
3545                                     &channel_users_modes,
3546                                     &channel_users_modes_c,
3547                                     &channel_topics,
3548                                     &channel_ids, creation_time);
3549
3550   /* Get channels and channel users in global list */
3551   if (server->server_type != SILC_SERVER)
3552     silc_server_announce_get_channels(server, server->global_list,
3553                                       &channels, &channel_users,
3554                                       &channel_users_modes,
3555                                       &channel_users_modes_c,
3556                                       &channel_topics,
3557                                       &channel_ids, creation_time);
3558
3559   if (channels) {
3560     silc_buffer_push(channels, channels->data - channels->head);
3561     SILC_LOG_HEXDUMP(("channels"), channels->data, channels->len);
3562
3563     /* Send the packet */
3564     silc_server_packet_send(server, remote,
3565                             SILC_PACKET_NEW_CHANNEL, SILC_PACKET_FLAG_LIST,
3566                             channels->data, channels->len,
3567                             FALSE);
3568
3569     silc_buffer_free(channels);
3570   }
3571
3572   if (channel_users) {
3573     silc_buffer_push(channel_users, channel_users->data - channel_users->head);
3574     SILC_LOG_HEXDUMP(("channel users"), channel_users->data, 
3575                      channel_users->len);
3576
3577     /* Send the packet */
3578     silc_server_packet_send(server, remote,
3579                             SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3580                             channel_users->data, channel_users->len,
3581                             FALSE);
3582
3583     silc_buffer_free(channel_users);
3584   }
3585
3586   if (channel_users_modes) {
3587     int i;
3588
3589     for (i = 0; i < channel_users_modes_c; i++) {
3590       silc_buffer_push(channel_users_modes[i], 
3591                        channel_users_modes[i]->data - 
3592                        channel_users_modes[i]->head);
3593       SILC_LOG_HEXDUMP(("channel users modes"), channel_users_modes[i]->data, 
3594                        channel_users_modes[i]->len);
3595       silc_server_packet_send_dest(server, remote,
3596                                    SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3597                                    channel_ids[i], SILC_ID_CHANNEL,
3598                                    channel_users_modes[i]->data, 
3599                                    channel_users_modes[i]->len,
3600                                    FALSE);
3601       silc_buffer_free(channel_users_modes[i]);
3602     }
3603     silc_free(channel_users_modes);
3604   }
3605
3606   if (channel_topics) {
3607     int i;
3608
3609     for (i = 0; i < channel_users_modes_c; i++) {
3610       if (!channel_topics[i])
3611         continue;
3612
3613       silc_buffer_push(channel_topics[i], 
3614                        channel_topics[i]->data - 
3615                        channel_topics[i]->head);
3616       SILC_LOG_HEXDUMP(("channel topic"), channel_topics[i]->data, 
3617                        channel_topics[i]->len);
3618       silc_server_packet_send_dest(server, remote,
3619                                    SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3620                                    channel_ids[i], SILC_ID_CHANNEL,
3621                                    channel_topics[i]->data, 
3622                                    channel_topics[i]->len,
3623                                    FALSE);
3624       silc_buffer_free(channel_topics[i]);
3625     }
3626     silc_free(channel_topics);
3627   }
3628
3629   silc_free(channel_ids);
3630 }
3631
3632 /* Failure timeout callback. If this is called then we will immediately
3633    process the received failure. We always process the failure with timeout
3634    since we do not want to blindly trust to received failure packets. 
3635    This won't be called (the timeout is cancelled) if the failure was
3636    bogus (it is bogus if remote does not close the connection after sending
3637    the failure). */
3638
3639 SILC_TASK_CALLBACK(silc_server_failure_callback)
3640 {
3641   SilcServerFailureContext f = (SilcServerFailureContext)context;
3642
3643   if (f->sock->protocol) {
3644     f->sock->protocol->state = SILC_PROTOCOL_STATE_FAILURE;
3645     silc_protocol_execute(f->sock->protocol, f->server->schedule, 0, 0);
3646   }
3647
3648   silc_free(f);
3649 }
3650
3651 /* Assembles user list and users mode list from the `channel'. */
3652
3653 void silc_server_get_users_on_channel(SilcServer server,
3654                                       SilcChannelEntry channel,
3655                                       SilcBuffer *user_list,
3656                                       SilcBuffer *mode_list,
3657                                       uint32 *user_count)
3658 {
3659   SilcChannelClientEntry chl;
3660   SilcHashTableList htl;
3661   SilcBuffer client_id_list;
3662   SilcBuffer client_mode_list;
3663   SilcBuffer idp;
3664   uint32 list_count = 0, len = 0;
3665
3666   silc_hash_table_list(channel->user_list, &htl);
3667   while (silc_hash_table_get(&htl, NULL, (void *)&chl))
3668     len += (silc_id_get_len(chl->client->id, SILC_ID_CLIENT) + 4);
3669
3670   client_id_list = silc_buffer_alloc(len);
3671   client_mode_list = 
3672     silc_buffer_alloc(4 * silc_hash_table_count(channel->user_list));
3673   silc_buffer_pull_tail(client_id_list, SILC_BUFFER_END(client_id_list));
3674   silc_buffer_pull_tail(client_mode_list, SILC_BUFFER_END(client_mode_list));
3675
3676   silc_hash_table_list(channel->user_list, &htl);
3677   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3678     /* Client ID */
3679     idp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3680     silc_buffer_put(client_id_list, idp->data, idp->len);
3681     silc_buffer_pull(client_id_list, idp->len);
3682     silc_buffer_free(idp);
3683
3684     /* Client's mode on channel */
3685     SILC_PUT32_MSB(chl->mode, client_mode_list->data);
3686     silc_buffer_pull(client_mode_list, 4);
3687
3688     list_count++;
3689   }
3690   silc_buffer_push(client_id_list, 
3691                    client_id_list->data - client_id_list->head);
3692   silc_buffer_push(client_mode_list, 
3693                    client_mode_list->data - client_mode_list->head);
3694
3695   *user_list = client_id_list;
3696   *mode_list = client_mode_list;
3697   *user_count = list_count;
3698 }
3699
3700 /* Saves users and their modes to the `channel'. */
3701
3702 void silc_server_save_users_on_channel(SilcServer server,
3703                                        SilcSocketConnection sock,
3704                                        SilcChannelEntry channel,
3705                                        SilcClientID *noadd,
3706                                        SilcBuffer user_list,
3707                                        SilcBuffer mode_list,
3708                                        uint32 user_count)
3709 {
3710   int i;
3711   uint16 idp_len;
3712   uint32 mode;
3713   SilcClientID *client_id;
3714   SilcClientEntry client;
3715   SilcIDCacheEntry cache;
3716   bool global;
3717
3718   SILC_LOG_DEBUG(("Start"));
3719
3720   for (i = 0; i < user_count; i++) {
3721     /* Client ID */
3722     SILC_GET16_MSB(idp_len, user_list->data + 2);
3723     idp_len += 4;
3724     client_id = silc_id_payload_parse_id(user_list->data, idp_len);
3725     silc_buffer_pull(user_list, idp_len);
3726     if (!client_id)
3727       continue;
3728
3729     /* Mode */
3730     SILC_GET32_MSB(mode, mode_list->data);
3731     silc_buffer_pull(mode_list, 4);
3732
3733     if (noadd && SILC_ID_CLIENT_COMPARE(client_id, noadd)) {
3734       silc_free(client_id);
3735       continue;
3736     }
3737
3738     global = FALSE;
3739     
3740     /* Check if we have this client cached already. */
3741     client = silc_idlist_find_client_by_id(server->local_list, client_id,
3742                                            server->server_type, &cache);
3743     if (!client) {
3744       client = silc_idlist_find_client_by_id(server->global_list, 
3745                                              client_id, server->server_type,
3746                                              &cache);
3747       global = TRUE;
3748     }
3749     if (!client) {
3750       /* If router did not find such Client ID in its lists then this must
3751          be bogus client or some router in the net is buggy. */
3752       if (server->server_type == SILC_ROUTER) {
3753         silc_free(client_id);
3754         continue;
3755       }
3756
3757       /* We don't have that client anywhere, add it. The client is added
3758          to global list since server didn't have it in the lists so it must be 
3759          global. */
3760       client = silc_idlist_add_client(server->global_list, NULL, NULL, NULL,
3761                                       silc_id_dup(client_id, SILC_ID_CLIENT), 
3762                                       sock->user_data, NULL, 0);
3763       if (!client) {
3764         SILC_LOG_ERROR(("Could not add new client to the ID Cache"));
3765         silc_free(client_id);
3766         continue;
3767       }
3768
3769       client->data.status |= SILC_IDLIST_STATUS_REGISTERED;
3770     } else {
3771       /* Found, if it is from global list we'll assure that we won't
3772          expire it now that the entry is on channel. */
3773       if (global)
3774         cache->expire = 0;
3775     }
3776
3777     silc_free(client_id);
3778
3779     if (!silc_server_client_on_channel(client, channel)) {
3780       /* Client was not on the channel, add it. */
3781       SilcChannelClientEntry chl = silc_calloc(1, sizeof(*chl));
3782       chl->client = client;
3783       chl->mode = mode;
3784       chl->channel = channel;
3785       silc_hash_table_add(channel->user_list, chl->client, chl);
3786       silc_hash_table_add(client->channels, chl->channel, chl);
3787     }
3788   }
3789 }
3790
3791 /* Lookups route to the client indicated by the `id_data'. The connection
3792    object and internal data object is returned. Returns NULL if route
3793    could not be found to the client. If the `client_id' is specified then
3794    it is used and the `id_data' is ignored. */
3795
3796 SilcSocketConnection silc_server_get_client_route(SilcServer server,
3797                                                   unsigned char *id_data,
3798                                                   uint32 id_len,
3799                                                   SilcClientID *client_id,
3800                                                   SilcIDListData *idata)
3801 {
3802   SilcClientID *id;
3803   SilcClientEntry client;
3804
3805   SILC_LOG_DEBUG(("Start"));
3806
3807   /* Decode destination Client ID */
3808   if (!client_id) {
3809     id = silc_id_str2id(id_data, id_len, SILC_ID_CLIENT);
3810     if (!id) {
3811       SILC_LOG_ERROR(("Could not decode destination Client ID, dropped"));
3812       return NULL;
3813     }
3814   } else {
3815     id = silc_id_dup(client_id, SILC_ID_CLIENT);
3816   }
3817
3818   /* If the destination belongs to our server we don't have to route
3819      the packet anywhere but to send it to the local destination. */
3820   client = silc_idlist_find_client_by_id(server->local_list, id, TRUE, NULL);
3821   if (client) {
3822     silc_free(id);
3823
3824     /* If we are router and the client has router then the client is in
3825        our cell but not directly connected to us. */
3826     if (server->server_type == SILC_ROUTER && client->router) {
3827       /* We are of course in this case the client's router thus the route
3828          to the client is the server who owns the client. So, we will send
3829          the packet to that server. */
3830       if (idata)
3831         *idata = (SilcIDListData)client->router;
3832       return client->router->connection;
3833     }
3834
3835     /* Seems that client really is directly connected to us */
3836     if (idata)
3837       *idata = (SilcIDListData)client;
3838     return client->connection;
3839   }
3840
3841   /* Destination belongs to someone not in this server. If we are normal
3842      server our action is to send the packet to our router. */
3843   if (server->server_type != SILC_ROUTER && !server->standalone) {
3844     silc_free(id);
3845     if (idata)
3846       *idata = (SilcIDListData)server->router;
3847     return server->router->connection;
3848   }
3849
3850   /* We are router and we will perform route lookup for the destination 
3851      and send the packet to fastest route. */
3852   if (server->server_type == SILC_ROUTER && !server->standalone) {
3853     /* Check first that the ID is valid */
3854     client = silc_idlist_find_client_by_id(server->global_list, id, 
3855                                            TRUE, NULL);
3856     if (client) {
3857       SilcSocketConnection dst_sock;
3858
3859       dst_sock = silc_server_route_get(server, id, SILC_ID_CLIENT);
3860
3861       silc_free(id);
3862       if (idata)
3863         *idata = (SilcIDListData)dst_sock->user_data;
3864       return dst_sock;
3865     }
3866   }
3867
3868   silc_free(id);
3869   return NULL;
3870 }
3871
3872 /* Encodes and returns channel list of channels the `client' has joined.
3873    Secret channels are not put to the list. */
3874
3875 SilcBuffer silc_server_get_client_channel_list(SilcServer server,
3876                                                SilcClientEntry client)
3877 {
3878   SilcBuffer buffer = NULL;
3879   SilcChannelEntry channel;
3880   SilcChannelClientEntry chl;
3881   SilcHashTableList htl;
3882   unsigned char *cid;
3883   uint32 id_len;
3884   uint16 name_len;
3885   int len;
3886
3887   silc_hash_table_list(client->channels, &htl);
3888   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3889     channel = chl->channel;
3890
3891     if (channel->mode & SILC_CHANNEL_MODE_SECRET ||
3892         channel->mode & SILC_CHANNEL_MODE_PRIVATE)
3893       continue;
3894
3895     cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3896     id_len = silc_id_get_len(channel->id, SILC_ID_CHANNEL);
3897     name_len = strlen(channel->channel_name);
3898     
3899     len = 4 + name_len + id_len + 4;
3900     buffer = silc_buffer_realloc(buffer, 
3901                                  (buffer ? (buffer)->truelen + len : len));
3902     silc_buffer_pull_tail(buffer, ((buffer)->end - (buffer)->data));
3903     silc_buffer_format(buffer,
3904                        SILC_STR_UI_SHORT(name_len),
3905                        SILC_STR_UI_XNSTRING(channel->channel_name, 
3906                                             name_len),
3907                        SILC_STR_UI_SHORT(id_len),
3908                        SILC_STR_UI_XNSTRING(cid, id_len),
3909                        SILC_STR_UI_INT(chl->mode), /* Client's mode */
3910                        SILC_STR_END);
3911     silc_buffer_pull(buffer, len);
3912     silc_free(cid);
3913   }
3914
3915   if (buffer)
3916     silc_buffer_push(buffer, buffer->data - buffer->head);
3917
3918   return buffer;
3919 }
3920
3921 /* Finds client entry by Client ID and if it is not found then resolves
3922    it using WHOIS command. */
3923
3924 SilcClientEntry silc_server_get_client_resolve(SilcServer server,
3925                                                SilcClientID *client_id,
3926                                                bool *resolved)
3927 {
3928   SilcClientEntry client;
3929
3930   if (resolved)
3931     *resolved = FALSE;
3932
3933   client = silc_idlist_find_client_by_id(server->local_list, client_id,
3934                                          TRUE, NULL);
3935   if (!client) {
3936     client = silc_idlist_find_client_by_id(server->global_list, 
3937                                            client_id, TRUE, NULL);
3938     if (!client && server->server_type == SILC_ROUTER)
3939       return NULL;
3940   }
3941
3942   if (!client && server->standalone)
3943     return NULL;
3944
3945   if (!client || !client->nickname || !client->username) {
3946     SilcBuffer buffer, idp;
3947
3948     client->data.status |= SILC_IDLIST_STATUS_RESOLVING;
3949     client->data.status &= ~SILC_IDLIST_STATUS_RESOLVED;
3950     client->resolve_cmd_ident = ++server->cmd_ident;
3951
3952     idp = silc_id_payload_encode(client_id, SILC_ID_CLIENT);
3953     buffer = silc_command_payload_encode_va(SILC_COMMAND_WHOIS,
3954                                             server->cmd_ident, 1,
3955                                             3, idp->data, idp->len);
3956     silc_server_packet_send(server, client ? client->router->connection :
3957                             server->router->connection,
3958                             SILC_PACKET_COMMAND, 0,
3959                             buffer->data, buffer->len, FALSE);
3960     silc_buffer_free(idp);
3961     silc_buffer_free(buffer);
3962
3963     if (resolved)
3964       *resolved = TRUE;
3965
3966     return NULL;
3967   }
3968
3969   return client;
3970 }
3971
3972 /* A timeout callback for the re-key. We will be the initiator of the
3973    re-key protocol. */
3974
3975 SILC_TASK_CALLBACK(silc_server_rekey_callback)
3976 {
3977   SilcSocketConnection sock = (SilcSocketConnection)context;
3978   SilcIDListData idata = (SilcIDListData)sock->user_data;
3979   SilcServer server = (SilcServer)idata->rekey->context;
3980   SilcProtocol protocol;
3981   SilcServerRekeyInternalContext *proto_ctx;
3982
3983   SILC_LOG_DEBUG(("Start"));
3984
3985   /* Allocate internal protocol context. This is sent as context
3986      to the protocol. */
3987   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
3988   proto_ctx->server = (void *)server;
3989   proto_ctx->sock = sock;
3990   proto_ctx->responder = FALSE;
3991   proto_ctx->pfs = idata->rekey->pfs;
3992       
3993   /* Perform rekey protocol. Will call the final callback after the
3994      protocol is over. */
3995   silc_protocol_alloc(SILC_PROTOCOL_SERVER_REKEY, 
3996                       &protocol, proto_ctx, silc_server_rekey_final);
3997   sock->protocol = protocol;
3998       
3999   /* Run the protocol */
4000   silc_protocol_execute(protocol, server->schedule, 0, 0);
4001
4002   /* Re-register re-key timeout */
4003   silc_schedule_task_add(server->schedule, sock->sock, 
4004                          silc_server_rekey_callback,
4005                          context, idata->rekey->timeout, 0,
4006                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
4007 }
4008
4009 /* The final callback for the REKEY protocol. This will actually take the
4010    new key material into use. */
4011
4012 SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final)
4013 {
4014   SilcProtocol protocol = (SilcProtocol)context;
4015   SilcServerRekeyInternalContext *ctx =
4016     (SilcServerRekeyInternalContext *)protocol->context;
4017   SilcServer server = (SilcServer)ctx->server;
4018   SilcSocketConnection sock = ctx->sock;
4019
4020   SILC_LOG_DEBUG(("Start"));
4021
4022   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
4023       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
4024     /* Error occured during protocol */
4025     SILC_LOG_ERROR(("Error occurred during rekey protocol"));
4026     silc_protocol_cancel(protocol, server->schedule);
4027     silc_protocol_free(protocol);
4028     sock->protocol = NULL;
4029     if (ctx->packet)
4030       silc_packet_context_free(ctx->packet);
4031     if (ctx->ske)
4032       silc_ske_free(ctx->ske);
4033     silc_free(ctx);
4034     return;
4035   }
4036
4037   /* Purge the outgoing data queue to assure that all rekey packets really
4038      go to the network before we quit the protocol. */
4039   silc_server_packet_queue_purge(server, sock);
4040
4041   /* Cleanup */
4042   silc_protocol_free(protocol);
4043   sock->protocol = NULL;
4044   if (ctx->packet)
4045     silc_packet_context_free(ctx->packet);
4046   if (ctx->ske)
4047     silc_ske_free(ctx->ske);
4048   silc_free(ctx);
4049 }