mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-09-02 08:27:14 +00:00
fix(clients): derive edit-form flow from per-inbound override
SyncInbound runs once per inbound and unconditionally overwrites the canonical clients.Flow column. A non-flow inbound (Hysteria, WS, gRPC) strips flow to "", so when it syncs after a VLESS Reality inbound the column is wiped, and the hydrate endpoint returned that empty value — the edit form loaded a blank flow for multi-inbound clients (#4792). Derive the hydrate flow from the first flow-capable client_inbounds.flow_override instead, which is always correct and order-independent. A non-empty guard in SyncInbound was rejected because it would make flow impossible to clear. Closes #4792
This commit is contained in:
@@ -316,6 +316,32 @@ func (s *ClientService) GetRecordByEmail(tx *gorm.DB, email string) (*model.Clie
|
||||
return row, nil
|
||||
}
|
||||
|
||||
// EffectiveFlow returns the client's flow from the first flow-capable inbound
|
||||
// it is attached to (lowest inbound_id with a non-empty flow_override). The
|
||||
// canonical clients.Flow column is unreliable for multi-inbound clients: a
|
||||
// non-flow inbound (Hysteria, WS, gRPC, …) carries an empty flow and, when its
|
||||
// SyncInbound runs last, overwrites the column to "" even though a VLESS Reality
|
||||
// inbound stored a real flow. The per-inbound flow_override is always correct,
|
||||
// so derive the display flow from it (order-independent). See issue #4792.
|
||||
func (s *ClientService) EffectiveFlow(tx *gorm.DB, recordId int) (string, error) {
|
||||
if tx == nil {
|
||||
tx = database.GetDB()
|
||||
}
|
||||
var flows []string
|
||||
err := tx.Model(&model.ClientInbound{}).
|
||||
Where("client_id = ? AND flow_override <> ?", recordId, "").
|
||||
Order("inbound_id ASC").
|
||||
Limit(1).
|
||||
Pluck("flow_override", &flows).Error
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
if len(flows) == 0 {
|
||||
return "", nil
|
||||
}
|
||||
return flows[0], nil
|
||||
}
|
||||
|
||||
func (s *ClientService) GetInboundIdsForEmail(tx *gorm.DB, email string) ([]int, error) {
|
||||
if tx == nil {
|
||||
tx = database.GetDB()
|
||||
|
||||
Reference in New Issue
Block a user