X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_cgiirc.cpp;h=7259f9459c74ccd2a07275b094d225548ee47766;hb=e9e75e50bc25e67af22dd88b39b12217a553d5cb;hp=22a5243b89791edc7028e452d3dd19a478450252;hpb=129dfe60ae37147fea2b5bc78aae539120d847bc;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_cgiirc.cpp b/src/modules/m_cgiirc.cpp index 22a5243b8..7259f9459 100644 --- a/src/modules/m_cgiirc.cpp +++ b/src/modules/m_cgiirc.cpp @@ -89,11 +89,15 @@ class CommandWebirc : public Command { realhost.set(user, user->host); realip.set(user, user->GetIPString()); + + bool host_ok = (parameters[2].length() < 64); + const std::string& newhost = (host_ok ? parameters[2] : parameters[3]); + if (notify) - ServerInstance->SNO->WriteGlobalSno('a', "Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from %s", user->nick.c_str(), user->host.c_str(), parameters[2].c_str(), user->host.c_str()); + ServerInstance->SNO->WriteGlobalSno('a', "Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from %s", user->nick.c_str(), user->host.c_str(), newhost.c_str(), user->host.c_str()); // Check if we're happy with the provided hostname. If it's problematic then make sure we won't set a host later, just the IP - if (parameters[2].length() < 64) + if (host_ok) webirc_hostname.set(user, parameters[2]); else webirc_hostname.unset(user); @@ -130,8 +134,12 @@ class CGIResolver : public Resolver { /* Check the user still exists */ User* them = ServerInstance->FindUUID(theiruid); - if (them) + if ((them) && (!them->quitting)) { + LocalUser* lu = IS_LOCAL(them); + if (!lu) + return; + if (notify) ServerInstance->SNO->WriteGlobalSno('a', "Connecting user %s detected as using CGI:IRC (%s), changing real host to %s from %s", them->nick.c_str(), them->host.c_str(), result.c_str(), typ.c_str()); @@ -140,17 +148,19 @@ class CGIResolver : public Resolver them->host = result; them->dhost = result; them->InvalidateCache(); - them->CheckLines(true); + lu->CheckLines(true); } } virtual void OnError(ResolverError e, const std::string &errormessage) { + if (!notify) + return; + User* them = ServerInstance->FindUUID(theiruid); - if (them) + if ((them) && (!them->quitting)) { - if (notify) - ServerInstance->SNO->WriteToSnoMask('a', "Connecting user %s detected as using CGI:IRC (%s), but their host can't be resolved from their %s!", them->nick.c_str(), them->host.c_str(), typ.c_str()); + ServerInstance->SNO->WriteToSnoMask('a', "Connecting user %s detected as using CGI:IRC (%s), but their host can't be resolved from their %s!", them->nick.c_str(), them->host.c_str(), typ.c_str()); } } @@ -170,9 +180,9 @@ class ModuleCgiIRC : public Module CommandWebirc cmd; LocalIntExt waiting; - static void RecheckElineAndClass(LocalUser* user) + static void RecheckClass(LocalUser* user) { - user->exempt = (ServerInstance->XLines->MatchesLine("E", user) != NULL); + user->MyClass = NULL; user->SetClass(); user->CheckClass(); } @@ -192,7 +202,7 @@ class ModuleCgiIRC : public Module ChangeIP(user, newip); user->host = user->dhost = user->GetIPString(); user->InvalidateCache(); - RecheckElineAndClass(user); + RecheckClass(user); // Don't create the resolver if the core couldn't put the user in a connect class or when dns is disabled if (user->quitting || ServerInstance->Config->NoUserDns) return; @@ -219,15 +229,11 @@ public: void init() { OnRehash(NULL); - ServerInstance->AddCommand(&cmd); - ServerInstance->Extensions.Register(&cmd.realhost); - ServerInstance->Extensions.Register(&cmd.realip); - ServerInstance->Extensions.Register(&cmd.webirc_hostname); - ServerInstance->Extensions.Register(&cmd.webirc_ip); - ServerInstance->Extensions.Register(&waiting); + ServiceProvider* providerlist[] = { &cmd, &cmd.realhost, &cmd.realip, &cmd.webirc_hostname, &cmd.webirc_ip, &waiting }; + ServerInstance->Modules->AddServices(providerlist, sizeof(providerlist)/sizeof(ServiceProvider*)); Implementation eventlist[] = { I_OnRehash, I_OnUserRegister, I_OnCheckReady }; - ServerInstance->Modules->Attach(eventlist, this, 3); + ServerInstance->Modules->Attach(eventlist, this, sizeof(eventlist)/sizeof(Implementation)); } void OnRehash(User* user) @@ -249,7 +255,7 @@ public: { if (type == "webirc" && password.empty()) { - ServerInstance->Logs->Log("CONFIG",DEFAULT, "m_cgiirc: Missing password in config: %s", hostmask.c_str()); + ServerInstance->Logs->Log("CONFIG",LOG_DEFAULT, "m_cgiirc: Missing password in config: %s", hostmask.c_str()); } else { @@ -265,7 +271,7 @@ public: else { cgitype = PASS; - ServerInstance->Logs->Log("CONFIG",DEFAULT, "m_cgiirc.so: Invalid value in config: %s, setting it to \"pass\"", type.c_str()); + ServerInstance->Logs->Log("CONFIG",LOG_DEFAULT, "m_cgiirc.so: Invalid value in config: %s, setting it to \"pass\"", type.c_str()); } cmd.Hosts.push_back(CGIhost(hostmask, cgitype, password)); @@ -273,7 +279,7 @@ public: } else { - ServerInstance->Logs->Log("CONFIG",DEFAULT, "m_cgiirc.so: Invalid value in config: %s", hostmask.c_str()); + ServerInstance->Logs->Log("CONFIG",LOG_DEFAULT, "m_cgiirc.so: Invalid value in config: %s", hostmask.c_str()); continue; } } @@ -293,7 +299,7 @@ public: std::string* webirc_hostname = cmd.webirc_hostname.get(user); user->host = user->dhost = (webirc_hostname ? *webirc_hostname : user->GetIPString()); - RecheckElineAndClass(user); + RecheckClass(user); if (user->quitting) return MOD_RES_DENY;