X-Git-Url: https://jfr.im/git/irc/evilnet/x3.git/blobdiff_plain/3b7fa78b1de8f9ee8718cba3da3b2db522b70620..1ef37f9e521eaa2673d792badff62c25681a009e:/src/tools.c?ds=sidebyside diff --git a/src/tools.c b/src/tools.c index 70aad71..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); @@ -604,7 +608,7 @@ int is_overmask(char *mask) int 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; @@ -659,36 +663,23 @@ user_matches_glob(struct userNode *user, const char *orig_glob, int flags, int s if (!strstr(glob, "#")) return -1; - tmpglob = strdup(glob); - if (*glob != '#') { - echannel = strstr(glob, "#"); - emodes = strtok(tmpglob, "#"); - } else { - echannel = strdup(glob); - emodes = ""; - } - 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) @@ -703,23 +694,20 @@ user_matches_glob(struct userNode *user, const char *orig_glob, int flags, int s 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; } @@ -731,6 +719,8 @@ user_matches_glob(struct userNode *user, const char *orig_glob, int flags, int s 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]; @@ -746,6 +736,8 @@ user_matches_glob(struct userNode *user, const char *orig_glob, int flags, int s 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 -1; }