mirror of
https://github.com/TeaOSLab/EdgeNode.git
synced 2025-11-05 00:54:35 +08:00
83 lines
1.7 KiB
Go
83 lines
1.7 KiB
Go
|
|
package waf
|
||
|
|
|
||
|
|
import (
|
||
|
|
"github.com/iwind/TeaGo/maps"
|
||
|
|
"reflect"
|
||
|
|
)
|
||
|
|
|
||
|
|
var AllActions = []*ActionDefinition{
|
||
|
|
{
|
||
|
|
Name: "阻止",
|
||
|
|
Code: ActionBlock,
|
||
|
|
Instance: new(BlockAction),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "允许通过",
|
||
|
|
Code: ActionAllow,
|
||
|
|
Instance: new(AllowAction),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "允许并记录日志",
|
||
|
|
Code: ActionLog,
|
||
|
|
Instance: new(LogAction),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "Captcha验证码",
|
||
|
|
Code: ActionCaptcha,
|
||
|
|
Instance: new(CaptchaAction),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "跳到下一个规则分组",
|
||
|
|
Code: ActionGoGroup,
|
||
|
|
Instance: new(GoGroupAction),
|
||
|
|
Type: reflect.TypeOf(new(GoGroupAction)).Elem(),
|
||
|
|
},
|
||
|
|
{
|
||
|
|
Name: "跳到下一个规则集",
|
||
|
|
Code: ActionGoSet,
|
||
|
|
Instance: new(GoSetAction),
|
||
|
|
Type: reflect.TypeOf(new(GoSetAction)).Elem(),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
|
||
|
|
func FindActionInstance(action ActionString, options maps.Map) ActionInterface {
|
||
|
|
for _, def := range AllActions {
|
||
|
|
if def.Code == action {
|
||
|
|
if def.Type != nil {
|
||
|
|
// create new instance
|
||
|
|
ptrValue := reflect.New(def.Type)
|
||
|
|
instance := ptrValue.Interface().(ActionInterface)
|
||
|
|
|
||
|
|
if len(options) > 0 {
|
||
|
|
count := def.Type.NumField()
|
||
|
|
for i := 0; i < count; i++ {
|
||
|
|
field := def.Type.Field(i)
|
||
|
|
tag, ok := field.Tag.Lookup("yaml")
|
||
|
|
if ok {
|
||
|
|
v, ok := options[tag]
|
||
|
|
if ok && reflect.TypeOf(v) == field.Type {
|
||
|
|
ptrValue.Elem().FieldByName(field.Name).Set(reflect.ValueOf(v))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return instance
|
||
|
|
}
|
||
|
|
|
||
|
|
// return shared instance
|
||
|
|
return def.Instance
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func FindActionName(action ActionString) string {
|
||
|
|
for _, def := range AllActions {
|
||
|
|
if def.Code == action {
|
||
|
|
return def.Name
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return ""
|
||
|
|
}
|