- for(CGIHostlist::iterator iter = Hosts.begin(); iter != Hosts.end(); iter++)
- {
- if(InspIRCd::Match(user->host, iter->hostmask, ascii_case_insensitive_map) || InspIRCd::MatchCIDR(user->GetIPString(), iter->hostmask, ascii_case_insensitive_map))
- {
- if(iter->type == WEBIRC && parameters[0] == iter->password)
- {
- 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(), 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 (host_ok)
- webirc_hostname.set(user, parameters[2]);
- else
- webirc_hostname.unset(user);
-
- webirc_ip.set(user, parameters[3]);
- return CMD_SUCCESS;
- }
- }
- }
-
- ServerInstance->SNO->WriteGlobalSno('a', "Connecting user %s tried to use WEBIRC, but didn't match any configured webirc blocks.", user->GetFullRealHost().c_str());
- return CMD_FAILURE;
- }
-};
-
-
-/** Resolver for CGI:IRC hostnames encoded in ident/GECOS
- */
-class CGIResolver : public DNS::Request
-{
- std::string typ;
- std::string theiruid;
- LocalIntExt& waiting;
- bool notify;
- public:
- CGIResolver(DNS::Manager *mgr, Module* me, bool NotifyOpers, const std::string &source, LocalUser* u,
- const std::string &ttype, LocalIntExt& ext)
- : DNS::Request(mgr, me, source, DNS::QUERY_PTR), typ(ttype), theiruid(u->uuid),
- waiting(ext), notify(NotifyOpers)
+ CommandWebIRC(Module* Creator)
+ : SplitCommand(Creator, "WEBIRC", 4)
+ , gateway("cgiirc_gateway", ExtensionItem::EXT_USER, Creator)
+ , realhost("cgiirc_realhost", ExtensionItem::EXT_USER, Creator)
+ , realip("cgiirc_realip", ExtensionItem::EXT_USER, Creator)