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