mirror of
https://github.com/znc/znc.git
synced 2026-05-05 21:12:37 +02:00
Configure unix listeners in webadmin
This commit is contained in:
@@ -12,9 +12,9 @@
|
||||
<tr>
|
||||
<th><? FORMAT "Port" ?></th>
|
||||
<th><? FORMAT "BindHost" ?></th>
|
||||
<th><? FORMAT "SSL" ?></th>
|
||||
<th><? FORMAT "IPv4" ?></th>
|
||||
<th><? FORMAT "IPv6" ?></th>
|
||||
<th><? FORMAT "SSL" ?></th>
|
||||
<th><? FORMAT "IRC" ?></th>
|
||||
<th><? FORMAT "HTTP" ?></th>
|
||||
<th><? FORMAT "URIPrefix" ?></th>
|
||||
@@ -24,17 +24,21 @@
|
||||
|
||||
<? LOOP ListenLoop ?>
|
||||
<tr class="<? IF __EVEN__ ?>evenrow<? ELSE ?>oddrow<? ENDIF ?>">
|
||||
<? IF Type == "TCP" ?>
|
||||
<td><? VAR Port ?></td>
|
||||
<td><? VAR BindHost DEFAULT=** ?></td>
|
||||
<td class="listener_show_ssl">
|
||||
<div class="checkbox"><input type="checkbox" disabled="disabled" <? IF IsSSL ?>checked="checked"<? ENDIF ?>/></div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="checkbox"><input type="checkbox" disabled="disabled" <? IF IsIPV4 ?>checked="checked"<? ENDIF ?>/></div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="checkbox"><input type="checkbox" disabled="disabled" <? IF IsIPV6 ?>checked="checked"<? ENDIF ?>/></div>
|
||||
</td>
|
||||
<? ELSE ?>
|
||||
<td colspan="4">unix:<? VAR Path ?></td>
|
||||
<? ENDIF ?>
|
||||
<td class="listener_show_ssl">
|
||||
<div class="checkbox"><input type="checkbox" disabled="disabled" <? IF IsSSL ?>checked="checked"<? ENDIF ?>/></div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="checkbox"><input type="checkbox" disabled="disabled" <? IF IsIRC ?>checked="checked"<? ENDIF ?>/></div>
|
||||
</td>
|
||||
@@ -46,10 +50,15 @@
|
||||
<? IF SuggestDeletion ?>
|
||||
<form action="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>del_listener" method="post">
|
||||
<? INC _csrf_check.tmpl ?>
|
||||
<input name="type" type="hidden" value="<? VAR Type ?>"/>
|
||||
<? IF Type == "TCP" ?>
|
||||
<input name="host" type="hidden" value="<? VAR BindHost ?>"/>
|
||||
<input name="port" type="hidden" value="<? VAR Port ?>"/>
|
||||
<input name="ipv4" type="hidden" value="<? VAR IsIPV4 ?>"/>
|
||||
<input name="ipv6" type="hidden" value="<? VAR IsIPV6 ?>"/>
|
||||
<? ELSE ?>
|
||||
<input name="path" type="hidden" value="<? VAR Path ?>"/>
|
||||
<? ENDIF ?>
|
||||
<input type="submit" value="<? FORMAT "Del" ?>"/>
|
||||
</form>
|
||||
<? ELSE ?>
|
||||
@@ -61,11 +70,24 @@
|
||||
<tr>
|
||||
<form action="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>add_listener" method="post">
|
||||
<? INC _csrf_check.tmpl ?>
|
||||
<input name="type" type="hidden" value="TCP"/>
|
||||
<td><input name="port" type="number" min="1" max="65535" class="number third"/></td>
|
||||
<td><input name="host" type="text" value="*" class="sixth"/></td>
|
||||
<td><div class="checkbox"><input name="ssl" type="checkbox"/></div></td>
|
||||
<td><div class="checkbox"><input name="ipv4" type="checkbox" checked="checked"/></div></td>
|
||||
<td><div class="checkbox"><input name="ipv6" type="checkbox" checked="checked"/></div></td>
|
||||
<td><div class="checkbox"><input name="ssl" type="checkbox"/></div></td>
|
||||
<td><div class="checkbox"><input name="irc" type="checkbox" checked="checked"/></div></td>
|
||||
<td><div class="checkbox"><input name="web" type="checkbox" checked="checked"/></div></td>
|
||||
<td><input name="uriprefix" type="text" value="/" class="sixth"/></td>
|
||||
<td><input type="submit" value="<? FORMAT "Add" ?>"/></td>
|
||||
</form>
|
||||
</tr>
|
||||
<tr>
|
||||
<form action="<? VAR URIPrefix TOP ?><? VAR ModPath TOP ?>add_listener" method="post">
|
||||
<? INC _csrf_check.tmpl ?>
|
||||
<input name="type" type="hidden" value="Unix"/>
|
||||
<td colspan="4">unix:<input name="path" type="text" value="/" class="third"/></td>
|
||||
<td><div class="checkbox"><input name="ssl" type="checkbox"/></div></td>
|
||||
<td><div class="checkbox"><input name="irc" type="checkbox" checked="checked"/></div></td>
|
||||
<td><div class="checkbox"><input name="web" type="checkbox" checked="checked"/></div></td>
|
||||
<td><input name="uriprefix" type="text" value="/" class="sixth"/></td>
|
||||
|
||||
@@ -1844,33 +1844,10 @@ class CWebAdminMod : public CModule {
|
||||
}
|
||||
|
||||
bool AddListener(CWebSock& WebSock, CTemplate& Tmpl) {
|
||||
unsigned short uPort = WebSock.GetParam("port").ToUShort();
|
||||
CString sHost = WebSock.GetParam("host");
|
||||
CString sURIPrefix = WebSock.GetParam("uriprefix");
|
||||
if (sHost == "*") sHost = "";
|
||||
bool bSSL = WebSock.GetParam("ssl").ToBool();
|
||||
bool bIPv4 = WebSock.GetParam("ipv4").ToBool();
|
||||
bool bIPv6 = WebSock.GetParam("ipv6").ToBool();
|
||||
bool bIRC = WebSock.GetParam("irc").ToBool();
|
||||
bool bWeb = WebSock.GetParam("web").ToBool();
|
||||
|
||||
EAddrType eAddr = ADDR_ALL;
|
||||
if (bIPv4) {
|
||||
if (bIPv6) {
|
||||
eAddr = ADDR_ALL;
|
||||
} else {
|
||||
eAddr = ADDR_IPV4ONLY;
|
||||
}
|
||||
} else {
|
||||
if (bIPv6) {
|
||||
eAddr = ADDR_IPV6ONLY;
|
||||
} else {
|
||||
WebSock.GetSession()->AddError(
|
||||
t_s("Choose either IPv4 or IPv6 or both."));
|
||||
return SettingsPage(WebSock, Tmpl);
|
||||
}
|
||||
}
|
||||
|
||||
CListener::EAcceptType eAccept;
|
||||
if (bIRC) {
|
||||
if (bWeb) {
|
||||
@@ -1889,8 +1866,39 @@ class CWebAdminMod : public CModule {
|
||||
}
|
||||
|
||||
CString sMessage;
|
||||
if (CZNC::Get().AddListener(uPort, sHost, sURIPrefix, bSSL, eAddr,
|
||||
eAccept, sMessage)) {
|
||||
bool bResult;
|
||||
if (WebSock.GetParam("type") == "TCP") {
|
||||
unsigned short uPort = WebSock.GetParam("port").ToUShort();
|
||||
CString sHost = WebSock.GetParam("host");
|
||||
if (sHost == "*") sHost = "";
|
||||
bool bIPv4 = WebSock.GetParam("ipv4").ToBool();
|
||||
bool bIPv6 = WebSock.GetParam("ipv6").ToBool();
|
||||
|
||||
EAddrType eAddr = ADDR_ALL;
|
||||
if (bIPv4) {
|
||||
if (bIPv6) {
|
||||
eAddr = ADDR_ALL;
|
||||
} else {
|
||||
eAddr = ADDR_IPV4ONLY;
|
||||
}
|
||||
} else {
|
||||
if (bIPv6) {
|
||||
eAddr = ADDR_IPV6ONLY;
|
||||
} else {
|
||||
WebSock.GetSession()->AddError(
|
||||
t_s("Choose either IPv4 or IPv6 or both."));
|
||||
return SettingsPage(WebSock, Tmpl);
|
||||
}
|
||||
}
|
||||
bResult = CZNC::Get().AddListener(uPort, sHost, sURIPrefix, bSSL,
|
||||
eAddr, eAccept, sMessage);
|
||||
} else {
|
||||
CString sPath = WebSock.GetParam("path");
|
||||
bResult = CZNC::Get().AddUnixListener(sPath, sURIPrefix, bSSL,
|
||||
eAccept, sMessage);
|
||||
}
|
||||
|
||||
if (bResult) {
|
||||
if (!sMessage.empty()) {
|
||||
WebSock.GetSession()->AddSuccess(sMessage);
|
||||
}
|
||||
@@ -1906,28 +1914,34 @@ class CWebAdminMod : public CModule {
|
||||
}
|
||||
|
||||
bool DelListener(CWebSock& WebSock, CTemplate& Tmpl) {
|
||||
unsigned short uPort = WebSock.GetParam("port").ToUShort();
|
||||
CString sHost = WebSock.GetParam("host");
|
||||
bool bIPv4 = WebSock.GetParam("ipv4").ToBool();
|
||||
bool bIPv6 = WebSock.GetParam("ipv6").ToBool();
|
||||
CListener* pListener;
|
||||
|
||||
EAddrType eAddr = ADDR_ALL;
|
||||
if (bIPv4) {
|
||||
if (bIPv6) {
|
||||
eAddr = ADDR_ALL;
|
||||
if (WebSock.GetParam("type") == "TCP") {
|
||||
unsigned short uPort = WebSock.GetParam("port").ToUShort();
|
||||
CString sHost = WebSock.GetParam("host");
|
||||
bool bIPv4 = WebSock.GetParam("ipv4").ToBool();
|
||||
bool bIPv6 = WebSock.GetParam("ipv6").ToBool();
|
||||
|
||||
EAddrType eAddr = ADDR_ALL;
|
||||
if (bIPv4) {
|
||||
if (bIPv6) {
|
||||
eAddr = ADDR_ALL;
|
||||
} else {
|
||||
eAddr = ADDR_IPV4ONLY;
|
||||
}
|
||||
} else {
|
||||
eAddr = ADDR_IPV4ONLY;
|
||||
if (bIPv6) {
|
||||
eAddr = ADDR_IPV6ONLY;
|
||||
} else {
|
||||
WebSock.GetSession()->AddError(t_s("Invalid request."));
|
||||
return SettingsPage(WebSock, Tmpl);
|
||||
}
|
||||
}
|
||||
|
||||
pListener = CZNC::Get().FindListener(uPort, sHost, eAddr);
|
||||
} else {
|
||||
if (bIPv6) {
|
||||
eAddr = ADDR_IPV6ONLY;
|
||||
} else {
|
||||
WebSock.GetSession()->AddError(t_s("Invalid request."));
|
||||
return SettingsPage(WebSock, Tmpl);
|
||||
}
|
||||
pListener = CZNC::Get().FindUnixListener(WebSock.GetParam("path"));
|
||||
}
|
||||
|
||||
CListener* pListener = CZNC::Get().FindListener(uPort, sHost, eAddr);
|
||||
if (pListener) {
|
||||
CZNC::Get().DelListener(pListener);
|
||||
if (!CZNC::Get().WriteConfig()) {
|
||||
@@ -1967,8 +1981,9 @@ class CWebAdminMod : public CModule {
|
||||
for (const CListener* pListener : vpListeners) {
|
||||
CTemplate& l = Tmpl.AddRow("ListenLoop");
|
||||
|
||||
const CTCPListener* pTCPListener = dynamic_cast<const CTCPListener*>(pListener);
|
||||
if (pTCPListener != nullptr) {
|
||||
if (const CTCPListener* pTCPListener =
|
||||
dynamic_cast<const CTCPListener*>(pListener)) {
|
||||
l["Type"] = "TCP";
|
||||
l["Port"] = CString(pTCPListener->GetPort());
|
||||
l["BindHost"] = pTCPListener->GetBindHost();
|
||||
|
||||
@@ -1978,23 +1993,6 @@ class CWebAdminMod : public CModule {
|
||||
// delete web port
|
||||
l["SuggestDeletion"] =
|
||||
CString(pTCPListener->GetPort() != WebSock.GetLocalPort());
|
||||
}
|
||||
// TODO: Handle CUnixListener
|
||||
|
||||
l["IsHTTP"] = CString(pListener->GetAcceptType() !=
|
||||
CListener::ACCEPT_IRC);
|
||||
l["IsIRC"] = CString(pListener->GetAcceptType() !=
|
||||
CListener::ACCEPT_HTTP);
|
||||
|
||||
l["URIPrefix"] = pListener->GetURIPrefix() + "/";
|
||||
|
||||
#ifdef HAVE_LIBSSL
|
||||
if (pListener->IsSSL()) {
|
||||
l["IsSSL"] = "true";
|
||||
}
|
||||
#endif
|
||||
|
||||
if (pTCPListener != nullptr) {
|
||||
#ifdef HAVE_IPV6
|
||||
switch (pTCPListener->GetAddrType()) {
|
||||
case ADDR_IPV4ONLY:
|
||||
@@ -2012,6 +2010,32 @@ class CWebAdminMod : public CModule {
|
||||
l["IsIPV4"] = "true";
|
||||
#endif
|
||||
}
|
||||
if (const CUnixListener* pUnixListener =
|
||||
dynamic_cast<const CUnixListener*>(pListener)) {
|
||||
l["Type"] = "Unix";
|
||||
l["Path"] = pUnixListener->GetPath();
|
||||
// We can't determine whether it's the same port, as it's
|
||||
// always "localhost". Just assume the user knows what he's
|
||||
// doing. Unix sockets are advanced topic anyway.
|
||||
l["SuggestDeletion"] = "true";
|
||||
}
|
||||
|
||||
l["IsHTTP"] = CString(pListener->GetAcceptType() !=
|
||||
CListener::ACCEPT_IRC);
|
||||
l["IsIRC"] = CString(pListener->GetAcceptType() !=
|
||||
CListener::ACCEPT_HTTP);
|
||||
|
||||
CString sURIPrefix = pListener->GetURIPrefix();
|
||||
if (!sURIPrefix.EndsWith("/")) {
|
||||
sURIPrefix += "/";
|
||||
}
|
||||
l["URIPrefix"] = sURIPrefix;
|
||||
|
||||
#ifdef HAVE_LIBSSL
|
||||
if (pListener->IsSSL()) {
|
||||
l["IsSSL"] = "true";
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
vector<CString> vDirs;
|
||||
|
||||
Reference in New Issue
Block a user