From 0ca4d492f778fcb3d2088c14f7785c4687592d05 Mon Sep 17 00:00:00 2001 From: RW Date: Sun, 30 Nov 2025 19:08:54 +0100 Subject: [PATCH 1/4] Support legacy jwt import path migration --- cmd/internal/migrations/v3/jwt_extractor.go | 2 +- .../migrations/v3/jwt_extractor_test.go | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/cmd/internal/migrations/v3/jwt_extractor.go b/cmd/internal/migrations/v3/jwt_extractor.go index 4d8889b..a9f4a62 100644 --- a/cmd/internal/migrations/v3/jwt_extractor.go +++ b/cmd/internal/migrations/v3/jwt_extractor.go @@ -13,7 +13,7 @@ import ( ) func MigrateJWTExtractor(cmd *cobra.Command, cwd string, _, _ *semver.Version) error { - reImport := regexp.MustCompile(`(?m)^\s*(?:import\s+)?(?:([\w\.]+)\s+)?"github\.com/gofiber/contrib/jwt(?:/v\d+)?"`) + reImport := regexp.MustCompile(`(?m)^\s*(?:import\s+)?(?:([\w\.]+)\s+)?"github\.com/gofiber/(?:contrib/)?jwt(?:/v\d+)?"`) reAuthScheme := regexp.MustCompile(`(?m)^\s*AuthScheme:\s*([^,\n]+)`) reAuthLine := regexp.MustCompile(`(?m)^\s*AuthScheme:\s*[^\n]+\n?`) reFilter := regexp.MustCompile(`(?m)^(\s*)Filter:\s*`) diff --git a/cmd/internal/migrations/v3/jwt_extractor_test.go b/cmd/internal/migrations/v3/jwt_extractor_test.go index c908790..036b2b5 100644 --- a/cmd/internal/migrations/v3/jwt_extractor_test.go +++ b/cmd/internal/migrations/v3/jwt_extractor_test.go @@ -94,6 +94,39 @@ var _ = authjwt.New(authjwt.Config{ assert.Contains(t, buf.String(), "Migrating jwt middleware configs") } +func Test_MigrateJWTExtractor_LegacyImportPath(t *testing.T) { + t.Parallel() + + dir, err := os.MkdirTemp("", "mjwt_legacy") + require.NoError(t, err) + defer func() { require.NoError(t, os.RemoveAll(dir)) }() + + file := writeTempFile(t, dir, `package main +import ( + jwtware "github.com/gofiber/jwt/v2" + "github.com/gofiber/fiber/v2" +) + +func JWTMiddleware() fiber.Handler { + return jwtware.New(jwtware.Config{ + ErrorHandler: jwtError, + SigningKey: jwtware.SigningKey{Key: []byte(os.Getenv("JWT_SECRET"))}, + TokenLookup: "cookie:jwt", + }) +} +`) + + var buf bytes.Buffer + cmd := newCmd(&buf) + require.NoError(t, v3.MigrateJWTExtractor(cmd, dir, nil, nil)) + + content := readFile(t, file) + assert.NotContains(t, content, "TokenLookup") + assert.Contains(t, content, `Extractor: extractors.FromCookie("jwt")`) + assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) + assert.Contains(t, buf.String(), "Migrating jwt middleware configs") +} + func Test_MigrateJWTExtractor_SkipUnrelatedPackage(t *testing.T) { t.Parallel() From 25dd44eb2551958973fb563d92e6ae1a2162a677 Mon Sep 17 00:00:00 2001 From: RW Date: Sun, 30 Nov 2025 19:18:08 +0100 Subject: [PATCH 2/4] Handle jwt imports with inline comments --- cmd/internal/migrations/v3/jwt_extractor.go | 2 +- .../migrations/v3/jwt_extractor_test.go | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/cmd/internal/migrations/v3/jwt_extractor.go b/cmd/internal/migrations/v3/jwt_extractor.go index a9f4a62..e0b0f9d 100644 --- a/cmd/internal/migrations/v3/jwt_extractor.go +++ b/cmd/internal/migrations/v3/jwt_extractor.go @@ -13,7 +13,7 @@ import ( ) func MigrateJWTExtractor(cmd *cobra.Command, cwd string, _, _ *semver.Version) error { - reImport := regexp.MustCompile(`(?m)^\s*(?:import\s+)?(?:([\w\.]+)\s+)?"github\.com/gofiber/(?:contrib/)?jwt(?:/v\d+)?"`) + reImport := regexp.MustCompile(`(?m)^\s*(?:import\s+)?(?:([\w\.]+)\s+)?"github\.com/gofiber/(?:contrib/)?jwt(?:/v\d+)?"(?:\s*//[^\n]*)?`) reAuthScheme := regexp.MustCompile(`(?m)^\s*AuthScheme:\s*([^,\n]+)`) reAuthLine := regexp.MustCompile(`(?m)^\s*AuthScheme:\s*[^\n]+\n?`) reFilter := regexp.MustCompile(`(?m)^(\s*)Filter:\s*`) diff --git a/cmd/internal/migrations/v3/jwt_extractor_test.go b/cmd/internal/migrations/v3/jwt_extractor_test.go index 036b2b5..8f2cdee 100644 --- a/cmd/internal/migrations/v3/jwt_extractor_test.go +++ b/cmd/internal/migrations/v3/jwt_extractor_test.go @@ -94,6 +94,36 @@ var _ = authjwt.New(authjwt.Config{ assert.Contains(t, buf.String(), "Migrating jwt middleware configs") } +func Test_MigrateJWTExtractor_ImportWithComment(t *testing.T) { + t.Parallel() + + dir, err := os.MkdirTemp("", "mjwt_comment") + require.NoError(t, err) + defer func() { require.NoError(t, os.RemoveAll(dir)) }() + + file := writeTempFile(t, dir, `package main +import ( + jwtware "github.com/gofiber/contrib/jwt" // jwt middleware + "github.com/gofiber/fiber/v2" +) + +func JWTMiddleware() fiber.Handler { + return jwtware.New(jwtware.Config{ + TokenLookup: "cookie:jwt", + }) +}`) + + var buf bytes.Buffer + cmd := newCmd(&buf) + require.NoError(t, v3.MigrateJWTExtractor(cmd, dir, nil, nil)) + + content := readFile(t, file) + assert.NotContains(t, content, "TokenLookup") + assert.Contains(t, content, `Extractor: extractors.FromCookie("jwt")`) + assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) + assert.Contains(t, buf.String(), "Migrating jwt middleware configs") +} + func Test_MigrateJWTExtractor_LegacyImportPath(t *testing.T) { t.Parallel() From ddeb0f5a302cde0d13a6e60cdf8807f90184ec5e Mon Sep 17 00:00:00 2001 From: RW Date: Sun, 30 Nov 2025 19:33:04 +0100 Subject: [PATCH 3/4] Relax JWT extractor assertions for gofmt spacing --- cmd/internal/migrations/v3/jwt_extractor_test.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/cmd/internal/migrations/v3/jwt_extractor_test.go b/cmd/internal/migrations/v3/jwt_extractor_test.go index 8f2cdee..7201bae 100644 --- a/cmd/internal/migrations/v3/jwt_extractor_test.go +++ b/cmd/internal/migrations/v3/jwt_extractor_test.go @@ -36,7 +36,7 @@ var _ = jwtware.New(jwtware.Config{ content := readFile(t, file) assert.NotContains(t, content, "TokenLookup") assert.NotContains(t, content, "AuthScheme") - assert.Contains(t, content, `Extractor: extractors.Chain(extractors.FromAuthHeader("Token"), extractors.FromCookie("jwt"))`) + assert.Regexp(t, `Extractor:\s*extractors.Chain\(extractors.FromAuthHeader\("Token"\),\s*extractors.FromCookie\("jwt"\)\)`, content) assert.Contains(t, content, "Next:") assert.Contains(t, content, "func(c fiber.Ctx) bool { return false },") assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) @@ -89,7 +89,7 @@ var _ = authjwt.New(authjwt.Config{ content := readFile(t, file) assert.NotContains(t, content, "TokenLookup") - assert.Contains(t, content, `Extractor: extractors.FromCookie("session")`) + assert.Regexp(t, `Extractor:\s*extractors.FromCookie\("session"\)`, content) assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) assert.Contains(t, buf.String(), "Migrating jwt middleware configs") } @@ -118,10 +118,10 @@ func JWTMiddleware() fiber.Handler { require.NoError(t, v3.MigrateJWTExtractor(cmd, dir, nil, nil)) content := readFile(t, file) - assert.NotContains(t, content, "TokenLookup") - assert.Contains(t, content, `Extractor: extractors.FromCookie("jwt")`) - assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) - assert.Contains(t, buf.String(), "Migrating jwt middleware configs") + assert.NotContains(t, content, "TokenLookup") + assert.Regexp(t, `Extractor:\s*extractors.FromCookie\("jwt"\)`, content) + assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) + assert.Contains(t, buf.String(), "Migrating jwt middleware configs") } func Test_MigrateJWTExtractor_LegacyImportPath(t *testing.T) { @@ -152,7 +152,7 @@ func JWTMiddleware() fiber.Handler { content := readFile(t, file) assert.NotContains(t, content, "TokenLookup") - assert.Contains(t, content, `Extractor: extractors.FromCookie("jwt")`) + assert.Regexp(t, `Extractor:\s*extractors.FromCookie\("jwt"\)`, content) assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) assert.Contains(t, buf.String(), "Migrating jwt middleware configs") } From 88b6dd57aba88fa90dab650e1d09c0818ef2da27 Mon Sep 17 00:00:00 2001 From: RW Date: Sun, 30 Nov 2025 19:40:41 +0100 Subject: [PATCH 4/4] Format jwt extractor test imports --- cmd/internal/migrations/v3/jwt_extractor_test.go | 14 +++++++------- go.mod | 2 +- go.sum | 2 -- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/cmd/internal/migrations/v3/jwt_extractor_test.go b/cmd/internal/migrations/v3/jwt_extractor_test.go index 7201bae..e42a64c 100644 --- a/cmd/internal/migrations/v3/jwt_extractor_test.go +++ b/cmd/internal/migrations/v3/jwt_extractor_test.go @@ -36,7 +36,7 @@ var _ = jwtware.New(jwtware.Config{ content := readFile(t, file) assert.NotContains(t, content, "TokenLookup") assert.NotContains(t, content, "AuthScheme") - assert.Regexp(t, `Extractor:\s*extractors.Chain\(extractors.FromAuthHeader\("Token"\),\s*extractors.FromCookie\("jwt"\)\)`, content) + assert.Regexp(t, `Extractor:\s*extractors.Chain\(extractors.FromAuthHeader\("Token"\),\s*extractors.FromCookie\("jwt"\)\)`, content) assert.Contains(t, content, "Next:") assert.Contains(t, content, "func(c fiber.Ctx) bool { return false },") assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) @@ -89,7 +89,7 @@ var _ = authjwt.New(authjwt.Config{ content := readFile(t, file) assert.NotContains(t, content, "TokenLookup") - assert.Regexp(t, `Extractor:\s*extractors.FromCookie\("session"\)`, content) + assert.Regexp(t, `Extractor:\s*extractors.FromCookie\("session"\)`, content) assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) assert.Contains(t, buf.String(), "Migrating jwt middleware configs") } @@ -118,10 +118,10 @@ func JWTMiddleware() fiber.Handler { require.NoError(t, v3.MigrateJWTExtractor(cmd, dir, nil, nil)) content := readFile(t, file) - assert.NotContains(t, content, "TokenLookup") - assert.Regexp(t, `Extractor:\s*extractors.FromCookie\("jwt"\)`, content) - assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) - assert.Contains(t, buf.String(), "Migrating jwt middleware configs") + assert.NotContains(t, content, "TokenLookup") + assert.Regexp(t, `Extractor:\s*extractors.FromCookie\("jwt"\)`, content) + assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) + assert.Contains(t, buf.String(), "Migrating jwt middleware configs") } func Test_MigrateJWTExtractor_LegacyImportPath(t *testing.T) { @@ -152,7 +152,7 @@ func JWTMiddleware() fiber.Handler { content := readFile(t, file) assert.NotContains(t, content, "TokenLookup") - assert.Regexp(t, `Extractor:\s*extractors.FromCookie\("jwt"\)`, content) + assert.Regexp(t, `Extractor:\s*extractors.FromCookie\("jwt"\)`, content) assert.Contains(t, content, `"github.com/gofiber/fiber/v3/extractors"`) assert.Contains(t, buf.String(), "Migrating jwt middleware configs") } diff --git a/go.mod b/go.mod index 8aeb521..4b17690 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/spf13/pflag v1.0.10 github.com/stretchr/testify v1.11.1 golang.org/x/mod v0.28.0 + golang.org/x/sync v0.18.0 golang.org/x/tools v0.37.0 ) @@ -53,7 +54,6 @@ require ( github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect golang.org/x/crypto v0.42.0 // indirect golang.org/x/net v0.44.0 // indirect - golang.org/x/sync v0.18.0 // indirect golang.org/x/sys v0.36.0 // indirect golang.org/x/text v0.29.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 6dcc88e..2291c57 100644 --- a/go.sum +++ b/go.sum @@ -111,8 +111,6 @@ golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U= golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=