X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/1117fc5a8fda9e591ea33b418fadbd4f220fb834..921592dd1adaed54948c030be0daceb7e0c9d5b7:/src/chanserv.c diff --git a/src/chanserv.c b/src/chanserv.c index 3cd0ff1..6bdff9f 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -1,7 +1,7 @@ /* chanserv.c - Channel service bot * Copyright 2000-2004 srvx Development Team * - * This file is part of srvx. + * This file is part of x3. * * srvx is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -1212,7 +1212,7 @@ add_channel_ban(struct chanData *channel, const char *mask, char *owner, time_t safestrncpy(bd->mask, mask, sizeof(bd->mask)); if(owner) safestrncpy(bd->owner, owner, sizeof(bd->owner)); - bd->reason = reason ? strdup(reason) : NULL; + bd->reason = strdup(reason); if(expires) timeq_add(expires, expire_ban, bd); @@ -1708,7 +1708,6 @@ chanserv_get_owned_count(struct handle_info *hi) static CHANSERV_FUNC(cmd_register) { - struct mod_chanmode *change; struct handle_info *handle; struct chanData *cData; struct modeNode *mn; @@ -1731,7 +1730,8 @@ static CHANSERV_FUNC(cmd_register) return 0; } - if(!IsHelping(user) && (!(mn = GetUserMode(channel, user)) || !(mn->modes & MODE_CHANOP))) + if(!IsHelping(user) + && (!(mn = GetUserMode(channel, user)) || !(mn->modes & MODE_CHANOP))) { reply("CSMSG_MUST_BE_OPPED", channel->name); return 0; @@ -1799,12 +1799,19 @@ static CHANSERV_FUNC(cmd_register) cData->modes = chanserv_conf.default_modes; if(off_channel > 0) cData->modes.modes_set |= MODE_REGISTERED; - change = mod_chanmode_dup(&cData->modes, 1); - change->args[change->argc].mode = MODE_CHANOP; - change->args[change->argc].u.member = AddChannelUser(chanserv, channel); - change->argc++; - mod_chanmode_announce(chanserv, channel, change); - mod_chanmode_free(change); + if (IsOffChannel(cData)) + { + mod_chanmode_announce(chanserv, channel, &cData->modes); + } + else + { + struct mod_chanmode *change = mod_chanmode_dup(&cData->modes, 1); + change->args[change->argc].mode = MODE_CHANOP; + change->args[change->argc].u.member = AddChannelUser(chanserv, channel); + change->argc++; + mod_chanmode_announce(chanserv, channel, change); + mod_chanmode_free(change); + } /* Initialize the channel's max user record. */ cData->max = channel->members.used; @@ -3119,8 +3126,9 @@ find_matching_bans(struct banList *bans, struct userNode *actee, const char *mas if(!match[ii]) continue; change->args[count].mode = MODE_REMOVE | MODE_BAN; - change->args[count++].u.hostmask = bans->list[ii]->ban; + change->args[count++].u.hostmask = strdup(bans->list[ii]->ban); } + assert(count == change->argc); return change; } @@ -3153,6 +3161,10 @@ unban_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c change = find_matching_bans(&channel->banlist, actee, mask); if(change) { + unsigned int ii; + + for(ii = 0; ii < change->argc; ++ii) + free((char*)change->args[ii].u.hostmask); modcmd_chanmode_announce(change); mod_chanmode_free(change); acted = 1; @@ -3230,9 +3242,11 @@ static CHANSERV_FUNC(cmd_unbanall) for(ii=0; iibanlist.used; ii++) { change->args[ii].mode = MODE_REMOVE | MODE_BAN; - change->args[ii].u.hostmask = channel->banlist.list[ii]->ban; + change->args[ii].u.hostmask = strdup(channel->banlist.list[ii]->ban); } modcmd_chanmode_announce(change); + for(ii = 0; ii < change->argc; ++ii) + free((char*)change->args[ii].u.hostmask); mod_chanmode_free(change); reply("CSMSG_BANS_REMOVED", channel->name); return 1; @@ -3241,6 +3255,7 @@ static CHANSERV_FUNC(cmd_unbanall) static CHANSERV_FUNC(cmd_open) { struct mod_chanmode *change; + unsigned int ii; change = find_matching_bans(&channel->banlist, user, NULL); if(!change) @@ -3251,6 +3266,8 @@ static CHANSERV_FUNC(cmd_open) change->modes_clear &= ~channel->channel_info->modes.modes_set; modcmd_chanmode_announce(change); reply("CSMSG_CHANNEL_OPENED", channel->name); + for(ii = 0; ii < change->argc; ++ii) + free((char*)change->args[ii].u.hostmask); mod_chanmode_free(change); return 1; } @@ -4544,18 +4561,21 @@ chanserv_expire_suspension(void *data) { struct suspended *suspended = data; struct chanNode *channel; - struct mod_chanmode change; if(!suspended->expires || (now < suspended->expires)) suspended->revoked = now; channel = suspended->cData->channel; suspended->cData->channel = channel; suspended->cData->flags &= ~CHANNEL_SUSPENDED; - mod_chanmode_init(&change); - change.argc = 1; - change.args[0].mode = MODE_CHANOP; - change.args[0].u.member = AddChannelUser(chanserv, channel); - mod_chanmode_announce(chanserv, channel, &change); + if(!IsOffChannel(suspended->cData)) + { + struct mod_chanmode change; + mod_chanmode_init(&change); + change.argc = 1; + change.args[0].mode = MODE_CHANOP; + change.args[0].u.member = AddChannelUser(chanserv, channel); + mod_chanmode_announce(chanserv, channel, &change); + } } static CHANSERV_FUNC(cmd_csuspend) @@ -5599,8 +5619,15 @@ static CHANSERV_FUNC(cmd_giveownership) new_owner = GetChannelAccess(cData, new_owner_hi); if(!new_owner) { - reply("CSMSG_NO_CHAN_USER", new_owner_hi->handle, channel->name); - return 0; + if(force) + { + new_owner = add_channel_user(cData, new_owner_hi, UL_COOWNER, 0, NULL); + } + else + { + reply("CSMSG_NO_CHAN_USER", new_owner_hi->handle, channel->name); + return 0; + } } if((chanserv_get_owned_count(new_owner_hi) >= chanserv_conf.max_owned) && !force) { @@ -6366,7 +6393,7 @@ handle_mode(struct chanNode *channel, struct userNode *user, const struct mod_ch if(!bounce) bounce = mod_chanmode_alloc(change->argc + 1 - ii); bounce->args[bnc].mode = MODE_REMOVE | MODE_BAN; - bounce->args[bnc].u.hostmask = ban; + bounce->args[bnc].u.hostmask = strdup(ban); bnc++; send_message(user, chanserv, "CSMSG_MASK_PROTECTED", ban); } @@ -6375,6 +6402,9 @@ handle_mode(struct chanNode *channel, struct userNode *user, const struct mod_ch { if((bounce->argc = bnc) || bounce->modes_set || bounce->modes_clear) mod_chanmode_announce(chanserv, channel, bounce); + for(ii = 0; ii < change->argc; ++ii) + if(bounce->args[ii].mode == (MODE_REMOVE | MODE_BAN)) + free((char*)bounce->args[ii].u.hostmask); mod_chanmode_free(bounce); } } @@ -6612,8 +6642,6 @@ chanserv_conf_read(void) else strlist = alloc_string_list(2); chanserv_conf.old_ban_names = strlist; - /* the variable itself is actually declared in proto-common.c; this is equally - * parse issue. */ str = database_get_data(conf_node, "off_channel", RECDB_QSTRING); off_channel = str ? atoi(str) : 0; } @@ -6730,6 +6758,8 @@ ban_read_helper(const char *key, struct record_data *rd, struct chanData *chan) s_expires = database_get_data(rd->d.object, KEY_EXPIRES, RECDB_QSTRING); owner = database_get_data(rd->d.object, KEY_OWNER, RECDB_QSTRING); reason = database_get_data(rd->d.object, KEY_REASON, RECDB_QSTRING); + if (!reason || !owner) + return; set_time = set ? (time_t)strtoul(set, NULL, 0) : now; triggered_time = triggered ? (time_t)strtoul(triggered, NULL, 0) : 0; @@ -6740,7 +6770,7 @@ ban_read_helper(const char *key, struct record_data *rd, struct chanData *chan) else expires_time = 0; - if(expires_time && (expires_time < now)) + if(!reason || (expires_time && (expires_time < now))) return; bData = add_channel_ban(chan, key, owner, set_time, triggered_time, expires_time, reason);