X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fusers.cpp;h=7029accc052a6c38ae6ee23cafb5f943c59d2671;hb=e2b0f3dc9ef4d56c71d7abda13e6139ca092e387;hp=1da7a974c933d85e62fccabc15ca97f97ac66f9f;hpb=0a6b1e1a7de92e078a98f0b955d2624e5b85e4c1;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/users.cpp b/src/users.cpp index 1da7a974c..7029accc0 100644 --- a/src/users.cpp +++ b/src/users.cpp @@ -4,7 +4,7 @@ * Copyright (C) 2019 linuxdaemon * Copyright (C) 2018 systocrat * Copyright (C) 2018 Dylan Frank - * Copyright (C) 2013, 2016-2020 Sadie Powell + * Copyright (C) 2013, 2016-2021 Sadie Powell * Copyright (C) 2013 Daniel Vassdal * Copyright (C) 2013 ChrisTX * Copyright (C) 2013 Adam @@ -16,9 +16,9 @@ * Copyright (C) 2009 Uli Schlachter * Copyright (C) 2008 Thomas Stagner * Copyright (C) 2008 John Brooks - * Copyright (C) 2007-2009 Robin Burchell * Copyright (C) 2007, 2009 Dennis Friis - * Copyright (C) 2006-2009 Craig Edwards + * Copyright (C) 2006-2009 Robin Burchell + * Copyright (C) 2004, 2006-2009 Craig Edwards * * 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 , 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 >::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()