mirror of
				https://github.com/TeaOSLab/EdgeAdmin.git
				synced 2025-11-04 05:00:25 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			125 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package servers
 | 
						|
 | 
						|
import (
 | 
						|
	"github.com/TeaOSLab/EdgeAdmin/internal/web/actions/actionutils"
 | 
						|
	"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
 | 
						|
	"github.com/iwind/TeaGo/actions"
 | 
						|
	"github.com/iwind/TeaGo/maps"
 | 
						|
	"github.com/iwind/TeaGo/types"
 | 
						|
	"regexp"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
type AddPortPopupAction struct {
 | 
						|
	actionutils.ParentAction
 | 
						|
}
 | 
						|
 | 
						|
func (this *AddPortPopupAction) Init() {
 | 
						|
	this.Nav("", "", "")
 | 
						|
}
 | 
						|
 | 
						|
func (this *AddPortPopupAction) RunGet(params struct {
 | 
						|
	ServerType   string
 | 
						|
	Protocol     string
 | 
						|
	From         string
 | 
						|
	SupportRange bool
 | 
						|
}) {
 | 
						|
	this.Data["from"] = params.From
 | 
						|
 | 
						|
	protocols := serverconfigs.FindAllServerProtocolsForType(params.ServerType)
 | 
						|
	if len(params.Protocol) > 0 {
 | 
						|
		result := []maps.Map{}
 | 
						|
		for _, p := range protocols {
 | 
						|
			if p.GetString("code") == params.Protocol {
 | 
						|
				result = append(result, p)
 | 
						|
			}
 | 
						|
		}
 | 
						|
		protocols = result
 | 
						|
	}
 | 
						|
	this.Data["protocols"] = protocols
 | 
						|
 | 
						|
	this.Data["supportRange"] = params.SupportRange
 | 
						|
 | 
						|
	this.Show()
 | 
						|
}
 | 
						|
 | 
						|
func (this *AddPortPopupAction) RunPost(params struct {
 | 
						|
	SupportRange bool
 | 
						|
 | 
						|
	Protocol string
 | 
						|
	Address  string
 | 
						|
 | 
						|
	Must *actions.Must
 | 
						|
}) {
 | 
						|
	// 校验地址
 | 
						|
	addr := maps.Map{
 | 
						|
		"protocol":  params.Protocol,
 | 
						|
		"host":      "",
 | 
						|
		"portRange": "",
 | 
						|
		"minPort":   0,
 | 
						|
		"maxPort":   0,
 | 
						|
	}
 | 
						|
 | 
						|
	var portRegexp = regexp.MustCompile(`^\d+$`)
 | 
						|
	if portRegexp.MatchString(params.Address) { // 单个端口
 | 
						|
		addr["portRange"] = this.checkPort(params.Address)
 | 
						|
	} else if params.SupportRange && regexp.MustCompile(`^\d+\s*-\s*\d+$`).MatchString(params.Address) { // Port1-Port2
 | 
						|
		addr["portRange"], addr["minPort"], addr["maxPort"] = this.checkPortRange(params.Address)
 | 
						|
	} else if strings.Contains(params.Address, ":") { // IP:Port
 | 
						|
		index := strings.LastIndex(params.Address, ":")
 | 
						|
		addr["host"] = strings.TrimSpace(params.Address[:index])
 | 
						|
		port := strings.TrimSpace(params.Address[index+1:])
 | 
						|
		if portRegexp.MatchString(port) {
 | 
						|
			addr["portRange"] = this.checkPort(port)
 | 
						|
		} else if params.SupportRange && regexp.MustCompile(`^\d+\s*-\s*\d+$`).MatchString(port) { // Port1-Port2
 | 
						|
			addr["portRange"], addr["minPort"], addr["maxPort"] = this.checkPortRange(port)
 | 
						|
		} else {
 | 
						|
			this.FailField("address", "请输入正确的端口或者网络地址")
 | 
						|
		}
 | 
						|
	} else {
 | 
						|
		this.FailField("address", "请输入正确的端口或者网络地址")
 | 
						|
	}
 | 
						|
 | 
						|
	this.Data["address"] = addr
 | 
						|
	this.Success()
 | 
						|
}
 | 
						|
 | 
						|
func (this *AddPortPopupAction) checkPort(port string) (portRange string) {
 | 
						|
	var intPort = types.Int(port)
 | 
						|
	if intPort < 1 {
 | 
						|
		this.FailField("address", "端口号不能小于1")
 | 
						|
	}
 | 
						|
	if intPort > 65535 {
 | 
						|
		this.FailField("address", "端口号不能大于65535")
 | 
						|
	}
 | 
						|
	return port
 | 
						|
}
 | 
						|
 | 
						|
func (this *AddPortPopupAction) checkPortRange(port string) (portRange string, minPort int, maxPort int) {
 | 
						|
	var pieces = strings.Split(port, "-")
 | 
						|
	var piece1 = strings.TrimSpace(pieces[0])
 | 
						|
	var piece2 = strings.TrimSpace(pieces[1])
 | 
						|
	var port1 = types.Int(piece1)
 | 
						|
	var port2 = types.Int(piece2)
 | 
						|
 | 
						|
	if port1 < 1 {
 | 
						|
		this.FailField("address", "端口号不能小于1")
 | 
						|
	}
 | 
						|
	if port1 > 65535 {
 | 
						|
		this.FailField("address", "端口号不能大于65535")
 | 
						|
	}
 | 
						|
 | 
						|
	if port2 < 1 {
 | 
						|
		this.FailField("address", "端口号不能小于1")
 | 
						|
	}
 | 
						|
	if port2 > 65535 {
 | 
						|
		this.FailField("address", "端口号不能大于65535")
 | 
						|
	}
 | 
						|
 | 
						|
	if port1 > port2 {
 | 
						|
		port1, port2 = port2, port1
 | 
						|
	}
 | 
						|
 | 
						|
	return types.String(port1) + "-" + types.String(port2), port1, port2
 | 
						|
}
 |