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