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