From 503640149ab9d907fbf443bc617e86c536c81eb3 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Sun, 10 Oct 2021 16:30:21 +0800 Subject: [PATCH] =?UTF-8?q?TCP=E3=80=81TLS=E3=80=81UDP=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E7=AB=AF=E5=8F=A3=E8=8C=83=E5=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../actions/default/servers/addPortPopup.go | 77 +++++++++++++++---- .../common/network-addresses-box.js | 21 +++-- web/views/@default/servers/addPortPopup.html | 3 +- .../servers/server/settings/tcp/index.html | 2 +- .../servers/server/settings/tls/index.html | 2 +- .../servers/server/settings/udp/index.html | 2 +- 6 files changed, 82 insertions(+), 25 deletions(-) diff --git a/internal/web/actions/default/servers/addPortPopup.go b/internal/web/actions/default/servers/addPortPopup.go index b22bbd2d..7a8464d3 100644 --- a/internal/web/actions/default/servers/addPortPopup.go +++ b/internal/web/actions/default/servers/addPortPopup.go @@ -5,6 +5,7 @@ import ( "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/maps" + "github.com/iwind/TeaGo/types" "regexp" "strings" ) @@ -18,9 +19,10 @@ func (this *AddPortPopupAction) Init() { } func (this *AddPortPopupAction) RunGet(params struct { - ServerType string - Protocol string - From string + ServerType string + Protocol string + From string + SupportRange bool }) { this.Data["from"] = params.From @@ -36,10 +38,14 @@ func (this *AddPortPopupAction) RunGet(params struct { } this.Data["protocols"] = protocols + this.Data["supportRange"] = params.SupportRange + this.Show() } func (this *AddPortPopupAction) RunPost(params struct { + SupportRange bool + Protocol string Address string @@ -50,26 +56,69 @@ func (this *AddPortPopupAction) RunPost(params struct { "protocol": params.Protocol, "host": "", "portRange": "", + "minPort": 0, + "maxPort": 0, } - // TODO 判断端口不能小于1 - // TODO 判断端口号不能大于65535 - - digitRegexp := regexp.MustCompile(`^\d+$`) - if digitRegexp.MatchString(params.Address) { - addr["portRange"] = params.Address - } else if strings.Contains(params.Address, ":") { + var portRegexp = regexp.MustCompile(`^\d+$`) + if portRegexp.MatchString(params.Address) { // 单个端口 + addr["portRange"] = this.checkPort(params.Address) + } else if params.SupportRange && regexp.MustCompile(`^\d+\s*-\s*\d+$`).MatchString(params.Address) { // Port1-Port2 + addr["portRange"], addr["minPort"], addr["maxPort"] = this.checkPortRange(params.Address) + } else if strings.Contains(params.Address, ":") { // IP:Port index := strings.LastIndex(params.Address, ":") addr["host"] = strings.TrimSpace(params.Address[:index]) port := strings.TrimSpace(params.Address[index+1:]) - if !digitRegexp.MatchString(port) { - this.Fail("端口只能是一个数字") + if portRegexp.MatchString(port) { + addr["portRange"] = this.checkPort(port) + } else if params.SupportRange && regexp.MustCompile(`^\d+\s*-\s*\d+$`).MatchString(port) { // Port1-Port2 + addr["portRange"], addr["minPort"], addr["maxPort"] = this.checkPortRange(port) + } else { + this.FailField("address", "请输入正确的端口或者网络地址") } - addr["portRange"] = port } else { - this.Fail("请输入正确的端口或者网络地址") + this.FailField("address", "请输入正确的端口或者网络地址") } this.Data["address"] = addr this.Success() } + +func (this *AddPortPopupAction) checkPort(port string) (portRange string) { + var intPort = types.Int(port) + if intPort < 1 { + this.FailField("address", "端口号不能小于1") + } + if intPort > 65535 { + this.FailField("address", "端口号不能大于65535") + } + return port +} + +func (this *AddPortPopupAction) checkPortRange(port string) (portRange string, minPort int, maxPort int) { + var pieces = strings.Split(port, "-") + var piece1 = strings.TrimSpace(pieces[0]) + var piece2 = strings.TrimSpace(pieces[1]) + var port1 = types.Int(piece1) + var port2 = types.Int(piece2) + + if port1 < 1 { + this.FailField("address", "端口号不能小于1") + } + if port1 > 65535 { + this.FailField("address", "端口号不能大于65535") + } + + if port2 < 1 { + this.FailField("address", "端口号不能小于1") + } + if port2 > 65535 { + this.FailField("address", "端口号不能大于65535") + } + + if port1 > port2 { + port1, port2 = port2, port1 + } + + return types.String(port1) + "-" + types.String(port2), port1, port2 +} diff --git a/web/public/js/components/common/network-addresses-box.js b/web/public/js/components/common/network-addresses-box.js index 6c84a352..90cec4fa 100644 --- a/web/public/js/components/common/network-addresses-box.js +++ b/web/public/js/components/common/network-addresses-box.js @@ -1,5 +1,5 @@ Vue.component("network-addresses-box", { - props: ["v-server-type", "v-addresses", "v-protocol", "v-name", "v-from"], + props: ["v-server-type", "v-addresses", "v-protocol", "v-name", "v-from", "v-support-range"], data: function () { let addresses = this.vAddresses if (addresses == null) { @@ -24,7 +24,8 @@ Vue.component("network-addresses-box", { addresses: addresses, protocol: protocol, name: name, - from: from + from: from, + supportRange: this.vSupportRange } }, watch: { @@ -41,10 +42,16 @@ Vue.component("network-addresses-box", { addAddr: function () { let that = this window.UPDATING_ADDR = null - teaweb.popup("/servers/addPortPopup?serverType=" + this.vServerType + "&protocol=" + this.protocol + "&from=" + this.from, { - height: "16em", + teaweb.popup("/servers/addPortPopup?serverType=" + this.vServerType + "&protocol=" + this.protocol + "&from=" + this.from + "&supportRange=" + (this.supportRange ? 1 : 0), { + height: "18em", callback: function (resp) { var addr = resp.data.address + if (that.addresses.$find(function (k, v) { + return addr.host == v.host && addr.portRange == v.portRange && addr.protocol == v.protocol + }) != null) { + teaweb.warn("要添加的网络地址已经存在") + return + } that.addresses.push(addr) if (["https", "https4", "https6"].$contains(addr.protocol)) { this.tlsProtocolName = "HTTPS" @@ -66,8 +73,8 @@ Vue.component("network-addresses-box", { updateAddr: function (index, addr) { let that = this window.UPDATING_ADDR = addr - teaweb.popup("/servers/addPortPopup?serverType=" + this.vServerType + "&protocol=" + this.protocol + "&from=" + this.from, { - height: "16em", + teaweb.popup("/servers/addPortPopup?serverType=" + this.vServerType + "&protocol=" + this.protocol + "&from=" + this.from + "&supportRange=" + (this.supportRange ? 1 : 0), { + height: "18em", callback: function (resp) { var addr = resp.data.address Vue.set(that.addresses, index, addr) @@ -91,7 +98,7 @@ Vue.component("network-addresses-box", {
- {{addr.protocol}}://{{addr.host.quoteIP()}}*:{{addr.portRange}} + {{addr.protocol}}://{{addr.host.quoteIP()}}*:{{addr.portRange}}{{addr.portRange}}
diff --git a/web/views/@default/servers/addPortPopup.html b/web/views/@default/servers/addPortPopup.html index 94cc51bc..eefd3203 100644 --- a/web/views/@default/servers/addPortPopup.html +++ b/web/views/@default/servers/addPortPopup.html @@ -3,6 +3,7 @@

添加端口绑定

修改端口绑定

+ @@ -16,7 +17,7 @@
网络协议端口 * -

可以是一个数字端口(通常不超过65535),也可以是"地址:端口"的方式。 +

可以是一个数字端口(通常不超过65535),也可以是"地址:端口"的方式。支持端口范围,形式为port1-port2 HTTP常用端口为80 HTTPS常用端口为443

diff --git a/web/views/@default/servers/server/settings/tcp/index.html b/web/views/@default/servers/server/settings/tcp/index.html index b9d6aa96..7c9e08bc 100644 --- a/web/views/@default/servers/server/settings/tcp/index.html +++ b/web/views/@default/servers/server/settings/tcp/index.html @@ -10,7 +10,7 @@
绑定端口 * - +
diff --git a/web/views/@default/servers/server/settings/tls/index.html b/web/views/@default/servers/server/settings/tls/index.html index b996f327..6decce73 100644 --- a/web/views/@default/servers/server/settings/tls/index.html +++ b/web/views/@default/servers/server/settings/tls/index.html @@ -14,7 +14,7 @@ 绑定端口 * - + diff --git a/web/views/@default/servers/server/settings/udp/index.html b/web/views/@default/servers/server/settings/udp/index.html index a2405a5c..b3a7d35d 100644 --- a/web/views/@default/servers/server/settings/udp/index.html +++ b/web/views/@default/servers/server/settings/udp/index.html @@ -9,7 +9,7 @@ 绑定端口 * - +