From c61fac32bc7559e3d6f7534919f115266eee5917 Mon Sep 17 00:00:00 2001 From: brain Date: Sun, 19 Aug 2007 19:23:53 +0000 Subject: Allow changing of an oper's host on oper up using (give it a connect allow or deny line name) - implements bug #367 git-svn-id: http://svn.inspircd.org/repository/trunk/inspircd@7760 e03df62e-2008-0410-955e-edbf42e46eb7 --- include/users.h | 5 +++-- src/cmd_oper.cpp | 6 +++++- src/configreader.cpp | 2 +- src/users.cpp | 33 ++++++++++++++++++++++----------- 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 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::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, * 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; -- cgit v1.2.3