summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/opers.conf.example22
-rw-r--r--include/configreader.h2
-rw-r--r--include/inspircd.h7
-rw-r--r--src/commands/cmd_oper.cpp9
-rw-r--r--src/configreader.cpp4
-rw-r--r--src/listensocket.cpp4
-rw-r--r--src/modules/m_httpd_config.cpp2
-rw-r--r--src/users.cpp22
8 files changed, 43 insertions, 29 deletions
diff --git a/conf/opers.conf.example b/conf/opers.conf.example
index d0953d320..2b75fa808 100644
--- a/conf/opers.conf.example
+++ b/conf/opers.conf.example
@@ -12,10 +12,10 @@
# #
<class
- name="Shutdown"
+ name="Shutdown"
# commands: oper commands that users of this class can run.
- commands="DIE RESTART REHASH LOADMODULE UNLOADMODULE RELOAD GUNLOADMODULE GRELOADMODULE SAJOIN SAPART SANICK SAQUIT SATOPIC"
+ commands="DIE RESTART REHASH LOADMODULE UNLOADMODULE RELOAD GUNLOADMODULE GRELOADMODULE SAJOIN SAPART SANICK SAQUIT SATOPIC"
# privs: special privileges that users with this class may utilise.
# VIEWING:
@@ -34,7 +34,7 @@
privs="users/auspex channels/auspex servers/auspex users/mass-message channels/high-join-limit channels/set-permanent users/flood/no-throttle users/flood/increased-buffers"
# usermodes: Oper-only usermodes that opers with this class can use.
- usermodes="*"
+ usermodes="*"
# chanmodes: Oper-only channel modes that opers with this class can use.
chanmodes="*">
@@ -61,16 +61,16 @@
# classes: classes (above blocks) that this type belongs to.
classes="OperChat BanControl HostCloak Shutdown ServerLink"
- # host: host oper gets on oper-up. This is optional.
- host="netadmin.omega.org.za"
+ # vhost: host oper gets on oper-up. This is optional.
+ vhost="netadmin.omega.org.za"
# modes: usermodes besides +o that are set on a oper of this type
# when they oper up. Used for snomasks and other things.
# Requires that m_opermodes.so be loaded.
modes="+s +cCqQ">
-<type name="GlobalOp" classes="OperChat BanControl HostCloak ServerLink" host="ircop.omega.org.za">
-<type name="Helper" classes="HostCloak" host="helper.omega.org.za">
+<type name="GlobalOp" classes="OperChat BanControl HostCloak ServerLink" vhost="ircop.omega.org.za">
+<type name="Helper" classes="HostCloak" vhost="helper.omega.org.za">
#-#-#-#-#-#-#-#-#-#-#- OPERATOR CONFIGURATION -#-#-#-#-#-#-#-#-#-#-#
@@ -80,7 +80,7 @@
# #
# oline with plain-text password
-<oper
+<oper
# name: oper login that is used to oper up (/oper name password).
# Remember: This is case sensitive
name="Brain"
@@ -111,6 +111,10 @@
# are loaded.
#sslonly="yes"
+ # vhost: overrides the vhost in the type block. Class and modes may also
+ # be overridden
+ vhost="brain.netadmin.omega"
+
# type: What oper type this oline is. See the block above for list
# of types. NOTE: This is case-sensitive as well.
type="NetAdmin">
@@ -124,7 +128,7 @@
type="NetAdmin">
# oline with hashed password. It is highly recommended to use hashed passwords.
-<oper
+<oper
# name: oper login that is used to oper up (/oper name password).
# Remember: This is case sensitive
name="Brain"
diff --git a/include/configreader.h b/include/configreader.h
index 54d9f7053..70e09e6c3 100644
--- a/include/configreader.h
+++ b/include/configreader.h
@@ -65,6 +65,8 @@ class CoreExport ConfigTag : public refcountbase
std::string getTagLocation();
+ inline const std::vector<KeyVal>& getItems() const { return items; }
+
/** Create a new ConfigTag, giving access to the private KeyVal item list */
static ConfigTag* create(const std::string& Tag, const std::string& file, int line,
std::vector<KeyVal>*&items);
diff --git a/include/inspircd.h b/include/inspircd.h
index 9156d3444..292fbd488 100644
--- a/include/inspircd.h
+++ b/include/inspircd.h
@@ -256,16 +256,17 @@ class BanCacheManager;
class CoreExport ConfigReaderThread : public Thread
{
ServerConfig* Config;
- bool done;
+ volatile bool done;
public:
- std::string TheUserUID;
+ const std::string TheUserUID;
ConfigReaderThread(const std::string &useruid)
- : Thread(), done(false), TheUserUID(useruid)
+ : Config(new ServerConfig), done(false), TheUserUID(useruid)
{
}
virtual ~ConfigReaderThread()
{
+ delete Config;
}
void Run();
diff --git a/src/commands/cmd_oper.cpp b/src/commands/cmd_oper.cpp
index b2db8c95c..42ea0c07d 100644
--- a/src/commands/cmd_oper.cpp
+++ b/src/commands/cmd_oper.cpp
@@ -73,15 +73,6 @@ CmdResult CommandOper::HandleLocal(const std::vector<std::string>& parameters, L
if (match_pass && match_hosts)
{
/* found this oper's opertype */
- std::string host = ifo->getConfig("host");
- if (!host.empty())
- user->ChangeDisplayedHost(host.c_str());
- std::string opClass = ifo->getConfig("class");
- if (!opClass.empty())
- {
- user->SetClass(opClass);
- user->CheckClass();
- }
user->Oper(ifo);
return CMD_SUCCESS;
}
diff --git a/src/configreader.cpp b/src/configreader.cpp
index 5fa56ba8f..3785e066c 100644
--- a/src/configreader.cpp
+++ b/src/configreader.cpp
@@ -925,7 +925,6 @@ std::string ServerConfig::GetSID()
void ConfigReaderThread::Run()
{
- Config = new ServerConfig;
Config->Read();
done = true;
}
@@ -957,7 +956,7 @@ void ConfigReaderThread::Finish()
FOREACH_MOD(I_OnRehash, OnRehash(user));
ServerInstance->BuildISupport();
- delete old;
+ Config = old;
}
else
{
@@ -965,6 +964,5 @@ void ConfigReaderThread::Finish()
ServerInstance->Logs->CloseLogs();
ServerInstance->Config = old;
ServerInstance->Logs->OpenFileLogs();
- delete this->Config;
}
}
diff --git a/src/listensocket.cpp b/src/listensocket.cpp
index 0d6bf89b6..038c665be 100644
--- a/src/listensocket.cpp
+++ b/src/listensocket.cpp
@@ -155,7 +155,11 @@ void ListenSocket::AcceptInternal()
}
}
if (res != MOD_RES_ALLOW)
+ {
+ ServerInstance->Logs->Log("SOCKET",DEFAULT,"Refusing connection on %s - %s",
+ bind_desc.c_str(), res == MOD_RES_DENY ? "Connection refused by module" : "Module for this port not found");
ServerInstance->SE->Close(incomingSockfd);
+ }
}
void ListenSocket::HandleEvent(EventType e, int err)
diff --git a/src/modules/m_httpd_config.cpp b/src/modules/m_httpd_config.cpp
index 44013b429..0763ad11d 100644
--- a/src/modules/m_httpd_config.cpp
+++ b/src/modules/m_httpd_config.cpp
@@ -91,7 +91,7 @@ class ModuleHttpStats : public Module
{
data << "&lt;" << x->first << " ";
ConfigTag* tag = x->second;
- for (std::vector<KeyVal>::iterator j = tag->items.begin(); j != tag->items.end(); j++)
+ for (std::vector<KeyVal>::const_iterator j = tag->getItems().begin(); j != tag->getItems().end(); j++)
{
data << Sanitize(j->first) << "=&quot;" << Sanitize(j->second) << "&quot; ";
}
diff --git a/src/users.cpp b/src/users.cpp
index d1a4b2528..170b0c7ec 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -628,18 +628,32 @@ void User::Oper(OperInfo* info)
if (info->oper_block)
opername = info->oper_block->getString("name");
+ if (IS_LOCAL(this))
+ {
+ LocalUser* l = IS_LOCAL(this);
+ std::string vhost = oper->getConfig("vhost");
+ if (!vhost.empty())
+ l->ChangeDisplayedHost(vhost.c_str());
+ std::string opClass = oper->getConfig("class");
+ if (!opClass.empty())
+ {
+ l->SetClass(opClass);
+ l->CheckClass();
+ }
+ }
+
ServerInstance->SNO->WriteToSnoMask('o',"%s (%s@%s) is now an IRC operator of type %s (using oper '%s')",
- nick.c_str(), ident.c_str(), host.c_str(), info->NameStr(), opername.c_str());
- this->WriteNumeric(381, "%s :You are now %s %s", nick.c_str(), strchr("aeiouAEIOU", info->name[0]) ? "an" : "a", info->NameStr());
+ nick.c_str(), ident.c_str(), host.c_str(), oper->NameStr(), opername.c_str());
+ this->WriteNumeric(381, "%s :You are now %s %s", nick.c_str(), strchr("aeiouAEIOU", oper->name[0]) ? "an" : "a", oper->NameStr());
- ServerInstance->Logs->Log("OPER", DEFAULT, "%s!%s@%s opered as type: %s", this->nick.c_str(), this->ident.c_str(), this->host.c_str(), info->NameStr());
+ ServerInstance->Logs->Log("OPER", DEFAULT, "%s!%s@%s opered as type: %s", this->nick.c_str(), this->ident.c_str(), this->host.c_str(), oper->NameStr());
ServerInstance->Users->all_opers.push_back(this);
// Expand permissions from config for faster lookup
if (IS_LOCAL(this))
oper->init();
- FOREACH_MOD(I_OnPostOper,OnPostOper(this, info->name, opername));
+ FOREACH_MOD(I_OnPostOper,OnPostOper(this, oper->name, opername));
}
void OperInfo::init()