X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fpacket_receive.c;h=07d1e1c86fad97b154863f60dee0baf6003a9169;hb=a818c5b5411bbc4436d1c5f011236985c96bb787;hp=e93774ae51d931c0766f9961a19986e9844fd9d1;hpb=da1c3bc287b33b27277030d0bd7b9bf0753228be;p=silc.git diff --git a/apps/silcd/packet_receive.c b/apps/silcd/packet_receive.c index e93774ae..07d1e1c8 100644 --- a/apps/silcd/packet_receive.c +++ b/apps/silcd/packet_receive.c @@ -46,9 +46,9 @@ void silc_server_notify(SilcServer server, SilcChannelClientEntry chl; SilcIDCacheEntry cache; SilcHashTableList htl; - uint32 mode; + SilcUInt32 mode; unsigned char *tmp; - uint32 tmp_len; + SilcUInt32 tmp_len; bool local; SILC_LOG_DEBUG(("Start")); @@ -212,6 +212,8 @@ void silc_server_notify(SilcServer server, /* The channel is global now */ channel->global_users = TRUE; + SILC_LOG_DEBUG(("Joining to channel %s", channel->channel_name)); + /* JOIN the global client to the channel (local clients (if router created the channel) is joined in the pending JOIN command). */ chl = silc_calloc(1, sizeof(*chl)); @@ -226,6 +228,7 @@ void silc_server_notify(SilcServer server, silc_hash_table_add(channel->user_list, client, chl); silc_hash_table_add(client->channels, channel, chl); silc_free(client_id); + channel->user_count++; break; @@ -628,6 +631,7 @@ void silc_server_notify(SilcServer server, if (chl2) { chl2->mode = mode; silc_free(channel_id); + silc_hash_table_list_reset(&htl); goto out; } } @@ -638,6 +642,8 @@ void silc_server_notify(SilcServer server, break; } + SILC_LOG_DEBUG(("Changing the channel user mode")); + /* Change the mode */ chl->mode = mode; if (!(mode & SILC_CHANNEL_UMODE_CHANFO)) @@ -646,6 +652,7 @@ void silc_server_notify(SilcServer server, chl2 = chl; } } + silc_hash_table_list_reset(&htl); /* Send the same notify to the channel */ if (!notify_sent) @@ -750,10 +757,10 @@ void silc_server_notify(SilcServer server, goto out; /* Get the channel entry */ - channel = silc_idlist_find_channel_by_id(server->global_list, + channel = silc_idlist_find_channel_by_id(server->local_list, channel_id, NULL); if (!channel) { - channel = silc_idlist_find_channel_by_id(server->local_list, + channel = silc_idlist_find_channel_by_id(server->global_list, channel_id, NULL); if (!channel) { silc_free(channel_id); @@ -780,9 +787,9 @@ void silc_server_notify(SilcServer server, silc_id_render(channel_id2, SILC_ID_CHANNEL))); /* Replace the Channel ID */ - if (!silc_idlist_replace_channel_id(server->global_list, channel_id, + if (!silc_idlist_replace_channel_id(server->local_list, channel_id, channel_id2)) - if (!silc_idlist_replace_channel_id(server->local_list, channel_id, + if (!silc_idlist_replace_channel_id(server->global_list, channel_id, channel_id2)) { silc_free(channel_id2); channel_id2 = NULL; @@ -790,7 +797,14 @@ void silc_server_notify(SilcServer server, if (channel_id2) { SilcBuffer users = NULL, users_modes = NULL; - + + /* Re-announce this channel which ID was changed. */ + silc_server_send_new_channel(server, sock, FALSE, channel->channel_name, + channel->id, + silc_id_get_len(channel->id, + SILC_ID_CHANNEL), + channel->mode); + /* Re-announce our clients on the channel as the ID has changed now */ silc_server_announce_get_channel_users(server, channel, &users, &users_modes); @@ -979,7 +993,7 @@ void silc_server_notify(SilcServer server, * Distribute the notify to local clients on channels */ unsigned char *id; - uint32 id_len; + SilcUInt32 id_len; SILC_LOG_DEBUG(("KILLED notify")); @@ -1179,7 +1193,7 @@ void silc_server_notify_list(SilcServer server, { SilcPacketContext *new; SilcBuffer buffer; - uint16 len; + SilcUInt16 len; SILC_LOG_DEBUG(("Processing Notify List")); @@ -1509,8 +1523,8 @@ SilcClientEntry silc_server_new_client(SilcServer server, SilcBuffer reply; SilcIDListData idata; char *username = NULL, *realname = NULL, *id_string; - uint16 username_len; - uint32 id_len; + SilcUInt16 username_len; + SilcUInt32 id_len; int ret; char *hostname, *nickname; int nickfail = 0; @@ -1575,8 +1589,7 @@ SilcClientEntry silc_server_new_client(SilcServer server, int tlen = strcspn(username, "@"); char *phostname = NULL; - hostname = silc_calloc((strlen(username) - tlen) + 1, sizeof(char)); - memcpy(hostname, username + tlen + 1, strlen(username) - tlen - 1); + hostname = silc_memdup(username + tlen + 1, strlen(username) - tlen - 1); if (strcmp(sock->hostname, sock->ip) && strcmp(sock->hostname, hostname)) { @@ -1759,7 +1772,7 @@ SilcServerEntry silc_server_new_server(SilcServer server, SilcServerID *server_id; SilcIDListData idata; unsigned char *server_name, *id_string; - uint16 id_len, name_len; + SilcUInt16 id_len, name_len; int ret; bool local = TRUE; @@ -2097,7 +2110,7 @@ void silc_server_new_id_list(SilcServer server, SilcSocketConnection sock, { SilcPacketContext *new_id; SilcBuffer idp; - uint16 id_len; + SilcUInt16 id_len; SILC_LOG_DEBUG(("Processing New ID List")); @@ -2169,10 +2182,10 @@ void silc_server_new_channel(SilcServer server, SilcChannelPayload payload; SilcChannelID *channel_id; char *channel_name; - uint32 name_len; + SilcUInt32 name_len; unsigned char *id; - uint32 id_len; - uint32 mode; + SilcUInt32 id_len; + SilcUInt32 mode; SilcServerEntry server_entry; SilcChannelEntry channel; @@ -2375,7 +2388,7 @@ void silc_server_new_channel_list(SilcServer server, { SilcPacketContext *new; SilcBuffer buffer; - uint16 len1, len2; + SilcUInt16 len1, len2; SILC_LOG_DEBUG(("Processing New Channel List")); @@ -2486,10 +2499,10 @@ void silc_server_connection_auth_request(SilcServer server, SilcSocketConnection sock, SilcPacketContext *packet) { - SilcServerConfigSectionClientConnection *client = NULL; - uint16 conn_type; - int ret, port; - SilcAuthMethod auth_meth; + SilcServerConfigClient *client = NULL; + SilcUInt16 conn_type; + int ret; + SilcAuthMethod auth_meth = SILC_AUTH_NONE; SILC_LOG_DEBUG(("Start")); @@ -2509,21 +2522,21 @@ void silc_server_connection_auth_request(SilcServer server, /* Get the authentication method for the client */ auth_meth = SILC_AUTH_NONE; - port = server->sockets[server->sock]->port; /* Listenning port */ - client = silc_server_config_find_client_conn(server->config, - sock->ip, - port); + client = silc_server_config_find_client(server, sock->ip); if (!client) - client = silc_server_config_find_client_conn(server->config, - sock->hostname, - port); - if (client) - auth_meth = client->auth_meth; - + client = silc_server_config_find_client(server, sock->hostname); + if (client) { + if (client->passphrase) { + if (client->publickey && !server->config->prefer_passphrase_auth) + auth_meth = SILC_AUTH_PUBLIC_KEY; + else + auth_meth = SILC_AUTH_PASSWORD; + } else if (client->publickey) + auth_meth = SILC_AUTH_PUBLIC_KEY; + } + /* Send it back to the client */ - silc_server_send_connection_auth_request(server, sock, - conn_type, - auth_meth); + silc_server_send_connection_auth_request(server, sock, conn_type, auth_meth); } /* Received REKEY packet. The sender of the packet wants to regenerate