void HandleIdentOrPass(LocalUser* user, const std::string& newip, bool was_pass) { cmd.realhost.set(user, user->host); cmd.realip.set(user, user->GetIPString()); ChangeIP(user, newip); user->host = user->dhost = user->GetIPString(); user->InvalidateCache(); 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 || !DNS || user->MyClass->nouserdns) return; CGIResolver* r = new CGIResolver(*this->DNS, this, cmd.notify, newip, user, (was_pass ? "PASS" : "IDENT"), waiting); try { waiting.set(user, waiting.get(user) + 1); this->DNS->Process(r); } catch (DNS::Exception &ex) { int count = waiting.get(user); if (count) waiting.set(user, count - 1); delete r; if (cmd.notify) ServerInstance->SNO->WriteToSnoMask('a', "Connecting user %s detected as using CGI:IRC (%s), but I could not resolve their hostname; %s", user->nick.c_str(), user->host.c_str(), ex.GetReason()); } }
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()); // 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 bool host_ok = (parameters[2].length() <= ServerInstance->Config->Limits.MaxHost); const std::string& newhost = (host_ok ? parameters[2] : parameters[3]); if (notify) ServerInstance->SNO->WriteGlobalSno('w', "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()); // Where the magic happens - change their IP ChangeIP(user, parameters[3]); // And follow this up by changing their host user->host = user->dhost = newhost; user->InvalidateCache(); return CMD_SUCCESS; } } } ServerInstance->SNO->WriteGlobalSno('w', "Connecting user %s tried to use WEBIRC, but didn't match any configured webirc blocks.", user->GetFullRealHost().c_str()); return CMD_FAILURE; }
// ----------------------------------------------------------------------------- // CNATFWUNSAFChangeRequestAttribute::EncodeValueL // ----------------------------------------------------------------------------- // HBufC8* CNATFWUNSAFChangeRequestAttribute::EncodeValueL() const { HBufC8* encodedValue = HBufC8::NewLC(EAttributeValueSize); TPtr8 ptr = encodedValue->Des(); ptr.FillZ(EAttributeValueSize); TUint32 value(0); if (ChangeIP()) { value = value | EChangeIPMask; } if (ChangePort()) { value = value | EChangePortMask; } NATFWUNSAFUtils::WriteNetworkOrder32L(ptr, 0, value); CleanupStack::Pop(encodedValue); return encodedValue; }