summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/users.h5
-rw-r--r--src/cmd_oper.cpp6
-rw-r--r--src/configreader.cpp2
-rw-r--r--src/users.cpp33
4 files changed, 31 insertions, 15 deletions
diff --git a/include/users.h b/include/users.h
index d59e540b4..8628e2c21 100644
--- a/include/users.h
+++ b/include/users.h
@@ -845,7 +845,7 @@ class CoreExport userrec : public connection
/** Call this method to find the matching <connect> for a user, and to check them against it.
*/
- void CheckClass();
+ void CheckClass(const std::string &explicit_class = "");
/** Use this method to fully connect a user.
* This will send the message of the day, check G/K/E lines, etc.
@@ -1056,9 +1056,10 @@ class CoreExport userrec : public connection
void PurgeEmptyChannels();
/** Get the connect class which matches this user's host or IP address
+ * @param explicit_name Set this string to tie the user to a specific class name
* @return A reference to this user's connect class
*/
- ConnectClass* GetClass();
+ ConnectClass* GetClass(const std::string &explicit_name = "");
/** Show the message of the day to this user
*/
diff --git a/src/cmd_oper.cpp b/src/cmd_oper.cpp
index 331115e1d..63c7dc3e3 100644
--- a/src/cmd_oper.cpp
+++ b/src/cmd_oper.cpp
@@ -46,6 +46,7 @@ CmdResult cmd_oper::Handle (const char** parameters, int pcnt, userrec *user)
char OperType[MAXBUF];
char TypeName[MAXBUF];
char HostName[MAXBUF];
+ char ClassName[MAXBUF];
char TheHost[MAXBUF];
char TheIP[MAXBUF];
int j;
@@ -75,7 +76,8 @@ CmdResult cmd_oper::Handle (const char** parameters, int pcnt, userrec *user)
type_invalid = true;
for (j =0; j < ServerInstance->Config->ConfValueEnum(ServerInstance->Config->config_data, "type"); j++)
{
- ServerInstance->Config->ConfValue(ServerInstance->Config->config_data, "type","name", j, TypeName, MAXBUF);
+ ServerInstance->Config->ConfValue(ServerInstance->Config->config_data, "type", "name", j, TypeName, MAXBUF);
+ ServerInstance->Config->ConfValue(ServerInstance->Config->config_data, "type", "class", j, ClassName, MAXBUF);
if (!strcmp(TypeName,OperType))
{
@@ -90,6 +92,8 @@ CmdResult cmd_oper::Handle (const char** parameters, int pcnt, userrec *user)
ServerInstance->Config->ConfValue(ServerInstance->Config->config_data, "type","host", j, HostName, MAXBUF);
if (*HostName)
user->ChangeDisplayedHost(HostName);
+ if (*ClassName)
+ user->CheckClass(ClassName);
found = true;
type_invalid = false;
break;
diff --git a/src/configreader.cpp b/src/configreader.cpp
index c1ccc4ee9..189fbb59b 100644
--- a/src/configreader.cpp
+++ b/src/configreader.cpp
@@ -413,7 +413,7 @@ bool DoConnect(ServerConfig* conf, const char* tag, char** entries, ValueList &v
/* Find 'parent' and inherit a new class from it,
* then overwrite any values that are set here
*/
- for (std::vector<ConnectClass>::iterator item = conf->Classes.begin(); item != conf->Classes.end(); ++item)
+ for (ClassVector::iterator item = conf->Classes.begin(); item != conf->Classes.end(); ++item)
{
if (item->GetName() == name)
{
diff --git a/src/users.cpp b/src/users.cpp
index bc8dc51e4..eb676b06a 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -1011,9 +1011,9 @@ unsigned long userrec::LocalCloneCount()
/*
* Check class restrictions
*/
-void userrec::CheckClass()
+void userrec::CheckClass(const std::string &explicit_class)
{
- ConnectClass* a = this->GetClass();
+ ConnectClass* a = this->GetClass(explicit_class);
if ((!a) || (a->GetType() == CC_DENY))
{
@@ -1859,21 +1859,32 @@ void userrec::SplitChanList(userrec* dest, const std::string &cl)
* then their ip will be taken as 'priority' anyway, so for example,
* <connect allow="127.0.0.1"> will match joe!bloggs@localhost
*/
-ConnectClass* userrec::GetClass()
+ConnectClass* userrec::GetClass(const std::string &explicit_name)
{
- for (ClassVector::iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); i++)
+ if (!explicit_name.empty())
{
- if (((match(this->GetIPString(),i->GetHost().c_str(),true)) || (match(this->host,i->GetHost().c_str()))))
+ for (ClassVector::iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); i++)
{
- if (i->GetPort())
+ if (explicit_name == i->GetName())
+ return &(*i);
+ }
+ }
+ else
+ {
+ for (ClassVector::iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); i++)
+ {
+ if (((match(this->GetIPString(),i->GetHost().c_str(),true)) || (match(this->host,i->GetHost().c_str()))))
{
- if (this->GetPort() == i->GetPort())
- return &(*i);
+ if (i->GetPort())
+ {
+ if (this->GetPort() == i->GetPort())
+ return &(*i);
+ else
+ continue;
+ }
else
- continue;
+ return &(*i);
}
- else
- return &(*i);
}
}
return NULL;