X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fconfigreader.cpp;h=e7613ce5a6c1b92803652f10bb6d74004e714378;hb=d6501677e1a66e4b438815e67b705eb26b68a4bc;hp=b4f28d04e219f79f967bdbb401724b30e5b217f4;hpb=1a111a2ee71a2e50e28fb3622b3d5e0c54aa304f;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/configreader.cpp b/src/configreader.cpp index b4f28d04e..e7613ce5a 100644 --- a/src/configreader.cpp +++ b/src/configreader.cpp @@ -2,7 +2,7 @@ * | Inspire Internet Relay Chat Daemon | * +------------------------------------+ * - * InspIRCd: (C) 2002-2008 InspIRCd Development Team + * InspIRCd: (C) 2002-2009 InspIRCd Development Team * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see @@ -30,6 +30,7 @@ #include "xline.h" #include "exitcodes.h" #include "commands/cmd_whowas.h" +#include "modes/cmode_h.h" std::vector old_module_names, new_module_names, added_modules, removed_modules; @@ -359,6 +360,24 @@ bool ValidateMaxWho(ServerConfig* conf, const char*, const char*, ValueItem &dat return true; } +bool ValidateHalfOp(ServerConfig* conf, const char*, const char*, ValueItem &data) +{ + ModeHandler* mh = conf->GetInstance()->Modes->FindMode('h', MODETYPE_CHANNEL); + if (data.GetBool() && !mh) + { + conf->GetInstance()->Logs->Log("CONFIG",DEFAULT,"Enabling halfop mode."); + mh = new ModeChannelHalfOp(conf->GetInstance()); + conf->GetInstance()->Modes->AddMode(mh); + } + else if (!data.GetBool() && mh) + { + conf->GetInstance()->Logs->Log("CONFIG",DEFAULT,"Disabling halfop mode."); + conf->GetInstance()->Modes->DelMode(mh); + delete mh; + } + return true; +} + bool ValidateMotd(ServerConfig* conf, const char*, const char*, ValueItem &data) { conf->ReadFile(conf->MOTD, data.GetString()); @@ -471,7 +490,7 @@ bool InitConnect(ServerConfig* conf, const char*) if (c->RefCount == 0) { conf->GetInstance()->Logs->Log("CONFIG",DEFAULT, "Removing connect class, refcount is 0!"); - + /* This was causing a crash, because we'd set i to .begin() just here, but then the for loop's increment would * set it to .begin() + 1. Which if it was already the last thing in the list, wasn't good. * Now the increment is in the else { } below. @@ -797,14 +816,14 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"options", "fixedpart", "", new ValueContainerChar (this->FixedPart), DT_CHARPTR, NoValidation}, {"performance", "netbuffersize","10240", new ValueContainerInt (&this->NetBufferSize), DT_INTEGER, ValidateNetBufferSize}, {"performance", "maxwho", "128", new ValueContainerInt (&this->MaxWhoResults), DT_INTEGER, ValidateMaxWho}, - {"options", "allowhalfop", "0", new ValueContainerBool (&this->AllowHalfop), DT_BOOLEAN, NoValidation}, + {"options", "allowhalfop", "0", new ValueContainerBool (&this->AllowHalfop), DT_BOOLEAN, ValidateHalfOp}, {"dns", "server", "", new ValueContainerChar (this->DNSServer), DT_IPADDRESS,DNSServerValidator}, {"dns", "timeout", "5", new ValueContainerInt (&this->dns_timeout), DT_INTEGER, NoValidation}, {"options", "moduledir", MOD_PATH, new ValueContainerChar (this->ModPath), DT_CHARPTR, NoValidation}, {"disabled", "commands", "", new ValueContainerChar (this->DisabledCommands), DT_CHARPTR, NoValidation}, {"disabled", "usermodes", "", new ValueContainerChar (disabledumodes), DT_CHARPTR, ValidateDisabledUModes}, {"disabled", "chanmodes", "", new ValueContainerChar (disabledcmodes), DT_CHARPTR, ValidateDisabledCModes}, - {"disabled", "fakenonexistant", "0", new ValueContainerBool (&this->DisabledDontExist), DT_BOOLEAN, NoValidation}, + {"disabled", "fakenonexistant", "0", new ValueContainerBool (&this->DisabledDontExist), DT_BOOLEAN, NoValidation}, {"security", "runasuser", "", new ValueContainerChar(this->SetUser), DT_CHARPTR, NoValidation}, {"security", "runasgroup", "", new ValueContainerChar(this->SetGroup), DT_CHARPTR, NoValidation}, @@ -815,7 +834,8 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"security", "hidewhois", "", new ValueContainerChar (this->HideWhoisServer), DT_NOSPACES, NoValidation}, {"security", "hidekills", "", new ValueContainerChar (this->HideKillsServer), DT_NOSPACES, NoValidation}, {"security", "operspywhois", "0", new ValueContainerBool (&this->OperSpyWhois), DT_BOOLEAN, NoValidation}, - {"security", "restrictbannedusers", "1", new ValueContainerBool (&this->RestrictBannedUsers), DT_BOOLEAN, NoValidation}, + {"security", "restrictbannedusers", "1", new ValueContainerBool (&this->RestrictBannedUsers), DT_BOOLEAN, NoValidation}, + {"security", "genericoper", "0", new ValueContainerBool (&this->GenericOper), DT_BOOLEAN, NoValidation}, {"performance", "nouserdns", "0", new ValueContainerBool (&this->NoUserDns), DT_BOOLEAN, NoValidation}, {"options", "syntaxhints", "0", new ValueContainerBool (&this->SyntaxHints), DT_BOOLEAN, NoValidation}, {"options", "cyclehosts", "0", new ValueContainerBool (&this->CycleHosts), DT_BOOLEAN, NoValidation}, @@ -897,7 +917,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"No reason", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, InitXLine, DoQLine, DoneConfItem}, - + {"badhost", {"reason", "host", NULL}, {"No reason", "", NULL}, @@ -909,7 +929,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"No reason", "", NULL}, {DT_CHARPTR, DT_CHARPTR}, InitXLine, DoELine, DoneELine}, - + {"type", {"name", "classes", NULL}, {"", "", NULL}, @@ -921,7 +941,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) {"", "", "", "", "", NULL}, {DT_NOSPACES, DT_CHARPTR, DT_CHARPTR, DT_CHARPTR, DT_CHARPTR}, InitClasses, DoClass, DoneClassesAndTypes}, - + {NULL, {NULL}, {NULL}, @@ -940,7 +960,7 @@ void ServerConfig::Read(bool bail, const std::string &useruid) delete errstr; return; } - + delete errstr; /* The stuff in here may throw CoreException, be sure we're in a position to catch it. */ @@ -982,10 +1002,10 @@ void ServerConfig::Read(bool bail, const std::string &useruid) ConfValue(newconfig, Values[Index].tag, Values[Index].value, Values[Index].default_value, 0, item, MAXBUF, allow_newlines); ValueItem vi(item); - + if (!Values[Index].validation_function(this, Values[Index].tag, Values[Index].value, vi)) throw CoreException("One or more values in your configuration file failed to validate. Please see your ircd.log for more information."); - + ServerInstance->Threads->Lock(); switch (dt) { @@ -1511,7 +1531,7 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, FILE* &conf, const char* fil { // errorstream << "Closing config tag on line " << linenumber << std::endl; in_tag = false; - + /* * If this finds an then ParseLine can simply call * LoadConf() and load the included config into the same ConfigDataHash @@ -1522,7 +1542,7 @@ bool ServerConfig::LoadConf(ConfigDataHash &target, FILE* &conf, const char* fil last_successful_parse = linenumber; linenumber = bl; - + line.clear(); } else @@ -1667,7 +1687,7 @@ bool ServerConfig::ParseLine(ConfigDataHash &target, const std::string &filename got_key = false; if ((tagname == "include") && (current_key == "file")) - { + { if (!this->DoInclude(target, current_value, errorstream)) return false; } @@ -2007,7 +2027,7 @@ bool ServerConfig::FileExists(const char* file) if ((sb.st_mode & S_IFDIR) > 0) return false; - + FILE *input; if ((input = fopen (file, "r")) == NULL) return false; @@ -2356,4 +2376,3 @@ void ConfigReaderThread::Run() this->SetExitFlag(); ServerInstance->Threads->Unlock(); } -