diff --git a/web/public/js/components.js b/web/public/js/components.js index d0760fb7..2e9ca512 100644 --- a/web/public/js/components.js +++ b/web/public/js/components.js @@ -1409,7 +1409,13 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio
-`}),Vue.component("http-request-conds-box",{props:["v-conds"],data:function(){let e=this.vConds;return null==(e=null==e?{isOn:!0,connector:"or",groups:[]}:e).groups&&(e.groups=[]),{conds:e,components:window.REQUEST_COND_COMPONENTS}},methods:{change:function(){this.$emit("change",this.conds)},addGroup:function(){window.UPDATING_COND_GROUP=null;let t=this;teaweb.popup("/servers/server/settings/conds/addGroupPopup",{height:"30em",callback:function(e){t.conds.groups.push(e.data.group),t.change()}})},updateGroup:function(t,e){window.UPDATING_COND_GROUP=e;let i=this;teaweb.popup("/servers/server/settings/conds/addGroupPopup",{height:"30em",callback:function(e){Vue.set(i.conds.groups,t,e.data.group),i.change()}})},removeGroup:function(e){let t=this;teaweb.confirm("确定要删除这一组条件吗?",function(){t.conds.groups.$remove(e),t.change()})},typeName:function(i){var e=this.components.$find(function(e,t){return t.type==i.type});return null!=e?e.name:i.param+" "+i.operator}},template:`
+
`}),Vue.component("http-firewall-page-options-viewer",{props:["v-page-options"],data:function(){return{options:this.vPageOptions}},template:`
+ 默认设置 +
+ 状态码:{{options.status}} / 提示内容:[{{options.body.length}}字符] +
+
+`}),Vue.component("http-request-conds-box",{props:["v-conds"],data:function(){let e=this.vConds;return null==(e=null==e?{isOn:!0,connector:"or",groups:[]}:e).groups&&(e.groups=[]),{conds:e,components:window.REQUEST_COND_COMPONENTS}},methods:{change:function(){this.$emit("change",this.conds)},addGroup:function(){window.UPDATING_COND_GROUP=null;let t=this;teaweb.popup("/servers/server/settings/conds/addGroupPopup",{height:"30em",callback:function(e){t.conds.groups.push(e.data.group),t.change()}})},updateGroup:function(t,e){window.UPDATING_COND_GROUP=e;let i=this;teaweb.popup("/servers/server/settings/conds/addGroupPopup",{height:"30em",callback:function(e){Vue.set(i.conds.groups,t,e.data.group),i.change()}})},removeGroup:function(e){let t=this;teaweb.confirm("确定要删除这一组条件吗?",function(){t.conds.groups.$remove(e),t.change()})},typeName:function(i){var e=this.components.$find(function(e,t){return t.type==i.type});return null!=e?e.name:i.param+" "+i.operator}},template:`
@@ -1670,6 +1676,11 @@ Vue.component("traffic-map-box",{props:["v-stats","v-is-attack"],mounted:functio {{action.name}} ({{action.code.toUpperCase()}})
[{{action.options.status}}] + + [分组] + [网站] + [网站和策略] +
@@ -3168,21 +3179,30 @@ example2.com
`}),Vue.component("http-firewall-actions-box",{props:["v-actions","v-firewall-policy","v-action-configs","v-group-type"],mounted:function(){let o=this;Tea.action("/servers/iplists/levelOptions").success(function(e){o.ipListLevels=e.data.levels}).post(),this.loadJS(function(){let s=document.getElementById("actions-box");Sortable.create(s,{draggable:".label",handle:".icon.handle",onStart:function(){o.cancel()},onUpdate:function(e){let t=s.getElementsByClassName("label"),i=[];for(let e=0;e -403 Forbidden + + 403 Forbidden +

403 Forbidden

Connection: \${remoteAddr} (Client) -> \${serverAddr} (Server)
Request ID: \${requestId}
-`;return{id:t,actions:this.vActions,configs:e,isAdding:!1,editingIndex:-1,action:null,actionCode:"",actionOptions:{},ipListLevels:[],blockTimeout:"",blockTimeoutMax:"",blockScope:"global",captchaLife:"",captchaMaxFails:"",captchaFailBlockTimeout:"",get302Life:"",post307Life:"",recordIPType:"black",recordIPLevel:"critical",recordIPTimeout:"",recordIPListId:0,recordIPListName:"",tagTags:[],pageStatus:403,pageBody:i,defaultPageBody:i,redirectStatus:307,redirectURL:"",goGroupName:"",goGroupId:0,goGroup:null,goSetId:0,goSetName:"",jsCookieLife:"",jsCookieMaxFails:"",jsCookieFailBlockTimeout:"",statusOptions:[{code:301,text:"Moved Permanently"},{code:308,text:"Permanent Redirect"},{code:302,text:"Found"},{code:303,text:"See Other"},{code:307,text:"Temporary Redirect"}]}},watch:{actionCode:function(i){this.action=this.actions.$find(function(e,t){return t.code==i}),this.actionOptions={}},blockTimeout:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.timeout=0:this.actionOptions.timeout=e},blockTimeoutMax:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.timeoutMax=0:this.actionOptions.timeoutMax=e},blockScope:function(e){this.actionOptions.scope=e},captchaLife:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.life=0:this.actionOptions.life=e},captchaMaxFails:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.maxFails=0:this.actionOptions.maxFails=e},captchaFailBlockTimeout:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.failBlockTimeout=0:this.actionOptions.failBlockTimeout=e},get302Life:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.life=0:this.actionOptions.life=e},post307Life:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.life=0:this.actionOptions.life=e},recordIPType:function(e){this.recordIPListId=0},recordIPTimeout:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.timeout=0:this.actionOptions.timeout=e},goGroupId:function(i){let e=this.vFirewallPolicy.inbound.groups.$find(function(e,t){return t.id==i});null==(this.goGroup=e)?null==(e=this.vFirewallPolicy.outbound.groups.$find(function(e,t){return t.id==i}))?this.goGroupName="":(this.goGroup=e,this.goGroupName=e.name):this.goGroupName=e.name,this.goSetId=0,this.goSetName=""},goSetId:function(i){var e;null!=this.goGroup&&(null==(e=this.goGroup.sets.$find(function(e,t){return t.id==i}))?(this.goSetId=0,this.goSetName=""):this.goSetName=e.name)},jsCookieLife:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.life=0:this.actionOptions.life=e},jsCookieMaxFails:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.maxFails=0:this.actionOptions.maxFails=e},jsCookieFailBlockTimeout:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.failBlockTimeout=0:this.actionOptions.failBlockTimeout=e}},methods:{add:function(){this.action=null,this.actionCode="block",this.isAdding=!0,this.actionOptions={},this.blockTimeout="",this.blockTimeoutMax="",this.blockScope="global",this.captchaLife="",this.captchaMaxFails="",this.captchaFailBlockTimeout="",this.jsCookieLife="",this.jsCookieMaxFails="",this.jsCookieFailBlockTimeout="",this.get302Life="",this.post307Life="",this.recordIPLevel="critical",this.recordIPType="black",this.recordIPTimeout="",this.recordIPListId=0,this.recordIPListName="",this.tagTags=[],this.pageStatus=403,this.pageBody=this.defaultPageBody,this.redirectStatus=307,this.redirectURL="",this.goGroupName="",this.goGroupId=0,this.goGroup=null,this.goSetId=0,this.goSetName="";let i=this;this.action=this.vActions.$find(function(e,t){return t.code==i.actionCode}),this.scroll()},remove:function(e){this.isAdding=!1,this.editingIndex=-1,this.configs.$remove(e)},update:function(e,i){if(this.isAdding&&this.editingIndex==e)this.cancel();else{switch(this.add(),this.isAdding=!0,this.editingIndex=e,this.actionCode=i.code,this.action=this.actions.$find(function(e,t){return t.code==i.code}),i.code){case"block":this.blockTimeout="",this.blockTimeoutMax="",(null!=i.options.timeout||0 +`;return{id:t,actions:this.vActions,configs:e,isAdding:!1,editingIndex:-1,action:null,actionCode:"",actionOptions:{},ipListLevels:[],allowScope:"global",blockTimeout:"",blockTimeoutMax:"",blockScope:"global",captchaLife:"",captchaMaxFails:"",captchaFailBlockTimeout:"",get302Life:"",post307Life:"",recordIPType:"black",recordIPLevel:"critical",recordIPTimeout:"",recordIPListId:0,recordIPListName:"",tagTags:[],pageUseDefault:!0,pageStatus:403,pageBody:i,defaultPageBody:i,redirectStatus:307,redirectURL:"",goGroupName:"",goGroupId:0,goGroup:null,goSetId:0,goSetName:"",jsCookieLife:"",jsCookieMaxFails:"",jsCookieFailBlockTimeout:"",statusOptions:[{code:301,text:"Moved Permanently"},{code:308,text:"Permanent Redirect"},{code:302,text:"Found"},{code:303,text:"See Other"},{code:307,text:"Temporary Redirect"}]}},watch:{actionCode:function(i){this.action=this.actions.$find(function(e,t){return t.code==i}),this.actionOptions={}},allowScope:function(e){this.actionOptions.scope=e},blockTimeout:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.timeout=0:this.actionOptions.timeout=e},blockTimeoutMax:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.timeoutMax=0:this.actionOptions.timeoutMax=e},blockScope:function(e){this.actionOptions.scope=e},captchaLife:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.life=0:this.actionOptions.life=e},captchaMaxFails:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.maxFails=0:this.actionOptions.maxFails=e},captchaFailBlockTimeout:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.failBlockTimeout=0:this.actionOptions.failBlockTimeout=e},get302Life:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.life=0:this.actionOptions.life=e},post307Life:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.life=0:this.actionOptions.life=e},recordIPType:function(e){this.recordIPListId=0},recordIPTimeout:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.timeout=0:this.actionOptions.timeout=e},goGroupId:function(i){let e=this.vFirewallPolicy.inbound.groups.$find(function(e,t){return t.id==i});null==(this.goGroup=e)?null==(e=this.vFirewallPolicy.outbound.groups.$find(function(e,t){return t.id==i}))?this.goGroupName="":(this.goGroup=e,this.goGroupName=e.name):this.goGroupName=e.name,this.goSetId=0,this.goSetName=""},goSetId:function(i){var e;null!=this.goGroup&&(null==(e=this.goGroup.sets.$find(function(e,t){return t.id==i}))?(this.goSetId=0,this.goSetName=""):this.goSetName=e.name)},jsCookieLife:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.life=0:this.actionOptions.life=e},jsCookieMaxFails:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.maxFails=0:this.actionOptions.maxFails=e},jsCookieFailBlockTimeout:function(e){e=parseInt(e),isNaN(e)?this.actionOptions.failBlockTimeout=0:this.actionOptions.failBlockTimeout=e}},methods:{add:function(){this.action=null,this.actionCode="page",this.isAdding=!0,this.actionOptions={},this.allowScope="global",this.blockTimeout="",this.blockTimeoutMax="",this.blockScope="global",this.captchaLife="",this.captchaMaxFails="",this.captchaFailBlockTimeout="",this.jsCookieLife="",this.jsCookieMaxFails="",this.jsCookieFailBlockTimeout="",this.get302Life="",this.post307Life="",this.recordIPLevel="critical",this.recordIPType="black",this.recordIPTimeout="",this.recordIPListId=0,this.recordIPListName="",this.tagTags=[],this.pageUseDefault=!0,this.pageStatus=403,this.pageBody=this.defaultPageBody,this.redirectStatus=307,this.redirectURL="",this.goGroupName="",this.goGroupId=0,this.goGroup=null,this.goSetId=0,this.goSetName="";let i=this;this.action=this.vActions.$find(function(e,t){return t.code==i.actionCode}),this.scroll()},remove:function(e){this.isAdding=!1,this.editingIndex=-1,this.configs.$remove(e)},update:function(e,i){if(this.isAdding&&this.editingIndex==e)this.cancel();else{switch(this.add(),this.isAdding=!0,this.editingIndex=e,this.actionCode=i.code,this.action=this.actions.$find(function(e,t){return t.code==i.code}),i.code){case"block":this.blockTimeout="",this.blockTimeoutMax="",(null!=i.options.timeout||0
{{config.name}} ({{config.code.toUpperCase()}}) + + + [分组] + [网站] + [网站和策略] + + :封禁时长{{config.options.timeout}}-{{config.options.timeoutMax}} @@ -3209,7 +3229,7 @@ example2.com :{{config.options.tags.join(", ")}} - :[{{config.options.status}}] + :[{{config.options.status}}]  [默认页面] :{{config.options.url}} @@ -3221,7 +3241,7 @@ example2.com :{{config.options.groupName}} / {{config.options.setName}} - +   [所有网站] [当前网站] @@ -3244,6 +3264,21 @@ example2.com + +
+ + + + @@ -3411,11 +3446,17 @@ example2.com - + + + + + - - + + @@ -3886,7 +3927,38 @@ example2.com
有效范围 + +

跳过当前分组其他规则集,继续执行其他分组的规则集。

+

跳过当前网站所有的规则集。

+

跳过当前网站和网站对应WAF策略所有的规则集。

+
封禁范围
状态码 *使用默认提示 + +
状态码 *
网页内容
网页内容
-
`}),Vue.component("http-compression-config-box",{props:["v-compression-config","v-is-location","v-is-group"],mounted:function(){let e=this;sortLoad(function(){e.initSortableTypes()})},data:function(){let t=this.vCompressionConfig,e=(null==(t=null==t?{isPrior:!1,isOn:!1,useDefaultTypes:!0,types:["brotli","gzip","zstd","deflate"],level:5,decompressData:!1,gzipRef:null,deflateRef:null,brotliRef:null,minLength:{count:1,unit:"kb"},maxLength:{count:32,unit:"mb"},mimeTypes:["text/*","application/javascript","application/json","application/atom+xml","application/rss+xml","application/xhtml+xml","font/*","image/svg+xml"],extensions:[".js",".json",".html",".htm",".xml",".css",".woff2",".txt"],exceptExtensions:[".apk",".ipa"],conds:null,enablePartialContent:!1}:t).types&&(t.types=[]),null==t.mimeTypes&&(t.mimeTypes=[]),null==t.extensions&&(t.extensions=[]),[{name:"Gzip",code:"gzip",isOn:!0},{name:"Deflate",code:"deflate",isOn:!0},{name:"Brotli",code:"brotli",isOn:!0},{name:"ZSTD",code:"zstd",isOn:!0}]),i=[];return t.types.forEach(function(t){e.forEach(function(e){t==e.code&&(e.isOn=!0,i.push(e))})}),e.forEach(function(e){t.types.$contains(e.code)||(e.isOn=!1,i.push(e))}),{config:t,moreOptionsVisible:!1,allTypes:i}},watch:{"config.level":function(e){let t=parseInt(e);isNaN(t)||t<1?t=1:10 +`}),Vue.component("http-firewall-page-options",{props:["v-page-options"],data:function(){return{pageOptions:this.vPageOptions,status:this.vPageOptions.status,body:this.vPageOptions.body,defaultPageBody:` + + + 403 Forbidden + + + +

403 Forbidden By WAF

+
Connection: \${remoteAddr} (Client) -> \${serverAddr} (Server)
+
Request ID: \${requestId}
+ +`,isEditing:!1}},watch:{status:function(e){"string"==typeof e&&3!=e.length||(e=parseInt(e),isNaN(e)?this.pageOptions.status=403:this.pageOptions.status=e)},body:function(e){this.pageOptions.body=e}},methods:{edit:function(){this.isEditing=!this.isEditing}},template:`
+ + 状态码:{{status}} / 提示内容:[{{pageOptions.body.length}}字符][无] + + + + + + + + + + +
状态码 *
网页内容 + +

[使用模板]

+
+
+`}),Vue.component("http-compression-config-box",{props:["v-compression-config","v-is-location","v-is-group"],mounted:function(){let e=this;sortLoad(function(){e.initSortableTypes()})},data:function(){let t=this.vCompressionConfig,e=(null==(t=null==t?{isPrior:!1,isOn:!1,useDefaultTypes:!0,types:["brotli","gzip","zstd","deflate"],level:5,decompressData:!1,gzipRef:null,deflateRef:null,brotliRef:null,minLength:{count:1,unit:"kb"},maxLength:{count:32,unit:"mb"},mimeTypes:["text/*","application/javascript","application/json","application/atom+xml","application/rss+xml","application/xhtml+xml","font/*","image/svg+xml"],extensions:[".js",".json",".html",".htm",".xml",".css",".woff2",".txt"],exceptExtensions:[".apk",".ipa"],conds:null,enablePartialContent:!1}:t).types&&(t.types=[]),null==t.mimeTypes&&(t.mimeTypes=[]),null==t.extensions&&(t.extensions=[]),[{name:"Gzip",code:"gzip",isOn:!0},{name:"Deflate",code:"deflate",isOn:!0},{name:"Brotli",code:"brotli",isOn:!0},{name:"ZSTD",code:"zstd",isOn:!0}]),i=[];return t.types.forEach(function(t){e.forEach(function(e){t==e.code&&(e.isOn=!0,i.push(e))})}),e.forEach(function(e){t.types.$contains(e.code)||(e.isOn=!1,i.push(e))}),{config:t,moreOptionsVisible:!1,allTypes:i}},watch:{"config.level":function(e){let t=parseInt(e);isNaN(t)||t<1?t=1:10 diff --git a/web/public/js/components.src.js b/web/public/js/components.src.js index 5099076b..4020e060 100755 --- a/web/public/js/components.src.js +++ b/web/public/js/components.src.js @@ -3837,6 +3837,22 @@ Vue.component("http-stat-config-box", { ` }) +Vue.component("http-firewall-page-options-viewer", { + props: ["v-page-options"], + data: function () { + return { + options: this.vPageOptions + } + }, + template: `
+ 默认设置 +
+ 状态码:{{options.status}} / 提示内容:[{{options.body.length}}字符] +
+
+` +}) + Vue.component("http-request-conds-box", { props: ["v-conds"], data: function () { @@ -4563,6 +4579,11 @@ Vue.component("http-firewall-actions-view", { {{action.name}} ({{action.code.toUpperCase()}})
[{{action.options.status}}] + + [分组] + [网站] + [网站和策略] +
@@ -8925,10 +8946,12 @@ Vue.component("http-firewall-actions-box", { var defaultPageBody = ` -403 Forbidden + +\t403 Forbidden \t +

403 Forbidden

Connection: \${remoteAddr} (Client) -> \${serverAddr} (Server)
@@ -8953,6 +8976,8 @@ Vue.component("http-firewall-actions-box", { ipListLevels: [], // 动作参数 + allowScope: "global", + blockTimeout: "", blockTimeoutMax: "", blockScope: "global", @@ -8973,6 +8998,7 @@ Vue.component("http-firewall-actions-box", { tagTags: [], + pageUseDefault: true, pageStatus: 403, pageBody: defaultPageBody, defaultPageBody: defaultPageBody, @@ -9007,6 +9033,9 @@ Vue.component("http-firewall-actions-box", { }) this.actionOptions = {} }, + allowScope: function (v) { + this.actionOptions["scope"] = v + }, blockTimeout: function (v) { v = parseInt(v) if (isNaN(v)) { @@ -9141,11 +9170,13 @@ Vue.component("http-firewall-actions-box", { methods: { add: function () { this.action = null - this.actionCode = "block" + this.actionCode = "page" this.isAdding = true this.actionOptions = {} // 动作参数 + this.allowScope = "global" + this.blockTimeout = "" this.blockTimeoutMax = "" this.blockScope = "global" @@ -9170,6 +9201,7 @@ Vue.component("http-firewall-actions-box", { this.tagTags = [] + this.pageUseDefault = true this.pageStatus = 403 this.pageBody = this.defaultPageBody @@ -9229,6 +9261,11 @@ Vue.component("http-firewall-actions-box", { } break case "allow": + if (config.options != null && config.options.scope != null && config.options.scope.length > 0) { + this.allowScope = config.options.scope + } else { + this.allowScope = "global" + } break case "log": break @@ -9297,8 +9334,14 @@ Vue.component("http-firewall-actions-box", { } break case "page": + this.pageUseDefault = true this.pageStatus = 403 this.pageBody = this.defaultPageBody + if (typeof config.options.useDefault === "boolean") { + this.pageUseDefault = config.options.useDefault + } else { + this.pageUseDefault = false + } if (config.options.status != null) { this.pageStatus = config.options.status } @@ -9401,6 +9444,7 @@ Vue.component("http-firewall-actions-box", { } this.actionOptions = { + useDefault: this.pageUseDefault, status: pageStatus, body: this.pageBody } @@ -9533,6 +9577,13 @@ Vue.component("http-firewall-actions-box", {
{{config.name}} ({{config.code.toUpperCase()}}) + + + [分组] + [网站] + [网站和策略] + + :封禁时长{{config.options.timeout}}-{{config.options.timeoutMax}} @@ -9559,7 +9610,7 @@ Vue.component("http-firewall-actions-box", { :{{config.options.tags.join(", ")}} - :[{{config.options.status}}] + :[{{config.options.status}}]  [默认页面] :{{config.options.url}} @@ -9571,7 +9622,7 @@ Vue.component("http-firewall-actions-box", { :{{config.options.groupName}} / {{config.options.setName}} - +   [所有网站] [当前网站] @@ -9594,6 +9645,21 @@ Vue.component("http-firewall-actions-box", { + +
+ + + + @@ -9761,11 +9827,17 @@ Vue.component("http-firewall-actions-box", { - + + + + + - - + + @@ -10676,6 +10748,74 @@ Vue.component("http-pages-and-shutdown-box", { ` }) +Vue.component("http-firewall-page-options", { + props: ["v-page-options"], + data: function () { + var defaultPageBody = ` + + + 403 Forbidden + + + +

403 Forbidden By WAF

+
Connection: \${remoteAddr} (Client) -> \${serverAddr} (Server)
+
Request ID: \${requestId}
+ +` + + return { + pageOptions: this.vPageOptions, + status: this.vPageOptions.status, + body: this.vPageOptions.body, + defaultPageBody: defaultPageBody, + isEditing: false + } + }, + watch: { + status: function (v) { + if (typeof v === "string" && v.length != 3) { + return + } + let statusCode = parseInt(v) + if (isNaN(statusCode)) { + this.pageOptions.status = 403 + } else { + this.pageOptions.status = statusCode + } + }, + body: function (v) { + this.pageOptions.body = v + } + }, + methods: { + edit: function () { + this.isEditing = !this.isEditing + } + }, + template: `
+ + 状态码:{{status}} / 提示内容:[{{pageOptions.body.length}}字符][无] + +
有效范围 + +

跳过当前分组其他规则集,继续执行其他分组的规则集。

+

跳过当前网站所有的规则集。

+

跳过当前网站和网站对应WAF策略所有的规则集。

+
封禁范围
状态码 *使用默认提示 + +
状态码 *
网页内容
网页内容
+ + + + + + + + +
状态码 *
网页内容 + +

[使用模板]

+
+ +` +}) + // 压缩配置 Vue.component("http-compression-config-box", { props: ["v-compression-config", "v-is-location", "v-is-group"],