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