WhoWasGroupSize = WhoWasMaxGroups = WhoWasMaxKeep = 0;
log_file = NULL;
NoUserDns = forcedebug = OperSpyWhois = nofork = HideBans = HideSplits = UndernetMsgPrefix = false;
- CycleHosts = writelog = AllowHalfop = true;
+ CycleHosts = writelog = AllowHalfop = InvBypassModes = true;
dns_timeout = DieDelay = 5;
MaxTargets = 20;
NetBufferSize = 10240;
include_stack.clear();
}
-Module* ServerConfig::GetIOHook(BufferedSocket* is)
-{
- std::map<BufferedSocket*,Module*>::iterator x = SocketIOHookModule.find(is);
- return (x != SocketIOHookModule.end() ? x->second : NULL);
-}
-
-bool ServerConfig::AddIOHook(Module* iomod, BufferedSocket* is)
-{
- if (!GetIOHook(is))
- {
- SocketIOHookModule[is] = iomod;
- is->IsIOHooked = true;
- return true;
- }
- else
- {
- throw ModuleException("BufferedSocket derived class already hooked by another module");
- }
-}
-
-bool ServerConfig::DelIOHook(BufferedSocket* is)
-{
- std::map<BufferedSocket*,Module*>::iterator x = SocketIOHookModule.find(is);
- if (x != SocketIOHookModule.end())
- {
- SocketIOHookModule.erase(x);
- return true;
- }
- return false;
-}
-
void ServerConfig::Update005()
{
std::stringstream out(data005);
return true;
}
-bool ValidateNotEmpty(ServerConfig*, const char* tag, const char*, ValueItem &data)
+bool ValidateNotEmpty(ServerConfig*, const char* tag, const char* val, ValueItem &data)
{
if (!*data.GetString())
- throw CoreException(std::string("The value for ")+tag+" cannot be empty!");
+ throw CoreException(std::string("The value for <")+tag+":"+val+"> cannot be empty!");
return true;
}
return true;
}
-void ServerConfig::ReportConfigError(const std::string &errormessage, bool bail, User* user)
+void ServerConfig::ReportConfigError(const std::string &errormessage, bool bail, const std::string &useruid)
{
ServerInstance->Logs->Log("CONFIG",DEFAULT, "There were errors in your configuration file: %s", errormessage.c_str());
if (bail)
unsigned int prefixlen;
start = 0;
/* ":ServerInstance->Config->ServerName NOTICE user->nick :" */
- if (user)
+ if (!useruid.empty())
{
- prefixlen = strlen(this->ServerName) + user->nick.length() + 11;
- user->WriteServ("NOTICE %s :There were errors in the configuration file:",user->nick.c_str());
- while (start < errors.length())
+ User* user = ServerInstance->FindNick(useruid);
+ if (user)
{
- user->WriteServ("NOTICE %s :%s",user->nick.c_str(), errors.substr(start, 510 - prefixlen).c_str());
- start += 510 - prefixlen;
+ prefixlen = strlen(this->ServerName) + user->nick.length() + 11;
+ user->WriteServ("NOTICE %s :There were errors in the configuration file:",user->nick.c_str());
+ while (start < errors.length())
+ {
+ user->WriteServ("NOTICE %s :%s",user->nick.c_str(), errors.substr(start, 510 - prefixlen).c_str());
+ start += 510 - prefixlen;
+ }
}
}
else
}
}
-void ServerConfig::Read(bool bail, User* user)
+void ServerConfig::Read(bool bail, const std::string &useruid)
{
int rem = 0, add = 0; /* Number of modules added, number of modules removed */
{"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},
{"security", "userstats", "", new ValueContainerChar (this->UserStats), DT_CHARPTR, NoValidation},
{"security", "customversion","", new ValueContainerChar (this->CustomVersion), DT_CHARPTR, NoValidation},
{"security", "hidesplits", "0", new ValueContainerBool (&this->HideSplits), DT_BOOLEAN, NoValidation},
{"limits", "maxkick", "255", new ValueContainerST (&this->Limits.MaxKick), DT_INTEGER, NoValidation},
{"limits", "maxgecos", "128", new ValueContainerST (&this->Limits.MaxGecos), DT_INTEGER, NoValidation},
{"limits", "maxaway", "200", new ValueContainerST (&this->Limits.MaxAway), DT_INTEGER, NoValidation},
+ {"options", "invitebypassmodes", "1", new ValueContainerBool (&this->InvBypassModes), DT_BOOLEAN, NoValidation},
{NULL, NULL, NULL, NULL, DT_NOTHING, NoValidation}
};
if (!this->DoInclude(newconfig, ServerInstance->ConfigFileName, errstr))
{
- ReportConfigError(errstr.str(), bail, user);
+ ReportConfigError(errstr.str(), bail, useruid);
return;
}
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->Mutex(true);
+ ServerInstance->Threads->Lock();
switch (dt)
{
case DT_NOSPACES:
ValueContainerChar* vcc = (ValueContainerChar*)Values[Index].val;
if (*(vi.GetString()) && !ServerInstance->IsChannel(vi.GetString(), MAXBUF))
{
- ServerInstance->Threads->Mutex(false);
+ ServerInstance->Threads->Unlock();
throw CoreException("The value of <"+std::string(Values[Index].tag)+":"+Values[Index].value+"> is not a valid channel name");
}
vcc->Set(vi.GetString(), strlen(vi.GetString()) + 1);
}
/* We're done with this now */
delete Values[Index].val;
- ServerInstance->Threads->Mutex(false);
+ ServerInstance->Threads->Unlock();
}
/* Read the multiple-tag items (class tags, connect tags, etc)
*/
for (int Index = 0; MultiValues[Index].tag; ++Index)
{
- ServerInstance->Threads->Mutex(true);
+ ServerInstance->Threads->Lock();
MultiValues[Index].init_function(this, MultiValues[Index].tag);
- ServerInstance->Threads->Mutex(false);
+ ServerInstance->Threads->Unlock();
int number_of_tags = ConfValueEnum(newconfig, MultiValues[Index].tag);
dt &= ~DT_ALLOW_NEWLINE;
dt &= ~DT_ALLOW_WILD;
- ServerInstance->Threads->Mutex(true);
+ ServerInstance->Threads->Lock();
/* We catch and rethrow any exception here just so we can free our mutex
*/
try
}
catch (CoreException &e)
{
- ServerInstance->Threads->Mutex(false);
+ ServerInstance->Threads->Unlock();
throw e;
}
- ServerInstance->Threads->Mutex(false);
+ ServerInstance->Threads->Unlock();
}
MultiValues[Index].validation_function(this, MultiValues[Index].tag, (char**)MultiValues[Index].items, vl, MultiValues[Index].datatype);
}
catch (CoreException &ce)
{
- ReportConfigError(ce.GetReason(), bail, user);
+ ReportConfigError(ce.GetReason(), bail, useruid);
return;
}
- ServerInstance->Threads->Mutex(true);
+ ServerInstance->Threads->Lock();
for (int i = 0; i < ConfValueEnum(newconfig, "type"); ++i)
{
char item[MAXBUF], classn[MAXBUF], classes[MAXBUF];
}
if (!foundclass)
{
- if (user)
- user->WriteServ("NOTICE %s :*** Warning: Oper type '%s' has a missing class named '%s', this does nothing!", user->nick.c_str(), item, classname.c_str());
+ if (!useruid.empty())
+ {
+ User* user = ServerInstance->FindNick(useruid);
+ if (user)
+ user->WriteServ("NOTICE %s :*** Warning: Oper type '%s' has a missing class named '%s', this does nothing!", user->nick.c_str(), item, classname.c_str());
+ }
else
{
if (bail)
/* If we succeeded, set the ircd config to the new one */
this->config_data = newconfig;
- ServerInstance->Threads->Mutex(false);
+ ServerInstance->Threads->Unlock();
// write once here, to try it out and make sure its ok
ServerInstance->WritePID(this->PID);
FailedPortList pl;
ServerInstance->BindPorts(false, found_ports, pl);
- if (pl.size() && user)
+ if (pl.size() && !useruid.empty())
{
- ServerInstance->Threads->Mutex(true);
- user->WriteServ("NOTICE %s :*** Not all your client ports could be bound.", user->nick.c_str());
- user->WriteServ("NOTICE %s :*** The following port(s) failed to bind:", user->nick.c_str());
- int j = 1;
- for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++)
+ ServerInstance->Threads->Lock();
+ User* user = ServerInstance->FindNick(useruid);
+ if (user)
{
- user->WriteServ("NOTICE %s :*** %d. Address: %s Reason: %s", user->nick.c_str(), j, i->first.empty() ? "<all>" : i->first.c_str(), i->second.c_str());
+ user->WriteServ("NOTICE %s :*** Not all your client ports could be bound.", user->nick.c_str());
+ user->WriteServ("NOTICE %s :*** The following port(s) failed to bind:", user->nick.c_str());
+ int j = 1;
+ for (FailedPortList::iterator i = pl.begin(); i != pl.end(); i++, j++)
+ {
+ user->WriteServ("NOTICE %s :*** %d. Address: %s Reason: %s", user->nick.c_str(), j, i->first.empty() ? "<all>" : i->first.c_str(), i->second.c_str());
+ }
}
- ServerInstance->Threads->Mutex(false);
+ ServerInstance->Threads->Unlock();
}
- ServerInstance->Threads->Mutex(true);
+ ServerInstance->Threads->Lock();
if (!removed_modules.empty())
{
for (std::vector<std::string>::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++)
{
ServerInstance->SNO->WriteToSnoMask('A', "*** REHASH UNLOADED MODULE: %s",removing->c_str());
- if (user)
- user->WriteNumeric(RPL_UNLOADEDMODULE, "%s %s :Module %s successfully unloaded.",user->nick.c_str(), removing->c_str(), removing->c_str());
+ if (!useruid.empty())
+ {
+ User* user = ServerInstance->FindNick(useruid);
+ if (user)
+ user->WriteNumeric(RPL_UNLOADEDMODULE, "%s %s :Module %s successfully unloaded.",user->nick.c_str(), removing->c_str(), removing->c_str());
+ }
+ else
+ ServerInstance->SNO->WriteToSnoMask('A', "Module %s successfully unloaded.", removing->c_str());
rem++;
}
else
{
- if (user)
- user->WriteNumeric(ERR_CANTUNLOADMODULE, "%s %s :Failed to unload module %s: %s",user->nick.c_str(), removing->c_str(), removing->c_str(), ServerInstance->Modules->LastError().c_str());
+ if (!useruid.empty())
+ {
+ User* user = ServerInstance->FindNick(useruid);
+ if (user)
+ user->WriteNumeric(ERR_CANTUNLOADMODULE, "%s %s :Failed to unload module %s: %s",user->nick.c_str(), removing->c_str(), removing->c_str(), ServerInstance->Modules->LastError().c_str());
+ }
+ else
+ ServerInstance->SNO->WriteToSnoMask('A', "Failed to unload module %s: %s", removing->c_str(), ServerInstance->Modules->LastError().c_str());
}
}
}
if (ServerInstance->Modules->Load(adding->c_str()))
{
ServerInstance->SNO->WriteToSnoMask('A', "*** REHASH LOADED MODULE: %s",adding->c_str());
-
- if (user)
- user->WriteNumeric(RPL_LOADEDMODULE, "%s %s :Module %s successfully loaded.",user->nick.c_str(), adding->c_str(), adding->c_str());
+ if (!useruid.empty())
+ {
+ User* user = ServerInstance->FindNick(useruid);
+ if (user)
+ user->WriteNumeric(RPL_LOADEDMODULE, "%s %s :Module %s successfully loaded.",user->nick.c_str(), adding->c_str(), adding->c_str());
+ }
+ else
+ ServerInstance->SNO->WriteToSnoMask('A', "Module %s successfully loaded.", adding->c_str());
add++;
}
else
{
- if (user)
- user->WriteNumeric(ERR_CANTLOADMODULE, "%s %s :Failed to load module %s: %s",user->nick.c_str(), adding->c_str(), adding->c_str(), ServerInstance->Modules->LastError().c_str());
+ if (!useruid.empty())
+ {
+ User* user = ServerInstance->FindNick(useruid);
+ if (user)
+ user->WriteNumeric(ERR_CANTLOADMODULE, "%s %s :Failed to load module %s: %s",user->nick.c_str(), adding->c_str(), adding->c_str(), ServerInstance->Modules->LastError().c_str());
+ }
+ else
+ ServerInstance->SNO->WriteToSnoMask('A', "Failed to load module %s: %s", adding->c_str(), ServerInstance->Modules->LastError().c_str());
}
}
}
ServerInstance->Logs->Log("CONFIG", DEFAULT, "Successfully unloaded %lu of %lu modules and loaded %lu of %lu modules.",(unsigned long)rem,(unsigned long)removed_modules.size(),(unsigned long)add,(unsigned long)added_modules.size());
- ServerInstance->Threads->Mutex(false);
+ ServerInstance->Threads->Unlock();
}
if (bail)
{
/** Note: This is safe, the method checks for user == NULL */
- ServerInstance->Threads->Mutex(true);
+ ServerInstance->Threads->Lock();
+ User* user = NULL;
+ if (!useruid.empty())
+ user = ServerInstance->FindNick(useruid);
ServerInstance->Parser->SetupCommandTable(user);
- ServerInstance->Threads->Mutex(false);
+ ServerInstance->Threads->Unlock();
}
else
{
- if (user)
- user->WriteServ("NOTICE %s :*** Successfully rehashed server.", user->nick.c_str());
+ if (!useruid.empty())
+ {
+ User* user = ServerInstance->FindNick(useruid);
+ if (user)
+ user->WriteServ("NOTICE %s :*** Successfully rehashed server.", user->nick.c_str());
+ }
else
ServerInstance->SNO->WriteToSnoMask('A', "*** Successfully rehashed server.");
}
void ConfigReaderThread::Run()
{
- /* TODO: TheUser may be invalid by the time we get here! Check its validity, or pass a UID would be better */
- ServerInstance->Config->Read(do_bail, TheUser);
- ServerInstance->Threads->Mutex(true);
+ ServerInstance->Config->Read(do_bail, TheUserUID);
+ ServerInstance->Threads->Lock();
this->SetExitFlag();
- ServerInstance->Threads->Mutex(false);
+ ServerInstance->Threads->Unlock();
}