aboutsummaryrefslogtreecommitdiff
path: root/src/modules/m_spanningtree
diff options
context:
space:
mode:
authorGravatar Sadie Powell2024-02-27 14:37:40 +0000
committerGravatar Sadie Powell2024-02-27 14:45:07 +0000
commitfd25fe3c4fd24faa6270c8805462cb2d50d8834a (patch)
tree29a7fb0927a1529b60621d635db5057549e56f11 /src/modules/m_spanningtree
parentSet a command access for the SVSHOLD command. (diff)
Send the real username as the second parameter to FIDENT.
Diffstat (limited to 'src/modules/m_spanningtree')
-rw-r--r--src/modules/m_spanningtree/commands.h2
-rw-r--r--src/modules/m_spanningtree/compat.cpp21
-rw-r--r--src/modules/m_spanningtree/main.cpp10
-rw-r--r--src/modules/m_spanningtree/main.h1
-rw-r--r--src/modules/m_spanningtree/uid.cpp7
5 files changed, 37 insertions, 4 deletions
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<CommandFIdent>(Creator, "FIDENT", 1)
+ : UserOnlyServerCommand<CommandFIdent>(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.
+ // :<sid> FIDENT <display|*> <real|*>
+ 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"))
{
// :<sid> METADATA <uuid|chan|*|@> <name> :<value>
@@ -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;
}