Files
EdgeCommon/pkg/serverconfigs/firewallconfigs/http_firewall_rule.go
2023-08-11 15:26:59 +08:00

56 lines
1.8 KiB
Go

package firewallconfigs
import (
"fmt"
"regexp"
"strings"
)
var namedParamReg = regexp.MustCompile(`^\${\s*(.+)\s*}$`)
type HTTPFirewallRule struct {
Id int64 `yaml:"id" json:"id"`
IsOn bool `yaml:"isOn" json:"isOn"`
Param string `yaml:"param" json:"param"`
ParamFilters []*ParamFilter `yaml:"paramFilters" json:"paramFilters"`
Operator string `yaml:"operator" json:"operator"`
Value string `yaml:"value" json:"value"`
IsCaseInsensitive bool `yaml:"isCaseInsensitive" json:"isCaseInsensitive"`
IsComposed bool `yaml:"isComposed" json:"isComposed"`
CheckpointOptions map[string]interface{} `yaml:"checkpointOptions" json:"checkpointOptions"`
Description string `yaml:"description" json:"description"`
}
func (this *HTTPFirewallRule) Init() error {
// TODO 执行更严谨的校验
switch this.Operator {
case HTTPFirewallRuleOperatorMatch:
_, err := regexp.Compile(this.Value)
if err != nil {
return fmt.Errorf("regexp validate failed: %w, expression: %s", err, this.Value)
}
case HTTPFirewallRuleOperatorNotMatch:
_, err := regexp.Compile(this.Value)
if err != nil {
return fmt.Errorf("regexp validate failed: %w, expression: %s", err, this.Value)
}
}
return nil
}
func (this *HTTPFirewallRule) Prefix() string {
result := namedParamReg.FindStringSubmatch(this.Param)
if len(result) > 0 {
param := result[1]
pieces := strings.Split(param, ".")
return pieces[0]
}
return this.Param
}
func (this *HTTPFirewallRule) Summary() string {
return this.Param + " " + FindRuleOperatorName(this.Operator) + " " + this.Value
}