summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAdam <Adam@anope.org>2011-08-24 15:57:05 -0400
committerAdam <Adam@anope.org>2011-09-10 01:58:35 -0400
commitbb8e04c83588b6d0595eca463170643a3bd84285 (patch)
tree31f3949cdb3f1f7236f0e02e56027ee35932f0d7 /src
parentb504791bad450dfc9d28faa8b2009f8eaef0f485 (diff)
Added oper:host and oper:vhost
Diffstat (limited to 'src')
-rw-r--r--src/config.cpp14
-rw-r--r--src/users.cpp28
2 files changed, 34 insertions, 8 deletions
diff --git a/src/config.cpp b/src/config.cpp
index ca36397ce..28cf7aee6 100644
--- a/src/config.cpp
+++ b/src/config.cpp
@@ -656,6 +656,8 @@ static bool DoOper(ServerConfig *config, const Anope::string &, const Anope::str
Anope::string type = values[1].GetValue();
Anope::string password = values[2].GetValue();
Anope::string certfp = values[3].GetValue();
+ Anope::string host = values[4].GetValue();
+ Anope::string vhost = values[5].GetValue();
ValueItem vi(name);
if (!ValidateNotEmpty(config, "oper", "name", vi))
@@ -672,8 +674,12 @@ static bool DoOper(ServerConfig *config, const Anope::string &, const Anope::str
if (ot == NULL)
throw ConfigException("Oper block for " + name + " has invalid oper type " + type);
- Oper *o = new Oper(name, password, certfp, ot);
+ Oper *o = new Oper(name, ot);
o->config = true;
+ o->password = password;
+ o->certfp = certfp;
+ o->hosts = BuildStringVector(host);
+ o->vhost = vhost;
config->Opers.push_back(o);
return true;
@@ -1257,9 +1263,9 @@ ConfigItems::ConfigItems(ServerConfig *conf)
{DT_STRING, DT_STRING, DT_STRING, DT_STRING, DT_STRING},
InitOperTypes, DoOperType, DoneOperTypes},
{"oper",
- {"name", "type", "password", "certfp", ""},
- {"", "", "", "", ""},
- {DT_STRING, DT_STRING, DT_STRING, DT_STRING},
+ {"name", "type", "password", "certfp", "host", "vhost", ""},
+ {"", "", "", "", "", "", ""},
+ {DT_STRING, DT_STRING, DT_STRING, DT_STRING, DT_STRING, DT_STRING},
InitOpers, DoOper, DoneOpers},
{"service",
{"nick", "user", "host", "gecos", "modes", "channels", ""},
diff --git a/src/users.cpp b/src/users.cpp
index 984e4c3ef..e1ed207ec 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -367,12 +367,22 @@ void User::Identify(NickAlias *na)
FOREACH_MOD(I_OnNickIdentify, OnNickIdentify(this));
- if (na->nc->o != NULL && na->nc->o->ot != NULL && !na->nc->o->ot->modes.empty())
+ if (this->IsServicesOper())
{
BotInfo *bi = findbot(Config->OperServ);
- this->SetModes(bi, "%s", na->nc->o->ot->modes.c_str());
- if (bi != NULL)
- this->SendMessage(bi, "Changing your usermodes to \002%s\002", na->nc->o->ot->modes.c_str());
+ if (!this->nc->o->ot->modes.empty())
+ {
+ this->SetModes(bi, "%s", this->nc->o->ot->modes.c_str());
+ if (bi != NULL)
+ this->SendMessage(bi, "Changing your usermodes to \002%s\002", this->nc->o->ot->modes.c_str());
+ }
+ if (ircd->vhost && !this->nc->o->vhost.empty())
+ {
+ if (bi != NULL)
+ this->SendMessage(bi, "Changing your vhost to \002%s\002", this->nc->o->vhost.c_str());
+ this->SetDisplayedHost(this->nc->o->vhost);
+ ircdproto->SendVhost(this, "", this->nc->o->vhost);
+ }
}
}
@@ -458,6 +468,16 @@ bool User::IsServicesOper()
else if (!this->nc->o->certfp.empty() && this->fingerprint != this->nc->o->certfp)
// Certfp mismatch
return false;
+ else if (!this->nc->o->hosts.empty())
+ {
+ bool match = false;
+ Anope::string match_host = this->GetIdent() + "@" + this->host;
+ for (unsigned i = 0; i < this->nc->o->hosts.size(); ++i)
+ if (Anope::Match(match_host, this->nc->o->hosts[i]))
+ match = true;
+ if (match == false)
+ return false;
+ }
EventReturn MOD_RESULT;
FOREACH_RESULT(I_IsServicesOper, IsServicesOper(this));