Skip to content

Commit 64374d6

Browse files
authored
Merge pull request #157 from gofiber/codex/2025-08-14-19-05-20
2 parents e3fbaec + 1ed3d37 commit 64374d6

File tree

3 files changed

+181
-0
lines changed

3 files changed

+181
-0
lines changed

cmd/internal/migrations/lists.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ var Migrations = []Migration{
5757
v3migrations.MigrateEnvVarConfig,
5858
v3migrations.MigrateSessionConfig,
5959
v3migrations.MigrateSessionExtractor,
60+
v3migrations.MigrateKeyAuthConfig,
6061
v3migrations.MigrateTimeoutConfig,
6162
v3migrations.MigrateBasicauthAuthorizer,
6263
v3migrations.MigrateBasicauthConfig,

cmd/internal/migrations/v3/common.go

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,3 +1004,87 @@ func MigrateSessionExtractor(cmd *cobra.Command, cwd string, _, _ *semver.Versio
10041004
cmd.Println("Migrating session KeyLookup config")
10051005
return nil
10061006
}
1007+
1008+
// MigrateKeyAuthConfig updates keyauth middleware configuration to use Extractor
1009+
// instead of KeyLookup/AuthScheme and removes the deprecated fields.
1010+
func MigrateKeyAuthConfig(cmd *cobra.Command, cwd string, _, _ *semver.Version) error {
1011+
reConfig := regexp.MustCompile(`keyauth\.Config{[^}]*}`)
1012+
reKeyLookup := regexp.MustCompile(`(?m)(\s*)KeyLookup:\s*("[^"]+")(,?)(\n?)`)
1013+
reAuthScheme := regexp.MustCompile(`(?m)\s*AuthScheme:\s*([^,\n]+)`)
1014+
1015+
err := internal.ChangeFileContent(cwd, func(content string) string {
1016+
return reConfig.ReplaceAllStringFunc(content, func(cfg string) string {
1017+
keyMatch := reKeyLookup.FindStringSubmatch(cfg)
1018+
if len(keyMatch) < 5 {
1019+
// remove AuthScheme if present
1020+
return removeConfigField(cfg, "AuthScheme")
1021+
}
1022+
1023+
indent := keyMatch[1]
1024+
val := strings.TrimSpace(keyMatch[2])
1025+
comma := keyMatch[3]
1026+
newline := keyMatch[4]
1027+
1028+
if uq, err := strconv.Unquote(val); err == nil {
1029+
val = uq
1030+
}
1031+
1032+
scheme := "Bearer"
1033+
if am := reAuthScheme.FindStringSubmatch(cfg); len(am) > 1 {
1034+
scheme = strings.TrimSpace(am[1])
1035+
if uq, err := strconv.Unquote(scheme); err == nil {
1036+
scheme = uq
1037+
}
1038+
}
1039+
1040+
parts := strings.Split(val, ",")
1041+
var extractors []string
1042+
for _, p := range parts {
1043+
p = strings.TrimSpace(p)
1044+
switch {
1045+
case strings.HasPrefix(p, "header:"):
1046+
header := strings.TrimPrefix(p, "header:")
1047+
if strings.EqualFold(header, "Authorization") {
1048+
extractors = append(extractors, fmt.Sprintf("keyauth.FromAuthHeader(%q, %q)", header, scheme))
1049+
} else {
1050+
extractors = append(extractors, fmt.Sprintf("keyauth.FromHeader(%q)", header))
1051+
}
1052+
case strings.HasPrefix(p, "query:"):
1053+
extractors = append(extractors, fmt.Sprintf("keyauth.FromQuery(%q)", strings.TrimPrefix(p, "query:")))
1054+
case strings.HasPrefix(p, "param:"):
1055+
extractors = append(extractors, fmt.Sprintf("keyauth.FromParam(%q)", strings.TrimPrefix(p, "param:")))
1056+
case strings.HasPrefix(p, "form:"):
1057+
extractors = append(extractors, fmt.Sprintf("keyauth.FromForm(%q)", strings.TrimPrefix(p, "form:")))
1058+
case strings.HasPrefix(p, "cookie:"):
1059+
extractors = append(extractors, fmt.Sprintf("keyauth.FromCookie(%q)", strings.TrimPrefix(p, "cookie:")))
1060+
default:
1061+
// unrecognized source; remove field and return
1062+
cfg = removeConfigField(cfg, "AuthScheme")
1063+
return removeConfigField(cfg, "KeyLookup")
1064+
}
1065+
}
1066+
1067+
extractor := ""
1068+
if len(extractors) == 1 {
1069+
extractor = extractors[0]
1070+
} else if len(extractors) > 1 {
1071+
extractor = fmt.Sprintf("keyauth.Chain(%s)", strings.Join(extractors, ", "))
1072+
}
1073+
1074+
cfg = removeConfigField(cfg, "AuthScheme")
1075+
if extractor == "" {
1076+
return removeConfigField(cfg, "KeyLookup")
1077+
}
1078+
1079+
newField := fmt.Sprintf("%sExtractor: %s%s%s", indent, extractor, comma, newline)
1080+
cfg = reKeyLookup.ReplaceAllString(cfg, newField)
1081+
return cfg
1082+
})
1083+
})
1084+
if err != nil {
1085+
return fmt.Errorf("failed to migrate keyauth configs: %w", err)
1086+
}
1087+
1088+
cmd.Println("Migrating keyauth middleware configs")
1089+
return nil
1090+
}

cmd/internal/migrations/v3/common_test.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,3 +1300,99 @@ var _ = session.New(session.Config{
13001300
assert.NotContains(t, content, "KeyLookup")
13011301
assert.Contains(t, buf.String(), "Migrating session KeyLookup config")
13021302
}
1303+
1304+
func Test_MigrateKeyAuthConfig_HeaderAuth(t *testing.T) {
1305+
t.Parallel()
1306+
1307+
dir, err := os.MkdirTemp("", "mkeyauth_header")
1308+
require.NoError(t, err)
1309+
defer func() { require.NoError(t, os.RemoveAll(dir)) }()
1310+
1311+
file := writeTempFile(t, dir, `package main
1312+
import "github.com/gofiber/fiber/v2/middleware/keyauth"
1313+
var _ = keyauth.New(keyauth.Config{
1314+
KeyLookup: "header:Authorization",
1315+
AuthScheme: "Bearer",
1316+
})`)
1317+
1318+
var buf bytes.Buffer
1319+
cmd := newCmd(&buf)
1320+
require.NoError(t, v3.MigrateKeyAuthConfig(cmd, dir, nil, nil))
1321+
1322+
content := readFile(t, file)
1323+
assert.NotContains(t, content, "KeyLookup")
1324+
assert.NotContains(t, content, "AuthScheme")
1325+
assert.Contains(t, content, `Extractor: keyauth.FromAuthHeader("Authorization", "Bearer")`)
1326+
assert.Contains(t, buf.String(), "Migrating keyauth middleware configs")
1327+
}
1328+
1329+
func Test_MigrateKeyAuthConfig_Cookie(t *testing.T) {
1330+
t.Parallel()
1331+
1332+
dir, err := os.MkdirTemp("", "mkeyauth_cookie")
1333+
require.NoError(t, err)
1334+
defer func() { require.NoError(t, os.RemoveAll(dir)) }()
1335+
1336+
file := writeTempFile(t, dir, `package main
1337+
import "github.com/gofiber/fiber/v2/middleware/keyauth"
1338+
var _ = keyauth.New(keyauth.Config{
1339+
KeyLookup: "cookie:token",
1340+
})`)
1341+
1342+
var buf bytes.Buffer
1343+
cmd := newCmd(&buf)
1344+
require.NoError(t, v3.MigrateKeyAuthConfig(cmd, dir, nil, nil))
1345+
1346+
content := readFile(t, file)
1347+
assert.NotContains(t, content, "KeyLookup")
1348+
assert.Contains(t, content, `Extractor: keyauth.FromCookie("token")`)
1349+
assert.Contains(t, buf.String(), "Migrating keyauth middleware configs")
1350+
}
1351+
1352+
func Test_MigrateKeyAuthConfig_Chain(t *testing.T) {
1353+
t.Parallel()
1354+
1355+
dir, err := os.MkdirTemp("", "mkeyauth_chain")
1356+
require.NoError(t, err)
1357+
defer func() { require.NoError(t, os.RemoveAll(dir)) }()
1358+
1359+
file := writeTempFile(t, dir, `package main
1360+
import "github.com/gofiber/fiber/v2/middleware/keyauth"
1361+
var _ = keyauth.New(keyauth.Config{
1362+
KeyLookup: "query:token,header:X-API-Key",
1363+
})`)
1364+
1365+
var buf bytes.Buffer
1366+
cmd := newCmd(&buf)
1367+
require.NoError(t, v3.MigrateKeyAuthConfig(cmd, dir, nil, nil))
1368+
1369+
content := readFile(t, file)
1370+
assert.NotContains(t, content, "KeyLookup")
1371+
assert.Contains(t, content, `Extractor: keyauth.Chain(keyauth.FromQuery("token"), keyauth.FromHeader("X-API-Key"))`)
1372+
assert.Contains(t, buf.String(), "Migrating keyauth middleware configs")
1373+
}
1374+
1375+
func Test_MigrateKeyAuthConfig_Unknown(t *testing.T) {
1376+
t.Parallel()
1377+
1378+
dir, err := os.MkdirTemp("", "mkeyauth_unknown")
1379+
require.NoError(t, err)
1380+
defer func() { require.NoError(t, os.RemoveAll(dir)) }()
1381+
1382+
file := writeTempFile(t, dir, `package main
1383+
import "github.com/gofiber/fiber/v2/middleware/keyauth"
1384+
var _ = keyauth.New(keyauth.Config{
1385+
KeyLookup: "unknown:token",
1386+
AuthScheme: "Bearer",
1387+
})`)
1388+
1389+
var buf bytes.Buffer
1390+
cmd := newCmd(&buf)
1391+
require.NoError(t, v3.MigrateKeyAuthConfig(cmd, dir, nil, nil))
1392+
1393+
content := readFile(t, file)
1394+
assert.NotContains(t, content, "KeyLookup")
1395+
assert.NotContains(t, content, "AuthScheme")
1396+
assert.NotContains(t, content, "Extractor")
1397+
assert.Contains(t, buf.String(), "Migrating keyauth middleware configs")
1398+
}

0 commit comments

Comments
 (0)