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