From f45917c16c1cdd3f2186d64335dd060fb213a4fd Mon Sep 17 00:00:00 2001 From: luke Date: Thu, 1 Aug 2002 19:53:30 +0000 Subject: [PATCH] New operoverride system...hope it works --- Changes | 1 + include/numeric.h | 1 + include/ssl.h | 3 +- src/channel.c | 443 +++++++++++++++++++++++++--------------------- src/s_err.c | 2 +- 5 files changed, 249 insertions(+), 201 deletions(-) diff --git a/Changes b/Changes index b8ed7e846..592ebda72 100644 --- a/Changes +++ b/Changes @@ -1420,3 +1420,4 @@ seen. gmtime warning still there - Fixed +bbbbb lots of crap desynch bug - Fixed OperOverride snotice bugs with halfop - Standardized OperOverride notices +- Implemented new operoverride system diff --git a/include/numeric.h b/include/numeric.h index 111c78255..7fe9d16d6 100644 --- a/include/numeric.h +++ b/include/numeric.h @@ -309,6 +309,7 @@ #define ERR_WHOSYNTAX 522 #define ERR_WHOLIMEXCEED 523 +#define ERR_OPERSPVERIFY 524 #define RPL_SNOMASK 8 diff --git a/include/ssl.h b/include/ssl.h index 0ba7417f3..bf5ac8e1e 100644 --- a/include/ssl.h +++ b/include/ssl.h @@ -16,4 +16,5 @@ extern int ircd_SSL_write(aClient *acptr, const void *buf, int sz); extern int ircd_SSL_accept(aClient *acptr, int fd); extern int ircd_SSL_connect(aClient *acptr); extern int SSL_smart_shutdown(SSL *ssl); -extern int ircd_SSL_client_handshake(aClient *acptr); \ No newline at end of file +extern int ircd_SSL_client_handshake(aClient *acptr); + diff --git a/src/channel.c b/src/channel.c index 5d21a8770..5aa4924ca 100644 --- a/src/channel.c +++ b/src/channel.c @@ -2331,118 +2331,74 @@ char *pretty_mask(char *mask) static int can_join(aClient *cptr, aClient *sptr, aChannel *chptr, char *key, char *link, char *parv[]) { - Link *lp; -#ifndef NO_OPEROVERRIDE - int ib = 1; -#else - int ib = 0; + Link *lp; + + if ((chptr->mode.mode & MODE_ONLYSECURE) && + !(sptr->umodes & UMODE_SECURE)) + return (ERR_SECUREONLYCHAN); + + if ((chptr->mode.mode & MODE_OPERONLY) && !IsOper(sptr)) + return (ERR_OPERONLY); + + if ((chptr->mode.mode & MODE_ADMONLY) && !IsSkoAdmin(sptr)) + return (ERR_ADMONLY); + +#ifdef ENABLE_INVISOPER + if ((chptr->mode.mode & MODE_NOHIDING) && IsHiding(sptr)) + return (ERR_NOHIDING); +#endif + + if ((IsOper(sptr) && is_banned(cptr, sptr, chptr) + && (chptr->mode.mode & MODE_OPERONLY))) + return (ERR_BANNEDFROMCHAN); /* banned as an ircop at a +O cannot join */ + + for (lp = sptr->user->invited; lp; lp = lp->next) + if (lp->value.chptr == chptr) + return 0; + + if ((chptr->mode.limit && chptr->users >= chptr->mode.limit)) + { + if (chptr->mode.link) + { + if (*chptr->mode.link != '\0') + { + /* We are linked. */ + sendto_one(sptr, + err_str(ERR_LINKCHANNEL), me.name, + sptr->name, chptr->chname, + chptr->mode.link); + parv[0] = sptr->name; + parv[1] = (chptr->mode.link); + channel_link(cptr, sptr, 2, parv); + return -1; + } + } + /* We check this later return (ERR_CHANNELISFULL); */ + } + + if ((chptr->mode.mode & MODE_RGSTRONLY) && !IsARegNick(sptr)) + return (ERR_NEEDREGGEDNICK); + + if (*chptr->mode.key && (BadPtr(key) || mycmp(chptr->mode.key, key))) + return (ERR_BADCHANNELKEY); + + if ((chptr->mode.mode & MODE_INVITEONLY)) + return (ERR_INVITEONLYCHAN); + + if ((chptr->mode.limit && chptr->users >= chptr->mode.limit)) + return (ERR_CHANNELISFULL); + + if (is_banned(sptr, sptr, chptr)) + return (ERR_BANNEDFROMCHAN); + +#ifdef OPEROVERRIDE_VERIFY + if (IsOper(sptr) && (chptr->mode.mode & MODE_SECRET || + chptr->mode.mode & MODE_PRIVATE)) + return (ERR_OPERSPVERIFY); #endif - /* 0 = noone 1 = IRCops 2 = Net Admins 3 =Net/Tech admins (override) */ - - if ((chptr->mode.limit && chptr->users >= chptr->mode.limit)) - { - if (chptr->mode.link) - { - if (*chptr->mode.link != '\0') - { - /* We are linked. */ - sendto_one(sptr, - err_str(ERR_LINKCHANNEL), me.name, - sptr->name, chptr->chname, - chptr->mode.link); - parv[0] = sptr->name; - parv[1] = (chptr->mode.link); - channel_link(cptr, sptr, 2, parv); - return -1; - } - } - /* We check this later return (ERR_CHANNELISFULL); */ - } - -/* if ((chptr->mode.mode & MODE_OPERONLY) && IsOper(sptr)) { - goto admok; - } */ - if ((chptr->mode.mode & MODE_ONLYSECURE) && - !(sptr->umodes & UMODE_SECURE)) - { - sendto_one(sptr, ":%s %s %s :*** Cannot join: %s is a Secure-only channel (+z)", - me.name, IsWebTV(sptr) ? "PRIVMSG" : "NOTICE", sptr->name, chptr->chname); - return (ERR_SECUREONLYCHAN); - } - if ((chptr->mode.mode & MODE_OPERONLY) && !IsOper(sptr)) - { - return (ERR_OPERONLY); - } - if ((chptr->mode.mode & MODE_ADMONLY)) - { - if (!IsSkoAdmin(sptr)) - return (ERR_ADMONLY); - } - - if ((chptr->mode.mode & MODE_NOHIDING) && IsHiding(sptr)) - return (ERR_NOHIDING); - - if ((IsOper(sptr) && !((chptr->mode.mode & MODE_ADMONLY))) && !(ib==0)) - { - return 0; /* may override */ - } - if ((IsOper(sptr) && is_banned(cptr, sptr, chptr) - && (chptr->mode.mode & MODE_OPERONLY))) - return (ERR_BANNEDFROMCHAN); /* banned as an ircop at a +O cannot join */ - -/* if (ib == 1) - if (IsOper(sptr)) - return 0; - else - if (ib == 2) - if (IsNetAdmin(sptr)) - return 0; -*/ - switch (ib) - { - case 1: - if (IsOper(sptr)) - { - return 0; - } - break; - case 2: - if (IsNetAdmin(sptr)) - { - return 0; - } - break; - case 3: - if (IsNetAdmin(sptr)) - return 0; - break; - default: - break; - } - if ((chptr->mode.mode & MODE_RGSTRONLY) && !IsARegNick(sptr)) - return (ERR_NEEDREGGEDNICK); - - if (*chptr->mode.key && (BadPtr(key) || mycmp(chptr->mode.key, key))) - return (ERR_BADCHANNELKEY); - - for (lp = sptr->user->invited; lp; lp = lp->next) - if (lp->value.chptr == chptr) - break; - - if ((chptr->mode.mode & MODE_INVITEONLY) && !lp) - return (ERR_INVITEONLYCHAN); - - if ((chptr->mode.limit && chptr->users >= chptr->mode.limit)) - return (ERR_CHANNELISFULL); - - if (is_banned(sptr, sptr, chptr) && !lp) - return (ERR_BANNEDFROMCHAN); - - - - return 0; + return 0; } /* @@ -3755,104 +3711,193 @@ CMD_FUNC(m_topic) */ CMD_FUNC(m_invite) { - aClient *acptr; - aChannel *chptr; + aClient *acptr; + aChannel *chptr; + short over = 0; + if (parc < 3 || *parv[1] == '\0') + { + sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), + me.name, parv[0], "INVITE"); + return -1; + } - if (parc < 3 || *parv[1] == '\0') - { - sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS), - me.name, parv[0], "INVITE"); - return -1; - } + if (!(acptr = find_person(parv[1], (aClient *)NULL))) + { + sendto_one(sptr, err_str(ERR_NOSUCHNICK), + me.name, parv[0], parv[1]); + return -1; + } - if (!(acptr = find_person(parv[1], (aClient *)NULL))) - { - sendto_one(sptr, err_str(ERR_NOSUCHNICK), - me.name, parv[0], parv[1]); - return 0; - } + if (MyConnect(sptr)) + clean_channelname(parv[2]); - if (MyConnect(sptr)) - clean_channelname(parv[2]); - if (check_channelmask(sptr, cptr, parv[2])) - return 0; - if (!(chptr = find_channel(parv[2], NullChn))) - { + if (check_channelmask(sptr, cptr, parv[2])) + return -1; - sendto_prefix_one(acptr, sptr, ":%s INVITE %s :%s", - parv[0], parv[1], parv[2]); - return 0; - } - if (chptr->mode.mode & MODE_NOINVITE) - if (!IsULine(sptr)) - { - sendto_one(sptr, err_str(ERR_NOINVITE), - me.name, parv[0], parv[2]); - return -1; - } - if (chptr && !IsMember(sptr, chptr) && !IsULine(sptr)) - { - sendto_one(sptr, err_str(ERR_NOTONCHANNEL), - me.name, parv[0], parv[2]); - return -1; - } + if (!(chptr = find_channel(parv[2], NullChn))) + { + sendto_one(sptr, err_str(ERR_NOSUCHCHANNEL), + me.name, parv[0], parv[2]); + return -1; + } - if (IsMember(acptr, chptr)) - { - sendto_one(sptr, err_str(ERR_USERONCHANNEL), - me.name, parv[0], parv[1], parv[2]); - return 0; - } - if (chptr && (chptr->mode.mode & MODE_INVITEONLY)) - { - if (!is_chan_op(sptr, chptr) && !IsULine(sptr)) - { - sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED), - me.name, parv[0], chptr->chname); - return -1; - } - else if (!IsMember(sptr, chptr) && !IsULine(sptr)) - { - sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED), - me.name, parv[0], - ((chptr) ? (chptr->chname) : parv[2])); - return -1; - } - } + if (chptr->mode.mode & MODE_NOINVITE && !IsULine(sptr)) + { +#ifndef NO_OPEROVERRIDE + if (IsOper(sptr) && sptr == acptr) + over = 1; + else { +#endif + sendto_one(sptr, err_str(ERR_NOINVITE), + me.name, parv[0], parv[2]); + return -1; +#ifndef NO_OPEROVERRIDE + } +#endif + } - if (MyConnect(sptr)) - { - if (check_for_target_limit(sptr, acptr, acptr->name)) - return 0; + if (!IsMember(sptr, chptr) && !IsULine(sptr)) + { +#ifndef NO_OPEROVERRIDE + if (IsOper(sptr) && sptr == acptr) + over = 1; + else { +#endif + sendto_one(sptr, err_str(ERR_NOTONCHANNEL), + me.name, parv[0], parv[2]); + return -1; +#ifndef NO_OPEROVERRIDE + } +#endif + } - sendto_one(sptr, rpl_str(RPL_INVITING), me.name, - parv[0], acptr->name, - ((chptr) ? (chptr->chname) : parv[2])); - if (acptr->user->away) - sendto_one(sptr, rpl_str(RPL_AWAY), me.name, - parv[0], acptr->name, acptr->user->away); - } - /* Note: is_banned() here will cause some extra CPU load, - * and we're really only relying on the existence - * of the limit because we could momentarily have - * less people on channel. - */ - if (MyConnect(acptr)) - if (chptr && sptr->user - && (is_banned(acptr, sptr, chptr) - || (chptr->mode.mode & MODE_INVITEONLY) - || chptr->mode.limit) && (is_chan_op(sptr, chptr) - || IsULine(sptr))) - { - add_invite(acptr, chptr); - sendto_channelops_butone(NULL, &me, chptr, - ":%s NOTICE @%s :%s invited %s into the channel.", - me.name, chptr->chname, sptr->name, acptr->name); - } - sendto_prefix_one(acptr, sptr, ":%s INVITE %s :%s", parv[0], - acptr->name, ((chptr) ? (chptr->chname) : parv[2])); - return 0; + if (IsMember(acptr, chptr)) + { + sendto_one(sptr, err_str(ERR_USERONCHANNEL), + me.name, parv[0], parv[1], parv[2]); + return 0; + } + + if (chptr->mode.mode & MODE_INVITEONLY) + { + if (!is_chan_op(sptr, chptr) && !IsULine(sptr)) + { +#ifndef NO_OPEROVERRIDE + if (IsOper(sptr) && sptr == acptr) + over = 1; + else { +#endif + sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED), + me.name, parv[0], chptr->chname); + return -1; +#ifndef NO_OPEROVERRIDE + } +#endif + } + else if (!IsMember(sptr, chptr) && !IsULine(sptr)) + { +#ifndef NO_OPEROVERRIDE + if (IsOper(sptr) && sptr == acptr) + over = 1; + else { +#endif + sendto_one(sptr, err_str(ERR_CHANOPRIVSNEEDED), + me.name, parv[0], + ((chptr) ? (chptr->chname) : parv[2])); + return -1; +#ifndef NO_OPEROVERRIDE + } +#endif + } + } + + if (MyConnect(sptr)) + { + if (check_for_target_limit(sptr, acptr, acptr->name)) + return 0; + if (!over) + { + sendto_one(sptr, rpl_str(RPL_INVITING), me.name, + parv[0], acptr->name, + ((chptr) ? (chptr->chname) : parv[2])); + if (acptr->user->away) + sendto_one(sptr, rpl_str(RPL_AWAY), me.name, + parv[0], acptr->name, acptr->user->away); + } + } + /* Note: is_banned() here will cause some extra CPU load, + * and we're really only relying on the existence + * of the limit because we could momentarily have + * less people on channel. + */ + + /* Yes, it's crack induced. This checks if we should even bother going further */ + if (!(MyConnect(acptr) && chptr && sptr->user && + (is_chan_op(sptr,chptr) || IsULine(sptr) +#ifndef NO_OPEROVERRIDE + || IsOper(sptr) +#endif + ))) + return 0; + + if (is_banned(acptr, sptr, chptr)) + { + if (over) + sendto_snomask(SNO_EYES, + "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +b).", + sptr->name, sptr->user->username, sptr->user->realhost, chptr->chname); + } + else if (chptr->mode.mode & MODE_INVITEONLY) + { + if (over) + sendto_snomask(SNO_EYES, + "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +i).", + sptr->name, sptr->user->username, sptr->user->realhost, chptr->chname); + } + else if (chptr->mode.limit) + { + if (over) + sendto_snomask(SNO_EYES, + "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +l).", + sptr->name, sptr->user->username, sptr->user->realhost, chptr->chname); + } + else if (chptr->mode.mode & MODE_RGSTRONLY) + { + if (over) + sendto_snomask(SNO_EYES, + "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +R).", + sptr->name, sptr->user->username, sptr->user->realhost, chptr->chname); + } + else if (*chptr->mode.key) + { + if (over) + sendto_snomask(SNO_EYES, + "*** OperOverride -- %s (%s@%s) invited him/herself into %s (overriding +k).", + sptr->name, sptr->user->username, sptr->user->realhost, chptr->chname); + } +#ifdef OPEROVERRIDE_VERIFY + else if (chptr->mode.mode & MODE_SECRET || chptr->mode.mode & MODE_PRIVATE) + over = -1; +#endif + else + return 0; + + if (over == 1) + sendto_channelops_butone(NULL, &me, chptr, + ":%s NOTICE @%s :OperOverride -- %s invited him/herself into the channel.", + me.name, chptr->chname, sptr->name); + else if (over == 0) + sendto_channelops_butone(NULL, &me, chptr, + ":%s NOTICE @%s :%s invited %s into the channel.", + me.name, chptr->chname, sptr->name, acptr->name); + + add_invite(acptr, chptr); + + sendto_prefix_one(acptr, sptr, ":%s INVITE %s :%s", parv[0], + acptr->name, ((chptr) ? (chptr->chname) : parv[2])); + + return 0; } diff --git a/src/s_err.c b/src/s_err.c index 927dd16f7..65bda4ef8 100644 --- a/src/s_err.c +++ b/src/s_err.c @@ -576,7 +576,7 @@ static char *replies[] = { /* 521 ERR_LISTSYNTAX */ ":%s 521 %s Bad list syntax, type /quote list ? or /raw list ?", /* 522 ERR_WHOSYNTAX */ ":%s 522 %s :/WHO Syntax incorrect, use /who ? for help", /* 523 ERR_WHOLIMEXCEED */ ":%s 523 %s :Error, /who limit of %d exceed. Please narrow your search down and try again", -/* 524 */ NULL, +/* 524 ERR_OPERSPVERIFY */ ":%s 524 %s :Trying to join +s or +p channel as an oper. Please invite yourself first.", /* 525 */ NULL, /* 526 */ NULL, /* 527 */ NULL,