X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/80ca5a692f8ca51ac733c06f9547cd573555a602..c0601d1e22c5c3749ea94c1c4359f9223b732fe4:/src/tools.c diff --git a/src/tools.c b/src/tools.c index 39509a7..357c1c7 100644 --- a/src/tools.c +++ b/src/tools.c @@ -367,6 +367,10 @@ irc_strtolower(char *str) { int irccasecmp(const char *stra, const char *strb) { + if (!stra) + return -1; + if (!strb) + return 1; while (*stra && (tolower(*stra) == tolower(*strb))) stra++, strb++; return tolower(*stra) - tolower(*strb); @@ -602,13 +606,15 @@ int is_overmask(char *mask) } int -user_matches_glob(struct userNode *user, const char *orig_glob, int flags) +user_matches_glob(struct userNode *user, const char *orig_glob, int flags, int shared) { - char *tmpglob, *glob, *marker, *echannel, *emodes; + char *tmpglob, *glob, *marker; char exttype = 0; int extreverse = 0, is_extended = 0, match = 0, banned = 0; unsigned int count, n; struct modeNode *mn; + struct chanNode *channel; + struct banNode *ban; /* Make a writable copy of the glob */ glob = alloca(strlen(orig_glob)+1); @@ -655,38 +661,25 @@ user_matches_glob(struct userNode *user, const char *orig_glob, int flags) return match_ircglob(user->hostname, glob); case 'c': if (!strstr(glob, "#")) - return 0; - - tmpglob = strdup(glob); - if (*glob != '#') { - echannel = strstr(glob, "#"); - emodes = strtok(tmpglob, "#"); - } else { - echannel = strdup(glob); - emodes = ""; - } + return -1; if (extreverse) { for (n=count=0; nchannels.used; n++) { mn = user->channels.list[n]; match = 0; - if (0 == strcasecmp(echannel, mn->channel->name)) { - if (strlen(emodes) > 0) { - if (mn->modes & MODE_CHANOP) { - if (strstr(emodes, "@")) - match = 1; - } - if (mn->modes & MODE_HALFOP) { - if (strstr(emodes, "%")) - match = 1; - } - if (mn->modes & MODE_VOICE) { - if (strstr(emodes, "+")) - match = 1; - } - } else + if (*glob == '#') { + if (0 == strcasecmp(glob, mn->channel->name)) match = 1; + } else { + if (0 == strcasecmp(glob+1, mn->channel->name)) { + if ((*glob == '@') && (mn->modes & MODE_CHANOP)) + match = 1; + else if ((*glob == '%') && (mn->modes & MODE_HALFOP)) + match = 1; + else if ((*glob == '+') && (mn->modes & MODE_VOICE)) + match = 1; + } } if (match == 0) @@ -701,23 +694,20 @@ user_matches_glob(struct userNode *user, const char *orig_glob, int flags) mn = user->channels.list[n]; match = 0; - if (0 == strcasecmp(echannel, mn->channel->name)) { - if (strlen(emodes) > 0) { - if (mn->modes & MODE_CHANOP) { - if (strstr(emodes, "@")) - match = 1; - } - if (mn->modes & MODE_HALFOP) { - if (strstr(emodes, "%")) - match = 1; - } - if (mn->modes & MODE_VOICE) { - if (strstr(emodes, "+")) - match = 1; - } - } else + if (*glob == '#') { + if (0 == strcasecmp(glob, mn->channel->name)) match = 1; + } else { + if (0 == strcasecmp(glob+1, mn->channel->name)) { + if ((*glob == '@') && (mn->modes & MODE_CHANOP)) + match = 1; + else if ((*glob == '%') && (mn->modes & MODE_HALFOP)) + match = 1; + else if ((*glob == '+') && (mn->modes & MODE_VOICE)) + match = 1; + } } + if (match == 1) banned = 1; } @@ -727,12 +717,29 @@ user_matches_glob(struct userNode *user, const char *orig_glob, int flags) return 1; else return match_ircglob(user->hostname, glob); + case 'j': + if (shared == 0) { + if (*glob != '#') + return -1; + if ((channel = GetChannel(glob))) { + for (n = 0; n < channel->banlist.used; n++) { + ban = channel->banlist.list[n]; + if (user_matches_glob(user, ban->ban, flags, 1)) + return 1; + } + } + } + return match_ircglob(user->hostname, glob); case 'n': /* this is handled ircd side */ return match_ircglob(user->hostname, glob); + case 'q': /* this is handled ircd side */ + return match_ircglob(user->hostname, glob); case 't': /* this is handled ircd side */ return match_ircglob(user->hostname, glob); + case 'R': /* this is handled ircd side */ + return match_ircglob(user->hostname, glob); default: - return 0; + return -1; } }