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, 30, hb_context,
888                             silc_server_perform_heartbeat,
889                             server->timeout_queue);
890
891   /* Register re-key timeout */
892   idata->rekey->timeout = 60; /* 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, 30, 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;
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   int ret;
1435
1436   SILC_LOG_DEBUG(("Start"));
1437
1438   /* Decrypt the received packet */
1439   ret = silc_packet_decrypt(parse_ctx->cipher, parse_ctx->hmac, 
1440                             packet->buffer, packet,
1441                             silc_server_packet_decrypt_check, parse_ctx);
1442   if (ret < 0)
1443     goto out;
1444
1445   if (ret == 0) {
1446     /* Parse the packet. Packet type is returned. */
1447     ret = silc_packet_parse(packet);
1448   } else {
1449     /* Parse the packet header in special way as this is "special"
1450        packet type. */
1451     ret = silc_packet_parse_special(packet);
1452   }
1453
1454   if (ret == SILC_PACKET_NONE)
1455     goto out;
1456
1457   /* Check that the the current client ID is same as in the client's packet. */
1458   if (sock->type == SILC_SOCKET_TYPE_CLIENT) {
1459     SilcClientEntry client = (SilcClientEntry)sock->user_data;
1460     if (client && client->id) {
1461       void *id = silc_id_str2id(packet->src_id, packet->src_id_len,
1462                                 packet->src_id_type);
1463       if (SILC_ID_CLIENT_COMPARE(client->id, id)) {
1464         silc_free(id);
1465         goto out;
1466       }
1467       silc_free(id);
1468     }
1469   }
1470
1471   if (server->server_type == SILC_ROUTER) {
1472     /* Route the packet if it is not destined to us. Other ID types but
1473        server are handled separately after processing them. */
1474     if (packet->dst_id_type == SILC_ID_SERVER && 
1475         sock->type != SILC_SOCKET_TYPE_CLIENT &&
1476         SILC_ID_SERVER_COMPARE(packet->dst_id, server->id_string)) {
1477       
1478       /* Route the packet to fastest route for the destination ID */
1479       void *id = silc_id_str2id(packet->dst_id, packet->dst_id_len, 
1480                                 packet->dst_id_type);
1481       if (!id)
1482         goto out;
1483       silc_server_packet_route(server,
1484                                silc_server_route_get(server, id,
1485                                                      packet->dst_id_type),
1486                                packet);
1487       silc_free(id);
1488       goto out;
1489     }
1490     
1491     /* Broadcast packet if it is marked as broadcast packet and it is
1492        originated from router and we are router. */
1493     if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
1494         packet->flags & SILC_PACKET_FLAG_BROADCAST) {
1495       silc_server_packet_broadcast(server, server->router->connection, packet);
1496     }
1497   }
1498
1499   /* Parse the incoming packet type */
1500   silc_server_packet_parse_type(server, sock, packet);
1501
1502  out:
1503   /*  silc_buffer_clear(sock->inbuf); */
1504   silc_packet_context_free(packet);
1505   silc_free(parse_ctx);
1506 }
1507
1508 /* Parser callback called by silc_packet_receive_process. This merely
1509    registers timeout that will handle the actual parsing when appropriate. */
1510
1511 void silc_server_packet_parse(SilcPacketParserContext *parser_context)
1512 {
1513   SilcServer server = (SilcServer)parser_context->context;
1514   SilcSocketConnection sock = parser_context->sock;
1515
1516   switch (sock->type) {
1517   case SILC_SOCKET_TYPE_UNKNOWN:
1518     /* Parse the packet with timeout */
1519     silc_task_register(server->timeout_queue, sock->sock,
1520                        silc_server_packet_parse_real,
1521                        (void *)parser_context, 0, 100000,
1522                        SILC_TASK_TIMEOUT,
1523                        SILC_TASK_PRI_NORMAL);
1524     break;
1525   case SILC_SOCKET_TYPE_CLIENT:
1526     /* Parse the packet with timeout (unless protocol is active) */
1527
1528     /* If REKEY protocol is active we must proccess the packets synchronously
1529        since we must assure that incoming packets that are encrypted with
1530        the old key is processed before the new keys is set to use. */
1531     if (SILC_SERVER_IS_REKEY(sock))
1532       silc_server_packet_parse_real(server->timeout_queue, SILC_TASK_READ,
1533                                     (void *)parser_context, sock->sock);
1534     else
1535       silc_task_register(server->timeout_queue, sock->sock,
1536                          silc_server_packet_parse_real,
1537                          (void *)parser_context, 0, 
1538                          (sock->protocol ? 1 : 100000),
1539                          SILC_TASK_TIMEOUT,
1540                          SILC_TASK_PRI_NORMAL);
1541     break;
1542   case SILC_SOCKET_TYPE_SERVER:
1543   case SILC_SOCKET_TYPE_ROUTER:
1544     /* Packets from servers are parsed as soon as possible */
1545
1546     /* If REKEY protocol is active we must proccess the packets synchronously
1547        since we must assure that incoming packets that are encrypted with
1548        the old key is processed before the new keys is set to use. */
1549     if (SILC_SERVER_IS_REKEY(sock))
1550       silc_server_packet_parse_real(server->timeout_queue, SILC_TASK_READ,
1551                                     (void *)parser_context, sock->sock);
1552     else
1553       silc_task_register(server->timeout_queue, sock->sock,
1554                          silc_server_packet_parse_real,
1555                          (void *)parser_context, 0, 1,
1556                          SILC_TASK_TIMEOUT,
1557                          SILC_TASK_PRI_NORMAL);
1558     break;
1559   default:
1560     return;
1561   }
1562 }
1563
1564 /* Parses the packet type and calls what ever routines the packet type
1565    requires. This is done for all incoming packets. */
1566
1567 void silc_server_packet_parse_type(SilcServer server, 
1568                                    SilcSocketConnection sock,
1569                                    SilcPacketContext *packet)
1570 {
1571   SilcPacketType type = packet->type;
1572
1573   SILC_LOG_DEBUG(("Parsing packet type %d", type));
1574
1575   /* Parse the packet type */
1576   switch(type) {
1577   case SILC_PACKET_DISCONNECT:
1578     SILC_LOG_DEBUG(("Disconnect packet"));
1579     if (packet->flags & SILC_PACKET_FLAG_LIST)
1580       break;
1581     break;
1582
1583   case SILC_PACKET_SUCCESS:
1584     /*
1585      * Success received for something. For now we can have only
1586      * one protocol for connection executing at once hence this
1587      * success message is for whatever protocol is executing currently.
1588      */
1589     SILC_LOG_DEBUG(("Success packet"));
1590     if (packet->flags & SILC_PACKET_FLAG_LIST)
1591       break;
1592     if (sock->protocol) {
1593       sock->protocol->execute(server->timeout_queue, 0,
1594                               sock->protocol, sock->sock, 0, 0);
1595     }
1596     break;
1597
1598   case SILC_PACKET_FAILURE:
1599     /*
1600      * Failure received for something. For now we can have only
1601      * one protocol for connection executing at once hence this
1602      * failure message is for whatever protocol is executing currently.
1603      */
1604     SILC_LOG_DEBUG(("Failure packet"));
1605     if (packet->flags & SILC_PACKET_FLAG_LIST)
1606       break;
1607     if (sock->protocol) {
1608       SilcServerFailureContext f;
1609       f = silc_calloc(1, sizeof(*f));
1610       f->server = server;
1611       f->sock = sock;
1612       
1613       /* We will wait 5 seconds to process this failure packet */
1614       silc_task_register(server->timeout_queue, sock->sock,
1615                          silc_server_failure_callback, (void *)f, 5, 0,
1616                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
1617     }
1618     break;
1619
1620   case SILC_PACKET_REJECT:
1621     SILC_LOG_DEBUG(("Reject packet"));
1622     if (packet->flags & SILC_PACKET_FLAG_LIST)
1623       break;
1624     return;
1625     break;
1626
1627   case SILC_PACKET_NOTIFY:
1628     /*
1629      * Received notify packet. Server can receive notify packets from
1630      * router. Server then relays the notify messages to clients if needed.
1631      */
1632     SILC_LOG_DEBUG(("Notify packet"));
1633     if (packet->flags & SILC_PACKET_FLAG_LIST)
1634       silc_server_notify_list(server, sock, packet);
1635     else
1636       silc_server_notify(server, sock, packet);
1637     break;
1638
1639     /* 
1640      * Channel packets
1641      */
1642   case SILC_PACKET_CHANNEL_MESSAGE:
1643     /*
1644      * Received channel message. Channel messages are special packets
1645      * (although probably most common ones) thus they are handled
1646      * specially.
1647      */
1648     SILC_LOG_DEBUG(("Channel Message packet"));
1649     if (packet->flags & SILC_PACKET_FLAG_LIST)
1650       break;
1651     silc_server_channel_message(server, sock, packet);
1652     break;
1653
1654   case SILC_PACKET_CHANNEL_KEY:
1655     /*
1656      * Received key for channel. As channels are created by the router
1657      * the keys are as well. We will distribute the key to all of our
1658      * locally connected clients on the particular channel. Router
1659      * never receives this channel and thus is ignored.
1660      */
1661     SILC_LOG_DEBUG(("Channel Key packet"));
1662     if (packet->flags & SILC_PACKET_FLAG_LIST)
1663       break;
1664     silc_server_channel_key(server, sock, packet);
1665     break;
1666
1667     /*
1668      * Command packets
1669      */
1670   case SILC_PACKET_COMMAND:
1671     /*
1672      * Recived command. Processes the command request and allocates the
1673      * command context and calls the command.
1674      */
1675     SILC_LOG_DEBUG(("Command packet"));
1676     if (packet->flags & SILC_PACKET_FLAG_LIST)
1677       break;
1678     silc_server_command_process(server, sock, packet);
1679     break;
1680
1681   case SILC_PACKET_COMMAND_REPLY:
1682     /*
1683      * Received command reply packet. Received command reply to command. It
1684      * may be reply to command sent by us or reply to command sent by client
1685      * that we've routed further.
1686      */
1687     SILC_LOG_DEBUG(("Command Reply packet"));
1688     if (packet->flags & SILC_PACKET_FLAG_LIST)
1689       break;
1690     silc_server_command_reply(server, sock, packet);
1691     break;
1692
1693     /*
1694      * Private Message packets
1695      */
1696   case SILC_PACKET_PRIVATE_MESSAGE:
1697     /*
1698      * Received private message packet. The packet is coming from either
1699      * client or server.
1700      */
1701     SILC_LOG_DEBUG(("Private Message packet"));
1702     if (packet->flags & SILC_PACKET_FLAG_LIST)
1703       break;
1704     silc_server_private_message(server, sock, packet);
1705     break;
1706
1707   case SILC_PACKET_PRIVATE_MESSAGE_KEY:
1708     /*
1709      * Private message key packet.
1710      */
1711     if (packet->flags & SILC_PACKET_FLAG_LIST)
1712       break;
1713     silc_server_private_message_key(server, sock, packet);
1714     break;
1715
1716     /*
1717      * Key Exchange protocol packets
1718      */
1719   case SILC_PACKET_KEY_EXCHANGE:
1720     SILC_LOG_DEBUG(("KE packet"));
1721     if (packet->flags & SILC_PACKET_FLAG_LIST)
1722       break;
1723
1724     if (sock->protocol && sock->protocol->protocol &&
1725         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1726
1727       SilcServerKEInternalContext *proto_ctx = 
1728         (SilcServerKEInternalContext *)sock->protocol->context;
1729
1730       proto_ctx->packet = silc_packet_context_dup(packet);
1731
1732       /* Let the protocol handle the packet */
1733       sock->protocol->execute(server->timeout_queue, 0, 
1734                               sock->protocol, sock->sock, 0, 100000);
1735     } else {
1736       SILC_LOG_ERROR(("Received Key Exchange packet but no key exchange "
1737                       "protocol active, packet dropped."));
1738
1739       /* XXX Trigger KE protocol?? Rekey actually, maybe. */
1740     }
1741     break;
1742
1743   case SILC_PACKET_KEY_EXCHANGE_1:
1744     SILC_LOG_DEBUG(("KE 1 packet"));
1745     if (packet->flags & SILC_PACKET_FLAG_LIST)
1746       break;
1747
1748     if (sock->protocol && sock->protocol->protocol &&
1749         (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE ||
1750          sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY)) {
1751
1752       if (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
1753         SilcServerRekeyInternalContext *proto_ctx = 
1754           (SilcServerRekeyInternalContext *)sock->protocol->context;
1755         
1756         if (proto_ctx->packet)
1757           silc_packet_context_free(proto_ctx->packet);
1758         
1759         proto_ctx->packet = silc_packet_context_dup(packet);
1760
1761         /* Let the protocol handle the packet */
1762         sock->protocol->execute(server->timeout_queue, 0, 
1763                                 sock->protocol, sock->sock, 0, 1);
1764       } else {
1765         SilcServerKEInternalContext *proto_ctx = 
1766           (SilcServerKEInternalContext *)sock->protocol->context;
1767         
1768         if (proto_ctx->packet)
1769           silc_packet_context_free(proto_ctx->packet);
1770         
1771         proto_ctx->packet = silc_packet_context_dup(packet);
1772         proto_ctx->dest_id_type = packet->src_id_type;
1773         proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1774                                             packet->src_id_type);
1775         if (!proto_ctx->dest_id)
1776           break;
1777
1778         /* Let the protocol handle the packet */
1779         sock->protocol->execute(server->timeout_queue, 0, 
1780                                 sock->protocol, sock->sock,
1781                                 0, 100000);
1782       }
1783     } else {
1784       SILC_LOG_ERROR(("Received Key Exchange 1 packet but no key exchange "
1785                       "protocol active, packet dropped."));
1786     }
1787     break;
1788
1789   case SILC_PACKET_KEY_EXCHANGE_2:
1790     SILC_LOG_DEBUG(("KE 2 packet"));
1791     if (packet->flags & SILC_PACKET_FLAG_LIST)
1792       break;
1793
1794     if (sock->protocol && sock->protocol->protocol &&
1795         (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE ||
1796          sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY)) {
1797
1798       if (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
1799         SilcServerRekeyInternalContext *proto_ctx = 
1800           (SilcServerRekeyInternalContext *)sock->protocol->context;
1801         
1802         if (proto_ctx->packet)
1803           silc_packet_context_free(proto_ctx->packet);
1804         
1805         proto_ctx->packet = silc_packet_context_dup(packet);
1806
1807         /* Let the protocol handle the packet */
1808         sock->protocol->execute(server->timeout_queue, 0, 
1809                                 sock->protocol, sock->sock, 0, 1);
1810       } else {
1811         SilcServerKEInternalContext *proto_ctx = 
1812           (SilcServerKEInternalContext *)sock->protocol->context;
1813         
1814         if (proto_ctx->packet)
1815           silc_packet_context_free(proto_ctx->packet);
1816         
1817         proto_ctx->packet = silc_packet_context_dup(packet);
1818         proto_ctx->dest_id_type = packet->src_id_type;
1819         proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1820                                             packet->src_id_type);
1821         if (!proto_ctx->dest_id)
1822           break;
1823
1824         /* Let the protocol handle the packet */
1825         sock->protocol->execute(server->timeout_queue, 0, 
1826                                 sock->protocol, sock->sock,
1827                                 0, 100000);
1828       }
1829     } else {
1830       SILC_LOG_ERROR(("Received Key Exchange 2 packet but no key exchange "
1831                       "protocol active, packet dropped."));
1832     }
1833     break;
1834
1835   case SILC_PACKET_CONNECTION_AUTH_REQUEST:
1836     /*
1837      * Connection authentication request packet. When we receive this packet
1838      * we will send to the other end information about our mandatory
1839      * authentication method for the connection. This packet maybe received
1840      * at any time. 
1841      */
1842     SILC_LOG_DEBUG(("Connection authentication request packet"));
1843     if (packet->flags & SILC_PACKET_FLAG_LIST)
1844       break;
1845     silc_server_connection_auth_request(server, sock, packet);
1846     break;
1847
1848     /*
1849      * Connection Authentication protocol packets
1850      */
1851   case SILC_PACKET_CONNECTION_AUTH:
1852     /* Start of the authentication protocol. We receive here the 
1853        authentication data and will verify it. */
1854     SILC_LOG_DEBUG(("Connection auth packet"));
1855     if (packet->flags & SILC_PACKET_FLAG_LIST)
1856       break;
1857
1858     if (sock->protocol && sock->protocol->protocol->type 
1859         == SILC_PROTOCOL_SERVER_CONNECTION_AUTH) {
1860
1861       SilcServerConnAuthInternalContext *proto_ctx = 
1862         (SilcServerConnAuthInternalContext *)sock->protocol->context;
1863
1864       proto_ctx->packet = silc_packet_context_dup(packet);
1865
1866       /* Let the protocol handle the packet */
1867       sock->protocol->execute(server->timeout_queue, 0, 
1868                               sock->protocol, sock->sock, 0, 0);
1869     } else {
1870       SILC_LOG_ERROR(("Received Connection Auth packet but no authentication "
1871                       "protocol active, packet dropped."));
1872     }
1873     break;
1874
1875   case SILC_PACKET_NEW_ID:
1876     /*
1877      * Received New ID packet. This includes some new ID that has been
1878      * created. It may be for client, server or channel. This is the way
1879      * to distribute information about new registered entities in the
1880      * SILC network.
1881      */
1882     SILC_LOG_DEBUG(("New ID packet"));
1883     if (packet->flags & SILC_PACKET_FLAG_LIST)
1884       silc_server_new_id_list(server, sock, packet);
1885     else
1886       silc_server_new_id(server, sock, packet);
1887     break;
1888
1889   case SILC_PACKET_NEW_CLIENT:
1890     /*
1891      * Received new client packet. This includes client information that
1892      * we will use to create initial client ID. After creating new
1893      * ID we will send it to the client.
1894      */
1895     SILC_LOG_DEBUG(("New Client packet"));
1896     if (packet->flags & SILC_PACKET_FLAG_LIST)
1897       break;
1898     silc_server_new_client(server, sock, packet);
1899     break;
1900
1901   case SILC_PACKET_NEW_SERVER:
1902     /*
1903      * Received new server packet. This includes Server ID and some other
1904      * information that we may save. This is received after server has 
1905      * connected to us.
1906      */
1907     SILC_LOG_DEBUG(("New Server packet"));
1908     if (packet->flags & SILC_PACKET_FLAG_LIST)
1909       break;
1910     silc_server_new_server(server, sock, packet);
1911     break;
1912
1913   case SILC_PACKET_NEW_CHANNEL:
1914     /*
1915      * Received new channel packet. Information about new channel in the
1916      * network are distributed using this packet.
1917      */
1918     SILC_LOG_DEBUG(("New Channel packet"));
1919     if (packet->flags & SILC_PACKET_FLAG_LIST)
1920       silc_server_new_channel_list(server, sock, packet);
1921     else
1922       silc_server_new_channel(server, sock, packet);
1923     break;
1924
1925   case SILC_PACKET_HEARTBEAT:
1926     /*
1927      * Received heartbeat.
1928      */
1929     SILC_LOG_DEBUG(("Heartbeat packet"));
1930     if (packet->flags & SILC_PACKET_FLAG_LIST)
1931       break;
1932     break;
1933
1934   case SILC_PACKET_KEY_AGREEMENT:
1935     /*
1936      * Received heartbeat.
1937      */
1938     SILC_LOG_DEBUG(("Key agreement packet"));
1939     if (packet->flags & SILC_PACKET_FLAG_LIST)
1940       break;
1941     silc_server_key_agreement(server, sock, packet);
1942     break;
1943
1944   case SILC_PACKET_REKEY:
1945     /*
1946      * Received re-key packet. The sender wants to regenerate the session
1947      * keys.
1948      */
1949     SILC_LOG_DEBUG(("Re-key packet"));
1950     if (packet->flags & SILC_PACKET_FLAG_LIST)
1951       break;
1952     silc_server_rekey(server, sock, packet);
1953     break;
1954
1955   case SILC_PACKET_REKEY_DONE:
1956     /*
1957      * The re-key is done.
1958      */
1959     SILC_LOG_DEBUG(("Re-key done packet"));
1960     if (packet->flags & SILC_PACKET_FLAG_LIST)
1961       break;
1962
1963     if (sock->protocol && sock->protocol->protocol &&
1964         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
1965
1966       SilcServerRekeyInternalContext *proto_ctx = 
1967         (SilcServerRekeyInternalContext *)sock->protocol->context;
1968
1969       if (proto_ctx->packet)
1970         silc_packet_context_free(proto_ctx->packet);
1971
1972       proto_ctx->packet = silc_packet_context_dup(packet);
1973
1974       /* Let the protocol handle the packet */
1975       if (proto_ctx->responder == FALSE)
1976         sock->protocol->execute(server->timeout_queue, 0, 
1977                                 sock->protocol, sock->sock,
1978                                 0, 0);
1979       else
1980         sock->protocol->execute(server->timeout_queue, 0, 
1981                                 sock->protocol, sock->sock,
1982                                 0, 100000);
1983     } else {
1984       SILC_LOG_ERROR(("Received Re-key done packet but no re-key "
1985                       "protocol active, packet dropped."));
1986     }
1987     break;
1988
1989   default:
1990     SILC_LOG_ERROR(("Incorrect packet type %d, packet dropped", type));
1991     break;
1992   }
1993   
1994 }
1995
1996 /* Creates connection to a remote router. */
1997
1998 void silc_server_create_connection(SilcServer server,
1999                                    char *remote_host, uint32 port)
2000 {
2001   SilcServerConnection sconn;
2002
2003   /* Allocate connection object for hold connection specific stuff. */
2004   sconn = silc_calloc(1, sizeof(*sconn));
2005   sconn->server = server;
2006   sconn->remote_host = strdup(remote_host);
2007   sconn->remote_port = port;
2008
2009   silc_task_register(server->timeout_queue, 0, 
2010                      silc_server_connect_router,
2011                      (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
2012                      SILC_TASK_PRI_NORMAL);
2013 }
2014
2015 SILC_TASK_CALLBACK(silc_server_close_connection_final)
2016 {
2017   silc_socket_free((SilcSocketConnection)context);
2018 }
2019
2020 /* Closes connection to socket connection */
2021
2022 void silc_server_close_connection(SilcServer server,
2023                                   SilcSocketConnection sock)
2024 {
2025   SILC_LOG_INFO(("Closing connection %s:%d [%s] (%d)", sock->hostname,
2026                  sock->port,  
2027                  (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
2028                   sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
2029                   sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
2030                   "Router"), sock->sock));
2031
2032   /* We won't listen for this connection anymore */
2033   silc_schedule_unset_listen_fd(sock->sock);
2034
2035   /* Unregister all tasks */
2036   silc_task_unregister_by_fd(server->io_queue, sock->sock);
2037   silc_task_unregister_by_fd(server->timeout_queue, sock->sock);
2038
2039   /* Close the actual connection */
2040   silc_net_close_connection(sock->sock);
2041   server->sockets[sock->sock] = NULL;
2042
2043   silc_task_register(server->timeout_queue, 0, 
2044                      silc_server_close_connection_final,
2045                      (void *)sock, 0, 1, SILC_TASK_TIMEOUT, 
2046                      SILC_TASK_PRI_NORMAL);
2047 }
2048
2049 /* Sends disconnect message to remote connection and disconnects the 
2050    connection. */
2051
2052 void silc_server_disconnect_remote(SilcServer server,
2053                                    SilcSocketConnection sock,
2054                                    const char *fmt, ...)
2055 {
2056   va_list ap;
2057   unsigned char buf[4096];
2058
2059   if (!sock)
2060     return;
2061
2062   memset(buf, 0, sizeof(buf));
2063   va_start(ap, fmt);
2064   vsprintf(buf, fmt, ap);
2065   va_end(ap);
2066
2067   SILC_LOG_DEBUG(("Disconnecting remote host"));
2068
2069   SILC_LOG_INFO(("Disconnecting %s:%d [%s]", sock->hostname,
2070                   sock->port,
2071                   (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
2072                    sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
2073                    sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
2074                    "Router")));
2075
2076   /* Notify remote end that the conversation is over. The notify message
2077      is tried to be sent immediately. */
2078   silc_server_packet_send(server, sock, SILC_PACKET_DISCONNECT, 0,  
2079                           buf, strlen(buf), TRUE);
2080
2081   /* Mark the connection to be disconnected */
2082   SILC_SET_DISCONNECTED(sock);
2083   silc_server_close_connection(server, sock);
2084 }
2085
2086 typedef struct {
2087   SilcServer server;
2088   SilcClientEntry client;
2089 } *FreeClientInternal;
2090
2091 SILC_TASK_CALLBACK(silc_server_free_client_data_timeout)
2092 {
2093   FreeClientInternal i = (FreeClientInternal)context;
2094
2095   silc_idlist_del_data(i->client);
2096   silc_idcache_purge_by_context(i->server->local_list->clients, i->client);
2097   silc_free(i);
2098 }
2099
2100 /* Frees client data and notifies about client's signoff. */
2101
2102 void silc_server_free_client_data(SilcServer server, 
2103                                   SilcSocketConnection sock,
2104                                   SilcClientEntry client, 
2105                                   int notify,
2106                                   char *signoff)
2107 {
2108   FreeClientInternal i = silc_calloc(1, sizeof(*i));
2109
2110   /* If there is pending outgoing data for the client then purge it
2111      to the network before removing the client entry. */
2112   if (sock && SILC_IS_OUTBUF_PENDING(sock) && 
2113       (SILC_IS_DISCONNECTED(sock) == FALSE)) {
2114     server->stat.packets_sent++;
2115
2116     if (sock->outbuf->data - sock->outbuf->head)
2117      silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
2118
2119     silc_packet_send(sock, TRUE);
2120
2121     SILC_SET_CONNECTION_FOR_INPUT(sock->sock);
2122     SILC_UNSET_OUTBUF_PENDING(sock);
2123     silc_buffer_clear(sock->outbuf);
2124   }
2125
2126   /* Send SIGNOFF notify to routers. */
2127   if (notify && !server->standalone && server->router)
2128     silc_server_send_notify_signoff(server, server->router->connection,
2129                                     server->server_type == SILC_SERVER ?
2130                                     FALSE : TRUE, client->id, 
2131                                     SILC_ID_CLIENT_LEN, signoff);
2132
2133   /* Remove client from all channels */
2134   if (notify)
2135     silc_server_remove_from_channels(server, NULL, client, 
2136                                      TRUE, signoff, TRUE);
2137   else
2138     silc_server_remove_from_channels(server, NULL, client, 
2139                                      FALSE, NULL, FALSE);
2140
2141   /* We will not delete the client entry right away. We will take it
2142      into history (for WHOWAS command) for 5 minutes */
2143   i->server = server;
2144   i->client = client;
2145   silc_task_register(server->timeout_queue, 0, 
2146                      silc_server_free_client_data_timeout,
2147                      (void *)i, 300, 0,
2148                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
2149   client->data.registered = FALSE;
2150
2151   /* Free the client entry and everything in it */
2152   server->stat.my_clients--;
2153   server->stat.clients--;
2154   if (server->server_type == SILC_ROUTER)
2155     server->stat.cell_clients--;
2156 }
2157
2158 /* Frees user_data pointer from socket connection object. This also sends
2159    appropriate notify packets to the network to inform about leaving
2160    entities. */
2161
2162 void silc_server_free_sock_user_data(SilcServer server, 
2163                                      SilcSocketConnection sock)
2164 {
2165   SILC_LOG_DEBUG(("Start"));
2166
2167   switch(sock->type) {
2168   case SILC_SOCKET_TYPE_CLIENT:
2169     {
2170       SilcClientEntry user_data = (SilcClientEntry)sock->user_data;
2171       silc_server_free_client_data(server, sock, user_data, TRUE, NULL);
2172       break;
2173     }
2174   case SILC_SOCKET_TYPE_SERVER:
2175   case SILC_SOCKET_TYPE_ROUTER:
2176     {
2177       SilcServerEntry user_data = (SilcServerEntry)sock->user_data;
2178
2179       /* Free all client entries that this server owns as they will
2180          become invalid now as well. */
2181       silc_server_remove_clients_by_server(server, user_data, TRUE);
2182
2183       /* If this was our primary router connection then we're lost to
2184          the outside world. */
2185       if (server->router == user_data) {
2186         server->id_entry->router = NULL;
2187         server->router = NULL;
2188         server->standalone = TRUE;
2189       }
2190
2191       /* Free the server entry */
2192       silc_idlist_del_data(user_data);
2193       silc_idlist_del_server(server->local_list, user_data);
2194       server->stat.my_servers--;
2195       server->stat.servers--;
2196       if (server->server_type == SILC_ROUTER)
2197         server->stat.cell_servers--;
2198       break;
2199     }
2200   default:
2201     {
2202       SilcUnknownEntry user_data = (SilcUnknownEntry)sock->user_data;
2203
2204       silc_idlist_del_data(user_data);
2205       silc_free(user_data);
2206       break;
2207     }
2208   }
2209
2210   sock->user_data = NULL;
2211 }
2212
2213 /* This function is used to remove all client entries by the server `entry'.
2214    This is called when the connection is lost to the server. In this case
2215    we must invalidate all the client entries owned by the server `entry'. 
2216    If the `server_signoff' is TRUE then the SERVER_SIGNOFF notify is
2217    distributed to our local clients. */
2218
2219 int silc_server_remove_clients_by_server(SilcServer server, 
2220                                          SilcServerEntry entry,
2221                                          int server_signoff)
2222 {
2223   SilcIDCacheList list = NULL;
2224   SilcIDCacheEntry id_cache = NULL;
2225   SilcClientEntry client = NULL;
2226   SilcBuffer idp;
2227   SilcClientEntry *clients = NULL;
2228   uint32 clients_c = 0;
2229   unsigned char **argv = NULL;
2230   uint32 *argv_lens = NULL, *argv_types = NULL, argc = 0;
2231   int i;
2232
2233   SILC_LOG_DEBUG(("Start"));
2234
2235   if (server_signoff) {
2236     idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
2237     argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
2238     argv_lens = silc_realloc(argv_lens,  sizeof(*argv_lens) * (argc + 1));
2239     argv_types = silc_realloc(argv_types, sizeof(*argv_types) * (argc + 1));
2240     argv[argc] = idp->data;
2241     argv_lens[argc] = idp->len;
2242     argv_types[argc] = argc + 1;
2243     argc++;
2244     silc_buffer_free(idp);
2245   }
2246
2247   if (silc_idcache_find_by_id(server->local_list->clients, 
2248                               SILC_ID_CACHE_ANY, SILC_ID_CLIENT, &list)) {
2249
2250     if (silc_idcache_list_first(list, &id_cache)) {
2251       while (id_cache) {
2252         client = (SilcClientEntry)id_cache->context;
2253         if (client->data.registered == FALSE) {
2254           if (!silc_idcache_list_next(list, &id_cache))
2255             break;
2256           else
2257             continue;
2258         }
2259
2260         if (client->router != entry) {
2261           if (server_signoff && client->connection) {
2262             clients = silc_realloc(clients, 
2263                                    sizeof(*clients) * (clients_c + 1));
2264             clients[clients_c] = client;
2265             clients_c++;
2266           }
2267
2268           if (!silc_idcache_list_next(list, &id_cache))
2269             break;
2270           else
2271             continue;
2272         }
2273
2274         if (server_signoff) {
2275           idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2276           argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
2277           argv_lens = silc_realloc(argv_lens, sizeof(*argv_lens) *
2278                                    (argc + 1));
2279           argv_types = silc_realloc(argv_types, sizeof(*argv_types) *
2280                                     (argc + 1));
2281           argv[argc] = silc_calloc(idp->len, sizeof(*argv[0]));
2282           memcpy(argv[argc], idp->data, idp->len);
2283           argv_lens[argc] = idp->len;
2284           argv_types[argc] = argc + 1;
2285           argc++;
2286           silc_buffer_free(idp);
2287         }
2288
2289         /* Remove the client entry */
2290         silc_server_remove_from_channels(server, NULL, client, FALSE, 
2291                                          NULL, FALSE);
2292         silc_idlist_del_client(server->local_list, client);
2293
2294         if (!silc_idcache_list_next(list, &id_cache))
2295           break;
2296       }
2297     }
2298     silc_idcache_list_free(list);
2299   }
2300   
2301   if (silc_idcache_find_by_id(server->global_list->clients, 
2302                               SILC_ID_CACHE_ANY, SILC_ID_CLIENT, &list)) {
2303
2304     if (silc_idcache_list_first(list, &id_cache)) {
2305       while (id_cache) {
2306         client = (SilcClientEntry)id_cache->context;
2307         if (client->data.registered == FALSE) {
2308           if (!silc_idcache_list_next(list, &id_cache))
2309             break;
2310           else
2311             continue;
2312         }
2313         
2314         if (client->router != entry) {
2315           if (server_signoff && client->connection) {
2316             clients = silc_realloc(clients, 
2317                                    sizeof(*clients) * (clients_c + 1));
2318             clients[clients_c] = client;
2319             clients_c++;
2320           }
2321
2322           if (!silc_idcache_list_next(list, &id_cache))
2323             break;
2324           else
2325             continue;
2326         }
2327
2328         if (server_signoff) {
2329           idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2330           argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
2331           argv_lens = silc_realloc(argv_lens, sizeof(*argv_lens) *
2332                                    (argc + 1));
2333           argv_types = silc_realloc(argv_types, sizeof(*argv_types) *
2334                                     (argc + 1));
2335           argv[argc] = silc_calloc(idp->len, sizeof(*argv[0]));
2336           memcpy(argv[argc], idp->data, idp->len);
2337           argv_lens[argc] = idp->len;
2338           argv_types[argc] = argc + 1;
2339           argc++;
2340           silc_buffer_free(idp);
2341         }
2342
2343         /* Remove the client entry */
2344         silc_server_remove_from_channels(server, NULL, client, FALSE,
2345                                          NULL, FALSE);
2346         silc_idlist_del_client(server->global_list, client);
2347
2348         if (!silc_idcache_list_next(list, &id_cache))
2349           break;
2350       }
2351     }
2352     silc_idcache_list_free(list);
2353   }
2354
2355   /* Send the SERVER_SIGNOFF notify */
2356   if (server_signoff) {
2357     SilcBuffer args;
2358
2359     /* Send SERVER_SIGNOFF notify to our primary router */
2360     if (!server->standalone && server->router) {
2361       args = silc_argument_payload_encode(1, argv, argv_lens,
2362                                           argv_types);
2363       silc_server_send_notify_args(server, 
2364                                    server->router->connection,
2365                                    server->server_type == 
2366                                    SILC_SERVER ? FALSE : TRUE, 
2367                                    SILC_NOTIFY_TYPE_SERVER_SIGNOFF,
2368                                    argc, args);
2369       silc_buffer_free(args);
2370     }
2371
2372     args = silc_argument_payload_encode(argc, argv, argv_lens,
2373                                         argv_types);
2374     /* Send to local clients */
2375     for (i = 0; i < clients_c; i++) {
2376       silc_server_send_notify_args(server, clients[i]->connection,
2377                                    FALSE, SILC_NOTIFY_TYPE_SERVER_SIGNOFF,
2378                                    argc, args);
2379     }
2380
2381     silc_free(clients);
2382     silc_buffer_free(args);
2383     silc_free(argv);
2384     silc_free(argv_lens);
2385     silc_free(argv_types);
2386   }
2387
2388   return TRUE;
2389 }
2390
2391 /* Checks whether given channel has global users.  If it does this returns
2392    TRUE and FALSE if there is only locally connected clients on the channel. */
2393
2394 int silc_server_channel_has_global(SilcChannelEntry channel)
2395 {
2396   SilcChannelClientEntry chl;
2397
2398   silc_list_start(channel->user_list);
2399   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2400     if (chl->client->router)
2401       return TRUE;
2402   }
2403
2404   return FALSE;
2405 }
2406
2407 /* Checks whether given channel has locally connected users.  If it does this
2408    returns TRUE and FALSE if there is not one locally connected client. */
2409
2410 int silc_server_channel_has_local(SilcChannelEntry channel)
2411 {
2412   SilcChannelClientEntry chl;
2413
2414   silc_list_start(channel->user_list);
2415   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2416     if (!chl->client->router)
2417       return TRUE;
2418   }
2419
2420   return FALSE;
2421 }
2422
2423 /* Removes client from all channels it has joined. This is used when client
2424    connection is disconnected. If the client on a channel is last, the
2425    channel is removed as well. This sends the SIGNOFF notify types. */
2426
2427 void silc_server_remove_from_channels(SilcServer server, 
2428                                       SilcSocketConnection sock,
2429                                       SilcClientEntry client,
2430                                       int notify,
2431                                       char *signoff_message,
2432                                       int keygen)
2433 {
2434   SilcChannelEntry channel;
2435   SilcChannelClientEntry chl;
2436   SilcBuffer clidp;
2437
2438   SILC_LOG_DEBUG(("Start"));
2439
2440   if (!client || !client->id)
2441     return;
2442
2443   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2444
2445   /* Remove the client from all channels. The client is removed from
2446      the channels' user list. */
2447   silc_list_start(client->channels);
2448   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
2449     channel = chl->channel;
2450
2451     /* Remove channel from client's channel list */
2452     silc_list_del(client->channels, chl);
2453
2454     /* Remove channel if there is no users anymore */
2455     if (server->server_type == SILC_ROUTER &&
2456         silc_list_count(channel->user_list) < 2) {
2457       server->stat.my_channels--;
2458
2459       if (channel->rekey)
2460         silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2461
2462       if (channel->founder_key) {
2463         /* The founder auth data exists, do not remove the channel entry */
2464         SilcChannelClientEntry chl2;
2465
2466         channel->id = NULL;
2467
2468         silc_list_start(channel->user_list);
2469         while ((chl2 = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2470           silc_list_del(chl2->client->channels, chl2);
2471           silc_list_del(channel->user_list, chl2);
2472           silc_free(chl2);
2473         }
2474         continue;
2475       }
2476
2477       if (!silc_idlist_del_channel(server->local_list, channel))
2478         silc_idlist_del_channel(server->global_list, channel);
2479       continue;
2480     }
2481
2482     /* Remove client from channel's client list */
2483     silc_list_del(channel->user_list, chl);
2484     silc_free(chl);
2485     server->stat.my_chanclients--;
2486
2487     /* If there is no global users on the channel anymore mark the channel
2488        as local channel. */
2489     if (server->server_type == SILC_SERVER &&
2490         !silc_server_channel_has_global(channel))
2491       channel->global_users = FALSE;
2492
2493     /* If there is not at least one local user on the channel then we don't
2494        need the channel entry anymore, we can remove it safely. */
2495     if (server->server_type == SILC_SERVER &&
2496         !silc_server_channel_has_local(channel)) {
2497       /* Notify about leaving client if this channel has global users. */
2498       if (notify && channel->global_users)
2499         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2500                                            SILC_NOTIFY_TYPE_SIGNOFF, 
2501                                            signoff_message ? 2 : 1,
2502                                            clidp->data, clidp->len,
2503                                            signoff_message, signoff_message ?
2504                                            strlen(signoff_message) : 0);
2505
2506       server->stat.my_channels--;
2507
2508       if (channel->rekey)
2509         silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2510
2511       if (channel->founder_key) {
2512         /* The founder auth data exists, do not remove the channel entry */
2513         SilcChannelClientEntry chl2;
2514
2515         channel->id = NULL;
2516
2517         silc_list_start(channel->user_list);
2518         while ((chl2 = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2519           silc_list_del(chl2->client->channels, chl2);
2520           silc_list_del(channel->user_list, chl2);
2521           silc_free(chl2);
2522         }
2523         continue;
2524       }
2525
2526       if (!silc_idlist_del_channel(server->local_list, channel))
2527         silc_idlist_del_channel(server->global_list, channel);
2528       continue;
2529     }
2530
2531     /* Send notify to channel about client leaving SILC and thus
2532        the entire channel. */
2533     if (notify)
2534       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2535                                          SILC_NOTIFY_TYPE_SIGNOFF, 
2536                                          signoff_message ? 2 : 1,
2537                                          clidp->data, clidp->len,
2538                                          signoff_message, signoff_message ?
2539                                          strlen(signoff_message) : 0);
2540
2541     if (keygen && !(channel->mode & SILC_CHANNEL_MODE_PRIVKEY)) {
2542       /* Re-generate channel key */
2543       silc_server_create_channel_key(server, channel, 0);
2544       
2545       /* Send the channel key to the channel. The key of course is not sent
2546          to the client who was removed from the channel. */
2547       silc_server_send_channel_key(server, client->connection, channel, 
2548                                    server->server_type == SILC_ROUTER ? 
2549                                    FALSE : !server->standalone);
2550     }
2551   }
2552
2553   silc_buffer_free(clidp);
2554 }
2555
2556 /* Removes client from one channel. This is used for example when client
2557    calls LEAVE command to remove itself from the channel. Returns TRUE
2558    if channel still exists and FALSE if the channel is removed when
2559    last client leaves the channel. If `notify' is FALSE notify messages
2560    are not sent. */
2561
2562 int silc_server_remove_from_one_channel(SilcServer server, 
2563                                         SilcSocketConnection sock,
2564                                         SilcChannelEntry channel,
2565                                         SilcClientEntry client,
2566                                         int notify)
2567 {
2568   SilcChannelEntry ch;
2569   SilcChannelClientEntry chl;
2570   SilcBuffer clidp;
2571
2572   SILC_LOG_DEBUG(("Start"));
2573
2574   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2575
2576   /* Remove the client from the channel. The client is removed from
2577      the channel's user list. */
2578   silc_list_start(client->channels);
2579   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
2580     if (chl->channel != channel)
2581       continue;
2582
2583     ch = chl->channel;
2584
2585     /* Remove channel from client's channel list */
2586     silc_list_del(client->channels, chl);
2587
2588     /* Remove channel if there is no users anymore */
2589     if (server->server_type == SILC_ROUTER &&
2590         silc_list_count(channel->user_list) < 2) {
2591       if (channel->rekey)
2592         silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2593       if (!silc_idlist_del_channel(server->local_list, channel))
2594         silc_idlist_del_channel(server->global_list, channel);
2595       silc_buffer_free(clidp);
2596       server->stat.my_channels--;
2597       return FALSE;
2598     }
2599
2600     /* Remove client from channel's client list */
2601     silc_list_del(channel->user_list, chl);
2602     silc_free(chl);
2603     server->stat.my_chanclients--;
2604
2605     /* If there is no global users on the channel anymore mark the channel
2606        as local channel. */
2607     if (server->server_type == SILC_SERVER &&
2608         !silc_server_channel_has_global(channel))
2609       channel->global_users = FALSE;
2610
2611     /* If there is not at least one local user on the channel then we don't
2612        need the channel entry anymore, we can remove it safely. */
2613     if (server->server_type == SILC_SERVER &&
2614         !silc_server_channel_has_local(channel)) {
2615       /* Notify about leaving client if this channel has global users. */
2616       if (notify && channel->global_users)
2617         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2618                                            SILC_NOTIFY_TYPE_LEAVE, 1,
2619                                            clidp->data, clidp->len);
2620
2621       server->stat.my_channels--;
2622       silc_buffer_free(clidp);
2623
2624       if (channel->rekey)
2625         silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2626
2627       if (channel->founder_key) {
2628         /* The founder auth data exists, do not remove the channel entry */
2629         SilcChannelClientEntry chl2;
2630
2631         channel->id = NULL;
2632
2633         silc_list_start(channel->user_list);
2634         while ((chl2 = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2635           silc_list_del(chl2->client->channels, chl2);
2636           silc_list_del(channel->user_list, chl2);
2637           silc_free(chl2);
2638         }
2639         return FALSE;
2640       }
2641
2642       if (!silc_idlist_del_channel(server->local_list, channel))
2643         silc_idlist_del_channel(server->global_list, channel);
2644       return FALSE;
2645     }
2646
2647     /* Send notify to channel about client leaving the channel */
2648     if (notify)
2649       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2650                                          SILC_NOTIFY_TYPE_LEAVE, 1,
2651                                          clidp->data, clidp->len);
2652     break;
2653   }
2654
2655   silc_buffer_free(clidp);
2656   return TRUE;
2657 }
2658
2659 /* Returns TRUE if the given client is on the channel.  FALSE if not. 
2660    This works because we assure that the user list on the channel is
2661    always in up to date thus we can only check the channel list from 
2662    `client' which is faster than checking the user list from `channel'. */
2663
2664 int silc_server_client_on_channel(SilcClientEntry client,
2665                                   SilcChannelEntry channel)
2666 {
2667   SilcChannelClientEntry chl;
2668
2669   if (!client || !channel)
2670     return FALSE;
2671
2672   silc_list_start(client->channels);
2673   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END)
2674     if (chl->channel == channel)
2675       return TRUE;
2676
2677   return FALSE;
2678 }
2679
2680 /* Timeout callback. This is called if connection is idle or for some
2681    other reason is not responding within some period of time. This 
2682    disconnects the remote end. */
2683
2684 SILC_TASK_CALLBACK(silc_server_timeout_remote)
2685 {
2686   SilcServer server = (SilcServer)context;
2687   SilcSocketConnection sock = server->sockets[fd];
2688
2689   if (!sock)
2690     return;
2691
2692   if (sock->user_data)
2693     silc_server_free_sock_user_data(server, sock);
2694
2695   silc_server_disconnect_remote(server, sock, 
2696                                 "Server closed connection: "
2697                                 "Connection timeout");
2698 }
2699
2700 /* Creates new channel. Sends NEW_CHANNEL packet to primary route. This
2701    function may be used only by router. In real SILC network all channels
2702    are created by routers thus this function is never used by normal
2703    server. */
2704
2705 SilcChannelEntry silc_server_create_new_channel(SilcServer server, 
2706                                                 SilcServerID *router_id,
2707                                                 char *cipher, 
2708                                                 char *hmac,
2709                                                 char *channel_name,
2710                                                 int broadcast)
2711 {
2712   SilcChannelID *channel_id;
2713   SilcChannelEntry entry;
2714   SilcCipher key;
2715   SilcHmac newhmac;
2716
2717   SILC_LOG_DEBUG(("Creating new channel"));
2718
2719   if (!cipher)
2720     cipher = "aes-256-cbc";
2721   if (!hmac)
2722     hmac = "hmac-sha1-96";
2723
2724   /* Allocate cipher */
2725   if (!silc_cipher_alloc(cipher, &key))
2726     return NULL;
2727
2728   /* Allocate hmac */
2729   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2730     silc_cipher_free(key);
2731     return NULL;
2732   }
2733
2734   channel_name = strdup(channel_name);
2735
2736   /* Create the channel */
2737   silc_id_create_channel_id(router_id, server->rng, &channel_id);
2738   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2739                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2740                                   NULL, key, newhmac);
2741   if (!entry) {
2742     silc_free(channel_name);
2743     return NULL;
2744   }
2745
2746   entry->cipher = strdup(cipher);
2747   entry->hmac_name = strdup(hmac);
2748
2749   /* Now create the actual key material */
2750   silc_server_create_channel_key(server, entry, 
2751                                  silc_cipher_get_key_len(key) / 8);
2752
2753   /* Notify other routers about the new channel. We send the packet
2754      to our primary route. */
2755   if (broadcast && server->standalone == FALSE)
2756     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2757                                  channel_name, entry->id, SILC_ID_CHANNEL_LEN,
2758                                  entry->mode);
2759
2760   server->stat.my_channels++;
2761
2762   return entry;
2763 }
2764
2765 /* Same as above but creates the channel with Channel ID `channel_id. */
2766
2767 SilcChannelEntry 
2768 silc_server_create_new_channel_with_id(SilcServer server, 
2769                                        char *cipher, 
2770                                        char *hmac,
2771                                        char *channel_name,
2772                                        SilcChannelID *channel_id,
2773                                        int broadcast)
2774 {
2775   SilcChannelEntry entry;
2776   SilcCipher key;
2777   SilcHmac newhmac;
2778
2779   SILC_LOG_DEBUG(("Creating new channel"));
2780
2781   if (!cipher)
2782     cipher = "aes-256-cbc";
2783   if (!hmac)
2784     hmac = "hmac-sha1-96";
2785
2786   /* Allocate cipher */
2787   if (!silc_cipher_alloc(cipher, &key))
2788     return NULL;
2789
2790   /* Allocate hmac */
2791   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2792     silc_cipher_free(key);
2793     return NULL;
2794   }
2795
2796   channel_name = strdup(channel_name);
2797
2798   /* Create the channel */
2799   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2800                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2801                                   NULL, key, newhmac);
2802   if (!entry) {
2803     silc_free(channel_name);
2804     return NULL;
2805   }
2806
2807   /* Now create the actual key material */
2808   silc_server_create_channel_key(server, entry, 
2809                                  silc_cipher_get_key_len(key) / 8);
2810
2811   /* Notify other routers about the new channel. We send the packet
2812      to our primary route. */
2813   if (broadcast && server->standalone == FALSE)
2814     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2815                                  channel_name, entry->id, SILC_ID_CHANNEL_LEN,
2816                                  entry->mode);
2817
2818   server->stat.my_channels++;
2819
2820   return entry;
2821 }
2822
2823 /* Channel's key re-key timeout callback. */
2824
2825 SILC_TASK_CALLBACK(silc_server_channel_key_rekey)
2826 {
2827   SilcServerChannelRekey rekey = (SilcServerChannelRekey)context;
2828   SilcServer server = (SilcServer)rekey->context;
2829
2830   silc_server_create_channel_key(server, rekey->channel, rekey->key_len);
2831   silc_server_send_channel_key(server, NULL, rekey->channel, FALSE);
2832
2833   silc_task_register(server->timeout_queue, 0, 
2834                      silc_server_channel_key_rekey,
2835                      (void *)rekey, 30, 0,
2836                      SILC_TASK_TIMEOUT,
2837                      SILC_TASK_PRI_NORMAL);
2838 }
2839
2840 /* Generates new channel key. This is used to create the initial channel key
2841    but also to re-generate new key for channel. If `key_len' is provided
2842    it is the bytes of the key length. */
2843
2844 void silc_server_create_channel_key(SilcServer server, 
2845                                     SilcChannelEntry channel,
2846                                     uint32 key_len)
2847 {
2848   int i;
2849   unsigned char channel_key[32], hash[32];
2850   uint32 len;
2851
2852   SILC_LOG_DEBUG(("Generating channel key"));
2853
2854   if (channel->mode & SILC_CHANNEL_MODE_PRIVKEY) {
2855     SILC_LOG_DEBUG(("Channel has private keys, will not generate new key"));
2856     return;
2857   }
2858
2859   if (!channel->channel_key)
2860     if (!silc_cipher_alloc("aes-256-cbc", &channel->channel_key))
2861       return;
2862
2863   if (key_len)
2864     len = key_len;
2865   else if (channel->key_len)
2866     len = channel->key_len / 8;
2867   else
2868     len = silc_cipher_get_key_len(channel->channel_key) / 8;
2869
2870   /* Create channel key */
2871   for (i = 0; i < len; i++) channel_key[i] = silc_rng_get_byte(server->rng);
2872   
2873   /* Set the key */
2874   silc_cipher_set_key(channel->channel_key, channel_key, len * 8);
2875
2876   /* Remove old key if exists */
2877   if (channel->key) {
2878     memset(channel->key, 0, channel->key_len / 8);
2879     silc_free(channel->key);
2880   }
2881
2882   /* Save the key */
2883   channel->key_len = len * 8;
2884   channel->key = silc_calloc(len, sizeof(*channel->key));
2885   memcpy(channel->key, channel_key, len);
2886   memset(channel_key, 0, sizeof(channel_key));
2887
2888   /* Generate HMAC key from the channel key data and set it */
2889   if (!channel->hmac)
2890     silc_hmac_alloc("hmac-sha1-96", NULL, &channel->hmac);
2891   silc_hash_make(channel->hmac->hash, channel->key, len, hash);
2892   silc_hmac_set_key(channel->hmac, hash, silc_hash_len(channel->hmac->hash));
2893   memset(hash, 0, sizeof(hash));
2894
2895   if (server->server_type == SILC_ROUTER) {
2896     if (!channel->rekey)
2897       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
2898     channel->rekey->context = (void *)server;
2899     channel->rekey->channel = channel;
2900     channel->rekey->key_len = key_len;
2901
2902     silc_task_unregister_by_callback(server->timeout_queue,
2903                                      silc_server_channel_key_rekey);
2904     silc_task_register(server->timeout_queue, 0, 
2905                        silc_server_channel_key_rekey,
2906                        (void *)channel->rekey, 30, 0,
2907                        SILC_TASK_TIMEOUT,
2908                        SILC_TASK_PRI_NORMAL);
2909   }
2910 }
2911
2912 /* Saves the channel key found in the encoded `key_payload' buffer. This 
2913    function is used when we receive Channel Key Payload and also when we're
2914    processing JOIN command reply. Returns entry to the channel. */
2915
2916 SilcChannelEntry silc_server_save_channel_key(SilcServer server,
2917                                               SilcBuffer key_payload,
2918                                               SilcChannelEntry channel)
2919 {
2920   SilcChannelKeyPayload payload = NULL;
2921   SilcChannelID *id = NULL;
2922   unsigned char *tmp, hash[32];
2923   uint32 tmp_len;
2924   char *cipher;
2925
2926   SILC_LOG_DEBUG(("Start"));
2927
2928   /* Decode channel key payload */
2929   payload = silc_channel_key_payload_parse(key_payload);
2930   if (!payload) {
2931     SILC_LOG_ERROR(("Bad channel key payload, dropped"));
2932     channel = NULL;
2933     goto out;
2934   }
2935
2936   /* Get the channel entry */
2937   if (!channel) {
2938
2939     /* Get channel ID */
2940     tmp = silc_channel_key_get_id(payload, &tmp_len);
2941     id = silc_id_str2id(tmp, tmp_len, SILC_ID_CHANNEL);
2942     if (!id) {
2943       channel = NULL;
2944       goto out;
2945     }
2946
2947     channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
2948     if (!channel) {
2949       channel = silc_idlist_find_channel_by_id(server->global_list, id, NULL);
2950       if (!channel) {
2951         SILC_LOG_ERROR(("Received key for non-existent channel"));
2952         goto out;
2953       }
2954     }
2955   }
2956
2957   tmp = silc_channel_key_get_key(payload, &tmp_len);
2958   if (!tmp) {
2959     channel = NULL;
2960     goto out;
2961   }
2962
2963   cipher = silc_channel_key_get_cipher(payload, NULL);
2964   if (!cipher) {
2965     channel = NULL;
2966     goto out;
2967   }
2968
2969   /* Remove old key if exists */
2970   if (channel->key) {
2971     memset(channel->key, 0, channel->key_len / 8);
2972     silc_free(channel->key);
2973     silc_cipher_free(channel->channel_key);
2974   }
2975
2976   /* Create new cipher */
2977   if (!silc_cipher_alloc(cipher, &channel->channel_key)) {
2978     channel = NULL;
2979     goto out;
2980   }
2981
2982   if (channel->cipher)
2983     silc_free(channel->cipher);
2984   channel->cipher = strdup(cipher);
2985
2986   /* Save the key */
2987   channel->key_len = tmp_len * 8;
2988   channel->key = silc_calloc(tmp_len, sizeof(unsigned char));
2989   memcpy(channel->key, tmp, tmp_len);
2990   silc_cipher_set_key(channel->channel_key, tmp, channel->key_len);
2991
2992   /* Generate HMAC key from the channel key data and set it */
2993   if (!channel->hmac)
2994     silc_hmac_alloc("hmac-sha1-96", NULL, &channel->hmac);
2995   silc_hash_make(channel->hmac->hash, tmp, tmp_len, hash);
2996   silc_hmac_set_key(channel->hmac, hash, silc_hash_len(channel->hmac->hash));
2997
2998   memset(hash, 0, sizeof(hash));
2999   memset(tmp, 0, tmp_len);
3000
3001   if (server->server_type == SILC_ROUTER) {
3002     if (!channel->rekey)
3003       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
3004     channel->rekey->context = (void *)server;
3005     channel->rekey->channel = channel;
3006
3007     silc_task_unregister_by_callback(server->timeout_queue,
3008                                      silc_server_channel_key_rekey);
3009     silc_task_register(server->timeout_queue, 0, 
3010                        silc_server_channel_key_rekey,
3011                        (void *)channel->rekey, 30, 0,
3012                        SILC_TASK_TIMEOUT,
3013                        SILC_TASK_PRI_NORMAL);
3014   }
3015
3016  out:
3017   if (id)
3018     silc_free(id);
3019   if (payload)
3020     silc_channel_key_payload_free(payload);
3021
3022   return channel;
3023 }
3024
3025 /* Heartbeat callback. This function is set as argument for the
3026    silc_socket_set_heartbeat function. The library will call this function
3027    at the set time interval. */
3028
3029 void silc_server_perform_heartbeat(SilcSocketConnection sock,
3030                                    void *hb_context)
3031 {
3032   SilcServerHBContext hb = (SilcServerHBContext)hb_context;
3033
3034   SILC_LOG_DEBUG(("Sending heartbeat to %s (%s)", sock->hostname,
3035                   sock->ip));
3036
3037   /* Send the heartbeat */
3038   silc_server_send_heartbeat(hb->server, sock);
3039 }
3040
3041 /* Returns assembled of all servers in the given ID list. The packet's
3042    form is dictated by the New ID payload. */
3043
3044 static void silc_server_announce_get_servers(SilcServer server,
3045                                              SilcIDList id_list,
3046                                              SilcBuffer *servers)
3047 {
3048   SilcIDCacheList list;
3049   SilcIDCacheEntry id_cache;
3050   SilcServerEntry entry;
3051   SilcBuffer idp;
3052
3053   /* Go through all clients in the list */
3054   if (silc_idcache_find_by_id(id_list->clients, SILC_ID_CACHE_ANY, 
3055                               SILC_ID_SERVER, &list)) {
3056     if (silc_idcache_list_first(list, &id_cache)) {
3057       while (id_cache) {
3058         entry = (SilcServerEntry)id_cache->context;
3059
3060         idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
3061
3062         *servers = silc_buffer_realloc(*servers, 
3063                                        (*servers ? 
3064                                         (*servers)->truelen + idp->len : 
3065                                         idp->len));
3066         silc_buffer_pull_tail(*servers, ((*servers)->end - (*servers)->data));
3067         silc_buffer_put(*servers, idp->data, idp->len);
3068         silc_buffer_pull(*servers, idp->len);
3069         silc_buffer_free(idp);
3070
3071         if (!silc_idcache_list_next(list, &id_cache))
3072           break;
3073       }
3074     }
3075
3076     silc_idcache_list_free(list);
3077   }
3078 }
3079
3080 /* This function is used by router to announce existing servers to our
3081    primary router when we've connected to it. */
3082
3083 void silc_server_announce_servers(SilcServer server)
3084 {
3085   SilcBuffer servers = NULL;
3086
3087   SILC_LOG_DEBUG(("Announcing servers"));
3088
3089   /* Get servers in local list */
3090   silc_server_announce_get_servers(server, server->local_list, &servers);
3091
3092   /* Get servers in global list */
3093   silc_server_announce_get_servers(server, server->global_list, &servers);
3094
3095   if (servers) {
3096     silc_buffer_push(servers, servers->data - servers->head);
3097     SILC_LOG_HEXDUMP(("servers"), servers->data, servers->len);
3098
3099     /* Send the packet */
3100     silc_server_packet_send(server, server->router->connection,
3101                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3102                             servers->data, servers->len, TRUE);
3103
3104     silc_buffer_free(servers);
3105   }
3106 }
3107
3108 /* Returns assembled packet of all clients in the given ID list. The
3109    packet's form is dictated by the New ID Payload. */
3110
3111 static void silc_server_announce_get_clients(SilcServer server,
3112                                              SilcIDList id_list,
3113                                              SilcBuffer *clients)
3114 {
3115   SilcIDCacheList list;
3116   SilcIDCacheEntry id_cache;
3117   SilcClientEntry client;
3118   SilcBuffer idp;
3119
3120   /* Go through all clients in the list */
3121   if (silc_idcache_find_by_id(id_list->clients, SILC_ID_CACHE_ANY, 
3122                               SILC_ID_CLIENT, &list)) {
3123     if (silc_idcache_list_first(list, &id_cache)) {
3124       while (id_cache) {
3125         client = (SilcClientEntry)id_cache->context;
3126
3127         idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
3128
3129         *clients = silc_buffer_realloc(*clients, 
3130                                        (*clients ? 
3131                                         (*clients)->truelen + idp->len : 
3132                                         idp->len));
3133         silc_buffer_pull_tail(*clients, ((*clients)->end - (*clients)->data));
3134         silc_buffer_put(*clients, idp->data, idp->len);
3135         silc_buffer_pull(*clients, idp->len);
3136         silc_buffer_free(idp);
3137
3138         if (!silc_idcache_list_next(list, &id_cache))
3139           break;
3140       }
3141     }
3142
3143     silc_idcache_list_free(list);
3144   }
3145 }
3146
3147 /* This function is used to announce our existing clients to our router
3148    when we've connected to it. */
3149
3150 void silc_server_announce_clients(SilcServer server)
3151 {
3152   SilcBuffer clients = NULL;
3153
3154   SILC_LOG_DEBUG(("Announcing clients"));
3155
3156   /* Get clients in local list */
3157   silc_server_announce_get_clients(server, server->local_list,
3158                                    &clients);
3159
3160   /* As router we announce our global list as well */
3161   if (server->server_type == SILC_ROUTER)
3162     silc_server_announce_get_clients(server, server->global_list,
3163                                      &clients);
3164
3165   if (clients) {
3166     silc_buffer_push(clients, clients->data - clients->head);
3167     SILC_LOG_HEXDUMP(("clients"), clients->data, clients->len);
3168
3169     /* Send the packet */
3170     silc_server_packet_send(server, server->router->connection,
3171                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3172                             clients->data, clients->len, TRUE);
3173
3174     silc_buffer_free(clients);
3175   }
3176 }
3177
3178 static SilcBuffer 
3179 silc_server_announce_encode_join(uint32 argc, ...)
3180 {
3181   va_list ap;
3182
3183   va_start(ap, argc);
3184   return silc_notify_payload_encode(SILC_NOTIFY_TYPE_JOIN, argc, ap);
3185 }
3186
3187 /* Returns assembled packets for channel users of the `channel'. */
3188
3189 void silc_server_announce_get_channel_users(SilcServer server,
3190                                             SilcChannelEntry channel,
3191                                             SilcBuffer *channel_users)
3192 {
3193   SilcChannelClientEntry chl;
3194   SilcBuffer chidp, clidp;
3195   SilcBuffer tmp;
3196   int len;
3197
3198   SILC_LOG_DEBUG(("Start"));
3199
3200   /* Now find all users on the channel */
3201   chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
3202   silc_list_start(channel->user_list);
3203   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
3204     clidp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3205     tmp = silc_server_announce_encode_join(2, clidp->data, clidp->len,
3206                                            chidp->data, chidp->len);
3207     len = tmp->len;
3208     *channel_users = 
3209       silc_buffer_realloc(*channel_users, 
3210                           (*channel_users ? 
3211                            (*channel_users)->truelen + len : len));
3212     silc_buffer_pull_tail(*channel_users, 
3213                           ((*channel_users)->end - 
3214                            (*channel_users)->data));
3215     
3216     silc_buffer_put(*channel_users, tmp->data, tmp->len);
3217     silc_buffer_pull(*channel_users, len);
3218     silc_buffer_free(clidp);
3219     silc_buffer_free(tmp);
3220   }
3221   silc_buffer_free(chidp);
3222 }
3223
3224 /* Returns assembled packets for all channels and users on those channels
3225    from the given ID List. The packets are in the form dictated by the
3226    New Channel and New Channel User payloads. */
3227
3228 void silc_server_announce_get_channels(SilcServer server,
3229                                        SilcIDList id_list,
3230                                        SilcBuffer *channels,
3231                                        SilcBuffer *channel_users)
3232 {
3233   SilcIDCacheList list;
3234   SilcIDCacheEntry id_cache;
3235   SilcChannelEntry channel;
3236   unsigned char *cid;
3237   uint16 name_len;
3238   int len;
3239
3240   SILC_LOG_DEBUG(("Start"));
3241
3242   /* Go through all channels in the list */
3243   if (silc_idcache_find_by_id(id_list->channels, SILC_ID_CACHE_ANY, 
3244                               SILC_ID_CHANNEL, &list)) {
3245     if (silc_idcache_list_first(list, &id_cache)) {
3246       while (id_cache) {
3247         channel = (SilcChannelEntry)id_cache->context;
3248         
3249         cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3250         name_len = strlen(channel->channel_name);
3251
3252         len = 4 + name_len + SILC_ID_CHANNEL_LEN + 4;
3253         *channels = 
3254           silc_buffer_realloc(*channels, 
3255                               (*channels ? (*channels)->truelen + len : len));
3256         silc_buffer_pull_tail(*channels, 
3257                               ((*channels)->end - (*channels)->data));
3258         silc_buffer_format(*channels,
3259                            SILC_STR_UI_SHORT(name_len),
3260                            SILC_STR_UI_XNSTRING(channel->channel_name, 
3261                                                 name_len),
3262                            SILC_STR_UI_SHORT(SILC_ID_CHANNEL_LEN),
3263                            SILC_STR_UI_XNSTRING(cid, SILC_ID_CHANNEL_LEN),
3264                            SILC_STR_UI_INT(channel->mode),
3265                            SILC_STR_END);
3266         silc_buffer_pull(*channels, len);
3267
3268         silc_server_announce_get_channel_users(server, channel,
3269                                                channel_users);
3270
3271         silc_free(cid);
3272
3273         if (!silc_idcache_list_next(list, &id_cache))
3274           break;
3275       }
3276     }
3277
3278     silc_idcache_list_free(list);
3279   }
3280 }
3281
3282 /* This function is used to announce our existing channels to our router
3283    when we've connected to it. This also announces the users on the
3284    channels to the router. */
3285
3286 void silc_server_announce_channels(SilcServer server)
3287 {
3288   SilcBuffer channels = NULL, channel_users = NULL;
3289
3290   SILC_LOG_DEBUG(("Announcing channels and channel users"));
3291
3292   /* Get channels and channel users in local list */
3293   silc_server_announce_get_channels(server, server->local_list,
3294                                     &channels, &channel_users);
3295
3296   /* Get channels and channel users in global list */
3297   silc_server_announce_get_channels(server, server->global_list,
3298                                     &channels, &channel_users);
3299
3300   if (channels) {
3301     silc_buffer_push(channels, channels->data - channels->head);
3302     SILC_LOG_HEXDUMP(("channels"), channels->data, channels->len);
3303
3304     /* Send the packet */
3305     silc_server_packet_send(server, server->router->connection,
3306                             SILC_PACKET_NEW_CHANNEL, SILC_PACKET_FLAG_LIST,
3307                             channels->data, channels->len,
3308                             FALSE);
3309
3310     silc_buffer_free(channels);
3311   }
3312
3313   if (channel_users) {
3314     silc_buffer_push(channel_users, channel_users->data - channel_users->head);
3315     SILC_LOG_HEXDUMP(("channel users"), channel_users->data, 
3316                      channel_users->len);
3317
3318     /* Send the packet */
3319     silc_server_packet_send(server, server->router->connection,
3320                             SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3321                             channel_users->data, channel_users->len,
3322                             FALSE);
3323
3324     silc_buffer_free(channel_users);
3325   }
3326 }
3327
3328 /* Failure timeout callback. If this is called then we will immediately
3329    process the received failure. We always process the failure with timeout
3330    since we do not want to blindly trust to received failure packets. 
3331    This won't be called (the timeout is cancelled) if the failure was
3332    bogus (it is bogus if remote does not close the connection after sending
3333    the failure). */
3334
3335 SILC_TASK_CALLBACK(silc_server_failure_callback)
3336 {
3337   SilcServerFailureContext f = (SilcServerFailureContext)context;
3338
3339   if (f->sock->protocol) {
3340     f->sock->protocol->state = SILC_PROTOCOL_STATE_FAILURE;
3341     f->sock->protocol->execute(f->server->timeout_queue, 0,
3342                                f->sock->protocol, f->sock->sock, 0, 0);
3343   }
3344
3345   silc_free(f);
3346 }
3347
3348 /* Assembles user list and users mode list from the `channel'. */
3349
3350 void silc_server_get_users_on_channel(SilcServer server,
3351                                       SilcChannelEntry channel,
3352                                       SilcBuffer *user_list,
3353                                       SilcBuffer *mode_list,
3354                                       uint32 *user_count)
3355 {
3356   SilcChannelClientEntry chl;
3357   SilcBuffer client_id_list;
3358   SilcBuffer client_mode_list;
3359   SilcBuffer idp;
3360   uint32 list_count = 0;
3361
3362   client_id_list = silc_buffer_alloc((SILC_ID_CLIENT_LEN + 4) * 
3363                                      silc_list_count(channel->user_list));
3364   client_mode_list = silc_buffer_alloc(4 * 
3365                                        silc_list_count(channel->user_list));
3366   silc_buffer_pull_tail(client_id_list, SILC_BUFFER_END(client_id_list));
3367   silc_buffer_pull_tail(client_mode_list, SILC_BUFFER_END(client_mode_list));
3368   silc_list_start(channel->user_list);
3369   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
3370     /* Client ID */
3371     idp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3372     silc_buffer_put(client_id_list, idp->data, idp->len);
3373     silc_buffer_pull(client_id_list, idp->len);
3374     silc_buffer_free(idp);
3375
3376     /* Client's mode on channel */
3377     SILC_PUT32_MSB(chl->mode, client_mode_list->data);
3378     silc_buffer_pull(client_mode_list, 4);
3379
3380     list_count++;
3381   }
3382   silc_buffer_push(client_id_list, 
3383                    client_id_list->data - client_id_list->head);
3384   silc_buffer_push(client_mode_list, 
3385                    client_mode_list->data - client_mode_list->head);
3386
3387   *user_list = client_id_list;
3388   *mode_list = client_mode_list;
3389   *user_count = list_count;
3390 }
3391
3392 /* Saves users and their modes to the `channel'. */
3393
3394 void silc_server_save_users_on_channel(SilcServer server,
3395                                        SilcSocketConnection sock,
3396                                        SilcChannelEntry channel,
3397                                        SilcClientID *noadd,
3398                                        SilcBuffer user_list,
3399                                        SilcBuffer mode_list,
3400                                        uint32 user_count)
3401 {
3402   int i;
3403
3404   /* Cache the received Client ID's and modes. This cache expires
3405      whenever server sends notify message to channel. It means two things;
3406      some user has joined or leaved the channel. XXX TODO! */
3407   for (i = 0; i < user_count; i++) {
3408     uint16 idp_len;
3409     uint32 mode;
3410     SilcClientID *client_id;
3411     SilcClientEntry client;
3412
3413     /* Client ID */
3414     SILC_GET16_MSB(idp_len, user_list->data + 2);
3415     idp_len += 4;
3416     client_id = silc_id_payload_parse_id(user_list->data, idp_len);
3417     silc_buffer_pull(user_list, idp_len);
3418     if (!client_id)
3419       continue;
3420
3421     /* Mode */
3422     SILC_GET32_MSB(mode, mode_list->data);
3423     silc_buffer_pull(mode_list, 4);
3424
3425     if (noadd && !SILC_ID_CLIENT_COMPARE(client_id, noadd)) {
3426       silc_free(client_id);
3427       continue;
3428     }
3429     
3430     /* Check if we have this client cached already. */
3431     client = silc_idlist_find_client_by_id(server->local_list, client_id,
3432                                            NULL);
3433     if (!client)
3434       client = silc_idlist_find_client_by_id(server->global_list, 
3435                                              client_id, NULL);
3436     if (!client) {
3437       /* If router did not find such Client ID in its lists then this must
3438          be bogus client or some router in the net is buggy. */
3439       if (server->server_type == SILC_ROUTER) {
3440         silc_free(client_id);
3441         continue;
3442       }
3443
3444       /* We don't have that client anywhere, add it. The client is added
3445          to global list since server didn't have it in the lists so it must be 
3446          global. */
3447       client = silc_idlist_add_client(server->global_list, NULL, 0, NULL, 
3448                                       NULL, 
3449                                       silc_id_dup(client_id, SILC_ID_CLIENT), 
3450                                       sock->user_data, NULL);
3451       if (!client) {
3452         silc_free(client_id);
3453         continue;
3454       }
3455
3456       client->data.registered = TRUE;
3457     }
3458
3459     silc_free(client_id);
3460
3461     if (!silc_server_client_on_channel(client, channel)) {
3462       /* Client was not on the channel, add it. */
3463       SilcChannelClientEntry chl = silc_calloc(1, sizeof(*chl));
3464       chl->client = client;
3465       chl->mode = mode;
3466       chl->channel = channel;
3467       silc_list_add(channel->user_list, chl);
3468       silc_list_add(client->channels, chl);
3469     }
3470   }
3471 }
3472
3473 /* Lookups route to the client indicated by the `id_data'. The connection
3474    object and internal data object is returned. Returns NULL if route
3475    could not be found to the client. If the `client_id' is specified then
3476    it is used and the `id_data' is ignored. */
3477
3478 SilcSocketConnection silc_server_get_client_route(SilcServer server,
3479                                                   unsigned char *id_data,
3480                                                   uint32 id_len,
3481                                                   SilcClientID *client_id,
3482                                                   SilcIDListData *idata)
3483 {
3484   SilcClientID *id;
3485   SilcClientEntry client;
3486
3487   SILC_LOG_DEBUG(("Start"));
3488
3489   /* Decode destination Client ID */
3490   if (!client_id) {
3491     id = silc_id_str2id(id_data, id_len, SILC_ID_CLIENT);
3492     if (!id) {
3493       SILC_LOG_ERROR(("Could not decode destination Client ID, dropped"));
3494       return NULL;
3495     }
3496   } else {
3497     id = silc_id_dup(client_id, SILC_ID_CLIENT);
3498   }
3499
3500   /* If the destination belongs to our server we don't have to route
3501      the packet anywhere but to send it to the local destination. */
3502   client = silc_idlist_find_client_by_id(server->local_list, id, NULL);
3503   if (client) {
3504     silc_free(id);
3505
3506     if (client && client->data.registered == FALSE)
3507       return NULL;
3508
3509     /* If we are router and the client has router then the client is in
3510        our cell but not directly connected to us. */
3511     if (server->server_type == SILC_ROUTER && client->router) {
3512       /* We are of course in this case the client's router thus the real
3513          "router" of the client is the server who owns the client. Thus
3514          we will send the packet to that server. */
3515       if (idata)
3516         *idata = (SilcIDListData)client->router;
3517       return client->router->connection;
3518     }
3519
3520     /* Seems that client really is directly connected to us */
3521     if (idata)
3522       *idata = (SilcIDListData)client;
3523     return client->connection;
3524   }
3525
3526   /* Destination belongs to someone not in this server. If we are normal
3527      server our action is to send the packet to our router. */
3528   if (server->server_type == SILC_SERVER && !server->standalone) {
3529     silc_free(id);
3530     if (idata)
3531       *idata = (SilcIDListData)server->router;
3532     return server->router->connection;
3533   }
3534
3535   /* We are router and we will perform route lookup for the destination 
3536      and send the packet to fastest route. */
3537   if (server->server_type == SILC_ROUTER && !server->standalone) {
3538     /* Check first that the ID is valid */
3539     client = silc_idlist_find_client_by_id(server->global_list, id, NULL);
3540     if (client) {
3541       SilcSocketConnection dst_sock;
3542
3543       dst_sock = silc_server_route_get(server, id, SILC_ID_CLIENT);
3544
3545       silc_free(id);
3546       if (idata)
3547         *idata = (SilcIDListData)dst_sock->user_data;
3548       return dst_sock;
3549     }
3550   }
3551
3552   silc_free(id);
3553   return NULL;
3554 }
3555
3556 /* Encodes and returns channel list of channels the `client' has joined.
3557    Secret channels are not put to the list. */
3558
3559 SilcBuffer silc_server_get_client_channel_list(SilcServer server,
3560                                                SilcClientEntry client)
3561 {
3562   SilcBuffer buffer = NULL;
3563   SilcChannelEntry channel;
3564   SilcChannelClientEntry chl;
3565   unsigned char *cid;
3566   uint16 name_len;
3567   int len;
3568
3569   silc_list_start(client->channels);
3570   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
3571     channel = chl->channel;
3572
3573     if (channel->mode & SILC_CHANNEL_MODE_SECRET)
3574       continue;
3575
3576     cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3577     name_len = strlen(channel->channel_name);
3578     
3579     len = 4 + name_len + SILC_ID_CHANNEL_LEN + 4;
3580     buffer = silc_buffer_realloc(buffer, 
3581                                  (buffer ? (buffer)->truelen + len : len));
3582     silc_buffer_pull_tail(buffer, ((buffer)->end - (buffer)->data));
3583     silc_buffer_format(buffer,
3584                        SILC_STR_UI_SHORT(name_len),
3585                        SILC_STR_UI_XNSTRING(channel->channel_name, 
3586                                             name_len),
3587                        SILC_STR_UI_SHORT(SILC_ID_CHANNEL_LEN),
3588                        SILC_STR_UI_XNSTRING(cid, SILC_ID_CHANNEL_LEN),
3589                        SILC_STR_UI_INT(chl->mode), /* Client's mode */
3590                        SILC_STR_END);
3591     silc_buffer_pull(buffer, len);
3592     silc_free(cid);
3593   }
3594
3595   if (buffer)
3596     silc_buffer_push(buffer, buffer->data - buffer->head);
3597
3598   return buffer;
3599 }
3600
3601 /* Finds client entry by Client ID and if it is not found then resolves
3602    it using WHOIS command. */
3603
3604 SilcClientEntry silc_server_get_client_resolve(SilcServer server,
3605                                                SilcClientID *client_id)
3606 {
3607   SilcClientEntry client;
3608
3609   client = silc_idlist_find_client_by_id(server->local_list, client_id, NULL);
3610   if (!client) {
3611     client = silc_idlist_find_client_by_id(server->global_list, 
3612                                            client_id, NULL);
3613     if (!client && server->server_type == SILC_ROUTER)
3614       return NULL;
3615   }
3616
3617   if (!client && server->standalone)
3618     return NULL;
3619
3620   if (!client || !client->nickname || !client->username) {
3621     SilcBuffer buffer, idp;
3622
3623     idp = silc_id_payload_encode(client_id, SILC_ID_CLIENT);
3624     buffer = silc_command_payload_encode_va(SILC_COMMAND_WHOIS,
3625                                             ++server->cmd_ident, 1,
3626                                             3, idp->data, idp->len);
3627     silc_server_packet_send(server, client ? client->router->connection :
3628                             server->router->connection,
3629                             SILC_PACKET_COMMAND, 0,
3630                             buffer->data, buffer->len, FALSE);
3631     silc_buffer_free(idp);
3632     silc_buffer_free(buffer);
3633   }
3634
3635   return client;
3636 }
3637
3638 /* A timeout callback for the re-key. We will be the initiator of the
3639    re-key protocol. */
3640
3641 SILC_TASK_CALLBACK(silc_server_rekey_callback)
3642 {
3643   SilcSocketConnection sock = (SilcSocketConnection)context;
3644   SilcIDListData idata = (SilcIDListData)sock->user_data;
3645   SilcServer server = (SilcServer)idata->rekey->context;
3646   SilcProtocol protocol;
3647   SilcServerRekeyInternalContext *proto_ctx;
3648
3649   SILC_LOG_DEBUG(("Start"));
3650
3651   /* Allocate internal protocol context. This is sent as context
3652      to the protocol. */
3653   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
3654   proto_ctx->server = (void *)server;
3655   proto_ctx->sock = sock;
3656   proto_ctx->responder = FALSE;
3657   proto_ctx->pfs = idata->rekey->pfs;
3658       
3659   /* Perform rekey protocol. Will call the final callback after the
3660      protocol is over. */
3661   silc_protocol_alloc(SILC_PROTOCOL_SERVER_REKEY, 
3662                       &protocol, proto_ctx, silc_server_rekey_final);
3663   sock->protocol = protocol;
3664       
3665   /* Run the protocol */
3666   protocol->execute(server->timeout_queue, 0, protocol, 
3667                     sock->sock, 0, 0);
3668
3669   /* Re-register re-key timeout */
3670   silc_task_register(server->timeout_queue, sock->sock, 
3671                      silc_server_rekey_callback,
3672                      context, idata->rekey->timeout, 0,
3673                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
3674 }
3675
3676 /* The final callback for the REKEY protocol. This will actually take the
3677    new key material into use. */
3678
3679 SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final)
3680 {
3681   SilcProtocol protocol = (SilcProtocol)context;
3682   SilcServerRekeyInternalContext *ctx =
3683     (SilcServerRekeyInternalContext *)protocol->context;
3684   SilcServer server = (SilcServer)ctx->server;
3685   SilcSocketConnection sock = ctx->sock;
3686
3687   SILC_LOG_DEBUG(("Start"));
3688
3689   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
3690       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
3691     /* Error occured during protocol */
3692     silc_protocol_cancel(server->timeout_queue, protocol);
3693     silc_protocol_free(protocol);
3694     sock->protocol = NULL;
3695     if (ctx->packet)
3696       silc_packet_context_free(ctx->packet);
3697     if (ctx->ske)
3698       silc_ske_free(ctx->ske);
3699     silc_free(ctx);
3700     return;
3701   }
3702
3703   /* Take the keys into use */
3704   if (ctx->pfs == TRUE)
3705     silc_server_protocol_rekey_generate_pfs(server, ctx);
3706   else
3707     silc_server_protocol_rekey_generate(server, ctx);
3708
3709   /* Cleanup */
3710   silc_protocol_free(protocol);
3711   sock->protocol = NULL;
3712   if (ctx->packet)
3713     silc_packet_context_free(ctx->packet);
3714   if (ctx->ske)
3715     silc_ske_free(ctx->ske);
3716   silc_free(ctx);
3717 }