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