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