+Mon Dec 2 16:28:29 EET 2002 Pekka Riikonen <priikone@silcnet.org>
+
+ * Fixed wrong invite and ban list handling in server command
+ reply. Affected files are silcd/command_reply.c,
+ silcd/server_util.[ch].
+
Sun Dec 1 20:48:17 EET 2002 Pekka Riikonen <priikone@silcnet.org>
* Fixed CMODE setting in server when founder mode was set.
/* Allocate hash table for invite list if it doesn't exist yet */
if (!channel->invite_list)
- channel->invite_list = silc_hash_table_alloc(0, silc_hash_ptr,
- NULL, NULL, NULL,
- NULL, NULL, TRUE);
+ channel->invite_list =
+ silc_hash_table_alloc(0, silc_hash_ptr,
+ NULL, NULL, NULL,
+ silc_server_inviteban_destruct, channel, TRUE);
/* Check if the ID is in the list already */
silc_hash_table_list(channel->invite_list, &htl);
if (tmp[0] == 0x00) {
/* Allocate hash table for invite list if it doesn't exist yet */
if (!channel->invite_list)
- channel->invite_list = silc_hash_table_alloc(0, silc_hash_ptr,
- NULL, NULL, NULL,
- NULL, NULL, TRUE);
+ channel->invite_list =
+ silc_hash_table_alloc(0, silc_hash_ptr,
+ NULL, NULL, NULL,
+ silc_server_inviteban_destruct, channel,
+ TRUE);
/* Check for resource limit */
if (silc_hash_table_count(channel->invite_list) > 64) {
if (tmp[0] == 0x00) {
/* Allocate hash table for ban list if it doesn't exist yet */
if (!channel->ban_list)
- channel->ban_list = silc_hash_table_alloc(0, silc_hash_ptr,
- NULL, NULL, NULL,
- NULL, NULL, TRUE);
+ channel->ban_list =
+ silc_hash_table_alloc(0, silc_hash_ptr,
+ NULL, NULL, NULL,
+ silc_server_inviteban_destruct, channel,
+ TRUE);
/* Check for resource limit */
if (silc_hash_table_count(channel->ban_list) > 64) {
/* Get the ban list */
tmp = silc_argument_get_arg_type(cmd->args, 8, &len);
if (tmp) {
- silc_free(entry->ban_list);
- entry->ban_list = silc_memdup(tmp, len);
+ SilcArgumentPayload iargs;
+ SilcUInt16 iargc;
+ SILC_GET16_MSB(iargc, tmp);
+ iargs = silc_argument_payload_parse(tmp + 2, len - 2, iargc);
+ if (iargs) {
+ /* Delete old ban list */
+ if (entry->ban_list)
+ silc_hash_table_free(entry->ban_list);
+ entry->ban_list =
+ silc_hash_table_alloc(0, silc_hash_ptr,
+ NULL, NULL, NULL,
+ silc_server_inviteban_destruct, entry, TRUE);
+
+ /* Add new ban list */
+ silc_server_inviteban_process(server, entry->ban_list, 0, iargs);
+ silc_argument_payload_free(iargs);
+ }
}
/* Get the invite list */
tmp = silc_argument_get_arg_type(cmd->args, 9, &len);
- if (tmp) {
- silc_free(entry->invite_list);
- entry->invite_list = silc_memdup(tmp, len);
+ if (tmp && len > 2) {
+ SilcArgumentPayload iargs;
+ SilcUInt16 iargc;
+ SILC_GET16_MSB(iargc, tmp);
+ iargs = silc_argument_payload_parse(tmp + 2, len - 2, iargc);
+ if (iargs) {
+ /* Delete old invite list */
+ if (entry->invite_list)
+ silc_hash_table_free(entry->invite_list);
+ entry->invite_list =
+ silc_hash_table_alloc(0, silc_hash_ptr,
+ NULL, NULL, NULL,
+ silc_server_inviteban_destruct, entry, TRUE);
+
+ /* Add new invite list */
+ silc_server_inviteban_process(server, entry->invite_list, 0, iargs);
+ silc_argument_payload_free(iargs);
+ }
}
/* Get the topic */
silc_free(entry->id);
silc_free(entry->topic);
- if (entry->invite_list) {
- silc_hash_table_list(entry->invite_list, &htl);
- while (silc_hash_table_get(&htl, (void **)&type, (void **)&tmp)) {
- if (type == 1) {
- silc_free((char *)tmp);
- continue;
- }
- silc_buffer_free(tmp);
- }
- silc_hash_table_list_reset(&htl);
+ if (entry->invite_list)
silc_hash_table_free(entry->invite_list);
- }
-
- if (entry->ban_list) {
- silc_hash_table_list(entry->ban_list, &htl);
- while (silc_hash_table_get(&htl, (void **)&type, (void **)&tmp)) {
- if (type == 1) {
- silc_free((char *)tmp);
- continue;
- }
- silc_buffer_free(tmp);
- }
- silc_hash_table_list_reset(&htl);
+ if (entry->ban_list)
silc_hash_table_free(entry->ban_list);
- }
if (entry->channel_key)
silc_cipher_free(entry->channel_key);
goto out;
if (action == 0 && !channel->invite_list)
- channel->invite_list = silc_hash_table_alloc(0, silc_hash_ptr,
- NULL, NULL, NULL,
- NULL, NULL, TRUE);
+ channel->invite_list =
+ silc_hash_table_alloc(0, silc_hash_ptr,
+ NULL, NULL, NULL,
+ silc_server_inviteban_destruct, channel, TRUE);
/* Proces the invite action */
silc_server_inviteban_process(server, channel->invite_list, action,
goto out;
if (action == 0 && !channel->ban_list)
- channel->ban_list = silc_hash_table_alloc(0, silc_hash_ptr,
- NULL, NULL, NULL,
- NULL, NULL, TRUE);
+ channel->ban_list =
+ silc_hash_table_alloc(0, silc_hash_ptr,
+ NULL, NULL, NULL,
+ silc_server_inviteban_destruct, channel, TRUE);
/* Proces the ban action */
silc_server_inviteban_process(server, channel->ban_list, action,
char *string = NULL, *start, *end, *n;
if (silc_hash_table_find(list, (void *)1, NULL, (void **)&string)) {
- silc_hash_table_del(list, (void *)1);
-
if (!strncmp(string, tmp, strlen(string) - 1)) {
- silc_free(string);
+ silc_hash_table_del(list, (void *)1);
string = NULL;
} else {
start = strstr(string, tmp);
n = silc_calloc(strlen(string) - len, sizeof(*n));
strncat(n, string, start - string);
strncat(n, end + 1, ((string + strlen(string)) - end) - 1);
- silc_free(string);
+ silc_hash_table_del(list, (void *)1);
string = n;
}
}
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);
- silc_buffer_free(tmp2);
break;
}
}
while (silc_hash_table_get(&htl, (void **)&type, (void **)&tmp2)) {
if (type == 3 && !memcmp(tmp2->data, tmp, len)) {
silc_hash_table_del_by_context(list, (void *)3, tmp2);
- silc_buffer_free(tmp2);
break;
}
}
}
}
}
+
+/* Destructor for invite or ban list entrys */
+
+void silc_server_inviteban_destruct(void *key, void *context,
+ void *user_context)
+{
+ switch ((SilcUInt32)key) {
+ case 1:
+ /* Invite string */
+ silc_free(context);
+ break;
+ case 2:
+ case 3:
+ /* Public key/Channel ID SilcBuffer */
+ silc_buffer_free(context);
+ break;
+ default:
+ break;
+ }
+}
void silc_server_inviteban_process(SilcServer server, SilcHashTable list,
SilcUInt8 action, SilcArgumentPayload args);
+/* Destructor for invite or ban list entrys */
+void silc_server_inviteban_destruct(void *key, void *context,
+ void *user_context);
+
#endif /* SERVER_UTIL_H */