]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/users.cpp
Add support for blocking tag messages with the deaf mode.
[user/henk/code/inspircd.git] / src / users.cpp
index 1da7a974c933d85e62fccabc15ca97f97ac66f9f..7029accc052a6c38ae6ee23cafb5f943c59d2671 100644 (file)
@@ -4,7 +4,7 @@
  *   Copyright (C) 2019 linuxdaemon <linuxdaemon.irc@gmail.com>
  *   Copyright (C) 2018 systocrat <systocrat@outlook.com>
  *   Copyright (C) 2018 Dylan Frank <b00mx0r@aureus.pw>
- *   Copyright (C) 2013, 2016-2020 Sadie Powell <sadie@witchery.services>
+ *   Copyright (C) 2013, 2016-2021 Sadie Powell <sadie@witchery.services>
  *   Copyright (C) 2013 Daniel Vassdal <shutter@canternet.org>
  *   Copyright (C) 2013 ChrisTX <xpipe@hotmail.de>
  *   Copyright (C) 2013 Adam <Adam@anope.org>
@@ -16,9 +16,9 @@
  *   Copyright (C) 2009 Uli Schlachter <psychon@inspircd.org>
  *   Copyright (C) 2008 Thomas Stagner <aquanight@inspircd.org>
  *   Copyright (C) 2008 John Brooks <special@inspircd.org>
- *   Copyright (C) 2007-2009 Robin Burchell <robin+git@viroteck.net>
  *   Copyright (C) 2007, 2009 Dennis Friis <peavey@inspircd.org>
- *   Copyright (C) 2006-2009 Craig Edwards <brain@inspircd.org>
+ *   Copyright (C) 2006-2009 Robin Burchell <robin+git@viroteck.net>
+ *   Copyright (C) 2004, 2006-2009 Craig Edwards <brain@inspircd.org>
  *
  * This file is part of InspIRCd.  InspIRCd is free software: you can
  * redistribute it and/or modify it under the terms of the GNU General Public
@@ -425,6 +425,26 @@ void User::Oper(OperInfo* info)
        FOREACH_MOD(OnPostOper, (this, oper->name, opername));
 }
 
+namespace
+{
+       bool ParseModeList(std::bitset<64>& modeset, ConfigTag* tag, const std::string& field)
+       {
+               std::string modes;
+               bool hasmodes = tag->readString(field, modes);
+               for (std::string::const_iterator iter = modes.begin(); iter != modes.end(); ++iter)
+               {
+                       const char& chr = *iter;
+                       if (chr == '*')
+                               modeset.set();
+                       else if (ModeParser::IsModeChar(chr))
+                               modeset.set(chr - 'A');
+                       else
+                               ServerInstance->Logs->Log("CONFIG", LOG_DEFAULT, "'%c' is not a valid value for <class:%s>, ignoring...", chr, field.c_str());
+               }
+               return hasmodes;
+       }
+}
+
 void OperInfo::init()
 {
        AllowedOperCommands.Clear();
@@ -434,6 +454,7 @@ void OperInfo::init()
        AllowedSnomasks.reset();
        AllowedUserModes['o' - 'A'] = true; // Call me paranoid if you want.
 
+       bool defaultsnomasks = true;
        for(std::vector<reference<ConfigTag> >::iterator iter = class_blocks.begin(); iter != class_blocks.end(); ++iter)
        {
                ConfigTag* tag = *iter;
@@ -441,36 +462,15 @@ void OperInfo::init()
                AllowedOperCommands.AddList(tag->getString("commands"));
                AllowedPrivs.AddList(tag->getString("privs"));
 
-               const std::string umodes = tag->getString("usermodes");
-               for (std::string::const_iterator c = umodes.begin(); c != umodes.end(); ++c)
-               {
-                       const char& chr = *c;
-                       if (chr == '*')
-                               this->AllowedUserModes.set();
-                       else if (ModeParser::IsModeChar(chr))
-                               this->AllowedUserModes[chr - 'A'] = true;
-               }
-
-               const std::string cmodes = tag->getString("chanmodes");
-               for (std::string::const_iterator c = cmodes.begin(); c != cmodes.end(); ++c)
-               {
-                       const char& chr = *c;
-                       if (chr == '*')
-                               this->AllowedChanModes.set();
-                       else if (ModeParser::IsModeChar(chr))
-                               this->AllowedChanModes[chr - 'A'] = true;
-               }
-
-               const std::string snomasks = tag->getString("snomasks", "*");
-               for (std::string::const_iterator c = snomasks.begin(); c != snomasks.end(); ++c)
-               {
-                       const char& chr = *c;
-                       if (chr == '*')
-                               this->AllowedSnomasks.set();
-                       else if (ModeParser::IsModeChar(chr))
-                               this->AllowedSnomasks[chr - 'A'] = true;
-               }
+               ParseModeList(AllowedChanModes, tag, "chanmodes");
+               ParseModeList(AllowedUserModes, tag, "usermodes");
+               if (ParseModeList(AllowedSnomasks, tag, "snomasks"))
+                       defaultsnomasks = false;
        }
+
+       // Compatibility for older configs that don't have the snomasks field.
+       if (defaultsnomasks)
+               AllowedSnomasks.set();
 }
 
 void User::UnOper()