07a071dd6522cd8c9160c03586c48f807273944b
[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   /* Remove the client from all channels. The client is removed from
2225      the channels' user list. */
2226   for (i = 0; i < client->channel_count; i++) {
2227     channel = client->channel[i];
2228     if (!channel)
2229       continue;
2230
2231     id_payload = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL_LEN,
2232                                         SILC_ID_CHANNEL);
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     silc_free(id_payload);
2281   }
2282
2283   if (client->channel_count)
2284     silc_free(client->channel);
2285   client->channel = NULL;
2286 }
2287
2288 /* Removes client from one channel. This is used for example when client
2289    calls LEAVE command to remove itself from the channel. Returns TRUE
2290    if channel still exists and FALSE if the channel is removed when
2291    last client leaves the channel. If `notify' is FALSE notify messages
2292    are not sent. */
2293
2294 int silc_server_remove_from_one_channel(SilcServer server, 
2295                                         SilcSocketConnection sock,
2296                                         SilcChannelEntry channel,
2297                                         SilcClientEntry client,
2298                                         int notify)
2299 {
2300   int i, k;
2301   SilcChannelEntry ch;
2302   SilcBuffer id_payload;
2303
2304   id_payload = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL_LEN,
2305                                       SILC_ID_CHANNEL);
2306
2307   /* Remove the client from the channel. The client is removed from
2308      the channel's user list. */
2309   for (i = 0; i < client->channel_count; i++) {
2310     ch = client->channel[i];
2311     if (!ch || ch != channel)
2312       continue;
2313
2314     /* XXX */
2315     client->channel[i] = NULL;
2316
2317     /* Remove from channel */
2318     for (k = 0; k < channel->user_list_count; k++) {
2319       if (channel->user_list[k].client == client) {
2320         
2321         /* If this client is last one on the channel the channel
2322            is removed all together. */
2323         if (channel->user_list_count == 1) {
2324           /* Notify about leaving client if this channel has global users,
2325              ie. the channel is not created locally. */
2326           if (notify && channel->global_users)
2327             silc_server_send_notify_to_channel(server, channel,
2328                                                SILC_NOTIFY_TYPE_LEAVE, 4,
2329                                                FALSE,
2330                                                "%s@%s has left channel %s",
2331                                                client->nickname,
2332                                                strlen(client->nickname),
2333                                                sock->hostname,
2334                                                strlen(sock->hostname),
2335                                                id_payload->data,
2336                                                id_payload->len,
2337                                                channel->channel_name,
2338                                                strlen(channel->channel_name));
2339
2340           silc_idlist_del_channel(server->local_list, channel);
2341           silc_buffer_free(id_payload);
2342           return FALSE;
2343         }
2344         
2345         channel->user_list[k].client = NULL;
2346         channel->user_list[k].mode = SILC_CHANNEL_UMODE_NONE;
2347
2348         /* Send notify to channel about client leaving the channel */
2349         if (notify)
2350           silc_server_send_notify_to_channel(server, channel,
2351                                              SILC_NOTIFY_TYPE_LEAVE, 4,
2352                                              FALSE,
2353                                              "%s@%s has left channel %s",
2354                                              client->nickname,
2355                                              strlen(client->nickname),
2356                                              sock->hostname,
2357                                              strlen(sock->hostname),
2358                                              id_payload->data,
2359                                              id_payload->len,
2360                                              channel->channel_name,
2361                                              strlen(channel->channel_name));
2362       }
2363     }
2364   }
2365
2366   silc_buffer_free(id_payload);
2367   return TRUE;
2368 }
2369
2370 /* Returns TRUE if the given client is on the channel.  FALSE if not. 
2371    This works because we assure that the user list on the channel is
2372    always in up to date thus we can only check the channel list from 
2373    `client' which is faster than checking the user list from `channel'. */
2374 /* XXX This really is utility function and should be in eg. serverutil.c */
2375
2376 int silc_server_client_on_channel(SilcClientEntry client,
2377                                   SilcChannelEntry channel)
2378 {
2379   int i;
2380
2381   if (!client || !channel)
2382     return FALSE;
2383
2384   for (i = 0; i < client->channel_count; i++) {
2385     if (client->channel[i] == channel)
2386       return TRUE;
2387   }
2388
2389   return FALSE;
2390 }
2391
2392 /* Timeout callback. This is called if connection is idle or for some
2393    other reason is not responding within some period of time. This 
2394    disconnects the remote end. */
2395
2396 SILC_TASK_CALLBACK(silc_server_timeout_remote)
2397 {
2398   SilcServer server = (SilcServer)context;
2399   SilcSocketConnection sock = server->sockets[fd];
2400
2401   silc_server_disconnect_remote(server, sock, 
2402                                 "Server closed connection: "
2403                                 "Connection timeout");
2404 }
2405
2406 /* Internal routine used to send (relay, route) private messages to some
2407    destination. If the private message key does not exist then the message
2408    is re-encrypted, otherwise we just pass it along. */
2409
2410 static void 
2411 silc_server_private_message_send_internal(SilcServer server,
2412                                           SilcSocketConnection dst_sock,
2413                                           SilcCipher cipher,
2414                                           SilcHmac hmac,
2415                                           SilcPacketContext *packet)
2416 {
2417   SilcBuffer buffer = packet->buffer;
2418
2419   /* Send and re-encrypt if private messge key does not exist */
2420   if ((packet->flags & SILC_PACKET_FLAG_PRIVMSG_KEY) == FALSE) {
2421
2422     silc_buffer_push(buffer, SILC_PACKET_HEADER_LEN + packet->src_id_len 
2423                      + packet->dst_id_len + packet->padlen);
2424     silc_packet_send_prepare(dst_sock, 0, 0, buffer->len);
2425     silc_buffer_put(dst_sock->outbuf, buffer->data, buffer->len);
2426     
2427     /* Re-encrypt packet */
2428     silc_packet_encrypt(cipher, hmac, dst_sock->outbuf, buffer->len);
2429     
2430     /* Send the packet */
2431     silc_server_packet_send_real(server, dst_sock, FALSE);
2432
2433   } else {
2434     /* Key exist so just send it */
2435     silc_buffer_push(buffer, SILC_PACKET_HEADER_LEN + packet->src_id_len 
2436                      + packet->dst_id_len + packet->padlen);
2437     silc_packet_send_prepare(dst_sock, 0, 0, buffer->len);
2438     silc_buffer_put(dst_sock->outbuf, buffer->data, buffer->len);
2439     silc_server_packet_send_real(server, dst_sock, FALSE);
2440   }
2441 }
2442
2443 /* Received private message. This resolves the destination of the message 
2444    and sends the packet. This is used by both server and router.  If the
2445    destination is our locally connected client this sends the packet to
2446    the client. This may also send the message for further routing if
2447    the destination is not in our server (or router). */
2448
2449 void silc_server_private_message(SilcServer server,
2450                                  SilcSocketConnection sock,
2451                                  SilcPacketContext *packet)
2452 {
2453   SilcBuffer buffer = packet->buffer;
2454   SilcClientID *id;
2455   SilcServerEntry router;
2456   SilcSocketConnection dst_sock;
2457   SilcClientEntry client;
2458
2459   SILC_LOG_DEBUG(("Start"));
2460
2461   if (!packet->dst_id) {
2462     SILC_LOG_ERROR(("Bad Client ID in private message packet, dropped"));
2463     goto err;
2464   }
2465
2466   /* Decode destination Client ID */
2467   id = silc_id_str2id(packet->dst_id, SILC_ID_CLIENT);
2468   if (!id) {
2469     SILC_LOG_ERROR(("Could not decode destination Client ID, dropped"));
2470     goto err;
2471   }
2472
2473   /* If the destination belongs to our server we don't have to route
2474      the message anywhere but to send it to the local destination. */
2475   client = silc_idlist_find_client_by_id(server->local_list, id);
2476   if (client) {
2477     /* It exists, now deliver the message to the destination */
2478     dst_sock = (SilcSocketConnection)client->connection;
2479
2480     /* If we are router and the client has router then the client is in
2481        our cell but not directly connected to us. */
2482     if (server->server_type == SILC_ROUTER && client->router) {
2483       /* We are of course in this case the client's router thus the real
2484          "router" of the client is the server who owns the client. Thus
2485          we will send the packet to that server. */
2486       router = (SilcServerEntry)dst_sock->user_data;
2487       //      assert(client->router == server->id_entry);
2488
2489       silc_server_private_message_send_internal(server, dst_sock,
2490                                                 router->send_key,
2491                                                 router->hmac,
2492                                                 packet);
2493       goto out;
2494     }
2495
2496     /* Seems that client really is directly connected to us */
2497     silc_server_private_message_send_internal(server, dst_sock, 
2498                                               client->send_key,
2499                                               client->hmac, packet);
2500     goto out;
2501   }
2502
2503   /* Destination belongs to someone not in this server. If we are normal
2504      server our action is to send the packet to our router. */
2505   if (server->server_type == SILC_SERVER && !server->standalone) {
2506     router = server->id_entry->router;
2507
2508     /* Send to primary route */
2509     if (router) {
2510       dst_sock = (SilcSocketConnection)router->connection;
2511       silc_server_private_message_send_internal(server, dst_sock, 
2512                                                 router->send_key,
2513                                                 router->hmac, packet);
2514     }
2515     goto out;
2516   }
2517
2518   /* We are router and we will perform route lookup for the destination 
2519      and send the message to fastest route. */
2520   if (server->server_type == SILC_ROUTER && !server->standalone) {
2521     dst_sock = silc_server_get_route(server, id, SILC_ID_CLIENT);
2522     router = (SilcServerEntry)dst_sock->user_data;
2523
2524     /* Get fastest route and send packet. */
2525     if (router)
2526       silc_server_private_message_send_internal(server, dst_sock, 
2527                                                 router->send_key,
2528                                                 router->hmac, packet);
2529
2530     goto out;
2531   }
2532
2533  err:
2534   silc_server_send_error(server, sock, 
2535                          "No such nickname: Private message not sent");
2536  out:
2537   silc_buffer_free(buffer);
2538 }
2539
2540 /* Process received channel message. The message can be originated from
2541    client or server. */
2542
2543 void silc_server_channel_message(SilcServer server,
2544                                  SilcSocketConnection sock,
2545                                  SilcPacketContext *packet)
2546 {
2547   SilcChannelEntry channel = NULL;
2548   SilcClientEntry client = NULL;
2549   SilcChannelID *id = NULL;
2550   void *sender = NULL;
2551   SilcBuffer buffer = packet->buffer;
2552   int i;
2553
2554   SILC_LOG_DEBUG(("Processing channel message"));
2555
2556   /* Sanity checks */
2557   if (packet->dst_id_type != SILC_ID_CHANNEL) {
2558     SILC_LOG_ERROR(("Received bad message for channel, dropped"));
2559     SILC_LOG_DEBUG(("Received bad message for channel, dropped"));
2560     goto out;
2561   }
2562
2563   /* Find channel entry */
2564   id = silc_id_str2id(packet->dst_id, SILC_ID_CHANNEL);
2565   channel = silc_idlist_find_channel_by_id(server->local_list, id);
2566   if (!channel) {
2567     SILC_LOG_DEBUG(("Could not find channel"));
2568     goto out;
2569   }
2570
2571   /* See that this client is on the channel. If the message is coming
2572      from router we won't do the check as the message is from client that
2573      we don't know about. Also, if the original sender is not client
2574      (as it can be server as well) we don't do the check. */
2575   sender = silc_id_str2id(packet->src_id, packet->src_id_type);
2576   if (sock->type != SILC_SOCKET_TYPE_ROUTER && 
2577       packet->src_id_type == SILC_ID_CLIENT) {
2578     for (i = 0; i < channel->user_list_count; i++) {
2579       client = channel->user_list[i].client;
2580       if (client && !SILC_ID_CLIENT_COMPARE(client->id, sender))
2581         break;
2582     }
2583     if (i >= channel->user_list_count)
2584       goto out;
2585   }
2586
2587   /* Distribute the packet to our local clients. This will send the
2588      packet for further routing as well, if needed. */
2589   silc_server_packet_relay_to_channel(server, sock, channel, sender,
2590                                       packet->src_id_type,
2591                                       packet->buffer->data,
2592                                       packet->buffer->len, FALSE);
2593
2594  out:
2595   if (sender)
2596     silc_free(sender);
2597   if (id)
2598     silc_free(id);
2599   silc_buffer_free(buffer);
2600 }
2601
2602 /* Received channel key packet. We distribute the key to all of our locally
2603    connected clients on the channel. */
2604 /* XXX Router must accept this packet and distribute the key to all its
2605    server that has clients on the channel */
2606
2607 void silc_server_channel_key(SilcServer server,
2608                              SilcSocketConnection sock,
2609                              SilcPacketContext *packet)
2610 {
2611   SilcBuffer buffer = packet->buffer;
2612   SilcChannelKeyPayload payload = NULL;
2613   SilcChannelID *id = NULL;
2614   SilcChannelEntry channel;
2615   SilcClientEntry client;
2616   unsigned char *key;
2617   unsigned int key_len;
2618   char *cipher;
2619   int i;
2620
2621   if (packet->src_id_type != SILC_ID_SERVER &&
2622       sock->type != SILC_SOCKET_TYPE_ROUTER)
2623     goto out;
2624
2625   /* Decode channel key payload */
2626   payload = silc_channel_key_payload_parse(buffer);
2627   if (!payload) {
2628     SILC_LOG_ERROR(("Bad channel key payload, dropped"));
2629     goto out;
2630   }
2631
2632   /* Get channel ID */
2633   id = silc_id_str2id(silc_channel_key_get_id(payload, NULL), SILC_ID_CHANNEL);
2634   if (!id)
2635     goto out;
2636
2637   /* Get the channel entry */
2638   channel = silc_idlist_find_channel_by_id(server->local_list, id);
2639   if (!channel) {
2640     SILC_LOG_ERROR(("Received key for non-existent channel"));
2641     goto out;
2642   }
2643
2644   /* Save the key for us as well */
2645   key = silc_channel_key_get_key(payload, &key_len);
2646   if (!key)
2647     goto out;
2648   cipher = silc_channel_key_get_cipher(payload, NULL);;
2649   if (!cipher)
2650     goto out;
2651   channel->key_len = key_len * 8;
2652   channel->key = silc_calloc(key_len, sizeof(unsigned char));
2653   memcpy(channel->key, key, key_len);
2654   silc_cipher_alloc(cipher, &channel->channel_key);
2655   channel->channel_key->cipher->set_key(channel->channel_key->context, 
2656                                         key, key_len);
2657
2658   /* Distribute the key to all clients on the channel */
2659   for (i = 0; i < channel->user_list_count; i++) {
2660     client = channel->user_list[i].client;
2661
2662     if (client)
2663       silc_server_packet_send_dest(server, client->connection,
2664                                    SILC_PACKET_CHANNEL_KEY, 0,
2665                                    client->id, SILC_ID_CLIENT,
2666                                    buffer->data, buffer->len, FALSE);
2667   }
2668
2669  out:
2670   if (id)
2671     silc_free(id);
2672   if (payload)
2673     silc_channel_key_payload_free(payload);
2674   silc_buffer_free(buffer);
2675 }
2676
2677 /* Sends current motd to client */
2678
2679 void silc_server_send_motd(SilcServer server,
2680                            SilcSocketConnection sock)
2681 {
2682   char *motd, *cp;
2683   char line[256];
2684   int i, motd_len;
2685
2686   if (server->config && server->config->motd && 
2687       server->config->motd->motd_file) {
2688
2689     motd = silc_file_read(server->config->motd->motd_file, &motd_len);
2690     if (!motd)
2691       return;
2692
2693     /* Send motd */
2694     i = 0;
2695     cp = motd;
2696     while(cp[i] != 0) {
2697       if (cp[i++] == '\n') {
2698         memset(line, 0, sizeof(line));
2699         strncat(line, cp, i - 1);
2700         cp += i;
2701
2702         if (i == 1)
2703           line[0] = ' ';
2704
2705         silc_server_send_notify(server, sock, SILC_NOTIFY_TYPE_NONE, 
2706                                 0, FALSE, line);
2707
2708         if (!strlen(cp))
2709           break;
2710         i = 0;
2711       }
2712     }
2713
2714     silc_free(motd);
2715   }
2716 }
2717
2718 /* Sends error message. Error messages may or may not have any 
2719    implications. */
2720
2721 void silc_server_send_error(SilcServer server,
2722                             SilcSocketConnection sock,
2723                             const char *fmt, ...)
2724 {
2725   va_list ap;
2726   unsigned char buf[4096];
2727
2728   memset(buf, 0, sizeof(buf));
2729   va_start(ap, fmt);
2730   vsprintf(buf, fmt, ap);
2731   va_end(ap);
2732
2733   silc_server_packet_send(server, sock, SILC_PACKET_ERROR, 0, 
2734                           buf, strlen(buf), FALSE);
2735 }
2736
2737 /* Sends notify message. If `format' is TRUE then the message and the
2738    arguments sent are formatted and that message is sent to the other
2739    end, if FALSE then arguments are encoded into argument payloads and
2740    the message is sent as is. */
2741
2742 void silc_server_send_notify(SilcServer server,
2743                              SilcSocketConnection sock,
2744                              SilcNotifyType type,
2745                              unsigned int argc,
2746                              unsigned int format,
2747                              const char *fmt, ...)
2748 {
2749   va_list ap;
2750   char *cp;
2751   unsigned char buf[4096];
2752   SilcBuffer packet;
2753
2754   cp = (char *)fmt;
2755
2756   if (argc)
2757     va_start(ap, fmt);
2758
2759   if (format && argc) {
2760     memset(buf, 0, sizeof(buf));
2761     vsprintf(buf, fmt, ap);
2762     va_end(ap);
2763     argc = 0;
2764     cp = buf;
2765   }
2766
2767   packet = silc_notify_payload_encode(type, cp, argc, ap);
2768   silc_server_packet_send(server, sock, SILC_PACKET_NOTIFY, 0, 
2769                           packet->data, packet->len, FALSE);
2770   silc_buffer_free(packet);
2771 }
2772
2773 /* Sends notify message destined to specific entity. */
2774
2775 void silc_server_send_notify_dest(SilcServer server,
2776                                   SilcSocketConnection sock,
2777                                   void *dest_id,
2778                                   SilcIdType dest_id_type,
2779                                   SilcNotifyType type,
2780                                   unsigned int argc,
2781                                   unsigned int format,
2782                                   const char *fmt, ...)
2783 {
2784   va_list ap;
2785   char *cp;
2786   unsigned char buf[4096];
2787   SilcBuffer packet;
2788
2789   cp = (char *)fmt;
2790
2791   if (argc)
2792     va_start(ap, fmt);
2793
2794   if (format && argc) {
2795     memset(buf, 0, sizeof(buf));
2796     vsprintf(buf, fmt, ap);
2797     va_end(ap);
2798     argc = 0;
2799     cp = buf;
2800   }
2801
2802   packet = silc_notify_payload_encode(type, cp, argc, ap);
2803   silc_server_packet_send_dest(server, sock, SILC_PACKET_NOTIFY, 0, 
2804                                dest_id, dest_id_type,
2805                                packet->data, packet->len, FALSE);
2806   silc_buffer_free(packet);
2807 }
2808
2809 /* Sends notify message to a channel. The notify message sent is 
2810    distributed to all clients on the channel. */
2811
2812 void silc_server_send_notify_to_channel(SilcServer server,
2813                                         SilcChannelEntry channel,
2814                                         SilcNotifyType type,
2815                                         unsigned int argc,
2816                                         unsigned int format,
2817                                         const char *fmt, ...)
2818 {
2819   va_list ap;
2820   char *cp;
2821   unsigned char buf[4096];
2822   SilcBuffer packet;
2823
2824   cp = (char *)fmt;
2825
2826   if (argc)
2827     va_start(ap, fmt);
2828
2829   if (format && argc) {
2830     memset(buf, 0, sizeof(buf));
2831     vsprintf(buf, fmt, ap);
2832     va_end(ap);
2833     argc = 0;
2834     cp = buf;
2835   }
2836
2837   packet = silc_notify_payload_encode(type, cp, argc, ap);
2838   silc_server_packet_send_to_channel(server, channel, 
2839                                      SILC_PACKET_NOTIFY,
2840                                      packet->data, packet->len, FALSE);
2841   silc_buffer_free(packet);
2842 }
2843
2844 /* Sends New ID Payload to remote end. The packet is used to distribute
2845    information about new registered clients, servers, channel etc. usually
2846    to routers so that they can keep these information up to date. 
2847    If the argument `broadcast' is TRUE then the packet is sent as
2848    broadcast packet. */
2849
2850 void silc_server_send_new_id(SilcServer server,
2851                              SilcSocketConnection sock,
2852                              int broadcast,
2853                              void *id, SilcIdType id_type, 
2854                              unsigned int id_len)
2855 {
2856   SilcBuffer packet;
2857   unsigned char *id_string;
2858
2859   id_string = silc_id_id2str(id, id_type);
2860   if (!id_string)
2861     return;
2862
2863   packet = silc_buffer_alloc(2 + 2 + id_len);
2864   silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
2865   silc_buffer_format(packet,
2866                      SILC_STR_UI_SHORT(id_type),
2867                      SILC_STR_UI_SHORT(id_len),
2868                      SILC_STR_UI_XNSTRING(id_string, id_len),
2869                      SILC_STR_END);
2870
2871   silc_server_packet_send(server, sock, SILC_PACKET_NEW_ID, 
2872                           broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, 
2873                           packet->data, packet->len, FALSE);
2874   silc_free(id_string);
2875   silc_buffer_free(packet);
2876 }
2877
2878 /* Sends Replace ID payload to remote end. This is used to replace old
2879    ID with new ID sent in the packet.  This is called for example when
2880    user changes nickname and we create new ID for the user.  If the 
2881    argument `broadcast' is TRUE then the packet is sent as
2882    broadcast packet. */
2883 /* XXX It would be expected that the new id is same type as the old
2884    ID. :) */
2885
2886 void silc_server_send_replace_id(SilcServer server,
2887                                  SilcSocketConnection sock,
2888                                  int broadcast,
2889                                  void *old_id, SilcIdType old_id_type,
2890                                  unsigned int old_id_len,
2891                                  void *new_id, SilcIdType new_id_type,
2892                                  unsigned int new_id_len)
2893 {
2894   SilcBuffer packet;
2895   unsigned char *oid;
2896   unsigned char *nid;
2897
2898   oid = silc_id_id2str(old_id, old_id_type);
2899   if (!oid)
2900     return;
2901
2902   nid = silc_id_id2str(new_id, new_id_type);
2903   if (!nid)
2904     return;
2905
2906   packet = silc_buffer_alloc(2 + 2 + 2 + 2 + old_id_len + new_id_len);
2907   silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
2908   silc_buffer_format(packet,
2909                      SILC_STR_UI_SHORT(old_id_type),
2910                      SILC_STR_UI_SHORT(old_id_len),
2911                      SILC_STR_UI_XNSTRING(oid, old_id_len),
2912                      SILC_STR_UI_SHORT(new_id_type),
2913                      SILC_STR_UI_SHORT(new_id_len),
2914                      SILC_STR_UI_XNSTRING(nid, new_id_len),
2915                      SILC_STR_END);
2916
2917   silc_server_packet_send(server, sock, SILC_PACKET_REPLACE_ID, 
2918                           broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, 
2919                           packet->data, packet->len, FALSE);
2920   silc_free(oid);
2921   silc_free(nid);
2922   silc_buffer_free(packet);
2923 }
2924
2925 /* This function is used to send Remove Channel User payload. This may sent
2926    by server but is usually used only by router to notify other routers that
2927    user has left a channel. Normal server sends this packet to its router
2928    to notify that the router should not hold a record about this client
2929    on a channel anymore. Router distributes it further to other routers. */
2930
2931 void silc_server_send_remove_channel_user(SilcServer server,
2932                                           SilcSocketConnection sock,
2933                                           int broadcast,
2934                                           void *client_id, void *channel_id)
2935 {
2936   SilcBuffer packet;
2937   unsigned char *clid, *chid;
2938
2939   clid = silc_id_id2str(client_id, SILC_ID_CLIENT);
2940   if (!clid)
2941     return;
2942
2943   chid = silc_id_id2str(channel_id, SILC_ID_CHANNEL);
2944   if (!chid)
2945     return;
2946
2947   packet = silc_buffer_alloc(2 + 2 + SILC_ID_CLIENT_LEN + SILC_ID_CHANNEL_LEN);
2948   silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
2949   silc_buffer_format(packet,
2950                      SILC_STR_UI_SHORT(SILC_ID_CLIENT_LEN),
2951                      SILC_STR_UI_XNSTRING(clid, SILC_ID_CLIENT_LEN),
2952                      SILC_STR_UI_SHORT(SILC_ID_CHANNEL_LEN),
2953                      SILC_STR_UI_XNSTRING(chid, SILC_ID_CHANNEL_LEN),
2954                      SILC_STR_END);
2955
2956   silc_server_packet_send(server, sock, SILC_PACKET_REMOVE_CHANNEL_USER, 
2957                           broadcast ? SILC_PACKET_FLAG_BROADCAST : 0, 
2958                           packet->data, packet->len, FALSE);
2959   silc_free(clid);
2960   silc_free(chid);
2961   silc_buffer_free(packet);
2962 }
2963
2964 /* Received packet to replace a ID. This checks that the requested ID
2965    exists and replaces it with the new one. */
2966
2967 void silc_server_replace_id(SilcServer server,
2968                             SilcSocketConnection sock,
2969                             SilcPacketContext *packet)
2970 {
2971   SilcBuffer buffer = packet->buffer;
2972   unsigned char *old_id = NULL, *new_id = NULL;
2973   SilcIdType old_id_type, new_id_type;
2974   unsigned short old_id_len, new_id_len;
2975   void *id = NULL, *id2 = NULL;
2976
2977   if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
2978       packet->src_id_type == SILC_ID_CLIENT)
2979     return;
2980
2981   SILC_LOG_DEBUG(("Replacing ID"));
2982
2983   silc_buffer_unformat(buffer,
2984                        SILC_STR_UI_SHORT(&old_id_type),
2985                        SILC_STR_UI16_NSTRING_ALLOC(&old_id, &old_id_len),
2986                        SILC_STR_UI_SHORT(&new_id_type),
2987                        SILC_STR_UI16_NSTRING_ALLOC(&new_id, &new_id_len),
2988                        SILC_STR_END);
2989
2990   if (old_id_type != new_id_type)
2991     goto out;
2992
2993   if (old_id_len != silc_id_get_len(old_id_type) ||
2994       new_id_len != silc_id_get_len(new_id_type))
2995     goto out;
2996
2997   id = silc_id_str2id(old_id, old_id_type);
2998   if (!id)
2999     goto out;
3000
3001   id2 = silc_id_str2id(new_id, new_id_type);
3002   if (!id2)
3003     goto out;
3004
3005   /* Replace the old ID */
3006   switch(old_id_type) {
3007   case SILC_ID_CLIENT:
3008     if (silc_idlist_replace_client_id(server->local_list, id, id2) == NULL)
3009       if (server->server_type == SILC_ROUTER)
3010         silc_idlist_replace_client_id(server->global_list, id, id2);
3011     break;
3012
3013   case SILC_ID_SERVER:
3014     if (silc_idlist_replace_server_id(server->local_list, id, id2) == NULL)
3015       if (server->server_type == SILC_ROUTER)
3016         silc_idlist_replace_server_id(server->global_list, id, id2);
3017     break;
3018
3019   case SILC_ID_CHANNEL:
3020     /* XXX Hmm... Basically this cannot occur. Channel ID's cannot be
3021        re-generated. */
3022     silc_free(id2);
3023     break;
3024
3025   default:
3026     silc_free(id2);
3027     break;
3028   }
3029
3030  out:
3031   if (id)
3032     silc_free(id);
3033   if (old_id)
3034     silc_free(old_id);
3035   if (new_id)
3036     silc_free(new_id);
3037 }
3038
3039 /* Creates new channel. */
3040
3041 SilcChannelEntry silc_server_new_channel(SilcServer server, 
3042                                          SilcServerID *router_id,
3043                                          char *cipher, char *channel_name)
3044 {
3045   int i, channel_len, key_len;
3046   SilcChannelID *channel_id;
3047   SilcChannelEntry entry;
3048   SilcCipher key;
3049   unsigned char channel_key[32], *id_string;
3050   SilcBuffer packet;
3051
3052   SILC_LOG_DEBUG(("Creating new channel"));
3053
3054   /* Create channel key */
3055   for (i = 0; i < 32; i++)
3056     channel_key[i] = silc_rng_get_byte(server->rng);
3057
3058   if (!cipher)
3059     cipher = "twofish";
3060
3061   /* Allocate keys */
3062   key_len = 16;
3063   silc_cipher_alloc(cipher, &key);
3064   key->cipher->set_key(key->context, channel_key, key_len);
3065
3066   /* Create the channel */
3067   silc_id_create_channel_id(router_id, server->rng, &channel_id);
3068   entry = silc_idlist_add_channel(server->local_list, channel_name, 
3069                                   SILC_CHANNEL_MODE_NONE, channel_id, 
3070                                   NULL, key);
3071   if (!entry)
3072     return NULL;
3073
3074   /* Add to cache */
3075   silc_idcache_add(server->local_list->channels, channel_name,
3076                    SILC_ID_CHANNEL, channel_id, (void *)entry, TRUE);
3077
3078   entry->key = silc_calloc(key_len, sizeof(*entry->key));
3079   entry->key_len = key_len * 8;
3080   memcpy(entry->key, channel_key, key_len);
3081   memset(channel_key, 0, sizeof(channel_key));
3082
3083   /* Notify other routers about the new channel. We send the packet
3084      to our primary route. */
3085   if (server->standalone == FALSE) {
3086     channel_len = strlen(channel_name);
3087     id_string = silc_id_id2str(entry->id, SILC_ID_CHANNEL);
3088     packet = silc_buffer_alloc(2 + SILC_ID_CHANNEL_LEN);
3089
3090     silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
3091     silc_buffer_format(packet,
3092                        SILC_STR_UI_SHORT(channel_len),
3093                        SILC_STR_UI_XNSTRING(channel_name, channel_len),
3094                        SILC_STR_UI_SHORT(SILC_ID_CHANNEL_LEN),
3095                        SILC_STR_UI_XNSTRING(id_string, SILC_ID_CHANNEL_LEN),
3096                        SILC_STR_END);
3097
3098     /* Send the packet to our router. */
3099     silc_server_packet_send(server, (SilcSocketConnection) 
3100                             server->id_entry->router->connection,
3101                             SILC_PACKET_NEW_CHANNEL_USER, 0, 
3102                             packet->data, packet->len, TRUE);
3103     
3104     silc_free(id_string);
3105     silc_buffer_free(packet);
3106   }
3107
3108   return entry;
3109 }
3110
3111 /* Create new client. This processes incoming NEW_CLIENT packet and creates
3112    Client ID for the client. Client becomes registered after calling this
3113    functions. */
3114
3115 SilcClientEntry silc_server_new_client(SilcServer server,
3116                                        SilcSocketConnection sock,
3117                                        SilcPacketContext *packet)
3118 {
3119   SilcBuffer buffer = packet->buffer;
3120   SilcClientEntry client;
3121   SilcIDCacheEntry cache;
3122   SilcClientID *client_id;
3123   SilcBuffer reply;
3124   char *username = NULL, *realname = NULL, *id_string;
3125
3126   SILC_LOG_DEBUG(("Creating new client"));
3127
3128   if (sock->type != SILC_SOCKET_TYPE_CLIENT)
3129     return NULL;
3130
3131   /* Take client entry */
3132   client = (SilcClientEntry)sock->user_data;
3133
3134   /* Fetch the old client cache entry so that we can update it. */
3135   if (!silc_idcache_find_by_context(server->local_list->clients,
3136                                     sock->user_data, &cache)) {
3137     SILC_LOG_ERROR(("Lost client's cache entry - bad thing"));
3138     return NULL;
3139   }
3140
3141   /* Parse incoming packet */
3142   silc_buffer_unformat(buffer,
3143                        SILC_STR_UI16_STRING_ALLOC(&username),
3144                        SILC_STR_UI16_STRING_ALLOC(&realname),
3145                        SILC_STR_END);
3146
3147   /* Create Client ID */
3148   silc_id_create_client_id(server->id, server->rng, server->md5hash,
3149                            username, &client_id);
3150
3151   /* Update client entry */
3152   client->registered = TRUE;
3153   client->nickname = strdup(username);
3154   client->username = username;
3155   client->userinfo = realname;
3156   client->id = client_id;
3157
3158   /* Update the cache entry */
3159   cache->id = (void *)client_id;
3160   cache->type = SILC_ID_CLIENT;
3161   cache->data = username;
3162   silc_idcache_sort_by_data(server->local_list->clients);
3163
3164   /* Notify our router about new client on the SILC network */
3165   if (!server->standalone)
3166     silc_server_send_new_id(server, (SilcSocketConnection) 
3167                             server->id_entry->router->connection, 
3168                             server->server_type == SILC_SERVER ? TRUE : FALSE,
3169                             client->id, SILC_ID_CLIENT, SILC_ID_CLIENT_LEN);
3170   
3171   /* Send the new client ID to the client. */
3172   id_string = silc_id_id2str(client->id, SILC_ID_CLIENT);
3173   reply = silc_buffer_alloc(2 + 2 + SILC_ID_CLIENT_LEN);
3174   silc_buffer_pull_tail(reply, SILC_BUFFER_END(reply));
3175   silc_buffer_format(reply,
3176                      SILC_STR_UI_SHORT(SILC_ID_CLIENT),
3177                      SILC_STR_UI_SHORT(SILC_ID_CLIENT_LEN),
3178                      SILC_STR_UI_XNSTRING(id_string, SILC_ID_CLIENT_LEN),
3179                      SILC_STR_END);
3180   silc_server_packet_send(server, sock, SILC_PACKET_NEW_ID, 0, 
3181                           reply->data, reply->len, FALSE);
3182   silc_free(id_string);
3183   silc_buffer_free(reply);
3184   
3185   /* Send some nice info to the client */
3186   silc_server_send_notify(server, sock, 
3187                           SILC_NOTIFY_TYPE_NONE, 2, TRUE,
3188                           "Welcome to the SILC Network %s@%s",
3189                           username, sock->hostname);
3190   silc_server_send_notify(server, sock,
3191                           SILC_NOTIFY_TYPE_NONE, 2, TRUE, 
3192                           "Your host is %s, running version %s",
3193                           server->config->server_info->server_name,
3194                           server_version);
3195   silc_server_send_notify(server, sock, 
3196                           SILC_NOTIFY_TYPE_NONE, 2, TRUE, 
3197                           "Your connection is secured with %s cipher, "
3198                           "key length %d bits",
3199                           client->send_key->cipher->name,
3200                           client->send_key->cipher->key_len);
3201   silc_server_send_notify(server, sock, 
3202                           SILC_NOTIFY_TYPE_NONE, 1, TRUE, 
3203                           "Your current nickname is %s",
3204                           client->nickname);
3205
3206   /* Send motd */
3207   silc_server_send_motd(server, sock);
3208
3209   return client;
3210 }
3211
3212 /* Create new server. This processes incoming NEW_SERVER packet and
3213    saves the received Server ID. The server is our locally connected
3214    server thus we save all the information and save it to local list. 
3215    This funtion can be used by both normal server and router server.
3216    If normal server uses this it means that its router has connected
3217    to the server. If router uses this it means that one of the cell's
3218    servers is connected to the router. */
3219
3220 SilcServerEntry silc_server_new_server(SilcServer server,
3221                                        SilcSocketConnection sock,
3222                                        SilcPacketContext *packet)
3223 {
3224   SilcBuffer buffer = packet->buffer;
3225   SilcServerEntry new_server;
3226   SilcIDCacheEntry cache;
3227   SilcServerID *server_id;
3228   unsigned char *server_name, *id_string;
3229
3230   SILC_LOG_DEBUG(("Creating new server"));
3231
3232   if (sock->type != SILC_SOCKET_TYPE_SERVER &&
3233       sock->type != SILC_SOCKET_TYPE_ROUTER)
3234     return NULL;
3235
3236   /* Take server entry */
3237   new_server = (SilcServerEntry)sock->user_data;
3238
3239   /* Fetch the old server cache entry so that we can update it. */
3240   if (!silc_idcache_find_by_context(server->local_list->servers,
3241                                     sock->user_data, &cache)) {
3242     SILC_LOG_ERROR(("Lost server's cache entry - bad thing"));
3243     return NULL;
3244   }
3245
3246   /* Parse the incoming packet */
3247   silc_buffer_unformat(buffer,
3248                        SILC_STR_UI16_STRING_ALLOC(&id_string),
3249                        SILC_STR_UI16_STRING_ALLOC(&server_name),
3250                        SILC_STR_END);
3251
3252   /* Get Server ID */
3253   server_id = silc_id_str2id(id_string, SILC_ID_SERVER);
3254   silc_free(id_string);
3255
3256   /* Update client entry */
3257   new_server->registered = TRUE;
3258   new_server->server_name = server_name;
3259   new_server->id = server_id;
3260
3261   /* Update the cache entry */
3262   cache->id = (void *)server_id;
3263   cache->type = SILC_ID_SERVER;
3264   cache->data = server_name;
3265   silc_idcache_sort_by_data(server->local_list->servers);
3266
3267   /* Distribute the information about new server in the SILC network
3268      to our router. If we are normal server we won't send anything
3269      since this connection must be our router connection. */
3270   if (server->server_type == SILC_ROUTER && !server->standalone)
3271     silc_server_send_new_id(server, server->id_entry->router->connection,
3272                             TRUE, new_server->id, SILC_ID_SERVER, 
3273                             SILC_ID_SERVER_LEN);
3274
3275   return new_server;
3276 }
3277
3278 /* Processes incoming New ID Payload. New ID Payload is used to distribute
3279    information about newly registered clients, servers and created 
3280    channels. */
3281
3282 void silc_server_new_id(SilcServer server, SilcSocketConnection sock,
3283                         SilcPacketContext *packet)
3284 {
3285   SilcBuffer buffer = packet->buffer;
3286   SilcIDList id_list;
3287   SilcServerEntry tmpserver, router;
3288   SilcSocketConnection router_sock;
3289   SilcIdType id_type;
3290   unsigned char *id_string;
3291   void *id, *tmpid;
3292
3293   SILC_LOG_DEBUG(("Processing new ID"));
3294
3295   if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
3296       server->server_type == SILC_SERVER ||
3297       packet->src_id_type != SILC_ID_SERVER)
3298     return;
3299
3300   silc_buffer_unformat(buffer,
3301                        SILC_STR_UI_SHORT(&id_type),
3302                        SILC_STR_UI16_STRING_ALLOC(&id_string),
3303                        SILC_STR_END);
3304
3305   /* Normal server cannot have other normal server connections */
3306   if (id_type == SILC_ID_SERVER && sock->type == SILC_SOCKET_TYPE_SERVER)
3307     goto out;
3308
3309   id = silc_id_str2id(id_string, id_type);
3310   if (!id)
3311     goto out;
3312
3313   /* If the packet is originated from the one who sent it to us we know
3314      that the ID belongs to our cell, unless the sender was router. */
3315   tmpid = silc_id_str2id(packet->src_id, SILC_ID_SERVER);
3316   tmpserver = (SilcServerEntry)sock->user_data;
3317
3318   if (!SILC_ID_SERVER_COMPARE(tmpid, tmpserver->id) &&
3319       sock->type == SILC_SOCKET_TYPE_SERVER) {
3320     id_list = server->local_list;
3321     router_sock = sock;
3322     router = sock->user_data;
3323     /*    router = server->id_entry; */
3324   } else {
3325     id_list = server->global_list;
3326     router_sock = (SilcSocketConnection)server->id_entry->router->connection;
3327     router = server->id_entry->router;
3328   }
3329
3330   silc_free(tmpid);
3331
3332   switch(id_type) {
3333   case SILC_ID_CLIENT:
3334     {
3335       SilcClientEntry idlist;
3336
3337       /* Add the client to our local list. We are router and we keep
3338          cell specific local database of all clients in the cell. */
3339       idlist = silc_idlist_add_client(id_list, NULL, NULL, NULL,
3340                                       id, router, NULL, NULL, 
3341                                       NULL, NULL, NULL, router_sock);
3342     }
3343     break;
3344
3345   case SILC_ID_SERVER:
3346     {
3347       SilcServerEntry idlist;
3348
3349       /* Add the server to our local list. We are router and we keep
3350          cell specific local database of all servers in the cell. */
3351       idlist = silc_idlist_add_server(id_list, NULL, 0,
3352                                       id, router, NULL, NULL, 
3353                                       NULL, NULL, NULL, router_sock);
3354     }
3355     break;
3356
3357   case SILC_ID_CHANNEL:
3358     /* Add the channel to our local list. We are router and we keep
3359        cell specific local database of all channels in the cell. */
3360     silc_idlist_add_channel(id_list, NULL, 0, id, router, NULL);
3361     break;
3362
3363   default:
3364     goto out;
3365     break;
3366   }
3367
3368  out:
3369   silc_free(id_string);
3370 }
3371
3372 /* Received packet to remove a user from a channel. Routers notify other
3373    routers that user has left a channel. Client must not send this packet. 
3374    Normal server may send this packet but ignores if it receives one. */
3375
3376 void silc_server_remove_channel_user(SilcServer server,
3377                                      SilcSocketConnection sock,
3378                                      SilcPacketContext *packet)
3379 {
3380   SilcBuffer buffer = packet->buffer;
3381   unsigned char *tmp1 = NULL, *tmp2 = NULL;
3382   SilcClientID *client_id = NULL;
3383   SilcChannelID *channel_id = NULL;
3384   SilcChannelEntry channel;
3385   SilcClientEntry client;
3386
3387   SILC_LOG_DEBUG(("Removing user from channel"));
3388
3389   if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
3390       server->server_type == SILC_SERVER)
3391     return;
3392
3393   silc_buffer_unformat(buffer,
3394                        SILC_STR_UI16_STRING_ALLOC(&tmp1),
3395                        SILC_STR_UI16_STRING_ALLOC(&tmp2),
3396                        SILC_STR_END);
3397
3398   if (!tmp1 || !tmp2)
3399     goto out;
3400
3401   client_id = silc_id_str2id(tmp1, SILC_ID_CLIENT);
3402   channel_id = silc_id_str2id(tmp2, SILC_ID_CHANNEL);
3403   if (!client_id || !channel_id)
3404     goto out;
3405
3406   /* XXX routers should check server->global_list as well */
3407   /* Get channel entry */
3408   channel = silc_idlist_find_channel_by_id(server->local_list, channel_id);
3409   if (!channel)
3410     goto out;
3411   
3412   /* XXX routers should check server->global_list as well */
3413   /* Get client entry */
3414   client = silc_idlist_find_client_by_id(server->local_list, client_id);
3415   if (!client)
3416     goto out;
3417
3418   /* Remove from channel */
3419   silc_server_remove_from_one_channel(server, sock, channel, client, FALSE);
3420
3421  out:
3422   if (tmp1)
3423     silc_free(tmp1);
3424   if (tmp2)
3425     silc_free(tmp2);
3426   if (client_id)
3427     silc_free(client_id);
3428   if (channel_id)
3429     silc_free(channel_id);
3430 }