mirror of
https://github.com/yhl452493373/frps-panel.git
synced 2026-04-04 06:16:59 +08:00
completely save config with toml format
This commit is contained in:
205
pkg/server/controller/utils.go
Normal file
205
pkg/server/controller/utils.go
Normal file
@@ -0,0 +1,205 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/BurntSushi/toml"
|
||||
"log"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
func filter(main TokenInfo, sub TokenInfo) bool {
|
||||
replaceSpaceUser := trimAllSpace.ReplaceAllString(sub.User, "")
|
||||
if len(replaceSpaceUser) != 0 {
|
||||
if !strings.Contains(main.User, replaceSpaceUser) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
replaceSpaceToken := trimAllSpace.ReplaceAllString(sub.Token, "")
|
||||
if len(replaceSpaceToken) != 0 {
|
||||
if !strings.Contains(main.Token, replaceSpaceToken) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
replaceSpaceComment := trimAllSpace.ReplaceAllString(sub.Comment, "")
|
||||
if len(replaceSpaceComment) != 0 {
|
||||
if !strings.Contains(main.Comment, replaceSpaceComment) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func trimString(str string) string {
|
||||
return strings.TrimSpace(str)
|
||||
}
|
||||
|
||||
func (c *HandleController) verifyToken(token TokenInfo, operate int) OperationResponse {
|
||||
response := OperationResponse{
|
||||
Success: true,
|
||||
Code: Success,
|
||||
Message: "operate success",
|
||||
}
|
||||
|
||||
var (
|
||||
validateExist = false
|
||||
validateNotExist = false
|
||||
validateUser = false
|
||||
validateToken = false
|
||||
validateComment = false
|
||||
validatePorts = false
|
||||
validateDomains = false
|
||||
validateSubdomains = false
|
||||
)
|
||||
|
||||
if operate == TOKEN_ADD {
|
||||
validateExist = true
|
||||
validateUser = true
|
||||
validateToken = true
|
||||
validateComment = true
|
||||
validatePorts = true
|
||||
validateDomains = true
|
||||
validateSubdomains = true
|
||||
} else if operate == TOKEN_UPDATE {
|
||||
validateNotExist = true
|
||||
validateUser = true
|
||||
validateToken = true
|
||||
validateComment = true
|
||||
validatePorts = true
|
||||
validateDomains = true
|
||||
validateSubdomains = true
|
||||
} else if operate == TOKEN_ENABLE || operate == TOKEN_DISABLE || operate == TOKEN_REMOVE {
|
||||
validateNotExist = true
|
||||
}
|
||||
|
||||
if validateUser && !userFormat.MatchString(token.User) {
|
||||
response.Success = false
|
||||
response.Code = UserFormatError
|
||||
response.Message = fmt.Sprintf("operate failed, user [%s] format error", token.User)
|
||||
log.Printf(response.Message)
|
||||
return response
|
||||
}
|
||||
|
||||
if validateExist {
|
||||
if _, exist := c.Tokens[token.User]; exist {
|
||||
response.Success = false
|
||||
response.Code = UserExist
|
||||
response.Message = fmt.Sprintf("operate failed, user [%s] exist ", token.User)
|
||||
log.Printf(response.Message)
|
||||
return response
|
||||
}
|
||||
}
|
||||
|
||||
if validateNotExist {
|
||||
if _, exist := c.Tokens[token.User]; !exist {
|
||||
response.Success = false
|
||||
response.Code = UserNotExist
|
||||
response.Message = fmt.Sprintf("operate failed, user [%s] not exist ", token.User)
|
||||
log.Printf(response.Message)
|
||||
return response
|
||||
}
|
||||
}
|
||||
|
||||
if validateToken && !tokenFormat.MatchString(token.Token) {
|
||||
response.Success = false
|
||||
response.Code = TokenFormatError
|
||||
response.Message = fmt.Sprintf("operate failed, token [%s] format error", token.Token)
|
||||
log.Printf(response.Message)
|
||||
return response
|
||||
}
|
||||
|
||||
trimmedComment := trimString(token.Comment)
|
||||
if validateComment && trimmedComment != "" && commentFormat.MatchString(trimmedComment) {
|
||||
response.Success = false
|
||||
response.Code = CommentFormatError
|
||||
response.Message = fmt.Sprintf("operate failed, comment [%s] format error", token.Comment)
|
||||
log.Printf(response.Message)
|
||||
return response
|
||||
}
|
||||
|
||||
if validatePorts {
|
||||
for _, port := range token.Ports {
|
||||
trimmedPort := trimString(port)
|
||||
if trimmedPort != "" && !portsFormatSingle.MatchString(trimmedPort) && !portsFormatRange.MatchString(trimmedPort) {
|
||||
response.Success = false
|
||||
response.Code = PortsFormatError
|
||||
response.Message = fmt.Sprintf("operate failed, ports [%v] format error", token.Ports)
|
||||
log.Printf(response.Message)
|
||||
return response
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if validateDomains {
|
||||
for _, domain := range token.Domains {
|
||||
trimmedDomain := trimString(domain)
|
||||
if trimmedDomain != "" && !domainFormat.MatchString(trimmedDomain) {
|
||||
response.Success = false
|
||||
response.Code = DomainsFormatError
|
||||
response.Message = fmt.Sprintf("operate failed, domains [%v] format error", token.Domains)
|
||||
log.Printf(response.Message)
|
||||
return response
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if validateSubdomains {
|
||||
for _, subdomain := range token.Subdomains {
|
||||
trimmedSubdomain := trimString(subdomain)
|
||||
if trimmedSubdomain != "" && !subdomainFormat.MatchString(trimmedSubdomain) {
|
||||
response.Success = false
|
||||
response.Code = SubdomainsFormatError
|
||||
response.Message = fmt.Sprintf("operate failed, subdomains [%v] format error", token.Subdomains)
|
||||
log.Printf(response.Message)
|
||||
return response
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return response
|
||||
}
|
||||
|
||||
func cleanStrings(originalStrings []string) []string {
|
||||
cleanedStrings := make([]string, len(originalStrings))
|
||||
for i, str := range originalStrings {
|
||||
cleanedStrings[i] = cleanString(str)
|
||||
}
|
||||
return cleanedStrings
|
||||
}
|
||||
|
||||
func cleanString(originalString string) string {
|
||||
return trimAllSpace.ReplaceAllString(originalString, "")
|
||||
}
|
||||
|
||||
func stringContains(element string, data []string) bool {
|
||||
for _, v := range data {
|
||||
if element == v {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func tokensList(tokens map[string]TokenInfo) Tokens {
|
||||
return Tokens{
|
||||
tokens,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *HandleController) saveToken() error {
|
||||
tokenFile, err := os.Create(c.TokensFile)
|
||||
if err != nil {
|
||||
log.Printf("error to crate file %v: %v", c.TokensFile, err)
|
||||
}
|
||||
|
||||
if err = toml.NewEncoder(tokenFile).Encode(tokensList(c.Tokens)); err != nil {
|
||||
log.Printf("error to encode tokens: %v", err)
|
||||
}
|
||||
if err = tokenFile.Close(); err != nil {
|
||||
log.Printf("error to close file %v: %v", c.TokensFile, err)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
Reference in New Issue
Block a user