From 0dbb9168667424f68b8caeb43562d6e5668a0f01 Mon Sep 17 00:00:00 2001 From: sysops Date: Sun, 12 Jul 2026 23:42:36 +0200 Subject: [PATCH] Fix nil-pointer crash generating QR codes for non-default servers GetClients, GetClientByID, and SendRequestedConfigsToTelegram all looked up the legacy "wg0" server unconditionally when building a client's QR code / config, ignoring which server the client actually belongs to. On any multi-server setup without a migrated wg0, the server lookup returned a zero-value model.Server (error discarded), and BuildClientConfig then dereferenced its nil KeyPair pointer, panicking whenever a client's QR code was rendered. Now looks up the client's own ServerID (falling back to wg0 only for legacy clients with no ServerID set) and surfaces the lookup error instead of silently continuing with an empty server. Co-Authored-By: Claude Sonnet 5 --- store/jsondb/jsondb.go | 56 +++++++++++++++++++++++++++--------------- util/util.go | 10 +++++++- 2 files changed, 45 insertions(+), 21 deletions(-) diff --git a/store/jsondb/jsondb.go b/store/jsondb/jsondb.go index 05bdf09..dc97028 100644 --- a/store/jsondb/jsondb.go +++ b/store/jsondb/jsondb.go @@ -412,14 +412,22 @@ func (o *JsonDB) GetClients(hasQRCode bool) ([]model.ClientData, error) { // generate client qrcode image in base64 if hasQRCode && client.PrivateKey != "" { - server, _ := o.GetServerByID(util.DefaultServerID) - globalSettings, _ := o.GetGlobalSettings() - - png, err := qrcode.Encode(util.BuildClientConfig(client, server, globalSettings), qrcode.Medium, 256) - if err == nil { - clientData.QRCode = "data:image/png;base64," + base64.StdEncoding.EncodeToString(png) + serverID := client.ServerID + if serverID == "" { + serverID = util.DefaultServerID + } + server, err := o.GetServerByID(serverID) + if err != nil { + fmt.Printf("Cannot generate QR code: server %s not found: %v\n", serverID, err) } else { - fmt.Print("Cannot generate QR code: ", err) + globalSettings, _ := o.GetGlobalSettings() + + png, err := qrcode.Encode(util.BuildClientConfig(client, server, globalSettings), qrcode.Medium, 256) + if err == nil { + clientData.QRCode = "data:image/png;base64," + base64.StdEncoding.EncodeToString(png) + } else { + fmt.Print("Cannot generate QR code: ", err) + } } } @@ -442,21 +450,29 @@ func (o *JsonDB) GetClientByID(clientID string, qrCodeSettings model.QRCodeSetti // generate client qrcode image in base64 if qrCodeSettings.Enabled && client.PrivateKey != "" { - server, _ := o.GetServerByID(util.DefaultServerID) - globalSettings, _ := o.GetGlobalSettings() - client := client - if !qrCodeSettings.IncludeDNS { - globalSettings.DNSServers = []string{} + serverID := client.ServerID + if serverID == "" { + serverID = util.DefaultServerID } - if !qrCodeSettings.IncludeMTU { - globalSettings.MTU = 0 - } - - png, err := qrcode.Encode(util.BuildClientConfig(client, server, globalSettings), qrcode.Medium, 256) - if err == nil { - clientData.QRCode = "data:image/png;base64," + base64.StdEncoding.EncodeToString(png) + server, err := o.GetServerByID(serverID) + if err != nil { + fmt.Printf("Cannot generate QR code: server %s not found: %v\n", serverID, err) } else { - fmt.Print("Cannot generate QR code: ", err) + globalSettings, _ := o.GetGlobalSettings() + client := client + if !qrCodeSettings.IncludeDNS { + globalSettings.DNSServers = []string{} + } + if !qrCodeSettings.IncludeMTU { + globalSettings.MTU = 0 + } + + png, err := qrcode.Encode(util.BuildClientConfig(client, server, globalSettings), qrcode.Medium, 256) + if err == nil { + clientData.QRCode = "data:image/png;base64," + base64.StdEncoding.EncodeToString(png) + } else { + fmt.Print("Cannot generate QR code: ", err) + } } } diff --git a/util/util.go b/util/util.go index 5999fc9..db3925b 100644 --- a/util/util.go +++ b/util/util.go @@ -633,7 +633,15 @@ func SendRequestedConfigsToTelegram(db store.IStore, userid int64) []string { } // build config - server, _ := db.GetServerByID(DefaultServerID) + serverID := clientData.Client.ServerID + if serverID == "" { + serverID = DefaultServerID + } + server, err := db.GetServerByID(serverID) + if err != nil { + failedList = append(failedList, clientData.Client.Name) + continue + } globalSettings, _ := db.GetGlobalSettings() config := BuildClientConfig(*clientData.Client, server, globalSettings) configData := []byte(config)