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