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