X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/9895149b20f675f169119ee9271b1aba01fed896..26b2c254c534b044c4a6357a7b9830d6db7d4618:/src/opserv.c diff --git a/src/opserv.c b/src/opserv.c index f518b39..012d0da 100644 --- a/src/opserv.c +++ b/src/opserv.c @@ -189,6 +189,7 @@ static const struct message_entry msgtab[] = { { "OSMSG_HOP_DONE", "Halfopped the requested lusers." }, { "OSMSG_HOPALL_DONE", "Halfopped everyone on $b%s$b." }, { "OMSG_BAD_SVSNICK", "$b%s$b is an invalid nickname." }, + { "OSMSG_BAD_SVSCMDTARGET", "$b%s$b is an invalid target for %s." }, { "OSMSG_WHOIS_IDENT", "%s (%s@%s) from %d.%d.%d.%d" }, { "OSMSG_WHOIS_NICK", "Nick : %s" }, @@ -218,7 +219,8 @@ static const struct message_entry msgtab[] = { { "OSMSG_WHOIS_HIDECHANS", "Channel list omitted for your sanity." }, { "OSMSG_WHOIS_VERSION", "Version : %s" }, { "OSMSG_WHOIS_SSLFP", "SSL f/print : %s" }, - { "OSMSG_WHOIS_MARK", "Mark : %s" }, + { "OSMSG_WHOIS_MARK", "Mark : %s" }, + { "OSMSG_WHOIS_MARKS", "Marks : %s" }, { "OSMSG_WHOIS_NO_NOTICE", "No_notices : %s" }, { "OSMSG_UNBAN_DONE", "Ban(s) removed from channel %s." }, { "OSMSG_CHANNEL_VOICED", "All users on %s voiced." }, @@ -1724,6 +1726,11 @@ static MODCMD_FUNC(cmd_svsjoin) return 0; } + if (IsLocal(target)) { + reply("OSMSG_BAD_SVSCMDTARGET", argv[1], "SVSJOIN"); + return 0; + } + if (!(channel = GetChannel(argv[2]))) { channel = AddChannel(argv[2], now, NULL, NULL, NULL); } @@ -1745,6 +1752,12 @@ static MODCMD_FUNC(cmd_svsnick) reply("MSG_NICK_UNKNOWN", argv[1]); return 0; } + + if (IsLocal(target)) { + reply("OSMSG_BAD_SVSCMDTARGET", argv[1], "SVSNICK"); + return 0; + } + if(!is_valid_nick(argv[2])) { reply("OMSG_BAD_SVSNICK", argv[2]); return 0; @@ -1970,6 +1983,11 @@ static MODCMD_FUNC(cmd_svspart) return 0; } + if (IsLocal(target)) { + reply("OSMSG_BAD_SVSCMDTARGET", argv[1], "SVSPART"); + return 0; + } + if (!GetUserMode(target_channel, target)) { reply("OSMSG_NOT_ON_CHANNEL", cmd->parent->bot->nick, target_channel->name); return 0; @@ -2193,6 +2211,28 @@ static MODCMD_FUNC(cmd_whois) if(target->mark) { reply("OSMSG_WHOIS_MARK", target->mark); } + if(target->marks) { + char markbuf[MAXLEN] = ""; + unsigned int ii = 0; + + string_list_sort(user->marks); + + for (ii=0; iimarks->used; ii++) + { + if (markbuf[0] && strlen(markbuf) + strlen(user->marks->list[ii]) + 4 > 70) { + reply("OSMSG_WHOIS_MARKS", markbuf); + memset(&markbuf, 0, MAXLEN); + } + + if (markbuf[0]) + strcat(markbuf, ", "); + strcat(markbuf, user->marks->list[ii]); + } + + if (markbuf[0]) + reply("OSMSG_WHOIS_MARKS", markbuf); + } + reply("OSMSG_WHOIS_NO_NOTICE", target->no_notice ? "YES":"NO"); if (target->modes) { @@ -5680,6 +5720,20 @@ discrim_match(discrim_t discrim, struct userNode *user) { unsigned int level, i; char *scmp=NULL, *dcmp=NULL; + int markmatched = 0; + + if (discrim->mask_mark) + { + unsigned int ii = 0; + + if (user->mark && match_ircglob(user->mark, discrim->mask_mark)) + markmatched = 1; + + if (user->marks) + for (ii=0; iimarks->used; ii++) + if (match_ircglob(user->marks->list[ii], discrim->mask_mark)) + markmatched = 1; + } if ((user->timestamp < discrim->min_ts) || (user->timestamp > discrim->max_ts) @@ -5690,7 +5744,7 @@ discrim_match(discrim_t discrim, struct userNode *user) || (discrim->info_space == 0 && user->info[0] == ' ') || (discrim->info_space == 1 && user->info[0] != ' ') || (discrim->server && !match_ircglob(user->uplink->name, discrim->server)) - || (discrim->mask_mark && (!user->mark || !match_ircglob(user->mark, discrim->mask_mark))) + || (discrim->mask_mark && !markmatched) || (discrim->accountmask && (!user->handle_info || !match_ircglob(user->handle_info->handle, discrim->accountmask))) || (discrim->ip_mask_bits && !irc_check_mask(&user->ip, &discrim->ip_mask, discrim->ip_mask_bits)) ) @@ -5748,70 +5802,80 @@ discrim_match(discrim_t discrim, struct userNode *user) if (discrim->modes) { unsigned int ii, matches = 0; + unsigned int negate = 0; for (ii = 0; ii < strlen(discrim->modes); ii++) { switch(discrim->modes[ii]) { + case '+': + negate = 0; + matches++; + break; + case '-': + negate = 1; + matches++; + break; case 'O': - if(IsOper(user)) matches++; + if(IsOper(user) != 0 != negate) matches++; break; case 'o': - if(IsOper(user)) matches++; + if(IsOper(user) != 0 != negate) matches++; break; case 'i': - if(IsInvisible(user)) matches++; + if(IsInvisible(user) != 0 != negate) matches++; break; case 'w': - if(IsWallOp(user)) matches++; + if(IsWallOp(user) != 0 != negate) matches++; break; case 'd': - if(IsDeaf(user)) matches++; + if(IsDeaf(user) != 0 != negate) matches++; break; case 'k': - if(IsService(user)) matches++; + if(IsService(user) != 0 != negate) matches++; break; case 'g': - if(IsGlobal(user)) matches++; + if(IsGlobal(user) != 0 != negate) matches++; break; case 'h': - if(IsSetHost(user)) matches++; + if(IsSetHost(user) != 0 != negate) matches++; break; case 'B': - if(IsBotM(user)) matches++; + if(IsBotM(user) != 0 != negate) matches++; break; + case 'p': case 'n': - if(IsHideChans(user)) matches++; + if(IsHideChans(user) != 0 != negate) matches++; break; case 'I': - if(IsHideIdle(user)) matches++; + if(IsHideIdle(user) != 0 != negate) matches++; break; case 'X': - if(IsXtraOp(user)) matches++; + if(IsXtraOp(user) != 0 != negate) matches++; break; case 'x': - if(IsHiddenHost(user)) matches++; + if(IsHiddenHost(user) != 0 != negate) matches++; break; case 'a': - if(IsAdmin(user)) matches++; + if(IsAdmin(user) != 0 != negate) matches++; break; case 'z': - if(IsSSL(user)) matches++; + if(IsSSL(user) != 0 != negate) matches++; break; case 'D': - if(IsPrivDeaf(user)) matches++; + if(IsPrivDeaf(user) != 0 != negate) matches++; break; case 'R': - if(IsAccountOnly(user)) matches++; + if(IsAccountOnly(user) != 0 != negate) matches++; break; case 'W': - if(IsWhoisNotice(user)) matches++; + if(IsWhoisNotice(user) != 0 != negate) matches++; break; case 'H': - if(IsHideOper(user)) matches++; + if(IsHideOper(user) != 0 != negate) matches++; break; case 'L': - if(IsHideOper(user)) matches++; + if(IsHideOper(user) != 0 != negate) matches++; break; case 'q': - if(IsCommonChansOnly(user)) matches++; + if(IsCommonChansOnly(user) != 0 != negate) matches++; break; } }