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     silc_protocol_cancel(sock->protocol, server->schedule);
2748     sock->protocol->state = SILC_PROTOCOL_STATE_ERROR;
2749     silc_protocol_execute_final(sock->protocol, server->schedule);
2750     return;
2751   }
2752
2753   if (sock->user_data)
2754     silc_server_free_sock_user_data(server, sock);
2755
2756   silc_server_disconnect_remote(server, sock, "Server closed connection: "
2757                                 "Connection timeout");
2758 }
2759
2760 /* Creates new channel. Sends NEW_CHANNEL packet to primary route. This
2761    function may be used only by router. In real SILC network all channels
2762    are created by routers thus this function is never used by normal
2763    server. */
2764
2765 SilcChannelEntry silc_server_create_new_channel(SilcServer server, 
2766                                                 SilcServerID *router_id,
2767                                                 char *cipher, 
2768                                                 char *hmac,
2769                                                 char *channel_name,
2770                                                 int broadcast)
2771 {
2772   SilcChannelID *channel_id;
2773   SilcChannelEntry entry;
2774   SilcCipher key;
2775   SilcHmac newhmac;
2776
2777   SILC_LOG_DEBUG(("Creating new channel"));
2778
2779   if (!cipher)
2780     cipher = SILC_DEFAULT_CIPHER;
2781   if (!hmac)
2782     hmac = SILC_DEFAULT_HMAC;
2783
2784   /* Allocate cipher */
2785   if (!silc_cipher_alloc(cipher, &key))
2786     return NULL;
2787
2788   /* Allocate hmac */
2789   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2790     silc_cipher_free(key);
2791     return NULL;
2792   }
2793
2794   channel_name = strdup(channel_name);
2795
2796   /* Create the channel */
2797   if (!silc_id_create_channel_id(server, router_id, server->rng, 
2798                                  &channel_id)) {
2799     silc_free(channel_name);
2800     silc_cipher_free(key);
2801     silc_hmac_free(newhmac);
2802     return NULL;
2803   }
2804   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2805                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2806                                   NULL, key, newhmac, 0);
2807   if (!entry) {
2808     silc_free(channel_name);
2809     silc_cipher_free(key);
2810     silc_hmac_free(newhmac);
2811     return NULL;
2812   }
2813
2814   entry->cipher = strdup(cipher);
2815   entry->hmac_name = strdup(hmac);
2816
2817   /* Now create the actual key material */
2818   if (!silc_server_create_channel_key(server, entry, 
2819                                       silc_cipher_get_key_len(key) / 8)) {
2820     silc_free(channel_name);
2821     silc_cipher_free(key);
2822     silc_hmac_free(newhmac);
2823     silc_free(entry->cipher);
2824     silc_free(entry->hmac_name);
2825     return NULL;
2826   }
2827
2828   /* Notify other routers about the new channel. We send the packet
2829      to our primary route. */
2830   if (broadcast && server->standalone == FALSE)
2831     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2832                                  channel_name, entry->id, 
2833                                  silc_id_get_len(entry->id, SILC_ID_CHANNEL),
2834                                  entry->mode);
2835
2836   server->stat.my_channels++;
2837
2838   return entry;
2839 }
2840
2841 /* Same as above but creates the channel with Channel ID `channel_id. */
2842
2843 SilcChannelEntry 
2844 silc_server_create_new_channel_with_id(SilcServer server, 
2845                                        char *cipher, 
2846                                        char *hmac,
2847                                        char *channel_name,
2848                                        SilcChannelID *channel_id,
2849                                        int broadcast)
2850 {
2851   SilcChannelEntry entry;
2852   SilcCipher key;
2853   SilcHmac newhmac;
2854
2855   SILC_LOG_DEBUG(("Creating new channel"));
2856
2857   if (!cipher)
2858     cipher = SILC_DEFAULT_CIPHER;
2859   if (!hmac)
2860     hmac = SILC_DEFAULT_HMAC;
2861
2862   /* Allocate cipher */
2863   if (!silc_cipher_alloc(cipher, &key))
2864     return NULL;
2865
2866   /* Allocate hmac */
2867   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2868     silc_cipher_free(key);
2869     return NULL;
2870   }
2871
2872   channel_name = strdup(channel_name);
2873
2874   /* Create the channel */
2875   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2876                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2877                                   NULL, key, newhmac, 0);
2878   if (!entry) {
2879     silc_free(channel_name);
2880     return NULL;
2881   }
2882
2883   /* Now create the actual key material */
2884   if (!silc_server_create_channel_key(server, entry, 
2885                                       silc_cipher_get_key_len(key) / 8)) {
2886     silc_free(channel_name);
2887     return NULL;
2888   }
2889
2890   /* Notify other routers about the new channel. We send the packet
2891      to our primary route. */
2892   if (broadcast && server->standalone == FALSE)
2893     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2894                                  channel_name, entry->id, 
2895                                  silc_id_get_len(entry->id, SILC_ID_CHANNEL),
2896                                  entry->mode);
2897
2898   server->stat.my_channels++;
2899
2900   return entry;
2901 }
2902
2903 /* Channel's key re-key timeout callback. */
2904
2905 SILC_TASK_CALLBACK(silc_server_channel_key_rekey)
2906 {
2907   SilcServerChannelRekey rekey = (SilcServerChannelRekey)context;
2908   SilcServer server = (SilcServer)rekey->context;
2909
2910   rekey->task = NULL;
2911
2912   if (!silc_server_create_channel_key(server, rekey->channel, rekey->key_len))
2913     return;
2914
2915   silc_server_send_channel_key(server, NULL, rekey->channel, FALSE);
2916 }
2917
2918 /* Generates new channel key. This is used to create the initial channel key
2919    but also to re-generate new key for channel. If `key_len' is provided
2920    it is the bytes of the key length. */
2921
2922 bool silc_server_create_channel_key(SilcServer server, 
2923                                     SilcChannelEntry channel,
2924                                     uint32 key_len)
2925 {
2926   int i;
2927   unsigned char channel_key[32], hash[32];
2928   uint32 len;
2929
2930   SILC_LOG_DEBUG(("Generating channel key"));
2931
2932   if (channel->mode & SILC_CHANNEL_MODE_PRIVKEY) {
2933     SILC_LOG_DEBUG(("Channel has private keys, will not generate new key"));
2934     return TRUE;
2935   }
2936
2937   if (!channel->channel_key)
2938     if (!silc_cipher_alloc(SILC_DEFAULT_CIPHER, &channel->channel_key)) {
2939       channel->channel_key = NULL;
2940       return FALSE;
2941     }
2942
2943   if (key_len)
2944     len = key_len;
2945   else if (channel->key_len)
2946     len = channel->key_len / 8;
2947   else
2948     len = silc_cipher_get_key_len(channel->channel_key) / 8;
2949
2950   /* Create channel key */
2951   for (i = 0; i < len; i++) channel_key[i] = silc_rng_get_byte(server->rng);
2952   
2953   /* Set the key */
2954   silc_cipher_set_key(channel->channel_key, channel_key, len * 8);
2955
2956   /* Remove old key if exists */
2957   if (channel->key) {
2958     memset(channel->key, 0, channel->key_len / 8);
2959     silc_free(channel->key);
2960   }
2961
2962   /* Save the key */
2963   channel->key_len = len * 8;
2964   channel->key = silc_calloc(len, sizeof(*channel->key));
2965   memcpy(channel->key, channel_key, len);
2966   memset(channel_key, 0, sizeof(channel_key));
2967
2968   /* Generate HMAC key from the channel key data and set it */
2969   if (!channel->hmac)
2970     silc_hmac_alloc(SILC_DEFAULT_HMAC, NULL, &channel->hmac);
2971   silc_hash_make(silc_hmac_get_hash(channel->hmac), channel->key, len, hash);
2972   silc_hmac_set_key(channel->hmac, hash, 
2973                     silc_hash_len(silc_hmac_get_hash(channel->hmac)));
2974   memset(hash, 0, sizeof(hash));
2975
2976   if (server->server_type == SILC_ROUTER) {
2977     if (!channel->rekey)
2978       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
2979     channel->rekey->context = (void *)server;
2980     channel->rekey->channel = channel;
2981     channel->rekey->key_len = key_len;
2982     if (channel->rekey->task)
2983       silc_schedule_task_del(server->schedule, channel->rekey->task);
2984
2985     channel->rekey->task = 
2986       silc_schedule_task_add(server->schedule, 0, 
2987                              silc_server_channel_key_rekey,
2988                              (void *)channel->rekey, 3600, 0,
2989                              SILC_TASK_TIMEOUT,
2990                              SILC_TASK_PRI_NORMAL);
2991   }
2992
2993   return TRUE;
2994 }
2995
2996 /* Saves the channel key found in the encoded `key_payload' buffer. This 
2997    function is used when we receive Channel Key Payload and also when we're
2998    processing JOIN command reply. Returns entry to the channel. */
2999
3000 SilcChannelEntry silc_server_save_channel_key(SilcServer server,
3001                                               SilcBuffer key_payload,
3002                                               SilcChannelEntry channel)
3003 {
3004   SilcChannelKeyPayload payload = NULL;
3005   SilcChannelID *id = NULL;
3006   unsigned char *tmp, hash[32];
3007   uint32 tmp_len;
3008   char *cipher;
3009
3010   SILC_LOG_DEBUG(("Start"));
3011
3012   /* Decode channel key payload */
3013   payload = silc_channel_key_payload_parse(key_payload->data,
3014                                            key_payload->len);
3015   if (!payload) {
3016     SILC_LOG_ERROR(("Bad channel key payload, dropped"));
3017     channel = NULL;
3018     goto out;
3019   }
3020
3021   /* Get the channel entry */
3022   if (!channel) {
3023
3024     /* Get channel ID */
3025     tmp = silc_channel_key_get_id(payload, &tmp_len);
3026     id = silc_id_str2id(tmp, tmp_len, SILC_ID_CHANNEL);
3027     if (!id) {
3028       channel = NULL;
3029       goto out;
3030     }
3031
3032     channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
3033     if (!channel) {
3034       channel = silc_idlist_find_channel_by_id(server->global_list, id, NULL);
3035       if (!channel) {
3036         SILC_LOG_ERROR(("Received key for non-existent channel"));
3037         goto out;
3038       }
3039     }
3040   }
3041
3042   tmp = silc_channel_key_get_key(payload, &tmp_len);
3043   if (!tmp) {
3044     channel = NULL;
3045     goto out;
3046   }
3047
3048   cipher = silc_channel_key_get_cipher(payload, NULL);
3049   if (!cipher) {
3050     channel = NULL;
3051     goto out;
3052   }
3053
3054   /* Remove old key if exists */
3055   if (channel->key) {
3056     memset(channel->key, 0, channel->key_len / 8);
3057     silc_free(channel->key);
3058     silc_cipher_free(channel->channel_key);
3059   }
3060
3061   /* Create new cipher */
3062   if (!silc_cipher_alloc(cipher, &channel->channel_key)) {
3063     channel->channel_key = NULL;
3064     channel = NULL;
3065     goto out;
3066   }
3067
3068   if (channel->cipher)
3069     silc_free(channel->cipher);
3070   channel->cipher = strdup(cipher);
3071
3072   /* Save the key */
3073   channel->key_len = tmp_len * 8;
3074   channel->key = silc_calloc(tmp_len, sizeof(unsigned char));
3075   memcpy(channel->key, tmp, tmp_len);
3076   silc_cipher_set_key(channel->channel_key, tmp, channel->key_len);
3077
3078   /* Generate HMAC key from the channel key data and set it */
3079   if (!channel->hmac)
3080     silc_hmac_alloc(SILC_DEFAULT_HMAC, NULL, &channel->hmac);
3081   silc_hash_make(silc_hmac_get_hash(channel->hmac), tmp, tmp_len, hash);
3082   silc_hmac_set_key(channel->hmac, hash, 
3083                     silc_hash_len(silc_hmac_get_hash(channel->hmac)));
3084
3085   memset(hash, 0, sizeof(hash));
3086   memset(tmp, 0, tmp_len);
3087
3088   if (server->server_type == SILC_ROUTER) {
3089     if (!channel->rekey)
3090       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
3091     channel->rekey->context = (void *)server;
3092     channel->rekey->channel = channel;
3093     if (channel->rekey->task)
3094       silc_schedule_task_del(server->schedule, channel->rekey->task);
3095
3096     channel->rekey->task = 
3097       silc_schedule_task_add(server->schedule, 0, 
3098                              silc_server_channel_key_rekey,
3099                              (void *)channel->rekey, 3600, 0,
3100                              SILC_TASK_TIMEOUT,
3101                              SILC_TASK_PRI_NORMAL);
3102   }
3103
3104  out:
3105   silc_free(id);
3106   if (payload)
3107     silc_channel_key_payload_free(payload);
3108
3109   return channel;
3110 }
3111
3112 /* Heartbeat callback. This function is set as argument for the
3113    silc_socket_set_heartbeat function. The library will call this function
3114    at the set time interval. */
3115
3116 void silc_server_perform_heartbeat(SilcSocketConnection sock,
3117                                    void *hb_context)
3118 {
3119   SilcServerHBContext hb = (SilcServerHBContext)hb_context;
3120
3121   SILC_LOG_DEBUG(("Sending heartbeat to %s (%s)", sock->hostname,
3122                   sock->ip));
3123
3124   /* Send the heartbeat */
3125   silc_server_send_heartbeat(hb->server, sock);
3126 }
3127
3128 /* Returns assembled of all servers in the given ID list. The packet's
3129    form is dictated by the New ID payload. */
3130
3131 static void silc_server_announce_get_servers(SilcServer server,
3132                                              SilcServerEntry remote,
3133                                              SilcIDList id_list,
3134                                              SilcBuffer *servers,
3135                                              unsigned long creation_time)
3136 {
3137   SilcIDCacheList list;
3138   SilcIDCacheEntry id_cache;
3139   SilcServerEntry entry;
3140   SilcBuffer idp;
3141
3142   /* Go through all clients in the list */
3143   if (silc_idcache_get_all(id_list->servers, &list)) {
3144     if (silc_idcache_list_first(list, &id_cache)) {
3145       while (id_cache) {
3146         entry = (SilcServerEntry)id_cache->context;
3147
3148         /* Do not announce the one we've sending our announcements and
3149            do not announce ourself. Also check the creation time if it's
3150            provided. */
3151         if ((entry == remote) || (entry == server->id_entry) ||
3152             (creation_time && entry->data.created < creation_time)) {
3153           if (!silc_idcache_list_next(list, &id_cache))
3154             break;
3155           continue;
3156         }
3157
3158         idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
3159
3160         *servers = silc_buffer_realloc(*servers, 
3161                                        (*servers ? 
3162                                         (*servers)->truelen + idp->len : 
3163                                         idp->len));
3164         silc_buffer_pull_tail(*servers, ((*servers)->end - (*servers)->data));
3165         silc_buffer_put(*servers, idp->data, idp->len);
3166         silc_buffer_pull(*servers, idp->len);
3167         silc_buffer_free(idp);
3168
3169         if (!silc_idcache_list_next(list, &id_cache))
3170           break;
3171       }
3172     }
3173
3174     silc_idcache_list_free(list);
3175   }
3176 }
3177
3178 static SilcBuffer 
3179 silc_server_announce_encode_notify(SilcNotifyType notify, uint32 argc, ...)
3180 {
3181   va_list ap;
3182   SilcBuffer p;
3183
3184   va_start(ap, argc);
3185   p = silc_notify_payload_encode(notify, argc, ap);
3186   va_end(ap);
3187  
3188   return p;
3189 }
3190
3191 /* This function is used by router to announce existing servers to our
3192    primary router when we've connected to it. If `creation_time' is non-zero
3193    then only the servers that has been created after the `creation_time'
3194    will be announced. */
3195
3196 void silc_server_announce_servers(SilcServer server, bool global,
3197                                   unsigned long creation_time,
3198                                   SilcSocketConnection remote)
3199 {
3200   SilcBuffer servers = NULL;
3201
3202   SILC_LOG_DEBUG(("Announcing servers"));
3203
3204   /* Get servers in local list */
3205   silc_server_announce_get_servers(server, remote->user_data,
3206                                    server->local_list, &servers,
3207                                    creation_time);
3208
3209   if (global)
3210     /* Get servers in global list */
3211     silc_server_announce_get_servers(server, remote->user_data,
3212                                      server->global_list, &servers,
3213                                      creation_time);
3214
3215   if (servers) {
3216     silc_buffer_push(servers, servers->data - servers->head);
3217     SILC_LOG_HEXDUMP(("servers"), servers->data, servers->len);
3218
3219     /* Send the packet */
3220     silc_server_packet_send(server, remote,
3221                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3222                             servers->data, servers->len, TRUE);
3223
3224     silc_buffer_free(servers);
3225   }
3226 }
3227
3228 /* Returns assembled packet of all clients in the given ID list. The
3229    packet's form is dictated by the New ID Payload. */
3230
3231 static void silc_server_announce_get_clients(SilcServer server,
3232                                              SilcIDList id_list,
3233                                              SilcBuffer *clients,
3234                                              SilcBuffer *umodes,
3235                                              unsigned long creation_time)
3236 {
3237   SilcIDCacheList list;
3238   SilcIDCacheEntry id_cache;
3239   SilcClientEntry client;
3240   SilcBuffer idp;
3241   SilcBuffer tmp;
3242   unsigned char mode[4];
3243
3244   /* Go through all clients in the list */
3245   if (silc_idcache_get_all(id_list->clients, &list)) {
3246     if (silc_idcache_list_first(list, &id_cache)) {
3247       while (id_cache) {
3248         client = (SilcClientEntry)id_cache->context;
3249
3250         if (creation_time && client->data.created < creation_time) {
3251           if (!silc_idcache_list_next(list, &id_cache))
3252             break;
3253           continue;
3254         }
3255
3256         idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
3257
3258         *clients = silc_buffer_realloc(*clients, 
3259                                        (*clients ? 
3260                                         (*clients)->truelen + idp->len : 
3261                                         idp->len));
3262         silc_buffer_pull_tail(*clients, ((*clients)->end - (*clients)->data));
3263         silc_buffer_put(*clients, idp->data, idp->len);
3264         silc_buffer_pull(*clients, idp->len);
3265
3266         SILC_PUT32_MSB(client->mode, mode);
3267         tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_UMODE_CHANGE,
3268                                                  2, idp->data, idp->len,
3269                                                  mode, 4);
3270         *umodes = silc_buffer_realloc(*umodes, 
3271                                       (*umodes ? 
3272                                        (*umodes)->truelen + tmp->len :  
3273                                        tmp->len));
3274         silc_buffer_pull_tail(*umodes, ((*umodes)->end - (*umodes)->data));
3275         silc_buffer_put(*umodes, tmp->data, tmp->len);
3276         silc_buffer_pull(*umodes, tmp->len);
3277         silc_buffer_free(tmp);
3278
3279         silc_buffer_free(idp);
3280
3281         if (!silc_idcache_list_next(list, &id_cache))
3282           break;
3283       }
3284     }
3285
3286     silc_idcache_list_free(list);
3287   }
3288 }
3289
3290 /* This function is used to announce our existing clients to our router
3291    when we've connected to it. If `creation_time' is non-zero then only
3292    the clients that has been created after the `creation_time' will be
3293    announced. */
3294
3295 void silc_server_announce_clients(SilcServer server,
3296                                   unsigned long creation_time,
3297                                   SilcSocketConnection remote)
3298 {
3299   SilcBuffer clients = NULL;
3300   SilcBuffer umodes = NULL;
3301
3302   SILC_LOG_DEBUG(("Announcing clients"));
3303
3304   /* Get clients in local list */
3305   silc_server_announce_get_clients(server, server->local_list,
3306                                    &clients, &umodes, creation_time);
3307
3308   /* As router we announce our global list as well */
3309   if (server->server_type == SILC_ROUTER)
3310     silc_server_announce_get_clients(server, server->global_list,
3311                                      &clients, &umodes, creation_time);
3312
3313   if (clients) {
3314     silc_buffer_push(clients, clients->data - clients->head);
3315     SILC_LOG_HEXDUMP(("clients"), clients->data, clients->len);
3316
3317     /* Send the packet */
3318     silc_server_packet_send(server, remote,
3319                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3320                             clients->data, clients->len, TRUE);
3321
3322     silc_buffer_free(clients);
3323   }
3324
3325   if (umodes) {
3326     silc_buffer_push(umodes, umodes->data - umodes->head);
3327     SILC_LOG_HEXDUMP(("umodes"), umodes->data, umodes->len);
3328
3329     /* Send the packet */
3330     silc_server_packet_send(server, remote,
3331                             SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3332                             umodes->data, umodes->len, TRUE);
3333
3334     silc_buffer_free(umodes);
3335   }
3336 }
3337
3338 /* Returns channel's topic for announcing it */
3339
3340 void silc_server_announce_get_channel_topic(SilcServer server,
3341                                             SilcChannelEntry channel,
3342                                             SilcBuffer *topic)
3343 {
3344   SilcBuffer chidp;
3345
3346   if (channel->topic) {
3347     chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
3348     *topic = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_TOPIC_SET, 2,
3349                                                 chidp->data, chidp->len,
3350                                                 channel->topic, 
3351                                                 strlen(channel->topic));
3352     silc_buffer_free(chidp);
3353   }
3354 }
3355
3356 /* Returns assembled packets for channel users of the `channel'. */
3357
3358 void silc_server_announce_get_channel_users(SilcServer server,
3359                                             SilcChannelEntry channel,
3360                                             SilcBuffer *channel_users,
3361                                             SilcBuffer *channel_users_modes)
3362 {
3363   SilcChannelClientEntry chl;
3364   SilcHashTableList htl;
3365   SilcBuffer chidp, clidp;
3366   SilcBuffer tmp;
3367   int len;
3368   unsigned char mode[4];
3369
3370   SILC_LOG_DEBUG(("Start"));
3371
3372   /* Now find all users on the channel */
3373   chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
3374   silc_hash_table_list(channel->user_list, &htl);
3375   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3376     clidp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3377
3378     /* JOIN Notify */
3379     tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_JOIN, 2, 
3380                                              clidp->data, clidp->len,
3381                                              chidp->data, chidp->len);
3382     len = tmp->len;
3383     *channel_users = 
3384       silc_buffer_realloc(*channel_users, 
3385                           (*channel_users ? 
3386                            (*channel_users)->truelen + len : len));
3387     silc_buffer_pull_tail(*channel_users, 
3388                           ((*channel_users)->end - 
3389                            (*channel_users)->data));
3390     
3391     silc_buffer_put(*channel_users, tmp->data, tmp->len);
3392     silc_buffer_pull(*channel_users, len);
3393     silc_buffer_free(tmp);
3394
3395     /* CUMODE notify for mode change on the channel */
3396     SILC_PUT32_MSB(chl->mode, mode);
3397     tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_CUMODE_CHANGE, 
3398                                              3, clidp->data, clidp->len,
3399                                              mode, 4,
3400                                              clidp->data, clidp->len);
3401     len = tmp->len;
3402     *channel_users_modes = 
3403       silc_buffer_realloc(*channel_users_modes, 
3404                           (*channel_users_modes ? 
3405                            (*channel_users_modes)->truelen + len : len));
3406     silc_buffer_pull_tail(*channel_users_modes, 
3407                           ((*channel_users_modes)->end - 
3408                            (*channel_users_modes)->data));
3409     
3410     silc_buffer_put(*channel_users_modes, tmp->data, tmp->len);
3411     silc_buffer_pull(*channel_users_modes, len);
3412     silc_buffer_free(tmp);
3413
3414     silc_buffer_free(clidp);
3415   }
3416   silc_buffer_free(chidp);
3417 }
3418
3419 /* Returns assembled packets for all channels and users on those channels
3420    from the given ID List. The packets are in the form dictated by the
3421    New Channel and New Channel User payloads. */
3422
3423 void silc_server_announce_get_channels(SilcServer server,
3424                                        SilcIDList id_list,
3425                                        SilcBuffer *channels,
3426                                        SilcBuffer *channel_users,
3427                                        SilcBuffer **channel_users_modes,
3428                                        uint32 *channel_users_modes_c,
3429                                        SilcBuffer **channel_topics,
3430                                        SilcChannelID ***channel_ids,
3431                                        unsigned long creation_time)
3432 {
3433   SilcIDCacheList list;
3434   SilcIDCacheEntry id_cache;
3435   SilcChannelEntry channel;
3436   unsigned char *cid;
3437   uint32 id_len;
3438   uint16 name_len;
3439   int len;
3440   int i = *channel_users_modes_c;
3441   bool announce;
3442
3443   SILC_LOG_DEBUG(("Start"));
3444
3445   /* Go through all channels in the list */
3446   if (silc_idcache_get_all(id_list->channels, &list)) {
3447     if (silc_idcache_list_first(list, &id_cache)) {
3448       while (id_cache) {
3449         channel = (SilcChannelEntry)id_cache->context;
3450
3451         if (creation_time && channel->created < creation_time)
3452           announce = FALSE;
3453         else
3454           announce = TRUE;
3455
3456         cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3457         id_len = silc_id_get_len(channel->id, SILC_ID_CHANNEL);
3458         name_len = strlen(channel->channel_name);
3459
3460         if (announce) {
3461           len = 4 + name_len + id_len + 4;
3462           *channels = 
3463             silc_buffer_realloc(*channels, 
3464                                 (*channels ? (*channels)->truelen + 
3465                                  len : len));
3466           silc_buffer_pull_tail(*channels, 
3467                                 ((*channels)->end - (*channels)->data));
3468           silc_buffer_format(*channels,
3469                              SILC_STR_UI_SHORT(name_len),
3470                              SILC_STR_UI_XNSTRING(channel->channel_name, 
3471                                                   name_len),
3472                              SILC_STR_UI_SHORT(id_len),
3473                              SILC_STR_UI_XNSTRING(cid, id_len),
3474                              SILC_STR_UI_INT(channel->mode),
3475                              SILC_STR_END);
3476           silc_buffer_pull(*channels, len);
3477         }
3478
3479         /* Channel user modes */
3480         *channel_users_modes = silc_realloc(*channel_users_modes,
3481                                             sizeof(**channel_users_modes) * 
3482                                             (i + 1));
3483         (*channel_users_modes)[i] = NULL;
3484         *channel_ids = silc_realloc(*channel_ids, 
3485                                     sizeof(**channel_ids) * (i + 1));
3486         (*channel_ids)[i] = NULL;
3487         silc_server_announce_get_channel_users(server, channel,
3488                                                channel_users,
3489                                                &(*channel_users_modes)[i]);
3490         (*channel_ids)[i] = channel->id;
3491
3492         /* Channel's topic */
3493         *channel_topics = silc_realloc(*channel_topics,
3494                                        sizeof(**channel_topics) * (i + 1));
3495         (*channel_topics)[i] = NULL;
3496         silc_server_announce_get_channel_topic(server, channel,
3497                                                &(*channel_topics)[i]);
3498         i++;
3499
3500         if (!silc_idcache_list_next(list, &id_cache))
3501           break;
3502       }
3503
3504       *channel_users_modes_c += i;
3505     }
3506
3507     silc_idcache_list_free(list);
3508   }
3509 }
3510
3511 /* This function is used to announce our existing channels to our router
3512    when we've connected to it. This also announces the users on the
3513    channels to the router. If the `creation_time' is non-zero only the
3514    channels that was created after the `creation_time' are announced.
3515    Note that the channel users are still announced even if the `creation_time'
3516    was provided. */
3517
3518 void silc_server_announce_channels(SilcServer server,
3519                                    unsigned long creation_time,
3520                                    SilcSocketConnection remote)
3521 {
3522   SilcBuffer channels = NULL, channel_users = NULL;
3523   SilcBuffer *channel_users_modes = NULL;
3524   SilcBuffer *channel_topics = NULL;
3525   uint32 channel_users_modes_c = 0;
3526   SilcChannelID **channel_ids = NULL;
3527
3528   SILC_LOG_DEBUG(("Announcing channels and channel users"));
3529
3530   /* Get channels and channel users in local list */
3531   silc_server_announce_get_channels(server, server->local_list,
3532                                     &channels, &channel_users,
3533                                     &channel_users_modes,
3534                                     &channel_users_modes_c,
3535                                     &channel_topics,
3536                                     &channel_ids, creation_time);
3537
3538   /* Get channels and channel users in global list */
3539   if (server->server_type != SILC_SERVER)
3540     silc_server_announce_get_channels(server, server->global_list,
3541                                       &channels, &channel_users,
3542                                       &channel_users_modes,
3543                                       &channel_users_modes_c,
3544                                       &channel_topics,
3545                                       &channel_ids, creation_time);
3546
3547   if (channels) {
3548     silc_buffer_push(channels, channels->data - channels->head);
3549     SILC_LOG_HEXDUMP(("channels"), channels->data, channels->len);
3550
3551     /* Send the packet */
3552     silc_server_packet_send(server, remote,
3553                             SILC_PACKET_NEW_CHANNEL, SILC_PACKET_FLAG_LIST,
3554                             channels->data, channels->len,
3555                             FALSE);
3556
3557     silc_buffer_free(channels);
3558   }
3559
3560   if (channel_users) {
3561     silc_buffer_push(channel_users, channel_users->data - channel_users->head);
3562     SILC_LOG_HEXDUMP(("channel users"), channel_users->data, 
3563                      channel_users->len);
3564
3565     /* Send the packet */
3566     silc_server_packet_send(server, remote,
3567                             SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3568                             channel_users->data, channel_users->len,
3569                             FALSE);
3570
3571     silc_buffer_free(channel_users);
3572   }
3573
3574   if (channel_users_modes) {
3575     int i;
3576
3577     for (i = 0; i < channel_users_modes_c; i++) {
3578       silc_buffer_push(channel_users_modes[i], 
3579                        channel_users_modes[i]->data - 
3580                        channel_users_modes[i]->head);
3581       SILC_LOG_HEXDUMP(("channel users modes"), channel_users_modes[i]->data, 
3582                        channel_users_modes[i]->len);
3583       silc_server_packet_send_dest(server, remote,
3584                                    SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3585                                    channel_ids[i], SILC_ID_CHANNEL,
3586                                    channel_users_modes[i]->data, 
3587                                    channel_users_modes[i]->len,
3588                                    FALSE);
3589       silc_buffer_free(channel_users_modes[i]);
3590     }
3591     silc_free(channel_users_modes);
3592   }
3593
3594   if (channel_topics) {
3595     int i;
3596
3597     for (i = 0; i < channel_users_modes_c; i++) {
3598       if (!channel_topics[i])
3599         continue;
3600
3601       silc_buffer_push(channel_topics[i], 
3602                        channel_topics[i]->data - 
3603                        channel_topics[i]->head);
3604       SILC_LOG_HEXDUMP(("channel topic"), channel_topics[i]->data, 
3605                        channel_topics[i]->len);
3606       silc_server_packet_send_dest(server, remote,
3607                                    SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3608                                    channel_ids[i], SILC_ID_CHANNEL,
3609                                    channel_topics[i]->data, 
3610                                    channel_topics[i]->len,
3611                                    FALSE);
3612       silc_buffer_free(channel_topics[i]);
3613     }
3614     silc_free(channel_topics);
3615   }
3616
3617   silc_free(channel_ids);
3618 }
3619
3620 /* Failure timeout callback. If this is called then we will immediately
3621    process the received failure. We always process the failure with timeout
3622    since we do not want to blindly trust to received failure packets. 
3623    This won't be called (the timeout is cancelled) if the failure was
3624    bogus (it is bogus if remote does not close the connection after sending
3625    the failure). */
3626
3627 SILC_TASK_CALLBACK(silc_server_failure_callback)
3628 {
3629   SilcServerFailureContext f = (SilcServerFailureContext)context;
3630
3631   if (f->sock->protocol) {
3632     f->sock->protocol->state = SILC_PROTOCOL_STATE_FAILURE;
3633     silc_protocol_execute(f->sock->protocol, f->server->schedule, 0, 0);
3634   }
3635
3636   silc_free(f);
3637 }
3638
3639 /* Assembles user list and users mode list from the `channel'. */
3640
3641 void silc_server_get_users_on_channel(SilcServer server,
3642                                       SilcChannelEntry channel,
3643                                       SilcBuffer *user_list,
3644                                       SilcBuffer *mode_list,
3645                                       uint32 *user_count)
3646 {
3647   SilcChannelClientEntry chl;
3648   SilcHashTableList htl;
3649   SilcBuffer client_id_list;
3650   SilcBuffer client_mode_list;
3651   SilcBuffer idp;
3652   uint32 list_count = 0, len = 0;
3653
3654   silc_hash_table_list(channel->user_list, &htl);
3655   while (silc_hash_table_get(&htl, NULL, (void *)&chl))
3656     len += (silc_id_get_len(chl->client->id, SILC_ID_CLIENT) + 4);
3657
3658   client_id_list = silc_buffer_alloc(len);
3659   client_mode_list = 
3660     silc_buffer_alloc(4 * silc_hash_table_count(channel->user_list));
3661   silc_buffer_pull_tail(client_id_list, SILC_BUFFER_END(client_id_list));
3662   silc_buffer_pull_tail(client_mode_list, SILC_BUFFER_END(client_mode_list));
3663
3664   silc_hash_table_list(channel->user_list, &htl);
3665   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3666     /* Client ID */
3667     idp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3668     silc_buffer_put(client_id_list, idp->data, idp->len);
3669     silc_buffer_pull(client_id_list, idp->len);
3670     silc_buffer_free(idp);
3671
3672     /* Client's mode on channel */
3673     SILC_PUT32_MSB(chl->mode, client_mode_list->data);
3674     silc_buffer_pull(client_mode_list, 4);
3675
3676     list_count++;
3677   }
3678   silc_buffer_push(client_id_list, 
3679                    client_id_list->data - client_id_list->head);
3680   silc_buffer_push(client_mode_list, 
3681                    client_mode_list->data - client_mode_list->head);
3682
3683   *user_list = client_id_list;
3684   *mode_list = client_mode_list;
3685   *user_count = list_count;
3686 }
3687
3688 /* Saves users and their modes to the `channel'. */
3689
3690 void silc_server_save_users_on_channel(SilcServer server,
3691                                        SilcSocketConnection sock,
3692                                        SilcChannelEntry channel,
3693                                        SilcClientID *noadd,
3694                                        SilcBuffer user_list,
3695                                        SilcBuffer mode_list,
3696                                        uint32 user_count)
3697 {
3698   int i;
3699   uint16 idp_len;
3700   uint32 mode;
3701   SilcClientID *client_id;
3702   SilcClientEntry client;
3703   SilcIDCacheEntry cache;
3704   bool global;
3705
3706   for (i = 0; i < user_count; i++) {
3707     /* Client ID */
3708     SILC_GET16_MSB(idp_len, user_list->data + 2);
3709     idp_len += 4;
3710     client_id = silc_id_payload_parse_id(user_list->data, idp_len);
3711     silc_buffer_pull(user_list, idp_len);
3712     if (!client_id)
3713       continue;
3714
3715     /* Mode */
3716     SILC_GET32_MSB(mode, mode_list->data);
3717     silc_buffer_pull(mode_list, 4);
3718
3719     if (noadd && SILC_ID_CLIENT_COMPARE(client_id, noadd)) {
3720       silc_free(client_id);
3721       continue;
3722     }
3723
3724     global = FALSE;
3725     
3726     /* Check if we have this client cached already. */
3727     client = silc_idlist_find_client_by_id(server->local_list, client_id,
3728                                            server->server_type, &cache);
3729     if (!client) {
3730       client = silc_idlist_find_client_by_id(server->global_list, 
3731                                              client_id, server->server_type,
3732                                              &cache);
3733       global = TRUE;
3734     }
3735     if (!client) {
3736       /* If router did not find such Client ID in its lists then this must
3737          be bogus client or some router in the net is buggy. */
3738       if (server->server_type == SILC_ROUTER) {
3739         silc_free(client_id);
3740         continue;
3741       }
3742
3743       /* We don't have that client anywhere, add it. The client is added
3744          to global list since server didn't have it in the lists so it must be 
3745          global. */
3746       client = silc_idlist_add_client(server->global_list, NULL, NULL, NULL,
3747                                       silc_id_dup(client_id, SILC_ID_CLIENT), 
3748                                       sock->user_data, NULL, 0);
3749       if (!client) {
3750         SILC_LOG_ERROR(("Could not add new client to the ID Cache"));
3751         silc_free(client_id);
3752         continue;
3753       }
3754
3755       client->data.status |= SILC_IDLIST_STATUS_REGISTERED;
3756     } else {
3757       /* Found, if it is from global list we'll assure that we won't
3758          expire it now that the entry is on channel. */
3759       if (global)
3760         cache->expire = 0;
3761     }
3762
3763     silc_free(client_id);
3764
3765     if (!silc_server_client_on_channel(client, channel)) {
3766       /* Client was not on the channel, add it. */
3767       SilcChannelClientEntry chl = silc_calloc(1, sizeof(*chl));
3768       chl->client = client;
3769       chl->mode = mode;
3770       chl->channel = channel;
3771       silc_hash_table_add(channel->user_list, chl->client, chl);
3772       silc_hash_table_add(client->channels, chl->channel, chl);
3773     }
3774   }
3775 }
3776
3777 /* Lookups route to the client indicated by the `id_data'. The connection
3778    object and internal data object is returned. Returns NULL if route
3779    could not be found to the client. If the `client_id' is specified then
3780    it is used and the `id_data' is ignored. */
3781
3782 SilcSocketConnection silc_server_get_client_route(SilcServer server,
3783                                                   unsigned char *id_data,
3784                                                   uint32 id_len,
3785                                                   SilcClientID *client_id,
3786                                                   SilcIDListData *idata)
3787 {
3788   SilcClientID *id;
3789   SilcClientEntry client;
3790
3791   SILC_LOG_DEBUG(("Start"));
3792
3793   /* Decode destination Client ID */
3794   if (!client_id) {
3795     id = silc_id_str2id(id_data, id_len, SILC_ID_CLIENT);
3796     if (!id) {
3797       SILC_LOG_ERROR(("Could not decode destination Client ID, dropped"));
3798       return NULL;
3799     }
3800   } else {
3801     id = silc_id_dup(client_id, SILC_ID_CLIENT);
3802   }
3803
3804   /* If the destination belongs to our server we don't have to route
3805      the packet anywhere but to send it to the local destination. */
3806   client = silc_idlist_find_client_by_id(server->local_list, id, TRUE, NULL);
3807   if (client) {
3808     silc_free(id);
3809
3810     /* If we are router and the client has router then the client is in
3811        our cell but not directly connected to us. */
3812     if (server->server_type == SILC_ROUTER && client->router) {
3813       /* We are of course in this case the client's router thus the route
3814          to the client is the server who owns the client. So, we will send
3815          the packet to that server. */
3816       if (idata)
3817         *idata = (SilcIDListData)client->router;
3818       return client->router->connection;
3819     }
3820
3821     /* Seems that client really is directly connected to us */
3822     if (idata)
3823       *idata = (SilcIDListData)client;
3824     return client->connection;
3825   }
3826
3827   /* Destination belongs to someone not in this server. If we are normal
3828      server our action is to send the packet to our router. */
3829   if (server->server_type != SILC_ROUTER && !server->standalone) {
3830     silc_free(id);
3831     if (idata)
3832       *idata = (SilcIDListData)server->router;
3833     return server->router->connection;
3834   }
3835
3836   /* We are router and we will perform route lookup for the destination 
3837      and send the packet to fastest route. */
3838   if (server->server_type == SILC_ROUTER && !server->standalone) {
3839     /* Check first that the ID is valid */
3840     client = silc_idlist_find_client_by_id(server->global_list, id, 
3841                                            TRUE, NULL);
3842     if (client) {
3843       SilcSocketConnection dst_sock;
3844
3845       dst_sock = silc_server_route_get(server, id, SILC_ID_CLIENT);
3846
3847       silc_free(id);
3848       if (idata)
3849         *idata = (SilcIDListData)dst_sock->user_data;
3850       return dst_sock;
3851     }
3852   }
3853
3854   silc_free(id);
3855   return NULL;
3856 }
3857
3858 /* Encodes and returns channel list of channels the `client' has joined.
3859    Secret channels are not put to the list. */
3860
3861 SilcBuffer silc_server_get_client_channel_list(SilcServer server,
3862                                                SilcClientEntry client)
3863 {
3864   SilcBuffer buffer = NULL;
3865   SilcChannelEntry channel;
3866   SilcChannelClientEntry chl;
3867   SilcHashTableList htl;
3868   unsigned char *cid;
3869   uint32 id_len;
3870   uint16 name_len;
3871   int len;
3872
3873   silc_hash_table_list(client->channels, &htl);
3874   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3875     channel = chl->channel;
3876
3877     if (channel->mode & SILC_CHANNEL_MODE_SECRET ||
3878         channel->mode & SILC_CHANNEL_MODE_PRIVATE)
3879       continue;
3880
3881     cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3882     id_len = silc_id_get_len(channel->id, SILC_ID_CHANNEL);
3883     name_len = strlen(channel->channel_name);
3884     
3885     len = 4 + name_len + id_len + 4;
3886     buffer = silc_buffer_realloc(buffer, 
3887                                  (buffer ? (buffer)->truelen + len : len));
3888     silc_buffer_pull_tail(buffer, ((buffer)->end - (buffer)->data));
3889     silc_buffer_format(buffer,
3890                        SILC_STR_UI_SHORT(name_len),
3891                        SILC_STR_UI_XNSTRING(channel->channel_name, 
3892                                             name_len),
3893                        SILC_STR_UI_SHORT(id_len),
3894                        SILC_STR_UI_XNSTRING(cid, id_len),
3895                        SILC_STR_UI_INT(chl->mode), /* Client's mode */
3896                        SILC_STR_END);
3897     silc_buffer_pull(buffer, len);
3898     silc_free(cid);
3899   }
3900
3901   if (buffer)
3902     silc_buffer_push(buffer, buffer->data - buffer->head);
3903
3904   return buffer;
3905 }
3906
3907 /* Finds client entry by Client ID and if it is not found then resolves
3908    it using WHOIS command. */
3909
3910 SilcClientEntry silc_server_get_client_resolve(SilcServer server,
3911                                                SilcClientID *client_id)
3912 {
3913   SilcClientEntry client;
3914
3915   client = silc_idlist_find_client_by_id(server->local_list, client_id,
3916                                          TRUE, NULL);
3917   if (!client) {
3918     client = silc_idlist_find_client_by_id(server->global_list, 
3919                                            client_id, TRUE, NULL);
3920     if (!client && server->server_type == SILC_ROUTER)
3921       return NULL;
3922   }
3923
3924   if (!client && server->standalone)
3925     return NULL;
3926
3927   if (!client || !client->nickname || !client->username) {
3928     SilcBuffer buffer, idp;
3929
3930     client->data.status |= SILC_IDLIST_STATUS_RESOLVING;
3931     client->data.status &= ~SILC_IDLIST_STATUS_RESOLVED;
3932     client->resolve_cmd_ident = ++server->cmd_ident;
3933
3934     idp = silc_id_payload_encode(client_id, SILC_ID_CLIENT);
3935     buffer = silc_command_payload_encode_va(SILC_COMMAND_WHOIS,
3936                                             server->cmd_ident, 1,
3937                                             3, idp->data, idp->len);
3938     silc_server_packet_send(server, client ? client->router->connection :
3939                             server->router->connection,
3940                             SILC_PACKET_COMMAND, 0,
3941                             buffer->data, buffer->len, FALSE);
3942     silc_buffer_free(idp);
3943     silc_buffer_free(buffer);
3944     return NULL;
3945   }
3946
3947   return client;
3948 }
3949
3950 /* A timeout callback for the re-key. We will be the initiator of the
3951    re-key protocol. */
3952
3953 SILC_TASK_CALLBACK(silc_server_rekey_callback)
3954 {
3955   SilcSocketConnection sock = (SilcSocketConnection)context;
3956   SilcIDListData idata = (SilcIDListData)sock->user_data;
3957   SilcServer server = (SilcServer)idata->rekey->context;
3958   SilcProtocol protocol;
3959   SilcServerRekeyInternalContext *proto_ctx;
3960
3961   SILC_LOG_DEBUG(("Start"));
3962
3963   /* Allocate internal protocol context. This is sent as context
3964      to the protocol. */
3965   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
3966   proto_ctx->server = (void *)server;
3967   proto_ctx->sock = sock;
3968   proto_ctx->responder = FALSE;
3969   proto_ctx->pfs = idata->rekey->pfs;
3970       
3971   /* Perform rekey protocol. Will call the final callback after the
3972      protocol is over. */
3973   silc_protocol_alloc(SILC_PROTOCOL_SERVER_REKEY, 
3974                       &protocol, proto_ctx, silc_server_rekey_final);
3975   sock->protocol = protocol;
3976       
3977   /* Run the protocol */
3978   silc_protocol_execute(protocol, server->schedule, 0, 0);
3979
3980   /* Re-register re-key timeout */
3981   silc_schedule_task_add(server->schedule, sock->sock, 
3982                          silc_server_rekey_callback,
3983                          context, idata->rekey->timeout, 0,
3984                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
3985 }
3986
3987 /* The final callback for the REKEY protocol. This will actually take the
3988    new key material into use. */
3989
3990 SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final)
3991 {
3992   SilcProtocol protocol = (SilcProtocol)context;
3993   SilcServerRekeyInternalContext *ctx =
3994     (SilcServerRekeyInternalContext *)protocol->context;
3995   SilcServer server = (SilcServer)ctx->server;
3996   SilcSocketConnection sock = ctx->sock;
3997
3998   SILC_LOG_DEBUG(("Start"));
3999
4000   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
4001       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
4002     /* Error occured during protocol */
4003     SILC_LOG_ERROR(("Error occurred during rekey protocol"));
4004     silc_protocol_cancel(protocol, server->schedule);
4005     silc_protocol_free(protocol);
4006     sock->protocol = NULL;
4007     if (ctx->packet)
4008       silc_packet_context_free(ctx->packet);
4009     if (ctx->ske)
4010       silc_ske_free(ctx->ske);
4011     silc_free(ctx);
4012     return;
4013   }
4014
4015   /* Purge the outgoing data queue to assure that all rekey packets really
4016      go to the network before we quit the protocol. */
4017   silc_server_packet_queue_purge(server, sock);
4018
4019   /* Cleanup */
4020   silc_protocol_free(protocol);
4021   sock->protocol = NULL;
4022   if (ctx->packet)
4023     silc_packet_context_free(ctx->packet);
4024   if (ctx->ske)
4025     silc_ske_free(ctx->ske);
4026   silc_free(ctx);
4027 }