package middleware import "strings" // redactedValue replaces a sensitive value in every log line and audit record. const redactedValue = "***" // sensitiveHeaders lists the headers whose value never reaches a log, compared // after lowercasing. var sensitiveHeaders = map[string]struct{}{ "authorization": {}, "proxy-authorization": {}, "cookie": {}, "set-cookie": {}, "x-token": {}, } // sensitivePayloadKeys holds the normalized query and JSON body keys whose // values never reach a log or an operation record. Keys are compared after // lowercasing and stripping separators, so "new_password" and "newPassword" // both match "newpassword". var sensitivePayloadKeys = map[string]struct{}{ "password": {}, "newpassword": {}, "oldpassword": {}, "confirmpassword": {}, "passwd": {}, "pwd": {}, "token": {}, "accesstoken": {}, "refreshtoken": {}, "secret": {}, "clientsecret": {}, "apikey": {}, "privatekey": {}, "idcard": {}, "key": {}, "signingkey": {}, "secretkey": {}, "appkey": {}, "mchkey": {}, "apiv3key": {}, "clientcert": {}, "clientkey": {}, "platformcert": {}, "platformserialno": {}, "publiccert": {}, "credentialcode": {}, "certfile": {}, "keyfile": {}, "publickey": {}, "rootcert": {}, "appcert": {}, "webhookid": {}, "authorization": {}, } func isSensitiveHeader(key string) bool { _, sensitive := sensitiveHeaders[strings.ToLower(key)] return sensitive } // isSensitivePayloadKey also matches every key ending in "token" so provider // specific token names stay masked without being enumerated. func isSensitivePayloadKey(key string) bool { normalized := strings.ToLower(strings.ReplaceAll(strings.ReplaceAll(key, "_", ""), "-", "")) if _, sensitive := sensitivePayloadKeys[normalized]; sensitive { return true } return strings.HasSuffix(normalized, "token") }