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