From aed05fa7f062ef92c8b27d1d4ba5b6ba4d4d9090 Mon Sep 17 00:00:00 2001 From: HamidReza Date: Wed, 18 Mar 2026 23:53:49 +0330 Subject: [PATCH] fix: Fix getting the xray inbound api port --- web/job/check_client_ip_job.go | 57 +++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 12 deletions(-) diff --git a/web/job/check_client_ip_job.go b/web/job/check_client_ip_job.go index d5ea7b2d..eb9b6e4c 100644 --- a/web/job/check_client_ip_job.go +++ b/web/job/check_client_ip_job.go @@ -3,6 +3,7 @@ package job import ( "bufio" "encoding/json" + "errors" "io" "log" "os" @@ -32,6 +33,8 @@ type CheckClientIpJob struct { var job *CheckClientIpJob +const defaultXrayAPIPort = 62789 + // NewCheckClientIpJob creates a new client IP monitoring job instance. func NewCheckClientIpJob() *CheckClientIpJob { job = new(CheckClientIpJob) @@ -387,18 +390,7 @@ func (j *CheckClientIpJob) updateInboundClientIps(inboundClientIps *model.Inboun // disconnectClientTemporarily removes and re-adds a client to force disconnect banned connections func (j *CheckClientIpJob) disconnectClientTemporarily(inbound *model.Inbound, clientEmail string, clients []model.Client) { var xrayAPI xray.XrayAPI - - // Get panel settings for API port - db := database.GetDB() - var apiPort int - var apiPortSetting model.Setting - if err := db.Where("key = ?", "xrayApiPort").First(&apiPortSetting).Error; err == nil { - apiPort, _ = strconv.Atoi(apiPortSetting.Value) - } - - if apiPort == 0 { - apiPort = 10085 // Default API port - } + apiPort := j.resolveXrayAPIPort() err := xrayAPI.Init(apiPort) if err != nil { @@ -439,6 +431,47 @@ func (j *CheckClientIpJob) disconnectClientTemporarily(inbound *model.Inbound, c } } +// resolveXrayAPIPort returns the API inbound port from running config, then template config, then default. +func (j *CheckClientIpJob) resolveXrayAPIPort() int { + if port, err := getAPIPortFromConfigPath(xray.GetConfigPath()); err == nil { + return port + } + + db := database.GetDB() + var template model.Setting + if err := db.Where("key = ?", "xrayTemplateConfig").First(&template).Error; err == nil { + if port, parseErr := getAPIPortFromConfigData([]byte(template.Value)); parseErr == nil { + return port + } + } + + return defaultXrayAPIPort +} + +func getAPIPortFromConfigPath(configPath string) (int, error) { + configData, err := os.ReadFile(configPath) + if err != nil { + return 0, err + } + + return getAPIPortFromConfigData(configData) +} + +func getAPIPortFromConfigData(configData []byte) (int, error) { + xrayConfig := &xray.Config{} + if err := json.Unmarshal(configData, xrayConfig); err != nil { + return 0, err + } + + for _, inboundConfig := range xrayConfig.InboundConfigs { + if inboundConfig.Tag == "api" && inboundConfig.Port > 0 { + return inboundConfig.Port, nil + } + } + + return 0, errors.New("api inbound port not found") +} + func (j *CheckClientIpJob) getInboundByEmail(clientEmail string) (*model.Inbound, error) { db := database.GetDB()