From 320b325496dcc94373b14ad7bad9c78b10d50cd8 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Tue, 20 Jul 2021 10:55:25 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E5=90=84=E4=B8=AA=E5=9C=B0=E6=96=B9?= =?UTF-8?q?=E6=94=AF=E6=8C=81IPv6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- go.sum | 2 ++ .../default/settings/database/update.go | 20 ++++++++++++++++-- internal/web/helpers/utils.go | 21 ++++++++++++++----- .../api-node/api-node-addresses-box.js | 2 +- .../common/network-addresses-box.js | 2 +- .../common/network-addresses-view.js | 2 +- web/public/js/utils.js | 16 +++++++++++++- .../@default/api/node/updateAddrPopup.js | 2 +- web/views/@default/servers/addPortPopup.js | 2 +- .../servers/server/log/viewPopup.html | 2 +- .../user-nodes/node/updateAddrPopup.js | 2 +- 12 files changed, 59 insertions(+), 16 deletions(-) diff --git a/go.mod b/go.mod index b66a144c..570e3d20 100644 --- a/go.mod +++ b/go.mod @@ -11,7 +11,7 @@ require ( github.com/go-yaml/yaml v2.1.0+incompatible github.com/golang/protobuf v1.5.2 // indirect github.com/google/go-cmp v0.5.6 // indirect - github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060 + github.com/iwind/TeaGo v0.0.0-20210720011303-fc255c995afa github.com/miekg/dns v1.1.35 github.com/shirou/gopsutil v3.21.5+incompatible // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e diff --git a/go.sum b/go.sum index 52b31529..27765a94 100644 --- a/go.sum +++ b/go.sum @@ -67,6 +67,8 @@ github.com/iwind/TeaGo v0.0.0-20210411134150-ddf57e240c2f h1:r2O8PONj/KiuZjJHVHn github.com/iwind/TeaGo v0.0.0-20210411134150-ddf57e240c2f/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc= github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060 h1:qdLtK4PDXxk2vMKkTWl5Fl9xqYuRCukzWAgJbLHdfOo= github.com/iwind/TeaGo v0.0.0-20210628135026-38575a4ab060/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc= +github.com/iwind/TeaGo v0.0.0-20210720011303-fc255c995afa h1:woN88uEmRRUNFD7pRZEtX9heDcjFn0ClMxjF5ButKow= +github.com/iwind/TeaGo v0.0.0-20210720011303-fc255c995afa/go.mod h1:KU4mS7QNiZ7QWEuDBk1zw0/Q2LrAPZv3tycEFBsuUwc= github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= diff --git a/internal/web/actions/default/settings/database/update.go b/internal/web/actions/default/settings/database/update.go index f3071efc..22832f58 100644 --- a/internal/web/actions/default/settings/database/update.go +++ b/internal/web/actions/default/settings/database/update.go @@ -3,6 +3,7 @@ package database import ( "fmt" "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/configutils" "github.com/go-sql-driver/mysql" "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/actions" @@ -10,6 +11,8 @@ import ( "github.com/iwind/TeaGo/maps" "gopkg.in/yaml.v3" "io/ioutil" + "net" + "regexp" "strings" ) @@ -101,7 +104,20 @@ func (this *UpdateAction) RunPost(params struct { params.Must. Field("host", params.Host). Require("请输入主机地址"). - Match(`^[\w\.-]+$`, "主机地址中不能包含特殊字符"). + Expect(func() (message string, success bool) { + // 是否为IP + if net.ParseIP(params.Host) != nil { + success = true + return + } + if !regexp.MustCompile(`^[\w.-]+$`).MatchString(params.Host) { + message = "主机地址中不能包含特殊字符" + success = false + return + } + success = true + return + }). Field("port", params.Port). Gt(0, "端口需要大于0"). Lt(65535, "端口需要小于65535"). @@ -113,7 +129,7 @@ func (this *UpdateAction) RunPost(params struct { Match(`^[\w\.-]+$`, "用户名中不能包含特殊字符") // 保存 - dsn := params.Username + ":" + params.Password + "@tcp(" + params.Host + ":" + fmt.Sprintf("%d", params.Port) + ")/" + params.Database + dsn := params.Username + ":" + params.Password + "@tcp(" + configutils.QuoteIP(params.Host) + ":" + fmt.Sprintf("%d", params.Port) + ")/" + params.Database configFile := Tea.ConfigFile("api_db.yaml") template := `default: diff --git a/internal/web/helpers/utils.go b/internal/web/helpers/utils.go index 3a4979fa..5a3b7304 100644 --- a/internal/web/helpers/utils.go +++ b/internal/web/helpers/utils.go @@ -54,13 +54,17 @@ func checkIPWithoutCache(config *systemconfigs.SecurityConfig, ipAddr string) bo // 本地IP ipObj := net.ParseIP(ipAddr) if ipObj == nil { - logs.Println("[USER_MUST_AUTH]invalid client address: " + ipAddr) + logs.Println("[USER_MUST_AUTH]parse ip: invalid client address: " + ipAddr) return false } ip := ipObj.To4() if ip == nil { - logs.Println("[USER_MUST_AUTH]invalid client address: " + ipAddr) - return false + // IPv6 + ip = ipObj.To16() + if ip == nil { + logs.Println("[USER_MUST_AUTH]invalid client address: " + ipAddr) + return false + } } if config.AllowLocal && isLocalIP(ip) { return true @@ -104,8 +108,15 @@ func checkIPWithoutCache(config *systemconfigs.SecurityConfig, ipAddr string) bo // 判断是否为本地IP func isLocalIP(ip net.IP) bool { - return ip[0] == 127 || + if ip[0] == 127 || ip[0] == 10 || (ip[0] == 172 && ip[1]&0xf0 == 16) || - (ip[0] == 192 && ip[1] == 168) + (ip[0] == 192 && ip[1] == 168) { + return true + } + + if ip.String() == "::1" { + return true + } + return false } diff --git a/web/public/js/components/api-node/api-node-addresses-box.js b/web/public/js/components/api-node/api-node-addresses-box.js index 642af6d9..68817a42 100644 --- a/web/public/js/components/api-node/api-node-addresses-box.js +++ b/web/public/js/components/api-node/api-node-addresses-box.js @@ -42,7 +42,7 @@ Vue.component("api-node-addresses-box", {
- {{addr.protocol}}://{{addr.host}}:{{addr.portRange}} + {{addr.protocol}}://{{addr.host.quoteIP()}}:{{addr.portRange}}
diff --git a/web/public/js/components/common/network-addresses-box.js b/web/public/js/components/common/network-addresses-box.js index b3cf6a89..b66901c3 100644 --- a/web/public/js/components/common/network-addresses-box.js +++ b/web/public/js/components/common/network-addresses-box.js @@ -91,7 +91,7 @@ Vue.component("network-addresses-box", {
- {{addr.protocol}}://{{addr.host}}*:{{addr.portRange}} + {{addr.protocol}}://{{addr.host.quoteIP()}}*:{{addr.portRange}}
diff --git a/web/public/js/components/common/network-addresses-view.js b/web/public/js/components/common/network-addresses-view.js index e650984c..7bbda438 100644 --- a/web/public/js/components/common/network-addresses-view.js +++ b/web/public/js/components/common/network-addresses-view.js @@ -2,7 +2,7 @@ Vue.component("network-addresses-view", { props: ["v-addresses"], template: `
- {{addr.protocol}}://{{addr.host}}*:{{addr.portRange}} + {{addr.protocol}}://{{addr.host.quoteIP()}}*:{{addr.portRange}}
` }) \ No newline at end of file diff --git a/web/public/js/utils.js b/web/public/js/utils.js index 1ea25164..bca7b3f7 100644 --- a/web/public/js/utils.js +++ b/web/public/js/utils.js @@ -396,7 +396,7 @@ window.teaweb = { } let tooltipFunc = options.tooltip - if (typeof(tooltipFunc) != "function") { + if (typeof (tooltipFunc) != "function") { throw new Error("'options.tooltip' should be a function") } @@ -524,3 +524,17 @@ window.teaweb = { chart.resize() } } + +String.prototype.quoteIP = function () { + let ip = this.toString() + if (ip.length == 0) { + return "" + } + if (ip.indexOf(":") < 0) { + return ip + } + if (ip.substring(0, 1) == "[") { + return ip + } + return "[" + ip + "]" +} \ No newline at end of file diff --git a/web/views/@default/api/node/updateAddrPopup.js b/web/views/@default/api/node/updateAddrPopup.js index 908b2e55..298ae925 100644 --- a/web/views/@default/api/node/updateAddrPopup.js +++ b/web/views/@default/api/node/updateAddrPopup.js @@ -1,5 +1,5 @@ Tea.context(function () { let addr = window.parent.UPDATING_ADDR this.protocol = addr.protocol - this.addr = addr.host + ":" + addr.portRange + this.addr = addr.host.quoteIP() + ":" + addr.portRange }) \ No newline at end of file diff --git a/web/views/@default/servers/addPortPopup.js b/web/views/@default/servers/addPortPopup.js index 4fe5cd2f..cb2fe549 100644 --- a/web/views/@default/servers/addPortPopup.js +++ b/web/views/@default/servers/addPortPopup.js @@ -23,7 +23,7 @@ Tea.context(function () { if (addr.host.length == 0) { this.address = addr.portRange } else { - this.address = addr.host + ":" + addr.portRange + this.address = addr.host.quoteIP() + ":" + addr.portRange } } diff --git a/web/views/@default/servers/server/log/viewPopup.html b/web/views/@default/servers/server/log/viewPopup.html index 4fdf013c..5e9ba589 100644 --- a/web/views/@default/servers/server/log/viewPopup.html +++ b/web/views/@default/servers/server/log/viewPopup.html @@ -116,7 +116,7 @@ 区域 {{region.full}} - + ISP {{region.isp}} diff --git a/web/views/@default/settings/user-nodes/node/updateAddrPopup.js b/web/views/@default/settings/user-nodes/node/updateAddrPopup.js index 908b2e55..298ae925 100644 --- a/web/views/@default/settings/user-nodes/node/updateAddrPopup.js +++ b/web/views/@default/settings/user-nodes/node/updateAddrPopup.js @@ -1,5 +1,5 @@ Tea.context(function () { let addr = window.parent.UPDATING_ADDR this.protocol = addr.protocol - this.addr = addr.host + ":" + addr.portRange + this.addr = addr.host.quoteIP() + ":" + addr.portRange }) \ No newline at end of file