5 Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
7 Copyright (C) 1997 - 2001 Pekka Riikonen
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.
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.
21 * Server packet routines to handle received packets.
25 #include "serverincludes.h"
26 #include "server_internal.h"
28 extern char *server_version;
30 /* Received notify packet. Server can receive notify packets from router.
31 Server then relays the notify messages to clients if needed. */
33 void silc_server_notify(SilcServer server,
34 SilcSocketConnection sock,
35 SilcPacketContext *packet)
37 SilcNotifyPayload payload;
39 SilcArgumentPayload args;
40 SilcChannelID *channel_id = NULL, *channel_id2;
41 SilcClientID *client_id, *client_id2;
42 SilcServerID *server_id;
43 SilcChannelEntry channel;
44 SilcClientEntry client;
45 SilcServerEntry server_entry;
46 SilcChannelClientEntry chl;
47 SilcIDCacheEntry cache;
48 SilcHashTableList htl;
53 SILC_LOG_DEBUG(("Start"));
55 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
56 packet->src_id_type != SILC_ID_SERVER)
62 /* If the packet is destined directly to a client then relay the packet
63 before processing it. */
64 if (packet->dst_id_type == SILC_ID_CLIENT) {
66 SilcSocketConnection dst_sock;
68 /* Get the route to the client */
69 dst_sock = silc_server_get_client_route(server, packet->dst_id,
70 packet->dst_id_len, NULL, &idata);
72 /* Relay the packet */
73 silc_server_relay_packet(server, dst_sock, idata->send_key,
74 idata->hmac_receive, idata->psn_send++,
78 /* Parse the Notify Payload */
79 payload = silc_notify_payload_parse(packet->buffer);
83 /* If we are router and this packet is not already broadcast packet
84 we will broadcast it. The sending socket really cannot be router or
85 the router is buggy. If this packet is coming from router then it must
86 have the broadcast flag set already and we won't do anything. */
87 if (!server->standalone && server->server_type == SILC_ROUTER &&
88 sock->type == SILC_SOCKET_TYPE_SERVER &&
89 !(packet->flags & SILC_PACKET_FLAG_BROADCAST)) {
90 SILC_LOG_DEBUG(("Broadcasting received Notify packet"));
91 if (packet->dst_id_type == SILC_ID_CHANNEL) {
92 /* Packet is destined to channel */
93 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
98 silc_server_packet_send_dest(server, server->router->connection,
100 packet->flags | SILC_PACKET_FLAG_BROADCAST,
101 channel_id, SILC_ID_CHANNEL,
102 packet->buffer->data, packet->buffer->len,
104 silc_server_backup_send_dest(server, (SilcServerEntry)sock->user_data,
105 packet->type, packet->flags,
106 channel_id, SILC_ID_CHANNEL,
107 packet->buffer->data, packet->buffer->len,
110 /* Packet is destined to client or server */
111 silc_server_packet_send(server, server->router->connection,
113 packet->flags | SILC_PACKET_FLAG_BROADCAST,
114 packet->buffer->data, packet->buffer->len,
116 silc_server_backup_send(server, (SilcServerEntry)sock->user_data,
117 packet->type, packet->flags,
118 packet->buffer->data, packet->buffer->len,
123 type = silc_notify_get_type(payload);
124 args = silc_notify_get_args(payload);
129 case SILC_NOTIFY_TYPE_JOIN:
131 * Distribute the notify to local clients on the channel
133 SILC_LOG_DEBUG(("JOIN notify"));
136 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
139 channel_id = silc_id_payload_parse_id(tmp, tmp_len);
143 /* Get channel entry */
144 channel = silc_idlist_find_channel_by_id(server->global_list,
147 channel = silc_idlist_find_channel_by_id(server->local_list,
150 silc_free(channel_id);
154 silc_free(channel_id);
157 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
160 client_id = silc_id_payload_parse_id(tmp, tmp_len);
164 /* If the the client is not in local list we check global list (ie. the
165 channel will be global channel) and if it does not exist then create
166 entry for the client. */
167 client = silc_idlist_find_client_by_id(server->global_list,
168 client_id, server->server_type,
171 client = silc_idlist_find_client_by_id(server->local_list,
172 client_id, server->server_type,
175 /* If router did not find the client the it is bogus */
176 if (server->server_type != SILC_SERVER)
180 silc_idlist_add_client(server->global_list, NULL, NULL, NULL,
181 silc_id_dup(client_id, SILC_ID_CLIENT),
182 sock->user_data, NULL);
184 SILC_LOG_ERROR(("Could not add new client to the ID Cache"));
185 silc_free(client_id);
189 client->data.status |= SILC_IDLIST_STATUS_REGISTERED;
193 /* Do not process the notify if the client is not registered */
194 if (!(client->data.status & SILC_IDLIST_STATUS_REGISTERED))
197 /* Do not add client to channel if it is there already */
198 if (silc_server_client_on_channel(client, channel)) {
199 SILC_LOG_DEBUG(("Client already on channel"));
203 /* Send to channel */
204 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
205 FALSE, packet->buffer->data,
206 packet->buffer->len, FALSE);
208 if (server->server_type != SILC_ROUTER &&
209 sock->type == SILC_SOCKET_TYPE_ROUTER)
210 /* The channel is global now */
211 channel->global_users = TRUE;
213 /* JOIN the global client to the channel (local clients (if router
214 created the channel) is joined in the pending JOIN command). */
215 chl = silc_calloc(1, sizeof(*chl));
216 chl->client = client;
217 chl->channel = channel;
219 /* If this is the first one on the channel then it is the founder of
221 if (!silc_hash_table_count(channel->user_list))
222 chl->mode = (SILC_CHANNEL_UMODE_CHANOP | SILC_CHANNEL_UMODE_CHANFO);
224 silc_hash_table_add(channel->user_list, client, chl);
225 silc_hash_table_add(client->channels, channel, chl);
226 silc_free(client_id);
230 case SILC_NOTIFY_TYPE_LEAVE:
232 * Distribute the notify to local clients on the channel
234 SILC_LOG_DEBUG(("LEAVE notify"));
237 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
238 packet->dst_id_type);
243 /* Get channel entry */
244 channel = silc_idlist_find_channel_by_id(server->global_list,
247 channel = silc_idlist_find_channel_by_id(server->local_list,
250 silc_free(channel_id);
256 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
258 silc_free(channel_id);
261 client_id = silc_id_payload_parse_id(tmp, tmp_len);
263 silc_free(channel_id);
267 /* Get client entry */
268 client = silc_idlist_find_client_by_id(server->global_list,
269 client_id, TRUE, NULL);
271 client = silc_idlist_find_client_by_id(server->local_list,
272 client_id, TRUE, NULL);
274 silc_free(client_id);
275 silc_free(channel_id);
279 silc_free(client_id);
281 /* Check if on channel */
282 if (!silc_server_client_on_channel(client, channel))
285 /* Send the leave notify to channel */
286 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
287 FALSE, packet->buffer->data,
288 packet->buffer->len, FALSE);
290 /* Remove the user from channel */
291 silc_server_remove_from_one_channel(server, sock, channel, client, FALSE);
294 case SILC_NOTIFY_TYPE_SIGNOFF:
296 * Distribute the notify to local clients on the channel
298 SILC_LOG_DEBUG(("SIGNOFF notify"));
301 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
304 client_id = silc_id_payload_parse_id(tmp, tmp_len);
308 /* Get client entry */
309 client = silc_idlist_find_client_by_id(server->global_list,
310 client_id, TRUE, &cache);
312 client = silc_idlist_find_client_by_id(server->local_list,
313 client_id, TRUE, &cache);
315 silc_free(client_id);
319 silc_free(client_id);
321 /* Get signoff message */
322 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
326 /* Remove the client from all channels. */
327 silc_server_remove_from_channels(server, NULL, client, TRUE, tmp, FALSE);
329 client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
330 cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
331 server->stat.clients--;
332 if (server->server_type == SILC_ROUTER)
333 server->stat.cell_clients--;
336 case SILC_NOTIFY_TYPE_TOPIC_SET:
338 * Distribute the notify to local clients on the channel
341 SILC_LOG_DEBUG(("TOPIC SET notify"));
344 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
345 packet->dst_id_type);
350 /* Get channel entry */
351 channel = silc_idlist_find_channel_by_id(server->global_list,
354 channel = silc_idlist_find_channel_by_id(server->local_list,
357 silc_free(channel_id);
363 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
365 silc_free(channel_id);
370 silc_free(channel->topic);
371 channel->topic = silc_calloc(tmp_len + 1, sizeof(*channel->topic));
372 memcpy(channel->topic, tmp, tmp_len);
374 /* Send the same notify to the channel */
375 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
376 FALSE, packet->buffer->data,
377 packet->buffer->len, FALSE);
378 silc_free(channel_id);
381 case SILC_NOTIFY_TYPE_NICK_CHANGE:
384 * Distribute the notify to local clients on the channel
386 unsigned char *id, *id2;
388 SILC_LOG_DEBUG(("NICK CHANGE notify"));
390 /* Get old client ID */
391 id = silc_argument_get_arg_type(args, 1, &tmp_len);
394 client_id = silc_id_payload_parse_id(id, tmp_len);
398 /* Get new client ID */
399 id2 = silc_argument_get_arg_type(args, 2, &tmp_len);
402 client_id2 = silc_id_payload_parse_id(id2, tmp_len);
406 SILC_LOG_DEBUG(("Old Client ID id(%s)",
407 silc_id_render(client_id, SILC_ID_CLIENT)));
408 SILC_LOG_DEBUG(("New Client ID id(%s)",
409 silc_id_render(client_id2, SILC_ID_CLIENT)));
411 /* Replace the Client ID */
412 client = silc_idlist_replace_client_id(server->global_list, client_id,
415 client = silc_idlist_replace_client_id(server->local_list, client_id,
419 /* The nickname is not valid anymore, set it NULL. This causes that
420 the nickname will be queried if someone wants to know it. */
421 if (client->nickname)
422 silc_free(client->nickname);
423 client->nickname = NULL;
425 /* Send the NICK_CHANGE notify type to local clients on the channels
426 this client is joined to. */
427 silc_server_send_notify_on_channels(server, NULL, client,
428 SILC_NOTIFY_TYPE_NICK_CHANGE, 2,
433 silc_free(client_id);
435 silc_free(client_id2);
439 case SILC_NOTIFY_TYPE_CMODE_CHANGE:
441 * Distribute the notify to local clients on the channel
444 SILC_LOG_DEBUG(("CMODE CHANGE notify"));
447 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
448 packet->dst_id_type);
453 /* Get channel entry */
454 channel = silc_idlist_find_channel_by_id(server->global_list,
457 channel = silc_idlist_find_channel_by_id(server->local_list,
460 silc_free(channel_id);
466 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
468 silc_free(channel_id);
472 SILC_GET32_MSB(mode, tmp);
474 /* Check if mode changed */
475 if (channel->mode == mode)
478 /* Send the same notify to the channel */
479 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
480 FALSE, packet->buffer->data,
481 packet->buffer->len, FALSE);
483 /* If the channel had private keys set and the mode was removed then
484 we must re-generate and re-distribute a new channel key */
485 if (channel->mode & SILC_CHANNEL_MODE_PRIVKEY &&
486 !(mode & SILC_CHANNEL_MODE_PRIVKEY)) {
487 /* Re-generate channel key */
488 if (!silc_server_create_channel_key(server, channel, 0))
491 /* Send the channel key. This sends it to our local clients and if
492 we are normal server to our router as well. */
493 silc_server_send_channel_key(server, NULL, channel,
494 server->server_type == SILC_ROUTER ?
495 FALSE : !server->standalone);
499 channel->mode = mode;
500 silc_free(channel_id);
503 tmp = silc_argument_get_arg_type(args, 4, &tmp_len);
505 unsigned char hash[32];
508 silc_hmac_free(channel->hmac);
509 if (!silc_hmac_alloc(tmp, NULL, &channel->hmac))
512 /* Set the HMAC key out of current channel key. The client must do
514 silc_hash_make(silc_hmac_get_hash(channel->hmac), channel->key,
515 channel->key_len / 8,
517 silc_hmac_set_key(channel->hmac, hash,
518 silc_hash_len(silc_hmac_get_hash(channel->hmac)));
519 memset(hash, 0, sizeof(hash));
524 case SILC_NOTIFY_TYPE_CUMODE_CHANGE:
527 * Distribute the notify to local clients on the channel
529 SilcChannelClientEntry chl2 = NULL;
530 bool notify_sent = FALSE;
532 SILC_LOG_DEBUG(("CUMODE CHANGE notify"));
535 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
536 packet->dst_id_type);
541 /* Get channel entry */
542 channel = silc_idlist_find_channel_by_id(server->global_list,
545 channel = silc_idlist_find_channel_by_id(server->local_list,
548 silc_free(channel_id);
554 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
556 silc_free(channel_id);
560 SILC_GET32_MSB(mode, tmp);
562 /* Get target client */
563 tmp = silc_argument_get_arg_type(args, 3, &tmp_len);
566 client_id = silc_id_payload_parse_id(tmp, tmp_len);
570 /* Get client entry */
571 client = silc_idlist_find_client_by_id(server->global_list,
572 client_id, TRUE, NULL);
574 client = silc_idlist_find_client_by_id(server->local_list,
575 client_id, TRUE, NULL);
577 silc_free(client_id);
581 silc_free(client_id);
583 /* Get entry to the channel user list */
584 silc_hash_table_list(channel->user_list, &htl);
585 while (silc_hash_table_get(&htl, NULL, (void *)&chl)) {
586 /* If the mode is channel founder and we already find a client
587 to have that mode on the channel we will enforce the sender
588 to change the channel founder mode away. There can be only one
589 channel founder on the channel. */
590 if (server->server_type == SILC_ROUTER &&
591 mode & SILC_CHANNEL_UMODE_CHANFO &&
592 chl->mode & SILC_CHANNEL_UMODE_CHANFO) {
594 unsigned char cumode[4];
596 if (chl->client == client && chl->mode == mode) {
601 mode &= ~SILC_CHANNEL_UMODE_CHANFO;
602 silc_server_send_notify_cumode(server, sock, FALSE, channel, mode,
603 client->id, SILC_ID_CLIENT,
606 idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
607 SILC_PUT32_MSB(mode, cumode);
608 silc_server_send_notify_to_channel(server, sock, channel, FALSE,
609 SILC_NOTIFY_TYPE_CUMODE_CHANGE,
610 3, idp->data, idp->len,
612 idp->data, idp->len);
613 silc_buffer_free(idp);
616 /* Force the mode change if we alredy set the mode */
619 silc_free(channel_id);
624 if (chl->client == client) {
625 if (chl->mode == mode) {
630 /* Change the mode */
632 if (!(mode & SILC_CHANNEL_UMODE_CHANFO))
639 /* Send the same notify to the channel */
641 silc_server_packet_send_to_channel(server, sock, channel,
643 FALSE, packet->buffer->data,
644 packet->buffer->len, FALSE);
646 silc_free(channel_id);
650 case SILC_NOTIFY_TYPE_INVITE:
652 if (packet->dst_id_type == SILC_ID_CLIENT)
655 SILC_LOG_DEBUG(("INVITE notify"));
658 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
661 channel_id = silc_id_payload_parse_id(tmp, tmp_len);
665 /* Get channel entry */
666 channel = silc_idlist_find_channel_by_id(server->global_list,
669 channel = silc_idlist_find_channel_by_id(server->local_list,
672 silc_free(channel_id);
676 silc_free(channel_id);
678 /* Get the added invite */
679 tmp = silc_argument_get_arg_type(args, 3, &tmp_len);
681 if (!channel->invite_list)
682 channel->invite_list = silc_calloc(tmp_len + 2,
683 sizeof(*channel->invite_list));
685 channel->invite_list = silc_realloc(channel->invite_list,
686 sizeof(*channel->invite_list) *
688 strlen(channel->invite_list) +
690 if (tmp[tmp_len - 1] == ',')
691 tmp[tmp_len - 1] = '\0';
693 strncat(channel->invite_list, tmp, tmp_len);
694 strncat(channel->invite_list, ",", 1);
697 /* Get the deleted invite */
698 tmp = silc_argument_get_arg_type(args, 4, &tmp_len);
699 if (tmp && channel->invite_list) {
700 char *start, *end, *n;
702 if (!strncmp(channel->invite_list, tmp,
703 strlen(channel->invite_list) - 1)) {
704 silc_free(channel->invite_list);
705 channel->invite_list = NULL;
707 start = strstr(channel->invite_list, tmp);
708 if (start && strlen(start) >= tmp_len) {
709 end = start + tmp_len;
710 n = silc_calloc(strlen(channel->invite_list) - tmp_len, sizeof(*n));
711 strncat(n, channel->invite_list, start - channel->invite_list);
712 strncat(n, end + 1, ((channel->invite_list +
713 strlen(channel->invite_list)) - end) - 1);
714 silc_free(channel->invite_list);
715 channel->invite_list = n;
722 case SILC_NOTIFY_TYPE_CHANNEL_CHANGE:
724 * Distribute to the local clients on the channel and change the
728 SILC_LOG_DEBUG(("CHANNEL CHANGE"));
730 if (sock->type != SILC_SOCKET_TYPE_ROUTER)
733 /* Get the old Channel ID */
734 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
737 channel_id = silc_id_payload_parse_id(tmp, tmp_len);
741 /* Get the channel entry */
742 channel = silc_idlist_find_channel_by_id(server->global_list,
745 channel = silc_idlist_find_channel_by_id(server->local_list,
748 silc_free(channel_id);
753 /* Send the notify to the channel */
754 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
755 FALSE, packet->buffer->data,
756 packet->buffer->len, FALSE);
758 /* Get the new Channel ID */
759 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
762 channel_id2 = silc_id_payload_parse_id(tmp, tmp_len);
766 SILC_LOG_DEBUG(("Old Channel ID id(%s)",
767 silc_id_render(channel_id, SILC_ID_CHANNEL)));
768 SILC_LOG_DEBUG(("New Channel ID id(%s)",
769 silc_id_render(channel_id2, SILC_ID_CHANNEL)));
771 /* Replace the Channel ID */
772 if (!silc_idlist_replace_channel_id(server->global_list, channel_id,
774 if (!silc_idlist_replace_channel_id(server->local_list, channel_id,
776 silc_free(channel_id2);
781 SilcBuffer users = NULL, users_modes = NULL;
783 /* Re-announce our clients on the channel as the ID has changed now */
784 silc_server_announce_get_channel_users(server, channel, &users,
787 silc_buffer_push(users, users->data - users->head);
788 silc_server_packet_send(server, sock,
789 SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
790 users->data, users->len, FALSE);
791 silc_buffer_free(users);
794 silc_buffer_push(users_modes, users_modes->data - users_modes->head);
795 silc_server_packet_send_dest(server, sock,
796 SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
797 channel->id, SILC_ID_CHANNEL,
799 users_modes->len, FALSE);
800 silc_buffer_free(users_modes);
804 silc_free(channel_id);
808 case SILC_NOTIFY_TYPE_SERVER_SIGNOFF:
810 * Remove the server entry and all clients that this server owns.
813 SILC_LOG_DEBUG(("SERVER SIGNOFF notify"));
816 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
819 server_id = silc_id_payload_parse_id(tmp, tmp_len);
823 /* Get server entry */
824 server_entry = silc_idlist_find_server_by_id(server->global_list,
825 server_id, TRUE, NULL);
827 server_entry = silc_idlist_find_server_by_id(server->local_list,
828 server_id, TRUE, NULL);
830 /* If we are normal server then we might not have the server. Check
831 whether router was kind enough to send the list of all clients
832 that actually was to be removed. Remove them if the list is
834 if (server->server_type != SILC_ROUTER &&
835 silc_argument_get_arg_num(args) > 1) {
838 for (i = 1; i < silc_argument_get_arg_num(args); i++) {
840 tmp = silc_argument_get_arg_type(args, i + 1, &tmp_len);
843 client_id = silc_id_payload_parse_id(tmp, tmp_len);
847 /* Get client entry */
848 client = silc_idlist_find_client_by_id(server->global_list,
849 client_id, TRUE, &cache);
851 client = silc_idlist_find_client_by_id(server->local_list,
852 client_id, TRUE, &cache);
854 silc_free(client_id);
858 silc_free(client_id);
860 /* Remove the client from all channels. */
861 silc_server_remove_from_channels(server, NULL, client,
864 client->data.status &= ~SILC_IDLIST_STATUS_REGISTERED;
865 cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
866 server->stat.clients--;
867 if (server->server_type == SILC_ROUTER)
868 server->stat.cell_clients--;
872 silc_free(server_id);
876 silc_free(server_id);
878 /* Free all client entries that this server owns as they will
879 become invalid now as well. */
880 silc_server_remove_clients_by_server(server, server_entry, TRUE);
882 /* Remove the server entry */
883 if (!silc_idlist_del_server(server->global_list, server_entry))
884 silc_idlist_del_server(server->local_list, server_entry);
886 /* XXX update statistics */
890 case SILC_NOTIFY_TYPE_KICKED:
892 * Distribute the notify to local clients on the channel
895 SILC_LOG_DEBUG(("KICKED notify"));
898 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
899 packet->dst_id_type);
904 /* Get channel entry */
905 channel = silc_idlist_find_channel_by_id(server->global_list,
908 channel = silc_idlist_find_channel_by_id(server->local_list,
911 silc_free(channel_id);
915 silc_free(channel_id);
918 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
921 client_id = silc_id_payload_parse_id(tmp, tmp_len);
925 /* If the the client is not in local list we check global list */
926 client = silc_idlist_find_client_by_id(server->global_list,
927 client_id, TRUE, NULL);
929 client = silc_idlist_find_client_by_id(server->local_list,
930 client_id, TRUE, NULL);
932 silc_free(client_id);
937 /* Send to channel */
938 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
939 FALSE, packet->buffer->data,
940 packet->buffer->len, FALSE);
942 /* Remove the client from channel */
943 silc_server_remove_from_one_channel(server, sock, channel, client, FALSE);
947 case SILC_NOTIFY_TYPE_KILLED:
950 * Distribute the notify to local clients on channels
955 SILC_LOG_DEBUG(("KILLED notify"));
958 id = silc_argument_get_arg_type(args, 1, &id_len);
961 client_id = silc_id_payload_parse_id(id, id_len);
965 /* If the the client is not in local list we check global list */
966 client = silc_idlist_find_client_by_id(server->global_list,
967 client_id, TRUE, NULL);
969 client = silc_idlist_find_client_by_id(server->local_list,
970 client_id, TRUE, NULL);
972 silc_free(client_id);
976 silc_free(client_id);
978 /* If the client is one of ours, then close the connection to the
979 client now. This removes the client from all channels as well. */
980 if (packet->dst_id_type == SILC_ID_CLIENT && client->connection) {
981 sock = client->connection;
982 silc_server_free_client_data(server, NULL, client, FALSE, NULL);
983 silc_server_close_connection(server, sock);
988 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
992 /* Send the notify to local clients on the channels except to the
993 client who is killed. */
994 silc_server_send_notify_on_channels(server, client, client,
995 SILC_NOTIFY_TYPE_KILLED,
1000 /* Remove the client from all channels */
1001 silc_server_remove_from_channels(server, NULL, client, FALSE, NULL,
1007 case SILC_NOTIFY_TYPE_UMODE_CHANGE:
1009 * Save the mode of the client.
1012 SILC_LOG_DEBUG(("UMODE_CHANGE notify"));
1015 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
1018 client_id = silc_id_payload_parse_id(tmp, tmp_len);
1022 /* Get client entry */
1023 client = silc_idlist_find_client_by_id(server->global_list,
1024 client_id, TRUE, NULL);
1026 client = silc_idlist_find_client_by_id(server->local_list,
1027 client_id, TRUE, NULL);
1029 silc_free(client_id);
1033 silc_free(client_id);
1036 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
1041 SILC_GET32_MSB(client->mode, tmp);
1045 case SILC_NOTIFY_TYPE_BAN:
1050 SILC_LOG_DEBUG(("BAN notify"));
1052 /* Get Channel ID */
1053 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
1056 channel_id = silc_id_payload_parse_id(tmp, tmp_len);
1060 /* Get channel entry */
1061 channel = silc_idlist_find_channel_by_id(server->global_list,
1064 channel = silc_idlist_find_channel_by_id(server->local_list,
1067 silc_free(channel_id);
1071 silc_free(channel_id);
1073 /* Get the new ban and add it to the ban list */
1074 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
1076 if (!channel->ban_list)
1077 channel->ban_list = silc_calloc(tmp_len + 2,
1078 sizeof(*channel->ban_list));
1080 channel->ban_list = silc_realloc(channel->ban_list,
1081 sizeof(*channel->ban_list) *
1083 strlen(channel->ban_list) + 2));
1084 strncat(channel->ban_list, tmp, tmp_len);
1085 strncat(channel->ban_list, ",", 1);
1088 /* Get the ban to be removed and remove it from the list */
1089 tmp = silc_argument_get_arg_type(args, 3, &tmp_len);
1090 if (tmp && channel->ban_list) {
1091 char *start, *end, *n;
1093 if (!strcmp(channel->ban_list, tmp)) {
1094 silc_free(channel->ban_list);
1095 channel->ban_list = NULL;
1097 start = strstr(channel->ban_list, tmp);
1098 if (start && strlen(start) >= tmp_len) {
1099 end = start + tmp_len;
1100 n = silc_calloc(strlen(channel->ban_list) - tmp_len, sizeof(*n));
1101 strncat(n, channel->ban_list, start - channel->ban_list);
1102 strncat(n, end + 1, ((channel->ban_list +
1103 strlen(channel->ban_list)) - end) - 1);
1104 silc_free(channel->ban_list);
1105 channel->ban_list = n;
1112 /* Ignore rest of the notify types for now */
1113 case SILC_NOTIFY_TYPE_NONE:
1114 case SILC_NOTIFY_TYPE_MOTD:
1121 silc_notify_payload_free(payload);
1124 void silc_server_notify_list(SilcServer server,
1125 SilcSocketConnection sock,
1126 SilcPacketContext *packet)
1128 SilcPacketContext *new;
1132 SILC_LOG_DEBUG(("Processing Notify List"));
1134 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
1135 packet->src_id_type != SILC_ID_SERVER)
1138 /* Make copy of the original packet context, except for the actual
1139 data buffer, which we will here now fetch from the original buffer. */
1140 new = silc_packet_context_alloc();
1141 new->type = SILC_PACKET_NOTIFY;
1142 new->flags = packet->flags;
1143 new->src_id = packet->src_id;
1144 new->src_id_len = packet->src_id_len;
1145 new->src_id_type = packet->src_id_type;
1146 new->dst_id = packet->dst_id;
1147 new->dst_id_len = packet->dst_id_len;
1148 new->dst_id_type = packet->dst_id_type;
1150 buffer = silc_buffer_alloc(1024);
1151 new->buffer = buffer;
1153 while (packet->buffer->len) {
1154 SILC_GET16_MSB(len, packet->buffer->data + 2);
1155 if (len > packet->buffer->len)
1158 if (len > buffer->truelen) {
1159 silc_buffer_free(buffer);
1160 buffer = silc_buffer_alloc(1024 + len);
1163 silc_buffer_pull_tail(buffer, len);
1164 silc_buffer_put(buffer, packet->buffer->data, len);
1166 /* Process the Notify */
1167 silc_server_notify(server, sock, new);
1169 silc_buffer_push_tail(buffer, len);
1170 silc_buffer_pull(packet->buffer, len);
1173 silc_buffer_free(buffer);
1177 /* Received private message. This resolves the destination of the message
1178 and sends the packet. This is used by both server and router. If the
1179 destination is our locally connected client this sends the packet to
1180 the client. This may also send the message for further routing if
1181 the destination is not in our server (or router). */
1183 void silc_server_private_message(SilcServer server,
1184 SilcSocketConnection sock,
1185 SilcPacketContext *packet)
1187 SilcSocketConnection dst_sock;
1188 SilcIDListData idata;
1190 SILC_LOG_DEBUG(("Start"));
1192 if (packet->src_id_type != SILC_ID_CLIENT ||
1193 packet->dst_id_type != SILC_ID_CLIENT || !packet->dst_id)
1196 /* Get the route to the client */
1197 dst_sock = silc_server_get_client_route(server, packet->dst_id,
1198 packet->dst_id_len, NULL, &idata);
1200 /* Send IDENTIFY command reply with error status to indicate that
1201 such destination ID does not exist or is invalid */
1202 SilcBuffer idp = silc_id_payload_encode_data(packet->dst_id,
1204 packet->dst_id_type);
1208 silc_server_send_command_reply(server, sock, SILC_COMMAND_IDENTIFY,
1209 SILC_STATUS_ERR_NO_SUCH_CLIENT_ID, 0, 1,
1211 silc_buffer_free(idp);
1215 /* Send the private message */
1216 silc_server_send_private_message(server, dst_sock, idata->send_key,
1217 idata->hmac_send, idata->psn_send++,
1221 /* Received private message key packet.. This packet is never for us. It is to
1222 the client in the packet's destination ID. Sending of this sort of packet
1223 equals sending private message, ie. it is sent point to point from
1224 one client to another. */
1226 void silc_server_private_message_key(SilcServer server,
1227 SilcSocketConnection sock,
1228 SilcPacketContext *packet)
1230 SilcSocketConnection dst_sock;
1231 SilcIDListData idata;
1233 SILC_LOG_DEBUG(("Start"));
1235 if (packet->src_id_type != SILC_ID_CLIENT ||
1236 packet->dst_id_type != SILC_ID_CLIENT)
1239 if (!packet->dst_id)
1242 /* Get the route to the client */
1243 dst_sock = silc_server_get_client_route(server, packet->dst_id,
1244 packet->dst_id_len, NULL, &idata);
1248 /* Relay the packet */
1249 silc_server_relay_packet(server, dst_sock, idata->send_key,
1250 idata->hmac_send, idata->psn_send++, packet, FALSE);
1253 /* Processes incoming command reply packet. The command reply packet may
1254 be destined to one of our clients or it may directly for us. We will
1255 call the command reply routine after processing the packet. */
1257 void silc_server_command_reply(SilcServer server,
1258 SilcSocketConnection sock,
1259 SilcPacketContext *packet)
1261 SilcBuffer buffer = packet->buffer;
1262 SilcClientEntry client = NULL;
1263 SilcSocketConnection dst_sock;
1264 SilcIDListData idata;
1265 SilcClientID *id = NULL;
1267 SILC_LOG_DEBUG(("Start"));
1269 /* Source must be server or router */
1270 if (packet->src_id_type != SILC_ID_SERVER &&
1271 sock->type != SILC_SOCKET_TYPE_ROUTER)
1274 if (packet->dst_id_type == SILC_ID_CHANNEL)
1277 if (packet->dst_id_type == SILC_ID_CLIENT) {
1278 /* Destination must be one of ours */
1279 id = silc_id_str2id(packet->dst_id, packet->dst_id_len, SILC_ID_CLIENT);
1282 client = silc_idlist_find_client_by_id(server->local_list, id, TRUE, NULL);
1284 SILC_LOG_ERROR(("Cannot process command reply to unknown client"));
1290 if (packet->dst_id_type == SILC_ID_SERVER) {
1291 /* For now this must be for us */
1292 if (memcmp(packet->dst_id, server->id_string, packet->dst_id_len)) {
1293 SILC_LOG_ERROR(("Cannot process command reply to unknown server"));
1298 /* Execute command reply locally for the command */
1299 silc_server_command_reply_process(server, sock, buffer);
1301 if (packet->dst_id_type == SILC_ID_CLIENT && client && id) {
1302 /* Relay the packet to the client */
1304 dst_sock = (SilcSocketConnection)client->connection;
1305 silc_buffer_push(buffer, SILC_PACKET_HEADER_LEN + packet->src_id_len
1306 + packet->dst_id_len + packet->padlen);
1308 silc_packet_send_prepare(dst_sock, 0, 0, buffer->len);
1309 silc_buffer_put(dst_sock->outbuf, buffer->data, buffer->len);
1311 idata = (SilcIDListData)client;
1313 /* Encrypt packet */
1314 silc_packet_encrypt(idata->send_key, idata->hmac_send, idata->psn_send++,
1315 dst_sock->outbuf, buffer->len);
1317 /* Send the packet */
1318 silc_server_packet_send_real(server, dst_sock, TRUE);
1324 /* Process received channel message. The message can be originated from
1325 client or server. */
1327 void silc_server_channel_message(SilcServer server,
1328 SilcSocketConnection sock,
1329 SilcPacketContext *packet)
1331 SilcChannelEntry channel = NULL;
1332 SilcChannelID *id = NULL;
1333 void *sender = NULL;
1334 void *sender_entry = NULL;
1337 SILC_LOG_DEBUG(("Processing channel message"));
1340 if (packet->dst_id_type != SILC_ID_CHANNEL) {
1341 SILC_LOG_DEBUG(("Received bad message for channel, dropped"));
1345 /* Find channel entry */
1346 id = silc_id_str2id(packet->dst_id, packet->dst_id_len, SILC_ID_CHANNEL);
1349 channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
1351 channel = silc_idlist_find_channel_by_id(server->global_list, id, NULL);
1353 SILC_LOG_DEBUG(("Could not find channel"));
1358 /* See that this client is on the channel. If the original sender is
1359 not client (as it can be server as well) we don't do the check. */
1360 sender = silc_id_str2id(packet->src_id, packet->src_id_len,
1361 packet->src_id_type);
1364 if (packet->src_id_type == SILC_ID_CLIENT) {
1365 sender_entry = silc_idlist_find_client_by_id(server->local_list,
1366 sender, TRUE, NULL);
1367 if (!sender_entry) {
1369 sender_entry = silc_idlist_find_client_by_id(server->global_list,
1370 sender, TRUE, NULL);
1372 if (!sender_entry || !silc_server_client_on_channel(sender_entry,
1374 SILC_LOG_DEBUG(("Client not on channel"));
1378 /* If the packet is coming from router, but the client entry is
1379 local entry to us then some router is rerouting this to us and it is
1381 if (server->server_type == SILC_ROUTER &&
1382 sock->type == SILC_SOCKET_TYPE_ROUTER && local) {
1383 SILC_LOG_DEBUG(("Channel message rerouted to the sender, drop it"));
1388 /* Distribute the packet to our local clients. This will send the
1389 packet for further routing as well, if needed. */
1390 silc_server_packet_relay_to_channel(server, sock, channel, sender,
1391 packet->src_id_type, sender_entry,
1392 packet->buffer->data,
1393 packet->buffer->len, FALSE);
1402 /* Received channel key packet. We distribute the key to all of our locally
1403 connected clients on the channel. */
1405 void silc_server_channel_key(SilcServer server,
1406 SilcSocketConnection sock,
1407 SilcPacketContext *packet)
1409 SilcBuffer buffer = packet->buffer;
1410 SilcChannelEntry channel;
1412 if (packet->src_id_type != SILC_ID_SERVER ||
1413 (server->server_type == SILC_ROUTER &&
1414 sock->type == SILC_SOCKET_TYPE_ROUTER))
1417 /* Save the channel key */
1418 channel = silc_server_save_channel_key(server, buffer, NULL);
1422 /* Distribute the key to everybody who is on the channel. If we are router
1423 we will also send it to locally connected servers. */
1424 silc_server_send_channel_key(server, sock, channel, FALSE);
1426 if (server->server_type != SILC_BACKUP_ROUTER) {
1427 /* Distribute to local cell backup routers. */
1428 silc_server_backup_send(server, (SilcServerEntry)sock->user_data,
1429 SILC_PACKET_CHANNEL_KEY, 0,
1430 buffer->data, buffer->len, FALSE, TRUE);
1434 /* Received New Client packet and processes it. Creates Client ID for the
1435 client. Client becomes registered after calling this functions. */
1437 SilcClientEntry silc_server_new_client(SilcServer server,
1438 SilcSocketConnection sock,
1439 SilcPacketContext *packet)
1441 SilcBuffer buffer = packet->buffer;
1442 SilcClientEntry client;
1443 SilcClientID *client_id;
1445 SilcIDListData idata;
1446 char *username = NULL, *realname = NULL, *id_string;
1449 char *hostname, *nickname;
1452 SILC_LOG_DEBUG(("Creating new client"));
1454 if (sock->type != SILC_SOCKET_TYPE_CLIENT)
1457 /* Take client entry */
1458 client = (SilcClientEntry)sock->user_data;
1459 idata = (SilcIDListData)client;
1461 /* Remove the old cache entry */
1462 if (!silc_idcache_del_by_context(server->local_list->clients, client)) {
1463 SILC_LOG_ERROR(("Lost client's cache entry - bad thing"));
1464 silc_server_disconnect_remote(server, sock, "Server closed connection: "
1469 /* Parse incoming packet */
1470 ret = silc_buffer_unformat(buffer,
1471 SILC_STR_UI16_STRING_ALLOC(&username),
1472 SILC_STR_UI16_STRING_ALLOC(&realname),
1476 silc_free(username);
1478 silc_free(realname);
1479 silc_server_disconnect_remote(server, sock, "Server closed connection: "
1480 "Incomplete client information");
1485 silc_free(username);
1487 silc_free(realname);
1488 silc_server_disconnect_remote(server, sock, "Server closed connection: "
1489 "Incomplete client information");
1493 if (strlen(username) > 128)
1494 username[127] = '\0';
1496 nickname = strdup(username);
1498 /* Make sanity checks for the hostname of the client. If the hostname
1499 is provided in the `username' check that it is the same than the
1500 resolved hostname, or if not resolved the hostname that appears in
1501 the client's public key. If the hostname is not present then put
1502 it from the resolved name or from the public key. */
1503 if (strchr(username, '@')) {
1504 SilcPublicKeyIdentifier pident;
1505 int tlen = strcspn(username, "@");
1506 char *phostname = NULL;
1508 hostname = silc_calloc((strlen(username) - tlen) + 1, sizeof(char));
1509 memcpy(hostname, username + tlen + 1, strlen(username) - tlen - 1);
1511 if (strcmp(sock->hostname, sock->ip) &&
1512 strcmp(sock->hostname, hostname)) {
1513 silc_free(username);
1514 silc_free(hostname);
1516 silc_free(realname);
1517 silc_server_disconnect_remote(server, sock,
1518 "Server closed connection: "
1519 "Incomplete client information");
1523 pident = silc_pkcs_decode_identifier(client->data.public_key->identifier);
1525 phostname = strdup(pident->host);
1526 silc_pkcs_free_identifier(pident);
1529 if (!strcmp(sock->hostname, sock->ip) &&
1530 phostname && strcmp(phostname, hostname)) {
1531 silc_free(username);
1532 silc_free(hostname);
1534 silc_free(phostname);
1536 silc_free(realname);
1537 silc_server_disconnect_remote(server, sock,
1538 "Server closed connection: "
1539 "Incomplete client information");
1544 silc_free(phostname);
1546 /* The hostname is not present, add it. */
1548 /* XXX For now we cannot take the host name from the public key since
1549 they are not trusted or we cannot verify them as trusted. Just take
1550 what the resolved name or address is. */
1552 if (strcmp(sock->hostname, sock->ip)) {
1554 newusername = silc_calloc(strlen(username) +
1555 strlen(sock->hostname) + 2,
1556 sizeof(*newusername));
1557 strncat(newusername, username, strlen(username));
1558 strncat(newusername, "@", 1);
1559 strncat(newusername, sock->hostname, strlen(sock->hostname));
1560 silc_free(username);
1561 username = newusername;
1564 SilcPublicKeyIdentifier pident =
1565 silc_pkcs_decode_identifier(client->data.public_key->identifier);
1568 newusername = silc_calloc(strlen(username) +
1569 strlen(pident->host) + 2,
1570 sizeof(*newusername));
1571 strncat(newusername, username, strlen(username));
1572 strncat(newusername, "@", 1);
1573 strncat(newusername, pident->host, strlen(pident->host));
1574 silc_free(username);
1575 username = newusername;
1576 silc_pkcs_free_identifier(pident);
1582 /* Create Client ID */
1583 while (!silc_id_create_client_id(server, server->id, server->rng,
1584 server->md5hash, nickname, &client_id)) {
1586 snprintf(&nickname[strlen(nickname) - 1], 1, "%d", nickfail);
1589 /* Update client entry */
1590 idata->status |= SILC_IDLIST_STATUS_REGISTERED;
1591 client->nickname = nickname;
1592 client->username = username;
1593 client->userinfo = realname ? realname : strdup(" ");
1594 client->id = client_id;
1595 id_len = silc_id_get_len(client_id, SILC_ID_CLIENT);
1597 /* Add the client again to the ID cache */
1598 silc_idcache_add(server->local_list->clients, client->nickname,
1599 client_id, client, FALSE);
1601 /* Notify our router about new client on the SILC network */
1602 if (!server->standalone)
1603 silc_server_send_new_id(server, (SilcSocketConnection)
1604 server->router->connection,
1605 server->server_type == SILC_ROUTER ? TRUE : FALSE,
1606 client->id, SILC_ID_CLIENT, id_len);
1608 /* Send the new client ID to the client. */
1609 id_string = silc_id_id2str(client->id, SILC_ID_CLIENT);
1610 reply = silc_buffer_alloc(2 + 2 + id_len);
1611 silc_buffer_pull_tail(reply, SILC_BUFFER_END(reply));
1612 silc_buffer_format(reply,
1613 SILC_STR_UI_SHORT(SILC_ID_CLIENT),
1614 SILC_STR_UI_SHORT(id_len),
1615 SILC_STR_UI_XNSTRING(id_string, id_len),
1617 silc_server_packet_send(server, sock, SILC_PACKET_NEW_ID, 0,
1618 reply->data, reply->len, FALSE);
1619 silc_free(id_string);
1620 silc_buffer_free(reply);
1622 /* Send some nice info to the client */
1623 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1624 ("Welcome to the SILC Network %s",
1626 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1627 ("Your host is %s, running version %s",
1628 server->config->server_info->server_name,
1630 if (server->server_type == SILC_ROUTER) {
1631 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1632 ("There are %d clients on %d servers in SILC "
1633 "Network", server->stat.clients,
1634 server->stat.servers + 1));
1635 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1636 ("There are %d clients on %d server in our cell",
1637 server->stat.cell_clients,
1638 server->stat.cell_servers + 1));
1639 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1640 ("I have %d clients, %d channels, %d servers and "
1642 server->stat.my_clients,
1643 server->stat.my_channels,
1644 server->stat.my_servers,
1645 server->stat.my_routers));
1646 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1647 ("%d server operators and %d router operators "
1649 server->stat.my_server_ops,
1650 server->stat.my_router_ops));
1652 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1653 ("I have %d clients and %d channels formed",
1654 server->stat.my_clients,
1655 server->stat.my_channels));
1656 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1657 ("%d operators online",
1658 server->stat.my_server_ops));
1660 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1661 ("Your connection is secured with %s cipher, "
1662 "key length %d bits",
1663 idata->send_key->cipher->name,
1664 idata->send_key->cipher->key_len));
1665 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1666 ("Your current nickname is %s",
1670 silc_server_send_motd(server, sock);
1675 /* Create new server. This processes received New Server packet and
1676 saves the received Server ID. The server is our locally connected
1677 server thus we save all the information and save it to local list.
1678 This funtion can be used by both normal server and router server.
1679 If normal server uses this it means that its router has connected
1680 to the server. If router uses this it means that one of the cell's
1681 servers is connected to the router. */
1683 SilcServerEntry silc_server_new_server(SilcServer server,
1684 SilcSocketConnection sock,
1685 SilcPacketContext *packet)
1687 SilcBuffer buffer = packet->buffer;
1688 SilcServerEntry new_server, server_entry;
1689 SilcServerID *server_id;
1690 SilcIDListData idata;
1691 unsigned char *server_name, *id_string;
1692 uint16 id_len, name_len;
1696 SILC_LOG_DEBUG(("Creating new server"));
1698 if (sock->type != SILC_SOCKET_TYPE_SERVER &&
1699 sock->type != SILC_SOCKET_TYPE_ROUTER)
1702 /* Take server entry */
1703 new_server = (SilcServerEntry)sock->user_data;
1704 idata = (SilcIDListData)new_server;
1706 /* Remove the old cache entry */
1707 if (!silc_idcache_del_by_context(server->local_list->servers, new_server)) {
1708 silc_idcache_del_by_context(server->global_list->servers, new_server);
1712 /* Parse the incoming packet */
1713 ret = silc_buffer_unformat(buffer,
1714 SILC_STR_UI16_NSTRING_ALLOC(&id_string, &id_len),
1715 SILC_STR_UI16_NSTRING_ALLOC(&server_name,
1720 silc_free(id_string);
1722 silc_free(server_name);
1726 if (id_len > buffer->len) {
1727 silc_free(id_string);
1728 silc_free(server_name);
1733 server_name[255] = '\0';
1736 server_id = silc_id_str2id(id_string, id_len, SILC_ID_SERVER);
1738 silc_free(id_string);
1739 silc_free(server_name);
1742 silc_free(id_string);
1744 /* Check that we do not have this ID already */
1745 server_entry = silc_idlist_find_server_by_id(server->local_list,
1746 server_id, TRUE, NULL);
1748 silc_idcache_del_by_context(server->local_list->servers, server_entry);
1750 server_entry = silc_idlist_find_server_by_id(server->global_list,
1751 server_id, TRUE, NULL);
1753 silc_idcache_del_by_context(server->global_list->servers, server_entry);
1756 /* Update server entry */
1757 idata->status |= SILC_IDLIST_STATUS_REGISTERED;
1758 new_server->server_name = server_name;
1759 new_server->id = server_id;
1761 SILC_LOG_DEBUG(("New server id(%s)",
1762 silc_id_render(server_id, SILC_ID_SERVER)));
1764 /* Add again the entry to the ID cache. */
1765 silc_idcache_add(local ? server->local_list->servers :
1766 server->global_list->servers, server_name, server_id,
1769 /* Distribute the information about new server in the SILC network
1770 to our router. If we are normal server we won't send anything
1771 since this connection must be our router connection. */
1772 if (server->server_type == SILC_ROUTER && !server->standalone &&
1773 server->router->connection != sock)
1774 silc_server_send_new_id(server, server->router->connection,
1775 TRUE, new_server->id, SILC_ID_SERVER,
1776 silc_id_get_len(server_id, SILC_ID_SERVER));
1778 if (server->server_type == SILC_ROUTER)
1779 server->stat.cell_servers++;
1781 /* Check whether this router connection has been replaced by an
1782 backup router. If it has been then we'll disable the server and will
1783 ignore everything it will send until the backup router resuming
1784 protocol has been completed. */
1785 if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
1786 silc_server_backup_replaced_get(server, server_id, NULL)) {
1787 /* Send packet to the server indicating that it cannot use this
1788 connection as it has been replaced by backup router. */
1789 SilcBuffer packet = silc_buffer_alloc(2);
1790 silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
1791 silc_buffer_format(packet,
1792 SILC_STR_UI_CHAR(SILC_SERVER_BACKUP_REPLACED),
1793 SILC_STR_UI_CHAR(0),
1795 silc_server_packet_send(server, sock,
1796 SILC_PACKET_RESUME_ROUTER, 0,
1797 packet->data, packet->len, TRUE);
1798 silc_buffer_free(packet);
1800 /* Mark the router disabled. The data sent earlier will go but nothing
1801 after this does not go to this connection. */
1802 idata->status |= SILC_IDLIST_STATUS_DISABLED;
1804 /* If it is router announce our stuff to it. */
1805 if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
1806 server->server_type == SILC_ROUTER) {
1807 silc_server_announce_servers(server, FALSE, 0, sock);
1808 silc_server_announce_clients(server, 0, sock);
1809 silc_server_announce_channels(server, 0, sock);
1816 /* Processes incoming New ID packet. New ID Payload is used to distribute
1817 information about newly registered clients and servers. */
1819 static void silc_server_new_id_real(SilcServer server,
1820 SilcSocketConnection sock,
1821 SilcPacketContext *packet,
1824 SilcBuffer buffer = packet->buffer;
1826 SilcServerEntry router, server_entry;
1827 SilcSocketConnection router_sock;
1832 SILC_LOG_DEBUG(("Processing new ID"));
1834 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
1835 server->server_type == SILC_SERVER ||
1836 packet->src_id_type != SILC_ID_SERVER)
1839 idp = silc_id_payload_parse(buffer);
1843 id_type = silc_id_payload_get_type(idp);
1845 /* Normal server cannot have other normal server connections */
1846 server_entry = (SilcServerEntry)sock->user_data;
1847 if (id_type == SILC_ID_SERVER && sock->type == SILC_SOCKET_TYPE_SERVER &&
1848 server_entry->server_type == SILC_SERVER)
1851 id = silc_id_payload_get_id(idp);
1855 /* If the packet is coming from server then use the sender as the
1856 origin of the the packet. If it came from router then check the real
1857 sender of the packet and use that as the origin. */
1858 if (sock->type == SILC_SOCKET_TYPE_SERVER) {
1859 id_list = server->local_list;
1861 router = sock->user_data;
1863 /* If the sender is backup router and ID is server (and we are not
1864 backup router) then switch the entry to global list. */
1865 if (server_entry->server_type == SILC_BACKUP_ROUTER &&
1866 id_type == SILC_ID_SERVER &&
1867 server->id_entry->server_type != SILC_BACKUP_ROUTER) {
1868 id_list = server->global_list;
1869 router_sock = server->router ? server->router->connection : sock;
1872 void *sender_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1873 packet->src_id_type);
1874 router = silc_idlist_find_server_by_id(server->global_list,
1875 sender_id, TRUE, NULL);
1877 router = silc_idlist_find_server_by_id(server->local_list,
1878 sender_id, TRUE, NULL);
1879 silc_free(sender_id);
1883 id_list = server->global_list;
1887 case SILC_ID_CLIENT:
1889 SilcClientEntry entry;
1891 /* Check that we do not have this client already */
1892 entry = silc_idlist_find_client_by_id(server->global_list,
1893 id, server->server_type,
1896 entry = silc_idlist_find_client_by_id(server->local_list,
1897 id, server->server_type,
1900 SILC_LOG_DEBUG(("Ignoring client that we already have"));
1904 SILC_LOG_DEBUG(("New client id(%s) from [%s] %s",
1905 silc_id_render(id, SILC_ID_CLIENT),
1906 sock->type == SILC_SOCKET_TYPE_SERVER ?
1907 "Server" : "Router", sock->hostname));
1909 /* As a router we keep information of all global information in our
1910 global list. Cell wide information however is kept in the local
1912 entry = silc_idlist_add_client(id_list, NULL, NULL, NULL,
1915 SILC_LOG_ERROR(("Could not add new client to the ID Cache"));
1917 /* Inform the sender that the ID is not usable */
1918 silc_server_send_notify_signoff(server, sock, FALSE, id, NULL);
1921 entry->nickname = NULL;
1922 entry->data.status |= SILC_IDLIST_STATUS_REGISTERED;
1924 if (sock->type == SILC_SOCKET_TYPE_SERVER)
1925 server->stat.cell_clients++;
1926 server->stat.clients++;
1930 case SILC_ID_SERVER:
1932 SilcServerEntry entry;
1934 /* If the ID is mine, ignore it. */
1935 if (SILC_ID_SERVER_COMPARE(id, server->id)) {
1936 SILC_LOG_DEBUG(("Ignoring my own ID as new ID"));
1940 /* If the ID is the sender's ID, ignore it (we have it already) */
1941 if (SILC_ID_SERVER_COMPARE(id, router->id)) {
1942 SILC_LOG_DEBUG(("Ignoring sender's own ID"));
1946 /* Check that we do not have this server already */
1947 entry = silc_idlist_find_server_by_id(server->global_list,
1948 id, server->server_type,
1951 entry = silc_idlist_find_server_by_id(server->local_list,
1952 id, server->server_type,
1955 SILC_LOG_DEBUG(("Ignoring server that we already have"));
1959 SILC_LOG_DEBUG(("New server id(%s) from [%s] %s",
1960 silc_id_render(id, SILC_ID_SERVER),
1961 sock->type == SILC_SOCKET_TYPE_SERVER ?
1962 "Server" : "Router", sock->hostname));
1964 /* As a router we keep information of all global information in our
1965 global list. Cell wide information however is kept in the local
1967 entry = silc_idlist_add_server(id_list, NULL, 0, id, router,
1970 SILC_LOG_ERROR(("Could not add new server to the ID Cache"));
1973 entry->data.status |= SILC_IDLIST_STATUS_REGISTERED;
1975 if (sock->type == SILC_SOCKET_TYPE_SERVER)
1976 server->stat.cell_servers++;
1977 server->stat.servers++;
1981 case SILC_ID_CHANNEL:
1982 SILC_LOG_ERROR(("Channel cannot be registered with NEW_ID packet"));
1991 /* If the sender of this packet is server and we are router we need to
1992 broadcast this packet to other routers in the network. */
1993 if (broadcast && !server->standalone && server->server_type == SILC_ROUTER &&
1994 sock->type == SILC_SOCKET_TYPE_SERVER &&
1995 !(packet->flags & SILC_PACKET_FLAG_BROADCAST)) {
1996 SILC_LOG_DEBUG(("Broadcasting received New ID packet"));
1997 silc_server_packet_send(server, server->router->connection,
1999 packet->flags | SILC_PACKET_FLAG_BROADCAST,
2000 buffer->data, buffer->len, FALSE);
2001 silc_server_backup_send(server, (SilcServerEntry)sock->user_data,
2002 packet->type, packet->flags,
2003 packet->buffer->data, packet->buffer->len,
2008 silc_id_payload_free(idp);
2012 /* Processes incoming New ID packet. New ID Payload is used to distribute
2013 information about newly registered clients and servers. */
2015 void silc_server_new_id(SilcServer server, SilcSocketConnection sock,
2016 SilcPacketContext *packet)
2018 silc_server_new_id_real(server, sock, packet, TRUE);
2021 /* Receoved New Id List packet, list of New ID payloads inside one
2022 packet. Process the New ID payloads one by one. */
2024 void silc_server_new_id_list(SilcServer server, SilcSocketConnection sock,
2025 SilcPacketContext *packet)
2027 SilcPacketContext *new_id;
2031 SILC_LOG_DEBUG(("Processing New ID List"));
2033 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
2034 packet->src_id_type != SILC_ID_SERVER)
2037 /* If the sender of this packet is server and we are router we need to
2038 broadcast this packet to other routers in the network. Broadcast
2039 this list packet instead of multiple New ID packets. */
2040 if (!server->standalone && server->server_type == SILC_ROUTER &&
2041 sock->type == SILC_SOCKET_TYPE_SERVER &&
2042 !(packet->flags & SILC_PACKET_FLAG_BROADCAST)) {
2043 SILC_LOG_DEBUG(("Broadcasting received New ID List packet"));
2044 silc_server_packet_send(server, server->router->connection,
2046 packet->flags | SILC_PACKET_FLAG_BROADCAST,
2047 packet->buffer->data, packet->buffer->len, FALSE);
2048 silc_server_backup_send(server, (SilcServerEntry)sock->user_data,
2049 packet->type, packet->flags,
2050 packet->buffer->data, packet->buffer->len,
2054 /* Make copy of the original packet context, except for the actual
2055 data buffer, which we will here now fetch from the original buffer. */
2056 new_id = silc_packet_context_alloc();
2057 new_id->type = SILC_PACKET_NEW_ID;
2058 new_id->flags = packet->flags;
2059 new_id->src_id = packet->src_id;
2060 new_id->src_id_len = packet->src_id_len;
2061 new_id->src_id_type = packet->src_id_type;
2062 new_id->dst_id = packet->dst_id;
2063 new_id->dst_id_len = packet->dst_id_len;
2064 new_id->dst_id_type = packet->dst_id_type;
2066 idp = silc_buffer_alloc(256);
2067 new_id->buffer = idp;
2069 while (packet->buffer->len) {
2070 SILC_GET16_MSB(id_len, packet->buffer->data + 2);
2071 if ((id_len > packet->buffer->len) ||
2072 (id_len > idp->truelen))
2075 silc_buffer_pull_tail(idp, 4 + id_len);
2076 silc_buffer_put(idp, packet->buffer->data, 4 + id_len);
2078 /* Process the New ID */
2079 silc_server_new_id_real(server, sock, new_id, FALSE);
2081 silc_buffer_push_tail(idp, 4 + id_len);
2082 silc_buffer_pull(packet->buffer, 4 + id_len);
2085 silc_buffer_free(idp);
2089 /* Received New Channel packet. Information about new channels in the
2090 network are distributed using this packet. Save the information about
2091 the new channel. This usually comes from router but also normal server
2092 can send this to notify channels it has when it connects to us. */
2094 void silc_server_new_channel(SilcServer server,
2095 SilcSocketConnection sock,
2096 SilcPacketContext *packet)
2098 SilcChannelPayload payload;
2099 SilcChannelID *channel_id;
2105 SilcServerEntry server_entry;
2106 SilcChannelEntry channel;
2108 SILC_LOG_DEBUG(("Processing New Channel"));
2110 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
2111 packet->src_id_type != SILC_ID_SERVER ||
2112 server->server_type == SILC_SERVER)
2115 /* Parse the channel payload */
2116 payload = silc_channel_payload_parse(packet->buffer);
2120 /* Get the channel ID */
2121 channel_id = silc_channel_get_id_parse(payload);
2123 silc_channel_payload_free(payload);
2127 channel_name = silc_channel_get_name(payload, &name_len);
2129 channel_name[255] = '\0';
2131 id = silc_channel_get_id(payload, &id_len);
2133 server_entry = (SilcServerEntry)sock->user_data;
2135 if (sock->type == SILC_SOCKET_TYPE_ROUTER) {
2136 /* Add the channel to global list as it is coming from router. It
2137 cannot be our own channel as it is coming from router. */
2139 /* Check that we don't already have this channel */
2140 channel = silc_idlist_find_channel_by_name(server->local_list,
2141 channel_name, NULL);
2143 channel = silc_idlist_find_channel_by_name(server->global_list,
2144 channel_name, NULL);
2146 SILC_LOG_DEBUG(("New channel id(%s) from [Router] %s",
2147 silc_id_render(channel_id, SILC_ID_CHANNEL),
2150 silc_idlist_add_channel(server->global_list, strdup(channel_name),
2151 0, channel_id, sock->user_data, NULL, NULL);
2152 server->stat.channels++;
2155 /* The channel is coming from our server, thus it is in our cell
2156 we will add it to our local list. */
2159 SILC_LOG_DEBUG(("Channel id(%s) from [Server] %s",
2160 silc_id_render(channel_id, SILC_ID_CHANNEL),
2163 /* Check that we don't already have this channel */
2164 channel = silc_idlist_find_channel_by_name(server->local_list,
2165 channel_name, NULL);
2167 channel = silc_idlist_find_channel_by_name(server->global_list,
2168 channel_name, NULL);
2170 /* If the channel does not exist, then create it. This creates a new
2171 key to the channel as well that we will send to the server. */
2173 /* The protocol says that the Channel ID's IP address must be based
2174 on the router's IP address. Check whether the ID is based in our
2175 IP and if it is not then create a new ID and enforce the server
2176 to switch the ID. */
2177 if (server_entry->server_type != SILC_BACKUP_ROUTER &&
2178 !SILC_ID_COMPARE(channel_id, server->id, server->id->ip.data_len)) {
2180 SILC_LOG_DEBUG(("Forcing the server to change Channel ID"));
2182 if (silc_id_create_channel_id(server, server->id, server->rng, &tmp)) {
2183 silc_server_send_notify_channel_change(server, sock, FALSE,
2185 silc_free(channel_id);
2190 /* Create the channel with the provided Channel ID */
2191 channel = silc_server_create_new_channel_with_id(server, NULL, NULL,
2195 silc_channel_payload_free(payload);
2196 silc_free(channel_id);
2200 /* Get the mode and set it to the channel */
2201 channel->mode = silc_channel_get_mode(payload);
2203 /* Send the new channel key to the server */
2204 chk = silc_channel_key_payload_encode(id_len, id,
2205 strlen(channel->channel_key->
2207 channel->channel_key->cipher->name,
2208 channel->key_len / 8,
2210 silc_server_packet_send(server, sock, SILC_PACKET_CHANNEL_KEY, 0,
2211 chk->data, chk->len, FALSE);
2212 silc_buffer_free(chk);
2215 /* The channel exist by that name, check whether the ID's match.
2216 If they don't then we'll force the server to use the ID we have.
2217 We also create a new key for the channel. */
2218 SilcBuffer users = NULL, users_modes = NULL;
2220 if (!SILC_ID_CHANNEL_COMPARE(channel_id, channel->id)) {
2221 /* They don't match, send CHANNEL_CHANGE notify to the server to
2222 force the ID change. */
2223 SILC_LOG_DEBUG(("Forcing the server to change Channel ID"));
2224 silc_server_send_notify_channel_change(server, sock, FALSE,
2225 channel_id, channel->id);
2228 /* If the mode is different from what we have then enforce the
2230 mode = silc_channel_get_mode(payload);
2231 if (channel->mode != mode) {
2232 SILC_LOG_DEBUG(("Forcing the server to change channel mode"));
2233 silc_server_send_notify_cmode(server, sock, FALSE, channel,
2234 channel->mode, server->id,
2236 channel->cipher, channel->hmac_name);
2239 /* Create new key for the channel and send it to the server and
2240 everybody else possibly on the channel. */
2242 if (!(channel->mode & SILC_CHANNEL_MODE_PRIVKEY)) {
2243 if (!silc_server_create_channel_key(server, channel, 0))
2246 /* Send to the channel */
2247 silc_server_send_channel_key(server, sock, channel, FALSE);
2248 id = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
2249 id_len = SILC_ID_CHANNEL_LEN;
2251 /* Send to the server */
2252 chk = silc_channel_key_payload_encode(id_len, id,
2253 strlen(channel->channel_key->
2255 channel->channel_key->
2257 channel->key_len / 8,
2259 silc_server_packet_send(server, sock, SILC_PACKET_CHANNEL_KEY, 0,
2260 chk->data, chk->len, FALSE);
2261 silc_buffer_free(chk);
2265 silc_free(channel_id);
2267 /* Since the channel is coming from server and we also know about it
2268 then send the JOIN notify to the server so that it see's our
2269 users on the channel "joining" the channel. */
2270 silc_server_announce_get_channel_users(server, channel, &users,
2273 silc_buffer_push(users, users->data - users->head);
2274 silc_server_packet_send(server, sock,
2275 SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
2276 users->data, users->len, FALSE);
2277 silc_buffer_free(users);
2280 silc_buffer_push(users_modes, users_modes->data - users_modes->head);
2281 silc_server_packet_send_dest(server, sock,
2282 SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
2283 channel->id, SILC_ID_CHANNEL,
2285 users_modes->len, FALSE);
2286 silc_buffer_free(users_modes);
2291 silc_channel_payload_free(payload);
2294 /* Received New Channel List packet, list of New Channel List payloads inside
2295 one packet. Process the New Channel payloads one by one. */
2297 void silc_server_new_channel_list(SilcServer server,
2298 SilcSocketConnection sock,
2299 SilcPacketContext *packet)
2301 SilcPacketContext *new;
2305 SILC_LOG_DEBUG(("Processing New Channel List"));
2307 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
2308 packet->src_id_type != SILC_ID_SERVER ||
2309 server->server_type == SILC_SERVER)
2312 /* If the sender of this packet is server and we are router we need to
2313 broadcast this packet to other routers in the network. Broadcast
2314 this list packet instead of multiple New Channel packets. */
2315 if (!server->standalone && server->server_type == SILC_ROUTER &&
2316 sock->type == SILC_SOCKET_TYPE_SERVER &&
2317 !(packet->flags & SILC_PACKET_FLAG_BROADCAST)) {
2318 SILC_LOG_DEBUG(("Broadcasting received New Channel List packet"));
2319 silc_server_packet_send(server, server->router->connection,
2321 packet->flags | SILC_PACKET_FLAG_BROADCAST,
2322 packet->buffer->data, packet->buffer->len, FALSE);
2323 silc_server_backup_send(server, (SilcServerEntry)sock->user_data,
2324 packet->type, packet->flags,
2325 packet->buffer->data, packet->buffer->len,
2329 /* Make copy of the original packet context, except for the actual
2330 data buffer, which we will here now fetch from the original buffer. */
2331 new = silc_packet_context_alloc();
2332 new->type = SILC_PACKET_NEW_CHANNEL;
2333 new->flags = packet->flags;
2334 new->src_id = packet->src_id;
2335 new->src_id_len = packet->src_id_len;
2336 new->src_id_type = packet->src_id_type;
2337 new->dst_id = packet->dst_id;
2338 new->dst_id_len = packet->dst_id_len;
2339 new->dst_id_type = packet->dst_id_type;
2341 buffer = silc_buffer_alloc(512);
2342 new->buffer = buffer;
2344 while (packet->buffer->len) {
2345 SILC_GET16_MSB(len1, packet->buffer->data);
2346 if ((len1 > packet->buffer->len) ||
2347 (len1 > buffer->truelen))
2350 SILC_GET16_MSB(len2, packet->buffer->data + 2 + len1);
2351 if ((len2 > packet->buffer->len) ||
2352 (len2 > buffer->truelen))
2355 silc_buffer_pull_tail(buffer, 8 + len1 + len2);
2356 silc_buffer_put(buffer, packet->buffer->data, 8 + len1 + len2);
2358 /* Process the New Channel */
2359 silc_server_new_channel(server, sock, new);
2361 silc_buffer_push_tail(buffer, 8 + len1 + len2);
2362 silc_buffer_pull(packet->buffer, 8 + len1 + len2);
2365 silc_buffer_free(buffer);
2369 /* Received key agreement packet. This packet is never for us. It is to
2370 the client in the packet's destination ID. Sending of this sort of packet
2371 equals sending private message, ie. it is sent point to point from
2372 one client to another. */
2374 void silc_server_key_agreement(SilcServer server,
2375 SilcSocketConnection sock,
2376 SilcPacketContext *packet)
2378 SilcSocketConnection dst_sock;
2379 SilcIDListData idata;
2381 SILC_LOG_DEBUG(("Start"));
2383 if (packet->src_id_type != SILC_ID_CLIENT ||
2384 packet->dst_id_type != SILC_ID_CLIENT)
2387 if (!packet->dst_id)
2390 /* Get the route to the client */
2391 dst_sock = silc_server_get_client_route(server, packet->dst_id,
2392 packet->dst_id_len, NULL, &idata);
2396 /* Relay the packet */
2397 silc_server_relay_packet(server, dst_sock, idata->send_key,
2398 idata->hmac_send, idata->psn_send++,
2402 /* Received connection auth request packet that is used during connection
2403 phase to resolve the mandatory authentication method. This packet can
2404 actually be received at anytime but usually it is used only during
2405 the connection authentication phase. Now, protocol says that this packet
2406 can come from client or server, however, we support only this coming
2407 from client and expect that server always knows what authentication
2410 void silc_server_connection_auth_request(SilcServer server,
2411 SilcSocketConnection sock,
2412 SilcPacketContext *packet)
2414 SilcServerConfigSectionClientConnection *client = NULL;
2417 SilcAuthMethod auth_meth;
2419 SILC_LOG_DEBUG(("Start"));
2421 if (packet->src_id_type && packet->src_id_type != SILC_ID_CLIENT)
2424 /* Parse the payload */
2425 ret = silc_buffer_unformat(packet->buffer,
2426 SILC_STR_UI_SHORT(&conn_type),
2427 SILC_STR_UI_SHORT(NULL),
2432 if (conn_type != SILC_SOCKET_TYPE_CLIENT)
2435 /* Get the authentication method for the client */
2436 auth_meth = SILC_AUTH_NONE;
2437 port = server->sockets[server->sock]->port; /* Listenning port */
2438 client = silc_server_config_find_client_conn(server->config,
2442 client = silc_server_config_find_client_conn(server->config,
2446 auth_meth = client->auth_meth;
2448 /* Send it back to the client */
2449 silc_server_send_connection_auth_request(server, sock,
2454 /* Received REKEY packet. The sender of the packet wants to regenerate
2455 its session keys. This starts the REKEY protocol. */
2457 void silc_server_rekey(SilcServer server,
2458 SilcSocketConnection sock,
2459 SilcPacketContext *packet)
2461 SilcProtocol protocol;
2462 SilcServerRekeyInternalContext *proto_ctx;
2463 SilcIDListData idata = (SilcIDListData)sock->user_data;
2465 SILC_LOG_DEBUG(("Start"));
2467 /* Allocate internal protocol context. This is sent as context
2469 proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
2470 proto_ctx->server = (void *)server;
2471 proto_ctx->sock = sock;
2472 proto_ctx->responder = TRUE;
2473 proto_ctx->pfs = idata->rekey->pfs;
2475 /* Perform rekey protocol. Will call the final callback after the
2476 protocol is over. */
2477 silc_protocol_alloc(SILC_PROTOCOL_SERVER_REKEY,
2478 &protocol, proto_ctx, silc_server_rekey_final);
2479 sock->protocol = protocol;
2481 if (proto_ctx->pfs == FALSE)
2482 /* Run the protocol */
2483 silc_protocol_execute(protocol, server->schedule, 0, 0);
2486 /* Received file transger packet. This packet is never for us. It is to
2487 the client in the packet's destination ID. Sending of this sort of packet
2488 equals sending private message, ie. it is sent point to point from
2489 one client to another. */
2491 void silc_server_ftp(SilcServer server,
2492 SilcSocketConnection sock,
2493 SilcPacketContext *packet)
2495 SilcSocketConnection dst_sock;
2496 SilcIDListData idata;
2498 SILC_LOG_DEBUG(("Start"));
2500 if (packet->src_id_type != SILC_ID_CLIENT ||
2501 packet->dst_id_type != SILC_ID_CLIENT)
2504 if (!packet->dst_id)
2507 /* Get the route to the client */
2508 dst_sock = silc_server_get_client_route(server, packet->dst_id,
2509 packet->dst_id_len, NULL, &idata);
2513 /* Relay the packet */
2514 silc_server_relay_packet(server, dst_sock, idata->send_key,
2515 idata->hmac_send, idata->psn_send++,