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