Skip to content

Commit 92053b8

Browse files
authored
chore: update golangci-lint config and fix lint issues (#542)
* chore: update golangci-lint config and fix lint issues
1 parent e35907d commit 92053b8

14 files changed

Lines changed: 116 additions & 138 deletions

File tree

.golangci.yml

Lines changed: 32 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ run:
1010
linters:
1111
default: none
1212
enable:
13-
# Default tier
13+
# Default tier — must-have for any Go project
1414
- errcheck
1515
- govet
1616
- staticcheck
@@ -21,11 +21,18 @@ linters:
2121
- errorlint
2222
- gosec
2323
- sqlclosecheck
24+
- nilerr
25+
- bodyclose
26+
- durationcheck
27+
- errchkjson
28+
- exhaustive
29+
- forcetypeassert
2430

2531
# Code quality
2632
- depguard
2733
- dogsled
2834
- dupl
35+
- dupword
2936
- errname
3037
- funlen
3138
- gocheckcompilerdirectives
@@ -35,20 +42,24 @@ linters:
3542
- godox
3643
- goprintffuncname
3744
- lll
45+
- mirror
3846
- misspell
3947
- nakedret
48+
- predeclared
4049
- revive
4150
- testifylint
4251
- unconvert
4352
- unparam
4453
- usestdlibvars
54+
- wastedassign
4555
- whitespace
4656

4757
# Complexity
4858
- gocognit
59+
- nestif
4960

5061
# Note: copyloopvar, intrange, modernize, perfsprint require Go 1.22+
51-
# They will be enabled when Go version constraint is lifted
62+
# They will be enabled when Go version constraint is lifted.
5263

5364
settings:
5465
depguard:
@@ -61,6 +72,8 @@ linters:
6172
desc: Deprecated since Go 1.16. Use io and os packages instead.
6273
- pkg: "github.com/instana/testify"
6374
desc: Use github.com/stretchr/testify instead.
75+
exhaustive:
76+
default-signifies-exhaustive: true
6477
dupl:
6578
threshold: 100
6679
funlen:
@@ -82,17 +95,15 @@ linters:
8295
disabled-checks:
8396
- dupImport
8497
- hugeParam
85-
- rangeValCopy
86-
- ifElseChain
87-
- octalLiteral
98+
- rangeValCopy # keychainbreaker structs are large by design
99+
- unnamedResult # crypto functions returning (key, iv) are clear without names
88100
- whyNoLint
89-
- singleCaseSwitch
90-
- exitAfterDefer
91-
- commentedOutCode
92101
lll:
93102
line-length: 140
94103
gocognit:
95104
min-complexity: 30
105+
nestif:
106+
min-complexity: 5
96107
godox:
97108
keywords:
98109
- FIXME
@@ -103,17 +114,17 @@ linters:
103114
asserts: false
104115
gosec:
105116
excludes:
106-
- G101
107-
- G104
108-
- G304
109-
- G401
110-
- G405
111-
- G501
112-
- G502
113-
- G505
114-
- G115
115-
- G117
116-
- G204
117+
- G101 # hardcoded credentials — false positives on const names
118+
- G115 # integer overflow on conversion — false positives on safe narrowing
119+
- G117 # struct field matches secret pattern — false positive on Password fields
120+
- G204 # exec.Command with variable — required for macOS `security` command
121+
- G304 # file inclusion via variable — required for dynamic browser paths
122+
- G401 # weak crypto SHA1 — required for Chromium PBKDF2 key derivation
123+
- G402 # TLS MinVersion — not applicable (no TLS in this tool)
124+
- G405 # weak crypto DES — required for Firefox 3DES decryption
125+
- G501 # blocklisted import crypto/md5 — not used, keep for safety
126+
- G502 # blocklisted import crypto/des — required for Firefox decryption
127+
- G505 # blocklisted import crypto/sha1 — required for PBKDF2
117128
errcheck:
118129
check-type-assertions: true
119130
exclude-functions:
@@ -127,22 +138,13 @@ linters:
127138
rules:
128139
- name: indent-error-flow
129140
- name: unexported-return
130-
disabled: true
131141
- name: unused-parameter
132142
disabled: true
133-
- name: package-comments
134-
disabled: true
135-
- name: exported
136-
disabled: true
137143
staticcheck:
138144
checks:
139145
- "all"
140-
- "-ST1000"
141-
- "-ST1003"
142-
- "-ST1016"
143-
- "-ST1020"
144-
- "-ST1021"
145-
- "-ST1022"
146+
- "-ST1000" # package comment — not a public library
147+
- "-ST1003" # naming convention — allow platform-specific names
146148

147149
exclusions:
148150
presets:
@@ -157,55 +159,19 @@ linters:
157159
- funlen
158160
- gosec
159161
- errcheck
160-
- testifylint
161162
- lll
162163
- source: "defer"
163164
linters:
164165
- errcheck
165166
- text: "SELECT"
166167
linters:
167168
- gosec
168-
# Temporary: known issues in pre-refactoring code (will be removed during refactoring)
169-
- text: "result 0 .* is always nil"
170-
linters:
171-
- unparam
172-
- text: "result 0 .* is never used"
173-
linters:
174-
- unparam
175-
- path: "browser/firefox/firefox.go"
176-
text: "field .* is unused"
177-
linters:
178-
- unused
179-
- path: "browserdata/sessionstorage/"
180-
text: "is unused"
181-
linters:
182-
- unused
183169
- path: "cmd/hack-browser-data/main.go"
184170
linters:
185171
- lll
186-
# Temporary: pre-refactoring code issues (all will be rewritten)
187-
- path: "browserdata/"
188-
linters:
189-
- dupl
190-
- gochecknoinits
191-
- goconst
192-
- lll
193-
- path: "browser/firefox/"
194-
linters:
195-
- gocritic
196-
- path: "crypto/"
197-
linters:
198-
- gocritic
199172
- path: "crypto/keyretriever/gcoredump_darwin.go"
200173
linters:
201174
- gocognit
202-
# Temporary: new v2 extract files have no callers until Phase 8 wiring
203-
- path: "browser/chromium/(source|decrypt|extract_.*)\\.go"
204-
linters:
205-
- unused
206-
- path: "browser/firefox/(source|extract_.*)\\.go"
207-
linters:
208-
- unused
209175

210176
formatters:
211177
enable:

browser/browser_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func mkFile(t *testing.T, parts ...string) {
2121

2222
func TestListBrowsers(t *testing.T) {
2323
list := ListBrowsers()
24-
assert.True(t, len(list) > 0)
24+
assert.NotEmpty(t, list)
2525
assert.True(t, sort.StringsAreSorted(list))
2626
}
2727

browser/chromium/chromium_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ func TestAcquireFiles(t *testing.T) {
399399
assert.Len(t, paths, len(cats))
400400
for _, p := range paths {
401401
_, err := os.Stat(p)
402-
assert.NoError(t, err, "acquired file should exist")
402+
require.NoError(t, err, "acquired file should exist")
403403
}
404404
}
405405

browser/firefox/extract_history_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,5 @@ func TestExtractHistories_NullFields(t *testing.T) {
4040
require.NoError(t, err)
4141
require.Len(t, got, 1)
4242
assert.Equal(t, "https://null.test", got[0].URL)
43-
assert.Equal(t, "", got[0].Title)
43+
assert.Empty(t, got[0].Title)
4444
}

crypto/asn1pbe_test.go

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"testing"
88

99
"github.com/stretchr/testify/assert"
10+
"github.com/stretchr/testify/require"
1011
)
1112

1213
var (
@@ -74,14 +75,14 @@ var (
7475
func TestNewASN1PBE(t *testing.T) {
7576
for _, tc := range nssPBETestCases {
7677
nssRaw, err := hex.DecodeString(tc.RawHexPBE)
77-
assert.Equal(t, nil, err)
78+
require.NoError(t, err)
7879
pbe, err := NewASN1PBE(nssRaw)
79-
assert.Equal(t, nil, err)
80+
require.NoError(t, err)
8081
nssPBETC, ok := pbe.(nssPBE)
81-
assert.Equal(t, true, ok)
82+
assert.True(t, ok)
8283
assert.Equal(t, nssPBETC.Encrypted, tc.Encrypted)
8384
assert.Equal(t, nssPBETC.AlgoAttr.SaltAttr.EntrySalt, tc.GlobalSalt)
84-
assert.Equal(t, nssPBETC.AlgoAttr.SaltAttr.Len, 20)
85+
assert.Equal(t, 20, nssPBETC.AlgoAttr.SaltAttr.Len)
8586
assert.Equal(t, nssPBETC.AlgoAttr.ObjectIdentifier, tc.ObjectIdentifier)
8687
}
8788
}
@@ -108,8 +109,8 @@ func TestNssPBE_Encrypt(t *testing.T) {
108109
},
109110
}
110111
encrypted, err := nssPBETC.Encrypt(tc.GlobalSalt, tc.Plaintext)
111-
assert.Equal(t, nil, err)
112-
assert.Equal(t, true, len(encrypted) > 0)
112+
require.NoError(t, err)
113+
assert.NotEmpty(t, encrypted)
113114
assert.Equal(t, nssPBETC.Encrypted, encrypted)
114115
}
115116
}
@@ -136,20 +137,20 @@ func TestNssPBE_Decrypt(t *testing.T) {
136137
},
137138
}
138139
decrypted, err := nssPBETC.Decrypt(tc.GlobalSalt)
139-
assert.Equal(t, nil, err)
140-
assert.Equal(t, true, len(decrypted) > 0)
140+
require.NoError(t, err)
141+
assert.NotEmpty(t, decrypted)
141142
assert.Equal(t, pbePlaintext, decrypted)
142143
}
143144
}
144145

145146
func TestNewASN1PBE_MetaPBE(t *testing.T) {
146147
for _, tc := range metaPBETestCases {
147148
metaRaw, err := hex.DecodeString(tc.RawHexPBE)
148-
assert.Equal(t, nil, err)
149+
require.NoError(t, err)
149150
pbe, err := NewASN1PBE(metaRaw)
150-
assert.Equal(t, nil, err)
151+
require.NoError(t, err)
151152
metaPBETC, ok := pbe.(metaPBE)
152-
assert.Equal(t, true, ok)
153+
assert.True(t, ok)
153154
assert.Equal(t, metaPBETC.Encrypted, tc.Encrypted)
154155
assert.Equal(t, metaPBETC.AlgoAttr.Data.IVData.IV, tc.IV)
155156
assert.Equal(t, metaPBETC.AlgoAttr.Data.IVData.ObjectIdentifier, objWithSHA256AndAES)
@@ -193,8 +194,8 @@ func TestMetaPBE_Encrypt(t *testing.T) {
193194
Encrypted: tc.Encrypted,
194195
}
195196
encrypted, err := metaPBETC.Encrypt(tc.GlobalSalt, tc.Plaintext)
196-
assert.Equal(t, nil, err)
197-
assert.Equal(t, true, len(encrypted) > 0)
197+
require.NoError(t, err)
198+
assert.NotEmpty(t, encrypted)
198199
assert.Equal(t, metaPBETC.Encrypted, encrypted)
199200
}
200201
}
@@ -236,20 +237,20 @@ func TestMetaPBE_Decrypt(t *testing.T) {
236237
Encrypted: tc.Encrypted,
237238
}
238239
decrypted, err := metaPBETC.Decrypt(tc.GlobalSalt)
239-
assert.Equal(t, nil, err)
240-
assert.Equal(t, true, len(decrypted) > 0)
240+
require.NoError(t, err)
241+
assert.NotEmpty(t, decrypted)
241242
assert.Equal(t, pbePlaintext, decrypted)
242243
}
243244
}
244245

245246
func TestNewASN1PBE_LoginPBE(t *testing.T) {
246247
for _, tc := range loginPBETestCases {
247248
loginRaw, err := hex.DecodeString(tc.RawHexPBE)
248-
assert.Equal(t, nil, err)
249+
require.NoError(t, err)
249250
pbe, err := NewASN1PBE(loginRaw)
250-
assert.Equal(t, nil, err)
251+
require.NoError(t, err)
251252
loginPBETC, ok := pbe.(loginPBE)
252-
assert.Equal(t, true, ok)
253+
assert.True(t, ok)
253254
assert.Equal(t, loginPBETC.Encrypted, tc.Encrypted)
254255
assert.Equal(t, loginPBETC.Data.IV, tc.IV)
255256
assert.Equal(t, loginPBETC.Data.ObjectIdentifier, objWithMD5AndDESCBC)
@@ -270,8 +271,8 @@ func TestLoginPBE_Encrypt(t *testing.T) {
270271
Encrypted: tc.Encrypted,
271272
}
272273
encrypted, err := loginPBETC.Encrypt(tc.GlobalSalt, plainText)
273-
assert.Equal(t, nil, err)
274-
assert.Equal(t, true, len(encrypted) > 0)
274+
require.NoError(t, err)
275+
assert.NotEmpty(t, encrypted)
275276
assert.Equal(t, loginPBETC.Encrypted, encrypted)
276277
}
277278
}
@@ -290,8 +291,8 @@ func TestLoginPBE_Decrypt(t *testing.T) {
290291
Encrypted: tc.Encrypted,
291292
}
292293
decrypted, err := loginPBETC.Decrypt(tc.GlobalSalt)
293-
assert.Equal(t, nil, err)
294-
assert.Equal(t, true, len(decrypted) > 0)
294+
require.NoError(t, err)
295+
assert.NotEmpty(t, decrypted)
295296
assert.Equal(t, pbePlaintext, decrypted)
296297
}
297298
}

0 commit comments

Comments
 (0)