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; }
ModResult OnPreCommand(std::string &command, std::vector<std::string> ¶meters, LocalUser* user, bool validated, const std::string &original_line) { if (command == "PONG") { std::string* pingrpl = ext.get(user); if (pingrpl) { if (!parameters.empty() && *pingrpl == parameters[0]) { ext.unset(user); return MOD_RES_DENY; } else { if(killonbadreply) ServerInstance->Users->QuitUser(user, "Incorrect ping reply for registration"); return MOD_RES_DENY; } } } return MOD_RES_PASSTHRU; }