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;
41 SilcClientID *client_id, *client_id2;
42 SilcChannelEntry channel;
43 SilcClientEntry client;
44 SilcChannelClientEntry chl;
45 SilcIDCacheEntry cache;
50 SILC_LOG_DEBUG(("Start"));
52 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
53 packet->src_id_type != SILC_ID_SERVER)
59 /* If the packet is destined directly to a client then relay the packet
60 before processing it. */
61 if (packet->dst_id_type == SILC_ID_CLIENT) {
63 SilcSocketConnection dst_sock;
65 /* Get the route to the client */
66 dst_sock = silc_server_get_client_route(server, packet->dst_id,
67 packet->dst_id_len, &idata);
69 /* Relay the packet */
70 silc_server_relay_packet(server, dst_sock, idata->send_key,
71 idata->hmac, packet, TRUE);
74 /* If we are router and this packet is not already broadcast packet
75 we will broadcast it. The sending socket really cannot be router or
76 the router is buggy. If this packet is coming from router then it must
77 have the broadcast flag set already and we won't do anything. */
78 if (!server->standalone && server->server_type == SILC_ROUTER &&
79 sock->type == SILC_SOCKET_TYPE_SERVER &&
80 !(packet->flags & SILC_PACKET_FLAG_BROADCAST)) {
81 SILC_LOG_DEBUG(("Broadcasting received Notify packet"));
82 silc_server_packet_send(server, server->router->connection, packet->type,
83 packet->flags | SILC_PACKET_FLAG_BROADCAST,
84 packet->buffer->data, packet->buffer->len, FALSE);
87 payload = silc_notify_payload_parse(packet->buffer);
91 type = silc_notify_get_type(payload);
92 args = silc_notify_get_args(payload);
97 case SILC_NOTIFY_TYPE_JOIN:
99 * Distribute the notify to local clients on the channel
101 SILC_LOG_DEBUG(("JOIN notify"));
104 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
107 channel_id = silc_id_payload_parse_id(tmp, tmp_len);
111 /* Get channel entry */
112 channel = silc_idlist_find_channel_by_id(server->global_list,
115 channel = silc_idlist_find_channel_by_id(server->local_list,
118 silc_free(channel_id);
122 silc_free(channel_id);
125 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
128 client_id = silc_id_payload_parse_id(tmp, tmp_len);
132 /* Send to channel */
133 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
134 FALSE, packet->buffer->data,
135 packet->buffer->len, FALSE);
137 /* If the the client is not in local list we check global list (ie. the
138 channel will be global channel) and if it does not exist then create
139 entry for the client. */
140 client = silc_idlist_find_client_by_id(server->global_list,
143 client = silc_idlist_find_client_by_id(server->local_list,
146 /* If router did not find the client the it is bogus */
147 if (server->server_type == SILC_ROUTER)
151 silc_idlist_add_client(server->global_list, NULL, 0, NULL, NULL,
152 silc_id_dup(client_id, SILC_ID_CLIENT),
153 sock->user_data, NULL);
155 silc_free(client_id);
159 client->data.registered = TRUE;
163 /* Do not add client to channel if it is there already */
164 if (silc_server_client_on_channel(client, channel))
167 if (server->server_type == SILC_SERVER &&
168 sock->type == SILC_SOCKET_TYPE_ROUTER)
169 /* The channel is global now */
170 channel->global_users = TRUE;
172 /* JOIN the global client to the channel (local clients (if router
173 created the channel) is joined in the pending JOIN command). */
174 chl = silc_calloc(1, sizeof(*chl));
175 chl->client = client;
176 chl->channel = channel;
177 silc_list_add(channel->user_list, chl);
178 silc_list_add(client->channels, chl);
179 silc_free(client_id);
183 case SILC_NOTIFY_TYPE_LEAVE:
185 * Distribute the notify to local clients on the channel
187 SILC_LOG_DEBUG(("LEAVE notify"));
189 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
190 packet->dst_id_type);
194 /* Get channel entry */
195 channel = silc_idlist_find_channel_by_id(server->global_list,
198 channel = silc_idlist_find_channel_by_id(server->local_list,
201 silc_free(channel_id);
207 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
209 silc_free(channel_id);
212 client_id = silc_id_payload_parse_id(tmp, tmp_len);
214 silc_free(channel_id);
218 /* Send to channel */
219 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
220 FALSE, packet->buffer->data,
221 packet->buffer->len, FALSE);
223 /* Get client entry */
224 client = silc_idlist_find_client_by_id(server->global_list,
227 client = silc_idlist_find_client_by_id(server->local_list,
230 silc_free(client_id);
231 silc_free(channel_id);
235 silc_free(client_id);
237 /* Remove the user from channel */
238 silc_server_remove_from_one_channel(server, sock, channel, client, FALSE);
241 case SILC_NOTIFY_TYPE_SIGNOFF:
243 * Distribute the notify to local clients on the channel
245 SILC_LOG_DEBUG(("SIGNOFF notify"));
248 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
251 client_id = silc_id_payload_parse_id(tmp, tmp_len);
255 /* Get client entry */
256 client = silc_idlist_find_client_by_id(server->global_list,
259 client = silc_idlist_find_client_by_id(server->local_list,
262 silc_free(client_id);
266 silc_free(client_id);
268 /* Get signoff message */
269 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
273 /* Remove the client from all channels */
274 silc_server_remove_from_channels(server, NULL, client, TRUE, tmp, TRUE);
276 client->data.registered = FALSE;
277 cache->expire = SILC_ID_CACHE_EXPIRE_DEF;
280 /* Remove the client entry */
281 if (!silc_idlist_del_client(server->global_list, client))
282 silc_idlist_del_client(server->local_list, client);
286 case SILC_NOTIFY_TYPE_TOPIC_SET:
288 * Distribute the notify to local clients on the channel
291 SILC_LOG_DEBUG(("TOPIC SET notify"));
293 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
294 packet->dst_id_type);
298 /* Get channel entry */
299 channel = silc_idlist_find_channel_by_id(server->global_list,
302 channel = silc_idlist_find_channel_by_id(server->local_list,
305 silc_free(channel_id);
311 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
313 silc_free(channel_id);
318 silc_free(channel->topic);
319 channel->topic = silc_calloc(tmp_len, sizeof(*channel->topic));
320 memcpy(channel->topic, tmp, tmp_len);
322 /* Send the same notify to the channel */
323 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
324 FALSE, packet->buffer->data,
325 packet->buffer->len, FALSE);
326 silc_free(channel_id);
329 case SILC_NOTIFY_TYPE_NICK_CHANGE:
332 * Distribute the notify to local clients on the channel
334 unsigned char *id, *id2;
336 SILC_LOG_DEBUG(("NICK CHANGE notify"));
338 /* Get old client ID */
339 id = silc_argument_get_arg_type(args, 1, &tmp_len);
342 client_id = silc_id_payload_parse_id(id, tmp_len);
346 /* Get new client ID */
347 id2 = silc_argument_get_arg_type(args, 2, &tmp_len);
350 client_id2 = silc_id_payload_parse_id(id2, tmp_len);
354 SILC_LOG_DEBUG(("Old Client ID id(%s)",
355 silc_id_render(client_id, SILC_ID_CLIENT)));
356 SILC_LOG_DEBUG(("New Client ID id(%s)",
357 silc_id_render(client_id2, SILC_ID_CLIENT)));
359 /* Replace the Client ID */
360 client = silc_idlist_replace_client_id(server->global_list, client_id,
363 client = silc_idlist_replace_client_id(server->local_list, client_id,
367 /* The nickname is not valid anymore, set it NULL. This causes that
368 the nickname will be queried if someone wants to know it. */
369 if (client->nickname)
370 silc_free(client->nickname);
371 client->nickname = NULL;
373 /* Send the NICK_CHANGE notify type to local clients on the channels
374 this client is joined to. */
375 silc_server_send_notify_on_channels(server, NULL, client,
376 SILC_NOTIFY_TYPE_NICK_CHANGE, 2,
381 silc_free(client_id);
383 silc_free(client_id2);
387 case SILC_NOTIFY_TYPE_CMODE_CHANGE:
389 * Distribute the notify to local clients on the channel
392 SILC_LOG_DEBUG(("CMODE CHANGE notify"));
394 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
395 packet->dst_id_type);
399 /* Get channel entry */
400 channel = silc_idlist_find_channel_by_id(server->global_list,
403 channel = silc_idlist_find_channel_by_id(server->local_list,
406 silc_free(channel_id);
411 /* Send the same notify to the channel */
412 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
413 FALSE, packet->buffer->data,
414 packet->buffer->len, FALSE);
417 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
419 silc_free(channel_id);
423 SILC_GET32_MSB(mode, tmp);
426 channel->mode = mode;
427 silc_free(channel_id);
430 case SILC_NOTIFY_TYPE_CUMODE_CHANGE:
432 * Distribute the notify to local clients on the channel
435 SILC_LOG_DEBUG(("CUMODE CHANGE notify"));
437 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
438 packet->dst_id_type);
442 /* Get channel entry */
443 channel = silc_idlist_find_channel_by_id(server->global_list,
446 channel = silc_idlist_find_channel_by_id(server->local_list,
449 silc_free(channel_id);
455 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
457 silc_free(channel_id);
461 SILC_GET32_MSB(mode, tmp);
463 /* Get target client */
464 tmp = silc_argument_get_arg_type(args, 3, &tmp_len);
467 client_id = silc_id_payload_parse_id(tmp, tmp_len);
471 /* Get client entry */
472 client = silc_idlist_find_client_by_id(server->global_list,
475 client = silc_idlist_find_client_by_id(server->local_list,
478 silc_free(client_id);
482 silc_free(client_id);
484 /* Get entry to the channel user list */
485 silc_list_start(channel->user_list);
486 while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END)
487 if (chl->client == client) {
488 /* Change the mode */
493 /* Send the same notify to the channel */
494 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
495 FALSE, packet->buffer->data,
496 packet->buffer->len, FALSE);
497 silc_free(channel_id);
500 case SILC_NOTIFY_TYPE_INVITE:
501 SILC_LOG_DEBUG(("INVITE notify (not-impl XXX)"));
504 case SILC_NOTIFY_TYPE_CHANNEL_CHANGE:
505 SILC_LOG_DEBUG(("CHANNEL CHANGE notify (not-impl XXX)"));
508 case SILC_NOTIFY_TYPE_SERVER_SIGNOFF:
509 SILC_LOG_DEBUG(("SERVER SIGNOFF notify (not-impl XXX)"));
512 case SILC_NOTIFY_TYPE_KICKED:
514 * Distribute the notify to local clients on the channel
517 SILC_LOG_DEBUG(("KICKED notify"));
519 channel_id = silc_id_str2id(packet->dst_id, packet->dst_id_len,
520 packet->dst_id_type);
524 /* Get channel entry */
525 channel = silc_idlist_find_channel_by_id(server->global_list,
528 channel = silc_idlist_find_channel_by_id(server->local_list,
531 silc_free(channel_id);
535 silc_free(channel_id);
538 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
541 client_id = silc_id_payload_parse_id(tmp, tmp_len);
545 /* Send to channel */
546 silc_server_packet_send_to_channel(server, sock, channel, packet->type,
547 FALSE, packet->buffer->data,
548 packet->buffer->len, FALSE);
550 /* If the the client is not in local list we check global list */
551 client = silc_idlist_find_client_by_id(server->global_list,
554 client = silc_idlist_find_client_by_id(server->local_list,
557 silc_free(client_id);
562 /* Remove the client from channel */
563 silc_server_remove_from_one_channel(server, sock, channel, client, FALSE);
567 case SILC_NOTIFY_TYPE_KILLED:
570 * Distribute the notify to local clients on channels
575 SILC_LOG_DEBUG(("KILLED notify"));
578 id = silc_argument_get_arg_type(args, 1, &id_len);
581 client_id = silc_id_payload_parse_id(id, id_len);
585 /* If the the client is not in local list we check global list */
586 client = silc_idlist_find_client_by_id(server->global_list,
589 client = silc_idlist_find_client_by_id(server->local_list,
592 silc_free(client_id);
596 silc_free(client_id);
598 /* If the client is one of ours, then close the connection to the
599 client now. This removes the client from all channels as well. */
600 if (packet->dst_id_type == SILC_ID_CLIENT && client->data.registered &&
601 client->connection) {
602 sock = client->connection;
603 silc_server_free_client_data(server, NULL, client, FALSE, NULL);
604 silc_server_close_connection(server, sock);
609 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
613 /* Send the notify to local clients on the channels except to the
614 client who is killed. */
615 silc_server_send_notify_on_channels(server, client, client,
616 SILC_NOTIFY_TYPE_KILLED,
621 /* Remove the client from all channels */
622 silc_server_remove_from_channels(server, NULL, client, FALSE, NULL,
628 case SILC_NOTIFY_TYPE_UMODE_CHANGE:
630 * Save the mode of the client.
633 SILC_LOG_DEBUG(("UMODE_CHANGE notify"));
636 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
639 client_id = silc_id_payload_parse_id(tmp, tmp_len);
643 /* Get client entry */
644 client = silc_idlist_find_client_by_id(server->global_list,
647 client = silc_idlist_find_client_by_id(server->local_list,
650 silc_free(client_id);
654 silc_free(client_id);
657 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
662 SILC_GET32_MSB(client->mode, tmp);
666 case SILC_NOTIFY_TYPE_BAN:
671 SILC_LOG_DEBUG(("BAN notify"));
674 tmp = silc_argument_get_arg_type(args, 1, &tmp_len);
677 channel_id = silc_id_payload_parse_id(tmp, tmp_len);
681 /* Get channel entry */
682 channel = silc_idlist_find_channel_by_id(server->global_list,
685 channel = silc_idlist_find_channel_by_id(server->local_list,
688 silc_free(channel_id);
692 silc_free(channel_id);
694 /* Get the new ban and add it to the ban list */
695 tmp = silc_argument_get_arg_type(args, 2, &tmp_len);
697 if (!channel->ban_list)
698 channel->ban_list = silc_calloc(tmp_len + 2,
699 sizeof(*channel->ban_list));
701 channel->ban_list = silc_realloc(channel->ban_list,
702 sizeof(*channel->ban_list) *
704 strlen(channel->ban_list) + 2));
705 strncat(channel->ban_list, tmp, tmp_len);
706 strncat(channel->ban_list, ",", 1);
709 /* Get the ban to be removed and remove it from the list */
710 tmp = silc_argument_get_arg_type(args, 3, &tmp_len);
711 if (tmp && channel->ban_list) {
712 char *start, *end, *n;
714 if (!strcmp(channel->ban_list, tmp)) {
715 silc_free(channel->ban_list);
716 channel->ban_list = NULL;
720 start = strstr(channel->ban_list, tmp);
721 if (start && strlen(start) >= tmp_len) {
722 end = start + tmp_len;
723 n = silc_calloc(strlen(channel->ban_list) - tmp_len, sizeof(*n));
724 strncat(n, channel->ban_list, start - channel->ban_list);
725 strncat(n, end + 1, ((channel->ban_list + strlen(channel->ban_list)) -
727 silc_free(channel->ban_list);
728 channel->ban_list = n;
734 /* Ignore rest of the notify types for now */
735 case SILC_NOTIFY_TYPE_NONE:
736 case SILC_NOTIFY_TYPE_MOTD:
743 silc_notify_payload_free(payload);
746 void silc_server_notify_list(SilcServer server,
747 SilcSocketConnection sock,
748 SilcPacketContext *packet)
750 SilcPacketContext *new;
754 SILC_LOG_DEBUG(("Processing New Notify List"));
756 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
757 packet->src_id_type != SILC_ID_SERVER)
760 /* Make copy of the original packet context, except for the actual
761 data buffer, which we will here now fetch from the original buffer. */
762 new = silc_packet_context_alloc();
763 new->type = SILC_PACKET_NOTIFY;
764 new->flags = packet->flags;
765 new->src_id = packet->src_id;
766 new->src_id_len = packet->src_id_len;
767 new->src_id_type = packet->src_id_type;
768 new->dst_id = packet->dst_id;
769 new->dst_id_len = packet->dst_id_len;
770 new->dst_id_type = packet->dst_id_type;
772 buffer = silc_buffer_alloc(1024);
773 new->buffer = buffer;
775 while (packet->buffer->len) {
776 SILC_GET16_MSB(len, packet->buffer->data + 2);
777 if (len > packet->buffer->len)
780 if (len > buffer->truelen) {
781 silc_buffer_free(buffer);
782 buffer = silc_buffer_alloc(1024 + len);
785 silc_buffer_pull_tail(buffer, len);
786 silc_buffer_put(buffer, packet->buffer->data, len);
788 /* Process the Notify */
789 silc_server_notify(server, sock, new);
791 silc_buffer_push_tail(buffer, len);
792 silc_buffer_pull(packet->buffer, len);
795 silc_buffer_free(buffer);
799 /* Received private message. This resolves the destination of the message
800 and sends the packet. This is used by both server and router. If the
801 destination is our locally connected client this sends the packet to
802 the client. This may also send the message for further routing if
803 the destination is not in our server (or router). */
805 void silc_server_private_message(SilcServer server,
806 SilcSocketConnection sock,
807 SilcPacketContext *packet)
809 SilcSocketConnection dst_sock;
810 SilcIDListData idata;
812 SILC_LOG_DEBUG(("Start"));
814 if (packet->src_id_type != SILC_ID_CLIENT ||
815 packet->dst_id_type != SILC_ID_CLIENT)
821 /* Get the route to the client */
822 dst_sock = silc_server_get_client_route(server, packet->dst_id,
823 packet->dst_id_len, &idata);
827 /* Send the private message */
828 silc_server_send_private_message(server, dst_sock, idata->send_key,
829 idata->hmac, packet);
832 /* Received private message key packet.. This packet is never for us. It is to
833 the client in the packet's destination ID. Sending of this sort of packet
834 equals sending private message, ie. it is sent point to point from
835 one client to another. */
837 void silc_server_private_message_key(SilcServer server,
838 SilcSocketConnection sock,
839 SilcPacketContext *packet)
841 SilcSocketConnection dst_sock;
842 SilcIDListData idata;
844 SILC_LOG_DEBUG(("Start"));
846 if (packet->src_id_type != SILC_ID_CLIENT ||
847 packet->dst_id_type != SILC_ID_CLIENT)
853 /* Get the route to the client */
854 dst_sock = silc_server_get_client_route(server, packet->dst_id,
855 packet->dst_id_len, &idata);
859 /* Relay the packet */
860 silc_server_relay_packet(server, dst_sock, idata->send_key,
861 idata->hmac, packet, FALSE);
864 /* Processes incoming command reply packet. The command reply packet may
865 be destined to one of our clients or it may directly for us. We will
866 call the command reply routine after processing the packet. */
868 void silc_server_command_reply(SilcServer server,
869 SilcSocketConnection sock,
870 SilcPacketContext *packet)
872 SilcBuffer buffer = packet->buffer;
873 SilcClientEntry client = NULL;
874 SilcSocketConnection dst_sock;
875 SilcIDListData idata;
876 SilcClientID *id = NULL;
878 SILC_LOG_DEBUG(("Start"));
880 /* Source must be server or router */
881 if (packet->src_id_type != SILC_ID_SERVER &&
882 sock->type != SILC_SOCKET_TYPE_ROUTER)
885 if (packet->dst_id_type == SILC_ID_CHANNEL)
888 if (packet->dst_id_type == SILC_ID_CLIENT) {
889 /* Destination must be one of ours */
890 id = silc_id_str2id(packet->dst_id, packet->dst_id_len, SILC_ID_CLIENT);
893 client = silc_idlist_find_client_by_id(server->local_list, id, NULL);
895 SILC_LOG_ERROR(("Cannot process command reply to unknown client"));
901 if (packet->dst_id_type == SILC_ID_SERVER) {
902 /* For now this must be for us */
903 if (SILC_ID_SERVER_COMPARE(packet->dst_id, server->id_string)) {
904 SILC_LOG_ERROR(("Cannot process command reply to unknown server"));
909 /* Execute command reply locally for the command */
910 silc_server_command_reply_process(server, sock, buffer);
912 if (packet->dst_id_type == SILC_ID_CLIENT && client && id) {
913 /* Relay the packet to the client */
915 dst_sock = (SilcSocketConnection)client->connection;
916 silc_buffer_push(buffer, SILC_PACKET_HEADER_LEN + packet->src_id_len
917 + packet->dst_id_len + packet->padlen);
919 silc_packet_send_prepare(dst_sock, 0, 0, buffer->len);
920 silc_buffer_put(dst_sock->outbuf, buffer->data, buffer->len);
922 idata = (SilcIDListData)client;
925 silc_packet_encrypt(idata->send_key, idata->hmac, dst_sock->outbuf,
928 /* Send the packet */
929 silc_server_packet_send_real(server, dst_sock, TRUE);
935 /* Process received channel message. The message can be originated from
938 void silc_server_channel_message(SilcServer server,
939 SilcSocketConnection sock,
940 SilcPacketContext *packet)
942 SilcChannelEntry channel = NULL;
943 SilcChannelClientEntry chl;
944 SilcChannelID *id = NULL;
947 SILC_LOG_DEBUG(("Processing channel message"));
950 if (packet->dst_id_type != SILC_ID_CHANNEL) {
951 SILC_LOG_DEBUG(("Received bad message for channel, dropped"));
955 /* Find channel entry */
956 id = silc_id_str2id(packet->dst_id, packet->dst_id_len, SILC_ID_CHANNEL);
959 channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
961 channel = silc_idlist_find_channel_by_id(server->global_list, id, NULL);
963 SILC_LOG_DEBUG(("Could not find channel"));
968 /* See that this client is on the channel. If the message is coming
969 from router we won't do the check as the message is from client that
970 we don't know about. Also, if the original sender is not client
971 (as it can be server as well) we don't do the check. */
972 sender = silc_id_str2id(packet->src_id, packet->src_id_len,
973 packet->src_id_type);
976 if (sock->type != SILC_SOCKET_TYPE_ROUTER &&
977 packet->src_id_type == SILC_ID_CLIENT) {
978 silc_list_start(channel->user_list);
979 while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
980 if (chl->client && !SILC_ID_CLIENT_COMPARE(chl->client->id, sender))
983 if (chl == SILC_LIST_END) {
984 SILC_LOG_DEBUG(("Client not on channel"));
989 /* If we are router and the packet came from router and private key
990 has not been set for the channel then we must encrypt the packet
991 as it was decrypted with the session key shared between us and the
992 router which sent it. This is so, because cells does not share the
994 if (server->server_type == SILC_ROUTER &&
995 sock->type == SILC_SOCKET_TYPE_ROUTER &&
996 !(channel->mode & SILC_CHANNEL_MODE_PRIVKEY)) {
998 unsigned int iv_len, i, data_len;
1000 iv_len = silc_cipher_get_block_len(channel->channel_key);
1001 if (channel->iv[0] == '\0')
1002 for (i = 0; i < iv_len; i++) channel->iv[i] =
1003 silc_rng_get_byte(server->rng);
1005 silc_hash_make(server->md5hash, channel->iv, iv_len, channel->iv);
1007 /* Encode new payload. This encrypts it also. */
1008 SILC_GET16_MSB(data_len, packet->buffer->data);
1009 chp = silc_channel_message_payload_encode(data_len,
1010 packet->buffer->data + 2,
1011 iv_len, channel->iv,
1012 channel->channel_key,
1013 channel->hmac, server->rng);
1014 silc_buffer_put(packet->buffer, chp->data, chp->len);
1015 silc_buffer_free(chp);
1018 /* Distribute the packet to our local clients. This will send the
1019 packet for further routing as well, if needed. */
1020 silc_server_packet_relay_to_channel(server, sock, channel, sender,
1021 packet->src_id_type,
1022 packet->buffer->data,
1023 packet->buffer->len, FALSE);
1032 /* Received channel key packet. We distribute the key to all of our locally
1033 connected clients on the channel. */
1035 void silc_server_channel_key(SilcServer server,
1036 SilcSocketConnection sock,
1037 SilcPacketContext *packet)
1039 SilcBuffer buffer = packet->buffer;
1040 SilcChannelEntry channel;
1042 if (packet->src_id_type != SILC_ID_SERVER)
1045 /* Save the channel key */
1046 channel = silc_server_save_channel_key(server, buffer, NULL);
1050 /* Distribute the key to everybody who is on the channel. If we are router
1051 we will also send it to locally connected servers. */
1052 silc_server_send_channel_key(server, sock, channel, FALSE);
1055 /* Received New Client packet and processes it. Creates Client ID for the
1056 client. Client becomes registered after calling this functions. */
1058 SilcClientEntry silc_server_new_client(SilcServer server,
1059 SilcSocketConnection sock,
1060 SilcPacketContext *packet)
1062 SilcBuffer buffer = packet->buffer;
1063 SilcClientEntry client;
1064 SilcIDCacheEntry cache;
1065 SilcClientID *client_id;
1067 SilcIDListData idata;
1068 char *username = NULL, *realname = NULL, *id_string;
1071 SILC_LOG_DEBUG(("Creating new client"));
1073 if (sock->type != SILC_SOCKET_TYPE_CLIENT)
1076 /* Take client entry */
1077 client = (SilcClientEntry)sock->user_data;
1078 idata = (SilcIDListData)client;
1080 /* Fetch the old client cache entry so that we can update it. */
1081 if (!silc_idcache_find_by_context(server->local_list->clients,
1082 sock->user_data, &cache)) {
1083 SILC_LOG_ERROR(("Lost client's cache entry - bad thing"));
1087 /* Parse incoming packet */
1088 ret = silc_buffer_unformat(buffer,
1089 SILC_STR_UI16_STRING_ALLOC(&username),
1090 SILC_STR_UI16_STRING_ALLOC(&realname),
1094 silc_free(username);
1096 silc_free(realname);
1101 silc_free(username);
1103 silc_free(realname);
1104 silc_server_disconnect_remote(server, sock, "Server closed connection: "
1105 "Incomplete client information");
1109 /* Create Client ID */
1110 silc_id_create_client_id(server->id, server->rng, server->md5hash,
1111 username, &client_id);
1113 if (strlen(username) > 128)
1114 username[127] = '\0';
1116 /* Update client entry */
1117 idata->registered = TRUE;
1118 client->nickname = strdup(username);
1119 client->username = username;
1120 client->userinfo = realname ? realname : strdup(" ");
1121 client->id = client_id;
1123 /* Update the cache entry */
1124 cache->id = (void *)client_id;
1125 cache->type = SILC_ID_CLIENT;
1126 cache->data = username;
1127 silc_idcache_sort_by_data(server->local_list->clients);
1129 /* Notify our router about new client on the SILC network */
1130 if (!server->standalone)
1131 silc_server_send_new_id(server, (SilcSocketConnection)
1132 server->router->connection,
1133 server->server_type == SILC_ROUTER ? TRUE : FALSE,
1134 client->id, SILC_ID_CLIENT, SILC_ID_CLIENT_LEN);
1136 /* Send the new client ID to the client. */
1137 id_string = silc_id_id2str(client->id, SILC_ID_CLIENT);
1138 reply = silc_buffer_alloc(2 + 2 + SILC_ID_CLIENT_LEN);
1139 silc_buffer_pull_tail(reply, SILC_BUFFER_END(reply));
1140 silc_buffer_format(reply,
1141 SILC_STR_UI_SHORT(SILC_ID_CLIENT),
1142 SILC_STR_UI_SHORT(SILC_ID_CLIENT_LEN),
1143 SILC_STR_UI_XNSTRING(id_string, SILC_ID_CLIENT_LEN),
1145 silc_server_packet_send(server, sock, SILC_PACKET_NEW_ID, 0,
1146 reply->data, reply->len, FALSE);
1147 silc_free(id_string);
1148 silc_buffer_free(reply);
1150 /* Send some nice info to the client */
1151 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1152 ("Welcome to the SILC Network %s@%s",
1153 username, sock->hostname));
1154 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1155 ("Your host is %s, running version %s",
1156 server->config->server_info->server_name,
1158 if (server->server_type == SILC_ROUTER) {
1159 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1160 ("There are %d clients on %d servers in SILC "
1161 "Network", server->stat.clients,
1162 server->stat.servers + 1));
1163 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1164 ("There are %d clients on %d server in our cell",
1165 server->stat.cell_clients,
1166 server->stat.cell_servers + 1));
1167 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1168 ("I have %d clients, %d channels, %d servers and "
1170 server->stat.my_clients,
1171 server->stat.my_channels,
1172 server->stat.my_servers,
1173 server->stat.my_routers));
1174 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1175 ("%d server operators and %d router operators "
1177 server->stat.my_server_ops,
1178 server->stat.my_router_ops));
1180 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1181 ("I have %d clients and %d channels formed",
1182 server->stat.my_clients,
1183 server->stat.my_channels));
1184 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1185 ("%d operators online",
1186 server->stat.my_server_ops));
1188 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1189 ("Your connection is secured with %s cipher, "
1190 "key length %d bits",
1191 idata->send_key->cipher->name,
1192 idata->send_key->cipher->key_len));
1193 SILC_SERVER_SEND_NOTIFY(server, sock, SILC_NOTIFY_TYPE_NONE,
1194 ("Your current nickname is %s",
1198 silc_server_send_motd(server, sock);
1203 /* Create new server. This processes received New Server packet and
1204 saves the received Server ID. The server is our locally connected
1205 server thus we save all the information and save it to local list.
1206 This funtion can be used by both normal server and router server.
1207 If normal server uses this it means that its router has connected
1208 to the server. If router uses this it means that one of the cell's
1209 servers is connected to the router. */
1211 SilcServerEntry silc_server_new_server(SilcServer server,
1212 SilcSocketConnection sock,
1213 SilcPacketContext *packet)
1215 SilcBuffer buffer = packet->buffer;
1216 SilcServerEntry new_server;
1217 SilcIDCacheEntry cache;
1218 SilcServerID *server_id;
1219 SilcIDListData idata;
1220 unsigned char *server_name, *id_string;
1221 unsigned short id_len, name_len;
1224 SILC_LOG_DEBUG(("Creating new server"));
1226 if (sock->type != SILC_SOCKET_TYPE_SERVER &&
1227 sock->type != SILC_SOCKET_TYPE_ROUTER)
1230 /* Take server entry */
1231 new_server = (SilcServerEntry)sock->user_data;
1232 idata = (SilcIDListData)new_server;
1234 /* Fetch the old server cache entry so that we can update it. */
1235 if (!silc_idcache_find_by_context(server->local_list->servers,
1236 sock->user_data, &cache)) {
1237 SILC_LOG_ERROR(("Lost server's cache entry - bad thing"));
1241 /* Parse the incoming packet */
1242 ret = silc_buffer_unformat(buffer,
1243 SILC_STR_UI16_NSTRING_ALLOC(&id_string, &id_len),
1244 SILC_STR_UI16_NSTRING_ALLOC(&server_name,
1249 silc_free(id_string);
1251 silc_free(server_name);
1255 if (id_len > buffer->len) {
1256 silc_free(id_string);
1257 silc_free(server_name);
1262 server_name[255] = '\0';
1265 server_id = silc_id_str2id(id_string, id_len, SILC_ID_SERVER);
1267 silc_free(id_string);
1268 silc_free(server_name);
1271 silc_free(id_string);
1273 /* Update client entry */
1274 idata->registered = TRUE;
1275 new_server->server_name = server_name;
1276 new_server->id = server_id;
1278 /* Update the cache entry */
1279 cache->id = (void *)server_id;
1280 cache->type = SILC_ID_SERVER;
1281 cache->data = server_name;
1282 silc_idcache_sort_by_data(server->local_list->servers);
1284 /* Distribute the information about new server in the SILC network
1285 to our router. If we are normal server we won't send anything
1286 since this connection must be our router connection. */
1287 if (server->server_type == SILC_ROUTER && !server->standalone &&
1288 server->router->connection != sock)
1289 silc_server_send_new_id(server, server->router->connection,
1290 TRUE, new_server->id, SILC_ID_SERVER,
1291 SILC_ID_SERVER_LEN);
1293 if (server->server_type == SILC_ROUTER)
1294 server->stat.cell_servers++;
1299 /* Processes incoming New ID packet. New ID Payload is used to distribute
1300 information about newly registered clients and servers. */
1302 static void silc_server_new_id_real(SilcServer server,
1303 SilcSocketConnection sock,
1304 SilcPacketContext *packet,
1307 SilcBuffer buffer = packet->buffer;
1309 SilcServerEntry router;
1310 SilcSocketConnection router_sock;
1313 unsigned char *hash = NULL;
1316 SILC_LOG_DEBUG(("Processing new ID"));
1318 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
1319 server->server_type == SILC_SERVER ||
1320 packet->src_id_type != SILC_ID_SERVER)
1323 idp = silc_id_payload_parse(buffer);
1327 id_type = silc_id_payload_get_type(idp);
1329 /* Normal server cannot have other normal server connections */
1330 if (id_type == SILC_ID_SERVER && sock->type == SILC_SOCKET_TYPE_SERVER)
1333 id = silc_id_payload_get_id(idp);
1337 /* If the sender of this packet is server and we are router we need to
1338 broadcast this packet to other routers in the network. */
1339 if (broadcast && !server->standalone && server->server_type == SILC_ROUTER &&
1340 sock->type == SILC_SOCKET_TYPE_SERVER &&
1341 !(packet->flags & SILC_PACKET_FLAG_BROADCAST)) {
1342 SILC_LOG_DEBUG(("Broadcasting received New ID packet"));
1343 silc_server_packet_send(server, server->router->connection,
1345 packet->flags | SILC_PACKET_FLAG_BROADCAST,
1346 buffer->data, buffer->len, FALSE);
1349 if (sock->type == SILC_SOCKET_TYPE_SERVER)
1350 id_list = server->local_list;
1352 id_list = server->global_list;
1355 router = sock->user_data;
1358 case SILC_ID_CLIENT:
1360 SilcClientEntry entry;
1362 SILC_LOG_DEBUG(("New client id(%s) from [%s] %s",
1363 silc_id_render(id, SILC_ID_CLIENT),
1364 sock->type == SILC_SOCKET_TYPE_SERVER ?
1365 "Server" : "Router", sock->hostname));
1367 /* As a router we keep information of all global information in our
1368 global list. Cell wide information however is kept in the local
1369 list. The client is put to global list and we will take the hash
1370 value of the Client ID and save it to the ID Cache system for fast
1371 searching in the future. */
1372 hash = silc_calloc(sizeof(((SilcClientID *)id)->hash),
1373 sizeof(unsigned char));
1374 memcpy(hash, ((SilcClientID *)id)->hash,
1375 sizeof(((SilcClientID *)id)->hash));
1376 entry = silc_idlist_add_client(id_list, hash,
1377 sizeof(((SilcClientID *)id)->hash),
1378 NULL, NULL, id, router, NULL);
1379 entry->nickname = NULL;
1380 entry->data.registered = TRUE;
1382 if (sock->type == SILC_SOCKET_TYPE_SERVER)
1383 server->stat.cell_clients++;
1384 server->stat.clients++;
1387 /* XXX Adding two ID's with same IP number replaces the old entry thus
1388 gives wrong route. Thus, now disabled until figured out a better way
1389 to do this or when removed the whole thing. This could be removed
1390 because entry->router->connection gives always the most optimal route
1391 for the ID anyway (unless new routes (faster perhaps) are established
1392 after receiving this ID, this we don't know however). */
1393 /* Add route cache for this ID */
1394 silc_server_route_add(silc_server_route_hash(
1395 ((SilcClientID *)id)->ip.s_addr,
1396 server->id->port), ((SilcClientID *)id)->ip.s_addr,
1402 case SILC_ID_SERVER:
1403 SILC_LOG_DEBUG(("New server id(%s) from [%s] %s",
1404 silc_id_render(id, SILC_ID_SERVER),
1405 sock->type == SILC_SOCKET_TYPE_SERVER ?
1406 "Server" : "Router", sock->hostname));
1408 /* As a router we keep information of all global information in our global
1409 list. Cell wide information however is kept in the local list. */
1410 silc_idlist_add_server(id_list, NULL, 0, id, router, router_sock);
1412 if (sock->type == SILC_SOCKET_TYPE_SERVER)
1413 server->stat.cell_servers++;
1414 server->stat.servers++;
1417 /* Add route cache for this ID */
1418 silc_server_route_add(silc_server_route_hash(
1419 ((SilcServerID *)id)->ip.s_addr,
1420 ((SilcServerID *)id)->port),
1421 ((SilcServerID *)id)->ip.s_addr,
1426 case SILC_ID_CHANNEL:
1427 SILC_LOG_ERROR(("Channel cannot be registered with NEW_ID packet"));
1435 silc_id_payload_free(idp);
1439 /* Processes incoming New ID packet. New ID Payload is used to distribute
1440 information about newly registered clients and servers. */
1442 void silc_server_new_id(SilcServer server, SilcSocketConnection sock,
1443 SilcPacketContext *packet)
1445 silc_server_new_id_real(server, sock, packet, TRUE);
1448 /* Receoved New Id List packet, list of New ID payloads inside one
1449 packet. Process the New ID payloads one by one. */
1451 void silc_server_new_id_list(SilcServer server, SilcSocketConnection sock,
1452 SilcPacketContext *packet)
1454 SilcPacketContext *new_id;
1456 unsigned short id_len;
1458 SILC_LOG_DEBUG(("Processing New ID List"));
1460 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
1461 packet->src_id_type != SILC_ID_SERVER)
1464 /* If the sender of this packet is server and we are router we need to
1465 broadcast this packet to other routers in the network. Broadcast
1466 this list packet instead of multiple New ID packets. */
1467 if (!server->standalone && server->server_type == SILC_ROUTER &&
1468 sock->type == SILC_SOCKET_TYPE_SERVER &&
1469 !(packet->flags & SILC_PACKET_FLAG_BROADCAST)) {
1470 SILC_LOG_DEBUG(("Broadcasting received New ID List packet"));
1471 silc_server_packet_send(server, server->router->connection,
1473 packet->flags | SILC_PACKET_FLAG_BROADCAST,
1474 packet->buffer->data, packet->buffer->len, FALSE);
1477 /* Make copy of the original packet context, except for the actual
1478 data buffer, which we will here now fetch from the original buffer. */
1479 new_id = silc_packet_context_alloc();
1480 new_id->type = SILC_PACKET_NEW_ID;
1481 new_id->flags = packet->flags;
1482 new_id->src_id = packet->src_id;
1483 new_id->src_id_len = packet->src_id_len;
1484 new_id->src_id_type = packet->src_id_type;
1485 new_id->dst_id = packet->dst_id;
1486 new_id->dst_id_len = packet->dst_id_len;
1487 new_id->dst_id_type = packet->dst_id_type;
1489 idp = silc_buffer_alloc(256);
1490 new_id->buffer = idp;
1492 while (packet->buffer->len) {
1493 SILC_GET16_MSB(id_len, packet->buffer->data + 2);
1494 if ((id_len > packet->buffer->len) ||
1495 (id_len > idp->truelen))
1498 silc_buffer_pull_tail(idp, 4 + id_len);
1499 silc_buffer_put(idp, packet->buffer->data, 4 + id_len);
1501 /* Process the New ID */
1502 silc_server_new_id_real(server, sock, new_id, FALSE);
1504 silc_buffer_push_tail(idp, 4 + id_len);
1505 silc_buffer_pull(packet->buffer, 4 + id_len);
1508 silc_buffer_free(idp);
1512 /* Received New Channel packet. Information about new channels in the
1513 network are distributed using this packet. Save the information about
1514 the new channel. This usually comes from router but also normal server
1515 can send this to notify channels it has when it connects to us. */
1517 void silc_server_new_channel(SilcServer server,
1518 SilcSocketConnection sock,
1519 SilcPacketContext *packet)
1521 SilcChannelPayload payload;
1522 SilcChannelID *channel_id;
1524 unsigned int name_len;
1526 unsigned int id_len;
1528 SILC_LOG_DEBUG(("Processing New Channel"));
1530 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
1531 packet->src_id_type != SILC_ID_SERVER ||
1532 server->server_type == SILC_SERVER)
1535 /* Parse the channel payload */
1536 payload = silc_channel_payload_parse(packet->buffer);
1540 /* Get the channel ID */
1541 channel_id = silc_channel_get_id_parse(payload);
1543 silc_channel_payload_free(payload);
1547 channel_name = silc_channel_get_name(payload, &name_len);
1549 channel_name[255] = '\0';
1551 id = silc_channel_get_id(payload, &id_len);
1553 if (sock->type == SILC_SOCKET_TYPE_ROUTER) {
1554 /* Add the server to global list as it is coming from router. It
1555 cannot be our own channel as it is coming from router. */
1557 SILC_LOG_DEBUG(("New channel id(%s) from [Router] %s",
1558 silc_id_render(channel_id, SILC_ID_CHANNEL),
1561 silc_idlist_add_channel(server->global_list, strdup(channel_name),
1562 0, channel_id, server->router->connection,
1565 server->stat.channels++;
1567 /* The channel is coming from our server, thus it is in our cell
1568 we will add it to our local list. */
1569 SilcChannelEntry channel;
1572 SILC_LOG_DEBUG(("New channel id(%s) from [Server] %s",
1573 silc_id_render(channel_id, SILC_ID_CHANNEL),
1576 /* Check that we don't already have this channel */
1577 channel = silc_idlist_find_channel_by_name(server->local_list,
1578 channel_name, NULL);
1580 channel = silc_idlist_find_channel_by_name(server->global_list,
1581 channel_name, NULL);
1583 /* If the channel does not exist, then create it. We create the channel
1584 with the channel ID provided by the server. This creates a new
1585 key to the channel as well that we will send to the server. */
1587 channel = silc_server_create_new_channel_with_id(server, NULL, NULL,
1591 silc_channel_payload_free(payload);
1592 silc_free(channel_id);
1596 /* Send the new channel key to the server */
1597 chk = silc_channel_key_payload_encode(id_len, id,
1598 strlen(channel->channel_key->
1600 channel->channel_key->cipher->name,
1601 channel->key_len / 8,
1603 silc_server_packet_send(server, sock, SILC_PACKET_CHANNEL_KEY, 0,
1604 chk->data, chk->len, FALSE);
1605 silc_buffer_free(chk);
1608 /* The channel exist by that name, check whether the ID's match.
1609 If they don't then we'll force the server to use the ID we have.
1610 We also create a new key for the channel. */
1612 if (SILC_ID_CHANNEL_COMPARE(channel_id, channel->id)) {
1613 /* They don't match, send CHANNEL_CHANGE notify to the server to
1614 force the ID change. */
1615 SILC_LOG_DEBUG(("Forcing the server to change Channel ID"));
1616 silc_server_send_notify_channel_change(server, sock, FALSE,
1619 SILC_ID_CHANNEL_LEN);
1622 /* Create new key for the channel and send it to the server and
1623 everybody else possibly on the channel. */
1625 silc_server_create_channel_key(server, channel, 0);
1627 /* Send to the channel */
1628 silc_server_send_channel_key(server, sock, channel, FALSE);
1630 /* Send to the server */
1631 chk = silc_channel_key_payload_encode(id_len, id,
1632 strlen(channel->channel_key->
1634 channel->channel_key->cipher->name,
1635 channel->key_len / 8,
1637 silc_server_packet_send(server, sock, SILC_PACKET_CHANNEL_KEY, 0,
1638 chk->data, chk->len, FALSE);
1639 silc_buffer_free(chk);
1640 silc_free(channel_id);
1642 /* Since the channel is coming from server and we also know about it
1643 then send the JOIN notify to the server so that it see's our
1644 users on the channel "joining" the channel. */
1650 /* Received New Channel List packet, list of New Channel List payloads inside
1651 one packet. Process the New Channel payloads one by one. */
1653 void silc_server_new_channel_list(SilcServer server,
1654 SilcSocketConnection sock,
1655 SilcPacketContext *packet)
1657 SilcPacketContext *new;
1659 unsigned short len1, len2;
1661 SILC_LOG_DEBUG(("Processing New Channel List"));
1663 if (sock->type == SILC_SOCKET_TYPE_CLIENT ||
1664 packet->src_id_type != SILC_ID_SERVER ||
1665 server->server_type == SILC_SERVER)
1668 /* If the sender of this packet is server and we are router we need to
1669 broadcast this packet to other routers in the network. Broadcast
1670 this list packet instead of multiple New Channel packets. */
1671 if (!server->standalone && server->server_type == SILC_ROUTER &&
1672 sock->type == SILC_SOCKET_TYPE_SERVER &&
1673 !(packet->flags & SILC_PACKET_FLAG_BROADCAST)) {
1674 SILC_LOG_DEBUG(("Broadcasting received New Channel List packet"));
1675 silc_server_packet_send(server, server->router->connection,
1677 packet->flags | SILC_PACKET_FLAG_BROADCAST,
1678 packet->buffer->data, packet->buffer->len, FALSE);
1681 /* Make copy of the original packet context, except for the actual
1682 data buffer, which we will here now fetch from the original buffer. */
1683 new = silc_packet_context_alloc();
1684 new->type = SILC_PACKET_NEW_CHANNEL;
1685 new->flags = packet->flags;
1686 new->src_id = packet->src_id;
1687 new->src_id_len = packet->src_id_len;
1688 new->src_id_type = packet->src_id_type;
1689 new->dst_id = packet->dst_id;
1690 new->dst_id_len = packet->dst_id_len;
1691 new->dst_id_type = packet->dst_id_type;
1693 buffer = silc_buffer_alloc(512);
1694 new->buffer = buffer;
1696 while (packet->buffer->len) {
1697 SILC_GET16_MSB(len1, packet->buffer->data);
1698 if ((len1 > packet->buffer->len) ||
1699 (len1 > buffer->truelen))
1702 SILC_GET16_MSB(len2, packet->buffer->data + 2 + len1);
1703 if ((len2 > packet->buffer->len) ||
1704 (len2 > buffer->truelen))
1707 silc_buffer_pull_tail(buffer, 8 + len1 + len2);
1708 silc_buffer_put(buffer, packet->buffer->data, 8 + len1 + len2);
1710 /* Process the New Channel */
1711 silc_server_new_channel(server, sock, new);
1713 silc_buffer_push_tail(buffer, 8 + len1 + len2);
1714 silc_buffer_pull(packet->buffer, 8 + len1 + len2);
1717 silc_buffer_free(buffer);
1721 /* Received key agreement packet. This packet is never for us. It is to
1722 the client in the packet's destination ID. Sending of this sort of packet
1723 equals sending private message, ie. it is sent point to point from
1724 one client to another. */
1726 void silc_server_key_agreement(SilcServer server,
1727 SilcSocketConnection sock,
1728 SilcPacketContext *packet)
1730 SilcSocketConnection dst_sock;
1731 SilcIDListData idata;
1733 SILC_LOG_DEBUG(("Start"));
1735 if (packet->src_id_type != SILC_ID_CLIENT ||
1736 packet->dst_id_type != SILC_ID_CLIENT)
1739 if (!packet->dst_id)
1742 /* Get the route to the client */
1743 dst_sock = silc_server_get_client_route(server, packet->dst_id,
1744 packet->dst_id_len, &idata);
1748 /* Relay the packet */
1749 silc_server_relay_packet(server, dst_sock, idata->send_key,
1750 idata->hmac, packet, FALSE);