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 /* Accepts new connections to the server. Accepting new connections are
935    done in three parts to make it async. */
936
937 SILC_TASK_CALLBACK(silc_server_accept_new_connection)
938 {
939   SilcServer server = (SilcServer)context;
940   SilcSocketConnection newsocket;
941   SilcServerKEInternalContext *proto_ctx;
942   int sock, port;
943   void *cconfig, *sconfig, *rconfig;
944   SilcServerConfigSectionDenyConnection *deny;
945
946   SILC_LOG_DEBUG(("Accepting new connection"));
947
948   server->stat.conn_attempts++;
949
950   sock = silc_net_accept_connection(server->sock);
951   if (sock < 0) {
952     SILC_LOG_ERROR(("Could not accept new connection: %s", strerror(errno)));
953     server->stat.conn_failures++;
954     return;
955   }
956
957   /* Check max connections */
958   if (sock > SILC_SERVER_MAX_CONNECTIONS) {
959     SILC_LOG_ERROR(("Refusing connection, server is full"));
960     server->stat.conn_failures++;
961     return;
962   }
963
964   /* Set socket options */
965   silc_net_set_socket_nonblock(sock);
966   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
967
968   /* We don't create a ID yet, since we don't know what type of connection
969      this is yet. But, we do add the connection to the socket table. */
970   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
971   server->sockets[sock] = newsocket;
972
973   /* XXX This MUST be done async as this will block the entire server
974      process. Either we have to do our own resolver stuff or in the future
975      we can use threads. */
976   /* Perform name and address lookups for the remote host. */
977   if (!silc_net_check_host_by_sock(sock, &newsocket->hostname, 
978                                    &newsocket->ip)) {
979     if ((server->params->require_reverse_mapping && !newsocket->hostname) ||
980         !newsocket->ip) {
981       SILC_LOG_ERROR(("IP/DNS lookup failed %s",
982                       newsocket->hostname ? newsocket->hostname :
983                       newsocket->ip ? newsocket->ip : ""));
984       server->stat.conn_failures++;
985       return;
986     }
987     if (!newsocket->hostname)
988       newsocket->hostname = strdup(newsocket->ip);
989   }
990   newsocket->port = silc_net_get_remote_port(sock);
991
992   /* Register the connection for network input and output. This sets
993      that scheduler will listen for incoming packets for this connection 
994      and sets that outgoing packets may be sent to this connection as well.
995      However, this doesn't set the scheduler for outgoing traffic, it
996      will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
997      later when outgoing data is available. */
998   SILC_REGISTER_CONNECTION_FOR_IO(sock);
999
1000   SILC_LOG_INFO(("Incoming connection from %s (%s)", newsocket->hostname,
1001                  newsocket->ip));
1002
1003   port = server->sockets[fd]->port; /* Listenning port */
1004
1005   /* Check whether this connection is denied to connect to us. */
1006   deny = silc_server_config_denied_conn(server->config, newsocket->ip, port);
1007   if (!deny)
1008     deny = silc_server_config_denied_conn(server->config, newsocket->hostname,
1009                                           port);
1010   if (deny) {
1011     /* The connection is denied */
1012     SILC_LOG_INFO(("Connection %s (%s) is denied", 
1013                    newsocket->hostname, newsocket->ip));
1014     silc_server_disconnect_remote(server, newsocket, deny->comment ?
1015                                   deny->comment :
1016                                   "Server closed connection: "
1017                                   "Connection refused");
1018     server->stat.conn_failures++;
1019     return;
1020   }
1021
1022   /* Check whether we have configred this sort of connection at all. We
1023      have to check all configurations since we don't know what type of
1024      connection this is. */
1025   if (!(cconfig = silc_server_config_find_client_conn(server->config,
1026                                                       newsocket->ip, port)))
1027     cconfig = silc_server_config_find_client_conn(server->config,
1028                                                   newsocket->hostname, 
1029                                                   port);
1030   if (!(sconfig = silc_server_config_find_server_conn(server->config,
1031                                                      newsocket->ip, 
1032                                                      port)))
1033     sconfig = silc_server_config_find_server_conn(server->config,
1034                                                   newsocket->hostname,
1035                                                   port);
1036   if (!(rconfig = silc_server_config_find_router_conn(server->config,
1037                                                      newsocket->ip, port)))
1038     rconfig = silc_server_config_find_router_conn(server->config,
1039                                                   newsocket->hostname, 
1040                                                   port);
1041   if (!cconfig && !sconfig && !rconfig) {
1042     silc_server_disconnect_remote(server, newsocket, 
1043                                   "Server closed connection: "
1044                                   "Connection refused");
1045     server->stat.conn_failures++;
1046     return;
1047   }
1048
1049   /* The connection is allowed */
1050
1051   /* Allocate internal context for key exchange protocol. This is
1052      sent as context for the protocol. */
1053   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
1054   proto_ctx->server = context;
1055   proto_ctx->sock = newsocket;
1056   proto_ctx->rng = server->rng;
1057   proto_ctx->responder = TRUE;
1058   proto_ctx->cconfig = cconfig;
1059   proto_ctx->sconfig = sconfig;
1060   proto_ctx->rconfig = rconfig;
1061
1062   /* Prepare the connection for key exchange protocol. We allocate the
1063      protocol but will not start it yet. The connector will be the
1064      initiator of the protocol thus we will wait for initiation from 
1065      there before we start the protocol. */
1066   server->stat.auth_attempts++;
1067   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
1068                       &newsocket->protocol, proto_ctx, 
1069                       silc_server_accept_new_connection_second);
1070
1071   /* Register a timeout task that will be executed if the connector
1072      will not start the key exchange protocol within 60 seconds. For
1073      now, this is a hard coded limit. After 60 secs the connection will
1074      be closed if the key exchange protocol has not been started. */
1075   proto_ctx->timeout_task = 
1076     silc_task_register(server->timeout_queue, newsocket->sock, 
1077                        silc_server_timeout_remote,
1078                        context, 60, 0,
1079                        SILC_TASK_TIMEOUT,
1080                        SILC_TASK_PRI_LOW);
1081 }
1082
1083 /* Second part of accepting new connection. Key exchange protocol has been
1084    performed and now it is time to do little connection authentication
1085    protocol to figure out whether this connection is client or server
1086    and whether it has right to access this server (especially server
1087    connections needs to be authenticated). */
1088
1089 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second)
1090 {
1091   SilcProtocol protocol = (SilcProtocol)context;
1092   SilcServerKEInternalContext *ctx = 
1093     (SilcServerKEInternalContext *)protocol->context;
1094   SilcServer server = (SilcServer)ctx->server;
1095   SilcSocketConnection sock = ctx->sock;
1096   SilcServerConnAuthInternalContext *proto_ctx;
1097
1098   SILC_LOG_DEBUG(("Start"));
1099
1100   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
1101       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
1102     /* Error occured during protocol */
1103     silc_protocol_free(protocol);
1104     sock->protocol = NULL;
1105     silc_ske_free_key_material(ctx->keymat);
1106     if (ctx->packet)
1107       silc_packet_context_free(ctx->packet);
1108     if (ctx->ske)
1109       silc_ske_free(ctx->ske);
1110     if (ctx->dest_id)
1111       silc_free(ctx->dest_id);
1112     silc_free(ctx);
1113     silc_task_unregister_by_callback(server->timeout_queue,
1114                                      silc_server_failure_callback);
1115     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1116                                   "Key exchange failed");
1117     server->stat.auth_failures++;
1118     return;
1119   }
1120
1121   /* We now have the key material as the result of the key exchange
1122      protocol. Take the key material into use. Free the raw key material
1123      as soon as we've set them into use. */
1124   if (!silc_server_protocol_ke_set_keys(ctx->ske, ctx->sock, ctx->keymat,
1125                                         ctx->ske->prop->cipher,
1126                                         ctx->ske->prop->pkcs,
1127                                         ctx->ske->prop->hash,
1128                                         ctx->ske->prop->hmac,
1129                                         ctx->ske->prop->group,
1130                                         ctx->responder)) {
1131     silc_protocol_free(protocol);
1132     sock->protocol = NULL;
1133     silc_ske_free_key_material(ctx->keymat);
1134     if (ctx->packet)
1135       silc_packet_context_free(ctx->packet);
1136     if (ctx->ske)
1137       silc_ske_free(ctx->ske);
1138     if (ctx->dest_id)
1139       silc_free(ctx->dest_id);
1140     silc_free(ctx);
1141     silc_task_unregister_by_callback(server->timeout_queue,
1142                                      silc_server_failure_callback);
1143     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1144                                   "Key exchange failed");
1145     server->stat.auth_failures++;
1146     return;
1147   }    
1148   silc_ske_free_key_material(ctx->keymat);
1149
1150   /* Allocate internal context for the authentication protocol. This
1151      is sent as context for the protocol. */
1152   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
1153   proto_ctx->server = (void *)server;
1154   proto_ctx->sock = sock;
1155   proto_ctx->ske = ctx->ske;    /* Save SKE object from previous protocol */
1156   proto_ctx->responder = TRUE;
1157   proto_ctx->dest_id_type = ctx->dest_id_type;
1158   proto_ctx->dest_id = ctx->dest_id;
1159   proto_ctx->cconfig = ctx->cconfig;
1160   proto_ctx->sconfig = ctx->sconfig;
1161   proto_ctx->rconfig = ctx->rconfig;
1162
1163   /* Free old protocol as it is finished now */
1164   silc_protocol_free(protocol);
1165   if (ctx->packet)
1166     silc_packet_context_free(ctx->packet);
1167   silc_free(ctx);
1168   sock->protocol = NULL;
1169
1170   /* Allocate the authentication protocol. This is allocated here
1171      but we won't start it yet. We will be receiving party of this
1172      protocol thus we will wait that connecting party will make
1173      their first move. */
1174   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
1175                       &sock->protocol, proto_ctx, 
1176                       silc_server_accept_new_connection_final);
1177
1178   /* Register timeout task. If the protocol is not executed inside
1179      this timelimit the connection will be terminated. Currently
1180      this is 60 seconds and is hard coded limit (XXX). */
1181   proto_ctx->timeout_task = 
1182     silc_task_register(server->timeout_queue, sock->sock, 
1183                        silc_server_timeout_remote,
1184                        (void *)server, 60, 0,
1185                        SILC_TASK_TIMEOUT,
1186                        SILC_TASK_PRI_LOW);
1187 }
1188
1189 /* Final part of accepting new connection. The connection has now
1190    been authenticated and keys has been exchanged. We also know whether
1191    this is client or server connection. */
1192
1193 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final)
1194 {
1195   SilcProtocol protocol = (SilcProtocol)context;
1196   SilcServerConnAuthInternalContext *ctx = 
1197     (SilcServerConnAuthInternalContext *)protocol->context;
1198   SilcServer server = (SilcServer)ctx->server;
1199   SilcSocketConnection sock = ctx->sock;
1200   SilcServerHBContext hb_context;
1201   void *id_entry = NULL;
1202
1203   SILC_LOG_DEBUG(("Start"));
1204
1205   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
1206       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
1207     /* Error occured during protocol */
1208     silc_protocol_free(protocol);
1209     sock->protocol = NULL;
1210     if (ctx->packet)
1211       silc_packet_context_free(ctx->packet);
1212     if (ctx->ske)
1213       silc_ske_free(ctx->ske);
1214     if (ctx->dest_id)
1215       silc_free(ctx->dest_id);
1216     silc_free(ctx);
1217     if (sock)
1218       sock->protocol = NULL;
1219     silc_task_unregister_by_callback(server->timeout_queue,
1220                                      silc_server_failure_callback);
1221     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1222                                   "Authentication failed");
1223     server->stat.auth_failures++;
1224     return;
1225   }
1226
1227   switch(ctx->conn_type) {
1228   case SILC_SOCKET_TYPE_CLIENT:
1229     {
1230       SilcClientEntry client;
1231
1232       SILC_LOG_DEBUG(("Remote host is client"));
1233       SILC_LOG_INFO(("Connection from %s (%s) is client", sock->hostname,
1234                      sock->ip));
1235
1236       /* Add the client to the client ID cache. The nickname and Client ID
1237          and other information is created after we have received NEW_CLIENT
1238          packet from client. */
1239       client = silc_idlist_add_client(server->local_list, 
1240                                       NULL, NULL, NULL, NULL, NULL, sock);
1241       if (!client) {
1242         SILC_LOG_ERROR(("Could not add new client to cache"));
1243         silc_free(sock->user_data);
1244         silc_server_disconnect_remote(server, sock, 
1245                                       "Server closed connection: "
1246                                       "Authentication failed");
1247         server->stat.auth_failures++;
1248         goto out;
1249       }
1250
1251       /* Statistics */
1252       server->stat.my_clients++;
1253       server->stat.clients++;
1254       if (server->server_type == SILC_ROUTER)
1255         server->stat.cell_clients++;
1256
1257       id_entry = (void *)client;
1258       break;
1259     }
1260   case SILC_SOCKET_TYPE_SERVER:
1261   case SILC_SOCKET_TYPE_ROUTER:
1262     {
1263       SilcServerEntry new_server;
1264       SilcServerConfigSectionServerConnection *conn = 
1265         ctx->conn_type == SILC_SOCKET_TYPE_SERVER ? 
1266         ctx->sconfig : ctx->rconfig;
1267
1268       SILC_LOG_DEBUG(("Remote host is %s", 
1269                       ctx->conn_type == SILC_SOCKET_TYPE_SERVER ? 
1270                       "server" : "router"));
1271       SILC_LOG_INFO(("Connection from %s (%s) is %s", sock->hostname,
1272                      sock->ip, ctx->conn_type == SILC_SOCKET_TYPE_SERVER ? 
1273                      "server" : "router"));
1274
1275       /* Add the server into server cache. The server name and Server ID
1276          is updated after we have received NEW_SERVER packet from the
1277          server. We mark ourselves as router for this server if we really
1278          are router. */
1279       new_server = 
1280         silc_idlist_add_server(server->local_list, NULL,
1281                                ctx->conn_type == SILC_SOCKET_TYPE_SERVER ?
1282                                SILC_SERVER : SILC_ROUTER, NULL, 
1283                                ctx->conn_type == SILC_SOCKET_TYPE_SERVER ?
1284                                server->id_entry : NULL, sock);
1285       if (!new_server) {
1286         SILC_LOG_ERROR(("Could not add new server to cache"));
1287         silc_free(sock->user_data);
1288         silc_server_disconnect_remote(server, sock, 
1289                                       "Server closed connection: "
1290                                       "Authentication failed");
1291         server->stat.auth_failures++;
1292         goto out;
1293       }
1294
1295       /* Statistics */
1296       if (ctx->conn_type == SILC_SOCKET_TYPE_SERVER)
1297         server->stat.my_servers++;
1298       else
1299         server->stat.my_routers++;
1300       server->stat.servers++;
1301
1302       id_entry = (void *)new_server;
1303
1304       /* Check whether this connection is to be our primary router connection
1305          if we dont' already have the primary route. */
1306       if (server->standalone && ctx->conn_type == SILC_SOCKET_TYPE_ROUTER) {
1307         if (silc_server_config_is_primary_route(server->config) &&
1308             !conn->initiator)
1309           break;
1310
1311         SILC_LOG_DEBUG(("We are not standalone server anymore"));
1312         server->standalone = FALSE;
1313         if (!server->id_entry->router) {
1314           server->id_entry->router = id_entry;
1315           server->router = id_entry;
1316         }
1317       }
1318
1319       break;
1320     }
1321   default:
1322     break;
1323   }
1324
1325   sock->type = ctx->conn_type;
1326
1327   /* Add the common data structure to the ID entry. */
1328   if (id_entry)
1329     silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
1330       
1331   /* Add to sockets internal pointer for fast referencing */
1332   silc_free(sock->user_data);
1333   sock->user_data = id_entry;
1334
1335   /* Connection has been fully established now. Everything is ok. */
1336   SILC_LOG_DEBUG(("New connection authenticated"));
1337
1338   /* Perform keepalive. The `hb_context' will be freed automatically
1339      when finally calling the silc_socket_free function. XXX hardcoded 
1340      timeout!! */
1341   hb_context = silc_calloc(1, sizeof(*hb_context));
1342   hb_context->server = server;
1343   silc_socket_set_heartbeat(sock, 600, hb_context,
1344                             silc_server_perform_heartbeat,
1345                             server->timeout_queue);
1346
1347  out:
1348   silc_task_unregister_by_callback(server->timeout_queue,
1349                                    silc_server_failure_callback);
1350   silc_protocol_free(protocol);
1351   if (ctx->packet)
1352     silc_packet_context_free(ctx->packet);
1353   if (ctx->ske)
1354     silc_ske_free(ctx->ske);
1355   if (ctx->dest_id)
1356     silc_free(ctx->dest_id);
1357   silc_free(ctx);
1358   sock->protocol = NULL;
1359 }
1360
1361 /* This function is used to read packets from network and send packets to
1362    network. This is usually a generic task. */
1363
1364 SILC_TASK_CALLBACK(silc_server_packet_process)
1365 {
1366   SilcServer server = (SilcServer)context;
1367   SilcSocketConnection sock = server->sockets[fd];
1368   SilcIDListData idata;
1369   SilcCipher cipher = NULL;
1370   SilcHmac hmac = NULL;
1371   int ret;
1372
1373   if (!sock)
1374     return;
1375
1376   SILC_LOG_DEBUG(("Processing packet"));
1377
1378   /* Packet sending */
1379
1380   if (type == SILC_TASK_WRITE) {
1381     /* Do not send data to disconnected connection */
1382     if (SILC_IS_DISCONNECTED(sock))
1383       return;
1384
1385     server->stat.packets_sent++;
1386
1387     if (sock->outbuf->data - sock->outbuf->head)
1388      silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
1389
1390     /* Send the packet */
1391     ret = silc_packet_send(sock, TRUE);
1392
1393     /* If returned -2 could not write to connection now, will do
1394        it later. */
1395     if (ret == -2)
1396       return;
1397
1398     if (ret == -1) {
1399       SILC_LOG_ERROR(("Error sending packet to connection "
1400                       "%s:%d [%s]", sock->hostname, sock->port,  
1401                       (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
1402                        sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
1403                        sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
1404                        "Router")));
1405       return;
1406     }
1407     
1408     /* The packet has been sent and now it is time to set the connection
1409        back to only for input. When there is again some outgoing data 
1410        available for this connection it will be set for output as well. 
1411        This call clears the output setting and sets it only for input. */
1412     SILC_SET_CONNECTION_FOR_INPUT(server->schedule, fd);
1413     SILC_UNSET_OUTBUF_PENDING(sock);
1414
1415     silc_buffer_clear(sock->outbuf);
1416     return;
1417   }
1418
1419   /* Packet receiving */
1420
1421   /* Read some data from connection */
1422   ret = silc_packet_receive(sock);
1423   if (ret < 0) {
1424
1425     if (ret == -1)
1426       SILC_LOG_ERROR(("Error receiving packet from connection "
1427                       "%s:%d [%s]", sock->hostname, sock->port,  
1428                       (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
1429                        sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
1430                        sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
1431                        "Router")));
1432     return;
1433   }    
1434
1435   /* EOF */
1436   if (ret == 0) {
1437     SILC_LOG_DEBUG(("Read EOF"));
1438       
1439     /* If connection is disconnecting already we will finally
1440        close the connection */
1441     if (SILC_IS_DISCONNECTING(sock)) {
1442       if (sock->user_data)
1443         silc_server_free_sock_user_data(server, sock);
1444       silc_server_close_connection(server, sock);
1445       return;
1446     }
1447       
1448     SILC_LOG_DEBUG(("Premature EOF from connection %d", sock->sock));
1449     SILC_SET_DISCONNECTING(sock);
1450
1451     /* If the closed connection was our primary router connection the
1452        start re-connecting phase. */
1453     if (!server->standalone && sock->type == SILC_SOCKET_TYPE_ROUTER && 
1454         sock == server->router->connection)
1455       silc_task_register(server->timeout_queue, 0, 
1456                          silc_server_connect_to_router,
1457                          context, 1, 0,
1458                          SILC_TASK_TIMEOUT,
1459                          SILC_TASK_PRI_NORMAL);
1460
1461     if (sock->user_data)
1462       silc_server_free_sock_user_data(server, sock);
1463     silc_server_close_connection(server, sock);
1464     return;
1465   }
1466
1467   /* If connection is disconnecting or disconnected we will ignore
1468      what we read. */
1469   if (SILC_IS_DISCONNECTING(sock) || SILC_IS_DISCONNECTED(sock)) {
1470     SILC_LOG_DEBUG(("Ignoring read data from disonnected connection"));
1471     return;
1472   }
1473
1474   server->stat.packets_received++;
1475
1476   /* Get keys and stuff from ID entry */
1477   idata = (SilcIDListData)sock->user_data;
1478   if (idata) {
1479     idata->last_receive = time(NULL);
1480     cipher = idata->receive_key;
1481     hmac = idata->hmac_receive;
1482   }
1483  
1484   /* Process the packet. This will call the parser that will then
1485      decrypt and parse the packet. */
1486   silc_packet_receive_process(sock, cipher, hmac, silc_server_packet_parse, 
1487                               server);
1488 }
1489
1490 /* Callback function that the silc_packet_decrypt will call to make the
1491    decision whether the packet is normal or special packet. We will 
1492    return TRUE if it is normal and FALSE if it is special */
1493
1494 static int silc_server_packet_decrypt_check(SilcPacketType packet_type,
1495                                             SilcBuffer buffer,
1496                                             SilcPacketContext *packet,
1497                                             void *context)
1498 {
1499   SilcPacketParserContext *parse_ctx = (SilcPacketParserContext *)context;
1500   SilcServer server = (SilcServer)parse_ctx->context;
1501
1502   /* Packet is normal packet, if: 
1503
1504      1) packet is private message packet and does not have private key set
1505      2) is other packet than channel message packet
1506      3) is channel message packet and remote is router and we are router 
1507
1508      all other packets are special packets 
1509   */
1510
1511   if (packet_type == SILC_PACKET_PRIVATE_MESSAGE &&
1512       (buffer->data[2] & SILC_PACKET_FLAG_PRIVMSG_KEY))
1513     return FALSE;
1514
1515   if (packet_type != SILC_PACKET_CHANNEL_MESSAGE || 
1516       (packet_type == SILC_PACKET_CHANNEL_MESSAGE &&
1517        parse_ctx->sock->type == SILC_SOCKET_TYPE_ROUTER &&
1518        server->server_type == SILC_ROUTER))
1519     return TRUE;
1520
1521   return FALSE;
1522 }
1523   
1524 /* Parses whole packet, received earlier. */
1525
1526 SILC_TASK_CALLBACK(silc_server_packet_parse_real)
1527 {
1528   SilcPacketParserContext *parse_ctx = (SilcPacketParserContext *)context;
1529   SilcServer server = (SilcServer)parse_ctx->context;
1530   SilcSocketConnection sock = parse_ctx->sock;
1531   SilcPacketContext *packet = parse_ctx->packet;
1532   SilcIDListData idata = (SilcIDListData)sock->user_data;
1533   int ret;
1534
1535   SILC_LOG_DEBUG(("Start"));
1536
1537   /* Decrypt the received packet */
1538   ret = silc_packet_decrypt(idata ? idata->receive_key : NULL, 
1539                             idata ? idata->hmac_receive : NULL, 
1540                             packet->buffer, packet,
1541                             silc_server_packet_decrypt_check, parse_ctx);
1542   if (ret < 0) {
1543     SILC_LOG_WARNING(("Packet decryption failed for connection "
1544                       "%s:%d [%s]", sock->hostname, sock->port,  
1545                       (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
1546                        sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
1547                        sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
1548                        "Router")));
1549     goto out;
1550   }
1551
1552   if (ret == 0) {
1553     /* Parse the packet. Packet type is returned. */
1554     ret = silc_packet_parse(packet);
1555   } else {
1556     /* Parse the packet header in special way as this is "special"
1557        packet type. */
1558     ret = silc_packet_parse_special(packet);
1559   }
1560
1561   if (ret == SILC_PACKET_NONE)
1562     goto out;
1563
1564   /* Check that the the current client ID is same as in the client's packet. */
1565   if (sock->type == SILC_SOCKET_TYPE_CLIENT) {
1566     SilcClientEntry client = (SilcClientEntry)sock->user_data;
1567     if (client && client->id) {
1568       void *id = silc_id_str2id(packet->src_id, packet->src_id_len,
1569                                 packet->src_id_type);
1570       if (!id || !SILC_ID_CLIENT_COMPARE(client->id, id)) {
1571         silc_free(id);
1572         goto out;
1573       }
1574       silc_free(id);
1575     }
1576   }
1577
1578   if (server->server_type == SILC_ROUTER) {
1579     /* Route the packet if it is not destined to us. Other ID types but
1580        server are handled separately after processing them. */
1581     if (!(packet->flags & SILC_PACKET_FLAG_BROADCAST) &&
1582         packet->dst_id_type == SILC_ID_SERVER && 
1583         sock->type != SILC_SOCKET_TYPE_CLIENT &&
1584         memcmp(packet->dst_id, server->id_string, packet->dst_id_len)) {
1585       
1586       /* Route the packet to fastest route for the destination ID */
1587       void *id = silc_id_str2id(packet->dst_id, packet->dst_id_len, 
1588                                 packet->dst_id_type);
1589       if (!id)
1590         goto out;
1591       silc_server_packet_route(server,
1592                                silc_server_route_get(server, id,
1593                                                      packet->dst_id_type),
1594                                packet);
1595       silc_free(id);
1596       goto out;
1597     }
1598   }
1599
1600   /* Parse the incoming packet type */
1601   silc_server_packet_parse_type(server, sock, packet);
1602
1603   if (server->server_type == SILC_ROUTER) {
1604     /* Broadcast packet if it is marked as broadcast packet and it is
1605        originated from router and we are router. */
1606     if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
1607         packet->flags & SILC_PACKET_FLAG_BROADCAST &&
1608         !server->standalone) {
1609       silc_server_packet_broadcast(server, server->router->connection, packet);
1610     }
1611   }
1612
1613  out:
1614   /*  silc_buffer_clear(sock->inbuf); */
1615   silc_packet_context_free(packet);
1616   silc_free(parse_ctx);
1617 }
1618
1619 /* Parser callback called by silc_packet_receive_process. This merely
1620    registers timeout that will handle the actual parsing when appropriate. */
1621
1622 void silc_server_packet_parse(SilcPacketParserContext *parser_context)
1623 {
1624   SilcServer server = (SilcServer)parser_context->context;
1625   SilcSocketConnection sock = parser_context->sock;
1626
1627   switch (sock->type) {
1628   case SILC_SOCKET_TYPE_UNKNOWN:
1629   case SILC_SOCKET_TYPE_CLIENT:
1630     /* Parse the packet with timeout */
1631     silc_task_register(server->timeout_queue, sock->sock,
1632                        silc_server_packet_parse_real,
1633                        (void *)parser_context, 0, 100000,
1634                        SILC_TASK_TIMEOUT,
1635                        SILC_TASK_PRI_NORMAL);
1636     break;
1637   case SILC_SOCKET_TYPE_SERVER:
1638   case SILC_SOCKET_TYPE_ROUTER:
1639     /* Packets from servers are parsed as soon as possible */
1640     silc_task_register(server->timeout_queue, sock->sock,
1641                        silc_server_packet_parse_real,
1642                        (void *)parser_context, 0, 1,
1643                        SILC_TASK_TIMEOUT,
1644                        SILC_TASK_PRI_NORMAL);
1645     break;
1646   default:
1647     return;
1648   }
1649 }
1650
1651 /* Parses the packet type and calls what ever routines the packet type
1652    requires. This is done for all incoming packets. */
1653
1654 void silc_server_packet_parse_type(SilcServer server, 
1655                                    SilcSocketConnection sock,
1656                                    SilcPacketContext *packet)
1657 {
1658   SilcPacketType type = packet->type;
1659
1660   SILC_LOG_DEBUG(("Parsing packet type %d", type));
1661
1662   /* Parse the packet type */
1663   switch(type) {
1664   case SILC_PACKET_DISCONNECT:
1665     SILC_LOG_DEBUG(("Disconnect packet"));
1666     if (packet->flags & SILC_PACKET_FLAG_LIST)
1667       break;
1668     break;
1669
1670   case SILC_PACKET_SUCCESS:
1671     /*
1672      * Success received for something. For now we can have only
1673      * one protocol for connection executing at once hence this
1674      * success message is for whatever protocol is executing currently.
1675      */
1676     SILC_LOG_DEBUG(("Success packet"));
1677     if (packet->flags & SILC_PACKET_FLAG_LIST)
1678       break;
1679     if (sock->protocol)
1680       silc_protocol_execute(sock->protocol, server->timeout_queue, 0, 0);
1681     break;
1682
1683   case SILC_PACKET_FAILURE:
1684     /*
1685      * Failure received for something. For now we can have only
1686      * one protocol for connection executing at once hence this
1687      * failure message is for whatever protocol is executing currently.
1688      */
1689     SILC_LOG_DEBUG(("Failure packet"));
1690     if (packet->flags & SILC_PACKET_FLAG_LIST)
1691       break;
1692     if (sock->protocol) {
1693       SilcServerFailureContext f;
1694       f = silc_calloc(1, sizeof(*f));
1695       f->server = server;
1696       f->sock = sock;
1697       
1698       /* We will wait 5 seconds to process this failure packet */
1699       silc_task_register(server->timeout_queue, sock->sock,
1700                          silc_server_failure_callback, (void *)f, 5, 0,
1701                          SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
1702     }
1703     break;
1704
1705   case SILC_PACKET_REJECT:
1706     SILC_LOG_DEBUG(("Reject packet"));
1707     if (packet->flags & SILC_PACKET_FLAG_LIST)
1708       break;
1709     return;
1710     break;
1711
1712   case SILC_PACKET_NOTIFY:
1713     /*
1714      * Received notify packet. Server can receive notify packets from
1715      * router. Server then relays the notify messages to clients if needed.
1716      */
1717     SILC_LOG_DEBUG(("Notify packet"));
1718     if (packet->flags & SILC_PACKET_FLAG_LIST)
1719       silc_server_notify_list(server, sock, packet);
1720     else
1721       silc_server_notify(server, sock, packet);
1722     break;
1723
1724     /* 
1725      * Channel packets
1726      */
1727   case SILC_PACKET_CHANNEL_MESSAGE:
1728     /*
1729      * Received channel message. Channel messages are special packets
1730      * (although probably most common ones) thus they are handled
1731      * specially.
1732      */
1733     SILC_LOG_DEBUG(("Channel Message packet"));
1734     if (packet->flags & SILC_PACKET_FLAG_LIST)
1735       break;
1736     silc_server_channel_message(server, sock, packet);
1737     break;
1738
1739   case SILC_PACKET_CHANNEL_KEY:
1740     /*
1741      * Received key for channel. As channels are created by the router
1742      * the keys are as well. We will distribute the key to all of our
1743      * locally connected clients on the particular channel. Router
1744      * never receives this channel and thus is ignored.
1745      */
1746     SILC_LOG_DEBUG(("Channel Key packet"));
1747     if (packet->flags & SILC_PACKET_FLAG_LIST)
1748       break;
1749     silc_server_channel_key(server, sock, packet);
1750     break;
1751
1752     /*
1753      * Command packets
1754      */
1755   case SILC_PACKET_COMMAND:
1756     /*
1757      * Recived command. Processes the command request and allocates the
1758      * command context and calls the command.
1759      */
1760     SILC_LOG_DEBUG(("Command packet"));
1761     if (packet->flags & SILC_PACKET_FLAG_LIST)
1762       break;
1763     silc_server_command_process(server, sock, packet);
1764     break;
1765
1766   case SILC_PACKET_COMMAND_REPLY:
1767     /*
1768      * Received command reply packet. Received command reply to command. It
1769      * may be reply to command sent by us or reply to command sent by client
1770      * that we've routed further.
1771      */
1772     SILC_LOG_DEBUG(("Command Reply packet"));
1773     if (packet->flags & SILC_PACKET_FLAG_LIST)
1774       break;
1775     silc_server_command_reply(server, sock, packet);
1776     break;
1777
1778     /*
1779      * Private Message packets
1780      */
1781   case SILC_PACKET_PRIVATE_MESSAGE:
1782     /*
1783      * Received private message packet. The packet is coming from either
1784      * client or server.
1785      */
1786     SILC_LOG_DEBUG(("Private Message packet"));
1787     if (packet->flags & SILC_PACKET_FLAG_LIST)
1788       break;
1789     silc_server_private_message(server, sock, packet);
1790     break;
1791
1792   case SILC_PACKET_PRIVATE_MESSAGE_KEY:
1793     /*
1794      * Private message key packet.
1795      */
1796     if (packet->flags & SILC_PACKET_FLAG_LIST)
1797       break;
1798     silc_server_private_message_key(server, sock, packet);
1799     break;
1800
1801     /*
1802      * Key Exchange protocol packets
1803      */
1804   case SILC_PACKET_KEY_EXCHANGE:
1805     SILC_LOG_DEBUG(("KE packet"));
1806     if (packet->flags & SILC_PACKET_FLAG_LIST)
1807       break;
1808
1809     if (sock->protocol && sock->protocol->protocol &&
1810         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1811
1812       SilcServerKEInternalContext *proto_ctx = 
1813         (SilcServerKEInternalContext *)sock->protocol->context;
1814
1815       proto_ctx->packet = silc_packet_context_dup(packet);
1816
1817       /* Let the protocol handle the packet */
1818       silc_protocol_execute(sock->protocol, server->timeout_queue, 0, 100000);
1819     } else {
1820       SILC_LOG_ERROR(("Received Key Exchange packet but no key exchange "
1821                       "protocol active, packet dropped."));
1822     }
1823     break;
1824
1825   case SILC_PACKET_KEY_EXCHANGE_1:
1826     SILC_LOG_DEBUG(("KE 1 packet"));
1827     if (packet->flags & SILC_PACKET_FLAG_LIST)
1828       break;
1829
1830     if (sock->protocol && sock->protocol->protocol &&
1831         (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE ||
1832          sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY)) {
1833
1834       if (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
1835         SilcServerRekeyInternalContext *proto_ctx = 
1836           (SilcServerRekeyInternalContext *)sock->protocol->context;
1837         
1838         if (proto_ctx->packet)
1839           silc_packet_context_free(proto_ctx->packet);
1840         
1841         proto_ctx->packet = silc_packet_context_dup(packet);
1842
1843         /* Let the protocol handle the packet */
1844         silc_protocol_execute(sock->protocol, server->timeout_queue, 0, 0);
1845       } else {
1846         SilcServerKEInternalContext *proto_ctx = 
1847           (SilcServerKEInternalContext *)sock->protocol->context;
1848         
1849         if (proto_ctx->packet)
1850           silc_packet_context_free(proto_ctx->packet);
1851         
1852         proto_ctx->packet = silc_packet_context_dup(packet);
1853         proto_ctx->dest_id_type = packet->src_id_type;
1854         proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1855                                             packet->src_id_type);
1856         if (!proto_ctx->dest_id)
1857           break;
1858
1859         /* Let the protocol handle the packet */
1860         silc_protocol_execute(sock->protocol, server->timeout_queue, 
1861                               0, 100000);
1862       }
1863     } else {
1864       SILC_LOG_ERROR(("Received Key Exchange 1 packet but no key exchange "
1865                       "protocol active, packet dropped."));
1866     }
1867     break;
1868
1869   case SILC_PACKET_KEY_EXCHANGE_2:
1870     SILC_LOG_DEBUG(("KE 2 packet"));
1871     if (packet->flags & SILC_PACKET_FLAG_LIST)
1872       break;
1873
1874     if (sock->protocol && sock->protocol->protocol &&
1875         (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_KEY_EXCHANGE ||
1876          sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY)) {
1877
1878       if (sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
1879         SilcServerRekeyInternalContext *proto_ctx = 
1880           (SilcServerRekeyInternalContext *)sock->protocol->context;
1881         
1882         if (proto_ctx->packet)
1883           silc_packet_context_free(proto_ctx->packet);
1884         
1885         proto_ctx->packet = silc_packet_context_dup(packet);
1886
1887         /* Let the protocol handle the packet */
1888         silc_protocol_execute(sock->protocol, server->timeout_queue, 0, 0);
1889       } else {
1890         SilcServerKEInternalContext *proto_ctx = 
1891           (SilcServerKEInternalContext *)sock->protocol->context;
1892         
1893         if (proto_ctx->packet)
1894           silc_packet_context_free(proto_ctx->packet);
1895         
1896         proto_ctx->packet = silc_packet_context_dup(packet);
1897         proto_ctx->dest_id_type = packet->src_id_type;
1898         proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1899                                             packet->src_id_type);
1900         if (!proto_ctx->dest_id)
1901           break;
1902
1903         /* Let the protocol handle the packet */
1904         silc_protocol_execute(sock->protocol, server->timeout_queue, 
1905                               0, 100000);
1906       }
1907     } else {
1908       SILC_LOG_ERROR(("Received Key Exchange 2 packet but no key exchange "
1909                       "protocol active, packet dropped."));
1910     }
1911     break;
1912
1913   case SILC_PACKET_CONNECTION_AUTH_REQUEST:
1914     /*
1915      * Connection authentication request packet. When we receive this packet
1916      * we will send to the other end information about our mandatory
1917      * authentication method for the connection. This packet maybe received
1918      * at any time. 
1919      */
1920     SILC_LOG_DEBUG(("Connection authentication request packet"));
1921     if (packet->flags & SILC_PACKET_FLAG_LIST)
1922       break;
1923     silc_server_connection_auth_request(server, sock, packet);
1924     break;
1925
1926     /*
1927      * Connection Authentication protocol packets
1928      */
1929   case SILC_PACKET_CONNECTION_AUTH:
1930     /* Start of the authentication protocol. We receive here the 
1931        authentication data and will verify it. */
1932     SILC_LOG_DEBUG(("Connection auth packet"));
1933     if (packet->flags & SILC_PACKET_FLAG_LIST)
1934       break;
1935
1936     if (sock->protocol && sock->protocol->protocol->type 
1937         == SILC_PROTOCOL_SERVER_CONNECTION_AUTH) {
1938
1939       SilcServerConnAuthInternalContext *proto_ctx = 
1940         (SilcServerConnAuthInternalContext *)sock->protocol->context;
1941
1942       proto_ctx->packet = silc_packet_context_dup(packet);
1943
1944       /* Let the protocol handle the packet */
1945       silc_protocol_execute(sock->protocol, server->timeout_queue, 0, 0);
1946     } else {
1947       SILC_LOG_ERROR(("Received Connection Auth packet but no authentication "
1948                       "protocol active, packet dropped."));
1949     }
1950     break;
1951
1952   case SILC_PACKET_NEW_ID:
1953     /*
1954      * Received New ID packet. This includes some new ID that has been
1955      * created. It may be for client, server or channel. This is the way
1956      * to distribute information about new registered entities in the
1957      * SILC network.
1958      */
1959     SILC_LOG_DEBUG(("New ID packet"));
1960     if (packet->flags & SILC_PACKET_FLAG_LIST)
1961       silc_server_new_id_list(server, sock, packet);
1962     else
1963       silc_server_new_id(server, sock, packet);
1964     break;
1965
1966   case SILC_PACKET_NEW_CLIENT:
1967     /*
1968      * Received new client packet. This includes client information that
1969      * we will use to create initial client ID. After creating new
1970      * ID we will send it to the client.
1971      */
1972     SILC_LOG_DEBUG(("New Client packet"));
1973     if (packet->flags & SILC_PACKET_FLAG_LIST)
1974       break;
1975     silc_server_new_client(server, sock, packet);
1976     break;
1977
1978   case SILC_PACKET_NEW_SERVER:
1979     /*
1980      * Received new server packet. This includes Server ID and some other
1981      * information that we may save. This is received after server has 
1982      * connected to us.
1983      */
1984     SILC_LOG_DEBUG(("New Server packet"));
1985     if (packet->flags & SILC_PACKET_FLAG_LIST)
1986       break;
1987     silc_server_new_server(server, sock, packet);
1988     break;
1989
1990   case SILC_PACKET_NEW_CHANNEL:
1991     /*
1992      * Received new channel packet. Information about new channel in the
1993      * network are distributed using this packet.
1994      */
1995     SILC_LOG_DEBUG(("New Channel packet"));
1996     if (packet->flags & SILC_PACKET_FLAG_LIST)
1997       silc_server_new_channel_list(server, sock, packet);
1998     else
1999       silc_server_new_channel(server, sock, packet);
2000     break;
2001
2002   case SILC_PACKET_HEARTBEAT:
2003     /*
2004      * Received heartbeat.
2005      */
2006     SILC_LOG_DEBUG(("Heartbeat packet"));
2007     if (packet->flags & SILC_PACKET_FLAG_LIST)
2008       break;
2009     break;
2010
2011   case SILC_PACKET_KEY_AGREEMENT:
2012     /*
2013      * Received heartbeat.
2014      */
2015     SILC_LOG_DEBUG(("Key agreement packet"));
2016     if (packet->flags & SILC_PACKET_FLAG_LIST)
2017       break;
2018     silc_server_key_agreement(server, sock, packet);
2019     break;
2020
2021   case SILC_PACKET_REKEY:
2022     /*
2023      * Received re-key packet. The sender wants to regenerate the session
2024      * keys.
2025      */
2026     SILC_LOG_DEBUG(("Re-key packet"));
2027     if (packet->flags & SILC_PACKET_FLAG_LIST)
2028       break;
2029     silc_server_rekey(server, sock, packet);
2030     break;
2031
2032   case SILC_PACKET_REKEY_DONE:
2033     /*
2034      * The re-key is done.
2035      */
2036     SILC_LOG_DEBUG(("Re-key done packet"));
2037     if (packet->flags & SILC_PACKET_FLAG_LIST)
2038       break;
2039
2040     if (sock->protocol && sock->protocol->protocol &&
2041         sock->protocol->protocol->type == SILC_PROTOCOL_SERVER_REKEY) {
2042
2043       SilcServerRekeyInternalContext *proto_ctx = 
2044         (SilcServerRekeyInternalContext *)sock->protocol->context;
2045
2046       if (proto_ctx->packet)
2047         silc_packet_context_free(proto_ctx->packet);
2048
2049       proto_ctx->packet = silc_packet_context_dup(packet);
2050
2051       /* Let the protocol handle the packet */
2052       silc_protocol_execute(sock->protocol, server->timeout_queue, 0, 0);
2053     } else {
2054       SILC_LOG_ERROR(("Received Re-key done packet but no re-key "
2055                       "protocol active, packet dropped."));
2056     }
2057     break;
2058
2059   default:
2060     SILC_LOG_ERROR(("Incorrect packet type %d, packet dropped", type));
2061     break;
2062   }
2063   
2064 }
2065
2066 /* Creates connection to a remote router. */
2067
2068 void silc_server_create_connection(SilcServer server,
2069                                    char *remote_host, uint32 port)
2070 {
2071   SilcServerConnection sconn;
2072
2073   /* Allocate connection object for hold connection specific stuff. */
2074   sconn = silc_calloc(1, sizeof(*sconn));
2075   sconn->server = server;
2076   sconn->remote_host = strdup(remote_host);
2077   sconn->remote_port = port;
2078
2079   silc_task_register(server->timeout_queue, 0, 
2080                      silc_server_connect_router,
2081                      (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
2082                      SILC_TASK_PRI_NORMAL);
2083 }
2084
2085 SILC_TASK_CALLBACK(silc_server_close_connection_final)
2086 {
2087   silc_socket_free((SilcSocketConnection)context);
2088 }
2089
2090 /* Closes connection to socket connection */
2091
2092 void silc_server_close_connection(SilcServer server,
2093                                   SilcSocketConnection sock)
2094 {
2095   SILC_LOG_INFO(("Closing connection %s:%d [%s] (%d)", sock->hostname,
2096                  sock->port,  
2097                  (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
2098                   sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
2099                   sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
2100                   "Router"), sock->sock));
2101
2102   /* If any protocol is active cancel its execution */
2103   if (sock->protocol) {
2104     silc_protocol_cancel(sock->protocol, server->timeout_queue);
2105     sock->protocol->state = SILC_PROTOCOL_STATE_ERROR;
2106     silc_protocol_execute_final(sock->protocol, server->timeout_queue);
2107     sock->protocol = NULL;
2108   }
2109
2110   /* We won't listen for this connection anymore */
2111   silc_schedule_unset_listen_fd(server->schedule, sock->sock);
2112
2113   /* Unregister all tasks */
2114   silc_task_unregister_by_fd(server->io_queue, sock->sock);
2115   silc_task_unregister_by_fd(server->timeout_queue, sock->sock);
2116
2117   /* Close the actual connection */
2118   silc_net_close_connection(sock->sock);
2119   server->sockets[sock->sock] = NULL;
2120
2121   silc_task_register(server->timeout_queue, 0, 
2122                      silc_server_close_connection_final,
2123                      (void *)sock, 0, 1, SILC_TASK_TIMEOUT, 
2124                      SILC_TASK_PRI_NORMAL);
2125 }
2126
2127 /* Sends disconnect message to remote connection and disconnects the 
2128    connection. */
2129
2130 void silc_server_disconnect_remote(SilcServer server,
2131                                    SilcSocketConnection sock,
2132                                    const char *fmt, ...)
2133 {
2134   va_list ap;
2135   unsigned char buf[4096];
2136
2137   if (!sock)
2138     return;
2139
2140   memset(buf, 0, sizeof(buf));
2141   va_start(ap, fmt);
2142   vsprintf(buf, fmt, ap);
2143   va_end(ap);
2144
2145   SILC_LOG_DEBUG(("Disconnecting remote host"));
2146
2147   SILC_LOG_INFO(("Disconnecting %s:%d [%s]", sock->hostname,
2148                   sock->port,
2149                   (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
2150                    sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
2151                    sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
2152                    "Router")));
2153
2154   /* Notify remote end that the conversation is over. The notify message
2155      is tried to be sent immediately. */
2156   silc_server_packet_send(server, sock, SILC_PACKET_DISCONNECT, 0,  
2157                           buf, strlen(buf), TRUE);
2158
2159   /* Mark the connection to be disconnected */
2160   SILC_SET_DISCONNECTED(sock);
2161   silc_server_close_connection(server, sock);
2162 }
2163
2164 typedef struct {
2165   SilcServer server;
2166   SilcClientEntry client;
2167 } *FreeClientInternal;
2168
2169 SILC_TASK_CALLBACK(silc_server_free_client_data_timeout)
2170 {
2171   FreeClientInternal i = (FreeClientInternal)context;
2172
2173   silc_idlist_del_data(i->client);
2174   silc_idcache_purge_by_context(i->server->local_list->clients, i->client);
2175   silc_free(i);
2176 }
2177
2178 /* Frees client data and notifies about client's signoff. */
2179
2180 void silc_server_free_client_data(SilcServer server, 
2181                                   SilcSocketConnection sock,
2182                                   SilcClientEntry client, 
2183                                   int notify,
2184                                   char *signoff)
2185 {
2186   FreeClientInternal i = silc_calloc(1, sizeof(*i));
2187
2188   /* If there is pending outgoing data for the client then purge it
2189      to the network before removing the client entry. */
2190   if (sock && SILC_IS_OUTBUF_PENDING(sock) && 
2191       (SILC_IS_DISCONNECTED(sock) == FALSE)) {
2192     server->stat.packets_sent++;
2193
2194     if (sock->outbuf->data - sock->outbuf->head)
2195      silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
2196
2197     silc_packet_send(sock, TRUE);
2198
2199     SILC_SET_CONNECTION_FOR_INPUT(server->schedule, sock->sock);
2200     SILC_UNSET_OUTBUF_PENDING(sock);
2201     silc_buffer_clear(sock->outbuf);
2202   }
2203
2204   /* Send SIGNOFF notify to routers. */
2205   if (notify && !server->standalone && server->router)
2206     silc_server_send_notify_signoff(server, server->router->connection,
2207                                     server->server_type == SILC_SERVER ?
2208                                     FALSE : TRUE, client->id, signoff);
2209
2210   /* Remove client from all channels */
2211   if (notify)
2212     silc_server_remove_from_channels(server, NULL, client, 
2213                                      TRUE, signoff, TRUE);
2214   else
2215     silc_server_remove_from_channels(server, NULL, client, 
2216                                      FALSE, NULL, FALSE);
2217
2218   /* We will not delete the client entry right away. We will take it
2219      into history (for WHOWAS command) for 5 minutes */
2220   i->server = server;
2221   i->client = client;
2222   silc_task_register(server->timeout_queue, 0, 
2223                      silc_server_free_client_data_timeout,
2224                      (void *)i, 300, 0,
2225                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_LOW);
2226   client->data.registered = FALSE;
2227
2228   /* Free the client entry and everything in it */
2229   server->stat.my_clients--;
2230   server->stat.clients--;
2231   if (server->server_type == SILC_ROUTER)
2232     server->stat.cell_clients--;
2233 }
2234
2235 /* Frees user_data pointer from socket connection object. This also sends
2236    appropriate notify packets to the network to inform about leaving
2237    entities. */
2238
2239 void silc_server_free_sock_user_data(SilcServer server, 
2240                                      SilcSocketConnection sock)
2241 {
2242   SILC_LOG_DEBUG(("Start"));
2243
2244   switch(sock->type) {
2245   case SILC_SOCKET_TYPE_CLIENT:
2246     {
2247       SilcClientEntry user_data = (SilcClientEntry)sock->user_data;
2248       silc_server_free_client_data(server, sock, user_data, TRUE, NULL);
2249       break;
2250     }
2251   case SILC_SOCKET_TYPE_SERVER:
2252   case SILC_SOCKET_TYPE_ROUTER:
2253     {
2254       SilcServerEntry user_data = (SilcServerEntry)sock->user_data;
2255
2256       /* Free all client entries that this server owns as they will
2257          become invalid now as well. */
2258       if (user_data->id)
2259         silc_server_remove_clients_by_server(server, user_data, TRUE);
2260
2261       /* If this was our primary router connection then we're lost to
2262          the outside world. */
2263       if (server->router == user_data) {
2264         server->id_entry->router = NULL;
2265         server->router = NULL;
2266         server->standalone = TRUE;
2267       }
2268
2269       /* Free the server entry */
2270       silc_idlist_del_data(user_data);
2271       silc_idlist_del_server(server->local_list, user_data);
2272       server->stat.my_servers--;
2273       server->stat.servers--;
2274       if (server->server_type == SILC_ROUTER)
2275         server->stat.cell_servers--;
2276       break;
2277     }
2278   default:
2279     {
2280       SilcUnknownEntry user_data = (SilcUnknownEntry)sock->user_data;
2281
2282       silc_idlist_del_data(user_data);
2283       silc_free(user_data);
2284       break;
2285     }
2286   }
2287
2288   sock->user_data = NULL;
2289 }
2290
2291 /* This function is used to remove all client entries by the server `entry'.
2292    This is called when the connection is lost to the server. In this case
2293    we must invalidate all the client entries owned by the server `entry'. 
2294    If the `server_signoff' is TRUE then the SERVER_SIGNOFF notify is
2295    distributed to our local clients. */
2296
2297 int silc_server_remove_clients_by_server(SilcServer server, 
2298                                          SilcServerEntry entry,
2299                                          int server_signoff)
2300 {
2301   SilcIDCacheList list = NULL;
2302   SilcIDCacheEntry id_cache = NULL;
2303   SilcClientEntry client = NULL;
2304   SilcBuffer idp;
2305   SilcClientEntry *clients = NULL;
2306   uint32 clients_c = 0;
2307   unsigned char **argv = NULL;
2308   uint32 *argv_lens = NULL, *argv_types = NULL, argc = 0;
2309   SilcHashTable channels;
2310   SilcChannelClientEntry chl;
2311   SilcChannelEntry channel;
2312   SilcHashTableList htl;
2313   int i;
2314
2315   SILC_LOG_DEBUG(("Start"));
2316
2317   /* Allocate the hash table that holds the channels that require
2318      channel key re-generation after we've removed this server's clients
2319      from the channels. */
2320   channels = silc_hash_table_alloc(0, silc_hash_ptr, NULL, NULL, NULL,
2321                                    NULL, NULL, TRUE);
2322
2323   if (server_signoff) {
2324     idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
2325     argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
2326     argv_lens = silc_realloc(argv_lens,  sizeof(*argv_lens) * (argc + 1));
2327     argv_types = silc_realloc(argv_types, sizeof(*argv_types) * (argc + 1));
2328     argv[argc] = silc_calloc(idp->len, sizeof(*argv[0]));
2329     memcpy(argv[argc], idp->data, idp->len);
2330     argv_lens[argc] = idp->len;
2331     argv_types[argc] = argc + 1;
2332     argc++;
2333     silc_buffer_free(idp);
2334   }
2335
2336   if (silc_idcache_get_all(server->local_list->clients, &list)) {
2337
2338     if (silc_idcache_list_first(list, &id_cache)) {
2339       while (id_cache) {
2340         client = (SilcClientEntry)id_cache->context;
2341         if (client->data.registered == FALSE) {
2342           if (!silc_idcache_list_next(list, &id_cache))
2343             break;
2344           else
2345             continue;
2346         }
2347
2348         if (client->router != entry) {
2349           if (server_signoff && client->connection) {
2350             clients = silc_realloc(clients, 
2351                                    sizeof(*clients) * (clients_c + 1));
2352             clients[clients_c] = client;
2353             clients_c++;
2354           }
2355
2356           if (!silc_idcache_list_next(list, &id_cache))
2357             break;
2358           else
2359             continue;
2360         }
2361
2362         if (server_signoff) {
2363           idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2364           argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
2365           argv_lens = silc_realloc(argv_lens, sizeof(*argv_lens) *
2366                                    (argc + 1));
2367           argv_types = silc_realloc(argv_types, sizeof(*argv_types) *
2368                                     (argc + 1));
2369           argv[argc] = silc_calloc(idp->len, sizeof(*argv[0]));
2370           memcpy(argv[argc], idp->data, idp->len);
2371           argv_lens[argc] = idp->len;
2372           argv_types[argc] = argc + 1;
2373           argc++;
2374           silc_buffer_free(idp);
2375         }
2376
2377         silc_hash_table_list(client->channels, &htl);
2378         while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
2379           if (silc_hash_table_find(channels, chl->channel, NULL, NULL))
2380             continue;
2381           silc_hash_table_add(channels, chl->channel, chl->channel);
2382         }
2383
2384         /* Remove the client entry */
2385         silc_server_remove_from_channels(server, NULL, client, FALSE, 
2386                                          NULL, FALSE);
2387         silc_idlist_del_client(server->local_list, client);
2388
2389         if (!silc_idcache_list_next(list, &id_cache))
2390           break;
2391       }
2392     }
2393     silc_idcache_list_free(list);
2394   }
2395   
2396   if (silc_idcache_get_all(server->global_list->clients, &list)) {
2397
2398     if (silc_idcache_list_first(list, &id_cache)) {
2399       while (id_cache) {
2400         client = (SilcClientEntry)id_cache->context;
2401         if (client->data.registered == FALSE) {
2402           if (!silc_idcache_list_next(list, &id_cache))
2403             break;
2404           else
2405             continue;
2406         }
2407         
2408         if (client->router != entry) {
2409           if (server_signoff && client->connection) {
2410             clients = silc_realloc(clients, 
2411                                    sizeof(*clients) * (clients_c + 1));
2412             clients[clients_c] = client;
2413             clients_c++;
2414           }
2415
2416           if (!silc_idcache_list_next(list, &id_cache))
2417             break;
2418           else
2419             continue;
2420         }
2421
2422         if (server_signoff) {
2423           idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2424           argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
2425           argv_lens = silc_realloc(argv_lens, sizeof(*argv_lens) *
2426                                    (argc + 1));
2427           argv_types = silc_realloc(argv_types, sizeof(*argv_types) *
2428                                     (argc + 1));
2429           argv[argc] = silc_calloc(idp->len, sizeof(*argv[0]));
2430           memcpy(argv[argc], idp->data, idp->len);
2431           argv_lens[argc] = idp->len;
2432           argv_types[argc] = argc + 1;
2433           argc++;
2434           silc_buffer_free(idp);
2435         }
2436
2437         silc_hash_table_list(client->channels, &htl);
2438         while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
2439           if (silc_hash_table_find(channels, chl->channel, NULL, NULL))
2440             continue;
2441           silc_hash_table_add(channels, chl->channel, chl->channel);
2442         }
2443
2444         /* Remove the client entry */
2445         silc_server_remove_from_channels(server, NULL, client, FALSE,
2446                                          NULL, FALSE);
2447         silc_idlist_del_client(server->global_list, client);
2448
2449         if (!silc_idcache_list_next(list, &id_cache))
2450           break;
2451       }
2452     }
2453     silc_idcache_list_free(list);
2454   }
2455
2456   /* Send the SERVER_SIGNOFF notify */
2457   if (server_signoff) {
2458     SilcBuffer args;
2459
2460     /* Send SERVER_SIGNOFF notify to our primary router */
2461     if (!server->standalone && server->router &&
2462         server->router != entry) {
2463       args = silc_argument_payload_encode(1, argv, argv_lens,
2464                                           argv_types);
2465       silc_server_send_notify_args(server, 
2466                                    server->router->connection,
2467                                    server->server_type == SILC_SERVER ? 
2468                                    FALSE : TRUE, 
2469                                    SILC_NOTIFY_TYPE_SERVER_SIGNOFF,
2470                                    argc, args);
2471       silc_buffer_free(args);
2472     }
2473
2474     args = silc_argument_payload_encode(argc, argv, argv_lens,
2475                                         argv_types);
2476     /* Send to local clients */
2477     for (i = 0; i < clients_c; i++) {
2478       silc_server_send_notify_args(server, clients[i]->connection,
2479                                    FALSE, SILC_NOTIFY_TYPE_SERVER_SIGNOFF,
2480                                    argc, args);
2481     }
2482
2483     silc_free(clients);
2484     silc_buffer_free(args);
2485     for (i = 0; i < argc; i++)
2486       silc_free(argv[i]);
2487     silc_free(argv);
2488     silc_free(argv_lens);
2489     silc_free(argv_types);
2490   }
2491
2492   /* We must now re-generate the channel key for all channels that had
2493      this server's client(s) on the channel. As they left the channel we
2494      must re-generate the channel key. */
2495   silc_hash_table_list(channels, &htl);
2496   while (silc_hash_table_get(&htl, NULL, (void *)&channel)) {
2497     silc_server_create_channel_key(server, channel, 0);
2498     silc_server_send_channel_key(server, NULL, channel, 
2499                                  server->server_type == SILC_ROUTER ? 
2500                                  FALSE : !server->standalone);
2501   }
2502   silc_hash_table_free(channels);
2503
2504   return TRUE;
2505 }
2506
2507 /* Checks whether given channel has global users.  If it does this returns
2508    TRUE and FALSE if there is only locally connected clients on the channel. */
2509
2510 int silc_server_channel_has_global(SilcChannelEntry channel)
2511 {
2512   SilcChannelClientEntry chl;
2513   SilcHashTableList htl;
2514
2515   silc_hash_table_list(channel->user_list, &htl);
2516   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
2517     if (chl->client->router)
2518       return TRUE;
2519   }
2520
2521   return FALSE;
2522 }
2523
2524 /* Checks whether given channel has locally connected users.  If it does this
2525    returns TRUE and FALSE if there is not one locally connected client. */
2526
2527 int silc_server_channel_has_local(SilcChannelEntry channel)
2528 {
2529   SilcChannelClientEntry chl;
2530   SilcHashTableList htl;
2531
2532   silc_hash_table_list(channel->user_list, &htl);
2533   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
2534     if (!chl->client->router)
2535       return TRUE;
2536   }
2537
2538   return FALSE;
2539 }
2540
2541 /* Removes client from all channels it has joined. This is used when client
2542    connection is disconnected. If the client on a channel is last, the
2543    channel is removed as well. This sends the SIGNOFF notify types. */
2544
2545 void silc_server_remove_from_channels(SilcServer server, 
2546                                       SilcSocketConnection sock,
2547                                       SilcClientEntry client,
2548                                       int notify,
2549                                       char *signoff_message,
2550                                       int keygen)
2551 {
2552   SilcChannelEntry channel;
2553   SilcChannelClientEntry chl;
2554   SilcHashTableList htl;
2555   SilcBuffer clidp;
2556
2557   SILC_LOG_DEBUG(("Start"));
2558
2559   if (!client || !client->id)
2560     return;
2561
2562   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2563
2564   /* Remove the client from all channels. The client is removed from
2565      the channels' user list. */
2566   silc_hash_table_list(client->channels, &htl);
2567   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
2568     channel = chl->channel;
2569
2570     /* Remove channel from client's channel list */
2571     silc_hash_table_del(client->channels, channel);
2572
2573     /* Remove channel if there is no users anymore */
2574     if (server->server_type == SILC_ROUTER &&
2575         silc_hash_table_count(channel->user_list) < 2) {
2576       if (channel->rekey)
2577         silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2578       if (!silc_idlist_del_channel(server->local_list, channel))
2579         silc_idlist_del_channel(server->global_list, channel);
2580       server->stat.my_channels--;
2581       continue;
2582     }
2583
2584     /* Remove client from channel's client list */
2585     silc_hash_table_del(channel->user_list, chl->client);
2586     silc_free(chl);
2587     server->stat.my_chanclients--;
2588
2589     /* If there is no global users on the channel anymore mark the channel
2590        as local channel. Do not check if the removed client is local client. */
2591     if (server->server_type == SILC_SERVER && channel->global_users && 
2592         chl->client->router && !silc_server_channel_has_global(channel))
2593       channel->global_users = FALSE;
2594
2595     /* If there is not at least one local user on the channel then we don't
2596        need the channel entry anymore, we can remove it safely. */
2597     if (server->server_type == SILC_SERVER &&
2598         !silc_server_channel_has_local(channel)) {
2599       /* Notify about leaving client if this channel has global users. */
2600       if (notify && channel->global_users)
2601         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2602                                            SILC_NOTIFY_TYPE_SIGNOFF, 
2603                                            signoff_message ? 2 : 1,
2604                                            clidp->data, clidp->len,
2605                                            signoff_message, signoff_message ?
2606                                            strlen(signoff_message) : 0);
2607
2608       if (channel->rekey)
2609         silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2610
2611       if (channel->founder_key) {
2612         /* The founder auth data exists, do not remove the channel entry */
2613         SilcChannelClientEntry chl2;
2614         SilcHashTableList htl2;
2615
2616         channel->id = NULL;
2617
2618         silc_hash_table_list(channel->user_list, &htl2);
2619         while (silc_hash_table_get(&htl2, NULL, (void *)&chl2)) {
2620           silc_hash_table_del(chl2->client->channels, channel);
2621           silc_hash_table_del(channel->user_list, chl2->client);
2622           silc_free(chl2);
2623         }
2624         continue;
2625       }
2626
2627       /* Remove the channel entry */
2628       if (!silc_idlist_del_channel(server->local_list, channel))
2629         silc_idlist_del_channel(server->global_list, channel);
2630       server->stat.my_channels--;
2631       continue;
2632     }
2633
2634     /* Send notify to channel about client leaving SILC and thus
2635        the entire channel. */
2636     if (notify)
2637       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2638                                          SILC_NOTIFY_TYPE_SIGNOFF, 
2639                                          signoff_message ? 2 : 1,
2640                                          clidp->data, clidp->len,
2641                                          signoff_message, signoff_message ?
2642                                          strlen(signoff_message) : 0);
2643
2644     if (keygen && !(channel->mode & SILC_CHANNEL_MODE_PRIVKEY)) {
2645       /* Re-generate channel key */
2646       silc_server_create_channel_key(server, channel, 0);
2647       
2648       /* Send the channel key to the channel. The key of course is not sent
2649          to the client who was removed from the channel. */
2650       silc_server_send_channel_key(server, client->connection, channel, 
2651                                    server->server_type == SILC_ROUTER ? 
2652                                    FALSE : !server->standalone);
2653     }
2654   }
2655
2656   silc_buffer_free(clidp);
2657 }
2658
2659 /* Removes client from one channel. This is used for example when client
2660    calls LEAVE command to remove itself from the channel. Returns TRUE
2661    if channel still exists and FALSE if the channel is removed when
2662    last client leaves the channel. If `notify' is FALSE notify messages
2663    are not sent. */
2664
2665 int silc_server_remove_from_one_channel(SilcServer server, 
2666                                         SilcSocketConnection sock,
2667                                         SilcChannelEntry channel,
2668                                         SilcClientEntry client,
2669                                         int notify)
2670 {
2671   SilcChannelClientEntry chl;
2672   SilcBuffer clidp;
2673
2674   SILC_LOG_DEBUG(("Start"));
2675
2676   /* Get the entry to the channel, if this client is not on the channel
2677      then return Ok. */
2678   if (!silc_hash_table_find(client->channels, channel, NULL, (void *)&chl))
2679     return TRUE;
2680
2681   /* Remove the client from the channel. The client is removed from
2682      the channel's user list. */
2683
2684   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2685
2686   /* Remove channel from client's channel list */
2687   silc_hash_table_del(client->channels, chl->channel);
2688
2689   /* Remove channel if there is no users anymore */
2690   if (server->server_type == SILC_ROUTER &&
2691       silc_hash_table_count(channel->user_list) < 2) {
2692     if (channel->rekey)
2693       silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2694     if (!silc_idlist_del_channel(server->local_list, channel))
2695       silc_idlist_del_channel(server->global_list, channel);
2696     silc_buffer_free(clidp);
2697     server->stat.my_channels--;
2698     return FALSE;
2699   }
2700
2701   /* Remove client from channel's client list */
2702   silc_hash_table_del(channel->user_list, chl->client);
2703   silc_free(chl);
2704   server->stat.my_chanclients--;
2705   
2706   /* If there is no global users on the channel anymore mark the channel
2707      as local channel. Do not check if the client is local client. */
2708   if (server->server_type == SILC_SERVER && channel->global_users &&
2709       chl->client->router && !silc_server_channel_has_global(channel))
2710     channel->global_users = FALSE;
2711
2712   /* If there is not at least one local user on the channel then we don't
2713      need the channel entry anymore, we can remove it safely. */
2714   if (server->server_type == SILC_SERVER &&
2715       !silc_server_channel_has_local(channel)) {
2716     /* Notify about leaving client if this channel has global users. */
2717     if (notify && channel->global_users)
2718       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2719                                          SILC_NOTIFY_TYPE_LEAVE, 1,
2720                                          clidp->data, clidp->len);
2721     
2722     silc_buffer_free(clidp);
2723     
2724     if (channel->rekey)
2725       silc_task_unregister_by_context(server->timeout_queue, channel->rekey);
2726
2727     if (channel->founder_key) {
2728       /* The founder auth data exists, do not remove the channel entry */
2729       SilcChannelClientEntry chl2;
2730       SilcHashTableList htl2;
2731       
2732       channel->id = NULL;
2733       
2734       silc_hash_table_list(channel->user_list, &htl2);
2735       while (silc_hash_table_get(&htl2, NULL, (void *)&chl2)) {
2736         silc_hash_table_del(chl2->client->channels, channel);
2737         silc_hash_table_del(channel->user_list, chl2->client);
2738         silc_free(chl2);
2739       }
2740       return FALSE;
2741     }
2742
2743     /* Remove the channel entry */
2744     if (!silc_idlist_del_channel(server->local_list, channel))
2745       silc_idlist_del_channel(server->global_list, channel);
2746     server->stat.my_channels--;
2747     return FALSE;
2748   }
2749
2750   /* Send notify to channel about client leaving the channel */
2751   if (notify)
2752     silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2753                                        SILC_NOTIFY_TYPE_LEAVE, 1,
2754                                        clidp->data, clidp->len);
2755
2756   silc_buffer_free(clidp);
2757   return TRUE;
2758 }
2759
2760 /* Returns TRUE if the given client is on the channel.  FALSE if not. 
2761    This works because we assure that the user list on the channel is
2762    always in up to date thus we can only check the channel list from 
2763    `client' which is faster than checking the user list from `channel'. */
2764
2765 int silc_server_client_on_channel(SilcClientEntry client,
2766                                   SilcChannelEntry channel)
2767 {
2768   if (!client || !channel)
2769     return FALSE;
2770
2771   if (silc_hash_table_find(client->channels, channel, NULL, NULL))
2772     return TRUE;
2773
2774   return FALSE;
2775 }
2776
2777 /* Timeout callback. This is called if connection is idle or for some
2778    other reason is not responding within some period of time. This 
2779    disconnects the remote end. */
2780
2781 SILC_TASK_CALLBACK(silc_server_timeout_remote)
2782 {
2783   SilcServer server = (SilcServer)context;
2784   SilcSocketConnection sock = server->sockets[fd];
2785
2786   SILC_LOG_DEBUG(("Start"));
2787
2788   if (!sock)
2789     return;
2790
2791   /* If we have protocol active we must assure that we call the protocol's
2792      final callback so that all the memory is freed. */
2793   if (sock->protocol) {
2794     sock->protocol->state = SILC_PROTOCOL_STATE_ERROR;
2795     silc_protocol_execute_final(sock->protocol, server->timeout_queue);
2796     return;
2797   }
2798
2799   if (sock->user_data)
2800     silc_server_free_sock_user_data(server, sock);
2801
2802   silc_server_disconnect_remote(server, sock, "Server closed connection: "
2803                                 "Connection timeout");
2804 }
2805
2806 /* Creates new channel. Sends NEW_CHANNEL packet to primary route. This
2807    function may be used only by router. In real SILC network all channels
2808    are created by routers thus this function is never used by normal
2809    server. */
2810
2811 SilcChannelEntry silc_server_create_new_channel(SilcServer server, 
2812                                                 SilcServerID *router_id,
2813                                                 char *cipher, 
2814                                                 char *hmac,
2815                                                 char *channel_name,
2816                                                 int broadcast)
2817 {
2818   SilcChannelID *channel_id;
2819   SilcChannelEntry entry;
2820   SilcCipher key;
2821   SilcHmac newhmac;
2822
2823   SILC_LOG_DEBUG(("Creating new channel"));
2824
2825   if (!cipher)
2826     cipher = "aes-256-cbc";
2827   if (!hmac)
2828     hmac = "hmac-sha1-96";
2829
2830   /* Allocate cipher */
2831   if (!silc_cipher_alloc(cipher, &key))
2832     return NULL;
2833
2834   /* Allocate hmac */
2835   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2836     silc_cipher_free(key);
2837     return NULL;
2838   }
2839
2840   channel_name = strdup(channel_name);
2841
2842   /* Create the channel */
2843   silc_id_create_channel_id(router_id, server->rng, &channel_id);
2844   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2845                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2846                                   NULL, key, newhmac);
2847   if (!entry) {
2848     silc_free(channel_name);
2849     silc_cipher_free(key);
2850     silc_hmac_free(newhmac);
2851     return NULL;
2852   }
2853
2854   entry->cipher = strdup(cipher);
2855   entry->hmac_name = strdup(hmac);
2856
2857   /* Now create the actual key material */
2858   silc_server_create_channel_key(server, entry, 
2859                                  silc_cipher_get_key_len(key) / 8);
2860
2861   /* Notify other routers about the new channel. We send the packet
2862      to our primary route. */
2863   if (broadcast && server->standalone == FALSE)
2864     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2865                                  channel_name, entry->id, 
2866                                  silc_id_get_len(entry->id, SILC_ID_CHANNEL),
2867                                  entry->mode);
2868
2869   server->stat.my_channels++;
2870
2871   return entry;
2872 }
2873
2874 /* Same as above but creates the channel with Channel ID `channel_id. */
2875
2876 SilcChannelEntry 
2877 silc_server_create_new_channel_with_id(SilcServer server, 
2878                                        char *cipher, 
2879                                        char *hmac,
2880                                        char *channel_name,
2881                                        SilcChannelID *channel_id,
2882                                        int broadcast)
2883 {
2884   SilcChannelEntry entry;
2885   SilcCipher key;
2886   SilcHmac newhmac;
2887
2888   SILC_LOG_DEBUG(("Creating new channel"));
2889
2890   if (!cipher)
2891     cipher = "aes-256-cbc";
2892   if (!hmac)
2893     hmac = "hmac-sha1-96";
2894
2895   /* Allocate cipher */
2896   if (!silc_cipher_alloc(cipher, &key))
2897     return NULL;
2898
2899   /* Allocate hmac */
2900   if (!silc_hmac_alloc(hmac, NULL, &newhmac)) {
2901     silc_cipher_free(key);
2902     return NULL;
2903   }
2904
2905   channel_name = strdup(channel_name);
2906
2907   /* Create the channel */
2908   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2909                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2910                                   NULL, key, newhmac);
2911   if (!entry) {
2912     silc_free(channel_name);
2913     return NULL;
2914   }
2915
2916   /* Now create the actual key material */
2917   silc_server_create_channel_key(server, entry, 
2918                                  silc_cipher_get_key_len(key) / 8);
2919
2920   /* Notify other routers about the new channel. We send the packet
2921      to our primary route. */
2922   if (broadcast && server->standalone == FALSE)
2923     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2924                                  channel_name, entry->id, 
2925                                  silc_id_get_len(entry->id, SILC_ID_CHANNEL),
2926                                  entry->mode);
2927
2928   server->stat.my_channels++;
2929
2930   return entry;
2931 }
2932
2933 /* Channel's key re-key timeout callback. */
2934
2935 SILC_TASK_CALLBACK(silc_server_channel_key_rekey)
2936 {
2937   SilcServerChannelRekey rekey = (SilcServerChannelRekey)context;
2938   SilcServer server = (SilcServer)rekey->context;
2939
2940   silc_server_create_channel_key(server, rekey->channel, rekey->key_len);
2941   silc_server_send_channel_key(server, NULL, rekey->channel, FALSE);
2942
2943   silc_task_register(server->timeout_queue, 0, 
2944                      silc_server_channel_key_rekey,
2945                      (void *)rekey, 3600, 0,
2946                      SILC_TASK_TIMEOUT,
2947                      SILC_TASK_PRI_NORMAL);
2948 }
2949
2950 /* Generates new channel key. This is used to create the initial channel key
2951    but also to re-generate new key for channel. If `key_len' is provided
2952    it is the bytes of the key length. */
2953
2954 void silc_server_create_channel_key(SilcServer server, 
2955                                     SilcChannelEntry channel,
2956                                     uint32 key_len)
2957 {
2958   int i;
2959   unsigned char channel_key[32], hash[32];
2960   uint32 len;
2961
2962   SILC_LOG_DEBUG(("Generating channel key"));
2963
2964   if (channel->mode & SILC_CHANNEL_MODE_PRIVKEY) {
2965     SILC_LOG_DEBUG(("Channel has private keys, will not generate new key"));
2966     return;
2967   }
2968
2969   if (!channel->channel_key)
2970     if (!silc_cipher_alloc("aes-256-cbc", &channel->channel_key))
2971       return;
2972
2973   if (key_len)
2974     len = key_len;
2975   else if (channel->key_len)
2976     len = channel->key_len / 8;
2977   else
2978     len = silc_cipher_get_key_len(channel->channel_key) / 8;
2979
2980   /* Create channel key */
2981   for (i = 0; i < len; i++) channel_key[i] = silc_rng_get_byte(server->rng);
2982   
2983   /* Set the key */
2984   silc_cipher_set_key(channel->channel_key, channel_key, len * 8);
2985
2986   /* Remove old key if exists */
2987   if (channel->key) {
2988     memset(channel->key, 0, channel->key_len / 8);
2989     silc_free(channel->key);
2990   }
2991
2992   /* Save the key */
2993   channel->key_len = len * 8;
2994   channel->key = silc_calloc(len, sizeof(*channel->key));
2995   memcpy(channel->key, channel_key, len);
2996   memset(channel_key, 0, sizeof(channel_key));
2997
2998   /* Generate HMAC key from the channel key data and set it */
2999   if (!channel->hmac)
3000     silc_hmac_alloc("hmac-sha1-96", NULL, &channel->hmac);
3001   silc_hash_make(channel->hmac->hash, channel->key, len, hash);
3002   silc_hmac_set_key(channel->hmac, hash, silc_hash_len(channel->hmac->hash));
3003   memset(hash, 0, sizeof(hash));
3004
3005   if (server->server_type == SILC_ROUTER) {
3006     if (!channel->rekey)
3007       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
3008     channel->rekey->context = (void *)server;
3009     channel->rekey->channel = channel;
3010     channel->rekey->key_len = key_len;
3011
3012     silc_task_unregister_by_callback(server->timeout_queue,
3013                                      silc_server_channel_key_rekey);
3014     silc_task_register(server->timeout_queue, 0, 
3015                        silc_server_channel_key_rekey,
3016                        (void *)channel->rekey, 3600, 0,
3017                        SILC_TASK_TIMEOUT,
3018                        SILC_TASK_PRI_NORMAL);
3019   }
3020 }
3021
3022 /* Saves the channel key found in the encoded `key_payload' buffer. This 
3023    function is used when we receive Channel Key Payload and also when we're
3024    processing JOIN command reply. Returns entry to the channel. */
3025
3026 SilcChannelEntry silc_server_save_channel_key(SilcServer server,
3027                                               SilcBuffer key_payload,
3028                                               SilcChannelEntry channel)
3029 {
3030   SilcChannelKeyPayload payload = NULL;
3031   SilcChannelID *id = NULL;
3032   unsigned char *tmp, hash[32];
3033   uint32 tmp_len;
3034   char *cipher;
3035
3036   SILC_LOG_DEBUG(("Start"));
3037
3038   /* Decode channel key payload */
3039   payload = silc_channel_key_payload_parse(key_payload);
3040   if (!payload) {
3041     SILC_LOG_ERROR(("Bad channel key payload, dropped"));
3042     channel = NULL;
3043     goto out;
3044   }
3045
3046   /* Get the channel entry */
3047   if (!channel) {
3048
3049     /* Get channel ID */
3050     tmp = silc_channel_key_get_id(payload, &tmp_len);
3051     id = silc_id_str2id(tmp, tmp_len, SILC_ID_CHANNEL);
3052     if (!id) {
3053       channel = NULL;
3054       goto out;
3055     }
3056
3057     channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
3058     if (!channel) {
3059       channel = silc_idlist_find_channel_by_id(server->global_list, id, NULL);
3060       if (!channel) {
3061         SILC_LOG_ERROR(("Received key for non-existent channel"));
3062         goto out;
3063       }
3064     }
3065   }
3066
3067   tmp = silc_channel_key_get_key(payload, &tmp_len);
3068   if (!tmp) {
3069     channel = NULL;
3070     goto out;
3071   }
3072
3073   cipher = silc_channel_key_get_cipher(payload, NULL);
3074   if (!cipher) {
3075     channel = NULL;
3076     goto out;
3077   }
3078
3079   /* Remove old key if exists */
3080   if (channel->key) {
3081     memset(channel->key, 0, channel->key_len / 8);
3082     silc_free(channel->key);
3083     silc_cipher_free(channel->channel_key);
3084   }
3085
3086   /* Create new cipher */
3087   if (!silc_cipher_alloc(cipher, &channel->channel_key)) {
3088     channel = NULL;
3089     goto out;
3090   }
3091
3092   if (channel->cipher)
3093     silc_free(channel->cipher);
3094   channel->cipher = strdup(cipher);
3095
3096   /* Save the key */
3097   channel->key_len = tmp_len * 8;
3098   channel->key = silc_calloc(tmp_len, sizeof(unsigned char));
3099   memcpy(channel->key, tmp, tmp_len);
3100   silc_cipher_set_key(channel->channel_key, tmp, channel->key_len);
3101
3102   /* Generate HMAC key from the channel key data and set it */
3103   if (!channel->hmac)
3104     silc_hmac_alloc("hmac-sha1-96", NULL, &channel->hmac);
3105   silc_hash_make(channel->hmac->hash, tmp, tmp_len, hash);
3106   silc_hmac_set_key(channel->hmac, hash, silc_hash_len(channel->hmac->hash));
3107
3108   memset(hash, 0, sizeof(hash));
3109   memset(tmp, 0, tmp_len);
3110
3111   if (server->server_type == SILC_ROUTER) {
3112     if (!channel->rekey)
3113       channel->rekey = silc_calloc(1, sizeof(*channel->rekey));
3114     channel->rekey->context = (void *)server;
3115     channel->rekey->channel = channel;
3116
3117     silc_task_unregister_by_callback(server->timeout_queue,
3118                                      silc_server_channel_key_rekey);
3119     silc_task_register(server->timeout_queue, 0, 
3120                        silc_server_channel_key_rekey,
3121                        (void *)channel->rekey, 3600, 0,
3122                        SILC_TASK_TIMEOUT,
3123                        SILC_TASK_PRI_NORMAL);
3124   }
3125
3126  out:
3127   if (id)
3128     silc_free(id);
3129   if (payload)
3130     silc_channel_key_payload_free(payload);
3131
3132   return channel;
3133 }
3134
3135 /* Heartbeat callback. This function is set as argument for the
3136    silc_socket_set_heartbeat function. The library will call this function
3137    at the set time interval. */
3138
3139 void silc_server_perform_heartbeat(SilcSocketConnection sock,
3140                                    void *hb_context)
3141 {
3142   SilcServerHBContext hb = (SilcServerHBContext)hb_context;
3143
3144   SILC_LOG_DEBUG(("Sending heartbeat to %s (%s)", sock->hostname,
3145                   sock->ip));
3146
3147   /* Send the heartbeat */
3148   silc_server_send_heartbeat(hb->server, sock);
3149 }
3150
3151 /* Returns assembled of all servers in the given ID list. The packet's
3152    form is dictated by the New ID payload. */
3153
3154 static void silc_server_announce_get_servers(SilcServer server,
3155                                              SilcIDList id_list,
3156                                              SilcBuffer *servers)
3157 {
3158   SilcIDCacheList list;
3159   SilcIDCacheEntry id_cache;
3160   SilcServerEntry entry;
3161   SilcBuffer idp;
3162
3163   /* Go through all clients in the list */
3164   if (silc_idcache_get_all(id_list->servers, &list)) {
3165     if (silc_idcache_list_first(list, &id_cache)) {
3166       while (id_cache) {
3167         entry = (SilcServerEntry)id_cache->context;
3168
3169         idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
3170
3171         *servers = silc_buffer_realloc(*servers, 
3172                                        (*servers ? 
3173                                         (*servers)->truelen + idp->len : 
3174                                         idp->len));
3175         silc_buffer_pull_tail(*servers, ((*servers)->end - (*servers)->data));
3176         silc_buffer_put(*servers, idp->data, idp->len);
3177         silc_buffer_pull(*servers, idp->len);
3178         silc_buffer_free(idp);
3179
3180         if (!silc_idcache_list_next(list, &id_cache))
3181           break;
3182       }
3183     }
3184
3185     silc_idcache_list_free(list);
3186   }
3187 }
3188
3189 /* This function is used by router to announce existing servers to our
3190    primary router when we've connected to it. */
3191
3192 void silc_server_announce_servers(SilcServer server)
3193 {
3194   SilcBuffer servers = NULL;
3195
3196   SILC_LOG_DEBUG(("Announcing servers"));
3197
3198   /* Get servers in local list */
3199   silc_server_announce_get_servers(server, server->local_list, &servers);
3200
3201   /* Get servers in global list */
3202   silc_server_announce_get_servers(server, server->global_list, &servers);
3203
3204   if (servers) {
3205     silc_buffer_push(servers, servers->data - servers->head);
3206     SILC_LOG_HEXDUMP(("servers"), servers->data, servers->len);
3207
3208     /* Send the packet */
3209     silc_server_packet_send(server, server->router->connection,
3210                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3211                             servers->data, servers->len, TRUE);
3212
3213     silc_buffer_free(servers);
3214   }
3215 }
3216
3217 /* Returns assembled packet of all clients in the given ID list. The
3218    packet's form is dictated by the New ID Payload. */
3219
3220 static void silc_server_announce_get_clients(SilcServer server,
3221                                              SilcIDList id_list,
3222                                              SilcBuffer *clients)
3223 {
3224   SilcIDCacheList list;
3225   SilcIDCacheEntry id_cache;
3226   SilcClientEntry client;
3227   SilcBuffer idp;
3228
3229   /* Go through all clients in the list */
3230   if (silc_idcache_get_all(id_list->clients, &list)) {
3231     if (silc_idcache_list_first(list, &id_cache)) {
3232       while (id_cache) {
3233         client = (SilcClientEntry)id_cache->context;
3234
3235         idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
3236
3237         *clients = silc_buffer_realloc(*clients, 
3238                                        (*clients ? 
3239                                         (*clients)->truelen + idp->len : 
3240                                         idp->len));
3241         silc_buffer_pull_tail(*clients, ((*clients)->end - (*clients)->data));
3242         silc_buffer_put(*clients, idp->data, idp->len);
3243         silc_buffer_pull(*clients, idp->len);
3244         silc_buffer_free(idp);
3245
3246         if (!silc_idcache_list_next(list, &id_cache))
3247           break;
3248       }
3249     }
3250
3251     silc_idcache_list_free(list);
3252   }
3253 }
3254
3255 /* This function is used to announce our existing clients to our router
3256    when we've connected to it. */
3257
3258 void silc_server_announce_clients(SilcServer server)
3259 {
3260   SilcBuffer clients = NULL;
3261
3262   SILC_LOG_DEBUG(("Announcing clients"));
3263
3264   /* Get clients in local list */
3265   silc_server_announce_get_clients(server, server->local_list,
3266                                    &clients);
3267
3268   /* As router we announce our global list as well */
3269   if (server->server_type == SILC_ROUTER)
3270     silc_server_announce_get_clients(server, server->global_list,
3271                                      &clients);
3272
3273   if (clients) {
3274     silc_buffer_push(clients, clients->data - clients->head);
3275     SILC_LOG_HEXDUMP(("clients"), clients->data, clients->len);
3276
3277     /* Send the packet */
3278     silc_server_packet_send(server, server->router->connection,
3279                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
3280                             clients->data, clients->len, TRUE);
3281
3282     silc_buffer_free(clients);
3283   }
3284 }
3285
3286 static SilcBuffer 
3287 silc_server_announce_encode_notify(SilcNotifyType notify, uint32 argc, ...)
3288 {
3289   va_list ap;
3290   SilcBuffer p;
3291
3292   va_start(ap, argc);
3293   p = silc_notify_payload_encode(notify, argc, ap);
3294   va_end(ap);
3295  
3296   return p;
3297 }
3298
3299 /* Returns assembled packets for channel users of the `channel'. */
3300
3301 void silc_server_announce_get_channel_users(SilcServer server,
3302                                             SilcChannelEntry channel,
3303                                             SilcBuffer *channel_users,
3304                                             SilcBuffer *channel_users_modes)
3305 {
3306   SilcChannelClientEntry chl;
3307   SilcHashTableList htl;
3308   SilcBuffer chidp, clidp;
3309   SilcBuffer tmp;
3310   int len;
3311   unsigned char mode[4];
3312
3313   SILC_LOG_DEBUG(("Start"));
3314
3315   /* Now find all users on the channel */
3316   chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
3317   silc_hash_table_list(channel->user_list, &htl);
3318   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3319     clidp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3320
3321     /* JOIN Notify */
3322     tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_JOIN, 2, 
3323                                              clidp->data, clidp->len,
3324                                              chidp->data, chidp->len);
3325     len = tmp->len;
3326     *channel_users = 
3327       silc_buffer_realloc(*channel_users, 
3328                           (*channel_users ? 
3329                            (*channel_users)->truelen + len : len));
3330     silc_buffer_pull_tail(*channel_users, 
3331                           ((*channel_users)->end - 
3332                            (*channel_users)->data));
3333     
3334     silc_buffer_put(*channel_users, tmp->data, tmp->len);
3335     silc_buffer_pull(*channel_users, len);
3336     silc_buffer_free(tmp);
3337
3338     /* CUMODE notify for mode change on the channel */
3339     SILC_PUT32_MSB(chl->mode, mode);
3340     tmp = silc_server_announce_encode_notify(SILC_NOTIFY_TYPE_CUMODE_CHANGE, 
3341                                              3, clidp->data, clidp->len,
3342                                              mode, 4,
3343                                              clidp->data, clidp->len);
3344     len = tmp->len;
3345     *channel_users_modes = 
3346       silc_buffer_realloc(*channel_users_modes, 
3347                           (*channel_users_modes ? 
3348                            (*channel_users_modes)->truelen + len : len));
3349     silc_buffer_pull_tail(*channel_users_modes, 
3350                           ((*channel_users_modes)->end - 
3351                            (*channel_users_modes)->data));
3352     
3353     silc_buffer_put(*channel_users_modes, tmp->data, tmp->len);
3354     silc_buffer_pull(*channel_users_modes, len);
3355     silc_buffer_free(tmp);
3356
3357     silc_buffer_free(clidp);
3358   }
3359   silc_buffer_free(chidp);
3360 }
3361
3362 /* Returns assembled packets for all channels and users on those channels
3363    from the given ID List. The packets are in the form dictated by the
3364    New Channel and New Channel User payloads. */
3365
3366 void silc_server_announce_get_channels(SilcServer server,
3367                                        SilcIDList id_list,
3368                                        SilcBuffer *channels,
3369                                        SilcBuffer *channel_users,
3370                                        SilcBuffer **channel_users_modes,
3371                                        uint32 *channel_users_modes_c,
3372                                        SilcChannelID ***channel_ids)
3373 {
3374   SilcIDCacheList list;
3375   SilcIDCacheEntry id_cache;
3376   SilcChannelEntry channel;
3377   unsigned char *cid;
3378   uint32 id_len;
3379   uint16 name_len;
3380   int len;
3381   int i = *channel_users_modes_c;
3382
3383   SILC_LOG_DEBUG(("Start"));
3384
3385   /* Go through all channels in the list */
3386   if (silc_idcache_get_all(id_list->channels, &list)) {
3387     if (silc_idcache_list_first(list, &id_cache)) {
3388       while (id_cache) {
3389         channel = (SilcChannelEntry)id_cache->context;
3390         
3391         cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3392         id_len = silc_id_get_len(channel->id, SILC_ID_CHANNEL);
3393         name_len = strlen(channel->channel_name);
3394
3395         len = 4 + name_len + id_len + 4;
3396         *channels = 
3397           silc_buffer_realloc(*channels, 
3398                               (*channels ? (*channels)->truelen + len : len));
3399         silc_buffer_pull_tail(*channels, 
3400                               ((*channels)->end - (*channels)->data));
3401         silc_buffer_format(*channels,
3402                            SILC_STR_UI_SHORT(name_len),
3403                            SILC_STR_UI_XNSTRING(channel->channel_name, 
3404                                                 name_len),
3405                            SILC_STR_UI_SHORT(id_len),
3406                            SILC_STR_UI_XNSTRING(cid, id_len),
3407                            SILC_STR_UI_INT(channel->mode),
3408                            SILC_STR_END);
3409         silc_buffer_pull(*channels, len);
3410
3411         *channel_users_modes = silc_realloc(*channel_users_modes,
3412                                             sizeof(**channel_users_modes) * 
3413                                             (i + 1));
3414         (*channel_users_modes)[i] = NULL;
3415         *channel_ids = silc_realloc(*channel_ids, 
3416                                     sizeof(**channel_ids) * (i + 1));
3417         (*channel_ids)[i] = NULL;
3418         silc_server_announce_get_channel_users(server, channel,
3419                                                channel_users,
3420                                                channel_users_modes[i]);
3421         (*channel_ids)[i] = channel->id;
3422         i++;
3423
3424         if (!silc_idcache_list_next(list, &id_cache))
3425           break;
3426       }
3427
3428       *channel_users_modes_c += i;
3429     }
3430
3431     silc_idcache_list_free(list);
3432   }
3433 }
3434
3435 /* This function is used to announce our existing channels to our router
3436    when we've connected to it. This also announces the users on the
3437    channels to the router. */
3438
3439 void silc_server_announce_channels(SilcServer server)
3440 {
3441   SilcBuffer channels = NULL, channel_users = NULL;
3442   SilcBuffer *channel_users_modes = NULL;
3443   uint32 channel_users_modes_c = 0;
3444   SilcChannelID **channel_ids = NULL;
3445
3446   SILC_LOG_DEBUG(("Announcing channels and channel users"));
3447
3448   /* Get channels and channel users in local list */
3449   silc_server_announce_get_channels(server, server->local_list,
3450                                     &channels, &channel_users,
3451                                     &channel_users_modes,
3452                                     &channel_users_modes_c,
3453                                     &channel_ids);
3454
3455   /* Get channels and channel users in global list */
3456   silc_server_announce_get_channels(server, server->global_list,
3457                                     &channels, &channel_users,
3458                                     &channel_users_modes,
3459                                     &channel_users_modes_c,
3460                                     &channel_ids);
3461
3462   if (channels) {
3463     silc_buffer_push(channels, channels->data - channels->head);
3464     SILC_LOG_HEXDUMP(("channels"), channels->data, channels->len);
3465
3466     /* Send the packet */
3467     silc_server_packet_send(server, server->router->connection,
3468                             SILC_PACKET_NEW_CHANNEL, SILC_PACKET_FLAG_LIST,
3469                             channels->data, channels->len,
3470                             FALSE);
3471
3472     silc_buffer_free(channels);
3473   }
3474
3475   if (channel_users) {
3476     silc_buffer_push(channel_users, channel_users->data - channel_users->head);
3477     SILC_LOG_HEXDUMP(("channel users"), channel_users->data, 
3478                      channel_users->len);
3479
3480     /* Send the packet */
3481     silc_server_packet_send(server, server->router->connection,
3482                             SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3483                             channel_users->data, channel_users->len,
3484                             FALSE);
3485
3486     silc_buffer_free(channel_users);
3487   }
3488
3489   if (channel_users_modes) {
3490     int i;
3491
3492     for (i = 0; i < channel_users_modes_c; i++) {
3493       silc_buffer_push(channel_users_modes[i], 
3494                        channel_users_modes[i]->data - 
3495                        channel_users_modes[i]->head);
3496       SILC_LOG_HEXDUMP(("channel users modes"), channel_users_modes[i]->data, 
3497                        channel_users_modes[i]->len);
3498       silc_server_packet_send_dest(server, server->router->connection,
3499                                    SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
3500                                    channel_ids[i], SILC_ID_CHANNEL,
3501                                    channel_users_modes[i]->data, 
3502                                    channel_users_modes[i]->len,
3503                                    FALSE);
3504       silc_buffer_free(channel_users_modes[i]);
3505     }
3506     silc_free(channel_users_modes);
3507     silc_free(channel_ids);
3508   }
3509 }
3510
3511 /* Failure timeout callback. If this is called then we will immediately
3512    process the received failure. We always process the failure with timeout
3513    since we do not want to blindly trust to received failure packets. 
3514    This won't be called (the timeout is cancelled) if the failure was
3515    bogus (it is bogus if remote does not close the connection after sending
3516    the failure). */
3517
3518 SILC_TASK_CALLBACK(silc_server_failure_callback)
3519 {
3520   SilcServerFailureContext f = (SilcServerFailureContext)context;
3521
3522   if (f->sock->protocol) {
3523     f->sock->protocol->state = SILC_PROTOCOL_STATE_FAILURE;
3524     silc_protocol_execute(f->sock->protocol, f->server->timeout_queue, 0, 0);
3525   }
3526
3527   silc_free(f);
3528 }
3529
3530 /* Assembles user list and users mode list from the `channel'. */
3531
3532 void silc_server_get_users_on_channel(SilcServer server,
3533                                       SilcChannelEntry channel,
3534                                       SilcBuffer *user_list,
3535                                       SilcBuffer *mode_list,
3536                                       uint32 *user_count)
3537 {
3538   SilcChannelClientEntry chl;
3539   SilcHashTableList htl;
3540   SilcBuffer client_id_list;
3541   SilcBuffer client_mode_list;
3542   SilcBuffer idp;
3543   uint32 list_count = 0;
3544
3545   /* XXX rewrite - this does not support IPv6 based Client ID's. */
3546
3547   client_id_list = 
3548     silc_buffer_alloc((SILC_ID_CLIENT_LEN + 4) * 
3549                       silc_hash_table_count(channel->user_list));
3550   client_mode_list = 
3551     silc_buffer_alloc(4 * silc_hash_table_count(channel->user_list));
3552   silc_buffer_pull_tail(client_id_list, SILC_BUFFER_END(client_id_list));
3553   silc_buffer_pull_tail(client_mode_list, SILC_BUFFER_END(client_mode_list));
3554   silc_hash_table_list(channel->user_list, &htl);
3555   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3556     /* Client ID */
3557     idp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
3558     silc_buffer_put(client_id_list, idp->data, idp->len);
3559     silc_buffer_pull(client_id_list, idp->len);
3560     silc_buffer_free(idp);
3561
3562     /* Client's mode on channel */
3563     SILC_PUT32_MSB(chl->mode, client_mode_list->data);
3564     silc_buffer_pull(client_mode_list, 4);
3565
3566     list_count++;
3567   }
3568   silc_buffer_push(client_id_list, 
3569                    client_id_list->data - client_id_list->head);
3570   silc_buffer_push(client_mode_list, 
3571                    client_mode_list->data - client_mode_list->head);
3572
3573   *user_list = client_id_list;
3574   *mode_list = client_mode_list;
3575   *user_count = list_count;
3576 }
3577
3578 /* Saves users and their modes to the `channel'. */
3579
3580 void silc_server_save_users_on_channel(SilcServer server,
3581                                        SilcSocketConnection sock,
3582                                        SilcChannelEntry channel,
3583                                        SilcClientID *noadd,
3584                                        SilcBuffer user_list,
3585                                        SilcBuffer mode_list,
3586                                        uint32 user_count)
3587 {
3588   int i;
3589
3590   /* Cache the received Client ID's and modes. This cache expires
3591      whenever server sends notify message to channel. It means two things;
3592      some user has joined or leaved the channel. XXX TODO! */
3593   for (i = 0; i < user_count; i++) {
3594     uint16 idp_len;
3595     uint32 mode;
3596     SilcClientID *client_id;
3597     SilcClientEntry client;
3598
3599     /* Client ID */
3600     SILC_GET16_MSB(idp_len, user_list->data + 2);
3601     idp_len += 4;
3602     client_id = silc_id_payload_parse_id(user_list->data, idp_len);
3603     silc_buffer_pull(user_list, idp_len);
3604     if (!client_id)
3605       continue;
3606
3607     /* Mode */
3608     SILC_GET32_MSB(mode, mode_list->data);
3609     silc_buffer_pull(mode_list, 4);
3610
3611     if (noadd && SILC_ID_CLIENT_COMPARE(client_id, noadd)) {
3612       silc_free(client_id);
3613       continue;
3614     }
3615     
3616     /* Check if we have this client cached already. */
3617     client = silc_idlist_find_client_by_id(server->local_list, client_id,
3618                                            NULL);
3619     if (!client)
3620       client = silc_idlist_find_client_by_id(server->global_list, 
3621                                              client_id, NULL);
3622     if (!client) {
3623       /* If router did not find such Client ID in its lists then this must
3624          be bogus client or some router in the net is buggy. */
3625       if (server->server_type == SILC_ROUTER) {
3626         silc_free(client_id);
3627         continue;
3628       }
3629
3630       /* We don't have that client anywhere, add it. The client is added
3631          to global list since server didn't have it in the lists so it must be 
3632          global. */
3633       client = silc_idlist_add_client(server->global_list, NULL, NULL, NULL,
3634                                       silc_id_dup(client_id, SILC_ID_CLIENT), 
3635                                       sock->user_data, NULL);
3636       if (!client) {
3637         silc_free(client_id);
3638         continue;
3639       }
3640
3641       client->data.registered = TRUE;
3642     }
3643
3644     silc_free(client_id);
3645
3646     if (!silc_server_client_on_channel(client, channel)) {
3647       /* Client was not on the channel, add it. */
3648       SilcChannelClientEntry chl = silc_calloc(1, sizeof(*chl));
3649       chl->client = client;
3650       chl->mode = mode;
3651       chl->channel = channel;
3652       silc_hash_table_add(channel->user_list, chl->client, chl);
3653       silc_hash_table_add(client->channels, chl->channel, chl);
3654     }
3655   }
3656 }
3657
3658 /* Lookups route to the client indicated by the `id_data'. The connection
3659    object and internal data object is returned. Returns NULL if route
3660    could not be found to the client. If the `client_id' is specified then
3661    it is used and the `id_data' is ignored. */
3662
3663 SilcSocketConnection silc_server_get_client_route(SilcServer server,
3664                                                   unsigned char *id_data,
3665                                                   uint32 id_len,
3666                                                   SilcClientID *client_id,
3667                                                   SilcIDListData *idata)
3668 {
3669   SilcClientID *id;
3670   SilcClientEntry client;
3671
3672   SILC_LOG_DEBUG(("Start"));
3673
3674   /* Decode destination Client ID */
3675   if (!client_id) {
3676     id = silc_id_str2id(id_data, id_len, SILC_ID_CLIENT);
3677     if (!id) {
3678       SILC_LOG_ERROR(("Could not decode destination Client ID, dropped"));
3679       return NULL;
3680     }
3681   } else {
3682     id = silc_id_dup(client_id, SILC_ID_CLIENT);
3683   }
3684
3685   /* If the destination belongs to our server we don't have to route
3686      the packet anywhere but to send it to the local destination. */
3687   client = silc_idlist_find_client_by_id(server->local_list, id, NULL);
3688   if (client) {
3689     silc_free(id);
3690
3691     if (client->data.registered == FALSE)
3692       return NULL;
3693
3694     /* If we are router and the client has router then the client is in
3695        our cell but not directly connected to us. */
3696     if (server->server_type == SILC_ROUTER && client->router) {
3697       /* We are of course in this case the client's router thus the route
3698          to the client is the server who owns the client. So, we will send
3699          the packet to that server. */
3700       if (idata)
3701         *idata = (SilcIDListData)client->router;
3702       return client->router->connection;
3703     }
3704
3705     /* Seems that client really is directly connected to us */
3706     if (idata)
3707       *idata = (SilcIDListData)client;
3708     return client->connection;
3709   }
3710
3711   /* Destination belongs to someone not in this server. If we are normal
3712      server our action is to send the packet to our router. */
3713   if (server->server_type == SILC_SERVER && !server->standalone) {
3714     silc_free(id);
3715     if (idata)
3716       *idata = (SilcIDListData)server->router;
3717     return server->router->connection;
3718   }
3719
3720   /* We are router and we will perform route lookup for the destination 
3721      and send the packet to fastest route. */
3722   if (server->server_type == SILC_ROUTER && !server->standalone) {
3723     /* Check first that the ID is valid */
3724     client = silc_idlist_find_client_by_id(server->global_list, id, NULL);
3725     if (client) {
3726       SilcSocketConnection dst_sock;
3727
3728       dst_sock = silc_server_route_get(server, id, SILC_ID_CLIENT);
3729
3730       silc_free(id);
3731       if (idata)
3732         *idata = (SilcIDListData)dst_sock->user_data;
3733       return dst_sock;
3734     }
3735   }
3736
3737   silc_free(id);
3738   return NULL;
3739 }
3740
3741 /* Encodes and returns channel list of channels the `client' has joined.
3742    Secret channels are not put to the list. */
3743
3744 SilcBuffer silc_server_get_client_channel_list(SilcServer server,
3745                                                SilcClientEntry client)
3746 {
3747   SilcBuffer buffer = NULL;
3748   SilcChannelEntry channel;
3749   SilcChannelClientEntry chl;
3750   SilcHashTableList htl;
3751   unsigned char *cid;
3752   uint32 id_len;
3753   uint16 name_len;
3754   int len;
3755
3756   silc_hash_table_list(client->channels, &htl);
3757   while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
3758     channel = chl->channel;
3759
3760     if (channel->mode & SILC_CHANNEL_MODE_SECRET)
3761       continue;
3762
3763     cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
3764     id_len = silc_id_get_len(channel->id, SILC_ID_CHANNEL);
3765     name_len = strlen(channel->channel_name);
3766     
3767     len = 4 + name_len + id_len + 4;
3768     buffer = silc_buffer_realloc(buffer, 
3769                                  (buffer ? (buffer)->truelen + len : len));
3770     silc_buffer_pull_tail(buffer, ((buffer)->end - (buffer)->data));
3771     silc_buffer_format(buffer,
3772                        SILC_STR_UI_SHORT(name_len),
3773                        SILC_STR_UI_XNSTRING(channel->channel_name, 
3774                                             name_len),
3775                        SILC_STR_UI_SHORT(id_len),
3776                        SILC_STR_UI_XNSTRING(cid, id_len),
3777                        SILC_STR_UI_INT(chl->mode), /* Client's mode */
3778                        SILC_STR_END);
3779     silc_buffer_pull(buffer, len);
3780     silc_free(cid);
3781   }
3782
3783   if (buffer)
3784     silc_buffer_push(buffer, buffer->data - buffer->head);
3785
3786   return buffer;
3787 }
3788
3789 /* Finds client entry by Client ID and if it is not found then resolves
3790    it using WHOIS command. */
3791
3792 SilcClientEntry silc_server_get_client_resolve(SilcServer server,
3793                                                SilcClientID *client_id)
3794 {
3795   SilcClientEntry client;
3796
3797   client = silc_idlist_find_client_by_id(server->local_list, client_id, NULL);
3798   if (!client) {
3799     client = silc_idlist_find_client_by_id(server->global_list, 
3800                                            client_id, NULL);
3801     if (!client && server->server_type == SILC_ROUTER)
3802       return NULL;
3803   }
3804
3805   if (!client && server->standalone)
3806     return NULL;
3807
3808   if (!client || !client->nickname || !client->username) {
3809     SilcBuffer buffer, idp;
3810
3811     idp = silc_id_payload_encode(client_id, SILC_ID_CLIENT);
3812     buffer = silc_command_payload_encode_va(SILC_COMMAND_WHOIS,
3813                                             ++server->cmd_ident, 1,
3814                                             3, idp->data, idp->len);
3815     silc_server_packet_send(server, client ? client->router->connection :
3816                             server->router->connection,
3817                             SILC_PACKET_COMMAND, 0,
3818                             buffer->data, buffer->len, FALSE);
3819     silc_buffer_free(idp);
3820     silc_buffer_free(buffer);
3821   }
3822
3823   return client;
3824 }
3825
3826 /* A timeout callback for the re-key. We will be the initiator of the
3827    re-key protocol. */
3828
3829 SILC_TASK_CALLBACK(silc_server_rekey_callback)
3830 {
3831   SilcSocketConnection sock = (SilcSocketConnection)context;
3832   SilcIDListData idata = (SilcIDListData)sock->user_data;
3833   SilcServer server = (SilcServer)idata->rekey->context;
3834   SilcProtocol protocol;
3835   SilcServerRekeyInternalContext *proto_ctx;
3836
3837   SILC_LOG_DEBUG(("Start"));
3838
3839   /* Allocate internal protocol context. This is sent as context
3840      to the protocol. */
3841   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
3842   proto_ctx->server = (void *)server;
3843   proto_ctx->sock = sock;
3844   proto_ctx->responder = FALSE;
3845   proto_ctx->pfs = idata->rekey->pfs;
3846       
3847   /* Perform rekey protocol. Will call the final callback after the
3848      protocol is over. */
3849   silc_protocol_alloc(SILC_PROTOCOL_SERVER_REKEY, 
3850                       &protocol, proto_ctx, silc_server_rekey_final);
3851   sock->protocol = protocol;
3852       
3853   /* Run the protocol */
3854   silc_protocol_execute(protocol, server->timeout_queue, 0, 0);
3855
3856   /* Re-register re-key timeout */
3857   silc_task_register(server->timeout_queue, sock->sock, 
3858                      silc_server_rekey_callback,
3859                      context, idata->rekey->timeout, 0,
3860                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
3861 }
3862
3863 /* The final callback for the REKEY protocol. This will actually take the
3864    new key material into use. */
3865
3866 SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final)
3867 {
3868   SilcProtocol protocol = (SilcProtocol)context;
3869   SilcServerRekeyInternalContext *ctx =
3870     (SilcServerRekeyInternalContext *)protocol->context;
3871   SilcServer server = (SilcServer)ctx->server;
3872   SilcSocketConnection sock = ctx->sock;
3873
3874   SILC_LOG_DEBUG(("Start"));
3875
3876   if (protocol->state == SILC_PROTOCOL_STATE_ERROR ||
3877       protocol->state == SILC_PROTOCOL_STATE_FAILURE) {
3878     /* Error occured during protocol */
3879     silc_protocol_cancel(protocol, server->timeout_queue);
3880     silc_protocol_free(protocol);
3881     sock->protocol = NULL;
3882     if (ctx->packet)
3883       silc_packet_context_free(ctx->packet);
3884     if (ctx->ske)
3885       silc_ske_free(ctx->ske);
3886     silc_free(ctx);
3887     return;
3888   }
3889
3890   /* Cleanup */
3891   silc_protocol_free(protocol);
3892   sock->protocol = NULL;
3893   if (ctx->packet)
3894     silc_packet_context_free(ctx->packet);
3895   if (ctx->ske)
3896     silc_ske_free(ctx->ske);
3897   silc_free(ctx);
3898 }