/* Check for expired timed-invites. */ static void check_expired_invites(void) { maskrec *u, *u2; struct chanset_t *chan; masklist *b; if (!use_invites) return; for (u = global_invites; u; u = u2) { u2 = u->next; if (!(u->flags & MASKREC_PERM) && (now >= u->expire)) { putlog(LOG_MISC, "*", "%s %s (%s)", INVITES_NOLONGER, u->mask, MISC_EXPIRED); for (chan = chanset; chan; chan = chan->next) if (!(chan->channel.mode & CHANINV)) for (b = chan->channel.invite; b->mask[0]; b = b->next) if (!rfc_casecmp(b->mask, u->mask) && expired_mask(chan, b->who) && b->timer != now) { add_mode(chan, '-', 'I', u->mask); b->timer = now; } u_delinvite(NULL, u->mask, 1); } } /* Check for specific channel-domain invites expiring */ for (chan = chanset; chan; chan = chan->next) { for (u = chan->invites; u; u = u2) { u2 = u->next; if (!(u->flags & MASKREC_PERM) && (now >= u->expire)) { putlog(LOG_MISC, "*", "%s %s %s %s (%s)", INVITES_NOLONGER, u->mask, MISC_ONLOCALE, chan->dname, MISC_EXPIRED); if (!(chan->channel.mode & CHANINV)) for (b = chan->channel.invite; b->mask[0]; b = b->next) if (!rfc_casecmp(b->mask, u->mask) && expired_mask(chan, b->who) && b->timer != now) { add_mode(chan, '-', 'I', u->mask); b->timer = now; } u_delinvite(chan, u->mask, 1); } } } }
static void check_expired_chanstuff() { masklist *b, *e; memberlist *m, *n; char *key, s[UHOSTLEN]; struct chanset_t *chan; struct flag_record fr = { FR_GLOBAL | FR_CHAN, 0, 0, 0, 0, 0 }; if (!server_online) return; for (chan = chanset; chan; chan = chan->next) { if (channel_active(chan)) { if (me_op(chan) || me_halfop(chan)) { if (channel_dynamicbans(chan) && chan->ban_time) for (b = chan->channel.ban; b->mask[0]; b = b->next) if (now - b->timer > 60 * chan->ban_time && !u_sticky_mask(chan->bans, b->mask) && !u_sticky_mask(global_bans, b->mask) && expired_mask(chan, b->who)) { putlog(LOG_MODES, chan->dname, "(%s) Channel ban on %s expired.", chan->dname, b->mask); add_mode(chan, '-', 'b', b->mask); b->timer = now; } if (use_exempts && channel_dynamicexempts(chan) && chan->exempt_time) for (e = chan->channel.exempt; e->mask[0]; e = e->next) if (now - e->timer > 60 * chan->exempt_time && !u_sticky_mask(chan->exempts, e->mask) && !u_sticky_mask(global_exempts, e->mask) && expired_mask(chan, e->who)) { /* Check to see if it matches a ban */ int match = 0; for (b = chan->channel.ban; b->mask[0]; b = b->next) if (mask_match(b->mask, e->mask)) { match = 1; break; } /* Leave this extra logging in for now. Can be removed later * Jason */ if (match) { putlog(LOG_MODES, chan->dname, "(%s) Channel exemption %s NOT expired. Exempt still set!", chan->dname, e->mask); } else { putlog(LOG_MODES, chan->dname, "(%s) Channel exemption on %s expired.", chan->dname, e->mask); add_mode(chan, '-', 'e', e->mask); } e->timer = now; } if (use_invites && channel_dynamicinvites(chan) && chan->invite_time && !(chan->channel.mode & CHANINV)) for (b = chan->channel.invite; b->mask[0]; b = b->next) if (now - b->timer > 60 * chan->invite_time && !u_sticky_mask(chan->invites, b->mask) && !u_sticky_mask(global_invites, b->mask) && expired_mask(chan, b->who)) { putlog(LOG_MODES, chan->dname, "(%s) Channel invitation on %s expired.", chan->dname, b->mask); add_mode(chan, '-', 'I', b->mask); b->timer = now; } if (chan->idle_kick) for (m = chan->channel.member; m && m->nick[0]; m = m->next) if (now - m->last >= chan->idle_kick * 60 && !match_my_nick(m->nick) && !chan_issplit(m)) { sprintf(s, "%s!%s", m->nick, m->userhost); get_user_flagrec(m->user ? m->user : get_user_by_host(s), &fr, chan->dname); if ((!(glob_bot(fr) || glob_friend(fr) || (glob_op(fr) && !chan_deop(fr)) || chan_friend(fr) || chan_op(fr))) && (me_op(chan) || (me_halfop(chan) && !chan_hasop(m)))) { dprintf(DP_SERVER, "KICK %s %s :idle %d min\n", chan->name, m->nick, chan->idle_kick); m->flags |= SENTKICK; } } } for (m = chan->channel.member; m && m->nick[0]; m = n) { n = m->next; if (m->split && now - m->split > wait_split) { sprintf(s, "%s!%s", m->nick, m->userhost); check_tcl_sign(m->nick, m->userhost, m->user ? m->user : get_user_by_host(s), chan->dname, "lost in the netsplit"); putlog(LOG_JOIN, chan->dname, "%s (%s) got lost in the net-split.", m->nick, m->userhost); killmember(chan, m->nick); } m = n; } check_lonely_channel(chan); } else if (!channel_inactive(chan) && !channel_pending(chan)) { key = chan->channel.key[0] ? chan->channel.key : chan->key_prot; if (key[0]) dprintf(DP_SERVER, "JOIN %s %s\n", chan->name[0] ? chan->name : chan->dname, key); else dprintf(DP_SERVER, "JOIN %s\n", chan->name[0] ? chan->name : chan->dname); } } }
/* Check for expired timed-exemptions */ static void check_expired_exempts(void) { maskrec *u, *u2; struct chanset_t *chan; masklist *b, *e; int match; if (!use_exempts) return; for (u = global_exempts; u; u = u2) { u2 = u->next; if (!(u->flags & MASKREC_PERM) && (now >= u->expire)) { putlog(LOG_MISC, "*", "%s %s (%s)", EXEMPTS_NOLONGER, u->mask, MISC_EXPIRED); for (chan = chanset; chan; chan = chan->next) { match = 0; b = chan->channel.ban; while (b->mask[0] && !match) { if (mask_match(b->mask, u->mask)) match = 1; else b = b->next; } if (match) putlog(LOG_MISC, chan->dname, "Exempt not expired on channel %s. Ban still set!", chan->dname); else for (e = chan->channel.exempt; e->mask[0]; e = e->next) if (!rfc_casecmp(e->mask, u->mask) && expired_mask(chan, e->who) && e->timer != now) { add_mode(chan, '-', 'e', u->mask); e->timer = now; } } u_delexempt(NULL, u->mask, 1); } } /* Check for specific channel-domain exempts expiring */ for (chan = chanset; chan; chan = chan->next) { for (u = chan->exempts; u; u = u2) { u2 = u->next; if (!(u->flags & MASKREC_PERM) && (now >= u->expire)) { match = 0; b = chan->channel.ban; while (b->mask[0] && !match) { if (mask_match(b->mask, u->mask)) match = 1; else b = b->next; } if (match) putlog(LOG_MISC, chan->dname, "Exempt not expired on channel %s. Ban still set!", chan->dname); else { putlog(LOG_MISC, "*", "%s %s %s %s (%s)", EXEMPTS_NOLONGER, u->mask, MISC_ONLOCALE, chan->dname, MISC_EXPIRED); for (e = chan->channel.exempt; e->mask[0]; e = e->next) if (!rfc_casecmp(e->mask, u->mask) && expired_mask(chan, e->who) && e->timer != now) { add_mode(chan, '-', 'e', u->mask); e->timer = now; } u_delexempt(chan, u->mask, 1); } } } } }