aboutsummaryrefslogtreecommitdiff
path: root/src/modules/m_spanningtree
diff options
context:
space:
mode:
authorGravatar Sadie Powell2024-07-20 12:31:31 +0100
committerGravatar Sadie Powell2024-07-20 12:33:37 +0100
commit42fdbb7234628ff95acdb6f3f1d1d2206ad77334 (patch)
treea8f3bb09c880d96f886f8a44f4bb0b7119922022 /src/modules/m_spanningtree
parentImplement support for the IRCv3 WebSocket subprotocol names. (diff)
Fix broadcasting UID messages to v3 servers.
We have to use the compat layer here as broadcast messages do not go through the command builder.
Diffstat (limited to 'src/modules/m_spanningtree')
-rw-r--r--src/modules/m_spanningtree/commands.h2
-rw-r--r--src/modules/m_spanningtree/compat.cpp13
-rw-r--r--src/modules/m_spanningtree/main.cpp17
-rw-r--r--src/modules/m_spanningtree/netburst.cpp2
-rw-r--r--src/modules/m_spanningtree/uid.cpp5
5 files changed, 18 insertions, 21 deletions
diff --git a/src/modules/m_spanningtree/commands.h b/src/modules/m_spanningtree/commands.h
index bb92e07a6..c02f3b0d3 100644
--- a/src/modules/m_spanningtree/commands.h
+++ b/src/modules/m_spanningtree/commands.h
@@ -102,7 +102,7 @@ public:
: public CmdBuilder
{
public:
- Builder(User* user, bool real_user);
+ Builder(User* user);
};
};
diff --git a/src/modules/m_spanningtree/compat.cpp b/src/modules/m_spanningtree/compat.cpp
index 197b0e73c..8bfe1a15e 100644
--- a/src/modules/m_spanningtree/compat.cpp
+++ b/src/modules/m_spanningtree/compat.cpp
@@ -114,6 +114,19 @@ void TreeSocket::WriteLine(const std::string& original_line)
// SQUERY was introduced in PROTO_INSPIRCD_4; convert to PRIVMSG.
line.replace(cmdstart, 6, "PRIVMSG");
}
+ else if (irc::equals(command, "UID"))
+ {
+ // :<sid> UID <uuid> <nickchanged> <nick> <host> <dhost> <user> <duser> <ip.string> <signon> <modes> [<modepara>] :<real>
+ // ^^^^^^ New in 1206
+ size_t uuidend = NextToken(line, cmdend);
+ size_t nickchangedend = NextToken(line, uuidend);
+ size_t nickend = NextToken(line, nickchangedend);
+ size_t hostend = NextToken(line, nickend);
+ size_t dhostend = NextToken(line, hostend);
+ size_t userend = NextToken(line, dhostend);
+ if (userend != std::string::npos)
+ line.erase(dhostend, userend - dhostend);
+ }
}
WriteLineInternal(line);
diff --git a/src/modules/m_spanningtree/main.cpp b/src/modules/m_spanningtree/main.cpp
index 47545b47e..c58004a70 100644
--- a/src/modules/m_spanningtree/main.cpp
+++ b/src/modules/m_spanningtree/main.cpp
@@ -497,22 +497,7 @@ void ModuleSpanningTree::OnUserConnect(LocalUser* user)
if (sslapi)
sslapi->GetCertificate(user);
- CommandUID::Builder uid(user, true);
- CommandUID::Builder olduid(user, false);
-
- // NOTE: we can't do CommandUID::Builder(user).Broadcast() whilst
- // we still support the 1205 protocol.
- for (const auto* server : Utils->TreeRoot->GetChildren())
- {
- TreeSocket* socket = server->GetSocket();
- if (!socket)
- continue; // Should never happen?
-
- if (socket->proto_version >= PROTO_INSPIRCD_4)
- socket->WriteLine(uid);
- else
- socket->WriteLine(olduid);
- }
+ CommandUID::Builder(user).Broadcast();
if (user->IsOper())
CommandOpertype::Builder(user, user->oper).Broadcast();
diff --git a/src/modules/m_spanningtree/netburst.cpp b/src/modules/m_spanningtree/netburst.cpp
index 77aa73d83..798987975 100644
--- a/src/modules/m_spanningtree/netburst.cpp
+++ b/src/modules/m_spanningtree/netburst.cpp
@@ -282,7 +282,7 @@ void TreeSocket::SendUsers(BurstState& bs)
if (!user->IsFullyConnected())
continue;
- this->WriteLine(CommandUID::Builder(user, this->proto_version != PROTO_INSPIRCD_3));
+ this->WriteLine(CommandUID::Builder(user));
if (user->IsOper())
this->WriteLine(CommandOpertype::Builder(user, user->oper));
diff --git a/src/modules/m_spanningtree/uid.cpp b/src/modules/m_spanningtree/uid.cpp
index 57a126933..8425984fb 100644
--- a/src/modules/m_spanningtree/uid.cpp
+++ b/src/modules/m_spanningtree/uid.cpp
@@ -177,7 +177,7 @@ CmdResult CommandFName::HandleRemote(RemoteUser* src, Params& params)
return CmdResult::SUCCESS;
}
-CommandUID::Builder::Builder(User* user, bool real_user)
+CommandUID::Builder::Builder(User* user)
: CmdBuilder(TreeServer::Get(user), "UID")
{
push(user->uuid);
@@ -185,8 +185,7 @@ CommandUID::Builder::Builder(User* user, bool real_user)
push(user->nick);
push(user->GetRealHost());
push(user->GetDisplayedHost());
- if (real_user)
- push(user->GetRealUser());
+ push(user->GetRealUser());
push(user->GetDisplayedUser());
push(user->GetAddress());
push_int(user->signon);