From 47ccc7b501faeac895e295e86fc4ae2aea3a31ed Mon Sep 17 00:00:00 2001 From: MHSanaei Date: Tue, 23 May 2023 03:15:34 +0330 Subject: [feature] fallback link calculation Co-Authored-By: Alireza Ahmadi --- sub/subService.go | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'sub') diff --git a/sub/subService.go b/sub/subService.go index fc68b797..3238ca44 100644 --- a/sub/subService.go +++ b/sub/subService.go @@ -38,6 +38,21 @@ func (s *SubService) GetSubs(subId string, host string) ([]string, []string, err if clients == nil { continue } + if len(inbound.Listen) > 0 && inbound.Listen[0] == '@' { + fallbackMaster, err := s.getFallbackMaster(inbound.Listen) + if err == nil { + inbound.Listen = fallbackMaster.Listen + inbound.Port = fallbackMaster.Port + var stream map[string]interface{} + json.Unmarshal([]byte(inbound.StreamSettings), &stream) + var masterStream map[string]interface{} + json.Unmarshal([]byte(fallbackMaster.StreamSettings), &masterStream) + stream["security"] = masterStream["security"] + stream["tlsSettings"] = masterStream["tlsSettings"] + modifiedStream, _ := json.MarshalIndent(stream, "", " ") + inbound.StreamSettings = string(modifiedStream) + } + } for _, client := range clients { if client.Enable && client.SubID == subId { link := s.getLink(inbound, client.Email) @@ -93,6 +108,19 @@ func (s *SubService) getClientTraffics(traffics []xray.ClientTraffic, email stri return xray.ClientTraffic{} } +func (s *SubService) getFallbackMaster(dest string) (*model.Inbound, error) { + db := database.GetDB() + var inbound *model.Inbound + err := db.Model(model.Inbound{}). + Where("JSON_TYPE(settings, '$.fallbacks') = 'array'"). + Where("EXISTS (SELECT * FROM json_each(settings, '$.fallbacks') WHERE json_extract(value, '$.dest') = ?)", dest). + Find(&inbound).Error + if err != nil { + return nil, err + } + return inbound, nil +} + func (s *SubService) getLink(inbound *model.Inbound, email string) string { switch inbound.Protocol { case "vmess": -- cgit v1.2.3