/* This function adds as an extra (weird) operoverride. * Currently it's only used if you try to operoverride for a +z channel, * if you then do '/join #chan override' it will put the channel -z and allow you directly in. * This is to avoid attackers from using 'race conditions' to prevent you from joining. * PARAMETERS: sptr = the client, chptr = the channel, mval = mode value (eg MODE_ONLYSECURE), * mchar = mode char (eg 'z') * RETURNS: 1 if operoverride, 0 if not. */ int extended_operoverride(aClient *sptr, aChannel *chptr, char *key, int mval, char mchar) { unsigned char invited = 0; Link *lp; if (!IsAnOper(sptr) || !OPCanOverride(sptr)) return 0; for (lp = sptr->user->invited; lp; lp = lp->next) if (lp->value.chptr == chptr) { invited = 1; break; } if (invited) { if (key && !strcasecmp(key, "override")) { sendto_channelprefix_butone(NULL, &me, chptr, PREFIX_OP|PREFIX_ADMIN|PREFIX_OWNER, ":%s NOTICE @%s :setting channel -%c due to OperOverride request from %s", me.name, chptr->chname, mchar, sptr->name); sendto_serv_butone(&me, ":%s MODE %s -%c 0", me.name, chptr->chname, mchar); sendto_channel_butserv(chptr, &me, ":%s MODE %s -%c", me.name, chptr->chname, mchar); chptr->mode.mode &= ~mval; return 1; } } return 0; }
inline int op_can_override(aClient *sptr) { #ifndef NO_OPEROVERRIDE if (!IsOper(sptr)) return 0; if (MyClient(sptr) && !OPCanOverride(sptr)) return 0; return 1; #else return 0; #endif }
int can_send(aClient *cptr, aChannel *chptr, char *msgtext, int notice) { Membership *lp; int member; /* * #0000053 by |savage|, speedup */ if (!MyClient(cptr)) { if (IsClient(cptr)) { /* channelmode +mu is a special case.. sux!. -- Syzop */ lp = find_membership_link(cptr->user->channel, chptr); if ((chptr->mode.mode & MODE_MODERATED) && (chptr->mode.mode & MODE_AUDITORIUM) && !IsOper(cptr) && (!lp || !(lp->flags & (CHFL_CHANOP|CHFL_VOICE|CHFL_CHANOWNER|CHFL_HALFOP|CHFL_CHANPROT))) && !is_irc_banned(chptr)) { sendto_chmodemucrap(cptr, chptr, msgtext); return (CANNOT_SEND_MODERATED); } } return 0; } if (chptr->mode.mode & MODE_NOCOLOR) { /* A bit faster */ char *c; for (c = msgtext; *c; c++) { if (*c == 3 || *c == 27 || *c == 4 || *c == 22) /* mirc color, ansi, rgb, reverse */ return (CANNOT_SEND_NOCOLOR); } } member = IsMember(cptr, chptr); if (chptr->mode.mode & MODE_NOPRIVMSGS && !member) return (CANNOT_SEND_NOPRIVMSGS); lp = find_membership_link(cptr->user->channel, chptr); if ((chptr->mode.mode & MODE_MODREG) && !op_can_override(cptr) && !IsRegNick(cptr) && (!lp || !(lp->flags & (CHFL_CHANOP | CHFL_VOICE | CHFL_CHANOWNER | CHFL_HALFOP | CHFL_CHANPROT)))) return CANNOT_SEND_MODREG; if (chptr->mode.mode & MODE_MODERATED && !op_can_override(cptr) && (!lp || !(lp->flags & (CHFL_CHANOP | CHFL_VOICE | CHFL_CHANOWNER | CHFL_HALFOP | CHFL_CHANPROT)))) { if ((chptr->mode.mode & MODE_AUDITORIUM) && !is_irc_banned(chptr) && !is_banned(cptr, chptr, BANCHK_MSG)) sendto_chmodemucrap(cptr, chptr, msgtext); return (CANNOT_SEND_MODERATED); } if (chptr->mode.mode & MODE_NOCTCP && (!lp || !(lp->flags & (CHFL_CHANOP | CHFL_CHANOWNER | CHFL_CHANPROT)))) if (msgtext[0] == 1 && strncmp(&msgtext[1], "ACTION ", 7)) return (CANNOT_SEND_NOCTCP); if (notice && (chptr->mode.extmode & EXTMODE_NONOTICE) && (!lp || !(lp->flags & (CHFL_CHANOP | CHFL_CHANOWNER | CHFL_CHANPROT)))) return (CANNOT_SEND_NOTICE); /* Makes opers able to talk thru bans -Stskeeps suggested by The_Cat */ if (IsOper(cptr) && OPCanOverride(cptr)) return 0; if ((!lp || !(lp->flags & (CHFL_CHANOP | CHFL_VOICE | CHFL_CHANOWNER | CHFL_HALFOP | CHFL_CHANPROT))) && MyClient(cptr) && is_banned(cptr, chptr, BANCHK_MSG)) return (CANNOT_SEND_BAN); return 0; }