mirror of
				https://github.com/TeaOSLab/EdgeNode.git
				synced 2025-11-04 16:00:25 +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 ""
 | 
						|
}
 |