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