* | Inspire Internet Relay Chat Daemon |
* +------------------------------------+
*
- * InspIRCd: (C) 2002-2008 InspIRCd Development Team
- * See: http://www.inspircd.org/wiki/index.php/Credits
+ * InspIRCd: (C) 2002-2009 InspIRCd Development Team
+ * See: http://wiki.inspircd.org/Credits
*
* This program is free but copyrighted software; see
* the file COPYING for details.
#include "xline.h"
#include "exitcodes.h"
#include "commands/cmd_whowas.h"
+#include "modes/cmode_h.h"
std::vector<std::string> old_module_names, new_module_names, added_modules, removed_modules;
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());
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.
}
else
{
- ServerInstance->SNO->WriteToSnoMask('A', "There were errors in the configuration file:");
+ ServerInstance->SNO->WriteToSnoMask('a', "There were errors in the configuration file:");
while (start < errors.length())
{
- ServerInstance->SNO->WriteToSnoMask('A', errors.substr(start, 360));
+ ServerInstance->SNO->WriteToSnoMask('a', errors.substr(start, 360));
start += 360;
}
}
{"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},
{"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},
{"No reason", "", NULL},
{DT_CHARPTR, DT_CHARPTR},
InitXLine, DoQLine, DoneConfItem},
-
+
{"badhost",
{"reason", "host", NULL},
{"No reason", "", NULL},
{"No reason", "", NULL},
{DT_CHARPTR, DT_CHARPTR},
InitXLine, DoELine, DoneELine},
-
+
{"type",
{"name", "classes", NULL},
{"", "", NULL},
{"", "", "", "", "", NULL},
{DT_NOSPACES, DT_CHARPTR, DT_CHARPTR, DT_CHARPTR, DT_CHARPTR},
InitClasses, DoClass, DoneClassesAndTypes},
-
+
{NULL,
{NULL},
{NULL},
delete errstr;
return;
}
-
+
delete errstr;
/* The stuff in here may throw CoreException, be sure we're in a position to catch it. */
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();
+
+ // XXX: ServerInstance->Threads->Lock();
switch (dt)
{
case DT_NOSPACES:
ValueContainerChar* vcc = (ValueContainerChar*)Values[Index].val;
if (*(vi.GetString()) && !ServerInstance->IsChannel(vi.GetString(), MAXBUF))
{
- ServerInstance->Threads->Unlock();
+ // XXX: 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->Unlock();
+ // XXX: ServerInstance->Threads->Unlock();
}
/* Read the multiple-tag items (class tags, connect tags, etc)
*/
for (int Index = 0; MultiValues[Index].tag; ++Index)
{
- ServerInstance->Threads->Lock();
+ // XXX: ServerInstance->Threads->Lock();
MultiValues[Index].init_function(this, MultiValues[Index].tag);
- ServerInstance->Threads->Unlock();
+ // XXX: ServerInstance->Threads->Unlock();
int number_of_tags = ConfValueEnum(newconfig, MultiValues[Index].tag);
dt &= ~DT_ALLOW_NEWLINE;
dt &= ~DT_ALLOW_WILD;
- ServerInstance->Threads->Lock();
+ // XXX: ServerInstance->Threads->Lock();
/* We catch and rethrow any exception here just so we can free our mutex
*/
try
}
catch (CoreException &e)
{
- ServerInstance->Threads->Unlock();
+ // XXX: ServerInstance->Threads->Unlock();
throw e;
}
- ServerInstance->Threads->Unlock();
+ // XXX: ServerInstance->Threads->Unlock();
}
MultiValues[Index].validation_function(this, MultiValues[Index].tag, (char**)MultiValues[Index].items, vl, MultiValues[Index].datatype);
}
return;
}
- ServerInstance->Threads->Lock();
+ // XXX: ServerInstance->Threads->Lock();
for (int i = 0; i < ConfValueEnum(newconfig, "type"); ++i)
{
char item[MAXBUF], classn[MAXBUF], classes[MAXBUF];
if (bail)
printf("Warning: Oper type '%s' has a missing class named '%s', this does nothing!\n", item, classname.c_str());
else
- ServerInstance->SNO->WriteToSnoMask('A', "Warning: Oper type '%s' has a missing class named '%s', this does nothing!", item, classname.c_str());
+ ServerInstance->SNO->WriteToSnoMask('a', "Warning: Oper type '%s' has a missing class named '%s', this does nothing!", item, classname.c_str());
}
}
}
/* If we succeeded, set the ircd config to the new one */
this->config_data = newconfig;
- ServerInstance->Threads->Unlock();
+ // XXX: ServerInstance->Threads->Unlock();
// write once here, to try it out and make sure its ok
ServerInstance->WritePID(this->PID);
if (pl.size() && !useruid.empty())
{
- ServerInstance->Threads->Lock();
+ // XXX: 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());
}
}
- ServerInstance->Threads->Unlock();
+ // XXX: ServerInstance->Threads->Unlock();
}
- ServerInstance->Threads->Lock();
+ // XXX: ServerInstance->Threads->Lock();
if (!removed_modules.empty())
{
for (std::vector<std::string>::iterator removing = removed_modules.begin(); removing != removed_modules.end(); removing++)
{
if (ServerInstance->Modules->Unload(removing->c_str()))
{
- ServerInstance->SNO->WriteToSnoMask('A', "*** REHASH UNLOADED MODULE: %s",removing->c_str());
+ ServerInstance->SNO->WriteToSnoMask('a', "*** REHASH UNLOADED MODULE: %s",removing->c_str());
if (!useruid.empty())
{
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());
+ ServerInstance->SNO->WriteToSnoMask('a', "Module %s successfully unloaded.", removing->c_str());
rem++;
}
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());
+ 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());
+ ServerInstance->SNO->WriteToSnoMask('a', "*** REHASH LOADED MODULE: %s",adding->c_str());
if (!useruid.empty())
{
User* user = ServerInstance->FindNick(useruid);
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());
+ ServerInstance->SNO->WriteToSnoMask('a', "Module %s successfully loaded.", adding->c_str());
add++;
}
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->SNO->WriteToSnoMask('a', "Failed to load module %s: %s", adding->c_str(), ServerInstance->Modules->LastError().c_str());
}
}
}
- ServerInstance->Threads->Unlock();
+ // XXX: ServerInstance->Threads->Unlock();
}
user->WriteServ("NOTICE %s :*** Successfully rehashed server.", user->nick.c_str());
}
else
- ServerInstance->SNO->WriteToSnoMask('A', "*** Successfully rehashed server.");
+ ServerInstance->SNO->WriteToSnoMask('a', "*** Successfully rehashed server.");
}
}
{
// errorstream << "Closing config tag on line " << linenumber << std::endl;
in_tag = false;
-
+
/*
* If this finds an <include> then ParseLine can simply call
* LoadConf() and load the included config into the same ConfigDataHash
last_successful_parse = linenumber;
linenumber = bl;
-
+
line.clear();
}
else
got_key = false;
if ((tagname == "include") && (current_key == "file"))
- {
+ {
if (!this->DoInclude(target, current_value, errorstream))
return false;
}
if ((sb.st_mode & S_IFDIR) > 0)
return false;
-
+
FILE *input;
if ((input = fopen (file, "r")) == NULL)
return false;
}
-bool ServerConfig::DirValid(const char* dirandfile)
-{
-#ifdef WINDOWS
- return true;
-#else
-
- char work[1024];
- char buffer[1024];
- char otherdir[1024];
- int p;
-
- strlcpy(work, dirandfile, 1024);
- p = strlen(work);
-
- // we just want the dir
- while (*work)
- {
- if (work[p] == '/')
- {
- work[p] = '\0';
- break;
- }
-
- work[p--] = '\0';
- }
-
- // Get the current working directory
- if (getcwd(buffer, 1024 ) == NULL )
- return false;
-
- if (chdir(work) == -1)
- return false;
-
- if (getcwd(otherdir, 1024 ) == NULL )
- return false;
-
- if (chdir(buffer) == -1)
- return false;
-
- size_t t = strlen(work);
-
- if (strlen(otherdir) >= t)
- {
- otherdir[t] = '\0';
- if (!strcmp(otherdir,work))
- {
- return true;
- }
-
- return false;
- }
- else
- {
- return false;
- }
-#endif
-}
-
std::string ServerConfig::GetFullProgDir()
{
char buffer[PATH_MAX];
*/
bool InitTypes(ServerConfig* conf, const char*)
{
- if (conf->opertypes.size())
- {
- for (opertype_t::iterator n = conf->opertypes.begin(); n != conf->opertypes.end(); n++)
- {
- if (n->second)
- delete[] n->second;
- }
- }
-
conf->opertypes.clear();
return true;
}
const char* TypeName = values[0].GetString();
const char* Classes = values[1].GetString();
- conf->opertypes[TypeName] = strnewdup(Classes);
+ conf->opertypes[TypeName] = std::string(Classes);
return true;
}
void ConfigReaderThread::Run()
{
ServerInstance->Config->Read(do_bail, TheUserUID);
- ServerInstance->Threads->Lock();
- this->SetExitFlag();
- ServerInstance->Threads->Unlock();
+ done = true;
}
-