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