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
diff options
context:
space:
mode:
Diffstat (limited to 'sub/subService.go')
-rw-r--r--sub/subService.go68
1 files changed, 67 insertions, 1 deletions
diff --git a/sub/subService.go b/sub/subService.go
index b6422dd4..a4d38485 100644
--- a/sub/subService.go
+++ b/sub/subService.go
@@ -120,7 +120,7 @@ func (s *SubService) getInboundsBySubId(subId string) ([]*model.Inbound, error)
FROM inbounds,
JSON_EACH(JSON_EXTRACT(inbounds.settings, '$.clients')) AS client
WHERE
- protocol in ('vmess','vless','trojan','shadowsocks')
+ protocol in ('vmess','vless','trojan','shadowsocks','hysteria')
AND JSON_EXTRACT(client.value, '$.subId') = ? AND enable = ?
)`, subId, true).Find(&inbounds).Error
if err != nil {
@@ -171,6 +171,8 @@ func (s *SubService) getLink(inbound *model.Inbound, email string) string {
return s.genTrojanLink(inbound, email)
case "shadowsocks":
return s.genShadowsocksLink(inbound, email)
+ case "hysteria":
+ return s.genHysteriaLink(inbound, email)
}
return ""
}
@@ -885,6 +887,70 @@ func (s *SubService) genShadowsocksLink(inbound *model.Inbound, email string) st
return url.String()
}
+func (s *SubService) genHysteriaLink(inbound *model.Inbound, email string) string {
+ address := s.address
+ if inbound.Protocol != model.Hysteria {
+ return ""
+ }
+ var stream map[string]interface{}
+ json.Unmarshal([]byte(inbound.StreamSettings), &stream)
+ clients, _ := s.inboundService.GetClients(inbound)
+ clientIndex := -1
+ for i, client := range clients {
+ if client.Email == email {
+ clientIndex = i
+ break
+ }
+ }
+ auth := clients[clientIndex].Auth
+ port := inbound.Port
+ params := make(map[string]string)
+
+ params["security"] = "tls"
+ tlsSetting, _ := stream["tlsSettings"].(map[string]interface{})
+ alpns, _ := tlsSetting["alpn"].([]interface{})
+ var alpn []string
+ for _, a := range alpns {
+ alpn = append(alpn, a.(string))
+ }
+ if len(alpn) > 0 {
+ params["alpn"] = strings.Join(alpn, ",")
+ }
+ if sniValue, ok := searchKey(tlsSetting, "serverName"); ok {
+ params["sni"], _ = sniValue.(string)
+ }
+
+ tlsSettings, _ := searchKey(tlsSetting, "settings")
+ if tlsSetting != nil {
+ if fpValue, ok := searchKey(tlsSettings, "fingerprint"); ok {
+ params["fp"], _ = fpValue.(string)
+ }
+ if insecure, ok := searchKey(tlsSettings, "allowInsecure"); ok {
+ if insecure.(bool) {
+ params["insecure"] = "1"
+ }
+ }
+ }
+
+ var settings map[string]interface{}
+ json.Unmarshal([]byte(inbound.Settings), &settings)
+ version, _ := settings["version"].(float64)
+ protocol := "hysteria2"
+ if int(version) == 1 {
+ protocol = "hysteria"
+ }
+
+ link := fmt.Sprintf("%s://%s@%s:%d", protocol, auth, address, port)
+ url, _ := url.Parse(link)
+ q := url.Query()
+ for k, v := range params {
+ q.Add(k, v)
+ }
+ url.RawQuery = q.Encode()
+ url.Fragment = s.genRemark(inbound, email, "")
+ return url.String()
+}
+
func (s *SubService) genRemark(inbound *model.Inbound, email string, extra string) string {
separationChar := string(s.remarkModel[0])
orderChars := s.remarkModel[1:]