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);
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;
if (is_extended) {
log_module(MAIN_LOG, LOG_DEBUG, "Extended ban. T (%c) R (%d) M (%s)", exttype, extreverse, glob);
switch (exttype) {
- case 'a':
+ case 'a': // account
if (user->handle_info) {
if (extreverse) {
if (0 != strcasecmp(glob, user->handle_info->handle))
return 1;
}
return match_ircglob(user->hostname, glob);
- case 'c':
+ case 'c': // another channel
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; n<user->channels.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)
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;
}
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);
+ case 'm': // mute by mark
+ if(user->mark && !strcmp(glob, user->mark))
+ return true;
+ else
+ return false;
+
+ case 'M': // mute by mark unless authed
+ return false; // can never match a logged in user
+
default:
return -1;
}
/* If only matching the visible hostnames, bail early. */
if ((flags & MATCH_VISIBLE) && IsHiddenHost(user)
- && (IsFakeHost(user) || (hidden_host_suffix && user->handle_info)))
+ && (IsFakeHost(user) || (hidden_host_suffix && user->handle_info) ||
+ user->crypthost || user->cryptip))
return 0;
/* If it might be an IP glob, test that. */
if (!glob[strspn(glob, "0123456789./*?")]