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