diff --git a/go.sum b/go.sum index e2683fcb..8e34f46f 100644 --- a/go.sum +++ b/go.sum @@ -9,6 +9,7 @@ github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiU github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= diff --git a/internal/web/actions/default/dns/domains/domainutils/utils.go b/internal/web/actions/default/dns/domains/domainutils/utils.go index 793a03d5..4660c1a8 100644 --- a/internal/web/actions/default/dns/domains/domainutils/utils.go +++ b/internal/web/actions/default/dns/domains/domainutils/utils.go @@ -1,26 +1,38 @@ package domainutils import ( + "github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/lists" "github.com/iwind/TeaGo/maps" + "net" "regexp" "strings" ) -// 校验域名格式 +// ValidateDomainFormat 校验域名格式 func ValidateDomainFormat(domain string) bool { pieces := strings.Split(domain, ".") for _, piece := range pieces { - if !regexp.MustCompile(`^[a-z0-9-]+$`).MatchString(piece) { + if piece == "-" || + strings.HasPrefix(piece, "-") || + strings.HasSuffix(piece, "-") || + strings.Contains(piece, "--") || + len(piece) > 63 || + !regexp.MustCompile(`^[a-z0-9-]+$`).MatchString(piece) { return false } } + // 最后一段不能是全数字 + if regexp.MustCompile(`^(\d+)$`).MatchString(pieces[len(pieces)-1]) { + return false + } + return true } -// 转换线路列表 +// ConvertRoutesToMaps 转换线路列表 func ConvertRoutesToMaps(routes []*pb.DNSRoute) []maps.Map { result := []maps.Map{} for _, route := range routes { @@ -32,7 +44,7 @@ func ConvertRoutesToMaps(routes []*pb.DNSRoute) []maps.Map { return result } -// 筛选线路 +// FilterRoutes 筛选线路 func FilterRoutes(routes []*pb.DNSRoute, allRoutes []*pb.DNSRoute) []*pb.DNSRoute { routeCodes := []string{} for _, route := range allRoutes { @@ -46,3 +58,84 @@ func FilterRoutes(routes []*pb.DNSRoute, allRoutes []*pb.DNSRoute) []*pb.DNSRout } return result } + +// ValidateRecordName 校验记录名 +func ValidateRecordName(name string) bool { + if name == "*" || name == "@" || len(name) == 0 { + return true + } + + pieces := strings.Split(name, ".") + for _, piece := range pieces { + if piece == "-" || + strings.HasPrefix(piece, "-") || + strings.HasSuffix(piece, "-") || + strings.Contains(piece, "--") || + len(piece) > 63 || + !regexp.MustCompile(`^[a-z0-9-]+$`).MatchString(piece) { + return false + } + } + return true +} + +// ValidateRecordValue 校验记录值 +func ValidateRecordValue(recordType dnsconfigs.RecordType, value string) (message string, ok bool) { + switch recordType { + case dnsconfigs.RecordTypeA: + if !regexp.MustCompile(`^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$`).MatchString(value) { + message = "请输入正确格式的IP" + return + } + if net.ParseIP(value) == nil { + message = "请输入正确格式的IP" + return + } + case dnsconfigs.RecordTypeCNAME: + if strings.HasSuffix(value, ".") { + value = value[:len(value)-1] + } + if !strings.Contains(value, ".") || !ValidateDomainFormat(value) { + message = "请输入正确的域名" + return + } + case dnsconfigs.RecordTypeAAAA: + if !strings.Contains(value, ":") { + message = "请输入正确格式的IPv6地址" + return + } + if net.ParseIP(value) == nil { + message = "请输入正确格式的IPv6地址" + return + } + case dnsconfigs.RecordTypeNS: + if strings.HasSuffix(value, ".") { + value = value[:len(value)-1] + } + if !strings.Contains(value, ".") || !ValidateDomainFormat(value) { + message = "请输入正确的DNS服务器域名" + return + } + case dnsconfigs.RecordTypeMX: + if strings.HasSuffix(value, ".") { + value = value[:len(value)-1] + } + if !strings.Contains(value, ".") || !ValidateDomainFormat(value) { + message = "请输入正确的邮件服务器域名" + return + } + case dnsconfigs.RecordTypeTXT: + if len(value) > 512 { + message = "文本长度不能超出512字节" + return + } + } + + if len(value) > 512 { + message = "记录值长度不能超出512字节" + return + } + + ok = true + return +} diff --git a/internal/web/actions/default/dns/domains/domainutils/utils_test.go b/internal/web/actions/default/dns/domains/domainutils/utils_test.go new file mode 100644 index 00000000..32857ab6 --- /dev/null +++ b/internal/web/actions/default/dns/domains/domainutils/utils_test.go @@ -0,0 +1,61 @@ +// Copyright 2021 Liuxiangchao iwind.liu@gmail.com. All rights reserved. + +package domainutils + +import ( + "github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs" + "github.com/iwind/TeaGo/assert" + "testing" +) + +func TestValidateRecordValue(t *testing.T) { + a := assert.NewAssertion(t) + + // A + { + _, ok := ValidateRecordValue(dnsconfigs.RecordTypeA, "1.2") + a.IsFalse(ok) + } + { + _, ok := ValidateRecordValue(dnsconfigs.RecordTypeA, "1.2.3.400") + a.IsFalse(ok) + } + { + _, ok := ValidateRecordValue(dnsconfigs.RecordTypeA, "1.2.3.4") + a.IsTrue(ok) + } + + // CNAME + { + _, ok := ValidateRecordValue(dnsconfigs.RecordTypeCNAME, "example.com") + a.IsTrue(ok) + } + { + _, ok := ValidateRecordValue(dnsconfigs.RecordTypeCNAME, "example.com.") + a.IsTrue(ok) + } + { + _, ok := ValidateRecordValue(dnsconfigs.RecordTypeCNAME, "hello, world") + a.IsFalse(ok) + } + + // AAAA + { + _, ok := ValidateRecordValue(dnsconfigs.RecordTypeAAAA, "1.2.3.4") + a.IsFalse(ok) + } + { + _, ok := ValidateRecordValue(dnsconfigs.RecordTypeAAAA, "2001:0db8:85a3:0000:0000:8a2e:0370:7334") + a.IsTrue(ok) + } + + // NS + { + _, ok := ValidateRecordValue(dnsconfigs.RecordTypeNS, "1.2.3.4") + a.IsFalse(ok) + } + { + _, ok := ValidateRecordValue(dnsconfigs.RecordTypeNS, "example.com") + a.IsTrue(ok) + } +} diff --git a/internal/web/actions/default/ns/domains/create.go b/internal/web/actions/default/ns/domains/create.go index 4564640b..b0643861 100644 --- a/internal/web/actions/default/ns/domains/create.go +++ b/internal/web/actions/default/ns/domains/create.go @@ -7,6 +7,7 @@ import ( "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" + "strings" ) type CreateAction struct { @@ -34,6 +35,8 @@ func (this *CreateAction) RunPost(params struct { this.CreateLogInfo("创建域名 %d", domainId) }() + params.Name = strings.ToLower(params.Name) + params.Must. Field("name", params.Name). Require("请输入域名"). diff --git a/internal/web/actions/default/ns/domains/records/createPopup.go b/internal/web/actions/default/ns/domains/records/createPopup.go index d1e25d2e..d389646c 100644 --- a/internal/web/actions/default/ns/domains/records/createPopup.go +++ b/internal/web/actions/default/ns/domains/records/createPopup.go @@ -4,6 +4,7 @@ package records import ( "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils" "github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" @@ -63,6 +64,17 @@ func (this *CreatePopupAction) RunPost(params struct { this.CreateLogInfo("创建域名记录 %d", recordId) }() + // 校验记录名 + if !domainutils.ValidateRecordName(params.Name) { + this.FailField("name", "请输入正确的记录名") + } + + // 校验记录值 + message, ok := domainutils.ValidateRecordValue(params.Type, params.Value) + if !ok { + this.FailField("value", "记录值错误:"+message) + } + createResp, err := this.RPC().NSRecordRPC().CreateNSRecord(this.AdminContext(), &pb.CreateNSRecordRequest{ NsDomainId: params.DomainId, Description: params.Description, diff --git a/internal/web/actions/default/ns/domains/records/updatePopup.go b/internal/web/actions/default/ns/domains/records/updatePopup.go index ecb4caca..3ad93702 100644 --- a/internal/web/actions/default/ns/domains/records/updatePopup.go +++ b/internal/web/actions/default/ns/domains/records/updatePopup.go @@ -4,6 +4,7 @@ package records import ( "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils" "github.com/TeaOSLab/EdgeCommon/pkg/dnsconfigs" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" @@ -87,6 +88,17 @@ func (this *UpdatePopupAction) RunPost(params struct { }) { this.CreateLogInfo("修改域名记录 %d", params.RecordId) + // 校验记录名 + if !domainutils.ValidateRecordName(params.Name) { + this.FailField("name", "请输入正确的记录名") + } + + // 校验记录值 + message, ok := domainutils.ValidateRecordValue(params.Type, params.Value) + if !ok { + this.FailField("value", "记录值错误:"+message) + } + _, err := this.RPC().NSRecordRPC().UpdateNSRecord(this.AdminContext(), &pb.UpdateNSRecordRequest{ NsRecordId: params.RecordId, Description: params.Description, diff --git a/internal/web/actions/default/ns/domains/update.go b/internal/web/actions/default/ns/domains/update.go index f0b0bcb4..d78b0f82 100644 --- a/internal/web/actions/default/ns/domains/update.go +++ b/internal/web/actions/default/ns/domains/update.go @@ -4,7 +4,6 @@ package domains import ( "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" - "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/default/dns/domains/domainutils" "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/maps" @@ -57,7 +56,6 @@ func (this *UpdateAction) RunGet(params struct { func (this *UpdateAction) RunPost(params struct { DomainId int64 - Name string ClusterId int64 UserId int64 IsOn bool @@ -68,15 +66,6 @@ func (this *UpdateAction) RunPost(params struct { this.CreateLogInfo("修改域名 %d", params.DomainId) params.Must. - Field("name", params.Name). - Require("请输入域名"). - Expect(func() (message string, success bool) { - success = domainutils.ValidateDomainFormat(params.Name) - if !success { - message = "请输入正确的域名" - } - return - }). Field("clusterId", params.ClusterId). Gt(0, "请选择所属集群") @@ -84,7 +73,6 @@ func (this *UpdateAction) RunPost(params struct { NsDomainId: params.DomainId, NsClusterId: params.ClusterId, UserId: params.UserId, - Name: params.Name, IsOn: params.IsOn, }) if err != nil { diff --git a/web/public/js/components/ns/ns-route-ranges-box.js b/web/public/js/components/ns/ns-route-ranges-box.js index 3d6dbe94..605486e7 100644 --- a/web/public/js/components/ns/ns-route-ranges-box.js +++ b/web/public/js/components/ns/ns-route-ranges-box.js @@ -51,8 +51,10 @@ Vue.component("ns-route-ranges-box", { this.ranges.push({ type: "ipRange", - ipFrom: this.ipRangeFrom, - ipTo: this.ipRangeTo + params: { + ipFrom: this.ipRangeFrom, + ipTo: this.ipRangeTo + } }) this.cancelIPRange() }, @@ -76,7 +78,7 @@ Vue.component("ns-route-ranges-box", {
diff --git a/web/views/@default/ns/clusters/cluster/createNode.html b/web/views/@default/ns/clusters/cluster/createNode.html index 74ab654e..4a5ddc50 100644 --- a/web/views/@default/ns/clusters/cluster/createNode.html +++ b/web/views/@default/ns/clusters/cluster/createNode.html @@ -1,5 +1,5 @@ {$layout} -{$template "../menu"} +{$template "menu"} \ No newline at end of file diff --git a/web/views/@default/ns/clusters/cluster/node/index.html b/web/views/@default/ns/clusters/cluster/node/index.html index 07212787..7237951d 100644 --- a/web/views/@default/ns/clusters/cluster/node/index.html +++ b/web/views/@default/ns/clusters/cluster/node/index.html @@ -39,12 +39,12 @@需要部署域名服务的集群。
当前域名所属的平台用户。
需要部署域名服务的集群。
当前域名所属的平台用户。