Add <hidechans:affectsopers>, allows networks to hide channels of a +I user even from opers, for added privacy.

git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@10644 e03df62e-2008-0410-955e-edbf42e46eb7
This commit is contained in:
w00t 2008-10-15 21:21:38 +00:00
parent 5d3ffb27e0
commit 6cdc212ce7
2 changed files with 38 additions and 10 deletions

View File

@ -710,6 +710,11 @@
# HIDECHANS module: Allows opers to hide their channels list from non-
# opers by setting user mode +I on themselves.
# <module name="m_hidechans.so">
#
# HIDECHANS can optionally prevent opers from seeing channels on a +I
# user, for more privacy if set to true.
# This setting is not recommended for most mainstream networks.
#<hidechans affectsopers="false">
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# HIDEOPER module: Allows opers to hide their oper status from non-

View File

@ -47,21 +47,20 @@ class HideChans : public ModeHandler
class ModuleHideChans : public Module
{
bool AffectsOpers;
HideChans* hm;
public:
ModuleHideChans(InspIRCd* Me)
: Module(Me)
ModuleHideChans(InspIRCd* Me) : Module(Me)
{
hm = new HideChans(ServerInstance);
if (!ServerInstance->Modes->AddMode(hm))
throw ModuleException("Could not add new modes!");
Implementation eventlist[] = { I_OnWhoisLine };
ServerInstance->Modules->Attach(eventlist, this, 1);
Implementation eventlist[] = { I_OnWhoisLine, I_OnRehash };
ServerInstance->Modules->Attach(eventlist, this, 2);
OnRehash(NULL, "");
}
virtual ~ModuleHideChans()
{
ServerInstance->Modes->DelMode(hm);
@ -73,12 +72,36 @@ class ModuleHideChans : public Module
return Version("$Id$", VF_COMMON | VF_VENDOR, API_VERSION);
}
virtual void OnRehash(User* user, const std::string &parameter)
{
ConfigReader conf(ServerInstance);
AffectsOpers = conf.ReadFlag("hidechans", "affectsopers", 0);
}
int OnWhoisLine(User* user, User* dest, int &numeric, std::string &text)
{
/* Dont display channels if they have +I set and the
* person doing the WHOIS is not an oper
*/
return ((user != dest) && (!IS_OPER(user)) && (numeric == 319) && dest->IsModeSet('I'));
/* always show to self */
if (user == dest)
return 0;
/* don't touch anything except 319 */
if (numeric != 319)
return 0;
/* don't touch if -I */
if (!dest->IsModeSet('I'))
return 0;
/* if it affects opers, we don't care if they are opered */
if (AffectsOpers)
return 1;
/* doesn't affect opers, sender is opered */
if (IS_OPER(user))
return 0;
/* user must be opered, boned. */
return 1;
}
};