Code auditing weekend results and fixes committing.
[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
42 /* Allocates a new SILC server object. This has to be done before the server
43    can be used. After allocation one must call silc_server_init to initialize
44    the server. The new allocated server object is returned to the new_server
45    argument. */
46
47 int silc_server_alloc(SilcServer *new_server)
48 {
49   SilcServer server;
50
51   SILC_LOG_DEBUG(("Allocating new server object"));
52
53   server = silc_calloc(1, sizeof(*server));
54   server->server_type = SILC_SERVER;
55   server->standalone = TRUE;
56   server->local_list = silc_calloc(1, sizeof(*server->local_list));
57   server->global_list = silc_calloc(1, sizeof(*server->global_list));
58   server->pending_commands = silc_dlist_init();
59 #ifdef SILC_SIM
60   server->sim = silc_dlist_init();
61 #endif
62
63   *new_server = server;
64
65   return TRUE;
66 }
67
68 /* Free's the SILC server object. This is called at the very end before
69    the program ends. */
70
71 void silc_server_free(SilcServer server)
72 {
73   if (server) {
74 #ifdef SILC_SIM
75     SilcSimContext *sim;
76 #endif
77
78     if (server->local_list)
79       silc_free(server->local_list);
80     if (server->global_list)
81       silc_free(server->global_list);
82     if (server->rng)
83       silc_rng_free(server->rng);
84
85 #ifdef SILC_SIM
86     while ((sim = silc_dlist_get(server->sim)) != SILC_LIST_END) {
87       silc_dlist_del(server->sim, sim);
88       silc_sim_free(sim);
89     }
90     silc_dlist_uninit(server->sim);
91 #endif
92
93     if (server->params)
94       silc_free(server->params);
95
96     if (server->pending_commands)
97       silc_dlist_uninit(server->pending_commands);
98
99     silc_math_primegen_uninit(); /* XXX */
100     silc_free(server);
101   }
102 }
103
104 /* Initializes the entire SILC server. This is called always before running
105    the server. This is called only once at the initialization of the program.
106    This binds the server to its listenning port. After this function returns 
107    one should call silc_server_run to start the server. This returns TRUE 
108    when everything is ok to run the server. Configuration file must be
109    read and parsed before calling this. */
110
111 int silc_server_init(SilcServer server)
112 {
113   int *sock = NULL, sock_count = 0, i;
114   SilcServerID *id;
115   SilcServerEntry id_entry;
116
117   SILC_LOG_DEBUG(("Initializing server"));
118   assert(server);
119   assert(server->config);
120
121   /* XXX After server is made as Silc Server Library this can be given
122      as argument, for now this is hard coded */
123   server->params = silc_calloc(1, sizeof(*server->params));
124   server->params->retry_count = SILC_SERVER_RETRY_COUNT;
125   server->params->retry_interval_min = SILC_SERVER_RETRY_INTERVAL_MIN;
126   server->params->retry_interval_max = SILC_SERVER_RETRY_INTERVAL_MAX;
127   server->params->retry_keep_trying = FALSE;
128   server->params->protocol_timeout = 60;
129   server->params->require_reverse_mapping = FALSE;
130
131   /* Set log files where log message should be saved. */
132   server->config->server = server;
133   silc_config_server_setlogfiles(server->config);
134  
135   /* Register all configured ciphers, PKCS and hash functions. */
136   silc_config_server_register_ciphers(server->config);
137   silc_config_server_register_pkcs(server->config);
138   silc_config_server_register_hashfuncs(server->config);
139
140   /* Initialize random number generator for the server. */
141   server->rng = silc_rng_alloc();
142   silc_rng_init(server->rng);
143   silc_math_primegen_init(); /* XXX */
144
145   /* Initialize hash functions for server to use */
146   silc_hash_alloc("md5", &server->md5hash);
147   silc_hash_alloc("sha1", &server->sha1hash);
148
149   /* Initialize none cipher */
150   silc_cipher_alloc("none", &server->none_cipher);
151
152   /* XXXXX Generate RSA key pair */
153   {
154     unsigned char *public_key;
155     unsigned char *private_key;
156     unsigned int pk_len, prv_len;
157     struct stat st;
158
159     if (stat("pubkey.pub", &st) < 0 && stat("privkey.prv", &st) < 0) {
160
161       if (silc_pkcs_alloc("rsa", &server->pkcs) == FALSE) {
162         SILC_LOG_ERROR(("Could not create RSA key pair"));
163         goto err0;
164       }
165       
166       if (server->pkcs->pkcs->init(server->pkcs->context, 
167                                    1024, server->rng) == FALSE) {
168         SILC_LOG_ERROR(("Could not generate RSA key pair"));
169         goto err0;
170       }
171       
172       public_key = server->pkcs->pkcs->get_public_key(server->pkcs->context,
173                                                       &pk_len);
174       private_key = server->pkcs->pkcs->get_private_key(server->pkcs->context,
175                                                         &prv_len);
176       
177       SILC_LOG_HEXDUMP(("public key"), public_key, pk_len);
178       SILC_LOG_HEXDUMP(("private key"), private_key, prv_len);
179       
180       server->public_key = 
181         silc_pkcs_public_key_alloc("rsa", "UN=root, HN=dummy",
182                                    public_key, pk_len);
183       server->private_key = 
184         silc_pkcs_private_key_alloc("rsa", private_key, prv_len);
185       
186       /* XXX Save keys */
187       silc_pkcs_save_public_key("pubkey.pub", server->public_key,
188                                 SILC_PKCS_FILE_PEM);
189       silc_pkcs_save_private_key("privkey.prv", server->private_key, NULL,
190                                  SILC_PKCS_FILE_BIN);
191
192       memset(public_key, 0, pk_len);
193       memset(private_key, 0, prv_len);
194       silc_free(public_key);
195       silc_free(private_key);
196     } else {
197       silc_pkcs_load_public_key("pubkey.pub", &server->public_key,
198                                 SILC_PKCS_FILE_PEM);
199       silc_pkcs_load_private_key("privkey.prv", &server->private_key,
200                                  SILC_PKCS_FILE_BIN);
201     }
202   }
203
204   /* Create a listening server. Note that our server can listen on
205      multiple ports. All listeners are created here and now. */
206   /* XXX Still check this whether to use server_info or listen_port. */
207   sock_count = 0;
208   while(server->config->listen_port) {
209     int tmp;
210
211     tmp = silc_net_create_server(server->config->listen_port->port,
212                                  server->config->listen_port->host);
213     if (tmp < 0)
214       goto err0;
215
216     sock = silc_realloc(sock, (sizeof(int *) * (sock_count + 1)));
217     sock[sock_count] = tmp;
218     server->config->listen_port = server->config->listen_port->next;
219     sock_count++;
220   }
221
222   /* Initialize ID caches */
223   server->local_list->clients = silc_idcache_alloc(0);
224   server->local_list->servers = silc_idcache_alloc(0);
225   server->local_list->channels = silc_idcache_alloc(0);
226
227   /* These are allocated for normal server as well as these hold some 
228      global information that the server has fetched from its router. For 
229      router these are used as they are supposed to be used on router. */
230   server->global_list->clients = silc_idcache_alloc(0);
231   server->global_list->servers = silc_idcache_alloc(0);
232   server->global_list->channels = silc_idcache_alloc(0);
233
234   /* Allocate the entire socket list that is used in server. Eventually 
235      all connections will have entry in this table (it is a table of 
236      pointers to the actual object that is allocated individually 
237      later). */
238   server->sockets = silc_calloc(SILC_SERVER_MAX_CONNECTIONS,
239                                 sizeof(*server->sockets));
240
241   for (i = 0; i < sock_count; i++) {
242     SilcSocketConnection newsocket = NULL;
243
244     /* Set socket to non-blocking mode */
245     silc_net_set_socket_nonblock(sock[i]);
246     server->sock = sock[i];
247     
248     /* Create a Server ID for the server. */
249     silc_id_create_server_id(sock[i], server->rng, &id);
250     if (!id) {
251       goto err0;
252     }
253     
254     server->id = id;
255     server->id_string = silc_id_id2str(id, SILC_ID_SERVER);
256     server->id_string_len = silc_id_get_len(SILC_ID_SERVER);
257     server->id_type = SILC_ID_SERVER;
258     server->server_name = server->config->server_info->server_name;
259
260     /* Add ourselves to the server list. We don't have a router yet 
261        beacuse we haven't established a route yet. It will be done later. 
262        For now, NULL is sent as router. This allocates new entry to
263        the ID list. */
264     id_entry = 
265       silc_idlist_add_server(server->local_list,
266                              server->config->server_info->server_name,
267                              server->server_type, server->id, NULL, NULL);
268     if (!id_entry) {
269       SILC_LOG_ERROR(("Could not add ourselves to cache"));
270       goto err0;
271     }
272     
273     /* Add ourselves also to the socket table. The entry allocated above
274        is sent as argument for fast referencing in the future. */
275     silc_socket_alloc(sock[i], SILC_SOCKET_TYPE_SERVER, id_entry, 
276                       &newsocket);
277     if (!newsocket)
278       goto err0;
279
280     server->sockets[sock[i]] = newsocket;
281
282     /* Put the allocated socket pointer also to the entry allocated above 
283        for fast back-referencing to the socket list. */
284     id_entry->connection = (void *)server->sockets[sock[i]];
285     server->id_entry = id_entry;
286   }
287
288   /* Register the task queues. In SILC we have by default three task queues. 
289      One task queue for non-timeout tasks which perform different kind of 
290      I/O on file descriptors, timeout task queue for timeout tasks, and,
291      generic non-timeout task queue whose tasks apply to all connections. */
292   silc_task_queue_alloc(&server->io_queue, TRUE);
293   if (!server->io_queue) {
294     goto err0;
295   }
296   silc_task_queue_alloc(&server->timeout_queue, TRUE);
297   if (!server->timeout_queue) {
298     goto err1;
299   }
300   silc_task_queue_alloc(&server->generic_queue, TRUE);
301   if (!server->generic_queue) {
302     goto err1;
303   }
304
305   /* Register protocols */
306   silc_server_protocols_register();
307
308   /* Initialize the scheduler */
309   silc_schedule_init(&server->io_queue, &server->timeout_queue, 
310                      &server->generic_queue, 
311                      SILC_SERVER_MAX_CONNECTIONS);
312   
313   /* Add the first task to the queue. This is task that is executed by
314      timeout. It expires as soon as the caller calls silc_server_run. This
315      task performs authentication protocol and key exchange with our
316      primary router. */
317   silc_task_register(server->timeout_queue, sock[0], 
318                      silc_server_connect_to_router,
319                      (void *)server, 0, 1,
320                      SILC_TASK_TIMEOUT,
321                      SILC_TASK_PRI_NORMAL);
322
323   /* Add listener task to the queue. This task receives new connections to the 
324      server. This task remains on the queue until the end of the program. */
325   silc_task_register(server->io_queue, sock[0],
326                      silc_server_accept_new_connection,
327                      (void *)server, 0, 0, 
328                      SILC_TASK_FD,
329                      SILC_TASK_PRI_NORMAL);
330   server->listenning = TRUE;
331
332   /* If server connections has been configured then we must be router as
333      normal server cannot have server connections, only router connections. */
334   if (server->config->servers)
335     server->server_type = SILC_ROUTER;
336
337   SILC_LOG_DEBUG(("Server initialized"));
338
339   /* We are done here, return succesfully */
340   return TRUE;
341
342   silc_task_queue_free(server->timeout_queue);
343  err1:
344   silc_task_queue_free(server->io_queue);
345  err0:
346   for (i = 0; i < sock_count; i++)
347     silc_net_close_server(sock[i]);
348
349   return FALSE;
350 }
351
352 /* Stops the SILC server. This function is used to shutdown the server. 
353    This is usually called after the scheduler has returned. After stopping 
354    the server one should call silc_server_free. */
355
356 void silc_server_stop(SilcServer server)
357 {
358   SILC_LOG_DEBUG(("Stopping server"));
359
360   /* Stop the scheduler, although it might be already stopped. This
361      doesn't hurt anyone. This removes all the tasks and task queues,
362      as well. */
363   silc_schedule_stop();
364   silc_schedule_uninit();
365
366   silc_server_protocols_unregister();
367
368   SILC_LOG_DEBUG(("Server stopped"));
369 }
370
371 /* The heart of the server. This runs the scheduler thus runs the server. 
372    When this returns the server has been stopped and the program will
373    be terminated. */
374
375 void silc_server_run(SilcServer server)
376 {
377   SILC_LOG_DEBUG(("Running server"));
378
379   /* Start the scheduler, the heart of the SILC server. When this returns
380      the program will be terminated. */
381   silc_schedule();
382 }
383
384 /* Timeout callback that will be called to retry connecting to remote
385    router. This is used by both normal and router server. This will wait
386    before retrying the connecting. The timeout is generated by exponential
387    backoff algorithm. */
388
389 SILC_TASK_CALLBACK(silc_server_connect_to_router_retry)
390 {
391   SilcServerConnection sconn = (SilcServerConnection)context;
392   SilcServer server = sconn->server;
393
394   SILC_LOG_INFO(("Retrying connecting to a router"));
395
396   /* Calculate next timeout */
397   if (sconn->retry_count >= 1) {
398     sconn->retry_timeout = sconn->retry_timeout * SILC_SERVER_RETRY_MULTIPLIER;
399     if (sconn->retry_timeout > SILC_SERVER_RETRY_INTERVAL_MAX)
400       sconn->retry_timeout = SILC_SERVER_RETRY_INTERVAL_MAX;
401   } else {
402     sconn->retry_timeout = server->params->retry_interval_min;
403   }
404   sconn->retry_count++;
405   sconn->retry_timeout = sconn->retry_timeout +
406     silc_rng_get_rn32(server->rng) % SILC_SERVER_RETRY_RANDOMIZER;
407
408   /* If we've reached max retry count, give up. */
409   if (sconn->retry_count > server->params->retry_count && 
410       server->params->retry_keep_trying == FALSE) {
411     SILC_LOG_ERROR(("Could not connect to router, giving up"));
412     return;
413   }
414
415   /* Wait one before retrying */
416   silc_task_register(server->timeout_queue, fd, silc_server_connect_router,
417                      context, sconn->retry_timeout, 
418                      server->params->retry_interval_min_usec,
419                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
420 }
421
422 /* Generic routine to use connect to a router. */
423
424 SILC_TASK_CALLBACK(silc_server_connect_router)
425 {    
426   SilcServerConnection sconn = (SilcServerConnection)context;
427   SilcServer server = sconn->server;
428   SilcSocketConnection newsocket;
429   SilcProtocol protocol;
430   SilcServerKEInternalContext *proto_ctx;
431   int sock;
432
433   /* Connect to remote host */
434   sock = silc_net_create_connection(sconn->remote_port, 
435                                     sconn->remote_host);
436   if (sock < 0) {
437     SILC_LOG_ERROR(("Could not connect to router"));
438     silc_task_register(server->timeout_queue, fd, 
439                        silc_server_connect_to_router_retry,
440                        context, 0, 1, SILC_TASK_TIMEOUT, 
441                        SILC_TASK_PRI_NORMAL);
442     return;
443   }
444
445   /* Set socket options */
446   silc_net_set_socket_nonblock(sock);
447   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
448
449   /* Create socket connection for the connection. Even though we
450      know that we are connecting to a router we will mark the socket
451      to be unknown connection until we have executed authentication
452      protocol. */
453   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
454   server->sockets[sock] = newsocket;
455   newsocket->hostname = strdup(sconn->remote_host);
456   newsocket->port = sconn->remote_port;
457   sconn->sock = newsocket;
458
459   /* Allocate internal protocol context. This is sent as context
460      to the protocol. */
461   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
462   proto_ctx->server = (void *)server;
463   proto_ctx->context = (void *)sconn;
464   proto_ctx->sock = newsocket;
465   proto_ctx->rng = server->rng;
466   proto_ctx->responder = FALSE;
467       
468   /* Perform key exchange protocol. silc_server_connect_to_router_second
469      will be called after the protocol is finished. */
470   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
471                       &protocol, proto_ctx,
472                       silc_server_connect_to_router_second);
473   newsocket->protocol = protocol;
474       
475   /* Register a timeout task that will be executed if the protocol
476      is not executed within set limit. */
477   proto_ctx->timeout_task = 
478     silc_task_register(server->timeout_queue, sock, 
479                        silc_server_timeout_remote,
480                        server, server->params->protocol_timeout,
481                        server->params->protocol_timeout_usec,
482                        SILC_TASK_TIMEOUT,
483                        SILC_TASK_PRI_LOW);
484
485   /* Register the connection for network input and output. This sets
486      that scheduler will listen for incoming packets for this connection 
487      and sets that outgoing packets may be sent to this connection as 
488      well. However, this doesn't set the scheduler for outgoing traffic,
489      it will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
490      later when outgoing data is available. */
491   context = (void *)server;
492   SILC_REGISTER_CONNECTION_FOR_IO(sock);
493   
494   /* Run the protocol */
495   protocol->execute(server->timeout_queue, 0, protocol, sock, 0, 0);
496 }
497   
498 /* This function connects to our primary router or if we are a router this
499    establishes all our primary routes. This is called at the start of the
500    server to do authentication and key exchange with our router - called
501    from schedule. */
502
503 SILC_TASK_CALLBACK(silc_server_connect_to_router)
504 {
505   SilcServer server = (SilcServer)context;
506   SilcServerConnection sconn;
507
508   SILC_LOG_DEBUG(("Connecting to router(s)"));
509
510   /* If we are normal SILC server we need to connect to our cell's
511      router. */
512   if (server->server_type == SILC_SERVER) {
513     SILC_LOG_DEBUG(("We are normal server"));
514
515     /* Create connection to the router, if configured. */
516     if (server->config->routers) {
517
518       /* Allocate connection object for hold connection specific stuff. */
519       sconn = silc_calloc(1, sizeof(*sconn));
520       sconn->server = server;
521       sconn->remote_host = server->config->routers->host;
522       sconn->remote_port = server->config->routers->port;
523
524       silc_task_register(server->timeout_queue, fd, 
525                          silc_server_connect_router,
526                          (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
527                          SILC_TASK_PRI_NORMAL);
528       return;
529     }
530   }
531
532   /* If we are a SILC router we need to establish all of our primary
533      routes. */
534   if (server->server_type == SILC_ROUTER) {
535     SilcConfigServerSectionServerConnection *ptr;
536
537     SILC_LOG_DEBUG(("We are router"));
538
539     /* Create the connections to all our routes */
540     ptr = server->config->routers;
541     while (ptr) {
542
543       SILC_LOG_DEBUG(("Router connection [%s] %s:%d",
544                       ptr->initiator ? "Initiator" : "Responder",
545                       ptr->host, ptr->port));
546
547       if (ptr->initiator) {
548         /* Allocate connection object for hold connection specific stuff. */
549         sconn = silc_calloc(1, sizeof(*sconn));
550         sconn->server = server;
551         sconn->remote_host = ptr->host;
552         sconn->remote_port = ptr->port;
553
554         silc_task_register(server->timeout_queue, fd, 
555                            silc_server_connect_router,
556                            (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
557                            SILC_TASK_PRI_NORMAL);
558       }
559
560       if (!ptr->next)
561         return;
562
563       ptr = ptr->next;
564     }
565   }
566
567   SILC_LOG_DEBUG(("No router(s), server will be standalone"));
568   
569   /* There wasn't a configured router, we will continue but we don't
570      have a connection to outside world.  We will be standalone server. */
571   server->standalone = TRUE;
572 }
573
574 /* Second part of connecting to router(s). Key exchange protocol has been
575    executed and now we will execute authentication protocol. */
576
577 SILC_TASK_CALLBACK(silc_server_connect_to_router_second)
578 {
579   SilcProtocol protocol = (SilcProtocol)context;
580   SilcServerKEInternalContext *ctx = 
581     (SilcServerKEInternalContext *)protocol->context;
582   SilcServer server = (SilcServer)ctx->server;
583   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
584   SilcSocketConnection sock = NULL;
585   SilcServerConnAuthInternalContext *proto_ctx;
586
587   SILC_LOG_DEBUG(("Start"));
588
589   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
590     /* Error occured during protocol */
591     silc_protocol_free(protocol);
592     if (ctx->packet)
593       silc_packet_context_free(ctx->packet);
594     if (ctx->ske)
595       silc_ske_free(ctx->ske);
596     if (ctx->dest_id)
597       silc_free(ctx->dest_id);
598     silc_free(ctx);
599     sock->protocol = NULL;
600     silc_server_disconnect_remote(server, sock, "Server closed connection: "
601                                   "Key exchange failed");
602     return;
603   }
604   
605   /* Allocate internal context for the authentication protocol. This
606      is sent as context for the protocol. */
607   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
608   proto_ctx->server = (void *)server;
609   proto_ctx->context = (void *)sconn;
610   proto_ctx->sock = sock = server->sockets[fd];
611   proto_ctx->ske = ctx->ske;       /* Save SKE object from previous protocol */
612   proto_ctx->dest_id_type = ctx->dest_id_type;
613   proto_ctx->dest_id = ctx->dest_id;
614
615   /* Resolve the authentication method used in this connection */
616   proto_ctx->auth_meth = SILC_PROTOCOL_CONN_AUTH_PASSWORD;
617   if (server->config->routers) {
618     SilcConfigServerSectionServerConnection *conn = NULL;
619
620     /* Check if we find a match from user configured connections */
621     conn = silc_config_server_find_router_conn(server->config,
622                                                sock->hostname,
623                                                sock->port);
624     if (conn) {
625       /* Match found. Use the configured authentication method */
626       proto_ctx->auth_meth = conn->auth_meth;
627       if (conn->auth_data) {
628         proto_ctx->auth_data = strdup(conn->auth_data);
629         proto_ctx->auth_data_len = strlen(conn->auth_data);
630       }
631     } else {
632       /* No match found. */
633       /* XXX */
634     }
635   } else {
636     /* XXX */
637   }
638
639   /* Free old protocol as it is finished now */
640   silc_protocol_free(protocol);
641   if (ctx->packet)
642     silc_packet_context_free(ctx->packet);
643   silc_free(ctx);
644   sock->protocol = NULL;
645
646   /* Allocate the authentication protocol. This is allocated here
647      but we won't start it yet. We will be receiving party of this
648      protocol thus we will wait that connecting party will make
649      their first move. */
650   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
651                       &sock->protocol, proto_ctx, 
652                       silc_server_connect_to_router_final);
653
654   /* Register timeout task. If the protocol is not executed inside
655      this timelimit the connection will be terminated. Currently
656      this is 15 seconds and is hard coded limit (XXX). */
657   proto_ctx->timeout_task = 
658     silc_task_register(server->timeout_queue, sock->sock, 
659                        silc_server_timeout_remote,
660                        (void *)server, 15, 0,
661                        SILC_TASK_TIMEOUT,
662                        SILC_TASK_PRI_LOW);
663
664   /* Run the protocol */
665   sock->protocol->execute(server->timeout_queue, 0, 
666                           sock->protocol, sock->sock, 0, 0);
667 }
668
669 /* Finalizes the connection to router. Registers a server task to the
670    queue so that we can accept new connections. */
671
672 SILC_TASK_CALLBACK(silc_server_connect_to_router_final)
673 {
674   SilcProtocol protocol = (SilcProtocol)context;
675   SilcServerConnAuthInternalContext *ctx = 
676     (SilcServerConnAuthInternalContext *)protocol->context;
677   SilcServer server = (SilcServer)ctx->server;
678   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
679   SilcSocketConnection sock = ctx->sock;
680   SilcServerEntry id_entry;
681   SilcBuffer packet;
682   unsigned char *id_string;
683
684   SILC_LOG_DEBUG(("Start"));
685
686   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
687     /* Error occured during protocol */
688     if (ctx->dest_id)
689       silc_free(ctx->dest_id);
690     silc_server_disconnect_remote(server, sock, "Server closed connection: "
691                                   "Authentication failed");
692     goto out;
693   }
694
695   /* Add a task to the queue. This task receives new connections to the 
696      server. This task remains on the queue until the end of the program. */
697   if (!server->listenning) {
698     silc_task_register(server->io_queue, server->sock, 
699                        silc_server_accept_new_connection,
700                        (void *)server, 0, 0, 
701                        SILC_TASK_FD,
702                        SILC_TASK_PRI_NORMAL);
703     server->listenning = TRUE;
704   }
705
706   /* Send NEW_SERVER packet to the router. We will become registered
707      to the SILC network after sending this packet. */
708   id_string = silc_id_id2str(server->id, SILC_ID_SERVER);
709   packet = silc_buffer_alloc(2 + 2 + SILC_ID_SERVER_LEN + 
710                              strlen(server->server_name));
711   silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
712   silc_buffer_format(packet,
713                      SILC_STR_UI_SHORT(SILC_ID_SERVER_LEN),
714                      SILC_STR_UI_XNSTRING(id_string, SILC_ID_SERVER_LEN),
715                      SILC_STR_UI_SHORT(strlen(server->server_name)),
716                      SILC_STR_UI_XNSTRING(server->server_name,
717                                           strlen(server->server_name)),
718                      SILC_STR_END);
719
720   /* Send the packet */
721   silc_server_packet_send(server, ctx->sock, SILC_PACKET_NEW_SERVER, 0,
722                           packet->data, packet->len, TRUE);
723   silc_buffer_free(packet);
724   silc_free(id_string);
725
726   SILC_LOG_DEBUG(("Connected to router %s", sock->hostname));
727
728   /* Add the connected router to local server list */
729   server->standalone = FALSE;
730   id_entry = silc_idlist_add_server(server->local_list, sock->hostname,
731                                     SILC_ROUTER, ctx->dest_id, NULL, sock);
732   if (!id_entry) {
733     if (ctx->dest_id)
734       silc_free(ctx->dest_id);
735     silc_server_disconnect_remote(server, sock, "Server closed connection: "
736                                   "Authentication failed");
737     goto out;
738   }
739
740   silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
741   silc_free(sock->user_data);
742   sock->user_data = (void *)id_entry;
743   sock->type = SILC_SOCKET_TYPE_ROUTER;
744   server->id_entry->router = id_entry;
745   server->router = id_entry;
746   server->router->data.registered = TRUE;
747
748  out:
749   /* Free the temporary connection data context */
750   if (sconn)
751     silc_free(sconn);
752
753   /* Free the protocol object */
754   silc_protocol_free(protocol);
755   if (ctx->packet)
756     silc_packet_context_free(ctx->packet);
757   if (ctx->ske)
758     silc_ske_free(ctx->ske);
759   silc_free(ctx);
760   sock->protocol = NULL;
761 }
762
763 /* Accepts new connections to the server. Accepting new connections are
764    done in three parts to make it async. */
765
766 SILC_TASK_CALLBACK(silc_server_accept_new_connection)
767 {
768   SilcServer server = (SilcServer)context;
769   SilcSocketConnection newsocket;
770   SilcServerKEInternalContext *proto_ctx;
771   int sock;
772
773   SILC_LOG_DEBUG(("Accepting new connection"));
774
775   server->stat.conn_attempts++;
776
777   sock = silc_net_accept_connection(server->sock);
778   if (sock < 0) {
779     SILC_LOG_ERROR(("Could not accept new connection: %s", strerror(errno)));
780     server->stat.conn_failures++;
781     return;
782   }
783
784   /* Check max connections */
785   if (sock > SILC_SERVER_MAX_CONNECTIONS) {
786     if (server->config->redirect) {
787       /* XXX Redirecting connection to somewhere else now?? */
788       /*silc_server_send_notify("Server is full, trying to redirect..."); */
789     } else {
790       SILC_LOG_ERROR(("Refusing connection, server is full"));
791       server->stat.conn_failures++;
792     }
793     return;
794   }
795
796   /* Set socket options */
797   silc_net_set_socket_nonblock(sock);
798   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
799
800   /* We don't create a ID yet, since we don't know what type of connection
801      this is yet. But, we do add the connection to the socket table. */
802   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
803   server->sockets[sock] = newsocket;
804
805   /* XXX This MUST be done async as this will block the entire server
806      process. Either we have to do our own resolver stuff or in the future
807      we can use threads. */
808   /* Perform name and address lookups for the remote host. */
809   silc_net_check_host_by_sock(sock, &newsocket->hostname, &newsocket->ip);
810   if ((server->params->require_reverse_mapping && !newsocket->hostname) ||
811       !newsocket->ip) {
812     SILC_LOG_ERROR(("IP/DNS lookup failed"));
813     server->stat.conn_failures++;
814     return;
815   }
816   if (!newsocket->hostname)
817     newsocket->hostname = strdup(newsocket->ip);
818
819   SILC_LOG_INFO(("Incoming connection from %s (%s)", newsocket->hostname,
820                  newsocket->ip));
821
822   /* Allocate internal context for key exchange protocol. This is
823      sent as context for the protocol. */
824   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
825   proto_ctx->server = context;
826   proto_ctx->sock = newsocket;
827   proto_ctx->rng = server->rng;
828   proto_ctx->responder = TRUE;
829
830   /* Prepare the connection for key exchange protocol. We allocate the
831      protocol but will not start it yet. The connector will be the
832      initiator of the protocol thus we will wait for initiation from 
833      there before we start the protocol. */
834   server->stat.auth_attempts++;
835   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
836                       &newsocket->protocol, proto_ctx, 
837                       silc_server_accept_new_connection_second);
838
839   /* Register a timeout task that will be executed if the connector
840      will not start the key exchange protocol within 60 seconds. For
841      now, this is a hard coded limit. After 60 secs the connection will
842      be closed if the key exchange protocol has not been started. */
843   proto_ctx->timeout_task = 
844     silc_task_register(server->timeout_queue, newsocket->sock, 
845                        silc_server_timeout_remote,
846                        context, 60, 0,
847                        SILC_TASK_TIMEOUT,
848                        SILC_TASK_PRI_LOW);
849
850   /* Register the connection for network input and output. This sets
851      that scheduler will listen for incoming packets for this connection 
852      and sets that outgoing packets may be sent to this connection as well.
853      However, this doesn't set the scheduler for outgoing traffic, it
854      will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
855      later when outgoing data is available. */
856   SILC_REGISTER_CONNECTION_FOR_IO(sock);
857 }
858
859 /* Second part of accepting new connection. Key exchange protocol has been
860    performed and now it is time to do little connection authentication
861    protocol to figure out whether this connection is client or server
862    and whether it has right to access this server (especially server
863    connections needs to be authenticated). */
864
865 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second)
866 {
867   SilcProtocol protocol = (SilcProtocol)context;
868   SilcServerKEInternalContext *ctx = 
869     (SilcServerKEInternalContext *)protocol->context;
870   SilcServer server = (SilcServer)ctx->server;
871   SilcSocketConnection sock = NULL;
872   SilcServerConnAuthInternalContext *proto_ctx;
873
874   SILC_LOG_DEBUG(("Start"));
875
876   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
877     /* Error occured during protocol */
878     silc_protocol_free(protocol);
879     if (ctx->packet)
880       silc_packet_context_free(ctx->packet);
881     if (ctx->ske)
882       silc_ske_free(ctx->ske);
883     if (ctx->dest_id)
884       silc_free(ctx->dest_id);
885     silc_free(ctx);
886     if (sock)
887       sock->protocol = NULL;
888     silc_server_disconnect_remote(server, sock, "Server closed connection: "
889                                   "Key exchange failed");
890     server->stat.auth_failures++;
891     return;
892   }
893
894   /* Allocate internal context for the authentication protocol. This
895      is sent as context for the protocol. */
896   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
897   proto_ctx->server = (void *)server;
898   proto_ctx->sock = sock = server->sockets[fd];
899   proto_ctx->ske = ctx->ske;    /* Save SKE object from previous protocol */
900   proto_ctx->responder = TRUE;
901   proto_ctx->dest_id_type = ctx->dest_id_type;
902   proto_ctx->dest_id = ctx->dest_id;
903
904   /* Free old protocol as it is finished now */
905   silc_protocol_free(protocol);
906   if (ctx->packet)
907     silc_packet_context_free(ctx->packet);
908   silc_free(ctx);
909   sock->protocol = NULL;
910
911   /* Allocate the authentication protocol. This is allocated here
912      but we won't start it yet. We will be receiving party of this
913      protocol thus we will wait that connecting party will make
914      their first move. */
915   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
916                       &sock->protocol, proto_ctx, 
917                       silc_server_accept_new_connection_final);
918
919   /* Register timeout task. If the protocol is not executed inside
920      this timelimit the connection will be terminated. Currently
921      this is 60 seconds and is hard coded limit (XXX). */
922   proto_ctx->timeout_task = 
923     silc_task_register(server->timeout_queue, sock->sock, 
924                        silc_server_timeout_remote,
925                        (void *)server, 60, 0,
926                        SILC_TASK_TIMEOUT,
927                        SILC_TASK_PRI_LOW);
928 }
929
930 /* Final part of accepting new connection. The connection has now
931    been authenticated and keys has been exchanged. We also know whether
932    this is client or server connection. */
933
934 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final)
935 {
936   SilcProtocol protocol = (SilcProtocol)context;
937   SilcServerConnAuthInternalContext *ctx = 
938     (SilcServerConnAuthInternalContext *)protocol->context;
939   SilcServer server = (SilcServer)ctx->server;
940   SilcSocketConnection sock = ctx->sock;
941   void *id_entry = NULL;
942
943   SILC_LOG_DEBUG(("Start"));
944
945   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
946     /* Error occured during protocol */
947     silc_protocol_free(protocol);
948     if (ctx->packet)
949       silc_packet_context_free(ctx->packet);
950     if (ctx->ske)
951       silc_ske_free(ctx->ske);
952     if (ctx->dest_id)
953       silc_free(ctx->dest_id);
954     silc_free(ctx);
955     if (sock)
956       sock->protocol = NULL;
957     silc_server_disconnect_remote(server, sock, "Server closed connection: "
958                                   "Authentication failed");
959     server->stat.auth_failures++;
960     return;
961   }
962
963   sock->type = ctx->conn_type;
964   switch(sock->type) {
965   case SILC_SOCKET_TYPE_CLIENT:
966     {
967       SilcClientEntry client;
968
969       SILC_LOG_DEBUG(("Remote host is client"));
970       SILC_LOG_INFO(("Connection from %s (%s) is client", sock->hostname,
971                      sock->ip));
972
973       /* Add the client to the client ID cache. The nickname and Client ID
974          and other information is created after we have received NEW_CLIENT
975          packet from client. */
976       client = silc_idlist_add_client(server->local_list, 
977                                       NULL, NULL, NULL, NULL, NULL, sock);
978       if (!client) {
979         SILC_LOG_ERROR(("Could not add new client to cache"));
980         silc_free(sock->user_data);
981         break;
982       }
983
984       /* Statistics */
985       server->stat.my_clients++;
986       server->stat.clients++;
987       if (server->server_type == SILC_ROUTER)
988         server->stat.cell_clients++;
989
990       id_entry = (void *)client;
991       break;
992     }
993   case SILC_SOCKET_TYPE_SERVER:
994   case SILC_SOCKET_TYPE_ROUTER:
995     {
996       SilcServerEntry new_server;
997
998       SILC_LOG_DEBUG(("Remote host is %s", 
999                       sock->type == SILC_SOCKET_TYPE_SERVER ? 
1000                       "server" : "router"));
1001       SILC_LOG_INFO(("Connection from %s (%s) is %s", sock->hostname,
1002                      sock->ip, sock->type == SILC_SOCKET_TYPE_SERVER ? 
1003                      "server" : "router"));
1004
1005       /* Add the server into server cache. The server name and Server ID
1006          is updated after we have received NEW_SERVER packet from the
1007          server. We mark ourselves as router for this server if we really
1008          are router. */
1009       new_server = 
1010         silc_idlist_add_server(server->local_list, NULL,
1011                                sock->type == SILC_SOCKET_TYPE_SERVER ?
1012                                SILC_SERVER : SILC_ROUTER, NULL, 
1013                                sock->type == SILC_SOCKET_TYPE_SERVER ?
1014                                server->id_entry : NULL, sock);
1015       if (!new_server) {
1016         SILC_LOG_ERROR(("Could not add new server to cache"));
1017         silc_free(sock->user_data);
1018         break;
1019       }
1020
1021       /* Statistics */
1022       if (sock->type == SILC_SOCKET_TYPE_SERVER)
1023         server->stat.my_servers++;
1024       else
1025         server->stat.my_routers++;
1026       server->stat.servers++;
1027
1028       id_entry = (void *)new_server;
1029       
1030       /* There is connection to other server now, if it is router then
1031          we will have connection to outside world.  If we are router but
1032          normal server connected to us then we will remain standalone,
1033          if we are standlone. */
1034       if (server->standalone && sock->type == SILC_SOCKET_TYPE_ROUTER) {
1035         SILC_LOG_DEBUG(("We are not standalone server anymore"));
1036         server->standalone = FALSE;
1037         if (!server->id_entry->router) {
1038           server->id_entry->router = id_entry;
1039           server->router = id_entry;
1040         }
1041       }
1042       break;
1043     }
1044   default:
1045     break;
1046   }
1047
1048   /* Add the common data structure to the ID entry. */
1049   if (id_entry)
1050     silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
1051       
1052   /* Add to sockets internal pointer for fast referencing */
1053   silc_free(sock->user_data);
1054   sock->user_data = id_entry;
1055
1056   /* Connection has been fully established now. Everything is ok. */
1057   SILC_LOG_DEBUG(("New connection authenticated"));
1058
1059   silc_protocol_free(protocol);
1060   if (ctx->packet)
1061     silc_packet_context_free(ctx->packet);
1062   if (ctx->ske)
1063     silc_ske_free(ctx->ske);
1064   if (ctx->dest_id)
1065     silc_free(ctx->dest_id);
1066   silc_free(ctx);
1067   sock->protocol = NULL;
1068 }
1069
1070 /* This function is used to read packets from network and send packets to
1071    network. This is usually a generic task. */
1072
1073 SILC_TASK_CALLBACK(silc_server_packet_process)
1074 {
1075   SilcServer server = (SilcServer)context;
1076   SilcSocketConnection sock = server->sockets[fd];
1077   SilcIDListData idata;
1078   SilcCipher cipher = NULL;
1079   SilcHmac hmac = NULL;
1080   int ret;
1081
1082   if (!sock)
1083     return;
1084
1085   SILC_LOG_DEBUG(("Processing packet"));
1086
1087   /* Packet sending */
1088
1089   if (type == SILC_TASK_WRITE) {
1090     server->stat.packets_sent++;
1091
1092     if (sock->outbuf->data - sock->outbuf->head)
1093       silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
1094
1095     ret = silc_server_packet_send_real(server, sock, TRUE);
1096
1097     /* If returned -2 could not write to connection now, will do
1098        it later. */
1099     if (ret == -2)
1100       return;
1101
1102     if (ret == -1)
1103       return;
1104     
1105     /* The packet has been sent and now it is time to set the connection
1106        back to only for input. When there is again some outgoing data 
1107        available for this connection it will be set for output as well. 
1108        This call clears the output setting and sets it only for input. */
1109     SILC_SET_CONNECTION_FOR_INPUT(fd);
1110     SILC_UNSET_OUTBUF_PENDING(sock);
1111
1112     silc_buffer_clear(sock->outbuf);
1113     return;
1114   }
1115
1116   /* Packet receiving */
1117
1118   /* Read some data from connection */
1119   ret = silc_packet_receive(sock);
1120   if (ret < 0)
1121     return;
1122     
1123   /* EOF */
1124   if (ret == 0) {
1125     SILC_LOG_DEBUG(("Read EOF"));
1126       
1127     /* If connection is disconnecting already we will finally
1128        close the connection */
1129     if (SILC_IS_DISCONNECTING(sock)) {
1130       if (sock->user_data)
1131         silc_server_free_sock_user_data(server, sock);
1132       silc_server_close_connection(server, sock);
1133       return;
1134     }
1135       
1136     SILC_LOG_DEBUG(("Premature EOF from connection %d", sock->sock));
1137
1138     /* If the closed connection was our primary router connection the
1139        start re-connecting phase. */
1140     if (!server->standalone && server->server_type == SILC_SERVER && 
1141         sock == server->router->connection)
1142       silc_task_register(server->timeout_queue, 0, 
1143                          silc_server_connect_to_router,
1144                          context, 0, 500000,
1145                          SILC_TASK_TIMEOUT,
1146                          SILC_TASK_PRI_NORMAL);
1147
1148     if (sock->user_data)
1149       silc_server_free_sock_user_data(server, sock);
1150     silc_server_close_connection(server, sock);
1151     return;
1152   }
1153
1154   /* If connection is disconnecting or disconnected we will ignore
1155      what we read. */
1156   if (SILC_IS_DISCONNECTING(sock) || SILC_IS_DISCONNECTED(sock)) {
1157     SILC_LOG_DEBUG(("Ignoring read data from invalid connection"));
1158     return;
1159   }
1160
1161   server->stat.packets_received++;
1162
1163   /* Get keys and stuff from ID entry */
1164   idata = (SilcIDListData)sock->user_data;
1165   if (idata) {
1166     idata->last_receive = time(NULL);
1167     cipher = idata->receive_key;
1168     hmac = idata->hmac;
1169   }
1170  
1171   /* Process the packet. This will call the parser that will then
1172      decrypt and parse the packet. */
1173   silc_packet_receive_process(sock, cipher, hmac, silc_server_packet_parse, 
1174                               server);
1175 }
1176
1177 /* Parses whole packet, received earlier. */
1178
1179 SILC_TASK_CALLBACK(silc_server_packet_parse_real)
1180 {
1181   SilcPacketParserContext *parse_ctx = (SilcPacketParserContext *)context;
1182   SilcServer server = (SilcServer)parse_ctx->context;
1183   SilcSocketConnection sock = parse_ctx->sock;
1184   SilcPacketContext *packet = parse_ctx->packet;
1185   int ret;
1186
1187   SILC_LOG_DEBUG(("Start"));
1188
1189   /* Decrypt the received packet */
1190   ret = silc_packet_decrypt(parse_ctx->cipher, parse_ctx->hmac, 
1191                             packet->buffer, packet);
1192   if (ret < 0)
1193     goto out;
1194
1195   if (ret == 0) {
1196     /* Parse the packet. Packet type is returned. */
1197     ret = silc_packet_parse(packet);
1198   } else {
1199     /* Parse the packet header in special way as this is "special"
1200        packet type. */
1201     ret = silc_packet_parse_special(packet);
1202   }
1203
1204   if (ret == SILC_PACKET_NONE)
1205     goto out;
1206
1207   if (server->server_type == SILC_ROUTER) {
1208     /* Route the packet if it is not destined to us. Other ID types but
1209        server are handled separately after processing them. */
1210     if (packet->dst_id_type == SILC_ID_SERVER && 
1211         sock->type != SILC_SOCKET_TYPE_CLIENT &&
1212         SILC_ID_SERVER_COMPARE(packet->dst_id, server->id_string)) {
1213       
1214       /* Route the packet to fastest route for the destination ID */
1215       void *id = silc_id_str2id(packet->dst_id, packet->dst_id_len, 
1216                                 packet->dst_id_type);
1217       if (!id)
1218         goto out;
1219       silc_server_packet_route(server,
1220                                silc_server_route_get(server, id,
1221                                                      packet->dst_id_type),
1222                                packet);
1223       silc_free(id);
1224       goto out;
1225     }
1226     
1227     /* Broadcast packet if it is marked as broadcast packet and it is
1228        originated from router and we are router. */
1229     if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
1230         packet->flags & SILC_PACKET_FLAG_BROADCAST) {
1231       silc_server_packet_broadcast(server, server->router->connection, packet);
1232     }
1233   }
1234
1235   /* Parse the incoming packet type */
1236   silc_server_packet_parse_type(server, sock, packet);
1237
1238  out:
1239   silc_buffer_clear(sock->inbuf);
1240   silc_packet_context_free(packet);
1241   silc_free(parse_ctx);
1242 }
1243
1244 /* Parser callback called by silc_packet_receive_process. This merely
1245    registers timeout that will handle the actual parsing when appropriate. */
1246
1247 void silc_server_packet_parse(SilcPacketParserContext *parser_context)
1248 {
1249   SilcServer server = (SilcServer)parser_context->context;
1250   SilcSocketConnection sock = parser_context->sock;
1251
1252   switch (sock->type) {
1253   case SILC_SOCKET_TYPE_CLIENT:
1254   case SILC_SOCKET_TYPE_UNKNOWN:
1255     /* Parse the packet with timeout */
1256     silc_task_register(server->timeout_queue, sock->sock,
1257                        silc_server_packet_parse_real,
1258                        (void *)parser_context, 0, 100000,
1259                        SILC_TASK_TIMEOUT,
1260                        SILC_TASK_PRI_NORMAL);
1261     break;
1262   case SILC_SOCKET_TYPE_SERVER:
1263   case SILC_SOCKET_TYPE_ROUTER:
1264     /* Packets from servers are parsed as soon as possible */
1265     silc_task_register(server->timeout_queue, sock->sock,
1266                        silc_server_packet_parse_real,
1267                        (void *)parser_context, 0, 1,
1268                        SILC_TASK_TIMEOUT,
1269                        SILC_TASK_PRI_NORMAL);
1270     break;
1271   default:
1272     return;
1273   }
1274 }
1275
1276 /* Parses the packet type and calls what ever routines the packet type
1277    requires. This is done for all incoming packets. */
1278
1279 void silc_server_packet_parse_type(SilcServer server, 
1280                                    SilcSocketConnection sock,
1281                                    SilcPacketContext *packet)
1282 {
1283   SilcPacketType type = packet->type;
1284
1285   SILC_LOG_DEBUG(("Parsing packet type %d", type));
1286
1287   /* Parse the packet type */
1288   switch(type) {
1289   case SILC_PACKET_DISCONNECT:
1290     SILC_LOG_DEBUG(("Disconnect packet"));
1291     break;
1292
1293   case SILC_PACKET_SUCCESS:
1294     /*
1295      * Success received for something. For now we can have only
1296      * one protocol for connection executing at once hence this
1297      * success message is for whatever protocol is executing currently.
1298      */
1299     SILC_LOG_DEBUG(("Success packet"));
1300     if (sock->protocol) {
1301       sock->protocol->execute(server->timeout_queue, 0,
1302                               sock->protocol, sock->sock, 0, 0);
1303     }
1304     break;
1305
1306   case SILC_PACKET_FAILURE:
1307     /*
1308      * Failure received for something. For now we can have only
1309      * one protocol for connection executing at once hence this
1310      * failure message is for whatever protocol is executing currently.
1311      */
1312     SILC_LOG_DEBUG(("Failure packet"));
1313     if (sock->protocol) {
1314       /* XXX Audit the failure type */
1315       sock->protocol->state = SILC_PROTOCOL_STATE_FAILURE;
1316       sock->protocol->execute(server->timeout_queue, 0,
1317                               sock->protocol, sock->sock, 0, 0);
1318     }
1319     break;
1320
1321   case SILC_PACKET_REJECT:
1322     SILC_LOG_DEBUG(("Reject packet"));
1323     return;
1324     break;
1325
1326   case SILC_PACKET_NOTIFY:
1327     /*
1328      * Received notify packet. Server can receive notify packets from
1329      * router. Server then relays the notify messages to clients if needed.
1330      */
1331     SILC_LOG_DEBUG(("Notify packet"));
1332     silc_server_notify(server, sock, packet);
1333     break;
1334
1335     /* 
1336      * Channel packets
1337      */
1338   case SILC_PACKET_CHANNEL_MESSAGE:
1339     /*
1340      * Received channel message. Channel messages are special packets
1341      * (although probably most common ones) thus they are handled
1342      * specially.
1343      */
1344     SILC_LOG_DEBUG(("Channel Message packet"));
1345     silc_server_channel_message(server, sock, packet);
1346     break;
1347
1348   case SILC_PACKET_CHANNEL_KEY:
1349     /*
1350      * Received key for channel. As channels are created by the router
1351      * the keys are as well. We will distribute the key to all of our
1352      * locally connected clients on the particular channel. Router
1353      * never receives this channel and thus is ignored.
1354      */
1355     SILC_LOG_DEBUG(("Channel Key packet"));
1356     silc_server_channel_key(server, sock, packet);
1357     break;
1358
1359     /*
1360      * Command packets
1361      */
1362   case SILC_PACKET_COMMAND:
1363     /*
1364      * Recived command. Processes the command request and allocates the
1365      * command context and calls the command.
1366      */
1367     SILC_LOG_DEBUG(("Command packet"));
1368     silc_server_command_process(server, sock, packet);
1369     break;
1370
1371   case SILC_PACKET_COMMAND_REPLY:
1372     /*
1373      * Received command reply packet. Received command reply to command. It
1374      * may be reply to command sent by us or reply to command sent by client
1375      * that we've routed further.
1376      */
1377     SILC_LOG_DEBUG(("Command Reply packet"));
1378     silc_server_command_reply(server, sock, packet);
1379     break;
1380
1381     /*
1382      * Private Message packets
1383      */
1384   case SILC_PACKET_PRIVATE_MESSAGE:
1385     /*
1386      * Received private message packet. The packet is coming from either
1387      * client or server.
1388      */
1389     SILC_LOG_DEBUG(("Private Message packet"));
1390     silc_server_private_message(server, sock, packet);
1391     break;
1392
1393   case SILC_PACKET_PRIVATE_MESSAGE_KEY:
1394     /*
1395      * Private message key packet.
1396      */
1397     break;
1398
1399     /*
1400      * Key Exchange protocol packets
1401      */
1402   case SILC_PACKET_KEY_EXCHANGE:
1403     SILC_LOG_DEBUG(("KE packet"));
1404     if (sock->protocol && sock->protocol->protocol->type 
1405         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1406
1407       SilcServerKEInternalContext *proto_ctx = 
1408         (SilcServerKEInternalContext *)sock->protocol->context;
1409
1410       proto_ctx->packet = silc_packet_context_dup(packet);
1411
1412       /* Let the protocol handle the packet */
1413       sock->protocol->execute(server->timeout_queue, 0, 
1414                               sock->protocol, sock->sock, 0, 100000);
1415     } else {
1416       SILC_LOG_ERROR(("Received Key Exchange packet but no key exchange "
1417                       "protocol active, packet dropped."));
1418
1419       /* XXX Trigger KE protocol?? Rekey actually, maybe. */
1420     }
1421     break;
1422
1423   case SILC_PACKET_KEY_EXCHANGE_1:
1424     SILC_LOG_DEBUG(("KE 1 packet"));
1425     if (sock->protocol && sock->protocol->protocol->type 
1426         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1427
1428       SilcServerKEInternalContext *proto_ctx = 
1429         (SilcServerKEInternalContext *)sock->protocol->context;
1430
1431       if (proto_ctx->packet)
1432         silc_packet_context_free(proto_ctx->packet);
1433
1434       proto_ctx->packet = silc_packet_context_dup(packet);
1435       proto_ctx->dest_id_type = packet->src_id_type;
1436       proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1437                                           packet->src_id_type);
1438       if (!proto_ctx->dest_id)
1439         break;
1440
1441       /* Let the protocol handle the packet */
1442       sock->protocol->execute(server->timeout_queue, 0, 
1443                               sock->protocol, sock->sock,
1444                               0, 100000);
1445     } else {
1446       SILC_LOG_ERROR(("Received Key Exchange 1 packet but no key exchange "
1447                       "protocol active, packet dropped."));
1448     }
1449     break;
1450
1451   case SILC_PACKET_KEY_EXCHANGE_2:
1452     SILC_LOG_DEBUG(("KE 2 packet"));
1453     if (sock->protocol && sock->protocol->protocol->type 
1454         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1455
1456       SilcServerKEInternalContext *proto_ctx = 
1457         (SilcServerKEInternalContext *)sock->protocol->context;
1458
1459       if (proto_ctx->packet)
1460         silc_packet_context_free(proto_ctx->packet);
1461
1462       proto_ctx->packet = silc_packet_context_dup(packet);
1463       proto_ctx->dest_id_type = packet->src_id_type;
1464       proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1465                                           packet->src_id_type);
1466       if (!proto_ctx->dest_id)
1467         break;
1468
1469       /* Let the protocol handle the packet */
1470       sock->protocol->execute(server->timeout_queue, 0, 
1471                               sock->protocol, sock->sock,
1472                               0, 100000);
1473     } else {
1474       SILC_LOG_ERROR(("Received Key Exchange 2 packet but no key exchange "
1475                       "protocol active, packet dropped."));
1476     }
1477     break;
1478
1479   case SILC_PACKET_CONNECTION_AUTH_REQUEST:
1480     /*
1481      * Connection authentication request packet. When we receive this packet
1482      * we will send to the other end information about our mandatory
1483      * authentication method for the connection. This packet maybe received
1484      * at any time. 
1485      */
1486     SILC_LOG_DEBUG(("Connection authentication request packet"));
1487     break;
1488
1489     /*
1490      * Connection Authentication protocol packets
1491      */
1492   case SILC_PACKET_CONNECTION_AUTH:
1493     /* Start of the authentication protocol. We receive here the 
1494        authentication data and will verify it. */
1495     SILC_LOG_DEBUG(("Connection auth packet"));
1496     if (sock->protocol && sock->protocol->protocol->type 
1497         == SILC_PROTOCOL_SERVER_CONNECTION_AUTH) {
1498
1499       SilcServerConnAuthInternalContext *proto_ctx = 
1500         (SilcServerConnAuthInternalContext *)sock->protocol->context;
1501
1502       proto_ctx->packet = silc_packet_context_dup(packet);
1503
1504       /* Let the protocol handle the packet */
1505       sock->protocol->execute(server->timeout_queue, 0, 
1506                               sock->protocol, sock->sock, 0, 0);
1507     } else {
1508       SILC_LOG_ERROR(("Received Connection Auth packet but no authentication "
1509                       "protocol active, packet dropped."));
1510     }
1511     break;
1512
1513   case SILC_PACKET_NEW_ID:
1514     /*
1515      * Received New ID packet. This includes some new ID that has been
1516      * created. It may be for client, server or channel. This is the way
1517      * to distribute information about new registered entities in the
1518      * SILC network.
1519      */
1520     SILC_LOG_DEBUG(("New ID packet"));
1521     silc_server_new_id(server, sock, packet);
1522     break;
1523
1524   case SILC_PACKET_NEW_CLIENT:
1525     /*
1526      * Received new client packet. This includes client information that
1527      * we will use to create initial client ID. After creating new
1528      * ID we will send it to the client.
1529      */
1530     SILC_LOG_DEBUG(("New Client packet"));
1531     silc_server_new_client(server, sock, packet);
1532     break;
1533
1534   case SILC_PACKET_NEW_SERVER:
1535     /*
1536      * Received new server packet. This includes Server ID and some other
1537      * information that we may save. This is received after server has 
1538      * connected to us.
1539      */
1540     SILC_LOG_DEBUG(("New Server packet"));
1541     silc_server_new_server(server, sock, packet);
1542     break;
1543
1544   case SILC_PACKET_NEW_CHANNEL:
1545     /*
1546      * Received new channel packet. Information about new channel in the
1547      * network are distributed using this packet.
1548      */
1549     SILC_LOG_DEBUG(("New Channel packet"));
1550     silc_server_new_channel(server, sock, packet);
1551     break;
1552
1553   case SILC_PACKET_NEW_CHANNEL_USER:
1554     /*
1555      * Received new channel user packet. Information about new users on a
1556      * channel are distributed between routers using this packet.  The
1557      * router receiving this will redistribute it and also sent JOIN notify
1558      * to local clients on the same channel. Normal server sends JOIN notify
1559      * to its local clients on the channel.
1560      */
1561     SILC_LOG_DEBUG(("New Channel User packet"));
1562     silc_server_new_channel_user(server, sock, packet);
1563     break;
1564
1565   case SILC_PACKET_NEW_CHANNEL_LIST:
1566     /*
1567      * List of new channel packets received. This is usually received when
1568      * existing server or router connects to us and distributes information
1569      * of all channels it has.
1570      */
1571     break;
1572
1573   case SILC_PACKET_NEW_CHANNEL_USER_LIST:
1574     /*
1575      * List of new channel user packets received. This is usually received
1576      * when existing server or router connects to us and distributes 
1577      * information of all channel users it has.
1578      */
1579     break;
1580
1581   case SILC_PACKET_REPLACE_ID:
1582     /*
1583      * Received replace ID packet. This sends the old ID that is to be
1584      * replaced with the new one included into the packet. Client must not
1585      * send this packet.
1586      */
1587     SILC_LOG_DEBUG(("Replace ID packet"));
1588     silc_server_replace_id(server, sock, packet);
1589     break;
1590
1591   case SILC_PACKET_REMOVE_ID:
1592     /*
1593      * Received remove ID Packet. 
1594      */
1595     SILC_LOG_DEBUG(("Remove ID packet"));
1596     silc_server_remove_id(server, sock, packet);
1597     break;
1598
1599   case SILC_PACKET_REMOVE_CHANNEL_USER:
1600     /*
1601      * Received packet to remove user from a channel. Routers notify other
1602      * routers about a user leaving a channel.
1603      */
1604     SILC_LOG_DEBUG(("Remove Channel User packet"));
1605     silc_server_remove_channel_user(server, sock, packet);
1606     break;
1607
1608   case SILC_PACKET_SET_MODE:
1609     /*
1610      * Received packet to set the mode of channel or client's channel mode.
1611      */
1612     SILC_LOG_DEBUG(("Set Mode packet"));
1613     silc_server_set_mode(server, sock, packet);
1614     break;
1615
1616   default:
1617     SILC_LOG_ERROR(("Incorrect packet type %d, packet dropped", type));
1618     break;
1619   }
1620   
1621 }
1622
1623 /* Closes connection to socket connection */
1624
1625 void silc_server_close_connection(SilcServer server,
1626                                   SilcSocketConnection sock)
1627 {
1628   SILC_LOG_DEBUG(("Closing connection %d", sock->sock));
1629
1630   /* We won't listen for this connection anymore */
1631   silc_schedule_unset_listen_fd(sock->sock);
1632
1633   /* Unregister all tasks */
1634   silc_task_unregister_by_fd(server->io_queue, sock->sock);
1635   silc_task_unregister_by_fd(server->timeout_queue, sock->sock);
1636
1637   /* Close the actual connection */
1638   silc_net_close_connection(sock->sock);
1639   server->sockets[sock->sock] = NULL;
1640   silc_socket_free(sock);
1641 }
1642
1643 /* Sends disconnect message to remote connection and disconnects the 
1644    connection. */
1645
1646 void silc_server_disconnect_remote(SilcServer server,
1647                                    SilcSocketConnection sock,
1648                                    const char *fmt, ...)
1649 {
1650   va_list ap;
1651   unsigned char buf[4096];
1652
1653   if (!sock)
1654     return;
1655
1656   memset(buf, 0, sizeof(buf));
1657   va_start(ap, fmt);
1658   vsprintf(buf, fmt, ap);
1659   va_end(ap);
1660
1661   SILC_LOG_DEBUG(("Disconnecting remote host"));
1662
1663   /* Notify remote end that the conversation is over. The notify message
1664      is tried to be sent immediately. */
1665   silc_server_packet_send(server, sock, SILC_PACKET_DISCONNECT, 0,  
1666                           buf, strlen(buf), TRUE);
1667
1668   /* Mark the connection to be disconnected */
1669   SILC_SET_DISCONNECTED(sock);
1670   silc_server_close_connection(server, sock);
1671 }
1672
1673 /* Free's user_data pointer from socket connection object. This also sends
1674    appropriate notify packets to the network to inform about leaving
1675    entities. */
1676
1677 void silc_server_free_sock_user_data(SilcServer server, 
1678                                      SilcSocketConnection sock)
1679 {
1680   SILC_LOG_DEBUG(("Start"));
1681
1682   switch(sock->type) {
1683   case SILC_SOCKET_TYPE_CLIENT:
1684     {
1685       SilcClientEntry user_data = (SilcClientEntry)sock->user_data;
1686
1687       /* Remove client from all channels */
1688       silc_server_remove_from_channels(server, sock, user_data);
1689
1690       /* XXX must take some info to history before freeing */
1691
1692       /* Send REMOVE_ID packet to routers. */
1693       if (!server->standalone && server->router)
1694         silc_server_send_remove_id(server, server->router->connection,
1695                                    server->server_type == SILC_SERVER ?
1696                                    FALSE : TRUE, user_data->id, 
1697                                    SILC_ID_CLIENT_LEN, SILC_ID_CLIENT);
1698
1699       /* Free the client entry and everything in it */
1700       silc_idlist_del_data(user_data);
1701       silc_idlist_del_client(server->local_list, user_data);
1702       server->stat.my_clients--;
1703       server->stat.clients--;
1704       if (server->server_type == SILC_ROUTER)
1705         server->stat.cell_clients--;
1706       break;
1707     }
1708   case SILC_SOCKET_TYPE_SERVER:
1709   case SILC_SOCKET_TYPE_ROUTER:
1710     {
1711       SilcServerEntry user_data = (SilcServerEntry)sock->user_data;
1712
1713       /* Send REMOVE_ID packet to routers. */
1714       if (!server->standalone && server->router)
1715         silc_server_send_remove_id(server, server->router->connection,
1716                                    server->server_type == SILC_SERVER ?
1717                                    FALSE : TRUE, user_data->id, 
1718                                    SILC_ID_CLIENT_LEN, SILC_ID_CLIENT);
1719
1720       /* Free the server entry */
1721       silc_idlist_del_data(user_data);
1722       silc_idlist_del_server(server->local_list, user_data);
1723       server->stat.my_servers--;
1724       server->stat.servers--;
1725       if (server->server_type == SILC_ROUTER)
1726         server->stat.cell_servers--;
1727       break;
1728     }
1729   default:
1730     {
1731       SilcUnknownEntry user_data = (SilcUnknownEntry)sock->user_data;
1732
1733       silc_idlist_del_data(user_data);
1734       silc_free(user_data);
1735       break;
1736     }
1737   }
1738
1739   sock->user_data = NULL;
1740 }
1741
1742 /* Checks whether given channel has global users.  If it does this returns
1743    TRUE and FALSE if there is only locally connected clients on the channel. */
1744
1745 int silc_server_channel_has_global(SilcChannelEntry channel)
1746 {
1747   SilcChannelClientEntry chl;
1748
1749   silc_list_start(channel->user_list);
1750   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
1751     if (chl->client->router)
1752       return TRUE;
1753   }
1754
1755   return FALSE;
1756 }
1757
1758 /* Checks whether given channel has locally connected users.  If it does this
1759    returns TRUE and FALSE if there is not one locally connected client. */
1760
1761 int silc_server_channel_has_local(SilcChannelEntry channel)
1762 {
1763   SilcChannelClientEntry chl;
1764
1765   silc_list_start(channel->user_list);
1766   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
1767     if (!chl->client->router)
1768       return TRUE;
1769   }
1770
1771   return FALSE;
1772 }
1773
1774 /* Removes client from all channels it has joined. This is used when client
1775    connection is disconnected. If the client on a channel is last, the
1776    channel is removed as well. This sends the SIGNOFF notify types. */
1777
1778 void silc_server_remove_from_channels(SilcServer server, 
1779                                       SilcSocketConnection sock,
1780                                       SilcClientEntry client)
1781 {
1782   SilcChannelEntry channel;
1783   SilcChannelClientEntry chl;
1784   SilcBuffer chidp, clidp;
1785
1786   SILC_LOG_DEBUG(("Start"));
1787
1788   if (!client || !client->id)
1789     return;
1790
1791   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
1792
1793   /* Remove the client from all channels. The client is removed from
1794      the channels' user list. */
1795   silc_list_start(client->channels);
1796   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
1797     channel = chl->channel;
1798     chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
1799
1800     /* Remove from list */
1801     silc_list_del(client->channels, chl);
1802
1803     /* If this client is last one on the channel the channel
1804        is removed all together. */
1805     if (silc_list_count(channel->user_list) < 2) {
1806
1807       /* However, if the channel has marked global users then the 
1808          channel is not created locally, and this does not remove the
1809          channel globally from SILC network, in this case we will
1810          notify that this client has left the channel. */
1811       if (channel->global_users)
1812         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
1813                                            SILC_NOTIFY_TYPE_SIGNOFF, 1,
1814                                            clidp->data, clidp->len);
1815       
1816       silc_idlist_del_channel(server->local_list, channel);
1817       server->stat.my_channels--;
1818       continue;
1819     }
1820
1821     /* Remove from list */
1822     silc_list_del(channel->user_list, chl);
1823     silc_free(chl);
1824     server->stat.my_chanclients--;
1825
1826     /* Send notify to channel about client leaving SILC and thus
1827        the entire channel. */
1828     silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
1829                                        SILC_NOTIFY_TYPE_SIGNOFF, 1,
1830                                        clidp->data, clidp->len);
1831     silc_buffer_free(chidp);
1832   }
1833
1834   silc_buffer_free(clidp);
1835 }
1836
1837 /* Removes client from one channel. This is used for example when client
1838    calls LEAVE command to remove itself from the channel. Returns TRUE
1839    if channel still exists and FALSE if the channel is removed when
1840    last client leaves the channel. If `notify' is FALSE notify messages
1841    are not sent. */
1842
1843 int silc_server_remove_from_one_channel(SilcServer server, 
1844                                         SilcSocketConnection sock,
1845                                         SilcChannelEntry channel,
1846                                         SilcClientEntry client,
1847                                         int notify)
1848 {
1849   SilcChannelEntry ch;
1850   SilcChannelClientEntry chl;
1851   SilcBuffer clidp;
1852
1853   SILC_LOG_DEBUG(("Start"));
1854
1855   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
1856
1857   /* Remove the client from the channel. The client is removed from
1858      the channel's user list. */
1859   silc_list_start(client->channels);
1860   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
1861     if (chl->channel != channel)
1862       continue;
1863
1864     ch = chl->channel;
1865
1866     /* Remove from list */
1867     silc_list_del(client->channels, chl);
1868
1869     /* If this client is last one on the channel the channel
1870        is removed all together. */
1871     if (silc_list_count(channel->user_list) < 2) {
1872       /* Notify about leaving client if this channel has global users. */
1873       if (notify && channel->global_users)
1874         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
1875                                            SILC_NOTIFY_TYPE_LEAVE, 1,
1876                                            clidp->data, clidp->len);
1877       
1878       silc_idlist_del_channel(server->local_list, channel);
1879       silc_buffer_free(clidp);
1880       server->stat.my_channels--;
1881       return FALSE;
1882     }
1883
1884     /* Remove from list */
1885     silc_list_del(channel->user_list, chl);
1886     silc_free(chl);
1887     server->stat.my_chanclients--;
1888
1889     /* If there is no global users on the channel anymore mark the channel
1890        as local channel. */
1891     if (server->server_type == SILC_SERVER &&
1892         !silc_server_channel_has_global(channel))
1893       channel->global_users = FALSE;
1894
1895     /* If tehre is not at least one local user on the channel then we don't
1896        need the channel entry anymore, we can remove it safely. */
1897     if (server->server_type == SILC_SERVER &&
1898         !silc_server_channel_has_local(channel)) {
1899       silc_idlist_del_channel(server->local_list, channel);
1900       silc_buffer_free(clidp);
1901       server->stat.my_channels--;
1902       return FALSE;
1903     }
1904
1905     /* Send notify to channel about client leaving the channel */
1906     if (notify)
1907       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
1908                                          SILC_NOTIFY_TYPE_LEAVE, 1,
1909                                          clidp->data, clidp->len);
1910     break;
1911   }
1912
1913   silc_buffer_free(clidp);
1914   return TRUE;
1915 }
1916
1917 /* Returns TRUE if the given client is on the channel.  FALSE if not. 
1918    This works because we assure that the user list on the channel is
1919    always in up to date thus we can only check the channel list from 
1920    `client' which is faster than checking the user list from `channel'. */
1921
1922 int silc_server_client_on_channel(SilcClientEntry client,
1923                                   SilcChannelEntry channel)
1924 {
1925   SilcChannelClientEntry chl;
1926
1927   if (!client || !channel)
1928     return FALSE;
1929
1930   silc_list_start(client->channels);
1931   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END)
1932     if (chl->channel == channel)
1933       return TRUE;
1934
1935   return FALSE;
1936 }
1937
1938 /* Timeout callback. This is called if connection is idle or for some
1939    other reason is not responding within some period of time. This 
1940    disconnects the remote end. */
1941
1942 SILC_TASK_CALLBACK(silc_server_timeout_remote)
1943 {
1944   SilcServer server = (SilcServer)context;
1945   SilcSocketConnection sock = server->sockets[fd];
1946
1947   if (!sock)
1948     return;
1949
1950   if (sock->user_data)
1951     silc_server_free_sock_user_data(server, sock);
1952
1953   silc_server_disconnect_remote(server, sock, 
1954                                 "Server closed connection: "
1955                                 "Connection timeout");
1956 }
1957
1958 /* Creates new channel. Sends NEW_CHANNEL packet to primary route. This
1959    function may be used only by router. In real SILC network all channels
1960    are created by routers thus this function is never used by normal
1961    server. */
1962
1963 SilcChannelEntry silc_server_create_new_channel(SilcServer server, 
1964                                                 SilcServerID *router_id,
1965                                                 char *cipher, 
1966                                                 char *channel_name)
1967 {
1968   SilcChannelID *channel_id;
1969   SilcChannelEntry entry;
1970   SilcCipher key;
1971
1972   SILC_LOG_DEBUG(("Creating new channel"));
1973
1974   if (!cipher)
1975     cipher = "twofish";
1976
1977   /* Allocate cipher */
1978   silc_cipher_alloc(cipher, &key);
1979
1980   channel_name = strdup(channel_name);
1981
1982   /* Create the channel */
1983   silc_id_create_channel_id(router_id, server->rng, &channel_id);
1984   entry = silc_idlist_add_channel(server->local_list, channel_name, 
1985                                   SILC_CHANNEL_MODE_NONE, channel_id, 
1986                                   NULL, key);
1987   if (!entry) {
1988     silc_free(channel_name);
1989     return NULL;
1990   }
1991
1992   /* Now create the actual key material */
1993   silc_server_create_channel_key(server, entry, 16);
1994
1995   /* Notify other routers about the new channel. We send the packet
1996      to our primary route. */
1997   if (server->standalone == FALSE) {
1998     silc_server_send_new_channel(server, server->router->connection, TRUE, 
1999                                  channel_name, entry->id, SILC_ID_CHANNEL_LEN);
2000   }
2001
2002   server->stat.my_channels++;
2003
2004   return entry;
2005 }
2006
2007 /* Generates new channel key. This is used to create the initial channel key
2008    but also to re-generate new key for channel. If `key_len' is provided
2009    it is the bytes of the key length. */
2010
2011 void silc_server_create_channel_key(SilcServer server, 
2012                                     SilcChannelEntry channel,
2013                                     unsigned int key_len)
2014 {
2015   int i;
2016   unsigned char channel_key[32];
2017   unsigned int len;
2018
2019   if (!channel->channel_key)
2020     silc_cipher_alloc("twofish", &channel->channel_key);
2021
2022   if (key_len)
2023     len = key_len;
2024   else if (channel->key_len)
2025     len = channel->key_len / 8;
2026   else
2027     len = sizeof(channel_key);
2028
2029   /* Create channel key */
2030   for (i = 0; i < len; i++) channel_key[i] = silc_rng_get_byte(server->rng);
2031   
2032   /* Set the key */
2033   channel->channel_key->cipher->set_key(channel->channel_key->context, 
2034                                         channel_key, len);
2035
2036   /* Remove old key if exists */
2037   if (channel->key) {
2038     memset(channel->key, 0, channel->key_len / 8);
2039     silc_free(channel->key);
2040   }
2041
2042   /* Save the key */
2043   channel->key_len = len * 8;
2044   channel->key = silc_calloc(len, sizeof(*channel->key));
2045   memcpy(channel->key, channel_key, len);
2046   memset(channel_key, 0, sizeof(channel_key));
2047 }
2048
2049 /* Saves the channel key found in the encoded `key_payload' buffer. This 
2050    function is used when we receive Channel Key Payload and also when we're
2051    processing JOIN command reply. Returns entry to the channel. */
2052
2053 SilcChannelEntry silc_server_save_channel_key(SilcServer server,
2054                                               SilcBuffer key_payload,
2055                                               SilcChannelEntry channel)
2056 {
2057   SilcChannelKeyPayload payload = NULL;
2058   SilcChannelID *id = NULL;
2059   unsigned char *tmp;
2060   unsigned int tmp_len;
2061   char *cipher;
2062
2063   /* Decode channel key payload */
2064   payload = silc_channel_key_payload_parse(key_payload);
2065   if (!payload) {
2066     SILC_LOG_ERROR(("Bad channel key payload, dropped"));
2067     channel = NULL;
2068     goto out;
2069   }
2070
2071   /* Get the channel entry */
2072   if (!channel) {
2073
2074     /* Get channel ID */
2075     tmp = silc_channel_key_get_id(payload, &tmp_len);
2076     id = silc_id_str2id(tmp, tmp_len, SILC_ID_CHANNEL);
2077     if (!id) {
2078       channel = NULL;
2079       goto out;
2080     }
2081
2082     channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
2083     if (!channel) {
2084       SILC_LOG_ERROR(("Received key for non-existent channel"));
2085       goto out;
2086     }
2087   }
2088
2089   tmp = silc_channel_key_get_key(payload, &tmp_len);
2090   if (!tmp) {
2091     channel = NULL;
2092     goto out;
2093   }
2094
2095   cipher = silc_channel_key_get_cipher(payload, NULL);;
2096   if (!cipher) {
2097     channel = NULL;
2098     goto out;
2099   }
2100
2101   /* Remove old key if exists */
2102   if (channel->key) {
2103     memset(channel->key, 0, channel->key_len / 8);
2104     silc_free(channel->key);
2105     silc_cipher_free(channel->channel_key);
2106   }
2107
2108   /* Create new cipher */
2109   if (!silc_cipher_alloc(cipher, &channel->channel_key)) {
2110     channel = NULL;
2111     goto out;
2112   }
2113
2114   /* Save the key */
2115   channel->key_len = tmp_len * 8;
2116   channel->key = silc_calloc(tmp_len, sizeof(unsigned char));
2117   memcpy(channel->key, tmp, tmp_len);
2118   channel->channel_key->cipher->set_key(channel->channel_key->context, 
2119                                         tmp, tmp_len);
2120
2121  out:
2122   if (id)
2123     silc_free(id);
2124   if (payload)
2125     silc_channel_key_payload_free(payload);
2126
2127   return channel;
2128 }