Add support to connect to server via unix socket

The syntax for AddServer command and config is chosen to be unix:/path or unix:ssl:/path

For security reasons, only admins can add such servers, to prevent users from poking around the file system.
This commit is contained in:
Alexey Sokolov
2025-04-20 22:20:52 +01:00
parent 66b17926cc
commit 63d10ccb17
10 changed files with 212 additions and 81 deletions

View File

@@ -17,11 +17,12 @@
#include <znc/Server.h>
CServer::CServer(const CString& sName, unsigned short uPort,
const CString& sPass, bool bSSL)
const CString& sPass, bool bSSL, bool bUnixSocket)
: m_sName(sName),
m_uPort((uPort) ? uPort : (unsigned short)6667),
m_sPass(sPass),
m_bSSL(bSSL) {}
m_bSSL(bSSL),
m_bUnixSocket(bUnixSocket) {}
CServer::~CServer() {}
@@ -33,9 +34,66 @@ const CString& CServer::GetName() const { return m_sName; }
unsigned short CServer::GetPort() const { return m_uPort; }
const CString& CServer::GetPass() const { return m_sPass; }
bool CServer::IsSSL() const { return m_bSSL; }
bool CServer::IsUnixSocket() const { return m_bUnixSocket; }
CString CServer::GetString(bool bIncludePassword) const {
return m_sName + " " + CString(m_bSSL ? "+" : "") + CString(m_uPort) +
CString(bIncludePassword ? (m_sPass.empty() ? "" : " " + m_sPass)
: "");
CString sResult;
if (m_bUnixSocket) {
sResult = "unix:" + CString(m_bSSL ? "ssl:" : "") + m_sName;
} else {
sResult = m_sName + " " + CString(m_bSSL ? "+" : "") + CString(m_uPort);
}
sResult +=
CString(bIncludePassword ? (m_sPass.empty() ? "" : " " + m_sPass) : "");
return sResult;
}
CServer CServer::Parse(CString sLine) {
bool bSSL = false;
sLine.Trim();
if (sLine.TrimPrefix("unix:")) {
if (sLine.TrimPrefix("ssl:")) {
bSSL = true;
}
CString sPath = sLine.Token(0);
CString sPass = sLine.Token(1, true);
return CServer(sPath, 0, sPass, bSSL, true);
}
CString sHost = sLine.Token(0);
CString sPort = sLine.Token(1);
if (sPort.TrimPrefix("+")) {
bSSL = true;
}
unsigned short uPort = sPort.ToUShort();
CString sPass = sLine.Token(2, true);
return CServer(sHost, uPort, sPass, bSSL, false);
}
bool CServer::operator==(const CServer& o) const {
if (m_sName != o.m_sName) return false;
if (m_uPort != o.m_uPort) return false;
if (m_sPass != o.m_sPass) return false;
if (m_bSSL != o.m_bSSL) return false;
if (m_bUnixSocket != o.m_bUnixSocket) return false;
return true;
}
bool CServer::operator<(const CServer& o) const {
if (m_sName < o.m_sName) return true;
if (m_sName > o.m_sName) return false;
if (m_uPort < o.m_uPort) return true;
if (m_uPort > o.m_uPort) return false;
if (m_sPass < o.m_sPass) return true;
if (m_sPass > o.m_sPass) return false;
if (m_bSSL < o.m_bSSL) return true;
if (m_bSSL > o.m_bSSL) return false;
if (m_bUnixSocket < o.m_bUnixSocket) return true;
if (m_bUnixSocket > o.m_bUnixSocket) return false;
return false;
}