Skip to content

Commit 677633b

Browse files
authored
Merge pull request #212 from gofiber/add-migration-for-encryptcookie-middleware
2 parents 01b2f18 + d334547 commit 677633b

File tree

3 files changed

+188
-0
lines changed

3 files changed

+188
-0
lines changed

cmd/internal/migrations/lists.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ var Migrations = []Migration{
6262
v3migrations.MigrateMiddlewareLocals,
6363
v3migrations.MigrateFilesystemMiddleware,
6464
v3migrations.MigrateLimiterConfig,
65+
v3migrations.MigrateEncryptcookieConfig,
6566
v3migrations.MigrateCacheConfig,
6667
v3migrations.MigrateEnvVarConfig,
6768
v3migrations.MigrateSessionConfig,
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package v3
2+
3+
import (
4+
"fmt"
5+
"regexp"
6+
"strings"
7+
8+
semver "github.com/Masterminds/semver/v3"
9+
"github.com/spf13/cobra"
10+
11+
"github.com/gofiber/cli/cmd/internal"
12+
)
13+
14+
func MigrateEncryptcookieConfig(cmd *cobra.Command, cwd string, _, _ *semver.Version) error {
15+
reConfig := regexp.MustCompile(`encryptcookie\.Config{`)
16+
17+
changed, err := internal.ChangeFileContent(cwd, func(content string) string {
18+
matches := reConfig.FindAllStringIndex(content, -1)
19+
if len(matches) == 0 {
20+
return content
21+
}
22+
23+
var b strings.Builder
24+
last := 0
25+
for _, m := range matches {
26+
if _, err := b.WriteString(content[last:m[0]]); err != nil {
27+
return content
28+
}
29+
30+
start := m[0]
31+
end := extractBlock(content, m[1], '{', '}')
32+
cfg := content[start:end]
33+
cfg = addEncryptcookieParam(cfg, "Encryptor")
34+
cfg = addEncryptcookieParam(cfg, "Decryptor")
35+
36+
if _, err := b.WriteString(cfg); err != nil {
37+
return content
38+
}
39+
last = end
40+
}
41+
42+
if _, err := b.WriteString(content[last:]); err != nil {
43+
return content
44+
}
45+
return b.String()
46+
})
47+
if err != nil {
48+
return fmt.Errorf("failed to migrate encryptcookie configs: %w", err)
49+
}
50+
if !changed {
51+
return nil
52+
}
53+
54+
cmd.Println("Migrating encryptcookie middleware configs")
55+
return nil
56+
}
57+
58+
func addEncryptcookieParam(cfg, field string) string {
59+
re := regexp.MustCompile(field + `:\s*func\s*\(([^)]*)\)`)
60+
return re.ReplaceAllStringFunc(cfg, func(match string) string {
61+
sub := re.FindStringSubmatch(match)
62+
if len(sub) < 2 {
63+
return match
64+
}
65+
66+
params := sub[1]
67+
trimmed := strings.TrimSpace(params)
68+
if trimmed == "" {
69+
return match
70+
}
71+
72+
args := splitArgs(params)
73+
var nonEmpty []string
74+
for _, arg := range args {
75+
if strings.TrimSpace(arg) != "" {
76+
nonEmpty = append(nonEmpty, arg)
77+
}
78+
}
79+
80+
if len(nonEmpty) != 2 {
81+
return match
82+
}
83+
84+
insertPos := 0
85+
for insertPos < len(params) && (params[insertPos] == ' ' || params[insertPos] == '\t' || params[insertPos] == '\n') {
86+
insertPos++
87+
}
88+
89+
insertion := "_ string, "
90+
if idx := strings.LastIndex(params[:insertPos], "\n"); idx >= 0 {
91+
indent := params[idx+1 : insertPos]
92+
insertion = "_ string,\n" + indent
93+
}
94+
95+
newParams := params[:insertPos] + insertion + params[insertPos:]
96+
return strings.Replace(match, "("+params+")", "("+newParams+")", 1)
97+
})
98+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package v3_test
2+
3+
import (
4+
"bytes"
5+
"os"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
10+
11+
"github.com/gofiber/cli/cmd/internal/migrations/v3"
12+
)
13+
14+
func Test_MigrateEncryptcookieConfig(t *testing.T) {
15+
t.Parallel()
16+
17+
dir, err := os.MkdirTemp("", "mencryptcookie")
18+
require.NoError(t, err)
19+
defer func() { require.NoError(t, os.RemoveAll(dir)) }()
20+
21+
file := writeTempFile(t, dir, `package main
22+
import (
23+
"github.com/gofiber/fiber/v2/middleware/encryptcookie"
24+
)
25+
var _ = encryptcookie.New(encryptcookie.Config{
26+
Encryptor: func(value, key string) (string, error) { return "", nil },
27+
Decryptor: func(value string, key string) (string, error) { return "", nil },
28+
})`)
29+
30+
var buf bytes.Buffer
31+
cmd := newCmd(&buf)
32+
require.NoError(t, v3.MigrateEncryptcookieConfig(cmd, dir, nil, nil))
33+
34+
content := readFile(t, file)
35+
assert.Contains(t, content, "Encryptor: func(_ string, value, key string) (string, error)")
36+
assert.Contains(t, content, "Decryptor: func(_ string, value string, key string) (string, error)")
37+
assert.Contains(t, buf.String(), "Migrating encryptcookie middleware configs")
38+
}
39+
40+
func Test_MigrateEncryptcookieConfig_MultiLine(t *testing.T) {
41+
t.Parallel()
42+
43+
dir, err := os.MkdirTemp("", "mencryptcookieml")
44+
require.NoError(t, err)
45+
defer func() { require.NoError(t, os.RemoveAll(dir)) }()
46+
47+
file := writeTempFile(t, dir, `package main
48+
import (
49+
"github.com/gofiber/fiber/v2/middleware/encryptcookie"
50+
)
51+
var _ = encryptcookie.New(encryptcookie.Config{
52+
Encryptor: func(
53+
value string,
54+
key string,
55+
) (string, error) { return "", nil },
56+
})`)
57+
58+
var buf bytes.Buffer
59+
cmd := newCmd(&buf)
60+
require.NoError(t, v3.MigrateEncryptcookieConfig(cmd, dir, nil, nil))
61+
62+
content := readFile(t, file)
63+
assert.Contains(t, content, "\n\tEncryptor: func(\n\t\t_ string,\n\t\tvalue string,\n\t\tkey string,")
64+
assert.Contains(t, buf.String(), "Migrating encryptcookie middleware configs")
65+
}
66+
67+
func Test_MigrateEncryptcookieConfig_Idempotent(t *testing.T) {
68+
t.Parallel()
69+
70+
dir, err := os.MkdirTemp("", "mencryptcookieidem")
71+
require.NoError(t, err)
72+
defer func() { require.NoError(t, os.RemoveAll(dir)) }()
73+
74+
file := writeTempFile(t, dir, `package main
75+
import (
76+
"github.com/gofiber/fiber/v2/middleware/encryptcookie"
77+
)
78+
var _ = encryptcookie.New(encryptcookie.Config{
79+
Encryptor: func(value, key string) (string, error) { return "", nil },
80+
})`)
81+
82+
var buf bytes.Buffer
83+
cmd := newCmd(&buf)
84+
require.NoError(t, v3.MigrateEncryptcookieConfig(cmd, dir, nil, nil))
85+
first := readFile(t, file)
86+
require.NoError(t, v3.MigrateEncryptcookieConfig(cmd, dir, nil, nil))
87+
second := readFile(t, file)
88+
assert.Equal(t, first, second)
89+
}

0 commit comments

Comments
 (0)