From 5fb299073559209fdc3a52e088b7656d9e96f457 Mon Sep 17 00:00:00 2001 From: GoEdgeLab Date: Mon, 6 May 2024 20:25:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E7=BD=91=E7=AB=99WAF=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E5=8F=AF=E4=BB=A5=E5=AF=BC=E5=87=BA=E5=92=8C=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E8=A7=84=E5=88=99=E9=9B=86=E4=BB=A3=E7=A0=81=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BF=AE=E6=94=B9=E8=A7=84=E5=88=99=E9=9B=86?= =?UTF-8?q?=E4=BA=A4=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../servers/components/waf/createSetPopup.go | 134 +++++++++++++----- .../default/servers/components/waf/init.go | 1 + .../servers/components/waf/setCodePopup.go | 57 ++++++++ web/views/@default/@layout.css | 2 +- web/views/@default/@layout.less | 2 +- .../components/waf/createSetPopup.html | 73 ++++++---- .../servers/components/waf/createSetPopup.js | 12 ++ .../servers/components/waf/setCodePopup.html | 10 ++ .../servers/components/waf/setCodePopup.js | 5 + .../servers/server/settings/waf/group.html | 59 ++++---- .../servers/server/settings/waf/group.js | 36 ++++- 11 files changed, 293 insertions(+), 98 deletions(-) create mode 100644 internal/web/actions/default/servers/components/waf/setCodePopup.go create mode 100644 web/views/@default/servers/components/waf/setCodePopup.html create mode 100644 web/views/@default/servers/components/waf/setCodePopup.js diff --git a/internal/web/actions/default/servers/components/waf/createSetPopup.go b/internal/web/actions/default/servers/components/waf/createSetPopup.go index 9b4c1414..88cb2ceb 100644 --- a/internal/web/actions/default/servers/components/waf/createSetPopup.go +++ b/internal/web/actions/default/servers/components/waf/createSetPopup.go @@ -73,12 +73,19 @@ func (this *CreateSetPopupAction) RunGet(params struct { func (this *CreateSetPopupAction) RunPost(params struct { GroupId int64 - Name string + Name string + + FormType string + + // normal RulesJSON []byte Connector string ActionsJSON []byte IgnoreLocal bool + // code + Code string + Must *actions.Must }) { groupConfig, err := dao.SharedHTTPFirewallRuleGroupDAO.FindRuleGroupConfig(this.AdminContext(), params.GroupId) @@ -88,53 +95,105 @@ func (this *CreateSetPopupAction) RunPost(params struct { } if groupConfig == nil { this.Fail("找不到分组,Id:" + strconv.FormatInt(params.GroupId, 10)) + return } params.Must. Field("name", params.Name). Require("请输入规则集名称") - if len(params.RulesJSON) == 0 { - this.Fail("请添加至少一个规则") - } - rules := []*firewallconfigs.HTTPFirewallRule{} - err = json.Unmarshal(params.RulesJSON, &rules) - if err != nil { - this.ErrorPage(err) - return - } - if len(rules) == 0 { - this.Fail("请添加至少一个规则") - } - - var actionConfigs = []*firewallconfigs.HTTPFirewallActionConfig{} - if len(params.ActionsJSON) > 0 { - err = json.Unmarshal(params.ActionsJSON, &actionConfigs) + var setConfigJSON []byte + if params.FormType == "normal" { + if len(params.RulesJSON) == 0 { + this.Fail("请添加至少一个规则") + return + } + var rules = []*firewallconfigs.HTTPFirewallRule{} + err = json.Unmarshal(params.RulesJSON, &rules) if err != nil { this.ErrorPage(err) return } - } - if len(actionConfigs) == 0 { - this.Fail("请添加至少一个动作") - } + if len(rules) == 0 { + this.Fail("请添加至少一个规则") + return + } - setConfig := &firewallconfigs.HTTPFirewallRuleSet{ - Id: 0, - IsOn: true, - Name: params.Name, - Code: "", - Description: "", - Connector: params.Connector, - RuleRefs: nil, - Rules: rules, - Actions: actionConfigs, - IgnoreLocal: params.IgnoreLocal, - } + var actionConfigs = []*firewallconfigs.HTTPFirewallActionConfig{} + if len(params.ActionsJSON) > 0 { + err = json.Unmarshal(params.ActionsJSON, &actionConfigs) + if err != nil { + this.ErrorPage(err) + return + } + } + if len(actionConfigs) == 0 { + this.Fail("请添加至少一个动作") + return + } - setConfigJSON, err := json.Marshal(setConfig) - if err != nil { - this.ErrorPage(err) + var setConfig = &firewallconfigs.HTTPFirewallRuleSet{ + Id: 0, + IsOn: true, + Name: params.Name, + Code: "", + Description: "", + Connector: params.Connector, + RuleRefs: nil, + Rules: rules, + Actions: actionConfigs, + IgnoreLocal: params.IgnoreLocal, + } + + setConfigJSON, err = json.Marshal(setConfig) + if err != nil { + this.ErrorPage(err) + return + } + } else if params.FormType == "code" { + var codeJSON = []byte(params.Code) + if len(codeJSON) == 0 { + this.FailField("code", "请输入规则集代码") + return + } + + var setConfig = &firewallconfigs.HTTPFirewallRuleSet{} + err = json.Unmarshal(codeJSON, setConfig) + if err != nil { + this.FailField("code", "解析规则集代码失败:"+err.Error()) + return + } + + if len(setConfig.Rules) == 0 { + this.FailField("code", "规则集代码中必须包含至少一个规则") + return + } + + if len(setConfig.Actions) == 0 { + this.FailField("code", "规则集代码中必须包含至少一个动作") + return + } + + setConfig.Name = params.Name + setConfig.IsOn = true + + // 重置ID + setConfig.Id = 0 + + setConfig.RuleRefs = nil + for _, rule := range setConfig.Rules { + rule.Id = 0 + } + + err = setConfig.Init() + if err != nil { + this.FailField("code", "校验规则集代码失败:"+err.Error()) + return + } + + setConfigJSON, err = json.Marshal(setConfig) + } else { + this.Fail("错误的参数'formType': " + params.FormType) return } @@ -154,6 +213,7 @@ func (this *CreateSetPopupAction) RunPost(params struct { this.ErrorPage(err) return } + _, err = this.RPC().HTTPFirewallRuleGroupRPC().UpdateHTTPFirewallRuleGroupSets(this.AdminContext(), &pb.UpdateHTTPFirewallRuleGroupSetsRequest{ FirewallRuleGroupId: params.GroupId, FirewallRuleSetsJSON: setRefsJSON, @@ -163,5 +223,7 @@ func (this *CreateSetPopupAction) RunPost(params struct { return } + this.Data["setId"] = createUpdateResp.FirewallRuleSetId + this.Success() } diff --git a/internal/web/actions/default/servers/components/waf/init.go b/internal/web/actions/default/servers/components/waf/init.go index 84bd73df..a4e67ffe 100644 --- a/internal/web/actions/default/servers/components/waf/init.go +++ b/internal/web/actions/default/servers/components/waf/init.go @@ -39,6 +39,7 @@ func init() { Post("/updateSetOn", new(UpdateSetOnAction)). Post("/deleteSet", new(DeleteSetAction)). GetPost("/updateSetPopup", new(UpdateSetPopupAction)). + Get("/setCodePopup", new(SetCodePopupAction)). Post("/count", new(CountAction)). Get("/selectPopup", new(SelectPopupAction)). Post("/testRegexp", new(TestRegexpAction)). diff --git a/internal/web/actions/default/servers/components/waf/setCodePopup.go b/internal/web/actions/default/servers/components/waf/setCodePopup.go new file mode 100644 index 00000000..4019424d --- /dev/null +++ b/internal/web/actions/default/servers/components/waf/setCodePopup.go @@ -0,0 +1,57 @@ +// Copyright 2024 GoEdge CDN goedge.cdn@gmail.com. All rights reserved. Official site: https://goedge.cn . + +package waf + +import ( + "encoding/json" + "github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils" + "github.com/TeaOSLab/EdgeCommon/pkg/rpc/pb" + "github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs/firewallconfigs" +) + +type SetCodePopupAction struct { + actionutils.ParentAction +} + +func (this *SetCodePopupAction) Init() { + this.Nav("", "", "") +} + +func (this *SetCodePopupAction) RunGet(params struct { + SetId int64 +}) { + setResp, err := this.RPC().HTTPFirewallRuleSetRPC().FindEnabledHTTPFirewallRuleSetConfig(this.AdminContext(), &pb.FindEnabledHTTPFirewallRuleSetConfigRequest{FirewallRuleSetId: params.SetId}) + if err != nil { + this.ErrorPage(err) + return + } + + if len(setResp.FirewallRuleSetJSON) == 0 { + this.NotFound("httpFirewallRuleSet", params.SetId) + return + } + + var ruleSet = &firewallconfigs.HTTPFirewallRuleSet{} + err = json.Unmarshal(setResp.FirewallRuleSetJSON, ruleSet) + if err != nil { + this.ErrorPage(err) + return + } + ruleSet.RuleRefs = nil + ruleSet.Id = 0 + for _, rule := range ruleSet.Rules { + rule.Id = 0 + } + + this.Data["setName"] = ruleSet.Name + + codeJSON, err := json.MarshalIndent(ruleSet, "", " ") + if err != nil { + this.ErrorPage(err) + return + } + + this.Data["code"] = string(codeJSON) + + this.Show() +} diff --git a/web/views/@default/@layout.css b/web/views/@default/@layout.css index ee818d40..f697c8af 100644 --- a/web/views/@default/@layout.css +++ b/web/views/@default/@layout.css @@ -280,7 +280,7 @@ p.margin { width: 9em; } .op.four { - width: 10em; + width: 12em; } /** 主菜单 **/ .main-menu { diff --git a/web/views/@default/@layout.less b/web/views/@default/@layout.less index 8ef7ae38..3f3af050 100644 --- a/web/views/@default/@layout.less +++ b/web/views/@default/@layout.less @@ -127,7 +127,7 @@ div.margin, p.margin { } .op.four { - width: 10em; + width: 12em; } /** 主菜单 **/ diff --git a/web/views/@default/servers/components/waf/createSetPopup.html b/web/views/@default/servers/components/waf/createSetPopup.html index bee02c1f..d6176acd 100644 --- a/web/views/@default/servers/components/waf/createSetPopup.html +++ b/web/views/@default/servers/components/waf/createSetPopup.html @@ -6,42 +6,57 @@
+ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
规则集名称 * -

可以用来描述当前规则集用途。

+

可以用来描述当前规则集用途。[使用代码][切换到常规表单]

规则 * - -
规则之间的关系 * - -

{{selectedConnectorDescription}}

-
执行动作 * - -
忽略局域网IP - -

选中后表示如果请求来自局域网IP,则直接跳过当前规则集。

-
规则 * + +
规则之间的关系 * + +

{{selectedConnectorDescription}}

+
执行动作 * + +
忽略局域网IP + +

选中后表示如果请求来自局域网IP,则直接跳过当前规则集。

+
规则集代码 * + +
\ No newline at end of file diff --git a/web/views/@default/servers/components/waf/createSetPopup.js b/web/views/@default/servers/components/waf/createSetPopup.js index ba4be577..8a2f9ef2 100644 --- a/web/views/@default/servers/components/waf/createSetPopup.js +++ b/web/views/@default/servers/components/waf/createSetPopup.js @@ -40,4 +40,16 @@ Tea.context(function () { } return group.sets } + + // 使用代码 + this.useCode = false + this.switchToCode = function () { + this.useCode = !this.useCode + + if (this.useCode) { + this.$delay(function () { + this.$refs.codeInput.focus() + }) + } + } }) \ No newline at end of file diff --git a/web/views/@default/servers/components/waf/setCodePopup.html b/web/views/@default/servers/components/waf/setCodePopup.html new file mode 100644 index 00000000..2df67679 --- /dev/null +++ b/web/views/@default/servers/components/waf/setCodePopup.html @@ -0,0 +1,10 @@ +{$layout "layout_popup"} + +

规则集 “{{setName}}” 代码

+ +
+ +

你可以将此段代码复制并在创建规则集的时候使用。

+ + +
\ No newline at end of file diff --git a/web/views/@default/servers/components/waf/setCodePopup.js b/web/views/@default/servers/components/waf/setCodePopup.js new file mode 100644 index 00000000..e0774f38 --- /dev/null +++ b/web/views/@default/servers/components/waf/setCodePopup.js @@ -0,0 +1,5 @@ +Tea.context(function () { + this.closePopup = function () { + teaweb.closePopup() + } +}) \ No newline at end of file diff --git a/web/views/@default/servers/server/settings/waf/group.html b/web/views/@default/servers/server/settings/waf/group.html index 2e917ab6..8ab80002 100644 --- a/web/views/@default/servers/server/settings/waf/group.html +++ b/web/views/@default/servers/server/settings/waf/group.html @@ -26,7 +26,7 @@ -

规则集[添加规则集]

+

规则集[添加规则集]

暂时还没有规则。

@@ -34,36 +34,41 @@ - + - + - - - - - - - - + + + + + + + +
规则集名称 规则规则关系规则关系 动作操作操作
{{set.name}} -

- -

-
-
- -
- 暂时还没有规则 -
- - ({{set.connector.toUpperCase()}}) - - - - 修改   停用启用   删除 -
{{set.name}} +

+ +

+
+
+ +
+ 暂时还没有规则 +
+ + + ({{set.connector.toUpperCase()}}) + + - + + + + 修改   停用启用   + 代码   + 删除 +
diff --git a/web/views/@default/servers/server/settings/waf/group.js b/web/views/@default/servers/server/settings/waf/group.js index 351312bd..944b3ce7 100644 --- a/web/views/@default/servers/server/settings/waf/group.js +++ b/web/views/@default/servers/server/settings/waf/group.js @@ -1,4 +1,6 @@ Tea.context(function () { + this.highlightedSetId = 0 + this.$delay(function () { let that = this sortTable(function () { @@ -17,6 +19,14 @@ Tea.context(function () { teaweb.successToast("排序保存成功") }) }) + + // 跳转到刚操作成功的记录集 + let opSetId = localStorage.getItem("goHTTPFirewallRuleSet") + if (opSetId != null) { + this.highlightedSetId = opSetId + localStorage.removeItem("goHTTPFirewallRuleSet") + document.querySelector("*[data-set-id='" + opSetId + "']").scrollIntoView({behavior: 'smooth'}) + } }) // 更改分组 @@ -33,12 +43,13 @@ Tea.context(function () { // 创建规则集 this.createSet = function (groupId) { + let that = this teaweb.popup("/servers/components/waf/createSetPopup?firewallPolicyId=" + this.firewallPolicyId + "&groupId=" + groupId + "&type=" + this.type, { width: "50em", height: "40em", - callback: function () { + callback: function (resp) { teaweb.success("保存成功", function () { - window.location.reload() + that.goSetId(resp.data.setId) }) } }) @@ -46,12 +57,13 @@ Tea.context(function () { // 修改规则集 this.updateSet = function (setId) { + let that = this teaweb.popup("/servers/components/waf/updateSetPopup?firewallPolicyId=" + this.firewallPolicyId + "&groupId=" + this.group.id + "&type=" + this.type + "&setId=" + setId, { width: "50em", height: "40em", callback: function () { teaweb.success("保存成功", function () { - window.location.reload() + that.goSetId(setId) }) } }) @@ -59,12 +71,15 @@ Tea.context(function () { // 停用|启用规则集 this.updateSetOn = function (setId, isOn) { + let that = this this.$post("/servers/components/waf/updateSetOn") .params({ setId: setId, isOn: isOn ? 1 : 0 }) - .refresh() + .success(function () { + that.goSetId(setId) + }) } // 删除规则集 @@ -79,4 +94,17 @@ Tea.context(function () { .refresh() }) } + + // 显示规则集代码 + this.showSetCode = function (setId) { + teaweb.popup("/servers/components/waf/setCodePopup?setId=" + setId, { + height: "26em" + }) + } + + // 跳转到刚操作的记录集ID + this.goSetId = function (setId) { + localStorage.setItem("goHTTPFirewallRuleSet", setId) + teaweb.reload() + } }) \ No newline at end of file