mirror of
https://github.com/inspircd/inspircd.git
synced 2025-03-10 02:59:01 -04:00
Convert ConnectClass from reference<> to std::shared_ptr<>.
This commit is contained in:
parent
579a17df38
commit
89a21202de
@ -279,7 +279,7 @@ class CoreExport ServerConfig
|
||||
|
||||
/** Holds a complete list of all connect blocks
|
||||
*/
|
||||
typedef std::vector<reference<ConnectClass> > ClassVector;
|
||||
typedef std::vector<std::shared_ptr<ConnectClass>> ClassVector;
|
||||
|
||||
/** Index of valid oper blocks and types
|
||||
*/
|
||||
|
@ -968,7 +968,7 @@ class CoreExport Module : public classbase, public usecountbase
|
||||
* @return MOD_RES_ALLOW to force the class to match, MOD_RES_DENY to forbid it, or
|
||||
* MOD_RES_PASSTHRU to allow normal matching (by host/port).
|
||||
*/
|
||||
virtual ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass);
|
||||
virtual ModResult OnSetConnectClass(LocalUser* user, std::shared_ptr<ConnectClass> myclass);
|
||||
|
||||
virtual ModResult OnNumeric(User* user, const Numeric::Numeric& numeric);
|
||||
|
||||
|
@ -72,7 +72,7 @@ enum UserType {
|
||||
|
||||
/** Holds information relevant to <connect allow> and <connect deny> tags in the config file.
|
||||
*/
|
||||
struct CoreExport ConnectClass : public refcountbase
|
||||
struct CoreExport ConnectClass
|
||||
{
|
||||
std::shared_ptr<ConfigTag> config;
|
||||
/** Type of line, either CC_ALLOW or CC_DENY
|
||||
@ -160,10 +160,10 @@ struct CoreExport ConnectClass : public refcountbase
|
||||
ConnectClass(std::shared_ptr<ConfigTag> tag, char type, const std::string& mask);
|
||||
/** Create a new connect class with inherited settings.
|
||||
*/
|
||||
ConnectClass(std::shared_ptr<ConfigTag> tag, char type, const std::string& mask, const ConnectClass& parent);
|
||||
ConnectClass(std::shared_ptr<ConfigTag> tag, char type, const std::string& mask, std::shared_ptr<ConnectClass> parent);
|
||||
|
||||
/** Update the settings in this block to match the given block */
|
||||
void Update(const ConnectClass* newSettings);
|
||||
void Update(const std::shared_ptr<ConnectClass> newSettings);
|
||||
|
||||
const std::string& GetName() { return name; }
|
||||
const std::string& GetHost() { return host; }
|
||||
@ -707,12 +707,12 @@ class CoreExport LocalUser : public User, public insp::intrusive_list_node<Local
|
||||
|
||||
/** Contains a pointer to the connect class a user is on from
|
||||
*/
|
||||
reference<ConnectClass> MyClass;
|
||||
std::shared_ptr<ConnectClass> MyClass;
|
||||
|
||||
/** Get the connect class which this user belongs to.
|
||||
* @return A pointer to this user's connect class.
|
||||
*/
|
||||
ConnectClass* GetClass() const { return MyClass; }
|
||||
std::shared_ptr<ConnectClass> GetClass() const { return MyClass; }
|
||||
|
||||
/** Call this method to find the matching \<connect> for a user, and to check them against it.
|
||||
*/
|
||||
|
@ -158,13 +158,12 @@ void ServerConfig::CrossCheckOperClassType()
|
||||
|
||||
void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current)
|
||||
{
|
||||
typedef std::map<std::string, ConnectClass*> ClassMap;
|
||||
typedef std::map<std::string, std::shared_ptr<ConnectClass>> ClassMap;
|
||||
ClassMap oldBlocksByMask;
|
||||
if (current)
|
||||
{
|
||||
for(ClassVector::iterator i = current->Classes.begin(); i != current->Classes.end(); ++i)
|
||||
for (auto& c : current->Classes)
|
||||
{
|
||||
ConnectClass* c = *i;
|
||||
if (c->name.compare(0, 8, "unnamed-", 8))
|
||||
{
|
||||
oldBlocksByMask["n" + c->name] = c;
|
||||
@ -205,7 +204,7 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current)
|
||||
continue;
|
||||
}
|
||||
|
||||
ConnectClass* parent = NULL;
|
||||
std::shared_ptr<ConnectClass> parent;
|
||||
std::string parentName = tag->getString("parent");
|
||||
if (!parentName.empty())
|
||||
{
|
||||
@ -261,9 +260,9 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current)
|
||||
throw CoreException("Two connect classes with name \"" + name + "\" defined!");
|
||||
names[name] = i;
|
||||
|
||||
ConnectClass* me = parent ?
|
||||
new ConnectClass(tag, type, mask, *parent) :
|
||||
new ConnectClass(tag, type, mask);
|
||||
auto me = parent
|
||||
? std::make_shared<ConnectClass>(tag, type, mask, parent)
|
||||
: std::make_shared<ConnectClass>(tag, type, mask);
|
||||
|
||||
me->name = name;
|
||||
|
||||
@ -312,10 +311,9 @@ void ServerConfig::CrossCheckConnectBlocks(ServerConfig* current)
|
||||
ClassMap::iterator oldMask = oldBlocksByMask.find(typeMask);
|
||||
if (oldMask != oldBlocksByMask.end())
|
||||
{
|
||||
ConnectClass* old = oldMask->second;
|
||||
std::shared_ptr<ConnectClass> old = oldMask->second;
|
||||
oldBlocksByMask.erase(oldMask);
|
||||
old->Update(me);
|
||||
delete me;
|
||||
me = old;
|
||||
}
|
||||
Classes[i] = me;
|
||||
|
@ -132,9 +132,8 @@ void CommandStats::DoStats(Stats::Context& stats)
|
||||
|
||||
case 'i':
|
||||
{
|
||||
for (ServerConfig::ClassVector::const_iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); ++i)
|
||||
for (const auto& c : ServerInstance->Config->Classes)
|
||||
{
|
||||
ConnectClass* c = *i;
|
||||
Stats::Row row(215);
|
||||
row.push("I").push(c->name);
|
||||
|
||||
@ -165,9 +164,8 @@ void CommandStats::DoStats(Stats::Context& stats)
|
||||
case 'Y':
|
||||
{
|
||||
int idx = 0;
|
||||
for (ServerConfig::ClassVector::const_iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); i++)
|
||||
for (const auto& c : ServerInstance->Config->Classes)
|
||||
{
|
||||
ConnectClass* c = *i;
|
||||
stats.AddRow(215, 'i', "NOMATCH", '*', c->GetHost(), (c->limit ? c->limit : SocketEngine::GetMaxFds()), idx, ServerInstance->Config->ServerName, '*');
|
||||
stats.AddRow(218, 'Y', idx, c->GetPingTime(), '0', c->GetSendqHardMax(), ConvToStr(c->GetRecvqMax())+" "+ConvToStr(c->GetRegTimeout()));
|
||||
idx++;
|
||||
|
@ -142,7 +142,7 @@ ModResult Module::OnChannelPreDelete(Channel*) { DetachEvent(I_OnChannelPreDelet
|
||||
void Module::OnChannelDelete(Channel*) { DetachEvent(I_OnChannelDelete); }
|
||||
void Module::OnBuildNeighborList(User*, IncludeChanList&, std::map<User*,bool>&) { DetachEvent(I_OnBuildNeighborList); }
|
||||
void Module::OnGarbageCollect() { DetachEvent(I_OnGarbageCollect); }
|
||||
ModResult Module::OnSetConnectClass(LocalUser* user, ConnectClass* myclass) { DetachEvent(I_OnSetConnectClass); return MOD_RES_PASSTHRU; }
|
||||
ModResult Module::OnSetConnectClass(LocalUser* user, std::shared_ptr<ConnectClass> myclass) { DetachEvent(I_OnSetConnectClass); return MOD_RES_PASSTHRU; }
|
||||
void Module::OnUserMessage(User*, const MessageTarget&, const MessageDetails&) { DetachEvent(I_OnUserMessage); }
|
||||
ModResult Module::OnNumeric(User*, const Numeric::Numeric&) { DetachEvent(I_OnNumeric); return MOD_RES_PASSTHRU; }
|
||||
ModResult Module::OnAcceptConnection(int, ListenSocket*, irc::sockets::sockaddrs*, irc::sockets::sockaddrs*) { DetachEvent(I_OnAcceptConnection); return MOD_RES_PASSTHRU; }
|
||||
|
@ -333,7 +333,7 @@ class ModuleCgiIRC
|
||||
cmd.notify = ServerInstance->Config->ConfValue("cgiirc")->getBool("opernotice", true);
|
||||
}
|
||||
|
||||
ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass) override
|
||||
ModResult OnSetConnectClass(LocalUser* user, std::shared_ptr<ConnectClass> myclass) override
|
||||
{
|
||||
// If <connect:webirc> is not set then we have nothing to do.
|
||||
const std::string webirc = myclass->config->getString("webirc");
|
||||
|
@ -411,7 +411,7 @@ class ModuleDNSBL : public Module, public Stats::EventListener
|
||||
}
|
||||
}
|
||||
|
||||
ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass) override
|
||||
ModResult OnSetConnectClass(LocalUser* user, std::shared_ptr<ConnectClass> myclass) override
|
||||
{
|
||||
std::string dnsbl;
|
||||
if (!myclass->config->readString("dnsbl", dnsbl))
|
||||
|
@ -42,7 +42,7 @@ class ModuleGeoClass
|
||||
{
|
||||
}
|
||||
|
||||
ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass) override
|
||||
ModResult OnSetConnectClass(LocalUser* user, std::shared_ptr<ConnectClass> myclass) override
|
||||
{
|
||||
const std::string country = myclass->config->getString("country");
|
||||
if (country.empty())
|
||||
|
@ -403,7 +403,7 @@ class ModuleIdent : public Module
|
||||
return MOD_RES_PASSTHRU;
|
||||
}
|
||||
|
||||
ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass) override
|
||||
ModResult OnSetConnectClass(LocalUser* user, std::shared_ptr<ConnectClass> myclass) override
|
||||
{
|
||||
if (myclass->config->getBool("requireident") && state.get(user) != IDENT_FOUND)
|
||||
return MOD_RES_DENY;
|
||||
|
@ -316,7 +316,7 @@ class ModuleServicesAccount
|
||||
return MOD_RES_PASSTHRU;
|
||||
}
|
||||
|
||||
ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass) override
|
||||
ModResult OnSetConnectClass(LocalUser* user, std::shared_ptr<ConnectClass> myclass) override
|
||||
{
|
||||
if (myclass->config->getBool("requireaccount") && !accountname.get(user))
|
||||
return MOD_RES_DENY;
|
||||
|
@ -310,7 +310,7 @@ class ModuleSSLInfo
|
||||
}
|
||||
}
|
||||
|
||||
ModResult OnSetConnectClass(LocalUser* user, ConnectClass* myclass) override
|
||||
ModResult OnSetConnectClass(LocalUser* user, std::shared_ptr<ConnectClass> myclass) override
|
||||
{
|
||||
ssl_cert* cert = cmd.sslapi.GetCertificate(user);
|
||||
bool ok = true;
|
||||
|
@ -504,7 +504,7 @@ void User::UnOper()
|
||||
*/
|
||||
void LocalUser::CheckClass(bool clone_count)
|
||||
{
|
||||
ConnectClass* a = this->MyClass;
|
||||
std::shared_ptr<ConnectClass> a = this->MyClass;
|
||||
|
||||
if (!a)
|
||||
{
|
||||
@ -1093,16 +1093,14 @@ bool User::ChangeIdent(const std::string& newident)
|
||||
*/
|
||||
void LocalUser::SetClass(const std::string &explicit_name)
|
||||
{
|
||||
ConnectClass *found = NULL;
|
||||
std::shared_ptr<ConnectClass> found;
|
||||
|
||||
ServerInstance->Logs.Log("CONNECTCLASS", LOG_DEBUG, "Setting connect class for UID %s", this->uuid.c_str());
|
||||
|
||||
if (!explicit_name.empty())
|
||||
{
|
||||
for (ServerConfig::ClassVector::const_iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); ++i)
|
||||
for (const auto& c : ServerInstance->Config->Classes)
|
||||
{
|
||||
ConnectClass* c = *i;
|
||||
|
||||
if (explicit_name == c->name)
|
||||
{
|
||||
ServerInstance->Logs.Log("CONNECTCLASS", LOG_DEBUG, "Explicitly set to %s", explicit_name.c_str());
|
||||
@ -1112,9 +1110,8 @@ void LocalUser::SetClass(const std::string &explicit_name)
|
||||
}
|
||||
else
|
||||
{
|
||||
for (ServerConfig::ClassVector::const_iterator i = ServerInstance->Config->Classes.begin(); i != ServerInstance->Config->Classes.end(); ++i)
|
||||
for (const auto& c : ServerInstance->Config->Classes)
|
||||
{
|
||||
ConnectClass* c = *i;
|
||||
ServerInstance->Logs.Log("CONNECTCLASS", LOG_DEBUG, "Checking %s", c->GetName().c_str());
|
||||
|
||||
ModResult MOD_RESULT;
|
||||
@ -1147,8 +1144,9 @@ void LocalUser::SetClass(const std::string &explicit_name)
|
||||
* deny change if change will take class over the limit check it HERE, not after we found a matching class,
|
||||
* because we should attempt to find another class if this one doesn't match us. -- w00t
|
||||
*/
|
||||
if (c->limit && (c->GetReferenceCount() >= c->limit))
|
||||
if (c->limit && (c.use_count() >= static_cast<long>(c->limit)))
|
||||
{
|
||||
// HACK: using use_count() is awful and should be removed before v4 is released.
|
||||
ServerInstance->Logs.Log("CONNECTCLASS", LOG_DEBUG, "OOPS: Connect class limit (%lu) hit, denying", c->limit);
|
||||
continue;
|
||||
}
|
||||
@ -1231,9 +1229,9 @@ ConnectClass::ConnectClass(std::shared_ptr<ConfigTag> tag, char t, const std::st
|
||||
{
|
||||
}
|
||||
|
||||
ConnectClass::ConnectClass(std::shared_ptr<ConfigTag> tag, char t, const std::string& mask, const ConnectClass& parent)
|
||||
ConnectClass::ConnectClass(std::shared_ptr<ConfigTag> tag, char t, const std::string& mask, std::shared_ptr<ConnectClass> parent)
|
||||
{
|
||||
Update(&parent);
|
||||
Update(parent);
|
||||
name = "unnamed";
|
||||
type = t;
|
||||
host = mask;
|
||||
@ -1244,7 +1242,7 @@ ConnectClass::ConnectClass(std::shared_ptr<ConfigTag> tag, char t, const std::st
|
||||
ConfigItems* items = NULL;
|
||||
config = ConfigTag::create(tag->tag, tag->src_name, tag->src_line, items);
|
||||
|
||||
const ConfigItems& parentkeys = parent.config->getItems();
|
||||
const ConfigItems& parentkeys = parent->config->getItems();
|
||||
for (ConfigItems::const_iterator piter = parentkeys.begin(); piter != parentkeys.end(); ++piter)
|
||||
{
|
||||
// The class name and parent name are not inherited
|
||||
@ -1264,7 +1262,7 @@ ConnectClass::ConnectClass(std::shared_ptr<ConfigTag> tag, char t, const std::st
|
||||
}
|
||||
}
|
||||
|
||||
void ConnectClass::Update(const ConnectClass* src)
|
||||
void ConnectClass::Update(const std::shared_ptr<ConnectClass> src)
|
||||
{
|
||||
config = src->config;
|
||||
type = src->type;
|
||||
|
Loading…
x
Reference in New Issue
Block a user