chore(security,refactor): extract sanitization and improve code quality (#41)

* chore(security,refactor): extract sanitization and improve code quality

- [x] Extract sanitization functions to dedicated sanitization.go module
- [x] Add comprehensive golangci-lint v2 configuration with security rules
- [x] Replace interface{} with any type throughout codebase
- [x] Add admin API authentication security warning
- [x] Extract WebSocket and stats streaming constants
- [x] Add best-effort error handling comments for resource cleanup
- [x] Expand sensitive field patterns for improved PII redaction
- [x] Simplify safety checks and remove redundant nil validations
- [x] Improve test coverage for password field redaction patterns

* refactor: replace interface{} with any type alias

- [x] Replace all `map[string]interface{}` with `map[string]any`
- [x] Replace all `interface{}` with `any` in function signatures and type definitions
- [x] Update sync.Pool New function returns from `interface{}` to `any`
- [x] Add package documentation comments to 8 package files
- [x] Update type assertions and casts to work with `any` type
This commit is contained in:
2026-01-17 00:04:12 +00:00
committed by GitHub
parent caeae62236
commit 3aa83d4480
42 changed files with 815 additions and 618 deletions
+10 -10
View File
@@ -20,19 +20,19 @@ func extractClaimsFromJWTHeader(authorization string) (usr, role string) {
tokenParts := strings.SplitN(authorization, ".", 3)
if len(tokenParts) != 3 {
handleError("Can't split the token", map[string]interface{}{"token": maskToken(authorization)})
handleError("Can't split the token", map[string]any{"token": maskToken(authorization)})
return
}
claim, err := base64.RawURLEncoding.DecodeString(tokenParts[1])
if err != nil {
handleError("Can't decode the token", map[string]interface{}{"token": maskToken(authorization)})
handleError("Can't decode the token", map[string]any{"token": maskToken(authorization)})
return
}
var claimMap map[string]interface{}
var claimMap map[string]any
if err = json.Unmarshal(claim, &claimMap); err != nil {
handleError("Can't unmarshal the claim", map[string]interface{}{"token": maskToken(authorization)})
handleError("Can't unmarshal the claim", map[string]any{"token": maskToken(authorization)})
return
}
@@ -42,20 +42,20 @@ func extractClaimsFromJWTHeader(authorization string) (usr, role string) {
return
}
func extractClaim(claimMap map[string]interface{}, claimPath, name string) string {
func extractClaim(claimMap map[string]any, claimPath, name string) string {
if claimPath == "" {
return defaultValue
}
// Validate claim path to prevent injection attacks
if !isValidClaimPath(claimPath) {
handleError(fmt.Sprintf("Invalid claim path for %s", name), map[string]interface{}{"path": claimPath})
handleError(fmt.Sprintf("Invalid claim path for %s", name), map[string]any{"path": claimPath})
return defaultValue
}
value, ok := ask.For(claimMap, claimPath).String(defaultValue)
if !ok {
handleError(fmt.Sprintf("Can't find the %s", name), map[string]interface{}{"claim_map": sanitizeClaimMap(claimMap), "path": claimPath})
handleError(fmt.Sprintf("Can't find the %s", name), map[string]any{"claim_map": sanitizeClaimMap(claimMap), "path": claimPath})
return defaultValue
}
@@ -92,8 +92,8 @@ func isValidClaimPath(path string) bool {
}
// sanitizeClaimMap removes sensitive data from claim map for logging
func sanitizeClaimMap(claimMap map[string]interface{}) map[string]interface{} {
sanitized := make(map[string]interface{})
func sanitizeClaimMap(claimMap map[string]any) map[string]any {
sanitized := make(map[string]any)
sensitiveKeys := map[string]bool{
"password": true, "secret": true, "token": true, "key": true,
"auth": true, "credential": true, "private": true,
@@ -110,7 +110,7 @@ func sanitizeClaimMap(claimMap map[string]interface{}) map[string]interface{} {
return sanitized
}
func handleError(msg string, details map[string]interface{}) {
func handleError(msg string, details map[string]any) {
cfg.Monitoring.Increment(libpack_monitoring.MetricsFailed, emptyMetrics)
cfg.Logger.Error(&libpack_logger.LogMessage{
Message: msg,