Apply inbounds on nodes via Xray with Reality settings and client sync.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+52
-9
@@ -2,6 +2,7 @@ package db
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"time"
|
||||
@@ -228,6 +229,8 @@ func ClientSubscriptionHosts(db *sql.DB, client *models.Client) ([]models.SubHos
|
||||
}
|
||||
rows, err := db.Query(`
|
||||
SELECT i.id, i.tag, i.remark, p.code, p.name, i.port, i.network, i.security,
|
||||
i.path, i.host, i.sni, i.fingerprint, i.flow, i.alpn,
|
||||
i.reality_public_key, i.reality_short_id, i.ss_method, i.password,
|
||||
COALESCE(n.host, ''), COALESCE(n.name, ''),
|
||||
COALESCE(n.status = 'online', FALSE),
|
||||
COALESCE(ni.enabled AND n.status = 'online', FALSE)
|
||||
@@ -250,7 +253,10 @@ ORDER BY i.sort_order ASC, i.tag ASC, n.name ASC NULLS LAST`, client.ID)
|
||||
var h models.SubHost
|
||||
if err := rows.Scan(
|
||||
&h.InboundID, &h.Tag, &h.Remark, &h.ProtocolCode, &h.ProtocolName,
|
||||
&h.Port, &h.Network, &h.Security, &h.Address, &h.NodeName,
|
||||
&h.Port, &h.Network, &h.Security,
|
||||
&h.Path, &h.HostHeader, &h.SNI, &h.Fingerprint, &h.Flow, &h.ALPN,
|
||||
&h.PublicKey, &h.ShortID, &h.SSMethod, &h.Password,
|
||||
&h.Address, &h.NodeName,
|
||||
&h.NodeOnline, &h.Available,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
@@ -266,26 +272,63 @@ ORDER BY i.sort_order ASC, i.tag ASC, n.name ASC NULLS LAST`, client.ID)
|
||||
seen[key] = true
|
||||
|
||||
if h.Available && h.Address != "" {
|
||||
h.Link = buildShareLink(h.ProtocolCode, uid, h.Address, h.Port, h.Network, h.Security, client.Username+"-"+h.Tag)
|
||||
h.Link = buildShareLink(uid, client.Username+"-"+h.Tag, &h)
|
||||
}
|
||||
hosts = append(hosts, h)
|
||||
}
|
||||
return hosts, rows.Err()
|
||||
}
|
||||
|
||||
func buildShareLink(code, uid, host string, port int, network, security, name string) string {
|
||||
func buildShareLink(uid, name string, h *models.SubHost) string {
|
||||
name = url.QueryEscape(name)
|
||||
switch code {
|
||||
q := url.Values{}
|
||||
q.Set("type", h.Network)
|
||||
q.Set("security", h.Security)
|
||||
if h.Path != "" {
|
||||
q.Set("path", h.Path)
|
||||
}
|
||||
if h.HostHeader != "" {
|
||||
q.Set("host", h.HostHeader)
|
||||
}
|
||||
if h.SNI != "" {
|
||||
q.Set("sni", h.SNI)
|
||||
}
|
||||
if h.Fingerprint != "" {
|
||||
q.Set("fp", h.Fingerprint)
|
||||
}
|
||||
if h.Flow != "" {
|
||||
q.Set("flow", h.Flow)
|
||||
}
|
||||
if h.ALPN != "" {
|
||||
q.Set("alpn", h.ALPN)
|
||||
}
|
||||
if h.PublicKey != "" {
|
||||
q.Set("pbk", h.PublicKey)
|
||||
}
|
||||
if h.ShortID != "" {
|
||||
q.Set("sid", h.ShortID)
|
||||
}
|
||||
switch h.ProtocolCode {
|
||||
case "vless":
|
||||
return fmt.Sprintf("vless://%s@%s:%d?encryption=none&type=%s&security=%s#%s", uid, host, port, network, security, name)
|
||||
q.Set("encryption", "none")
|
||||
return fmt.Sprintf("vless://%s@%s:%d?%s#%s", uid, h.Address, h.Port, q.Encode(), name)
|
||||
case "vmess":
|
||||
return fmt.Sprintf("vmess://%s@%s:%d?type=%s&security=%s#%s", uid, host, port, network, security, name)
|
||||
return fmt.Sprintf("vmess://%s@%s:%d?%s#%s", uid, h.Address, h.Port, q.Encode(), name)
|
||||
case "trojan":
|
||||
return fmt.Sprintf("trojan://%s@%s:%d?type=%s&security=%s#%s", uid, host, port, network, security, name)
|
||||
pass := uid
|
||||
if h.Password != "" {
|
||||
pass = h.Password
|
||||
}
|
||||
return fmt.Sprintf("trojan://%s@%s:%d?%s#%s", pass, h.Address, h.Port, q.Encode(), name)
|
||||
case "shadowsocks":
|
||||
return fmt.Sprintf("ss://%s@%s:%d#%s", uid, host, port, name)
|
||||
method := h.SSMethod
|
||||
if method == "" {
|
||||
method = "aes-128-gcm"
|
||||
}
|
||||
userInfo := base64.RawURLEncoding.EncodeToString([]byte(method + ":" + uid))
|
||||
return fmt.Sprintf("ss://%s@%s:%d#%s", userInfo, h.Address, h.Port, name)
|
||||
default:
|
||||
return fmt.Sprintf("%s://%s@%s:%d?type=%s&security=%s#%s", code, uid, host, port, network, security, name)
|
||||
return fmt.Sprintf("%s://%s@%s:%d?%s#%s", h.ProtocolCode, uid, h.Address, h.Port, q.Encode(), name)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user