Fixed bugs in invite list handling in INVITE comman.
no arguments) or when list was modified. Affected file
silcd/command.c.
+ * Remove client from invite list in KILLED notify and in
+ KILL command. Affected file silcd/command.c and
+ silcd/server.[ch].
+
+ * Fixed bugs in invite list handling in INVITE command.
+ Affected files silcd/command.c and silcd/server_util.c.
+
Mon Nov 25 18:21:43 EET 2002 Pekka Riikonen <priikone@silcnet.org>
* The silc_argument_get_[first/next] now return the argument
/* Do normal signoff for the destination client */
sock = remote_client->connection;
+ silc_server_remove_from_channels(server, NULL, remote_client,
+ TRUE, (char *)"Killed", TRUE, TRUE);
silc_server_free_client_data(server, NULL, remote_client, TRUE,
comment ? comment :
(unsigned char *)"Killed");
client_id, FALSE, NULL);
if (client) {
silc_server_remove_from_channels(server, NULL, client, TRUE,
- NULL, TRUE);
+ NULL, TRUE, FALSE);
silc_idlist_del_data(client);
silc_idlist_del_client(server->global_list, client);
}
silc_schedule_task_del_by_context(server->schedule, client);
/* Remove the client from all channels. */
- silc_server_remove_from_channels(server, NULL, client, TRUE, tmp, FALSE);
+ silc_server_remove_from_channels(server, NULL, client, TRUE,
+ tmp, FALSE, FALSE);
/* Check if anyone is watching this nickname */
if (server->server_type == SILC_ROUTER)
/* Remove the client from all channels. */
silc_server_remove_from_channels(server, NULL, client,
- TRUE, NULL, FALSE);
+ TRUE, NULL, FALSE, FALSE);
/* Check if anyone is watching this nickname */
if (server->server_type == SILC_ROUTER)
/* Remove the client from all channels */
silc_server_remove_from_channels(server, NULL, client, FALSE, NULL,
- FALSE);
+ FALSE, TRUE);
/* Check if anyone is watching this nickname */
silc_server_check_watcher_list(server, client, NULL,
client_id, FALSE, NULL);
if (client) {
silc_server_remove_from_channels(server, NULL, client, TRUE,
- NULL, TRUE);
+ NULL, TRUE, FALSE);
silc_idlist_del_data(client);
silc_idlist_del_client(server->global_list, client);
}
server->stat.clients--;
if (server->stat.cell_clients)
server->stat.cell_clients--;
- silc_server_remove_from_channels(server, NULL, client, FALSE, NULL, FALSE);
+ silc_server_remove_from_channels(server, NULL, client, FALSE,
+ NULL, FALSE, FALSE);
silc_server_del_from_watcher_list(server, client);
if (!silc_idlist_del_client(server->local_list, client))
silc_idlist_del_client(server->global_list, client);
/* Remove client from all channels */
if (notify)
silc_server_remove_from_channels(server, NULL, client,
- TRUE, (char *)signoff, TRUE);
+ TRUE, (char *)signoff, TRUE, FALSE);
else
silc_server_remove_from_channels(server, NULL, client,
- FALSE, NULL, FALSE);
+ FALSE, NULL, FALSE, FALSE);
/* Remove this client from watcher list if it is */
silc_server_del_from_watcher_list(server, client);
SilcClientEntry client,
bool notify,
const char *signoff_message,
- bool keygen)
+ bool keygen,
+ bool killed)
{
SilcChannelEntry channel;
SilcChannelClientEntry chl;
signoff_message, signoff_message ?
strlen(signoff_message) : 0);
+ if (killed && clidp) {
+ /* Remove the client from channel's invite list */
+ if (channel->invite_list &&
+ silc_hash_table_count(channel->invite_list)) {
+ SilcBuffer ab;
+ SilcArgumentPayload iargs;
+ ab = silc_argument_payload_encode_one(NULL, clidp->data,
+ clidp->len, 3);
+ iargs = silc_argument_payload_parse(ab->data, ab->len, 1);
+ silc_server_inviteban_process(server, channel->invite_list, 1, iargs);
+ silc_buffer_free(ab);
+ silc_argument_payload_free(iargs);
+ }
+ }
+
/* Don't create keys if we are shutting down */
if (server->server_shutdown)
continue;
SilcClientEntry client,
bool notify,
const char *signoff_message,
- bool keygen);
+ bool keygen, bool killed);
bool silc_server_remove_from_one_channel(SilcServer server,
SilcSocketConnection sock,
SilcChannelEntry channel,
return;
SILC_LOG_DEBUG(("Remove client %s from all channels",
- client->nickname ? client->nickname : ""));
+ client->nickname ? client->nickname :
+ (unsigned char *)""));
if (silc_hash_table_find(clients, client, NULL, NULL))
silc_hash_table_del(clients, client);
/* Remove the client from all channels. This generates new keys to the
channels as well. */
silc_server_remove_from_channels(server, NULL, remote_client, FALSE,
- NULL, TRUE);
+ NULL, TRUE, FALSE);
/* Remove the client entry, If it is locally connected then we will also
disconnect the client here */
unsigned char *tmp = NULL;
SilcUInt32 len = 0, t;
SilcHashTableList htl;
- SilcBuffer entry;
+ SilcBuffer entry, idp = NULL;
bool ret = FALSE;
if (type < 1 || type > 3 || !check)
return FALSE;
}
if (type == 3) {
- tmp = silc_id_id2str(check, SILC_ID_CLIENT);
- if (!tmp)
+ idp = silc_id_payload_encode(check, SILC_ID_CLIENT);
+ if (!idp)
return FALSE;
- len = silc_id_get_len(check, SILC_ID_CLIENT);
+ tmp = idp->data;
+ len = idp->len;
}
/* Compare the list */
}
silc_hash_table_list_reset(&htl);
- silc_free(tmp);
+ if (!idp)
+ silc_free(tmp);
+ silc_buffer_free(idp);
return ret;
}
/* Delete from the invite list */
silc_hash_table_list(list, &htl);
while (silc_hash_table_get(&htl, (void **)&type, (void **)&tmp2)) {
- if (type == 2 && !memcmp(tmp2->data, tmp, len)) {
- silc_hash_table_del_by_context(list, (void *)2, tmp2);
+ if (type == 3 && !memcmp(tmp2->data, tmp, len)) {
+ silc_hash_table_del_by_context(list, (void *)3, tmp2);
silc_buffer_free(tmp2);
break;
}