diff options
| author | 2021-08-28 23:45:26 +0100 | |
|---|---|---|
| committer | 2021-08-28 23:45:26 +0100 | |
| commit | 38fa27876d05edecbf9f238947d18d1319ca2757 (patch) | |
| tree | d24e90d038c31bc30551b32e35847b6d614bc99e /src/modules/m_spanningtree/compat.cpp | |
| parent | Require TLS by default when connecting to Postgres servers. (diff) | |
Forward SQUERY to services instead of downgrading it to PRIVMSG.
Diffstat (limited to 'src/modules/m_spanningtree/compat.cpp')
| -rw-r--r-- | src/modules/m_spanningtree/compat.cpp | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/modules/m_spanningtree/compat.cpp b/src/modules/m_spanningtree/compat.cpp new file mode 100644 index 000000000..1efe86316 --- /dev/null +++ b/src/modules/m_spanningtree/compat.cpp @@ -0,0 +1,59 @@ +/* + * InspIRCd -- Internet Relay Chat Daemon + * + * Copyright (C) 2021 Sadie Powell <sadie@witchery.services> + * + * This file is part of InspIRCd. InspIRCd is free software: you can + * redistribute it and/or modify it under the terms of the GNU General Public + * License as published by the Free Software Foundation, version 2. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "inspircd.h" +#include "main.h" + +void TreeSocket::WriteLine(const std::string& original_line) +{ + if (LinkState != CONNECTED || proto_version == PROTO_NEWEST) + { + // Don't translate connections which have negotiated PROTO_NEWEST or + // where the protocol hasn't been negotiated yet. + WriteLineInternal(original_line); + return; + } + + std::string line = original_line; + size_t cmdstart = 0; + + if (line[0] == '@') // Skip the tags. + cmdstart = line.find(' ', cmdstart + 1); + + if (line[0] == ':') // Skip the prefix. + cmdstart = line.find(' ', cmdstart + 1); + + // Find the end of the command. + size_t cmdend = line.find(' ', cmdstart + 1); + if (cmdend == std::string::npos) + cmdend = line.size(); + + std::string command(line, cmdstart + 1, cmdend - cmdstart - 1); + if (proto_version == PROTO_INSPIRCD_30) + { + if (irc::equals(command, "SQUERY")) + { + // SQUERY was introduced in PROTO_INSPIRCD_40_A1; convert to PRIVMSG. + line.replace(cmdstart + 1, cmdend - cmdstart - 1, "PRIVMSG"); + } + } + + WriteLineInternal(line); + return; +} |
