mirror of
				https://github.com/MHSanaei/3x-ui.git
				synced 2025-10-27 10:30:08 +00:00 
			
		
		
		
	Compare commits
	
		
			3 commits
		
	
	
		
			6a0d2e0a29
			...
			0bde51b91e
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 0bde51b91e | ||
|   | 280a22b57d | ||
|   | 315d852087 | 
					 21 changed files with 301 additions and 307 deletions
				
			
		|  | @ -26,7 +26,7 @@ const ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func initModels() error { | func initModels() error { | ||||||
| 	models := []interface{}{ | 	models := []any{ | ||||||
| 		&model.User{}, | 		&model.User{}, | ||||||
| 		&model.Inbound{}, | 		&model.Inbound{}, | ||||||
| 		&model.OutboundTraffics{}, | 		&model.OutboundTraffics{}, | ||||||
|  |  | ||||||
|  | @ -47,52 +47,52 @@ func InitLogger(level logging.Level) { | ||||||
| 	logger = newLogger | 	logger = newLogger | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Debug(args ...interface{}) { | func Debug(args ...any) { | ||||||
| 	logger.Debug(args...) | 	logger.Debug(args...) | ||||||
| 	addToBuffer("DEBUG", fmt.Sprint(args...)) | 	addToBuffer("DEBUG", fmt.Sprint(args...)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Debugf(format string, args ...interface{}) { | func Debugf(format string, args ...any) { | ||||||
| 	logger.Debugf(format, args...) | 	logger.Debugf(format, args...) | ||||||
| 	addToBuffer("DEBUG", fmt.Sprintf(format, args...)) | 	addToBuffer("DEBUG", fmt.Sprintf(format, args...)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Info(args ...interface{}) { | func Info(args ...any) { | ||||||
| 	logger.Info(args...) | 	logger.Info(args...) | ||||||
| 	addToBuffer("INFO", fmt.Sprint(args...)) | 	addToBuffer("INFO", fmt.Sprint(args...)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Infof(format string, args ...interface{}) { | func Infof(format string, args ...any) { | ||||||
| 	logger.Infof(format, args...) | 	logger.Infof(format, args...) | ||||||
| 	addToBuffer("INFO", fmt.Sprintf(format, args...)) | 	addToBuffer("INFO", fmt.Sprintf(format, args...)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Notice(args ...interface{}) { | func Notice(args ...any) { | ||||||
| 	logger.Notice(args...) | 	logger.Notice(args...) | ||||||
| 	addToBuffer("NOTICE", fmt.Sprint(args...)) | 	addToBuffer("NOTICE", fmt.Sprint(args...)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Noticef(format string, args ...interface{}) { | func Noticef(format string, args ...any) { | ||||||
| 	logger.Noticef(format, args...) | 	logger.Noticef(format, args...) | ||||||
| 	addToBuffer("NOTICE", fmt.Sprintf(format, args...)) | 	addToBuffer("NOTICE", fmt.Sprintf(format, args...)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Warning(args ...interface{}) { | func Warning(args ...any) { | ||||||
| 	logger.Warning(args...) | 	logger.Warning(args...) | ||||||
| 	addToBuffer("WARNING", fmt.Sprint(args...)) | 	addToBuffer("WARNING", fmt.Sprint(args...)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Warningf(format string, args ...interface{}) { | func Warningf(format string, args ...any) { | ||||||
| 	logger.Warningf(format, args...) | 	logger.Warningf(format, args...) | ||||||
| 	addToBuffer("WARNING", fmt.Sprintf(format, args...)) | 	addToBuffer("WARNING", fmt.Sprintf(format, args...)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Error(args ...interface{}) { | func Error(args ...any) { | ||||||
| 	logger.Error(args...) | 	logger.Error(args...) | ||||||
| 	addToBuffer("ERROR", fmt.Sprint(args...)) | 	addToBuffer("ERROR", fmt.Sprint(args...)) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Errorf(format string, args ...interface{}) { | func Errorf(format string, args ...any) { | ||||||
| 	logger.Errorf(format, args...) | 	logger.Errorf(format, args...) | ||||||
| 	addToBuffer("ERROR", fmt.Sprintf(format, args...)) | 	addToBuffer("ERROR", fmt.Sprintf(format, args...)) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -18,7 +18,7 @@ import ( | ||||||
| var defaultJson string | var defaultJson string | ||||||
| 
 | 
 | ||||||
| type SubJsonService struct { | type SubJsonService struct { | ||||||
| 	configJson       map[string]interface{} | 	configJson       map[string]any | ||||||
| 	defaultOutbounds []json_util.RawMessage | 	defaultOutbounds []json_util.RawMessage | ||||||
| 	fragment         string | 	fragment         string | ||||||
| 	noises           string | 	noises           string | ||||||
|  | @ -29,10 +29,10 @@ type SubJsonService struct { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewSubJsonService(fragment string, noises string, mux string, rules string, subService *SubService) *SubJsonService { | func NewSubJsonService(fragment string, noises string, mux string, rules string, subService *SubService) *SubJsonService { | ||||||
| 	var configJson map[string]interface{} | 	var configJson map[string]any | ||||||
| 	var defaultOutbounds []json_util.RawMessage | 	var defaultOutbounds []json_util.RawMessage | ||||||
| 	json.Unmarshal([]byte(defaultJson), &configJson) | 	json.Unmarshal([]byte(defaultJson), &configJson) | ||||||
| 	if outboundSlices, ok := configJson["outbounds"].([]interface{}); ok { | 	if outboundSlices, ok := configJson["outbounds"].([]any); ok { | ||||||
| 		for _, defaultOutbound := range outboundSlices { | 		for _, defaultOutbound := range outboundSlices { | ||||||
| 			jsonBytes, _ := json.Marshal(defaultOutbound) | 			jsonBytes, _ := json.Marshal(defaultOutbound) | ||||||
| 			defaultOutbounds = append(defaultOutbounds, jsonBytes) | 			defaultOutbounds = append(defaultOutbounds, jsonBytes) | ||||||
|  | @ -40,9 +40,9 @@ func NewSubJsonService(fragment string, noises string, mux string, rules string, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if rules != "" { | 	if rules != "" { | ||||||
| 		var newRules []interface{} | 		var newRules []any | ||||||
| 		routing, _ := configJson["routing"].(map[string]interface{}) | 		routing, _ := configJson["routing"].(map[string]any) | ||||||
| 		defaultRules, _ := routing["rules"].([]interface{}) | 		defaultRules, _ := routing["rules"].([]any) | ||||||
| 		json.Unmarshal([]byte(rules), &newRules) | 		json.Unmarshal([]byte(rules), &newRules) | ||||||
| 		defaultRules = append(newRules, defaultRules...) | 		defaultRules = append(newRules, defaultRules...) | ||||||
| 		routing["rules"] = defaultRules | 		routing["rules"] = defaultRules | ||||||
|  | @ -148,10 +148,10 @@ func (s *SubJsonService) getConfig(inbound *model.Inbound, client model.Client, | ||||||
| 	var newJsonArray []json_util.RawMessage | 	var newJsonArray []json_util.RawMessage | ||||||
| 	stream := s.streamData(inbound.StreamSettings) | 	stream := s.streamData(inbound.StreamSettings) | ||||||
| 
 | 
 | ||||||
| 	externalProxies, ok := stream["externalProxy"].([]interface{}) | 	externalProxies, ok := stream["externalProxy"].([]any) | ||||||
| 	if !ok || len(externalProxies) == 0 { | 	if !ok || len(externalProxies) == 0 { | ||||||
| 		externalProxies = []interface{}{ | 		externalProxies = []any{ | ||||||
| 			map[string]interface{}{ | 			map[string]any{ | ||||||
| 				"forceTls": "same", | 				"forceTls": "same", | ||||||
| 				"dest":     host, | 				"dest":     host, | ||||||
| 				"port":     float64(inbound.Port), | 				"port":     float64(inbound.Port), | ||||||
|  | @ -163,7 +163,7 @@ func (s *SubJsonService) getConfig(inbound *model.Inbound, client model.Client, | ||||||
| 	delete(stream, "externalProxy") | 	delete(stream, "externalProxy") | ||||||
| 
 | 
 | ||||||
| 	for _, ep := range externalProxies { | 	for _, ep := range externalProxies { | ||||||
| 		extPrxy := ep.(map[string]interface{}) | 		extPrxy := ep.(map[string]any) | ||||||
| 		inbound.Listen = extPrxy["dest"].(string) | 		inbound.Listen = extPrxy["dest"].(string) | ||||||
| 		inbound.Port = int(extPrxy["port"].(float64)) | 		inbound.Port = int(extPrxy["port"].(float64)) | ||||||
| 		newStream := stream | 		newStream := stream | ||||||
|  | @ -171,7 +171,7 @@ func (s *SubJsonService) getConfig(inbound *model.Inbound, client model.Client, | ||||||
| 		case "tls": | 		case "tls": | ||||||
| 			if newStream["security"] != "tls" { | 			if newStream["security"] != "tls" { | ||||||
| 				newStream["security"] = "tls" | 				newStream["security"] = "tls" | ||||||
| 				newStream["tslSettings"] = map[string]interface{}{} | 				newStream["tslSettings"] = map[string]any{} | ||||||
| 			} | 			} | ||||||
| 		case "none": | 		case "none": | ||||||
| 			if newStream["security"] != "none" { | 			if newStream["security"] != "none" { | ||||||
|  | @ -191,7 +191,7 @@ func (s *SubJsonService) getConfig(inbound *model.Inbound, client model.Client, | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		newOutbounds = append(newOutbounds, s.defaultOutbounds...) | 		newOutbounds = append(newOutbounds, s.defaultOutbounds...) | ||||||
| 		newConfigJson := make(map[string]interface{}) | 		newConfigJson := make(map[string]any) | ||||||
| 		for key, value := range s.configJson { | 		for key, value := range s.configJson { | ||||||
| 			newConfigJson[key] = value | 			newConfigJson[key] = value | ||||||
| 		} | 		} | ||||||
|  | @ -205,14 +205,14 @@ func (s *SubJsonService) getConfig(inbound *model.Inbound, client model.Client, | ||||||
| 	return newJsonArray | 	return newJsonArray | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *SubJsonService) streamData(stream string) map[string]interface{} { | func (s *SubJsonService) streamData(stream string) map[string]any { | ||||||
| 	var streamSettings map[string]interface{} | 	var streamSettings map[string]any | ||||||
| 	json.Unmarshal([]byte(stream), &streamSettings) | 	json.Unmarshal([]byte(stream), &streamSettings) | ||||||
| 	security, _ := streamSettings["security"].(string) | 	security, _ := streamSettings["security"].(string) | ||||||
| 	if security == "tls" { | 	if security == "tls" { | ||||||
| 		streamSettings["tlsSettings"] = s.tlsData(streamSettings["tlsSettings"].(map[string]interface{})) | 		streamSettings["tlsSettings"] = s.tlsData(streamSettings["tlsSettings"].(map[string]any)) | ||||||
| 	} else if security == "reality" { | 	} else if security == "reality" { | ||||||
| 		streamSettings["realitySettings"] = s.realityData(streamSettings["realitySettings"].(map[string]interface{})) | 		streamSettings["realitySettings"] = s.realityData(streamSettings["realitySettings"].(map[string]any)) | ||||||
| 	} | 	} | ||||||
| 	delete(streamSettings, "sockopt") | 	delete(streamSettings, "sockopt") | ||||||
| 
 | 
 | ||||||
|  | @ -233,17 +233,17 @@ func (s *SubJsonService) streamData(stream string) map[string]interface{} { | ||||||
| 	return streamSettings | 	return streamSettings | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *SubJsonService) removeAcceptProxy(setting interface{}) map[string]interface{} { | func (s *SubJsonService) removeAcceptProxy(setting any) map[string]any { | ||||||
| 	netSettings, ok := setting.(map[string]interface{}) | 	netSettings, ok := setting.(map[string]any) | ||||||
| 	if ok { | 	if ok { | ||||||
| 		delete(netSettings, "acceptProxyProtocol") | 		delete(netSettings, "acceptProxyProtocol") | ||||||
| 	} | 	} | ||||||
| 	return netSettings | 	return netSettings | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *SubJsonService) tlsData(tData map[string]interface{}) map[string]interface{} { | func (s *SubJsonService) tlsData(tData map[string]any) map[string]any { | ||||||
| 	tlsData := make(map[string]interface{}, 1) | 	tlsData := make(map[string]any, 1) | ||||||
| 	tlsClientSettings, _ := tData["settings"].(map[string]interface{}) | 	tlsClientSettings, _ := tData["settings"].(map[string]any) | ||||||
| 
 | 
 | ||||||
| 	tlsData["serverName"] = tData["serverName"] | 	tlsData["serverName"] = tData["serverName"] | ||||||
| 	tlsData["alpn"] = tData["alpn"] | 	tlsData["alpn"] = tData["alpn"] | ||||||
|  | @ -256,9 +256,9 @@ func (s *SubJsonService) tlsData(tData map[string]interface{}) map[string]interf | ||||||
| 	return tlsData | 	return tlsData | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *SubJsonService) realityData(rData map[string]interface{}) map[string]interface{} { | func (s *SubJsonService) realityData(rData map[string]any) map[string]any { | ||||||
| 	rltyData := make(map[string]interface{}, 1) | 	rltyData := make(map[string]any, 1) | ||||||
| 	rltyClientSettings, _ := rData["settings"].(map[string]interface{}) | 	rltyClientSettings, _ := rData["settings"].(map[string]any) | ||||||
| 
 | 
 | ||||||
| 	rltyData["show"] = false | 	rltyData["show"] = false | ||||||
| 	rltyData["publicKey"] = rltyClientSettings["publicKey"] | 	rltyData["publicKey"] = rltyClientSettings["publicKey"] | ||||||
|  | @ -266,13 +266,13 @@ func (s *SubJsonService) realityData(rData map[string]interface{}) map[string]in | ||||||
| 
 | 
 | ||||||
| 	// Set random data
 | 	// Set random data
 | ||||||
| 	rltyData["spiderX"] = "/" + random.Seq(15) | 	rltyData["spiderX"] = "/" + random.Seq(15) | ||||||
| 	shortIds, ok := rData["shortIds"].([]interface{}) | 	shortIds, ok := rData["shortIds"].([]any) | ||||||
| 	if ok && len(shortIds) > 0 { | 	if ok && len(shortIds) > 0 { | ||||||
| 		rltyData["shortId"] = shortIds[random.Num(len(shortIds))].(string) | 		rltyData["shortId"] = shortIds[random.Num(len(shortIds))].(string) | ||||||
| 	} else { | 	} else { | ||||||
| 		rltyData["shortId"] = "" | 		rltyData["shortId"] = "" | ||||||
| 	} | 	} | ||||||
| 	serverNames, ok := rData["serverNames"].([]interface{}) | 	serverNames, ok := rData["serverNames"].([]any) | ||||||
| 	if ok && len(serverNames) > 0 { | 	if ok && len(serverNames) > 0 { | ||||||
| 		rltyData["serverName"] = serverNames[random.Num(len(serverNames))].(string) | 		rltyData["serverName"] = serverNames[random.Num(len(serverNames))].(string) | ||||||
| 	} else { | 	} else { | ||||||
|  | @ -329,7 +329,7 @@ func (s *SubJsonService) genServer(inbound *model.Inbound, streamSettings json_u | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if inbound.Protocol == model.Shadowsocks { | 	if inbound.Protocol == model.Shadowsocks { | ||||||
| 		var inboundSettings map[string]interface{} | 		var inboundSettings map[string]any | ||||||
| 		json.Unmarshal([]byte(inbound.Settings), &inboundSettings) | 		json.Unmarshal([]byte(inbound.Settings), &inboundSettings) | ||||||
| 		method, _ := inboundSettings["method"].(string) | 		method, _ := inboundSettings["method"].(string) | ||||||
| 		serverData[0].Method = method | 		serverData[0].Method = method | ||||||
|  | @ -357,12 +357,12 @@ func (s *SubJsonService) genServer(inbound *model.Inbound, streamSettings json_u | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type Outbound struct { | type Outbound struct { | ||||||
| 	Protocol       string                 `json:"protocol"` | 	Protocol       string               `json:"protocol"` | ||||||
| 	Tag            string                 `json:"tag"` | 	Tag            string               `json:"tag"` | ||||||
| 	StreamSettings json_util.RawMessage   `json:"streamSettings"` | 	StreamSettings json_util.RawMessage `json:"streamSettings"` | ||||||
| 	Mux            json_util.RawMessage   `json:"mux,omitempty"` | 	Mux            json_util.RawMessage `json:"mux,omitempty"` | ||||||
| 	ProxySettings  map[string]interface{} `json:"proxySettings,omitempty"` | 	ProxySettings  map[string]any       `json:"proxySettings,omitempty"` | ||||||
| 	Settings       OutboundSettings       `json:"settings,omitempty"` | 	Settings       OutboundSettings     `json:"settings,omitempty"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type OutboundSettings struct { | type OutboundSettings struct { | ||||||
|  |  | ||||||
|  | @ -141,9 +141,9 @@ func (s *SubService) getFallbackMaster(dest string, streamSettings string) (stri | ||||||
| 		return "", 0, "", err | 		return "", 0, "", err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var stream map[string]interface{} | 	var stream map[string]any | ||||||
| 	json.Unmarshal([]byte(streamSettings), &stream) | 	json.Unmarshal([]byte(streamSettings), &stream) | ||||||
| 	var masterStream map[string]interface{} | 	var masterStream map[string]any | ||||||
| 	json.Unmarshal([]byte(inbound.StreamSettings), &masterStream) | 	json.Unmarshal([]byte(inbound.StreamSettings), &masterStream) | ||||||
| 	stream["security"] = masterStream["security"] | 	stream["security"] = masterStream["security"] | ||||||
| 	stream["tlsSettings"] = masterStream["tlsSettings"] | 	stream["tlsSettings"] = masterStream["tlsSettings"] | ||||||
|  | @ -171,66 +171,66 @@ func (s *SubService) genVmessLink(inbound *model.Inbound, email string) string { | ||||||
| 	if inbound.Protocol != model.VMESS { | 	if inbound.Protocol != model.VMESS { | ||||||
| 		return "" | 		return "" | ||||||
| 	} | 	} | ||||||
| 	obj := map[string]interface{}{ | 	obj := map[string]any{ | ||||||
| 		"v":    "2", | 		"v":    "2", | ||||||
| 		"add":  s.address, | 		"add":  s.address, | ||||||
| 		"port": inbound.Port, | 		"port": inbound.Port, | ||||||
| 		"type": "none", | 		"type": "none", | ||||||
| 	} | 	} | ||||||
| 	var stream map[string]interface{} | 	var stream map[string]any | ||||||
| 	json.Unmarshal([]byte(inbound.StreamSettings), &stream) | 	json.Unmarshal([]byte(inbound.StreamSettings), &stream) | ||||||
| 	network, _ := stream["network"].(string) | 	network, _ := stream["network"].(string) | ||||||
| 	obj["net"] = network | 	obj["net"] = network | ||||||
| 	switch network { | 	switch network { | ||||||
| 	case "tcp": | 	case "tcp": | ||||||
| 		tcp, _ := stream["tcpSettings"].(map[string]interface{}) | 		tcp, _ := stream["tcpSettings"].(map[string]any) | ||||||
| 		header, _ := tcp["header"].(map[string]interface{}) | 		header, _ := tcp["header"].(map[string]any) | ||||||
| 		typeStr, _ := header["type"].(string) | 		typeStr, _ := header["type"].(string) | ||||||
| 		obj["type"] = typeStr | 		obj["type"] = typeStr | ||||||
| 		if typeStr == "http" { | 		if typeStr == "http" { | ||||||
| 			request := header["request"].(map[string]interface{}) | 			request := header["request"].(map[string]any) | ||||||
| 			requestPath, _ := request["path"].([]interface{}) | 			requestPath, _ := request["path"].([]any) | ||||||
| 			obj["path"] = requestPath[0].(string) | 			obj["path"] = requestPath[0].(string) | ||||||
| 			headers, _ := request["headers"].(map[string]interface{}) | 			headers, _ := request["headers"].(map[string]any) | ||||||
| 			obj["host"] = searchHost(headers) | 			obj["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 	case "kcp": | 	case "kcp": | ||||||
| 		kcp, _ := stream["kcpSettings"].(map[string]interface{}) | 		kcp, _ := stream["kcpSettings"].(map[string]any) | ||||||
| 		header, _ := kcp["header"].(map[string]interface{}) | 		header, _ := kcp["header"].(map[string]any) | ||||||
| 		obj["type"], _ = header["type"].(string) | 		obj["type"], _ = header["type"].(string) | ||||||
| 		obj["path"], _ = kcp["seed"].(string) | 		obj["path"], _ = kcp["seed"].(string) | ||||||
| 	case "ws": | 	case "ws": | ||||||
| 		ws, _ := stream["wsSettings"].(map[string]interface{}) | 		ws, _ := stream["wsSettings"].(map[string]any) | ||||||
| 		obj["path"] = ws["path"].(string) | 		obj["path"] = ws["path"].(string) | ||||||
| 		if host, ok := ws["host"].(string); ok && len(host) > 0 { | 		if host, ok := ws["host"].(string); ok && len(host) > 0 { | ||||||
| 			obj["host"] = host | 			obj["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := ws["headers"].(map[string]interface{}) | 			headers, _ := ws["headers"].(map[string]any) | ||||||
| 			obj["host"] = searchHost(headers) | 			obj["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 	case "grpc": | 	case "grpc": | ||||||
| 		grpc, _ := stream["grpcSettings"].(map[string]interface{}) | 		grpc, _ := stream["grpcSettings"].(map[string]any) | ||||||
| 		obj["path"] = grpc["serviceName"].(string) | 		obj["path"] = grpc["serviceName"].(string) | ||||||
| 		obj["authority"] = grpc["authority"].(string) | 		obj["authority"] = grpc["authority"].(string) | ||||||
| 		if grpc["multiMode"].(bool) { | 		if grpc["multiMode"].(bool) { | ||||||
| 			obj["type"] = "multi" | 			obj["type"] = "multi" | ||||||
| 		} | 		} | ||||||
| 	case "httpupgrade": | 	case "httpupgrade": | ||||||
| 		httpupgrade, _ := stream["httpupgradeSettings"].(map[string]interface{}) | 		httpupgrade, _ := stream["httpupgradeSettings"].(map[string]any) | ||||||
| 		obj["path"] = httpupgrade["path"].(string) | 		obj["path"] = httpupgrade["path"].(string) | ||||||
| 		if host, ok := httpupgrade["host"].(string); ok && len(host) > 0 { | 		if host, ok := httpupgrade["host"].(string); ok && len(host) > 0 { | ||||||
| 			obj["host"] = host | 			obj["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := httpupgrade["headers"].(map[string]interface{}) | 			headers, _ := httpupgrade["headers"].(map[string]any) | ||||||
| 			obj["host"] = searchHost(headers) | 			obj["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 	case "xhttp": | 	case "xhttp": | ||||||
| 		xhttp, _ := stream["xhttpSettings"].(map[string]interface{}) | 		xhttp, _ := stream["xhttpSettings"].(map[string]any) | ||||||
| 		obj["path"] = xhttp["path"].(string) | 		obj["path"] = xhttp["path"].(string) | ||||||
| 		if host, ok := xhttp["host"].(string); ok && len(host) > 0 { | 		if host, ok := xhttp["host"].(string); ok && len(host) > 0 { | ||||||
| 			obj["host"] = host | 			obj["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := xhttp["headers"].(map[string]interface{}) | 			headers, _ := xhttp["headers"].(map[string]any) | ||||||
| 			obj["host"] = searchHost(headers) | 			obj["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 		obj["mode"] = xhttp["mode"].(string) | 		obj["mode"] = xhttp["mode"].(string) | ||||||
|  | @ -238,8 +238,8 @@ func (s *SubService) genVmessLink(inbound *model.Inbound, email string) string { | ||||||
| 	security, _ := stream["security"].(string) | 	security, _ := stream["security"].(string) | ||||||
| 	obj["tls"] = security | 	obj["tls"] = security | ||||||
| 	if security == "tls" { | 	if security == "tls" { | ||||||
| 		tlsSetting, _ := stream["tlsSettings"].(map[string]interface{}) | 		tlsSetting, _ := stream["tlsSettings"].(map[string]any) | ||||||
| 		alpns, _ := tlsSetting["alpn"].([]interface{}) | 		alpns, _ := tlsSetting["alpn"].([]any) | ||||||
| 		if len(alpns) > 0 { | 		if len(alpns) > 0 { | ||||||
| 			var alpn []string | 			var alpn []string | ||||||
| 			for _, a := range alpns { | 			for _, a := range alpns { | ||||||
|  | @ -273,14 +273,14 @@ func (s *SubService) genVmessLink(inbound *model.Inbound, email string) string { | ||||||
| 	obj["id"] = clients[clientIndex].ID | 	obj["id"] = clients[clientIndex].ID | ||||||
| 	obj["scy"] = clients[clientIndex].Security | 	obj["scy"] = clients[clientIndex].Security | ||||||
| 
 | 
 | ||||||
| 	externalProxies, _ := stream["externalProxy"].([]interface{}) | 	externalProxies, _ := stream["externalProxy"].([]any) | ||||||
| 
 | 
 | ||||||
| 	if len(externalProxies) > 0 { | 	if len(externalProxies) > 0 { | ||||||
| 		links := "" | 		links := "" | ||||||
| 		for index, externalProxy := range externalProxies { | 		for index, externalProxy := range externalProxies { | ||||||
| 			ep, _ := externalProxy.(map[string]interface{}) | 			ep, _ := externalProxy.(map[string]any) | ||||||
| 			newSecurity, _ := ep["forceTls"].(string) | 			newSecurity, _ := ep["forceTls"].(string) | ||||||
| 			newObj := map[string]interface{}{} | 			newObj := map[string]any{} | ||||||
| 			for key, value := range obj { | 			for key, value := range obj { | ||||||
| 				if !(newSecurity == "none" && (key == "alpn" || key == "sni" || key == "fp" || key == "allowInsecure")) { | 				if !(newSecurity == "none" && (key == "alpn" || key == "sni" || key == "fp" || key == "allowInsecure")) { | ||||||
| 					newObj[key] = value | 					newObj[key] = value | ||||||
|  | @ -313,7 +313,7 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string { | ||||||
| 	if inbound.Protocol != model.VLESS { | 	if inbound.Protocol != model.VLESS { | ||||||
| 		return "" | 		return "" | ||||||
| 	} | 	} | ||||||
| 	var stream map[string]interface{} | 	var stream map[string]any | ||||||
| 	json.Unmarshal([]byte(inbound.StreamSettings), &stream) | 	json.Unmarshal([]byte(inbound.StreamSettings), &stream) | ||||||
| 	clients, _ := s.inboundService.GetClients(inbound) | 	clients, _ := s.inboundService.GetClients(inbound) | ||||||
| 	clientIndex := -1 | 	clientIndex := -1 | ||||||
|  | @ -331,54 +331,54 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string { | ||||||
| 
 | 
 | ||||||
| 	switch streamNetwork { | 	switch streamNetwork { | ||||||
| 	case "tcp": | 	case "tcp": | ||||||
| 		tcp, _ := stream["tcpSettings"].(map[string]interface{}) | 		tcp, _ := stream["tcpSettings"].(map[string]any) | ||||||
| 		header, _ := tcp["header"].(map[string]interface{}) | 		header, _ := tcp["header"].(map[string]any) | ||||||
| 		typeStr, _ := header["type"].(string) | 		typeStr, _ := header["type"].(string) | ||||||
| 		if typeStr == "http" { | 		if typeStr == "http" { | ||||||
| 			request := header["request"].(map[string]interface{}) | 			request := header["request"].(map[string]any) | ||||||
| 			requestPath, _ := request["path"].([]interface{}) | 			requestPath, _ := request["path"].([]any) | ||||||
| 			params["path"] = requestPath[0].(string) | 			params["path"] = requestPath[0].(string) | ||||||
| 			headers, _ := request["headers"].(map[string]interface{}) | 			headers, _ := request["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 			params["headerType"] = "http" | 			params["headerType"] = "http" | ||||||
| 		} | 		} | ||||||
| 	case "kcp": | 	case "kcp": | ||||||
| 		kcp, _ := stream["kcpSettings"].(map[string]interface{}) | 		kcp, _ := stream["kcpSettings"].(map[string]any) | ||||||
| 		header, _ := kcp["header"].(map[string]interface{}) | 		header, _ := kcp["header"].(map[string]any) | ||||||
| 		params["headerType"] = header["type"].(string) | 		params["headerType"] = header["type"].(string) | ||||||
| 		params["seed"] = kcp["seed"].(string) | 		params["seed"] = kcp["seed"].(string) | ||||||
| 	case "ws": | 	case "ws": | ||||||
| 		ws, _ := stream["wsSettings"].(map[string]interface{}) | 		ws, _ := stream["wsSettings"].(map[string]any) | ||||||
| 		params["path"] = ws["path"].(string) | 		params["path"] = ws["path"].(string) | ||||||
| 		if host, ok := ws["host"].(string); ok && len(host) > 0 { | 		if host, ok := ws["host"].(string); ok && len(host) > 0 { | ||||||
| 			params["host"] = host | 			params["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := ws["headers"].(map[string]interface{}) | 			headers, _ := ws["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 	case "grpc": | 	case "grpc": | ||||||
| 		grpc, _ := stream["grpcSettings"].(map[string]interface{}) | 		grpc, _ := stream["grpcSettings"].(map[string]any) | ||||||
| 		params["serviceName"] = grpc["serviceName"].(string) | 		params["serviceName"] = grpc["serviceName"].(string) | ||||||
| 		params["authority"], _ = grpc["authority"].(string) | 		params["authority"], _ = grpc["authority"].(string) | ||||||
| 		if grpc["multiMode"].(bool) { | 		if grpc["multiMode"].(bool) { | ||||||
| 			params["mode"] = "multi" | 			params["mode"] = "multi" | ||||||
| 		} | 		} | ||||||
| 	case "httpupgrade": | 	case "httpupgrade": | ||||||
| 		httpupgrade, _ := stream["httpupgradeSettings"].(map[string]interface{}) | 		httpupgrade, _ := stream["httpupgradeSettings"].(map[string]any) | ||||||
| 		params["path"] = httpupgrade["path"].(string) | 		params["path"] = httpupgrade["path"].(string) | ||||||
| 		if host, ok := httpupgrade["host"].(string); ok && len(host) > 0 { | 		if host, ok := httpupgrade["host"].(string); ok && len(host) > 0 { | ||||||
| 			params["host"] = host | 			params["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := httpupgrade["headers"].(map[string]interface{}) | 			headers, _ := httpupgrade["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 	case "xhttp": | 	case "xhttp": | ||||||
| 		xhttp, _ := stream["xhttpSettings"].(map[string]interface{}) | 		xhttp, _ := stream["xhttpSettings"].(map[string]any) | ||||||
| 		params["path"] = xhttp["path"].(string) | 		params["path"] = xhttp["path"].(string) | ||||||
| 		if host, ok := xhttp["host"].(string); ok && len(host) > 0 { | 		if host, ok := xhttp["host"].(string); ok && len(host) > 0 { | ||||||
| 			params["host"] = host | 			params["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := xhttp["headers"].(map[string]interface{}) | 			headers, _ := xhttp["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 		params["mode"] = xhttp["mode"].(string) | 		params["mode"] = xhttp["mode"].(string) | ||||||
|  | @ -386,8 +386,8 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string { | ||||||
| 	security, _ := stream["security"].(string) | 	security, _ := stream["security"].(string) | ||||||
| 	if security == "tls" { | 	if security == "tls" { | ||||||
| 		params["security"] = "tls" | 		params["security"] = "tls" | ||||||
| 		tlsSetting, _ := stream["tlsSettings"].(map[string]interface{}) | 		tlsSetting, _ := stream["tlsSettings"].(map[string]any) | ||||||
| 		alpns, _ := tlsSetting["alpn"].([]interface{}) | 		alpns, _ := tlsSetting["alpn"].([]any) | ||||||
| 		var alpn []string | 		var alpn []string | ||||||
| 		for _, a := range alpns { | 		for _, a := range alpns { | ||||||
| 			alpn = append(alpn, a.(string)) | 			alpn = append(alpn, a.(string)) | ||||||
|  | @ -418,18 +418,18 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string { | ||||||
| 
 | 
 | ||||||
| 	if security == "reality" { | 	if security == "reality" { | ||||||
| 		params["security"] = "reality" | 		params["security"] = "reality" | ||||||
| 		realitySetting, _ := stream["realitySettings"].(map[string]interface{}) | 		realitySetting, _ := stream["realitySettings"].(map[string]any) | ||||||
| 		realitySettings, _ := searchKey(realitySetting, "settings") | 		realitySettings, _ := searchKey(realitySetting, "settings") | ||||||
| 		if realitySetting != nil { | 		if realitySetting != nil { | ||||||
| 			if sniValue, ok := searchKey(realitySetting, "serverNames"); ok { | 			if sniValue, ok := searchKey(realitySetting, "serverNames"); ok { | ||||||
| 				sNames, _ := sniValue.([]interface{}) | 				sNames, _ := sniValue.([]any) | ||||||
| 				params["sni"] = sNames[random.Num(len(sNames))].(string) | 				params["sni"] = sNames[random.Num(len(sNames))].(string) | ||||||
| 			} | 			} | ||||||
| 			if pbkValue, ok := searchKey(realitySettings, "publicKey"); ok { | 			if pbkValue, ok := searchKey(realitySettings, "publicKey"); ok { | ||||||
| 				params["pbk"], _ = pbkValue.(string) | 				params["pbk"], _ = pbkValue.(string) | ||||||
| 			} | 			} | ||||||
| 			if sidValue, ok := searchKey(realitySetting, "shortIds"); ok { | 			if sidValue, ok := searchKey(realitySetting, "shortIds"); ok { | ||||||
| 				shortIds, _ := sidValue.([]interface{}) | 				shortIds, _ := sidValue.([]any) | ||||||
| 				params["sid"] = shortIds[random.Num(len(shortIds))].(string) | 				params["sid"] = shortIds[random.Num(len(shortIds))].(string) | ||||||
| 			} | 			} | ||||||
| 			if fpValue, ok := searchKey(realitySettings, "fingerprint"); ok { | 			if fpValue, ok := searchKey(realitySettings, "fingerprint"); ok { | ||||||
|  | @ -449,12 +449,12 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string { | ||||||
| 		params["security"] = "none" | 		params["security"] = "none" | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	externalProxies, _ := stream["externalProxy"].([]interface{}) | 	externalProxies, _ := stream["externalProxy"].([]any) | ||||||
| 
 | 
 | ||||||
| 	if len(externalProxies) > 0 { | 	if len(externalProxies) > 0 { | ||||||
| 		links := "" | 		links := "" | ||||||
| 		for index, externalProxy := range externalProxies { | 		for index, externalProxy := range externalProxies { | ||||||
| 			ep, _ := externalProxy.(map[string]interface{}) | 			ep, _ := externalProxy.(map[string]any) | ||||||
| 			newSecurity, _ := ep["forceTls"].(string) | 			newSecurity, _ := ep["forceTls"].(string) | ||||||
| 			dest, _ := ep["dest"].(string) | 			dest, _ := ep["dest"].(string) | ||||||
| 			port := int(ep["port"].(float64)) | 			port := int(ep["port"].(float64)) | ||||||
|  | @ -507,7 +507,7 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string | ||||||
| 	if inbound.Protocol != model.Trojan { | 	if inbound.Protocol != model.Trojan { | ||||||
| 		return "" | 		return "" | ||||||
| 	} | 	} | ||||||
| 	var stream map[string]interface{} | 	var stream map[string]any | ||||||
| 	json.Unmarshal([]byte(inbound.StreamSettings), &stream) | 	json.Unmarshal([]byte(inbound.StreamSettings), &stream) | ||||||
| 	clients, _ := s.inboundService.GetClients(inbound) | 	clients, _ := s.inboundService.GetClients(inbound) | ||||||
| 	clientIndex := -1 | 	clientIndex := -1 | ||||||
|  | @ -525,54 +525,54 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string | ||||||
| 
 | 
 | ||||||
| 	switch streamNetwork { | 	switch streamNetwork { | ||||||
| 	case "tcp": | 	case "tcp": | ||||||
| 		tcp, _ := stream["tcpSettings"].(map[string]interface{}) | 		tcp, _ := stream["tcpSettings"].(map[string]any) | ||||||
| 		header, _ := tcp["header"].(map[string]interface{}) | 		header, _ := tcp["header"].(map[string]any) | ||||||
| 		typeStr, _ := header["type"].(string) | 		typeStr, _ := header["type"].(string) | ||||||
| 		if typeStr == "http" { | 		if typeStr == "http" { | ||||||
| 			request := header["request"].(map[string]interface{}) | 			request := header["request"].(map[string]any) | ||||||
| 			requestPath, _ := request["path"].([]interface{}) | 			requestPath, _ := request["path"].([]any) | ||||||
| 			params["path"] = requestPath[0].(string) | 			params["path"] = requestPath[0].(string) | ||||||
| 			headers, _ := request["headers"].(map[string]interface{}) | 			headers, _ := request["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 			params["headerType"] = "http" | 			params["headerType"] = "http" | ||||||
| 		} | 		} | ||||||
| 	case "kcp": | 	case "kcp": | ||||||
| 		kcp, _ := stream["kcpSettings"].(map[string]interface{}) | 		kcp, _ := stream["kcpSettings"].(map[string]any) | ||||||
| 		header, _ := kcp["header"].(map[string]interface{}) | 		header, _ := kcp["header"].(map[string]any) | ||||||
| 		params["headerType"] = header["type"].(string) | 		params["headerType"] = header["type"].(string) | ||||||
| 		params["seed"] = kcp["seed"].(string) | 		params["seed"] = kcp["seed"].(string) | ||||||
| 	case "ws": | 	case "ws": | ||||||
| 		ws, _ := stream["wsSettings"].(map[string]interface{}) | 		ws, _ := stream["wsSettings"].(map[string]any) | ||||||
| 		params["path"] = ws["path"].(string) | 		params["path"] = ws["path"].(string) | ||||||
| 		if host, ok := ws["host"].(string); ok && len(host) > 0 { | 		if host, ok := ws["host"].(string); ok && len(host) > 0 { | ||||||
| 			params["host"] = host | 			params["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := ws["headers"].(map[string]interface{}) | 			headers, _ := ws["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 	case "grpc": | 	case "grpc": | ||||||
| 		grpc, _ := stream["grpcSettings"].(map[string]interface{}) | 		grpc, _ := stream["grpcSettings"].(map[string]any) | ||||||
| 		params["serviceName"] = grpc["serviceName"].(string) | 		params["serviceName"] = grpc["serviceName"].(string) | ||||||
| 		params["authority"], _ = grpc["authority"].(string) | 		params["authority"], _ = grpc["authority"].(string) | ||||||
| 		if grpc["multiMode"].(bool) { | 		if grpc["multiMode"].(bool) { | ||||||
| 			params["mode"] = "multi" | 			params["mode"] = "multi" | ||||||
| 		} | 		} | ||||||
| 	case "httpupgrade": | 	case "httpupgrade": | ||||||
| 		httpupgrade, _ := stream["httpupgradeSettings"].(map[string]interface{}) | 		httpupgrade, _ := stream["httpupgradeSettings"].(map[string]any) | ||||||
| 		params["path"] = httpupgrade["path"].(string) | 		params["path"] = httpupgrade["path"].(string) | ||||||
| 		if host, ok := httpupgrade["host"].(string); ok && len(host) > 0 { | 		if host, ok := httpupgrade["host"].(string); ok && len(host) > 0 { | ||||||
| 			params["host"] = host | 			params["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := httpupgrade["headers"].(map[string]interface{}) | 			headers, _ := httpupgrade["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 	case "xhttp": | 	case "xhttp": | ||||||
| 		xhttp, _ := stream["xhttpSettings"].(map[string]interface{}) | 		xhttp, _ := stream["xhttpSettings"].(map[string]any) | ||||||
| 		params["path"] = xhttp["path"].(string) | 		params["path"] = xhttp["path"].(string) | ||||||
| 		if host, ok := xhttp["host"].(string); ok && len(host) > 0 { | 		if host, ok := xhttp["host"].(string); ok && len(host) > 0 { | ||||||
| 			params["host"] = host | 			params["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := xhttp["headers"].(map[string]interface{}) | 			headers, _ := xhttp["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 		params["mode"] = xhttp["mode"].(string) | 		params["mode"] = xhttp["mode"].(string) | ||||||
|  | @ -580,8 +580,8 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string | ||||||
| 	security, _ := stream["security"].(string) | 	security, _ := stream["security"].(string) | ||||||
| 	if security == "tls" { | 	if security == "tls" { | ||||||
| 		params["security"] = "tls" | 		params["security"] = "tls" | ||||||
| 		tlsSetting, _ := stream["tlsSettings"].(map[string]interface{}) | 		tlsSetting, _ := stream["tlsSettings"].(map[string]any) | ||||||
| 		alpns, _ := tlsSetting["alpn"].([]interface{}) | 		alpns, _ := tlsSetting["alpn"].([]any) | ||||||
| 		var alpn []string | 		var alpn []string | ||||||
| 		for _, a := range alpns { | 		for _, a := range alpns { | ||||||
| 			alpn = append(alpn, a.(string)) | 			alpn = append(alpn, a.(string)) | ||||||
|  | @ -608,18 +608,18 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string | ||||||
| 
 | 
 | ||||||
| 	if security == "reality" { | 	if security == "reality" { | ||||||
| 		params["security"] = "reality" | 		params["security"] = "reality" | ||||||
| 		realitySetting, _ := stream["realitySettings"].(map[string]interface{}) | 		realitySetting, _ := stream["realitySettings"].(map[string]any) | ||||||
| 		realitySettings, _ := searchKey(realitySetting, "settings") | 		realitySettings, _ := searchKey(realitySetting, "settings") | ||||||
| 		if realitySetting != nil { | 		if realitySetting != nil { | ||||||
| 			if sniValue, ok := searchKey(realitySetting, "serverNames"); ok { | 			if sniValue, ok := searchKey(realitySetting, "serverNames"); ok { | ||||||
| 				sNames, _ := sniValue.([]interface{}) | 				sNames, _ := sniValue.([]any) | ||||||
| 				params["sni"] = sNames[random.Num(len(sNames))].(string) | 				params["sni"] = sNames[random.Num(len(sNames))].(string) | ||||||
| 			} | 			} | ||||||
| 			if pbkValue, ok := searchKey(realitySettings, "publicKey"); ok { | 			if pbkValue, ok := searchKey(realitySettings, "publicKey"); ok { | ||||||
| 				params["pbk"], _ = pbkValue.(string) | 				params["pbk"], _ = pbkValue.(string) | ||||||
| 			} | 			} | ||||||
| 			if sidValue, ok := searchKey(realitySetting, "shortIds"); ok { | 			if sidValue, ok := searchKey(realitySetting, "shortIds"); ok { | ||||||
| 				shortIds, _ := sidValue.([]interface{}) | 				shortIds, _ := sidValue.([]any) | ||||||
| 				params["sid"] = shortIds[random.Num(len(shortIds))].(string) | 				params["sid"] = shortIds[random.Num(len(shortIds))].(string) | ||||||
| 			} | 			} | ||||||
| 			if fpValue, ok := searchKey(realitySettings, "fingerprint"); ok { | 			if fpValue, ok := searchKey(realitySettings, "fingerprint"); ok { | ||||||
|  | @ -639,12 +639,12 @@ func (s *SubService) genTrojanLink(inbound *model.Inbound, email string) string | ||||||
| 		params["security"] = "none" | 		params["security"] = "none" | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	externalProxies, _ := stream["externalProxy"].([]interface{}) | 	externalProxies, _ := stream["externalProxy"].([]any) | ||||||
| 
 | 
 | ||||||
| 	if len(externalProxies) > 0 { | 	if len(externalProxies) > 0 { | ||||||
| 		links := "" | 		links := "" | ||||||
| 		for index, externalProxy := range externalProxies { | 		for index, externalProxy := range externalProxies { | ||||||
| 			ep, _ := externalProxy.(map[string]interface{}) | 			ep, _ := externalProxy.(map[string]any) | ||||||
| 			newSecurity, _ := ep["forceTls"].(string) | 			newSecurity, _ := ep["forceTls"].(string) | ||||||
| 			dest, _ := ep["dest"].(string) | 			dest, _ := ep["dest"].(string) | ||||||
| 			port := int(ep["port"].(float64)) | 			port := int(ep["port"].(float64)) | ||||||
|  | @ -698,11 +698,11 @@ func (s *SubService) genShadowsocksLink(inbound *model.Inbound, email string) st | ||||||
| 	if inbound.Protocol != model.Shadowsocks { | 	if inbound.Protocol != model.Shadowsocks { | ||||||
| 		return "" | 		return "" | ||||||
| 	} | 	} | ||||||
| 	var stream map[string]interface{} | 	var stream map[string]any | ||||||
| 	json.Unmarshal([]byte(inbound.StreamSettings), &stream) | 	json.Unmarshal([]byte(inbound.StreamSettings), &stream) | ||||||
| 	clients, _ := s.inboundService.GetClients(inbound) | 	clients, _ := s.inboundService.GetClients(inbound) | ||||||
| 
 | 
 | ||||||
| 	var settings map[string]interface{} | 	var settings map[string]any | ||||||
| 	json.Unmarshal([]byte(inbound.Settings), &settings) | 	json.Unmarshal([]byte(inbound.Settings), &settings) | ||||||
| 	inboundPassword := settings["password"].(string) | 	inboundPassword := settings["password"].(string) | ||||||
| 	method := settings["method"].(string) | 	method := settings["method"].(string) | ||||||
|  | @ -719,54 +719,54 @@ func (s *SubService) genShadowsocksLink(inbound *model.Inbound, email string) st | ||||||
| 
 | 
 | ||||||
| 	switch streamNetwork { | 	switch streamNetwork { | ||||||
| 	case "tcp": | 	case "tcp": | ||||||
| 		tcp, _ := stream["tcpSettings"].(map[string]interface{}) | 		tcp, _ := stream["tcpSettings"].(map[string]any) | ||||||
| 		header, _ := tcp["header"].(map[string]interface{}) | 		header, _ := tcp["header"].(map[string]any) | ||||||
| 		typeStr, _ := header["type"].(string) | 		typeStr, _ := header["type"].(string) | ||||||
| 		if typeStr == "http" { | 		if typeStr == "http" { | ||||||
| 			request := header["request"].(map[string]interface{}) | 			request := header["request"].(map[string]any) | ||||||
| 			requestPath, _ := request["path"].([]interface{}) | 			requestPath, _ := request["path"].([]any) | ||||||
| 			params["path"] = requestPath[0].(string) | 			params["path"] = requestPath[0].(string) | ||||||
| 			headers, _ := request["headers"].(map[string]interface{}) | 			headers, _ := request["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 			params["headerType"] = "http" | 			params["headerType"] = "http" | ||||||
| 		} | 		} | ||||||
| 	case "kcp": | 	case "kcp": | ||||||
| 		kcp, _ := stream["kcpSettings"].(map[string]interface{}) | 		kcp, _ := stream["kcpSettings"].(map[string]any) | ||||||
| 		header, _ := kcp["header"].(map[string]interface{}) | 		header, _ := kcp["header"].(map[string]any) | ||||||
| 		params["headerType"] = header["type"].(string) | 		params["headerType"] = header["type"].(string) | ||||||
| 		params["seed"] = kcp["seed"].(string) | 		params["seed"] = kcp["seed"].(string) | ||||||
| 	case "ws": | 	case "ws": | ||||||
| 		ws, _ := stream["wsSettings"].(map[string]interface{}) | 		ws, _ := stream["wsSettings"].(map[string]any) | ||||||
| 		params["path"] = ws["path"].(string) | 		params["path"] = ws["path"].(string) | ||||||
| 		if host, ok := ws["host"].(string); ok && len(host) > 0 { | 		if host, ok := ws["host"].(string); ok && len(host) > 0 { | ||||||
| 			params["host"] = host | 			params["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := ws["headers"].(map[string]interface{}) | 			headers, _ := ws["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 	case "grpc": | 	case "grpc": | ||||||
| 		grpc, _ := stream["grpcSettings"].(map[string]interface{}) | 		grpc, _ := stream["grpcSettings"].(map[string]any) | ||||||
| 		params["serviceName"] = grpc["serviceName"].(string) | 		params["serviceName"] = grpc["serviceName"].(string) | ||||||
| 		params["authority"], _ = grpc["authority"].(string) | 		params["authority"], _ = grpc["authority"].(string) | ||||||
| 		if grpc["multiMode"].(bool) { | 		if grpc["multiMode"].(bool) { | ||||||
| 			params["mode"] = "multi" | 			params["mode"] = "multi" | ||||||
| 		} | 		} | ||||||
| 	case "httpupgrade": | 	case "httpupgrade": | ||||||
| 		httpupgrade, _ := stream["httpupgradeSettings"].(map[string]interface{}) | 		httpupgrade, _ := stream["httpupgradeSettings"].(map[string]any) | ||||||
| 		params["path"] = httpupgrade["path"].(string) | 		params["path"] = httpupgrade["path"].(string) | ||||||
| 		if host, ok := httpupgrade["host"].(string); ok && len(host) > 0 { | 		if host, ok := httpupgrade["host"].(string); ok && len(host) > 0 { | ||||||
| 			params["host"] = host | 			params["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := httpupgrade["headers"].(map[string]interface{}) | 			headers, _ := httpupgrade["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 	case "xhttp": | 	case "xhttp": | ||||||
| 		xhttp, _ := stream["xhttpSettings"].(map[string]interface{}) | 		xhttp, _ := stream["xhttpSettings"].(map[string]any) | ||||||
| 		params["path"] = xhttp["path"].(string) | 		params["path"] = xhttp["path"].(string) | ||||||
| 		if host, ok := xhttp["host"].(string); ok && len(host) > 0 { | 		if host, ok := xhttp["host"].(string); ok && len(host) > 0 { | ||||||
| 			params["host"] = host | 			params["host"] = host | ||||||
| 		} else { | 		} else { | ||||||
| 			headers, _ := xhttp["headers"].(map[string]interface{}) | 			headers, _ := xhttp["headers"].(map[string]any) | ||||||
| 			params["host"] = searchHost(headers) | 			params["host"] = searchHost(headers) | ||||||
| 		} | 		} | ||||||
| 		params["mode"] = xhttp["mode"].(string) | 		params["mode"] = xhttp["mode"].(string) | ||||||
|  | @ -775,8 +775,8 @@ func (s *SubService) genShadowsocksLink(inbound *model.Inbound, email string) st | ||||||
| 	security, _ := stream["security"].(string) | 	security, _ := stream["security"].(string) | ||||||
| 	if security == "tls" { | 	if security == "tls" { | ||||||
| 		params["security"] = "tls" | 		params["security"] = "tls" | ||||||
| 		tlsSetting, _ := stream["tlsSettings"].(map[string]interface{}) | 		tlsSetting, _ := stream["tlsSettings"].(map[string]any) | ||||||
| 		alpns, _ := tlsSetting["alpn"].([]interface{}) | 		alpns, _ := tlsSetting["alpn"].([]any) | ||||||
| 		var alpn []string | 		var alpn []string | ||||||
| 		for _, a := range alpns { | 		for _, a := range alpns { | ||||||
| 			alpn = append(alpn, a.(string)) | 			alpn = append(alpn, a.(string)) | ||||||
|  | @ -806,12 +806,12 @@ func (s *SubService) genShadowsocksLink(inbound *model.Inbound, email string) st | ||||||
| 		encPart = fmt.Sprintf("%s:%s:%s", method, inboundPassword, clients[clientIndex].Password) | 		encPart = fmt.Sprintf("%s:%s:%s", method, inboundPassword, clients[clientIndex].Password) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	externalProxies, _ := stream["externalProxy"].([]interface{}) | 	externalProxies, _ := stream["externalProxy"].([]any) | ||||||
| 
 | 
 | ||||||
| 	if len(externalProxies) > 0 { | 	if len(externalProxies) > 0 { | ||||||
| 		links := "" | 		links := "" | ||||||
| 		for index, externalProxy := range externalProxies { | 		for index, externalProxy := range externalProxies { | ||||||
| 			ep, _ := externalProxy.(map[string]interface{}) | 			ep, _ := externalProxy.(map[string]any) | ||||||
| 			newSecurity, _ := ep["forceTls"].(string) | 			newSecurity, _ := ep["forceTls"].(string) | ||||||
| 			dest, _ := ep["dest"].(string) | 			dest, _ := ep["dest"].(string) | ||||||
| 			port := int(ep["port"].(float64)) | 			port := int(ep["port"].(float64)) | ||||||
|  | @ -944,9 +944,9 @@ func (s *SubService) genRemark(inbound *model.Inbound, email string, extra strin | ||||||
| 	return strings.Join(remark, separationChar) | 	return strings.Join(remark, separationChar) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func searchKey(data interface{}, key string) (interface{}, bool) { | func searchKey(data any, key string) (any, bool) { | ||||||
| 	switch val := data.(type) { | 	switch val := data.(type) { | ||||||
| 	case map[string]interface{}: | 	case map[string]any: | ||||||
| 		for k, v := range val { | 		for k, v := range val { | ||||||
| 			if k == key { | 			if k == key { | ||||||
| 				return v, true | 				return v, true | ||||||
|  | @ -955,7 +955,7 @@ func searchKey(data interface{}, key string) (interface{}, bool) { | ||||||
| 				return result, true | 				return result, true | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	case []interface{}: | 	case []any: | ||||||
| 		for _, v := range val { | 		for _, v := range val { | ||||||
| 			if result, ok := searchKey(v, key); ok { | 			if result, ok := searchKey(v, key); ok { | ||||||
| 				return result, true | 				return result, true | ||||||
|  | @ -965,19 +965,19 @@ func searchKey(data interface{}, key string) (interface{}, bool) { | ||||||
| 	return nil, false | 	return nil, false | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func searchHost(headers interface{}) string { | func searchHost(headers any) string { | ||||||
| 	data, _ := headers.(map[string]interface{}) | 	data, _ := headers.(map[string]any) | ||||||
| 	for k, v := range data { | 	for k, v := range data { | ||||||
| 		if strings.EqualFold(k, "host") { | 		if strings.EqualFold(k, "host") { | ||||||
| 			switch v.(type) { | 			switch v.(type) { | ||||||
| 			case []interface{}: | 			case []any: | ||||||
| 				hosts, _ := v.([]interface{}) | 				hosts, _ := v.([]any) | ||||||
| 				if len(hosts) > 0 { | 				if len(hosts) > 0 { | ||||||
| 					return hosts[0].(string) | 					return hosts[0].(string) | ||||||
| 				} else { | 				} else { | ||||||
| 					return "" | 					return "" | ||||||
| 				} | 				} | ||||||
| 			case interface{}: | 			case any: | ||||||
| 				return v.(string) | 				return v.(string) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | @ -7,17 +7,17 @@ import ( | ||||||
| 	"x-ui/logger" | 	"x-ui/logger" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| func NewErrorf(format string, a ...interface{}) error { | func NewErrorf(format string, a ...any) error { | ||||||
| 	msg := fmt.Sprintf(format, a...) | 	msg := fmt.Sprintf(format, a...) | ||||||
| 	return errors.New(msg) | 	return errors.New(msg) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewError(a ...interface{}) error { | func NewError(a ...any) error { | ||||||
| 	msg := fmt.Sprintln(a...) | 	msg := fmt.Sprintln(a...) | ||||||
| 	return errors.New(msg) | 	return errors.New(msg) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func Recover(msg string) interface{} { | func Recover(msg string) any { | ||||||
| 	panicErr := recover() | 	panicErr := recover() | ||||||
| 	if panicErr != nil { | 	if panicErr != nil { | ||||||
| 		if msg != "" { | 		if msg != "" { | ||||||
|  |  | ||||||
|  | @ -31,11 +31,11 @@ func jsonMsg(c *gin.Context, msg string, err error) { | ||||||
| 	jsonMsgObj(c, msg, nil, err) | 	jsonMsgObj(c, msg, nil, err) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func jsonObj(c *gin.Context, obj interface{}, err error) { | func jsonObj(c *gin.Context, obj any, err error) { | ||||||
| 	jsonMsgObj(c, "", obj, err) | 	jsonMsgObj(c, "", obj, err) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func jsonMsgObj(c *gin.Context, msg string, obj interface{}, err error) { | func jsonMsgObj(c *gin.Context, msg string, obj any, err error) { | ||||||
| 	m := entity.Msg{ | 	m := entity.Msg{ | ||||||
| 		Obj: obj, | 		Obj: obj, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -10,9 +10,9 @@ import ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| type Msg struct { | type Msg struct { | ||||||
| 	Success bool        `json:"success"` | 	Success bool   `json:"success"` | ||||||
| 	Msg     string      `json:"msg"` | 	Msg     string `json:"msg"` | ||||||
| 	Obj     interface{} `json:"obj"` | 	Obj     any    `json:"obj"` | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| type AllSetting struct { | type AllSetting struct { | ||||||
|  |  | ||||||
|  | @ -176,10 +176,10 @@ | ||||||
|             }, |             }, | ||||||
|             async register() { |             async register() { | ||||||
|                 warpModal.loading(true); |                 warpModal.loading(true); | ||||||
|                 keys = Wireguard.generateKeypair(); |                 const keys = Wireguard.generateKeypair(); | ||||||
|                 const msg = await HttpUtil.post('/panel/xray/warp/reg', keys); |                 const msg = await HttpUtil.post('/panel/xray/warp/reg', keys); | ||||||
|                 if (msg.success) { |                 if (msg.success) { | ||||||
|                     resp = JSON.parse(msg.obj); |                     const resp = JSON.parse(msg.obj); | ||||||
|                     warpModal.warpData = resp.data; |                     warpModal.warpData = resp.data; | ||||||
|                     warpModal.warpConfig = resp.config; |                     warpModal.warpConfig = resp.config; | ||||||
|                     this.collectConfig(); |                     this.collectConfig(); | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ import ( | ||||||
| 	"sort" | 	"sort" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | 	"slices" | ||||||
| 	"x-ui/database" | 	"x-ui/database" | ||||||
| 	"x-ui/database/model" | 	"x-ui/database/model" | ||||||
| 	"x-ui/logger" | 	"x-ui/logger" | ||||||
|  | @ -193,13 +194,7 @@ func (j *CheckClientIpJob) checkError(e error) { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (j *CheckClientIpJob) contains(s []string, str string) bool { | func (j *CheckClientIpJob) contains(s []string, str string) bool { | ||||||
| 	for _, v := range s { | 	return slices.Contains(s, str) | ||||||
| 		if v == str { |  | ||||||
| 			return true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return false |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (j *CheckClientIpJob) getInboundClientIps(clientEmail string) (*model.InboundClientIps, error) { | func (j *CheckClientIpJob) getInboundClientIps(clientEmail string) (*model.InboundClientIps, error) { | ||||||
|  |  | ||||||
|  | @ -52,7 +52,7 @@ func (j *XrayTrafficJob) informTrafficToExternalAPI(inboundTraffics []*xray.Traf | ||||||
| 		logger.Warning("get ExternalTrafficInformURI failed:", err) | 		logger.Warning("get ExternalTrafficInformURI failed:", err) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	requestBody, err := json.Marshal(map[string]interface{}{"clientTraffics": clientTraffics, "inboundTraffics": inboundTraffics}) | 	requestBody, err := json.Marshal(map[string]any{"clientTraffics": clientTraffics, "inboundTraffics": inboundTraffics}) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Warning("parse client/inbound traffic failed:", err) | 		logger.Warning("parse client/inbound traffic failed:", err) | ||||||
| 		return | 		return | ||||||
|  |  | ||||||
|  | @ -48,13 +48,13 @@ func InitLocalizer(i18nFS embed.FS, settingService SettingService) error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func createTemplateData(params []string, seperator ...string) map[string]interface{} { | func createTemplateData(params []string, seperator ...string) map[string]any { | ||||||
| 	var sep string = "==" | 	var sep string = "==" | ||||||
| 	if len(seperator) > 0 { | 	if len(seperator) > 0 { | ||||||
| 		sep = seperator[0] | 		sep = seperator[0] | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	templateData := make(map[string]interface{}) | 	templateData := make(map[string]any) | ||||||
| 	for _, param := range params { | 	for _, param := range params { | ||||||
| 		parts := strings.SplitN(param, sep, 2) | 		parts := strings.SplitN(param, sep, 2) | ||||||
| 		templateData[parts[0]] = parts[1] | 		templateData[parts[0]] = parts[1] | ||||||
|  |  | ||||||
|  | @ -413,13 +413,13 @@ func (s *InboundService) AddInboundClient(data *model.Inbound) (bool, error) { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var settings map[string]interface{} | 	var settings map[string]any | ||||||
| 	err = json.Unmarshal([]byte(data.Settings), &settings) | 	err = json.Unmarshal([]byte(data.Settings), &settings) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	interfaceClients := settings["clients"].([]interface{}) | 	interfaceClients := settings["clients"].([]any) | ||||||
| 	existEmail, err := s.checkEmailsExistForClients(clients) | 	existEmail, err := s.checkEmailsExistForClients(clients) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
|  | @ -450,13 +450,13 @@ func (s *InboundService) AddInboundClient(data *model.Inbound) (bool, error) { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var oldSettings map[string]interface{} | 	var oldSettings map[string]any | ||||||
| 	err = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings) | 	err = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	oldClients := oldSettings["clients"].([]interface{}) | 	oldClients := oldSettings["clients"].([]any) | ||||||
| 	oldClients = append(oldClients, interfaceClients...) | 	oldClients = append(oldClients, interfaceClients...) | ||||||
| 
 | 
 | ||||||
| 	oldSettings["clients"] = oldClients | 	oldSettings["clients"] = oldClients | ||||||
|  | @ -489,7 +489,7 @@ func (s *InboundService) AddInboundClient(data *model.Inbound) (bool, error) { | ||||||
| 				if oldInbound.Protocol == "shadowsocks" { | 				if oldInbound.Protocol == "shadowsocks" { | ||||||
| 					cipher = oldSettings["method"].(string) | 					cipher = oldSettings["method"].(string) | ||||||
| 				} | 				} | ||||||
| 				err1 := s.xrayApi.AddUser(string(oldInbound.Protocol), oldInbound.Tag, map[string]interface{}{ | 				err1 := s.xrayApi.AddUser(string(oldInbound.Protocol), oldInbound.Tag, map[string]any{ | ||||||
| 					"email":    client.Email, | 					"email":    client.Email, | ||||||
| 					"id":       client.ID, | 					"id":       client.ID, | ||||||
| 					"security": client.Security, | 					"security": client.Security, | ||||||
|  | @ -519,7 +519,7 @@ func (s *InboundService) DelInboundClient(inboundId int, clientId string) (bool, | ||||||
| 		logger.Error("Load Old Data Error") | 		logger.Error("Load Old Data Error") | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 	var settings map[string]interface{} | 	var settings map[string]any | ||||||
| 	err = json.Unmarshal([]byte(oldInbound.Settings), &settings) | 	err = json.Unmarshal([]byte(oldInbound.Settings), &settings) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
|  | @ -534,11 +534,11 @@ func (s *InboundService) DelInboundClient(inboundId int, clientId string) (bool, | ||||||
| 		client_key = "email" | 		client_key = "email" | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	interfaceClients := settings["clients"].([]interface{}) | 	interfaceClients := settings["clients"].([]any) | ||||||
| 	var newClients []interface{} | 	var newClients []any | ||||||
| 	needApiDel := false | 	needApiDel := false | ||||||
| 	for _, client := range interfaceClients { | 	for _, client := range interfaceClients { | ||||||
| 		c := client.(map[string]interface{}) | 		c := client.(map[string]any) | ||||||
| 		c_id := c[client_key].(string) | 		c_id := c[client_key].(string) | ||||||
| 		if c_id == clientId { | 		if c_id == clientId { | ||||||
| 			email, _ = c["email"].(string) | 			email, _ = c["email"].(string) | ||||||
|  | @ -607,13 +607,13 @@ func (s *InboundService) UpdateInboundClient(data *model.Inbound, clientId strin | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var settings map[string]interface{} | 	var settings map[string]any | ||||||
| 	err = json.Unmarshal([]byte(data.Settings), &settings) | 	err = json.Unmarshal([]byte(data.Settings), &settings) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	interfaceClients := settings["clients"].([]interface{}) | 	interfaceClients := settings["clients"].([]any) | ||||||
| 
 | 
 | ||||||
| 	oldInbound, err := s.GetInbound(data.Id) | 	oldInbound, err := s.GetInbound(data.Id) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -662,12 +662,12 @@ func (s *InboundService) UpdateInboundClient(data *model.Inbound, clientId strin | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var oldSettings map[string]interface{} | 	var oldSettings map[string]any | ||||||
| 	err = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings) | 	err = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 	settingsClients := oldSettings["clients"].([]interface{}) | 	settingsClients := oldSettings["clients"].([]any) | ||||||
| 	settingsClients[clientIndex] = interfaceClients[0] | 	settingsClients[clientIndex] = interfaceClients[0] | ||||||
| 	oldSettings["clients"] = settingsClients | 	oldSettings["clients"] = settingsClients | ||||||
| 
 | 
 | ||||||
|  | @ -732,7 +732,7 @@ func (s *InboundService) UpdateInboundClient(data *model.Inbound, clientId strin | ||||||
| 			if oldInbound.Protocol == "shadowsocks" { | 			if oldInbound.Protocol == "shadowsocks" { | ||||||
| 				cipher = oldSettings["method"].(string) | 				cipher = oldSettings["method"].(string) | ||||||
| 			} | 			} | ||||||
| 			err1 := s.xrayApi.AddUser(string(oldInbound.Protocol), oldInbound.Tag, map[string]interface{}{ | 			err1 := s.xrayApi.AddUser(string(oldInbound.Protocol), oldInbound.Tag, map[string]any{ | ||||||
| 				"email":    clients[0].Email, | 				"email":    clients[0].Email, | ||||||
| 				"id":       clients[0].ID, | 				"id":       clients[0].ID, | ||||||
| 				"security": clients[0].Security, | 				"security": clients[0].Security, | ||||||
|  | @ -809,7 +809,7 @@ func (s *InboundService) addInboundTraffic(tx *gorm.DB, traffics []*xray.Traffic | ||||||
| 	for _, traffic := range traffics { | 	for _, traffic := range traffics { | ||||||
| 		if traffic.IsInbound { | 		if traffic.IsInbound { | ||||||
| 			err = tx.Model(&model.Inbound{}).Where("tag = ?", traffic.Tag). | 			err = tx.Model(&model.Inbound{}).Where("tag = ?", traffic.Tag). | ||||||
| 				Updates(map[string]interface{}{ | 				Updates(map[string]any{ | ||||||
| 					"up":   gorm.Expr("up + ?", traffic.Up), | 					"up":   gorm.Expr("up + ?", traffic.Up), | ||||||
| 					"down": gorm.Expr("down + ?", traffic.Down), | 					"down": gorm.Expr("down + ?", traffic.Down), | ||||||
| 				}).Error | 				}).Error | ||||||
|  | @ -893,13 +893,13 @@ func (s *InboundService) adjustTraffics(tx *gorm.DB, dbClientTraffics []*xray.Cl | ||||||
| 			return nil, err | 			return nil, err | ||||||
| 		} | 		} | ||||||
| 		for inbound_index := range inbounds { | 		for inbound_index := range inbounds { | ||||||
| 			settings := map[string]interface{}{} | 			settings := map[string]any{} | ||||||
| 			json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings) | 			json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings) | ||||||
| 			clients, ok := settings["clients"].([]interface{}) | 			clients, ok := settings["clients"].([]any) | ||||||
| 			if ok { | 			if ok { | ||||||
| 				var newClients []interface{} | 				var newClients []any | ||||||
| 				for client_index := range clients { | 				for client_index := range clients { | ||||||
| 					c := clients[client_index].(map[string]interface{}) | 					c := clients[client_index].(map[string]any) | ||||||
| 					for traffic_index := range dbClientTraffics { | 					for traffic_index := range dbClientTraffics { | ||||||
| 						if dbClientTraffics[traffic_index].ExpiryTime < 0 && c["email"] == dbClientTraffics[traffic_index].Email { | 						if dbClientTraffics[traffic_index].ExpiryTime < 0 && c["email"] == dbClientTraffics[traffic_index].Email { | ||||||
| 							oldExpiryTime := c["expiryTime"].(float64) | 							oldExpiryTime := c["expiryTime"].(float64) | ||||||
|  | @ -909,7 +909,7 @@ func (s *InboundService) adjustTraffics(tx *gorm.DB, dbClientTraffics []*xray.Cl | ||||||
| 							break | 							break | ||||||
| 						} | 						} | ||||||
| 					} | 					} | ||||||
| 					newClients = append(newClients, interface{}(c)) | 					newClients = append(newClients, any(c)) | ||||||
| 				} | 				} | ||||||
| 				settings["clients"] = newClients | 				settings["clients"] = newClients | ||||||
| 				modifiedSettings, err := json.MarshalIndent(settings, "", "  ") | 				modifiedSettings, err := json.MarshalIndent(settings, "", "  ") | ||||||
|  | @ -951,7 +951,7 @@ func (s *InboundService) autoRenewClients(tx *gorm.DB) (bool, int64, error) { | ||||||
| 	var clientsToAdd []struct { | 	var clientsToAdd []struct { | ||||||
| 		protocol string | 		protocol string | ||||||
| 		tag      string | 		tag      string | ||||||
| 		client   map[string]interface{} | 		client   map[string]any | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for _, traffic := range traffics { | 	for _, traffic := range traffics { | ||||||
|  | @ -962,11 +962,11 @@ func (s *InboundService) autoRenewClients(tx *gorm.DB) (bool, int64, error) { | ||||||
| 		return false, 0, err | 		return false, 0, err | ||||||
| 	} | 	} | ||||||
| 	for inbound_index := range inbounds { | 	for inbound_index := range inbounds { | ||||||
| 		settings := map[string]interface{}{} | 		settings := map[string]any{} | ||||||
| 		json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings) | 		json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings) | ||||||
| 		clients := settings["clients"].([]interface{}) | 		clients := settings["clients"].([]any) | ||||||
| 		for client_index := range clients { | 		for client_index := range clients { | ||||||
| 			c := clients[client_index].(map[string]interface{}) | 			c := clients[client_index].(map[string]any) | ||||||
| 			for traffic_index, traffic := range traffics { | 			for traffic_index, traffic := range traffics { | ||||||
| 				if traffic.Email == c["email"].(string) { | 				if traffic.Email == c["email"].(string) { | ||||||
| 					newExpiryTime := traffic.ExpiryTime | 					newExpiryTime := traffic.ExpiryTime | ||||||
|  | @ -983,14 +983,14 @@ func (s *InboundService) autoRenewClients(tx *gorm.DB) (bool, int64, error) { | ||||||
| 							struct { | 							struct { | ||||||
| 								protocol string | 								protocol string | ||||||
| 								tag      string | 								tag      string | ||||||
| 								client   map[string]interface{} | 								client   map[string]any | ||||||
| 							}{ | 							}{ | ||||||
| 								protocol: string(inbounds[inbound_index].Protocol), | 								protocol: string(inbounds[inbound_index].Protocol), | ||||||
| 								tag:      inbounds[inbound_index].Tag, | 								tag:      inbounds[inbound_index].Tag, | ||||||
| 								client:   c, | 								client:   c, | ||||||
| 							}) | 							}) | ||||||
| 					} | 					} | ||||||
| 					clients[client_index] = interface{}(c) | 					clients[client_index] = any(c) | ||||||
| 					break | 					break | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
|  | @ -1147,7 +1147,7 @@ func (s *InboundService) AddClientStat(tx *gorm.DB, inboundId int, client *model | ||||||
| func (s *InboundService) UpdateClientStat(tx *gorm.DB, email string, client *model.Client) error { | func (s *InboundService) UpdateClientStat(tx *gorm.DB, email string, client *model.Client) error { | ||||||
| 	result := tx.Model(xray.ClientTraffic{}). | 	result := tx.Model(xray.ClientTraffic{}). | ||||||
| 		Where("email = ?", email). | 		Where("email = ?", email). | ||||||
| 		Updates(map[string]interface{}{ | 		Updates(map[string]any{ | ||||||
| 			"enable":      true, | 			"enable":      true, | ||||||
| 			"email":       client.Email, | 			"email":       client.Email, | ||||||
| 			"total":       client.TotalGB, | 			"total":       client.TotalGB, | ||||||
|  | @ -1258,18 +1258,18 @@ func (s *InboundService) SetClientTelegramUserID(trafficId int, tgId int64) (boo | ||||||
| 		return false, common.NewError("Client Not Found For Email:", clientEmail) | 		return false, common.NewError("Client Not Found For Email:", clientEmail) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var settings map[string]interface{} | 	var settings map[string]any | ||||||
| 	err = json.Unmarshal([]byte(inbound.Settings), &settings) | 	err = json.Unmarshal([]byte(inbound.Settings), &settings) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 	clients := settings["clients"].([]interface{}) | 	clients := settings["clients"].([]any) | ||||||
| 	var newClients []interface{} | 	var newClients []any | ||||||
| 	for client_index := range clients { | 	for client_index := range clients { | ||||||
| 		c := clients[client_index].(map[string]interface{}) | 		c := clients[client_index].(map[string]any) | ||||||
| 		if c["email"] == clientEmail { | 		if c["email"] == clientEmail { | ||||||
| 			c["tgId"] = tgId | 			c["tgId"] = tgId | ||||||
| 			newClients = append(newClients, interface{}(c)) | 			newClients = append(newClients, any(c)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	settings["clients"] = newClients | 	settings["clients"] = newClients | ||||||
|  | @ -1343,18 +1343,18 @@ func (s *InboundService) ToggleClientEnableByEmail(clientEmail string) (bool, bo | ||||||
| 		return false, false, common.NewError("Client Not Found For Email:", clientEmail) | 		return false, false, common.NewError("Client Not Found For Email:", clientEmail) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var settings map[string]interface{} | 	var settings map[string]any | ||||||
| 	err = json.Unmarshal([]byte(inbound.Settings), &settings) | 	err = json.Unmarshal([]byte(inbound.Settings), &settings) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, false, err | 		return false, false, err | ||||||
| 	} | 	} | ||||||
| 	clients := settings["clients"].([]interface{}) | 	clients := settings["clients"].([]any) | ||||||
| 	var newClients []interface{} | 	var newClients []any | ||||||
| 	for client_index := range clients { | 	for client_index := range clients { | ||||||
| 		c := clients[client_index].(map[string]interface{}) | 		c := clients[client_index].(map[string]any) | ||||||
| 		if c["email"] == clientEmail { | 		if c["email"] == clientEmail { | ||||||
| 			c["enable"] = !clientOldEnabled | 			c["enable"] = !clientOldEnabled | ||||||
| 			newClients = append(newClients, interface{}(c)) | 			newClients = append(newClients, any(c)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	settings["clients"] = newClients | 	settings["clients"] = newClients | ||||||
|  | @ -1405,18 +1405,18 @@ func (s *InboundService) ResetClientIpLimitByEmail(clientEmail string, count int | ||||||
| 		return false, common.NewError("Client Not Found For Email:", clientEmail) | 		return false, common.NewError("Client Not Found For Email:", clientEmail) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var settings map[string]interface{} | 	var settings map[string]any | ||||||
| 	err = json.Unmarshal([]byte(inbound.Settings), &settings) | 	err = json.Unmarshal([]byte(inbound.Settings), &settings) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 	clients := settings["clients"].([]interface{}) | 	clients := settings["clients"].([]any) | ||||||
| 	var newClients []interface{} | 	var newClients []any | ||||||
| 	for client_index := range clients { | 	for client_index := range clients { | ||||||
| 		c := clients[client_index].(map[string]interface{}) | 		c := clients[client_index].(map[string]any) | ||||||
| 		if c["email"] == clientEmail { | 		if c["email"] == clientEmail { | ||||||
| 			c["limitIp"] = count | 			c["limitIp"] = count | ||||||
| 			newClients = append(newClients, interface{}(c)) | 			newClients = append(newClients, any(c)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	settings["clients"] = newClients | 	settings["clients"] = newClients | ||||||
|  | @ -1462,18 +1462,18 @@ func (s *InboundService) ResetClientExpiryTimeByEmail(clientEmail string, expiry | ||||||
| 		return false, common.NewError("Client Not Found For Email:", clientEmail) | 		return false, common.NewError("Client Not Found For Email:", clientEmail) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var settings map[string]interface{} | 	var settings map[string]any | ||||||
| 	err = json.Unmarshal([]byte(inbound.Settings), &settings) | 	err = json.Unmarshal([]byte(inbound.Settings), &settings) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 	clients := settings["clients"].([]interface{}) | 	clients := settings["clients"].([]any) | ||||||
| 	var newClients []interface{} | 	var newClients []any | ||||||
| 	for client_index := range clients { | 	for client_index := range clients { | ||||||
| 		c := clients[client_index].(map[string]interface{}) | 		c := clients[client_index].(map[string]any) | ||||||
| 		if c["email"] == clientEmail { | 		if c["email"] == clientEmail { | ||||||
| 			c["expiryTime"] = expiry_time | 			c["expiryTime"] = expiry_time | ||||||
| 			newClients = append(newClients, interface{}(c)) | 			newClients = append(newClients, any(c)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	settings["clients"] = newClients | 	settings["clients"] = newClients | ||||||
|  | @ -1522,18 +1522,18 @@ func (s *InboundService) ResetClientTrafficLimitByEmail(clientEmail string, tota | ||||||
| 		return false, common.NewError("Client Not Found For Email:", clientEmail) | 		return false, common.NewError("Client Not Found For Email:", clientEmail) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var settings map[string]interface{} | 	var settings map[string]any | ||||||
| 	err = json.Unmarshal([]byte(inbound.Settings), &settings) | 	err = json.Unmarshal([]byte(inbound.Settings), &settings) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return false, err | 		return false, err | ||||||
| 	} | 	} | ||||||
| 	clients := settings["clients"].([]interface{}) | 	clients := settings["clients"].([]any) | ||||||
| 	var newClients []interface{} | 	var newClients []any | ||||||
| 	for client_index := range clients { | 	for client_index := range clients { | ||||||
| 		c := clients[client_index].(map[string]interface{}) | 		c := clients[client_index].(map[string]any) | ||||||
| 		if c["email"] == clientEmail { | 		if c["email"] == clientEmail { | ||||||
| 			c["totalGB"] = totalGB * 1024 * 1024 * 1024 | 			c["totalGB"] = totalGB * 1024 * 1024 * 1024 | ||||||
| 			newClients = append(newClients, interface{}(c)) | 			newClients = append(newClients, any(c)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	settings["clients"] = newClients | 	settings["clients"] = newClients | ||||||
|  | @ -1551,7 +1551,7 @@ func (s *InboundService) ResetClientTrafficByEmail(clientEmail string) error { | ||||||
| 
 | 
 | ||||||
| 	result := db.Model(xray.ClientTraffic{}). | 	result := db.Model(xray.ClientTraffic{}). | ||||||
| 		Where("email = ?", clientEmail). | 		Where("email = ?", clientEmail). | ||||||
| 		Updates(map[string]interface{}{"enable": true, "up": 0, "down": 0}) | 		Updates(map[string]any{"enable": true, "up": 0, "down": 0}) | ||||||
| 
 | 
 | ||||||
| 	err := result.Error | 	err := result.Error | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -1582,14 +1582,14 @@ func (s *InboundService) ResetClientTraffic(id int, clientEmail string) (bool, e | ||||||
| 				s.xrayApi.Init(p.GetAPIPort()) | 				s.xrayApi.Init(p.GetAPIPort()) | ||||||
| 				cipher := "" | 				cipher := "" | ||||||
| 				if string(inbound.Protocol) == "shadowsocks" { | 				if string(inbound.Protocol) == "shadowsocks" { | ||||||
| 					var oldSettings map[string]interface{} | 					var oldSettings map[string]any | ||||||
| 					err = json.Unmarshal([]byte(inbound.Settings), &oldSettings) | 					err = json.Unmarshal([]byte(inbound.Settings), &oldSettings) | ||||||
| 					if err != nil { | 					if err != nil { | ||||||
| 						return false, err | 						return false, err | ||||||
| 					} | 					} | ||||||
| 					cipher = oldSettings["method"].(string) | 					cipher = oldSettings["method"].(string) | ||||||
| 				} | 				} | ||||||
| 				err1 := s.xrayApi.AddUser(string(inbound.Protocol), inbound.Tag, map[string]interface{}{ | 				err1 := s.xrayApi.AddUser(string(inbound.Protocol), inbound.Tag, map[string]any{ | ||||||
| 					"email":    client.Email, | 					"email":    client.Email, | ||||||
| 					"id":       client.ID, | 					"id":       client.ID, | ||||||
| 					"security": client.Security, | 					"security": client.Security, | ||||||
|  | @ -1634,7 +1634,7 @@ func (s *InboundService) ResetAllClientTraffics(id int) error { | ||||||
| 
 | 
 | ||||||
| 	result := db.Model(xray.ClientTraffic{}). | 	result := db.Model(xray.ClientTraffic{}). | ||||||
| 		Where(whereText, id). | 		Where(whereText, id). | ||||||
| 		Updates(map[string]interface{}{"enable": true, "up": 0, "down": 0}) | 		Updates(map[string]any{"enable": true, "up": 0, "down": 0}) | ||||||
| 
 | 
 | ||||||
| 	err := result.Error | 	err := result.Error | ||||||
| 	return err | 	return err | ||||||
|  | @ -1645,7 +1645,7 @@ func (s *InboundService) ResetAllTraffics() error { | ||||||
| 
 | 
 | ||||||
| 	result := db.Model(model.Inbound{}). | 	result := db.Model(model.Inbound{}). | ||||||
| 		Where("user_id > ?", 0). | 		Where("user_id > ?", 0). | ||||||
| 		Updates(map[string]interface{}{"up": 0, "down": 0}) | 		Updates(map[string]any{"up": 0, "down": 0}) | ||||||
| 
 | 
 | ||||||
| 	err := result.Error | 	err := result.Error | ||||||
| 	return err | 	return err | ||||||
|  | @ -1681,17 +1681,17 @@ func (s *InboundService) DelDepletedClients(id int) (err error) { | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 		var oldSettings map[string]interface{} | 		var oldSettings map[string]any | ||||||
| 		err = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings) | 		err = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		oldClients := oldSettings["clients"].([]interface{}) | 		oldClients := oldSettings["clients"].([]any) | ||||||
| 		var newClients []interface{} | 		var newClients []any | ||||||
| 		for _, client := range oldClients { | 		for _, client := range oldClients { | ||||||
| 			deplete := false | 			deplete := false | ||||||
| 			c := client.(map[string]interface{}) | 			c := client.(map[string]any) | ||||||
| 			for _, email := range emails { | 			for _, email := range emails { | ||||||
| 				if email == c["email"].(string) { | 				if email == c["email"].(string) { | ||||||
| 					deplete = true | 					deplete = true | ||||||
|  | @ -1907,14 +1907,14 @@ func (s *InboundService) MigrationRequirements() { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	for inbound_index := range inbounds { | 	for inbound_index := range inbounds { | ||||||
| 		settings := map[string]interface{}{} | 		settings := map[string]any{} | ||||||
| 		json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings) | 		json.Unmarshal([]byte(inbounds[inbound_index].Settings), &settings) | ||||||
| 		clients, ok := settings["clients"].([]interface{}) | 		clients, ok := settings["clients"].([]any) | ||||||
| 		if ok { | 		if ok { | ||||||
| 			// Fix Client configuration problems
 | 			// Fix Client configuration problems
 | ||||||
| 			var newClients []interface{} | 			var newClients []any | ||||||
| 			for client_index := range clients { | 			for client_index := range clients { | ||||||
| 				c := clients[client_index].(map[string]interface{}) | 				c := clients[client_index].(map[string]any) | ||||||
| 
 | 
 | ||||||
| 				// Add email='' if it is not exists
 | 				// Add email='' if it is not exists
 | ||||||
| 				if _, ok := c["email"]; !ok { | 				if _, ok := c["email"]; !ok { | ||||||
|  | @ -1923,7 +1923,7 @@ func (s *InboundService) MigrationRequirements() { | ||||||
| 
 | 
 | ||||||
| 				// Convert string tgId to int64
 | 				// Convert string tgId to int64
 | ||||||
| 				if _, ok := c["tgId"]; ok { | 				if _, ok := c["tgId"]; ok { | ||||||
| 					var tgId interface{} = c["tgId"] | 					var tgId any = c["tgId"] | ||||||
| 					if tgIdStr, ok2 := tgId.(string); ok2 { | 					if tgIdStr, ok2 := tgId.(string); ok2 { | ||||||
| 						tgIdInt64, err := strconv.ParseInt(strings.ReplaceAll(tgIdStr, " ", ""), 10, 64) | 						tgIdInt64, err := strconv.ParseInt(strings.ReplaceAll(tgIdStr, " ", ""), 10, 64) | ||||||
| 						if err == nil { | 						if err == nil { | ||||||
|  | @ -1938,7 +1938,7 @@ func (s *InboundService) MigrationRequirements() { | ||||||
| 						c["flow"] = "" | 						c["flow"] = "" | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 				newClients = append(newClients, interface{}(c)) | 				newClients = append(newClients, any(c)) | ||||||
| 			} | 			} | ||||||
| 			settings["clients"] = newClients | 			settings["clients"] = newClients | ||||||
| 			modifiedSettings, err := json.MarshalIndent(settings, "", "  ") | 			modifiedSettings, err := json.MarshalIndent(settings, "", "  ") | ||||||
|  | @ -1985,14 +1985,14 @@ func (s *InboundService) MigrationRequirements() { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for _, ep := range externalProxy { | 	for _, ep := range externalProxy { | ||||||
| 		var reverses interface{} | 		var reverses any | ||||||
| 		var stream map[string]interface{} | 		var stream map[string]any | ||||||
| 		json.Unmarshal(ep.StreamSettings, &stream) | 		json.Unmarshal(ep.StreamSettings, &stream) | ||||||
| 		if tlsSettings, ok := stream["tlsSettings"].(map[string]interface{}); ok { | 		if tlsSettings, ok := stream["tlsSettings"].(map[string]any); ok { | ||||||
| 			if settings, ok := tlsSettings["settings"].(map[string]interface{}); ok { | 			if settings, ok := tlsSettings["settings"].(map[string]any); ok { | ||||||
| 				if domains, ok := settings["domains"].([]interface{}); ok { | 				if domains, ok := settings["domains"].([]any); ok { | ||||||
| 					for _, domain := range domains { | 					for _, domain := range domains { | ||||||
| 						if domainMap, ok := domain.(map[string]interface{}); ok { | 						if domainMap, ok := domain.(map[string]any); ok { | ||||||
| 							domainMap["forceTls"] = "same" | 							domainMap["forceTls"] = "same" | ||||||
| 							domainMap["port"] = ep.Port | 							domainMap["port"] = ep.Port | ||||||
| 							domainMap["dest"] = domainMap["domain"].(string) | 							domainMap["dest"] = domainMap["domain"].(string) | ||||||
|  |  | ||||||
|  | @ -89,7 +89,7 @@ func (s *OutboundService) ResetOutboundTraffic(tag string) error { | ||||||
| 
 | 
 | ||||||
| 	result := db.Model(model.OutboundTraffics{}). | 	result := db.Model(model.OutboundTraffics{}). | ||||||
| 		Where(whereText, tag). | 		Where(whereText, tag). | ||||||
| 		Updates(map[string]interface{}{"up": 0, "down": 0, "total": 0}) | 		Updates(map[string]any{"up": 0, "down": 0, "total": 0}) | ||||||
| 
 | 
 | ||||||
| 	err := result.Error | 	err := result.Error | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  |  | ||||||
|  | @ -92,6 +92,8 @@ type Release struct { | ||||||
| type ServerService struct { | type ServerService struct { | ||||||
| 	xrayService    XrayService | 	xrayService    XrayService | ||||||
| 	inboundService InboundService | 	inboundService InboundService | ||||||
|  | 	cachedIPv4     string | ||||||
|  | 	cachedIPv6     string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func getPublicIP(url string) string { | func getPublicIP(url string) string { | ||||||
|  | @ -120,6 +122,7 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { | ||||||
| 		T: now, | 		T: now, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// CPU stats
 | ||||||
| 	percents, err := cpu.Percent(0, false) | 	percents, err := cpu.Percent(0, false) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Warning("get cpu percent failed:", err) | 		logger.Warning("get cpu percent failed:", err) | ||||||
|  | @ -133,22 +136,17 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	status.LogicalPro = runtime.NumCPU() | 	status.LogicalPro = runtime.NumCPU() | ||||||
| 	if p != nil && p.IsRunning() { |  | ||||||
| 		status.AppStats.Uptime = p.GetUptime() |  | ||||||
| 	} else { |  | ||||||
| 		status.AppStats.Uptime = 0 |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	cpuInfos, err := cpu.Info() | 	cpuInfos, err := cpu.Info() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Warning("get cpu info failed:", err) | 		logger.Warning("get cpu info failed:", err) | ||||||
| 	} else if len(cpuInfos) > 0 { | 	} else if len(cpuInfos) > 0 { | ||||||
| 		cpuInfo := cpuInfos[0] | 		status.CpuSpeedMhz = cpuInfos[0].Mhz | ||||||
| 		status.CpuSpeedMhz = cpuInfo.Mhz // setting CPU speed in MHz
 |  | ||||||
| 	} else { | 	} else { | ||||||
| 		logger.Warning("could not find cpu info") | 		logger.Warning("could not find cpu info") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Uptime
 | ||||||
| 	upTime, err := host.Uptime() | 	upTime, err := host.Uptime() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Warning("get uptime failed:", err) | 		logger.Warning("get uptime failed:", err) | ||||||
|  | @ -156,6 +154,7 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { | ||||||
| 		status.Uptime = upTime | 		status.Uptime = upTime | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Memory stats
 | ||||||
| 	memInfo, err := mem.VirtualMemory() | 	memInfo, err := mem.VirtualMemory() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Warning("get virtual memory failed:", err) | 		logger.Warning("get virtual memory failed:", err) | ||||||
|  | @ -172,14 +171,16 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { | ||||||
| 		status.Swap.Total = swapInfo.Total | 		status.Swap.Total = swapInfo.Total | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	distInfo, err := disk.Usage("/") | 	// Disk stats
 | ||||||
|  | 	diskInfo, err := disk.Usage("/") | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Warning("get dist usage failed:", err) | 		logger.Warning("get disk usage failed:", err) | ||||||
| 	} else { | 	} else { | ||||||
| 		status.Disk.Current = distInfo.Used | 		status.Disk.Current = diskInfo.Used | ||||||
| 		status.Disk.Total = distInfo.Total | 		status.Disk.Total = diskInfo.Total | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Load averages
 | ||||||
| 	avgState, err := load.Avg() | 	avgState, err := load.Avg() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Warning("get load avg failed:", err) | 		logger.Warning("get load avg failed:", err) | ||||||
|  | @ -187,6 +188,7 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { | ||||||
| 		status.Loads = []float64{avgState.Load1, avgState.Load5, avgState.Load15} | 		status.Loads = []float64{avgState.Load1, avgState.Load5, avgState.Load15} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// Network stats
 | ||||||
| 	ioStats, err := net.IOCounters(false) | 	ioStats, err := net.IOCounters(false) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Warning("get io counters failed:", err) | 		logger.Warning("get io counters failed:", err) | ||||||
|  | @ -207,6 +209,7 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { | ||||||
| 		logger.Warning("can not find io counters") | 		logger.Warning("can not find io counters") | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	// TCP/UDP connections
 | ||||||
| 	status.TcpCount, err = sys.GetTCPCount() | 	status.TcpCount, err = sys.GetTCPCount() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Warning("get tcp connections failed:", err) | 		logger.Warning("get tcp connections failed:", err) | ||||||
|  | @ -217,9 +220,15 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { | ||||||
| 		logger.Warning("get udp connections failed:", err) | 		logger.Warning("get udp connections failed:", err) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	status.PublicIP.IPv4 = getPublicIP("https://api.ipify.org") | 	// IP fetching with caching
 | ||||||
| 	status.PublicIP.IPv6 = getPublicIP("https://api6.ipify.org") | 	if s.cachedIPv4 == "" || s.cachedIPv6 == "" { | ||||||
|  | 		s.cachedIPv4 = getPublicIP("https://api.ipify.org") | ||||||
|  | 		s.cachedIPv6 = getPublicIP("https://api6.ipify.org") | ||||||
|  | 	} | ||||||
|  | 	status.PublicIP.IPv4 = s.cachedIPv4 | ||||||
|  | 	status.PublicIP.IPv6 = s.cachedIPv6 | ||||||
| 
 | 
 | ||||||
|  | 	// Xray status
 | ||||||
| 	if s.xrayService.IsXrayRunning() { | 	if s.xrayService.IsXrayRunning() { | ||||||
| 		status.Xray.State = Running | 		status.Xray.State = Running | ||||||
| 		status.Xray.ErrorMsg = "" | 		status.Xray.ErrorMsg = "" | ||||||
|  | @ -233,9 +242,10 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { | ||||||
| 		status.Xray.ErrorMsg = s.xrayService.GetXrayResult() | 		status.Xray.ErrorMsg = s.xrayService.GetXrayResult() | ||||||
| 	} | 	} | ||||||
| 	status.Xray.Version = s.xrayService.GetXrayVersion() | 	status.Xray.Version = s.xrayService.GetXrayVersion() | ||||||
|  | 
 | ||||||
|  | 	// Application stats
 | ||||||
| 	var rtm runtime.MemStats | 	var rtm runtime.MemStats | ||||||
| 	runtime.ReadMemStats(&rtm) | 	runtime.ReadMemStats(&rtm) | ||||||
| 
 |  | ||||||
| 	status.AppStats.Mem = rtm.Sys | 	status.AppStats.Mem = rtm.Sys | ||||||
| 	status.AppStats.Threads = uint32(runtime.NumGoroutine()) | 	status.AppStats.Threads = uint32(runtime.NumGoroutine()) | ||||||
| 	if p != nil && p.IsRunning() { | 	if p != nil && p.IsRunning() { | ||||||
|  | @ -440,7 +450,7 @@ func (s *ServerService) GetLogs(count string, level string, syslog string) []str | ||||||
| 	return lines | 	return lines | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *ServerService) GetConfigJson() (interface{}, error) { | func (s *ServerService) GetConfigJson() (any, error) { | ||||||
| 	config, err := s.xrayService.GetXrayConfig() | 	config, err := s.xrayService.GetXrayConfig() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | @ -450,7 +460,7 @@ func (s *ServerService) GetConfigJson() (interface{}, error) { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var jsonData interface{} | 	var jsonData any | ||||||
| 	err = json.Unmarshal(contents, &jsonData) | 	err = json.Unmarshal(contents, &jsonData) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | @ -581,7 +591,7 @@ func (s *ServerService) ImportDB(file multipart.File) error { | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *ServerService) GetNewX25519Cert() (interface{}, error) { | func (s *ServerService) GetNewX25519Cert() (any, error) { | ||||||
| 	// Run the command
 | 	// Run the command
 | ||||||
| 	cmd := exec.Command(xray.GetBinaryPath(), "x25519") | 	cmd := exec.Command(xray.GetBinaryPath(), "x25519") | ||||||
| 	var out bytes.Buffer | 	var out bytes.Buffer | ||||||
|  | @ -599,7 +609,7 @@ func (s *ServerService) GetNewX25519Cert() (interface{}, error) { | ||||||
| 	privateKey := strings.TrimSpace(privateKeyLine[1]) | 	privateKey := strings.TrimSpace(privateKeyLine[1]) | ||||||
| 	publicKey := strings.TrimSpace(publicKeyLine[1]) | 	publicKey := strings.TrimSpace(publicKeyLine[1]) | ||||||
| 
 | 
 | ||||||
| 	keyPair := map[string]interface{}{ | 	keyPair := map[string]any{ | ||||||
| 		"privateKey": privateKey, | 		"privateKey": privateKey, | ||||||
| 		"publicKey":  publicKey, | 		"publicKey":  publicKey, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -74,8 +74,8 @@ var defaultValueMap = map[string]string{ | ||||||
| 
 | 
 | ||||||
| type SettingService struct{} | type SettingService struct{} | ||||||
| 
 | 
 | ||||||
| func (s *SettingService) GetDefaultJsonConfig() (interface{}, error) { | func (s *SettingService) GetDefaultJsonConfig() (any, error) { | ||||||
| 	var jsonData interface{} | 	var jsonData any | ||||||
| 	err := json.Unmarshal([]byte(xrayTemplateConfig), &jsonData) | 	err := json.Unmarshal([]byte(xrayTemplateConfig), &jsonData) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | @ -543,8 +543,8 @@ func (s *SettingService) UpdateAllSetting(allSetting *entity.AllSetting) error { | ||||||
| 	return common.Combine(errs...) | 	return common.Combine(errs...) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *SettingService) GetDefaultXrayConfig() (interface{}, error) { | func (s *SettingService) GetDefaultXrayConfig() (any, error) { | ||||||
| 	var jsonData interface{} | 	var jsonData any | ||||||
| 	err := json.Unmarshal([]byte(xrayTemplateConfig), &jsonData) | 	err := json.Unmarshal([]byte(xrayTemplateConfig), &jsonData) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
|  | @ -552,24 +552,24 @@ func (s *SettingService) GetDefaultXrayConfig() (interface{}, error) { | ||||||
| 	return jsonData, nil | 	return jsonData, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (s *SettingService) GetDefaultSettings(host string) (interface{}, error) { | func (s *SettingService) GetDefaultSettings(host string) (any, error) { | ||||||
| 	type settingFunc func() (interface{}, error) | 	type settingFunc func() (any, error) | ||||||
| 	settings := map[string]settingFunc{ | 	settings := map[string]settingFunc{ | ||||||
| 		"expireDiff":    func() (interface{}, error) { return s.GetExpireDiff() }, | 		"expireDiff":    func() (any, error) { return s.GetExpireDiff() }, | ||||||
| 		"trafficDiff":   func() (interface{}, error) { return s.GetTrafficDiff() }, | 		"trafficDiff":   func() (any, error) { return s.GetTrafficDiff() }, | ||||||
| 		"pageSize":      func() (interface{}, error) { return s.GetPageSize() }, | 		"pageSize":      func() (any, error) { return s.GetPageSize() }, | ||||||
| 		"defaultCert":   func() (interface{}, error) { return s.GetCertFile() }, | 		"defaultCert":   func() (any, error) { return s.GetCertFile() }, | ||||||
| 		"defaultKey":    func() (interface{}, error) { return s.GetKeyFile() }, | 		"defaultKey":    func() (any, error) { return s.GetKeyFile() }, | ||||||
| 		"tgBotEnable":   func() (interface{}, error) { return s.GetTgbotEnabled() }, | 		"tgBotEnable":   func() (any, error) { return s.GetTgbotEnabled() }, | ||||||
| 		"subEnable":     func() (interface{}, error) { return s.GetSubEnable() }, | 		"subEnable":     func() (any, error) { return s.GetSubEnable() }, | ||||||
| 		"subURI":        func() (interface{}, error) { return s.GetSubURI() }, | 		"subURI":        func() (any, error) { return s.GetSubURI() }, | ||||||
| 		"subJsonURI":    func() (interface{}, error) { return s.GetSubJsonURI() }, | 		"subJsonURI":    func() (any, error) { return s.GetSubJsonURI() }, | ||||||
| 		"remarkModel":   func() (interface{}, error) { return s.GetRemarkModel() }, | 		"remarkModel":   func() (any, error) { return s.GetRemarkModel() }, | ||||||
| 		"datepicker":    func() (interface{}, error) { return s.GetDatepicker() }, | 		"datepicker":    func() (any, error) { return s.GetDatepicker() }, | ||||||
| 		"ipLimitEnable": func() (interface{}, error) { return s.GetIpLimitEnable() }, | 		"ipLimitEnable": func() (any, error) { return s.GetIpLimitEnable() }, | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	result := make(map[string]interface{}) | 	result := make(map[string]any) | ||||||
| 
 | 
 | ||||||
| 	for key, fn := range settings { | 	for key, fn := range settings { | ||||||
| 		value, err := fn() | 		value, err := fn() | ||||||
|  |  | ||||||
|  | @ -20,6 +20,8 @@ import ( | ||||||
| 	"x-ui/web/locale" | 	"x-ui/web/locale" | ||||||
| 	"x-ui/xray" | 	"x-ui/xray" | ||||||
| 
 | 
 | ||||||
|  | 	"slices" | ||||||
|  | 
 | ||||||
| 	"github.com/mymmrac/telego" | 	"github.com/mymmrac/telego" | ||||||
| 	th "github.com/mymmrac/telego/telegohandler" | 	th "github.com/mymmrac/telego/telegohandler" | ||||||
| 	tu "github.com/mymmrac/telego/telegoutil" | 	tu "github.com/mymmrac/telego/telegoutil" | ||||||
|  | @ -894,12 +896,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func checkAdmin(tgId int64) bool { | func checkAdmin(tgId int64) bool { | ||||||
| 	for _, adminId := range adminIds { | 	return slices.Contains(adminIds, tgId) | ||||||
| 		if adminId == tgId { |  | ||||||
| 			return true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) { | func (t *Tgbot) SendAnswer(chatId int64, msg string, isAdmin bool) { | ||||||
|  | @ -1692,12 +1689,7 @@ func (t *Tgbot) notifyExhausted() { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func int64Contains(slice []int64, item int64) bool { | func int64Contains(slice []int64, item int64) bool { | ||||||
| 	for _, s := range slice { | 	return slices.Contains(slice, item) | ||||||
| 		if s == item { |  | ||||||
| 			return true |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	return false |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (t *Tgbot) onlineClients(chatId int64, messageID ...int) { | func (t *Tgbot) onlineClients(chatId int64, messageID ...int) { | ||||||
|  |  | ||||||
|  | @ -46,7 +46,7 @@ func (s *UserService) UpdateUser(id int, username string, password string) error | ||||||
| 	db := database.GetDB() | 	db := database.GetDB() | ||||||
| 	return db.Model(model.User{}). | 	return db.Model(model.User{}). | ||||||
| 		Where("id = ?", id). | 		Where("id = ?", id). | ||||||
| 		Updates(map[string]interface{}{"username": username, "password": password}). | 		Updates(map[string]any{"username": username, "password": password}). | ||||||
| 		Error | 		Error | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -56,8 +56,7 @@ func (s *WarpService) GetWarpConfig() (string, error) { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	defer resp.Body.Close() | 	defer resp.Body.Close() | ||||||
| 	buffer := bytes.NewBuffer(make([]byte, 8192)) | 	buffer := &bytes.Buffer{} | ||||||
| 	buffer.Reset() |  | ||||||
| 	_, err = buffer.ReadFrom(resp.Body) | 	_, err = buffer.ReadFrom(resp.Body) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
|  | @ -87,14 +86,13 @@ func (s *WarpService) RegWarp(secretKey string, publicKey string) (string, error | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	defer resp.Body.Close() | 	defer resp.Body.Close() | ||||||
| 	buffer := bytes.NewBuffer(make([]byte, 8192)) | 	buffer := &bytes.Buffer{} | ||||||
| 	buffer.Reset() |  | ||||||
| 	_, err = buffer.ReadFrom(resp.Body) | 	_, err = buffer.ReadFrom(resp.Body) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var rspData map[string]interface{} | 	var rspData map[string]any | ||||||
| 	err = json.Unmarshal(buffer.Bytes(), &rspData) | 	err = json.Unmarshal(buffer.Bytes(), &rspData) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
|  | @ -102,7 +100,7 @@ func (s *WarpService) RegWarp(secretKey string, publicKey string) (string, error | ||||||
| 
 | 
 | ||||||
| 	deviceId := rspData["id"].(string) | 	deviceId := rspData["id"].(string) | ||||||
| 	token := rspData["token"].(string) | 	token := rspData["token"].(string) | ||||||
| 	license, ok := rspData["account"].(map[string]interface{})["license"].(string) | 	license, ok := rspData["account"].(map[string]any)["license"].(string) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		logger.Debug("Error accessing license value.") | 		logger.Debug("Error accessing license value.") | ||||||
| 		return "", err | 		return "", err | ||||||
|  | @ -144,21 +142,20 @@ func (s *WarpService) SetWarpLicense(license string) (string, error) { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	defer resp.Body.Close() | 	defer resp.Body.Close() | ||||||
| 	buffer := bytes.NewBuffer(make([]byte, 8192)) | 	buffer := &bytes.Buffer{} | ||||||
| 	buffer.Reset() |  | ||||||
| 	_, err = buffer.ReadFrom(resp.Body) | 	_, err = buffer.ReadFrom(resp.Body) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	var response map[string]interface{} | 	var response map[string]any | ||||||
| 	err = json.Unmarshal(buffer.Bytes(), &response) | 	err = json.Unmarshal(buffer.Bytes(), &response) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 	if response["success"] == false { | 	if response["success"] == false { | ||||||
| 		errorArr, _ := response["errors"].([]interface{}) | 		errorArr, _ := response["errors"].([]any) | ||||||
| 		errorObj := errorArr[0].(map[string]interface{}) | 		errorObj := errorArr[0].(map[string]any) | ||||||
| 		return "", common.NewError(errorObj["code"], errorObj["message"]) | 		return "", common.NewError(errorObj["code"], errorObj["message"]) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -56,7 +56,7 @@ func (s *XrayService) GetXrayVersion() string { | ||||||
| 	return p.GetVersion() | 	return p.GetVersion() | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func RemoveIndex(s []interface{}, index int) []interface{} { | func RemoveIndex(s []any, index int) []any { | ||||||
| 	return append(s[:index], s[index+1:]...) | 	return append(s[:index], s[index+1:]...) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -83,16 +83,16 @@ func (s *XrayService) GetXrayConfig() (*xray.Config, error) { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		// get settings clients
 | 		// get settings clients
 | ||||||
| 		settings := map[string]interface{}{} | 		settings := map[string]any{} | ||||||
| 		json.Unmarshal([]byte(inbound.Settings), &settings) | 		json.Unmarshal([]byte(inbound.Settings), &settings) | ||||||
| 		clients, ok := settings["clients"].([]interface{}) | 		clients, ok := settings["clients"].([]any) | ||||||
| 		if ok { | 		if ok { | ||||||
| 			// check users active or not
 | 			// check users active or not
 | ||||||
| 			clientStats := inbound.ClientStats | 			clientStats := inbound.ClientStats | ||||||
| 			for _, clientTraffic := range clientStats { | 			for _, clientTraffic := range clientStats { | ||||||
| 				indexDecrease := 0 | 				indexDecrease := 0 | ||||||
| 				for index, client := range clients { | 				for index, client := range clients { | ||||||
| 					c := client.(map[string]interface{}) | 					c := client.(map[string]any) | ||||||
| 					if c["email"] == clientTraffic.Email { | 					if c["email"] == clientTraffic.Email { | ||||||
| 						if !clientTraffic.Enable { | 						if !clientTraffic.Enable { | ||||||
| 							clients = RemoveIndex(clients, index-indexDecrease) | 							clients = RemoveIndex(clients, index-indexDecrease) | ||||||
|  | @ -104,9 +104,9 @@ func (s *XrayService) GetXrayConfig() (*xray.Config, error) { | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			// clear client config for additional parameters
 | 			// clear client config for additional parameters
 | ||||||
| 			var final_clients []interface{} | 			var final_clients []any | ||||||
| 			for _, client := range clients { | 			for _, client := range clients { | ||||||
| 				c := client.(map[string]interface{}) | 				c := client.(map[string]any) | ||||||
| 				if c["enable"] != nil { | 				if c["enable"] != nil { | ||||||
| 					if enable, ok := c["enable"].(bool); ok && !enable { | 					if enable, ok := c["enable"].(bool); ok && !enable { | ||||||
| 						continue | 						continue | ||||||
|  | @ -120,7 +120,7 @@ func (s *XrayService) GetXrayConfig() (*xray.Config, error) { | ||||||
| 						c["flow"] = "xtls-rprx-vision" | 						c["flow"] = "xtls-rprx-vision" | ||||||
| 					} | 					} | ||||||
| 				} | 				} | ||||||
| 				final_clients = append(final_clients, interface{}(c)) | 				final_clients = append(final_clients, any(c)) | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			settings["clients"] = final_clients | 			settings["clients"] = final_clients | ||||||
|  | @ -134,12 +134,12 @@ func (s *XrayService) GetXrayConfig() (*xray.Config, error) { | ||||||
| 
 | 
 | ||||||
| 		if len(inbound.StreamSettings) > 0 { | 		if len(inbound.StreamSettings) > 0 { | ||||||
| 			// Unmarshal stream JSON
 | 			// Unmarshal stream JSON
 | ||||||
| 			var stream map[string]interface{} | 			var stream map[string]any | ||||||
| 			json.Unmarshal([]byte(inbound.StreamSettings), &stream) | 			json.Unmarshal([]byte(inbound.StreamSettings), &stream) | ||||||
| 
 | 
 | ||||||
| 			// Remove the "settings" field under "tlsSettings" and "realitySettings"
 | 			// Remove the "settings" field under "tlsSettings" and "realitySettings"
 | ||||||
| 			tlsSettings, ok1 := stream["tlsSettings"].(map[string]interface{}) | 			tlsSettings, ok1 := stream["tlsSettings"].(map[string]any) | ||||||
| 			realitySettings, ok2 := stream["realitySettings"].(map[string]interface{}) | 			realitySettings, ok2 := stream["realitySettings"].(map[string]any) | ||||||
| 			if ok1 || ok2 { | 			if ok1 || ok2 { | ||||||
| 				if ok1 { | 				if ok1 { | ||||||
| 					delete(tlsSettings, "settings") | 					delete(tlsSettings, "settings") | ||||||
|  |  | ||||||
|  | @ -92,7 +92,7 @@ func (x *XrayAPI) DelInbound(tag string) error { | ||||||
| 	return err | 	return err | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (x *XrayAPI) AddUser(Protocol string, inboundTag string, user map[string]interface{}) error { | func (x *XrayAPI) AddUser(Protocol string, inboundTag string, user map[string]any) error { | ||||||
| 	var account *serial.TypedMessage | 	var account *serial.TypedMessage | ||||||
| 	switch Protocol { | 	switch Protocol { | ||||||
| 	case "vmess": | 	case "vmess": | ||||||
|  |  | ||||||
|  | @ -64,7 +64,7 @@ func GetAccessLogPath() (string, error) { | ||||||
| 		return "", err | 		return "", err | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	jsonConfig := map[string]interface{}{} | 	jsonConfig := map[string]any{} | ||||||
| 	err = json.Unmarshal([]byte(config), &jsonConfig) | 	err = json.Unmarshal([]byte(config), &jsonConfig) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		logger.Warningf("Failed to parse JSON configuration: %s", err) | 		logger.Warningf("Failed to parse JSON configuration: %s", err) | ||||||
|  | @ -72,7 +72,7 @@ func GetAccessLogPath() (string, error) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if jsonConfig["log"] != nil { | 	if jsonConfig["log"] != nil { | ||||||
| 		jsonLog := jsonConfig["log"].(map[string]interface{}) | 		jsonLog := jsonConfig["log"].(map[string]any) | ||||||
| 		if jsonLog["access"] != nil { | 		if jsonLog["access"] != nil { | ||||||
| 			accessLogPath := jsonLog["access"].(string) | 			accessLogPath := jsonLog["access"].(string) | ||||||
| 			return accessLogPath, nil | 			return accessLogPath, nil | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue