- LocalStringExt webirc_hostname;
- LocalStringExt webirc_ip;
-
- CGIHostlist Hosts;
- CommandWebirc(Module* Creator)
- : Command(Creator, "WEBIRC", 4),
- realhost("cgiirc_realhost", Creator), realip("cgiirc_realip", Creator),
- webirc_hostname("cgiirc_webirc_hostname", Creator), webirc_ip("cgiirc_webirc_ip", Creator)
- {
- works_before_reg = true;
- this->syntax = "password client hostname ip";
- }
- CmdResult Handle(const std::vector<std::string> ¶meters, User *user)
- {
- if(user->registered == REG_ALL)
- return CMD_FAILURE;
-
- 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;
- }
-};
-