mirror of
https://github.com/tiennm99/miti99bot.git
synced 2026-09-15 20:20:38 +00:00
Phase 6 of the 2026-05-09 review remediation plan. Bundle of small
hygiene fixes — none individually urgent but better folded together
than scattered across follow-ups.
- .golangci.yml: enable errcheck/govet/gosec/staticcheck/unused/
ineffassign/gocyclo/misspell/revive. Tuned to the codebase style
(no universal exported-doc requirement, gocyclo cap at 20 to
accommodate handler dispatch). 0 issues across the tree.
- ci.yml: add golangci-lint job + govulncheck (informational).
- Defensive guards:
- registry.go: Module.Name mismatch now errors at Build instead of
silently overwriting (TestBuild_RejectsFactoryNameMismatch).
- cmd/server/main.go: PORT env validated numerically + 0..65535.
- firestore_provider.go: For() re-validates module name; invalid
names return an invalidStore whose every op errors with
ErrInvalidModuleName.
- Dead code removal:
- wordle: gameTTLSeconds const + pickDaily/hashDJB2/todayUTC
helpers + their tests deleted (pickDaily was unused;
daily.go renamed pick_random.go).
- Dependency: golang.org/x/net v0.52.0 -> v0.54.0 (resolves
GO-2026-4918 HTTP/2 infinite-loop CVE).
- Deferred from the original phase plan: Docker digest pinning
(Dependabot handles), per-handler file splits (largest file 279 LOC;
splits would churn for marginal gain).
go test -race -count=1 ./... clean (15 packages); golangci-lint run
clean (0 issues).
36 lines
1.4 KiB
Go
36 lines
1.4 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
// ErrInvalidModuleName is returned by every operation on an invalidStore —
|
|
// the sentinel emitted when FirestoreProvider.For is asked for a module
|
|
// whose name fails collectionNameRe.
|
|
var ErrInvalidModuleName = fmt.Errorf("storage: invalid module name")
|
|
|
|
// invalidStore is a KVStore that errors on every call. Returned by
|
|
// FirestoreProvider.For when the requested module name doesn't validate.
|
|
// Callers see a real KVStore but every op errors at use, surfacing the
|
|
// configuration bug at the first read/write rather than silently writing
|
|
// to an attacker-controllable collection name.
|
|
type invalidStore struct {
|
|
name string
|
|
}
|
|
|
|
func (s invalidStore) wrap(op string) error {
|
|
return fmt.Errorf("%w: %q (op=%s)", ErrInvalidModuleName, s.name, op)
|
|
}
|
|
|
|
func (s invalidStore) Get(_ context.Context, _ string) ([]byte, error) {
|
|
return nil, s.wrap("Get")
|
|
}
|
|
func (s invalidStore) GetJSON(_ context.Context, _ string, _ any) error { return s.wrap("GetJSON") }
|
|
func (s invalidStore) Put(_ context.Context, _ string, _ []byte) error { return s.wrap("Put") }
|
|
func (s invalidStore) PutJSON(_ context.Context, _ string, _ any) error { return s.wrap("PutJSON") }
|
|
func (s invalidStore) Delete(_ context.Context, _ string) error { return s.wrap("Delete") }
|
|
func (s invalidStore) List(_ context.Context, _ string) ([]string, error) {
|
|
return nil, s.wrap("List")
|
|
}
|