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