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 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-07-12 23:42:36 +02:00
co-authored by Claude Sonnet 5
parent 067d0af323
commit 0dbb916866
2 changed files with 45 additions and 21 deletions
+18 -2
View File
@@ -412,7 +412,14 @@ func (o *JsonDB) GetClients(hasQRCode bool) ([]model.ClientData, error) {
// generate client qrcode image in base64 // generate client qrcode image in base64
if hasQRCode && client.PrivateKey != "" { if hasQRCode && client.PrivateKey != "" {
server, _ := o.GetServerByID(util.DefaultServerID) 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 {
globalSettings, _ := o.GetGlobalSettings() globalSettings, _ := o.GetGlobalSettings()
png, err := qrcode.Encode(util.BuildClientConfig(client, server, globalSettings), qrcode.Medium, 256) png, err := qrcode.Encode(util.BuildClientConfig(client, server, globalSettings), qrcode.Medium, 256)
@@ -422,6 +429,7 @@ func (o *JsonDB) GetClients(hasQRCode bool) ([]model.ClientData, error) {
fmt.Print("Cannot generate QR code: ", err) fmt.Print("Cannot generate QR code: ", err)
} }
} }
}
// create the list of clients and their qrcode data // create the list of clients and their qrcode data
clientData.Client = &client clientData.Client = &client
@@ -442,7 +450,14 @@ func (o *JsonDB) GetClientByID(clientID string, qrCodeSettings model.QRCodeSetti
// generate client qrcode image in base64 // generate client qrcode image in base64
if qrCodeSettings.Enabled && client.PrivateKey != "" { if qrCodeSettings.Enabled && client.PrivateKey != "" {
server, _ := o.GetServerByID(util.DefaultServerID) 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 {
globalSettings, _ := o.GetGlobalSettings() globalSettings, _ := o.GetGlobalSettings()
client := client client := client
if !qrCodeSettings.IncludeDNS { if !qrCodeSettings.IncludeDNS {
@@ -459,6 +474,7 @@ func (o *JsonDB) GetClientByID(clientID string, qrCodeSettings model.QRCodeSetti
fmt.Print("Cannot generate QR code: ", err) fmt.Print("Cannot generate QR code: ", err)
} }
} }
}
clientData.Client = &client clientData.Client = &client
+9 -1
View File
@@ -633,7 +633,15 @@ func SendRequestedConfigsToTelegram(db store.IStore, userid int64) []string {
} }
// build config // 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() globalSettings, _ := db.GetGlobalSettings()
config := BuildClientConfig(*clientData.Client, server, globalSettings) config := BuildClientConfig(*clientData.Client, server, globalSettings)
configData := []byte(config) configData := []byte(config)