updates.
[silc.git] / apps / silcd / packet_send.c
index 9e1582b9ca067052480d91c80859885a3ae5afab..c4d33dd80600abc727cce36e44d35e41fc33dc09 100644 (file)
@@ -129,14 +129,14 @@ void silc_server_packet_send_dest(SilcServer server,
 
   if (dst_id) {
     dst_id_data = silc_id_id2str(dst_id, dst_id_type);
-    dst_id_len = silc_id_get_len(dst_id_type);
+    dst_id_len = silc_id_get_len(dst_id, dst_id_type);
   }
 
   /* Set the packet context pointers */
   packetdata.type = type;
   packetdata.flags = flags;
   packetdata.src_id = silc_id_id2str(server->id, server->id_type);
-  packetdata.src_id_len = SILC_ID_SERVER_LEN;
+  packetdata.src_id_len = silc_id_get_len(server->id, server->id_type);
   packetdata.src_id_type = server->id_type;
   packetdata.dst_id = dst_id_data;
   packetdata.dst_id_len = dst_id_len;
@@ -220,12 +220,12 @@ void silc_server_packet_send_srcdest(SilcServer server,
 
   if (dst_id) {
     dst_id_data = silc_id_id2str(dst_id, dst_id_type);
-    dst_id_len = silc_id_get_len(dst_id_type);
+    dst_id_len = silc_id_get_len(dst_id, dst_id_type);
   }
 
   if (src_id) {
     src_id_data = silc_id_id2str(src_id, src_id_type);
-    src_id_len = silc_id_get_len(src_id_type);
+    src_id_len = silc_id_get_len(src_id, src_id_type);
   }
 
   /* Set the packet context pointers */
@@ -298,7 +298,7 @@ void silc_server_packet_broadcast(SilcServer server,
   /* If the packet is originated from our primary route we are
      not allowed to send the packet. */
   id = silc_id_str2id(packet->src_id, packet->src_id_len, packet->src_id_type);
-  if (id && SILC_ID_SERVER_COMPARE(id, server->router->id)) {
+  if (id && !SILC_ID_SERVER_COMPARE(id, server->router->id)) {
     idata = (SilcIDListData)sock->user_data;
 
     silc_buffer_push(buffer, buffer->data - buffer->head);
@@ -431,10 +431,10 @@ void silc_server_packet_send_to_channel(SilcServer server,
   packetdata.flags = 0;
   packetdata.type = type;
   packetdata.src_id = silc_id_id2str(server->id, SILC_ID_SERVER);
-  packetdata.src_id_len = SILC_ID_SERVER_LEN;
+  packetdata.src_id_len = silc_id_get_len(server->id, SILC_ID_SERVER);
   packetdata.src_id_type = SILC_ID_SERVER;
   packetdata.dst_id = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
-  packetdata.dst_id_len = SILC_ID_CHANNEL_LEN;
+  packetdata.dst_id_len = silc_id_get_len(channel->id, SILC_ID_CHANNEL);
   packetdata.dst_id_type = SILC_ID_CHANNEL;
   packetdata.truelen = data_len + SILC_PACKET_HEADER_LEN + 
     packetdata.src_id_len + packetdata.dst_id_len;
@@ -591,6 +591,7 @@ void silc_server_packet_relay_to_channel(SilcServer server,
                                         SilcChannelEntry channel,
                                         void *sender, 
                                         SilcIdType sender_type,
+                                        void *sender_entry,
                                         unsigned char *data,
                                         uint32 data_len,
                                         int force_send)
@@ -610,10 +611,10 @@ void silc_server_packet_relay_to_channel(SilcServer server,
   packetdata.flags = 0;
   packetdata.type = SILC_PACKET_CHANNEL_MESSAGE;
   packetdata.src_id = silc_id_id2str(sender, sender_type);
-  packetdata.src_id_len = silc_id_get_len(sender_type);
+  packetdata.src_id_len = silc_id_get_len(sender, sender_type);
   packetdata.src_id_type = sender_type;
   packetdata.dst_id = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
-  packetdata.dst_id_len = SILC_ID_CHANNEL_LEN;
+  packetdata.dst_id_len = silc_id_get_len(channel->id, SILC_ID_CHANNEL);
   packetdata.dst_id_type = SILC_ID_CHANNEL;
   packetdata.padlen = SILC_PACKET_PADLEN((SILC_PACKET_HEADER_LEN +
                                          packetdata.src_id_len +
@@ -660,7 +661,8 @@ void silc_server_packet_relay_to_channel(SilcServer server,
     if (client) {
 
       /* If sender is one on the channel do not send it the packet. */
-      if (!found && !SILC_ID_CLIENT_COMPARE(client->id, sender)) {
+      if (!found && sender_type == SILC_ID_CLIENT &&
+         SILC_ID_CLIENT_COMPARE(client->id, sender)) {
        found = TRUE;
        continue;
       }
@@ -672,7 +674,7 @@ void silc_server_packet_relay_to_channel(SilcServer server,
 
        /* Sender maybe server as well so we want to make sure that
           we won't send the message to the server it came from. */
-       if (!found && !SILC_ID_SERVER_COMPARE(client->router->id, sender)) {
+       if (!found && SILC_ID_SERVER_COMPARE(client->router->id, sender)) {
          found = TRUE;
          continue;
        }
@@ -688,6 +690,13 @@ void silc_server_packet_relay_to_channel(SilcServer server,
        sock = (SilcSocketConnection)client->router->connection;
        idata = (SilcIDListData)client->router;
 
+       /* Do not send to the sender. Check first whether the true
+          sender's router is same as this client's router. Also check
+          if the sender socket is the same as this client's router
+          socket. */
+       if (sender_entry && 
+           ((SilcClientEntry)sender_entry)->router == client->router)
+         continue;
        if (sender_sock && sock == sender_sock)
          continue;
 
@@ -716,6 +725,9 @@ void silc_server_packet_relay_to_channel(SilcServer server,
            memcpy(tmp, data, data_len);
 
            /* Decrypt the channel message (we don't check the MAC) */
+           /* XXX this could be optimized and removed all together by
+              taking a copy of the original data before encrypting it
+              and thus would not required decrypting. */
            if (channel->channel_key &&
                !silc_channel_message_payload_decrypt(tmp, data_len, 
                                                      channel->channel_key,
@@ -951,8 +963,7 @@ void silc_server_send_notify_channel_change(SilcServer server,
                                            SilcSocketConnection sock,
                                            int broadcast,
                                            SilcChannelID *old_id,
-                                           SilcChannelID *new_id,
-                                           uint32 id_len)
+                                           SilcChannelID *new_id)
 {
   SilcBuffer idp1, idp2;
 
@@ -973,8 +984,7 @@ void silc_server_send_notify_nick_change(SilcServer server,
                                         SilcSocketConnection sock,
                                         int broadcast,
                                         SilcClientID *old_id,
-                                        SilcClientID *new_id,
-                                        uint32 id_len)
+                                        SilcClientID *new_id)
 {
   SilcBuffer idp1, idp2;
 
@@ -995,8 +1005,7 @@ void silc_server_send_notify_join(SilcServer server,
                                  SilcSocketConnection sock,
                                  int broadcast,
                                  SilcChannelEntry channel,
-                                 SilcClientID *client_id,
-                                 uint32 client_id_len)
+                                 SilcClientID *client_id)
 {
   SilcBuffer idp1, idp2;
 
@@ -1016,8 +1025,7 @@ void silc_server_send_notify_leave(SilcServer server,
                                   SilcSocketConnection sock,
                                   int broadcast,
                                   SilcChannelEntry channel,
-                                  SilcClientID *client_id,
-                                  uint32 client_id_len)
+                                  SilcClientID *client_id)
 {
   SilcBuffer idp;
 
@@ -1038,7 +1046,6 @@ void silc_server_send_notify_cmode(SilcServer server,
                                   SilcChannelEntry channel,
                                   uint32 mode_mask,
                                   void *id, SilcIdType id_type,
-                                  uint32 id_len,
                                   char *cipher, char *hmac)
 {
   SilcBuffer idp;
@@ -1065,15 +1072,13 @@ void silc_server_send_notify_cumode(SilcServer server,
                                    int broadcast,
                                    SilcChannelEntry channel,
                                    uint32 mode_mask,
-                                   SilcClientID *client_id,
-                                   uint32 client_id_len,
-                                   SilcClientID *target,
-                                   uint32 target_len)
+                                   void *id, SilcIdType id_type,
+                                   SilcClientID *target)
 {
   SilcBuffer idp1, idp2;
   unsigned char mode[4];
 
-  idp1 = silc_id_payload_encode((void *)client_id, SILC_ID_CLIENT);
+  idp1 = silc_id_payload_encode((void *)id, id_type);
   idp2 = silc_id_payload_encode((void *)target, SILC_ID_CLIENT);
   SILC_PUT32_MSB(mode_mask, mode);
 
@@ -1096,7 +1101,6 @@ void silc_server_send_notify_signoff(SilcServer server,
                                     SilcSocketConnection sock,
                                     int broadcast,
                                     SilcClientID *client_id,
-                                    uint32 client_id_len,
                                     char *message)
 {
   SilcBuffer idp;
@@ -1119,7 +1123,6 @@ void silc_server_send_notify_topic_set(SilcServer server,
                                       int broadcast,
                                       SilcChannelEntry channel,
                                       SilcClientID *client_id,
-                                      uint32 client_id_len,
                                       char *topic)
 {
   SilcBuffer idp;
@@ -1143,7 +1146,6 @@ void silc_server_send_notify_kicked(SilcServer server,
                                    int broadcast,
                                    SilcChannelEntry channel,
                                    SilcClientID *client_id,
-                                   uint32 client_id_len,
                                    char *comment)
 {
   SilcBuffer idp;
@@ -1164,7 +1166,6 @@ void silc_server_send_notify_killed(SilcServer server,
                                    SilcSocketConnection sock,
                                    int broadcast,
                                    SilcClientID *client_id,
-                                   uint32 client_id_len,
                                    char *comment)
 {
   SilcBuffer idp;
@@ -1185,7 +1186,6 @@ void silc_server_send_notify_umode(SilcServer server,
                                   SilcSocketConnection sock,
                                   int broadcast,
                                   SilcClientID *client_id,
-                                  uint32 client_id_len,
                                   uint32 mode_mask)
 {
   SilcBuffer idp;
@@ -1232,7 +1232,6 @@ void silc_server_send_notify_invite(SilcServer server,
                                    int broadcast,
                                    SilcChannelEntry channel,
                                    SilcClientID *client_id,
-                                   uint32 client_id_len,
                                    char *add, char *del)
 {
   SilcBuffer idp, idp2;
@@ -1342,7 +1341,7 @@ void silc_server_send_notify_on_channels(SilcServer server,
   packetdata.flags = 0;
   packetdata.type = SILC_PACKET_NOTIFY;
   packetdata.src_id = silc_id_id2str(server->id, SILC_ID_SERVER);
-  packetdata.src_id_len = SILC_ID_SERVER_LEN;
+  packetdata.src_id_len = silc_id_get_len(server->id, SILC_ID_SERVER);
   packetdata.src_id_type = SILC_ID_SERVER;
 
   silc_list_start(client->channels);
@@ -1380,7 +1379,7 @@ void silc_server_send_notify_on_channels(SilcServer server,
        idata = (SilcIDListData)c->router;
        
        packetdata.dst_id = silc_id_id2str(c->router->id, SILC_ID_SERVER);
-       packetdata.dst_id_len = SILC_ID_SERVER_LEN;
+       packetdata.dst_id_len = silc_id_get_len(c->router->id, SILC_ID_SERVER);
        packetdata.dst_id_type = SILC_ID_SERVER;
        packetdata.truelen = data_len + SILC_PACKET_HEADER_LEN + 
          packetdata.src_id_len + packetdata.dst_id_len;
@@ -1416,7 +1415,7 @@ void silc_server_send_notify_on_channels(SilcServer server,
        idata = (SilcIDListData)c;
        
        packetdata.dst_id = silc_id_id2str(c->id, SILC_ID_CLIENT);
-       packetdata.dst_id_len = SILC_ID_CLIENT_LEN;
+       packetdata.dst_id_len = silc_id_get_len(c->id, SILC_ID_CLIENT);
        packetdata.dst_id_type = SILC_ID_CLIENT;
        packetdata.truelen = data_len + SILC_PACKET_HEADER_LEN + 
          packetdata.src_id_len + packetdata.dst_id_len;
@@ -1531,7 +1530,9 @@ void silc_server_send_channel_key(SilcServer server,
  
   /* Encode channel key packet */
   tmp_len = strlen(channel->channel_key->cipher->name);
-  packet = silc_channel_key_payload_encode(SILC_ID_CHANNEL_LEN, chid, tmp_len,
+  packet = silc_channel_key_payload_encode(silc_id_get_len(channel->id,
+                                                          SILC_ID_CHANNEL),
+                                          chid, tmp_len,
                                            channel->channel_key->cipher->name,
                                            channel->key_len / 8, channel->key);