From ed62a99d7dd5f53ec7132a4127a0d0e15cfcc944 Mon Sep 17 00:00:00 2001 From: Jason McNeil Date: Sun, 27 Jul 2025 14:25:06 -0300 Subject: [PATCH 1/2] feat: Add migration for KeyLookup to Extractor in session config --- cmd/internal/migrations/v3/common.go | 35 +++++++++ cmd/internal/migrations/v3/common_test.go | 92 +++++++++++++++++++++++ 2 files changed, 127 insertions(+) diff --git a/cmd/internal/migrations/v3/common.go b/cmd/internal/migrations/v3/common.go index 01f2c28..5d6dafc 100644 --- a/cmd/internal/migrations/v3/common.go +++ b/cmd/internal/migrations/v3/common.go @@ -515,6 +515,41 @@ func MigrateSessionConfig(cmd *cobra.Command, cwd string, _, _ *semver.Version) reConfig := regexp.MustCompile(`session\.Config{[^}]*}`) return reConfig.ReplaceAllStringFunc(content, func(s string) string { s = strings.ReplaceAll(s, "Expiration:", "IdleTimeout:") + + // Handle KeyLookup to Extractor migration + reKeyLookup := regexp.MustCompile(`(\s*)KeyLookup:\s*"([^"]+)"(,?)(\n?)`) + s = reKeyLookup.ReplaceAllStringFunc(s, func(match string) string { + sub := reKeyLookup.FindStringSubmatch(match) + indent := sub[1] + keyLookup := sub[2] + comma := sub[3] + newline := sub[4] + + parts := strings.Split(keyLookup, ":") + if len(parts) != 2 { + // Invalid format, remove + return "" + } + + source := parts[0] + name := parts[1] + + var extractor string + switch source { + case "cookie": + extractor = fmt.Sprintf("Extractor: session.FromCookie(%q)", name) + case "header": + extractor = fmt.Sprintf("Extractor: session.FromHeader(%q)", name) + case "query": + extractor = fmt.Sprintf("Extractor: session.FromQuery(%q)", name) + default: + // Unsupported source, remove + return "" + } + + return fmt.Sprintf("%s%s%s%s", indent, extractor, comma, newline) + }) + return s }) }) diff --git a/cmd/internal/migrations/v3/common_test.go b/cmd/internal/migrations/v3/common_test.go index 760b5cd..1f76a8d 100644 --- a/cmd/internal/migrations/v3/common_test.go +++ b/cmd/internal/migrations/v3/common_test.go @@ -779,6 +779,98 @@ var _ = session.New(session.Config{ assert.Contains(t, buf.String(), "Migrating session middleware configs") } +func Test_MigrateSessionConfig_KeyLookup_Cookie(t *testing.T) { + t.Parallel() + + dir, err := os.MkdirTemp("", "msessionkl_cookie") + require.NoError(t, err) + defer func() { require.NoError(t, os.RemoveAll(dir)) }() + + file := writeTempFile(t, dir, `package main +import "github.com/gofiber/fiber/v2/middleware/session" +var _ = session.New(session.Config{ + KeyLookup: "cookie:session_id", +})`) + + var buf bytes.Buffer + cmd := newCmd(&buf) + require.NoError(t, v3.MigrateSessionConfig(cmd, dir, nil, nil)) + + content := readFile(t, file) + assert.NotContains(t, content, "KeyLookup") + assert.Contains(t, content, `Extractor: session.FromCookie("session_id")`) + assert.Contains(t, buf.String(), "Migrating session middleware configs") +} + +func Test_MigrateSessionConfig_KeyLookup_Header(t *testing.T) { + t.Parallel() + + dir, err := os.MkdirTemp("", "msessionkl_header") + require.NoError(t, err) + defer func() { require.NoError(t, os.RemoveAll(dir)) }() + + file := writeTempFile(t, dir, `package main +import "github.com/gofiber/fiber/v2/middleware/session" +var _ = session.New(session.Config{ + KeyLookup: "header:X-Session-ID", +})`) + + var buf bytes.Buffer + cmd := newCmd(&buf) + require.NoError(t, v3.MigrateSessionConfig(cmd, dir, nil, nil)) + + content := readFile(t, file) + assert.NotContains(t, content, "KeyLookup") + assert.Contains(t, content, `Extractor: session.FromHeader("X-Session-ID")`) + assert.Contains(t, buf.String(), "Migrating session middleware configs") +} + +func Test_MigrateSessionConfig_KeyLookup_Query(t *testing.T) { + t.Parallel() + + dir, err := os.MkdirTemp("", "msessionkl_query") + require.NoError(t, err) + defer func() { require.NoError(t, os.RemoveAll(dir)) }() + + file := writeTempFile(t, dir, `package main +import "github.com/gofiber/fiber/v2/middleware/session" +var _ = session.New(session.Config{ + KeyLookup: "query:session_id", +})`) + + var buf bytes.Buffer + cmd := newCmd(&buf) + require.NoError(t, v3.MigrateSessionConfig(cmd, dir, nil, nil)) + + content := readFile(t, file) + assert.NotContains(t, content, "KeyLookup") + assert.Contains(t, content, `Extractor: session.FromQuery("session_id")`) + assert.Contains(t, buf.String(), "Migrating session middleware configs") +} + +func Test_MigrateSessionConfig_KeyLookup_Unknown(t *testing.T) { + t.Parallel() + + dir, err := os.MkdirTemp("", "msessionkl_unknown") + require.NoError(t, err) + defer func() { require.NoError(t, os.RemoveAll(dir)) }() + + file := writeTempFile(t, dir, `package main +import "github.com/gofiber/fiber/v2/middleware/session" +var _ = session.New(session.Config{ + KeyLookup: "unknown:session_id", +})`) + + var buf bytes.Buffer + cmd := newCmd(&buf) + require.NoError(t, v3.MigrateSessionConfig(cmd, dir, nil, nil)) + + content := readFile(t, file) + assert.NotContains(t, content, "KeyLookup") + assert.NotContains(t, content, "Extractor") + assert.Contains(t, buf.String(), "Migrating session middleware configs") +} + func Test_MigrateTimeoutConfig(t *testing.T) { t.Parallel() From 555e134e18211a5b4710f41d0b14283cdf973b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9?= Date: Wed, 30 Jul 2025 09:40:24 +0200 Subject: [PATCH 2/2] update PR --- cmd/internal/migrations/v3/common.go | 38 +---------------------- cmd/internal/migrations/v3/common_test.go | 16 +++++----- 2 files changed, 9 insertions(+), 45 deletions(-) diff --git a/cmd/internal/migrations/v3/common.go b/cmd/internal/migrations/v3/common.go index 19e3e44..bc8870d 100644 --- a/cmd/internal/migrations/v3/common.go +++ b/cmd/internal/migrations/v3/common.go @@ -602,43 +602,7 @@ func MigrateSessionConfig(cmd *cobra.Command, cwd string, _, _ *semver.Version) err := internal.ChangeFileContent(cwd, func(content string) string { reConfig := regexp.MustCompile(`session\.Config{[^}]*}`) return reConfig.ReplaceAllStringFunc(content, func(s string) string { - s = strings.ReplaceAll(s, "Expiration:", "IdleTimeout:") - - // Handle KeyLookup to Extractor migration - reKeyLookup := regexp.MustCompile(`(\s*)KeyLookup:\s*"([^"]+)"(,?)(\n?)`) - s = reKeyLookup.ReplaceAllStringFunc(s, func(match string) string { - sub := reKeyLookup.FindStringSubmatch(match) - indent := sub[1] - keyLookup := sub[2] - comma := sub[3] - newline := sub[4] - - parts := strings.Split(keyLookup, ":") - if len(parts) != 2 { - // Invalid format, remove - return "" - } - - source := parts[0] - name := parts[1] - - var extractor string - switch source { - case "cookie": - extractor = fmt.Sprintf("Extractor: session.FromCookie(%q)", name) - case "header": - extractor = fmt.Sprintf("Extractor: session.FromHeader(%q)", name) - case "query": - extractor = fmt.Sprintf("Extractor: session.FromQuery(%q)", name) - default: - // Unsupported source, remove - return "" - } - - return fmt.Sprintf("%s%s%s%s", indent, extractor, comma, newline) - }) - - return s + return strings.ReplaceAll(s, "Expiration:", "IdleTimeout:") }) }) if err != nil { diff --git a/cmd/internal/migrations/v3/common_test.go b/cmd/internal/migrations/v3/common_test.go index 61bcb5a..41bd251 100644 --- a/cmd/internal/migrations/v3/common_test.go +++ b/cmd/internal/migrations/v3/common_test.go @@ -849,12 +849,12 @@ var _ = session.New(session.Config{ var buf bytes.Buffer cmd := newCmd(&buf) - require.NoError(t, v3.MigrateSessionConfig(cmd, dir, nil, nil)) + require.NoError(t, v3.MigrateSessionExtractor(cmd, dir, nil, nil)) content := readFile(t, file) assert.NotContains(t, content, "KeyLookup") assert.Contains(t, content, `Extractor: session.FromCookie("session_id")`) - assert.Contains(t, buf.String(), "Migrating session middleware configs") + assert.Contains(t, buf.String(), "Migrating session KeyLookup config") } func Test_MigrateSessionConfig_KeyLookup_Header(t *testing.T) { @@ -872,12 +872,12 @@ var _ = session.New(session.Config{ var buf bytes.Buffer cmd := newCmd(&buf) - require.NoError(t, v3.MigrateSessionConfig(cmd, dir, nil, nil)) + require.NoError(t, v3.MigrateSessionExtractor(cmd, dir, nil, nil)) content := readFile(t, file) assert.NotContains(t, content, "KeyLookup") assert.Contains(t, content, `Extractor: session.FromHeader("X-Session-ID")`) - assert.Contains(t, buf.String(), "Migrating session middleware configs") + assert.Contains(t, buf.String(), "Migrating session KeyLookup config") } func Test_MigrateSessionConfig_KeyLookup_Query(t *testing.T) { @@ -895,12 +895,12 @@ var _ = session.New(session.Config{ var buf bytes.Buffer cmd := newCmd(&buf) - require.NoError(t, v3.MigrateSessionConfig(cmd, dir, nil, nil)) + require.NoError(t, v3.MigrateSessionExtractor(cmd, dir, nil, nil)) content := readFile(t, file) assert.NotContains(t, content, "KeyLookup") assert.Contains(t, content, `Extractor: session.FromQuery("session_id")`) - assert.Contains(t, buf.String(), "Migrating session middleware configs") + assert.Contains(t, buf.String(), "Migrating session KeyLookup config") } func Test_MigrateSessionConfig_KeyLookup_Unknown(t *testing.T) { @@ -918,12 +918,12 @@ var _ = session.New(session.Config{ var buf bytes.Buffer cmd := newCmd(&buf) - require.NoError(t, v3.MigrateSessionConfig(cmd, dir, nil, nil)) + require.NoError(t, v3.MigrateSessionExtractor(cmd, dir, nil, nil)) content := readFile(t, file) assert.NotContains(t, content, "KeyLookup") assert.NotContains(t, content, "Extractor") - assert.Contains(t, buf.String(), "Migrating session middleware configs") + assert.Contains(t, buf.String(), "Migrating session KeyLookup config") } func Test_MigrateTimeoutConfig(t *testing.T) {