X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=src%2Fmodules%2Fm_sasl.cpp;h=0ef93ec5ae66476923dfe7eaded192dba54711df;hb=aa19c8fc021ce1cc704434a2c5a19e1517132c79;hp=db96f9dfaa0039439214d173e0549d987c4a8c0e;hpb=d0cd749a70646f2c2bbd616a9934fada22ad1ffd;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/src/modules/m_sasl.cpp b/src/modules/m_sasl.cpp index db96f9dfa..0ef93ec5a 100644 --- a/src/modules/m_sasl.cpp +++ b/src/modules/m_sasl.cpp @@ -51,16 +51,62 @@ class SaslAuthenticator SaslResult result; bool state_announced; + /* taken from m_services_account */ + static bool ReadCGIIRCExt(const char* extname, User* user, std::string& out) + { + ExtensionItem* wiext = ServerInstance->Extensions.GetItem(extname); + if (!wiext) + return false; + + if (wiext->creator->ModuleSourceFile != "m_cgiirc.so") + return false; + + StringExtItem* stringext = static_cast(wiext); + std::string* addr = stringext->get(user); + if (!addr) + return false; + + out = *addr; + return true; + } + + void SendHostIP() { + std::string host, ip; + + if (!ReadCGIIRCExt("cgiirc_webirc_hostname", user, host)) + { + host = user->host; + } + if (!ReadCGIIRCExt("cgiirc_webirc_ip", user, ip)) + { + ip = user->GetIPString(); + } + else + { + /* IP addresses starting with a : on irc are a Bad Thing (tm) */ + if (ip.c_str()[0] == ':') + ip.insert(ip.begin(),1,'0'); + } + parameterlist params; params.push_back(sasl_target); params.push_back("SASL"); params.push_back(user->uuid); params.push_back("*"); params.push_back("H"); - params.push_back(user->host); - params.push_back(user->GetIPString()); + params.push_back(host); + params.push_back(ip); + + LocalUser* lu = IS_LOCAL(user); + if (lu) + { + // NOTE: SaslAuthenticator instances are only created for local + // users so this parameter will always be appended. + SocketCertificateRequest req(&lu->eh, ServerInstance->Modules->Find("m_sasl.so")); + params.push_back(req.cert ? "S" : "P"); + } SendSASL(params); }