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