From fd25fe3c4fd24faa6270c8805462cb2d50d8834a Mon Sep 17 00:00:00 2001 From: Sadie Powell Date: Tue, 27 Feb 2024 14:37:40 +0000 Subject: Send the real username as the second parameter to FIDENT. --- src/modules/m_spanningtree/commands.h | 2 +- src/modules/m_spanningtree/compat.cpp | 21 ++++++++++++++++++++- src/modules/m_spanningtree/main.cpp | 10 +++++++++- src/modules/m_spanningtree/main.h | 1 + src/modules/m_spanningtree/uid.cpp | 7 ++++++- 5 files changed, 37 insertions(+), 4 deletions(-) (limited to 'src/modules/m_spanningtree') diff --git a/src/modules/m_spanningtree/commands.h b/src/modules/m_spanningtree/commands.h index a34e774ce..cb3b22ed3 100644 --- a/src/modules/m_spanningtree/commands.h +++ b/src/modules/m_spanningtree/commands.h @@ -236,7 +236,7 @@ class CommandFIdent final { public: CommandFIdent(Module* Creator) - : UserOnlyServerCommand(Creator, "FIDENT", 1) + : UserOnlyServerCommand(Creator, "FIDENT", 2) { } CmdResult HandleRemote(RemoteUser* user, Params& params); diff --git a/src/modules/m_spanningtree/compat.cpp b/src/modules/m_spanningtree/compat.cpp index d193d5e5a..35aa8e6b6 100644 --- a/src/modules/m_spanningtree/compat.cpp +++ b/src/modules/m_spanningtree/compat.cpp @@ -71,6 +71,20 @@ void TreeSocket::WriteLine(const std::string& original_line) // FRHOST was introduced in PROTO_INSPIRCD_4; drop it. return; } + else if (irc::equals(command, "FIDENT")) + { + // FIDENT has two parameters in v4; drop the real username. + // : FIDENT + size_t displayend = NextToken(line, cmdend); + if (displayend != std::string::npos) + { + if ((displayend - cmdend) == 2 && line[displayend - 1] == '*') + return; // FIDENT is only changing the real username; drop. + + // Trim the rest of the line. + line.erase(displayend); + } + } else if (irc::equals(command, "METADATA")) { // : METADATA : @@ -112,7 +126,12 @@ void TreeSocket::WriteLine(const std::string& original_line) bool TreeSocket::PreProcessOldProtocolMessage(User*& who, std::string& cmd, CommandBase::Params& params) { - if (irc::equals(cmd, "SVSJOIN") || irc::equals(cmd, "SVSNICK") || irc::equals(cmd, "SVSPART")) + if (irc::equals(cmd, "FIDENT")) + { + if (params.size() < 2) + params.push_back("*"); + } + else if (irc::equals(cmd, "SVSJOIN") || irc::equals(cmd, "SVSNICK") || irc::equals(cmd, "SVSPART")) { if (params.empty()) return false; // Malformed. diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp index 136001d91..c94076e82 100644 --- a/src/modules/m_spanningtree/main.cpp +++ b/src/modules/m_spanningtree/main.cpp @@ -594,7 +594,15 @@ void ModuleSpanningTree::OnChangeUser(User* user, const std::string& newuser) if (!user->IsFullyConnected() || !IS_LOCAL(user)) return; - CmdBuilder(user, "FIDENT").push(newuser).Broadcast(); + CmdBuilder(user, "FIDENT").push(newuser).push("*").Broadcast(); +} + +void ModuleSpanningTree::OnChangeRealUser(User* user, const std::string& newuser) +{ + if (!user->IsFullyConnected() || !IS_LOCAL(user)) + return; + + CmdBuilder(user, "FIDENT").push("*").push(newuser).Broadcast(); } void ModuleSpanningTree::OnUserPart(Membership* memb, std::string& partmessage, CUList& excepts) diff --git a/src/modules/m_spanningtree/main.h b/src/modules/m_spanningtree/main.h index 52125ec26..83784d074 100644 --- a/src/modules/m_spanningtree/main.h +++ b/src/modules/m_spanningtree/main.h @@ -187,6 +187,7 @@ public: void OnChangeRealHost(User* user, const std::string& newhost) override; void OnChangeRealName(User* user, const std::string& real) override; void OnChangeUser(User* user, const std::string& newuser) override; + void OnChangeRealUser(User* user, const std::string& newuser) override; void OnUserPart(Membership* memb, std::string& partmessage, CUList& excepts) override; void OnUserQuit(User* user, const std::string& reason, const std::string& oper_message) override; void OnUserPostNick(User* user, const std::string& oldnick) override; diff --git a/src/modules/m_spanningtree/uid.cpp b/src/modules/m_spanningtree/uid.cpp index dec0d7505..cfaea59ed 100644 --- a/src/modules/m_spanningtree/uid.cpp +++ b/src/modules/m_spanningtree/uid.cpp @@ -163,7 +163,12 @@ CmdResult CommandFRHost::HandleRemote(RemoteUser* src, Params& params) CmdResult CommandFIdent::HandleRemote(RemoteUser* src, Params& params) { - src->ChangeDisplayedUser(params[0]); + if (params[0] != "*") + src->ChangeDisplayedUser(params[0]); + + if (params[1] != "*") + src->ChangeRealUser(params[1], false); + return CmdResult::SUCCESS; } -- cgit v1.3.1-10-gc9f91