mirror of
https://github.com/znc/znc.git
synced 2026-05-02 11:32:29 +02:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user