X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/6b912b175d414f87e4f61ab5d2a16dd428c36355..9895149b20f675f169119ee9271b1aba01fed896:/src/chanserv.c diff --git a/src/chanserv.c b/src/chanserv.c index 00faf6d..06a67fd 100644 --- a/src/chanserv.c +++ b/src/chanserv.c @@ -257,6 +257,7 @@ static const struct message_entry msgtab[] = { { "CSMSG_DURATION_TOO_LOW", "Timed bans must last for at least 15 seconds." }, { "CSMSG_DURATION_TOO_HIGH", "Timed bans must last for less than 2 years." }, { "CSMSG_LAME_MASK", "$b%s$b is a little too general. Try making it more specific." }, + { "CSMSG_NO_EXTBANS", "$b%s$b is an extended ban, which are not allowed." }, { "CSMSG_MASK_PROTECTED", "Sorry, ban for $b%s$b conflicts with a protected user's hostmask." }, { "CSMSG_NO_MATCHING_USERS", "No one in $b%s$b has a hostmask matching $b%s$b." }, { "CSMSG_BAN_NOT_FOUND", "Sorry, no ban or LAMER found: $b%s$b." }, @@ -3289,6 +3290,7 @@ static CHANSERV_FUNC(cmd_deluser) struct userData *victim; struct userData *actor, *real_actor; unsigned short access_level, override = 0; + unsigned short access_level_user = 0; char *chan_name; REQUIRE_PARAMS(2); @@ -3309,14 +3311,15 @@ static CHANSERV_FUNC(cmd_deluser) { access_level = user_level_from_name(argv[1], UL_OWNER); char *useraccess = user_level_name_from_level(victim->access); + access_level_user = user_level_from_name(useraccess, UL_OWNER); if(!access_level) { reply("CSMSG_INVALID_ACCESS", argv[1]); return 0; } - if(strcasecmp(argv[1], useraccess)) + if(access_level != access_level_user) { - reply("CSMSG_INCORRECT_ACCESS", handle->handle, user_level_name_from_level(victim->access), argv[1]); + reply("CSMSG_INCORRECT_ACCESS", handle->handle, useraccess, argv[1]); return 0; } } @@ -3807,6 +3810,13 @@ bad_channel_ban(struct chanNode *channel, struct userNode *user, const char *ban return 0; } +int is_extban(char *b) { + if(*b == '~') { + return 1; + } + return 0; +} + static int eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, char *argv[], struct svccmd *cmd, int action) { @@ -3934,6 +3944,13 @@ eject_user(struct userNode *user, struct chanNode *channel, unsigned int argc, c reply("CSMSG_LAME_MASK", argv[1]); return 0; } + //TODO: We have no support to do protection etc etc so for now we dont let you use x3 to set extended bans. + if(is_extban(argv[1])) + { + if(cmd) + reply("CSMSG_NO_EXTBANS", argv[1]); + return 0; + } if((action == ACTION_KICK) && (victimCount == 0)) { @@ -4258,7 +4275,8 @@ void expire_bans(UNUSED_ARG(void* data)) /* Real bans, not lamers */ count = 0; /* First find out how many bans were going to unset */ for (jj=0; jj < channel->channel->banlist.used; ++jj) { - if(channel->channel->banlist.list[jj]->set < bantimeout) + //TODO: for now, were just not removing extended bans, but ultimately some types we should, some shouldn't...see below + if(channel->channel->banlist.list[jj]->set < bantimeout && !is_extban(channel->channel->banlist.list[jj]->ban)) count++; } if(count > 0) { @@ -4268,7 +4286,8 @@ void expire_bans(UNUSED_ARG(void* data)) /* Real bans, not lamers */ /* Walk over every ban in this channel.. */ for (jj=0; jj < channel->channel->banlist.used; ++jj) { bn = channel->channel->banlist.list[jj]; - if (bn->set < bantimeout) { + //TODO: for now, were just not removing extended bans, but ultimately some types we should, some shouldn't...see above + if (bn->set < bantimeout && !is_extban(bn->ban)) { log_module(CS_LOG, LOG_DEBUG, "Removing ban %s from %s", bn->ban, channel->channel->name); /* Add this ban to the mode change */ @@ -4413,6 +4432,7 @@ static CHANSERV_FUNC(cmd_unbanall) return 0; } + // TODO: dont remove some kinds of extended bans such as ~c change = mod_chanmode_alloc(channel->banlist.used); for(ii=0; iibanlist.used; ii++) { @@ -5540,7 +5560,7 @@ send_staff_list(struct userNode *to, struct userList *list, int skip_flags) user = list->list[nn]; if(user->modes & skip_flags) continue; - if(IsBot(user)) + if(IsBot(user) || IsHideOper(user)) continue; table.contents[table.length] = alloca(table.width*sizeof(**table.contents)); if(IsAway(user)) @@ -5679,6 +5699,9 @@ resync_channel(struct chanNode *channel) } else /* Give various userlevels their modes.. */ { + /* If the user has autoop/autovoice disabled then ignore them */ + if(uData && !IsUserAutoOp(uData)) + continue; if(uData && uData->access >= UL_OP ) { if(!(mn->modes & MODE_CHANOP)) @@ -6650,7 +6673,7 @@ static MODCMD_FUNC(chan_opt_maxsetinfo) if(argc > 1) { charmax = atoi(argv[1]); - if ((charmax > 0) && (charmax < chanserv_conf.max_userinfo_length)) + if ((charmax > 0) && (charmax <= chanserv_conf.max_userinfo_length)) channel->channel_info->maxsetinfo = charmax; } @@ -7814,14 +7837,12 @@ static CHANSERV_FUNC(cmd_spin) char *oldnick = NULL; char *oldident = NULL; - char *oldhost = NULL; char abusednick[NICKLEN] = ""; int abusednum = 1 + (int) (10000.0 * (rand() / (RAND_MAX + 1.0))); struct userNode *clone; oldnick = strdup(user->nick); oldident = strdup(user->ident); - oldhost = strdup(user->hostname); //snprintf(abusednick, NICKLEN, "Abused%d", abusednum+(1 + rand() % 120)); while (1) { @@ -7833,7 +7854,7 @@ static CHANSERV_FUNC(cmd_spin) SVSNickChange(user, abusednick); irc_svsnick(chanserv, user, abusednick); - clone = AddLocalUser(oldnick, oldident, oldhost, "I got abused by the wheel of misfortune :D", "+i"); + clone = AddLocalUser(oldnick, oldident, "abused.by.wheel.of.misfortune", "I got abused by the wheel of misfortune :D", "+i"); timeq_add(now + 300, chanserv_remove_abuse, clone->nick); } /* kill */ @@ -9986,8 +10007,8 @@ init_chanserv(const char *nick) modcmd_register(chanserv_module, "dnrsearch remove", NULL, 0, 0, NULL); modcmd_register(chanserv_module, "dnrsearch count", NULL, 0, 0, NULL); DEFINE_COMMAND(move, 1, MODCMD_REQUIRE_AUTHED|MODCMD_REQUIRE_REGCHAN, "template", "register", NULL); - DEFINE_COMMAND(csuspend, 2, MODCMD_REQUIRE_AUTHED|MODCMD_REQUIRE_REGCHAN, "flags", "+helping", NULL); - DEFINE_COMMAND(cunsuspend, 1, MODCMD_REQUIRE_AUTHED|MODCMD_REQUIRE_REGCHAN, "flags", "+helping", NULL); + DEFINE_COMMAND(csuspend, 2, MODCMD_REQUIRE_AUTHED|MODCMD_REQUIRE_REGCHAN|MODCMD_IGNORE_CSUSPEND, "flags", "+helping", NULL); + DEFINE_COMMAND(cunsuspend, 1, MODCMD_REQUIRE_AUTHED|MODCMD_REQUIRE_REGCHAN|MODCMD_IGNORE_CSUSPEND, "flags", "+helping", NULL); DEFINE_COMMAND(createnote, 5, 0, "level", "800", NULL); DEFINE_COMMAND(removenote, 2, 0, "level", "800", NULL);