X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=apps%2Fsilcd%2Fcommand.c;h=b4d5bcee37adf53669b7e5e77dde3ac515eb6dae;hp=62ada13ed4d422259ff453e8d02a59b1119bf01d;hb=d47a87b03b846e2333ef57b2c0d81f1644992964;hpb=1eb298744baad994b2a6cda057c9125e27729e6f diff --git a/apps/silcd/command.c b/apps/silcd/command.c index 62ada13e..b4d5bcee 100644 --- a/apps/silcd/command.c +++ b/apps/silcd/command.c @@ -131,7 +131,6 @@ static int silc_server_is_registered(SilcServer server, silc_server_command_send_status_reply(cmd, command, SILC_STATUS_ERR_NOT_REGISTERED); - silc_server_command_free(cmd); return FALSE; } @@ -149,6 +148,11 @@ SILC_TASK_CALLBACK(silc_server_command_process_timeout) SilcServerCommandTimeout timeout = (SilcServerCommandTimeout)context; SilcClientEntry client = (SilcClientEntry)timeout->ctx->sock->user_data; + if (!client) { + silc_server_command_free(timeout->ctx); + silc_free(timeout); + } + /* Update access time */ client->last_command = time(NULL); @@ -159,6 +163,8 @@ SILC_TASK_CALLBACK(silc_server_command_process_timeout) timeout->ctx, timeout->cmd->cmd)) timeout->cmd->cb(timeout->ctx, NULL); + else + silc_server_command_free(timeout->ctx); silc_free(timeout); } @@ -233,15 +239,12 @@ void silc_server_command_process(SilcServer server, silc_server_command_process_timeout, (void *)timeout, 2 - (time(NULL) - client->last_command), 0, - SILC_TASK_TIMEOUT, - SILC_TASK_PRI_NORMAL); + SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL); else silc_schedule_task_add(server->schedule, sock->sock, silc_server_command_process_timeout, - (void *)timeout, - 0, 1, - SILC_TASK_TIMEOUT, - SILC_TASK_PRI_NORMAL); + (void *)timeout, 0, 1, + SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL); return; } @@ -251,6 +254,8 @@ void silc_server_command_process(SilcServer server, cmd->cb(ctx, NULL); else if (silc_server_is_registered(server, sock, ctx, cmd->cmd)) cmd->cb(ctx, NULL); + else + silc_server_command_free(ctx); } /* Allocate Command Context */ @@ -561,6 +566,8 @@ silc_server_command_whois_check(SilcServerCommandContext cmd, int i, k; bool no_res = TRUE; + SILC_LOG_DEBUG(("Start")); + for (i = 0; i < clients_count; i++) { entry = clients[i]; if (!entry) @@ -1059,7 +1066,6 @@ silc_server_command_whowas_check(SilcServerCommandContext cmd, silc_server_command_whowas, silc_server_command_dup(cmd)); cmd->pending = TRUE; - silc_command_set_ident(cmd->payload, old_ident); silc_buffer_free(tmpbuf); @@ -1077,36 +1083,53 @@ silc_server_command_whowas_send_reply(SilcServerCommandContext cmd, { SilcServer server = cmd->server; char *tmp; - int i, count = 0, len; + int i, k, count = 0, len; SilcBuffer packet, idp; SilcClientEntry entry = NULL; SilcCommandStatus status; uint16 ident = silc_command_get_ident(cmd->payload); - char found = FALSE; char nh[256], uh[256]; + int valid_count; status = SILC_STATUS_OK; - if (clients_count > 1) - status = SILC_STATUS_LIST_START; + /* Process only entries that are not registered anymore. */ + valid_count = 0; for (i = 0; i < clients_count; i++) { - entry = clients[i]; + if (clients[i]->data.status & SILC_IDLIST_STATUS_REGISTERED) + clients[i] = NULL; + else + valid_count++; + } - /* We will take only clients that are not valid anymore. They are the - ones that are not registered anymore but still have a ID. They - have disconnected us, and thus valid for WHOWAS. */ - if (entry->data.status & SILC_IDLIST_STATUS_REGISTERED || !entry->id) - continue; + if (!valid_count) { + /* No valid entries found at all, just send error */ + unsigned char *tmp; + + tmp = silc_argument_get_arg_type(cmd->args, 1, NULL); + if (tmp) + silc_server_command_send_status_data(cmd, SILC_COMMAND_WHOWAS, + SILC_STATUS_ERR_NO_SUCH_NICK, + 3, tmp, strlen(tmp)); + return; + } - if (count && i - 1 == count) - break; + if (valid_count > 1) + status = SILC_STATUS_LIST_START; - found = TRUE; + for (i = 0, k = 0; i < clients_count; i++) { + entry = clients[i]; + if (!entry) + continue; - if (clients_count > 2) + if (k >= 1) status = SILC_STATUS_LIST_ITEM; - if (clients_count > 1 && i == clients_count - 1) + if (valid_count > 1 && k == valid_count - 1) status = SILC_STATUS_LIST_END; + if (count && k - 1 == count) + status = SILC_STATUS_LIST_END; + if (count && k - 1 > count) + break; /* Send WHOWAS reply */ idp = silc_id_payload_encode(entry->id, SILC_ID_CLIENT); @@ -1147,13 +1170,9 @@ silc_server_command_whowas_send_reply(SilcServerCommandContext cmd, silc_buffer_free(packet); silc_buffer_free(idp); - } - if (found == FALSE && entry) - silc_server_command_send_status_data(cmd, SILC_COMMAND_WHOWAS, - SILC_STATUS_ERR_NO_SUCH_NICK, - 3, entry->nickname, - strlen(entry->nickname)); + k++; + } } static int @@ -1193,7 +1212,6 @@ silc_server_command_whowas_process(SilcServerCommandContext cmd) silc_server_command_whowas, silc_server_command_dup(cmd)); cmd->pending = TRUE; - silc_command_set_ident(cmd->payload, old_ident); silc_buffer_free(tmpbuf); @@ -2831,10 +2849,10 @@ SILC_SERVER_CMD_FUNC(info) memset(info_string, 0, sizeof(info_string)); snprintf(info_string, sizeof(info_string), "location: %s server: %s admin: %s <%s>", - server->config->admin_info->location, - server->config->admin_info->server_type, - server->config->admin_info->admin_name, - server->config->admin_info->admin_email); + server->config->server_info->location, + server->config->server_info->server_type, + server->config->server_info->admin, + server->config->server_info->email); server_info = info_string; entry = server->id_entry; @@ -3247,24 +3265,24 @@ static void silc_server_command_join_channel(SilcServer server, /* Distribute the channel key to all backup routers. */ silc_server_backup_send(server, NULL, SILC_PACKET_CHANNEL_KEY, 0, keyp->data, keyp->len, FALSE, TRUE); + } - /* If client became founder by providing correct founder auth data - notify the mode change to the channel. */ - if (founder) { - SILC_PUT32_MSB(chl->mode, mode); - silc_server_send_notify_to_channel(server, NULL, channel, FALSE, - SILC_NOTIFY_TYPE_CUMODE_CHANGE, 3, - clidp->data, clidp->len, - mode, 4, clidp->data, clidp->len); + /* If client became founder by providing correct founder auth data + notify the mode change to the channel. */ + if (founder) { + SILC_PUT32_MSB(chl->mode, mode); + silc_server_send_notify_to_channel(server, NULL, channel, FALSE, + SILC_NOTIFY_TYPE_CUMODE_CHANGE, 3, + clidp->data, clidp->len, + mode, 4, clidp->data, clidp->len); - /* Set CUMODE notify type to network */ - if (!server->standalone) - silc_server_send_notify_cumode(server, server->router->connection, - server->server_type == SILC_ROUTER ? - TRUE : FALSE, channel, - chl->mode, client->id, SILC_ID_CLIENT, - client->id); - } + /* Set CUMODE notify type to network */ + if (!server->standalone) + silc_server_send_notify_cumode(server, server->router->connection, + server->server_type == SILC_ROUTER ? + TRUE : FALSE, channel, + chl->mode, client->id, SILC_ID_CLIENT, + client->id); } silc_buffer_free(reply); @@ -3391,6 +3409,8 @@ SILC_SERVER_CMD_FUNC(join) silc_server_command_join, silc_server_command_dup(cmd)); cmd->pending = TRUE; + silc_command_set_ident(cmd->payload, old_ident); + silc_buffer_free(tmpbuf); goto out; } @@ -3454,7 +3474,8 @@ SILC_SERVER_CMD_FUNC(join) if (silc_command_get(reply->payload) == SILC_COMMAND_JOIN) { tmp = silc_argument_get_arg_type(reply->args, 6, NULL); SILC_GET32_MSB(created, tmp); - create_key = FALSE; /* Router returned the key already */ + if (silc_argument_get_arg_type(reply->args, 7, NULL)) + create_key = FALSE; /* Router returned the key already */ } if (silc_command_get(reply->payload) == SILC_COMMAND_WHOIS && @@ -3505,10 +3526,10 @@ SILC_SERVER_CMD_FUNC(motd) idp = silc_id_payload_encode(server->id_entry->id, SILC_ID_SERVER); - if (server->config && server->config->motd && - server->config->motd->motd_file) { + if (server->config && server->config->server_info && + server->config->server_info->motd_file) { /* Send motd */ - motd = silc_file_readfile(server->config->motd->motd_file, &motd_len); + motd = silc_file_readfile(server->config->server_info->motd_file, &motd_len); if (!motd) goto out; @@ -4562,7 +4583,7 @@ SILC_SERVER_CMD_FUNC(oper) SilcClientEntry client = (SilcClientEntry)cmd->sock->user_data; unsigned char *username, *auth; uint32 tmp_len; - SilcServerConfigSectionAdminConnection *admin; + SilcServerConfigSectionAdmin *admin; SilcIDListData idata = (SilcIDListData)client; SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_OPER, cmd, 1, 2); @@ -4640,7 +4661,7 @@ SILC_SERVER_CMD_FUNC(silcoper) SilcClientEntry client = (SilcClientEntry)cmd->sock->user_data; unsigned char *username, *auth; uint32 tmp_len; - SilcServerConfigSectionAdminConnection *admin; + SilcServerConfigSectionAdmin *admin; SilcIDListData idata = (SilcIDListData)client; SILC_SERVER_COMMAND_CHECK(SILC_COMMAND_SILCOPER, cmd, 1, 2); @@ -4888,7 +4909,7 @@ SILC_SERVER_CMD_FUNC(ban) 2, id, id_len, 3, channel->ban_list, channel->ban_list ? - strlen(channel->ban_list) : 0); + strlen(channel->ban_list) -1 : 0); silc_server_packet_send(server, cmd->sock, SILC_PACKET_COMMAND_REPLY, 0, packet->data, packet->len, FALSE); @@ -5360,7 +5381,6 @@ SILC_SERVER_CMD_FUNC(getkey) silc_server_command_getkey, silc_server_command_dup(cmd)); cmd->pending = TRUE; - silc_command_set_ident(cmd->payload, old_ident); silc_buffer_free(tmpbuf); goto out;