Merge pull request #5 from netbirdio/fix/groups-migration

fix(sql): handle SQLite text password groups
This commit is contained in:
Nicolas Frati
2026-05-12 13:07:16 +02:00
committed by GitHub
4 changed files with 57 additions and 3 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
module github.com/dexidp/dex
go 1.24.0
go 1.25.0
require (
cloud.google.com/go/compute/metadata v0.9.0
+7 -2
View File
@@ -64,8 +64,13 @@ func (j jsonDecoder) Scan(dest interface{}) error {
if dest == nil {
return errors.New("nil value")
}
b, ok := dest.([]byte)
if !ok {
var b []byte
switch v := dest.(type) {
case []byte:
b = v
case string:
b = []byte(v)
default:
return fmt.Errorf("expected []byte got %T", dest)
}
if err := json.Unmarshal(b, &j.i); err != nil {
+41
View File
@@ -4,7 +4,9 @@
package sql
import (
"context"
"database/sql"
"log/slog"
"reflect"
"testing"
)
@@ -32,6 +34,45 @@ func TestDecoder(t *testing.T) {
}
}
func TestGetPasswordWithTextGroups(t *testing.T) {
logger := slog.New(slog.DiscardHandler)
conn, err := (&SQLite3{File: ":memory:"}).open(logger)
if err != nil {
t.Fatal(err)
}
defer conn.Close()
email := "text-groups@example.com"
_, err = conn.Exec(`
insert into password (
email, hash, username, preferred_username, user_id, groups, name, email_verified
)
values (
$1, $2, $3, $4, $5, CAST('[]' AS TEXT), $6, $7
);`,
email, []byte("hash"), "username", "", "user-id", "", false,
)
if err != nil {
t.Fatal(err)
}
var storageClass string
if err := conn.QueryRow(`select typeof(groups) from password where email = $1;`, email).Scan(&storageClass); err != nil {
t.Fatal(err)
}
if storageClass != "text" {
t.Fatalf("expected groups storage class text, got %q", storageClass)
}
p, err := conn.GetPassword(context.Background(), email)
if err != nil {
t.Fatal(err)
}
if len(p.Groups) != 0 {
t.Fatalf("expected empty groups, got %q", p.Groups)
}
}
func TestEncoder(t *testing.T) {
db, err := sql.Open("sqlite3", ":memory:")
if err != nil {
+8
View File
@@ -473,4 +473,12 @@ var migrations = []migration{
add column connector_data bytea;`,
},
},
// Convert password groups values backfilled from the original default '[]'
// from SQLite TEXT storage class to BLOB.
{
stmts: []string{
`update password set groups = CAST(groups as BLOB);`,
},
flavor: &flavorSQLite3,
},
}