/* Returns true if user matches one of the masklist -- drummer */ static int ismasked(masklist *m, char *user) { for (; m && m->mask[0]; m = m->next) if (match_addr(m->mask, user)) return 1; return 0; }
static int u_match_mask(maskrec *rec, char *mask) { for (; rec; rec = rec->next) if (match_addr(rec->mask, mask)) return 1; return 0; }
int main(int argc, char **argv) { krb5_context context; krb5_error_code ret; SET_INVALID_PARAM_HANDLER; setprogname(argv[0]); ret = krb5_init_context(&context); if (ret) errx (1, "krb5_init_context failed: %d", ret); print_addr(context, "RANGE:127.0.0.0/8"); print_addr(context, "RANGE:127.0.0.0/24"); print_addr(context, "RANGE:IPv4:127.0.0.0-IPv4:127.0.0.255"); print_addr(context, "RANGE:130.237.237.4/29"); #ifdef HAVE_IPV6 print_addr(context, "RANGE:2001:db8:1:2:3:4:1428:7ab/64"); print_addr(context, "RANGE:IPv6:fe80::209:6bff:fea0:e522/64"); print_addr(context, "RANGE:IPv6:fe80::-IPv6:fe80::ffff:ffff:ffff:ffff"); print_addr(context, "RANGE:fe80::-fe80::ffff:ffff:ffff:ffff"); #endif check_truncation(context, "IPv4:127.0.0.0"); check_truncation(context, "RANGE:IPv4:127.0.0.0-IPv4:127.0.0.255"); #ifdef HAVE_IPV6 check_truncation(context, "IPv6:::"); check_truncation(context, "IPv6:::1"); check_truncation(context, "IPv6:2001:db8:1:2:3:4:1428:7ab"); check_truncation(context, "IPv6:fe80::209:0:0:0"); check_truncation(context, "IPv6:fe80::ffff:ffff:ffff:ffff"); #endif match_addr(context, "RANGE:127.0.0.0/8", "inet:127.0.0.0", 1); match_addr(context, "RANGE:127.0.0.0/8", "inet:127.255.255.255", 1); match_addr(context, "RANGE:127.0.0.0/8", "inet:128.0.0.0", 0); match_addr(context, "RANGE:130.237.237.8/29", "inet:130.237.237.7", 0); match_addr(context, "RANGE:130.237.237.8/29", "inet:130.237.237.8", 1); match_addr(context, "RANGE:130.237.237.8/29", "inet:130.237.237.15", 1); match_addr(context, "RANGE:130.237.237.8/29", "inet:130.237.237.16", 0); krb5_free_context(context); return 0; }
static void got_ban(struct chanset_t *chan, char *nick, char *from, char *who, char *ch, struct userrec *u) { char me[UHOSTLEN], s[UHOSTLEN], s1[UHOSTLEN]; memberlist *m; struct userrec *targ; egg_snprintf(me, sizeof me, "%s!%s", botname, botuserhost); egg_snprintf(s, sizeof s, "%s!%s", nick, from); newban(chan, who, s); check_tcl_mode(nick, from, u, chan->dname, "+b", who); if (!(chan = modebind_refresh(ch, from, &user, NULL, NULL))) return; if (channel_pending(chan) || HALFOP_CANTDOMODE('b')) return; if (match_addr(who, me) && !isexempted(chan, me)) { add_mode(chan, '-', 'b', who); reversing = 1; return; } if (!match_my_nick(nick)) { if (nick[0] && channel_nouserbans(chan) && !glob_bot(user) && !glob_master(user) && !chan_master(user)) { add_mode(chan, '-', 'b', who); return; } for (m = chan->channel.member; m && m->nick[0]; m = m->next) { egg_snprintf(s1, sizeof s1, "%s!%s", m->nick, m->userhost); if (match_addr(who, s1)) { targ = get_user_by_host(s1); if (targ) { get_user_flagrec(targ, &victim, chan->dname); if ((glob_friend(victim) || (glob_op(victim) && !chan_deop(victim)) || chan_friend(victim) || chan_op(victim)) && !glob_master(user) && !glob_bot(user) && !chan_master(user) && !isexempted(chan, s1)) { add_mode(chan, '-', 'b', who); return; } } } } } refresh_exempt(chan, who); if (nick[0] && channel_enforcebans(chan)) { register maskrec *b; int cycle; char resn[512] = ""; for (cycle = 0; cycle < 2; cycle++) { for (b = cycle ? chan->bans : global_bans; b; b = b->next) { if (match_addr(b->mask, who)) { if (b->desc && b->desc[0] != '@') egg_snprintf(resn, sizeof resn, "%s %s", IRC_PREBANNED, b->desc); else resn[0] = 0; } } } kick_all(chan, who, resn[0] ? resn : IRC_BANNED, match_my_nick(nick) ? 0 : 1); } if (!nick[0] && (bounce_bans || bounce_modes) && (!u_equals_mask(global_bans, who) || !u_equals_mask(chan->bans, who))) add_mode(chan, '-', 'b', who); }
static void tell_invites(int idx, int show_inact, char *match) { int k = 1; char *chname; struct chanset_t *chan = NULL; maskrec *u; /* Was a channel given? */ if (match[0]) { chname = newsplit(&match); if (chname[0] && strchr(CHANMETA, chname[0])) { chan = findchan_by_dname(chname); if (!chan) { dprintf(idx, "%s.\n", CHAN_NOSUCH); return; } } else match = chname; } /* don't return here, we want to show global invites even if no chan */ if (!chan && !(chan = findchan_by_dname(dcc[idx].u.chat->con_chan)) && !(chan = chanset)) chan = NULL; if (chan && show_inact) dprintf(idx, "%s: (! = %s %s)\n", INVITES_GLOBAL, MODES_NOTACTIVE, chan->dname); else dprintf(idx, "%s:\n", INVITES_GLOBAL); for (u = global_invites; u; u = u->next) { if (match[0]) { if ((match_addr(match, u->mask)) || (wild_match(match, u->desc)) || (wild_match(match, u->user))) display_invite(idx, k, u, chan, 1); k++; } else display_invite(idx, k++, u, chan, show_inact); } if (chan) { if (show_inact) dprintf(idx, "%s %s: (! = %s, * = %s)\n", INVITES_BYCHANNEL, chan->dname, MODES_NOTACTIVE2, MODES_NOTBYBOT); else dprintf(idx, "%s %s: (* = %s)\n", INVITES_BYCHANNEL, chan->dname, MODES_NOTBYBOT); for (u = chan->invites; u; u = u->next) { if (match[0]) { if ((match_addr(match, u->mask)) || (wild_match(match, u->desc)) || (wild_match(match, u->user))) display_invite(idx, k, u, chan, 1); k++; } else display_invite(idx, k++, u, chan, show_inact); } if (chan->status & CHAN_ACTIVE) { masklist *i; char s[UHOSTLEN], *s1, *s2, fill[256]; int min, sec; for (i = chan->channel.invite; i && i->mask[0]; i = i->next) { if ((!u_equals_mask(global_invites, i->mask)) && (!u_equals_mask(chan->invites, i->mask))) { strcpy(s, i->who); s2 = s; s1 = splitnick(&s2); if (s1[0]) sprintf(fill, "%s (%s!%s)", i->mask, s1, s2); else sprintf(fill, "%s (server %s)", i->mask, s2); if (i->timer != 0) { min = (now - i->timer) / 60; sec = (now - i->timer) - (min * 60); sprintf(s, " (active %02d:%02d)", min, sec); strcat(fill, s); } if ((!match[0]) || (match_addr(match, i->mask))) dprintf(idx, "* [%3d] %s\n", k, fill); k++; } } } } if (k == 1) dprintf(idx, "(There are no invites, permanent or otherwise.)\n"); if ((!show_inact) && (!match[0])) dprintf(idx, "%s.\n", INVITES_USEINVITESALL); }
/* Note: If first char of note is '*' it's a sticky ban. */ static int u_addban(struct chanset_t *chan, char *ban, char *from, char *note, time_t expire_time, int flags) { char host[1024], s[1024]; maskrec *p = NULL, *l, **u = chan ? &chan->bans : &global_bans; module_entry *me; strcpy(host, ban); /* Choke check: fix broken bans (must have '!' and '@') */ if ((strchr(host, '!') == NULL) && (strchr(host, '@') == NULL)) strcat(host, "!*@*"); else if (strchr(host, '@') == NULL) strcat(host, "@*"); else if (strchr(host, '!') == NULL) { char *i = strchr(host, '@'); strcpy(s, i); *i = 0; strcat(host, "!*"); strcat(host, s); } if ((me = module_find("server", 0, 0)) && me->funcs) { simple_sprintf(s, "%s!%s", me->funcs[SERVER_BOTNAME], me->funcs[SERVER_BOTUSERHOST]); if (match_addr(host, s)) { putlog(LOG_MISC, "*", IRC_IBANNEDME); return 0; } } if (expire_time == now) return 1; for (l = *u; l; l = l->next) if (!rfc_casecmp(l->mask, host)) { p = l; break; } /* It shouldn't expire and be sticky also */ if (note[0] == '*') { flags |= MASKREC_STICKY; note++; } if ((expire_time == 0L) || (flags & MASKREC_PERM)) { flags |= MASKREC_PERM; expire_time = 0L; } if (p == NULL) { p = user_malloc(sizeof(maskrec)); p->next = *u; *u = p; } else { nfree(p->mask); nfree(p->user); nfree(p->desc); } p->expire = expire_time; p->added = now; p->lastactive = 0; p->flags = flags; p->mask = user_malloc(strlen(host) + 1); strcpy(p->mask, host); p->user = user_malloc(strlen(from) + 1); strcpy(p->user, from); p->desc = user_malloc(strlen(note) + 1); strcpy(p->desc, note); if (!noshare) { char *mask = str_escape(host, ':', '\\'); if (mask) { if (!chan) shareout(NULL, "+b %s %li %s%s %s %s\n", mask, expire_time - now, (flags & MASKREC_STICKY) ? "s" : "", (flags & MASKREC_PERM) ? "p" : "-", from, note); else shareout(chan, "+bc %s %li %s %s%s %s %s\n", mask, expire_time - now, chan->dname, (flags & MASKREC_STICKY) ? "s" : "", (flags & MASKREC_PERM) ? "p" : "-", from, note); nfree(mask); } } return 1; }