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