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