Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/MHSanaei/3x-ui.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/sub
diff options
context:
space:
mode:
authorMHSanaei <ho3ein.sanaei@gmail.com>2023-05-23 02:45:34 +0300
committerMHSanaei <ho3ein.sanaei@gmail.com>2023-05-23 02:45:34 +0300
commit47ccc7b501faeac895e295e86fc4ae2aea3a31ed (patch)
tree130dde164d6ab4341a336e0c2cd73907a992275d /sub
parentc38e1e0cfe9fd95f1cd2ed5f6c6cb10bf820b9b6 (diff)
[feature] fallback link calculation
Co-Authored-By: Alireza Ahmadi <alireza7@gmail.com>
Diffstat (limited to 'sub')
-rw-r--r--sub/subService.go28
1 files changed, 28 insertions, 0 deletions
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":