mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-09-22 17:56:36 +08:00
fix(node): adopt a node inbound's host overrides into the master
Per-inbound Host overrides (Security/SNI/Fingerprint/ALPN and friends) are looked up by the local inbound id when subscriptions render, but nothing in the node sync ever fetched the node's hosts table: an inbound adopted from a managed node got zero Host rows on the master, so its subscription configs fell back to a bare TLS block without the fingerprint/SNI the node was configured with. When a traffic snapshot carries a tag with no central row yet - the only moment adoption can happen - the sync job now also pulls the node's existing hosts/list endpoint (best-effort, so old nodes just skip it) and the adoption branch materializes that inbound's groups against the new central id inside the same transaction, reusing the group-to-rows projection the hosts API already uses. Master stays authoritative afterwards: this is a one-time import, not a continuous sync, matching how the inbound's own settings are adopted. Closes #5890
This commit is contained in:
@@ -154,6 +154,21 @@ func buildHostRows(groupId string, req *entity.HostGroup) []*model.Host {
|
||||
return rows
|
||||
}
|
||||
|
||||
// adoptedHostRows projects a node's host groups onto a freshly adopted central
|
||||
// inbound so TLS/SNI/fingerprint overrides survive the node-to-master import.
|
||||
func adoptedHostRows(groups []*entity.HostGroup, nodeInboundId, centralInboundId int) []*model.Host {
|
||||
var rows []*model.Host
|
||||
for _, g := range groups {
|
||||
if g == nil || !slices.Contains(g.InboundIds, nodeInboundId) {
|
||||
continue
|
||||
}
|
||||
scoped := *g
|
||||
scoped.InboundIds = []int{centralInboundId}
|
||||
rows = append(rows, buildHostRows(g.GroupId, &scoped)...)
|
||||
}
|
||||
return rows
|
||||
}
|
||||
|
||||
func validateInboundsExist(tx *gorm.DB, inboundIds []int) error {
|
||||
for _, inboundId := range inboundIds {
|
||||
var count int64
|
||||
|
||||
Reference in New Issue
Block a user