diff --git a/Changes b/Changes index 12fc911a8..09b8f6a10 100644 --- a/Changes +++ b/Changes @@ -395,3 +395,8 @@ it will display real hosts instead of masked ones in the replies. --Luke =================================== + +Oper invisibility is no longer enabled by default +but is a provided option in ./Config +--Luke +=================================== diff --git a/Config b/Config index 23af92146..881a35556 100755 --- a/Config +++ b/Config @@ -81,6 +81,7 @@ CRYPT_OPER_PASSWORD="" CRYPT_LINK_PASSWORD="" CRYPT_ILINE_PASSWORD="" CRYPT_XLINE_PASSWORD="" +ENABLE_INVISOPER="" LISTEN_SIZE="5" MAXSENDQLENGTH="3000000" BUFFERPOOL="(9 * MAXSENDQLENGTH)" @@ -1502,6 +1503,41 @@ fi esac done +FOO="" +runonce="" +while [ -z "$FOO" ] ; do +if [ -n "$ENABLE_INVISOPER" ] ; then + FOO="Yes" +else + FOO="No" +fi +echo "" +echo "Do you want to enable total invisibility (+I) mode for opers?" +echo $n "[$FOO] -> $c" +if [ -z "$AUTO_CONFIG" -o -n "$runonce" ] ; then + read cc +else + cc="" + runonce=Yes +fi +if [ -z "$cc" ] ; then + cc=$FOO +fi + case "$cc" in + [Yy]*) + ENABLE_INVISOPER="1" + ;; + [Nn]*) + ENABLE_INVISOPER="" + ;; + *) + echo "" + echo "You need to enter either Yes or No here..." + echo "" + FOO="" + ;; + esac +done FOO="" runonce="" @@ -1852,6 +1888,11 @@ if [ -n "$CRYPT_XLINE_PASSWORD" ] ; then else echo "#undef CRYPT_XLINE_PASSWORD" >> $OPTIONS_H fi +if [ -n "$ENABLE_INVISOPER" ] ; then + echo "#define ENABLE_INVISOPER 1" >> $OPTIONS_H +else + echo "#undef ENABLE_INVISOPER" >> $OPTIONS_H +fi if [ -n "$HUB" ] ; then echo "#define HUB 1" >> $OPTIONS_H else @@ -1897,6 +1938,7 @@ CRYPT_OPER_PASSWORD="$CRYPT_OPER_PASSWORD" CRYPT_LINK_PASSWORD="$CRYPT_LINK_PASSWORD" CRYPT_ILINE_PASSWORD="$CRYPT_ILINE_PASSWORD" CRYPT_XLINE_PASSWORD="$CRYPT_XLINE_PASSWORD" +ENABLE_INVISOPER="$ENABLE_INVISOPER" LISTEN_SIZE="$LISTEN_SIZE" MAXSENDQLENGTH="$MAXSENDQLENGTH" BUFFERPOOL="$BUFFERPOOL" diff --git a/include/numeric.h b/include/numeric.h index 150b2f713..5a8d9f77c 100644 --- a/include/numeric.h +++ b/include/numeric.h @@ -82,7 +82,10 @@ #define ERR_HOSTILENAME 455 -#define ERR_NOHIDING 459 +#ifdef ENABLE_INVISOPER + #define ERR_NOHIDING 459 +#endif + #define ERR_NOTFORHALFOPS 460 #define ERR_NEEDMOREPARAMS 461 #define ERR_ALREADYREGISTRED 462 diff --git a/include/struct.h b/include/struct.h index 5cad78a03..85afcb21f 100644 --- a/include/struct.h +++ b/include/struct.h @@ -247,14 +247,23 @@ typedef unsigned int u_int32_t; /* XXX Hope this works! */ #define UMODE_BOT 0x400000 /* User is a bot */ #define UMODE_SECURE 0x800000 /* User is a secure connect */ #define UMODE_FCLIENT 0x1000000 /* recieve client on far connects.. */ -#define UMODE_HIDING 0x2000000 /* Totally invisible .. */ + +#ifdef ENABLE_INVISOPER + #define UMODE_HIDING 0x2000000 /* Totally invisible .. */ +#endif + #define UMODE_VICTIM 0x8000000 /* Intentional Victim */ #define UMODE_DEAF 0x10000000 #define UMODE_HIDEOPER 0x20000000 /* Hide oper mode */ #define UMODE_SETHOST 0x40000000 /* used sethost */ #define UMODE_STRIPBADWORDS 0x80000000 /* */ -#define SEND_UMODES (UMODE_INVISIBLE|UMODE_OPER|UMODE_WALLOP|UMODE_FAILOP|UMODE_HELPOP|UMODE_REGNICK|UMODE_SADMIN|UMODE_NETADMIN|UMODE_COADMIN|UMODE_ADMIN|UMODE_SERVICES|UMODE_HIDE|UMODE_EYES|UMODE_WHOIS|UMODE_KIX|UMODE_BOT|UMODE_SECURE|UMODE_FCLIENT|UMODE_HIDING|UMODE_DEAF|UMODE_VICTIM|UMODE_HIDEOPER|UMODE_SETHOST|UMODE_STRIPBADWORDS|UMODE_JUNK) +#ifdef ENABLE_INVISOPER + #define SEND_UMODES (UMODE_INVISIBLE|UMODE_OPER|UMODE_WALLOP|UMODE_FAILOP|UMODE_HELPOP|UMODE_REGNICK|UMODE_SADMIN|UMODE_NETADMIN|UMODE_COADMIN|UMODE_ADMIN|UMODE_SERVICES|UMODE_HIDE|UMODE_EYES|UMODE_WHOIS|UMODE_KIX|UMODE_BOT|UMODE_SECURE|UMODE_FCLIENT|UMODE_HIDING|UMODE_DEAF|UMODE_VICTIM|UMODE_HIDEOPER|UMODE_SETHOST|UMODE_STRIPBADWORDS|UMODE_JUNK) +#else + #define SEND_UMODES (UMODE_INVISIBLE|UMODE_OPER|UMODE_WALLOP|UMODE_FAILOP|UMODE_HELPOP|UMODE_REGNICK|UMODE_SADMIN|UMODE_NETADMIN|UMODE_COADMIN|UMODE_ADMIN|UMODE_SERVICES|UMODE_HIDE|UMODE_EYES|UMODE_WHOIS|UMODE_KIX|UMODE_BOT|UMODE_SECURE|UMODE_FCLIENT|UMODE_DEAF|UMODE_VICTIM|UMODE_HIDEOPER|UMODE_SETHOST|UMODE_STRIPBADWORDS|UMODE_JUNK) +#endif + #define ALL_UMODES (SEND_UMODES|UMODE_SERVNOTICE|UMODE_LOCOP|UMODE_KILLS|UMODE_CLIENT|UMODE_FLOOD|UMODE_SERVICES|UMODE_EYES) #define FLAGS_ID (FLAGS_DOID|FLAGS_GOTID) @@ -283,7 +292,10 @@ typedef unsigned int u_int32_t; /* XXX Hope this works! */ #define IsKix(x) ((x)->umodes & UMODE_KIX) #define IsHelpOp(x) ((x)->umodes & UMODE_HELPOP) #define IsAdmin(x) ((x)->umodes & UMODE_ADMIN) -#define IsHiding(x) ((x)->umodes & UMODE_HIDING) + +#ifdef ENABLE_INVISOPER + #define IsHiding(x) ((x)->umodes & UMODE_HIDING) +#endif #ifdef STRIPBADWORDS #define IsFilteringWords(x) ((x)->umodes & UMODE_STRIPBADWORDS) @@ -1043,7 +1055,11 @@ struct Channel { #define MODE_NOKNOCK 0x800000 #define MODE_NOINVITE 0x1000000 #define MODE_FLOODLIMIT 0x2000000 -#define MODE_NOHIDING 0x4000000 + +#ifdef ENABLE_INVISOPER + #define MODE_NOHIDING 0x4000000 +#endif + #ifdef STRIPBADWORDS #define MODE_STRIPBADWORDS 0x8000000 #endif diff --git a/src/channel.c b/src/channel.c index 862b535e7..e6f585a39 100644 --- a/src/channel.c +++ b/src/channel.c @@ -142,7 +142,9 @@ aCtab cFlagTab[] = { {MODE_NOKNOCK, 'K', 0, 0}, /* knock knock (no way!) */ {MODE_NOINVITE, 'V', 0, 0}, /* no invites */ {MODE_FLOODLIMIT, 'f', 0, 1}, /* flood limiter */ +#ifdef ENABLE_INVISOPER {MODE_NOHIDING, 'H', 0, 0}, /* no +I joiners */ +#endif #ifdef STRIPBADWORDS {MODE_STRIPBADWORDS, 'G', 0, 0}, /* no badwords */ #endif @@ -1565,6 +1567,7 @@ int do_mode_char(chptr, modetype, modechar, param, what, cptr, pcount, pvar, if (!IsServer(cptr) && !IsULine(cptr)) break; goto setthephuckingmode; +#ifdef ENABLE_INVISOPER case MODE_NOHIDING: if (!IsSkoAdmin(cptr) && !IsServer(cptr) && !IsULine(cptr)) @@ -1575,6 +1578,7 @@ int do_mode_char(chptr, modetype, modechar, param, what, cptr, pcount, pvar, break; } goto setthephuckingmode; +#endif case MODE_SECRET: case MODE_PRIVATE: case MODE_MODERATED: @@ -2268,8 +2272,10 @@ static int can_join(cptr, sptr, chptr, key, link, parv) return (ERR_ADMONLY); } +#ifdef ENABLE_INVISOPER if ((chptr->mode.mode & MODE_NOHIDING) && IsHiding(sptr)) return (ERR_NOHIDING); +#endif if ((IsOper(sptr) && !((chptr->mode.mode & MODE_ADMONLY))) && !(ib==0)) { @@ -2741,9 +2747,12 @@ int channel_link(cptr, sptr, parc, parv) /* ** notify all other users on the new channel */ +#ifdef ENABLE_INVISOPER if (!IsHiding(sptr)) +#endif sendto_channel_butserv(chptr, sptr, ":%s JOIN :%s", parv[0], name); +#ifdef ENABLE_INVISOPER else { if (MyClient(sptr)) @@ -2756,6 +2765,7 @@ int channel_link(cptr, sptr, parc, parv) "*** Invisibility -- %s (%s@%s) JOIN %s", sptr->name, sptr->user->username, sptr->user->realhost, chptr->chname); } +#endif sendto_serv_butone_token(cptr, parv[0], MSG_JOIN, TOK_JOIN, name); @@ -2964,6 +2974,7 @@ int m_join(cptr, sptr, parc, parv) /* ** notify all other users on the new channel */ +#ifdef ENABLE_INVISOPER if (IsHiding(sptr)) { if (MyClient(sptr)) @@ -2986,6 +2997,9 @@ int m_join(cptr, sptr, parc, parv) } } else if (chptr->mode.mode & MODE_AUDITORIUM) +#else + if (chptr->mode.mode & MODE_AUDITORIUM) +#endif { if (MyClient(sptr)) sendto_one(sptr, ":%s!%s@%s JOIN :%s", @@ -3128,7 +3142,7 @@ int m_part(cptr, sptr, parc, parv) if (1) { - +#ifdef ENABLE_INVISOPER if (IsHiding(sptr)) { if (MyClient(sptr)) @@ -3171,6 +3185,9 @@ int m_part(cptr, sptr, parc, parv) chptr->chname, comment); } else if (chptr->mode.mode & MODE_AUDITORIUM) +#else + if (chptr->mode.mode & MODE_AUDITORIUM) +#endif { if (MyClient(sptr)) { @@ -3317,6 +3334,7 @@ int m_kick(cptr, sptr, parc, parv) goto attack; /* Hiding patch by }{ */ +#ifdef ENABLE_INVISOPER if (IsHiding(who)) { sendto_one(sptr, @@ -3328,7 +3346,7 @@ int m_kick(cptr, sptr, parc, parv) chptr->chname, comment); break; } - +#endif /* If you're kicking yourself, it really shouldn't matter what modes you have set * unless the channel is +Q */ @@ -4319,8 +4337,10 @@ int m_names(cptr, sptr, parc, parv) acptr = cm->value.cptr; if (IsInvisible(acptr) && !member) continue; +#ifdef ENABLE_INVISOPER if (IsHiding(acptr) && acptr != sptr && !(IsNetAdmin(sptr))) continue; +#endif if (chptr->mode.mode & MODE_AUDITORIUM) if (!is_chan_op(sptr, chptr) && !is_chanprot(sptr, chptr) @@ -4855,7 +4875,9 @@ int m_sjoin(aClient *cptr, aClient *sptr, int parc, char *parv[]) modeflags = 0; } add_user_to_channel(chptr, acptr, modeflags); - if (!IsHiding(acptr)) +#ifdef ENABLE_INVISOPER + if (!IsHiding(acptr)) +#endif sendto_channel_butserv(chptr, acptr, ":%s JOIN :%s", nick, chptr->chname); diff --git a/src/s_conf.c b/src/s_conf.c index 8f1e78683..8d1180747 100644 --- a/src/s_conf.c +++ b/src/s_conf.c @@ -886,9 +886,15 @@ int m_svsnoop(cptr, sptr, parc, parv) acptr->umodes &= ~(UMODE_NETADMIN | UMODE_CLIENT | UMODE_FLOOD | UMODE_EYES | UMODE_WHOIS); +#ifdef ENABLE_INVISOPER acptr->umodes &= ~(UMODE_KIX | UMODE_FCLIENT | UMODE_HIDING | UMODE_DEAF | UMODE_HIDEOPER); +#else + acptr->umodes &= + ~(UMODE_KIX | UMODE_FCLIENT | + UMODE_DEAF | UMODE_HIDEOPER); +#endif acptr->oflag = 0; } @@ -2855,9 +2861,15 @@ int m_svso(cptr, sptr, parc, parv) acptr->umodes &= ~(UMODE_NETADMIN | UMODE_CLIENT | UMODE_FLOOD | UMODE_EYES | UMODE_WHOIS); +#ifdef ENABLE_INVISOPER acptr->umodes &= ~(UMODE_KIX | UMODE_FCLIENT | UMODE_HIDING | UMODE_DEAF | UMODE_HIDEOPER); +#else + acptr->umodes &= + ~(UMODE_KIX | UMODE_FCLIENT | + UMODE_DEAF | UMODE_HIDEOPER); +#endif acptr->oflag = 0; send_umode_out(acptr, acptr, fLag); } diff --git a/src/s_debug.c b/src/s_debug.c index 4a339d9ae..6ead3c931 100644 --- a/src/s_debug.c +++ b/src/s_debug.c @@ -84,7 +84,7 @@ char serveropts[] = { #ifdef USE_SYSLOG 'Y', #endif -#ifdef OPER_NO_HIDING +#ifdef ENABLE_INVISOPER 'H', #endif #ifdef NO_IDENT_CHECKING diff --git a/src/s_unreal.c b/src/s_unreal.c index 4ef3c27fe..c7c4a3c99 100644 --- a/src/s_unreal.c +++ b/src/s_unreal.c @@ -1056,9 +1056,11 @@ int m_sendumode(cptr, sptr, parc, parv) sendto_umode(UMODE_CODER, "%s", parv[2]); break; */ +#ifdef ENABLE_INVISOPER case 'I': sendto_umode(UMODE_HIDING, "%s", parv[2]); break; +#endif case 'w': sendto_umode(UMODE_WALLOP, "%s", parv[2]); break; diff --git a/src/s_user.c b/src/s_user.c index 2d606b0c9..b8b302d44 100644 --- a/src/s_user.c +++ b/src/s_user.c @@ -88,7 +88,9 @@ static int user_modes[] = { UMODE_OPER, 'o', UMODE_KIX, 'q', UMODE_BOT, 'B', UMODE_FCLIENT, 'F', +#ifdef ENABLE_INVISOPER UMODE_HIDING, 'I', +#endif UMODE_SECURE, 'z', UMODE_DEAF, 'd', UMODE_VICTIM, 'v', @@ -2452,8 +2454,10 @@ static void do_who(sptr, acptr, repchan) /* checks for channel /who's and nonopers */ if (channelwho && !IsOper(sptr) && sptr != acptr) { +#ifdef ENABLE_INVISOPER if IsHiding(acptr) return; +#endif if (IsAuditorium(repchan) && !is_chan_op(acptr,repchan) && !is_chan_op(sptr,repchan)) return; @@ -2462,10 +2466,10 @@ static void do_who(sptr, acptr, repchan) if (IsInvisible(acptr) && !IsMember(sptr,repchan)) return; } - +#ifdef ENABLE_INVISOPER if (channelwho && IsHiding(acptr) && !IsNetAdmin(sptr)) return; - +#endif if (acptr->user->away) status[i++] = 'G'; else @@ -2484,11 +2488,19 @@ static void do_who(sptr, acptr, repchan) * simply because they are an oper. (adds ! to the who "flags") */ if (IsAnOper(sptr) && sptr != acptr) +#ifdef ENABLE_INVISOPER if (channelwho && IsHiding(acptr) && IsNetAdmin(sptr) || IsInvisible(acptr) && !IsMember(sptr,repchan) || IsAuditorium(repchan) && !is_chan_op(acptr,repchan) || !ShowChannel(sptr,repchan)) status[i++] = '!'; +#else + if (channelwho && IsNetAdmin(sptr) || + IsInvisible(acptr) && !IsMember(sptr,repchan) || + IsAuditorium(repchan) && !is_chan_op(acptr,repchan) || + !ShowChannel(sptr,repchan)) + status[i++] = '!'; +#endif /* Channel operator */ if (repchan && is_chan_op(acptr, repchan)) @@ -2509,8 +2521,10 @@ static void do_who(sptr, acptr, repchan) ":%s NOTICE %s :*** %s either did a /who or a specific /who on you", me.name, acptr->name, sptr->name); } +#ifdef ENABLE_INVISOPER if (IsHiding(acptr) && sptr != acptr && !IsNetAdmin(sptr)) repchan = NULL; +#endif sendto_one(sptr, rpl_str(RPL_WHOREPLY), me.name, sptr->name, (repchan) ? (repchan->chname) : "*", acptr->user->username, @@ -4329,11 +4343,13 @@ int m_umode(cptr, sptr, parc, parv) && MyClient(sptr)) break; goto def; +#ifdef ENABLE_INVISOPER case 'I': if (NO_OPER_HIDING == 1 && what == MODE_ADD && MyClient(sptr)) break; goto def; +#endif case 'B': if (what == MODE_ADD && MyClient(sptr)) (void)m_botmotd(sptr, sptr, 1, parv); @@ -4422,9 +4438,11 @@ int m_umode(cptr, sptr, parc, parv) ClearNetAdmin(sptr); if (IsCoAdmin(sptr) && !OPIsCoAdmin(sptr)) ClearCoAdmin(sptr); +#ifdef ENABLE_INVISOPER if ((sptr->umodes & UMODE_HIDING) && !(sptr->oflag & OFLAG_INVISIBLE)) sptr->umodes &= ~UMODE_HIDING; +#endif if (MyClient(sptr) && (sptr->umodes & UMODE_SECURE) && !IsSecure(sptr)) sptr->umodes &= ~UMODE_SECURE; @@ -4468,17 +4486,17 @@ int m_umode(cptr, sptr, parc, parv) /* Agents if ((sptr->umodes & (UMODE_AGENT)) && !(sptr->oflag & OFLAG_AGENT)) sptr->umodes &= ~UMODE_AGENT; */ +#ifdef ENABLE_INVISOPER if ((sptr->umodes & UMODE_HIDING) && !IsAnOper(sptr)) sptr->umodes &= ~UMODE_HIDING; - - if ((sptr->umodes & UMODE_HIDING) && !(sptr->oflag & OFLAG_INVISIBLE)) sptr->umodes &= ~UMODE_HIDING; +#endif if (MyClient(sptr) && (sptr->umodes & UMODE_SECURE) && !IsSecure(sptr)) sptr->umodes &= ~UMODE_SECURE; - +#ifdef ENABLE_INVISOPER if ((sptr->umodes & (UMODE_HIDING)) && !(setflags & UMODE_HIDING)) { @@ -4490,9 +4508,11 @@ int m_umode(cptr, sptr, parc, parv) me.name, sptr->name); sendto_channels_inviso_part(sptr); } +#endif if ((sptr->umodes & UMODE_JUNK) && !IsOper(sptr)) sptr->umodes &= ~UMODE_JUNK; +#ifdef ENABLE_INVISOPER if (!(sptr->umodes & (UMODE_HIDING))) { if (setflags & UMODE_HIDING) @@ -4507,6 +4527,7 @@ int m_umode(cptr, sptr, parc, parv) } } +#endif } /* * If I understand what this code is doing correctly... diff --git a/src/webtv.c b/src/webtv.c index 8a218a912..7436c3aaf 100644 --- a/src/webtv.c +++ b/src/webtv.c @@ -299,8 +299,12 @@ int w_whois(aClient *cptr, aClient *sptr, int parc, char *parv[]) } } +#ifdef ENABLE_INVISOPER if (buf[0] != '\0' && !IsULine(acptr) && (!IsHiding(acptr) || IsNetAdmin(sptr) || sptr == acptr)) +#else + if (buf[0] != '\0' && !IsULine(acptr)) +#endif sendto_one(sptr, ":IRC PRIVMSG %s :%s is on %s", sptr->name, name, buf);