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