maskSensitiveInText aplica regex para esconder padrões comuns de segredos
(s string)
| 86 | // maskSensitiveInText aplica regex para esconder padrões comuns de segredos |
| 87 | |
| 88 | func maskSensitiveInText(s string) string { |
| 89 | patterns := []struct { |
| 90 | re *regexp.Regexp |
| 91 | repl string |
| 92 | }{ |
| 93 | // Chaves de API comuns (OpenAI, Anthropic, Stripe, etc.) |
| 94 | {regexp.MustCompile(`(?i)(sk|pk)_(test|live)_[a-zA-Z0-9]{20,}`), "[REDACTED_API_KEY]"}, |
| 95 | {regexp.MustCompile(`sk-ant-[a-zA-Z0-9_-]{20,}`), "sk-ant-[REDACTED]"}, |
| 96 | {regexp.MustCompile(`sk-[a-zA-Z0-9]{20,}`), "sk-[REDACTED]"}, |
| 97 | // L3: xAI / Grok API keys |
| 98 | {regexp.MustCompile(`xai-[a-zA-Z0-9]{20,}`), "xai-[REDACTED]"}, |
| 99 | // L3: StackSpot tokens (stk_ prefix) |
| 100 | {regexp.MustCompile(`stk_[a-zA-Z0-9]{20,}`), "stk_[REDACTED]"}, |
| 101 | // L3: Mistral API keys |
| 102 | {regexp.MustCompile(`(?i)mistral[_-]?[a-zA-Z0-9]{20,}`), "[REDACTED_MISTRAL_KEY]"}, |
| 103 | // L3: Cohere API keys |
| 104 | {regexp.MustCompile(`(?i)cohere[_-]?[a-zA-Z0-9]{20,}`), "[REDACTED_COHERE_KEY]"}, |
| 105 | // L3: HuggingFace tokens |
| 106 | {regexp.MustCompile(`hf_[a-zA-Z0-9]{20,}`), "hf_[REDACTED]"}, |
| 107 | // L3: GitHub tokens |
| 108 | {regexp.MustCompile(`gh[ps]_[a-zA-Z0-9]{20,}`), "[REDACTED_GH_TOKEN]"}, |
| 109 | {regexp.MustCompile(`github_pat_[a-zA-Z0-9_]{20,}`), "[REDACTED_GH_PAT]"}, |
| 110 | // Google AI |
| 111 | {regexp.MustCompile(`AIza[0-9A-Za-z\-_]{30,}`), "[REDACTED_GOOGLE_API_KEY]"}, |
| 112 | // AWS keys |
| 113 | {regexp.MustCompile(`AKIA[0-9A-Z]{16}`), "[REDACTED_AWS_KEY]"}, |
| 114 | // Bearer tokens e JWTs (parte do meio) |
| 115 | {regexp.MustCompile(`(?i)Bearer\s+[A-Za-z0-9\.\-_]+`), "Bearer [REDACTED]"}, |
| 116 | {regexp.MustCompile(`ey[A-Za-z0-9-_=]+\.ey[A-Za-z0-9-_=]+\.[A-Za-z0-9-_.+/=]+`), "[REDACTED_JWT]"}, |
| 117 | // Campos em JSON |
| 118 | {regexp.MustCompile(`("access_token"|"refresh_token"|"client_secret"|"client_key"|"api_key"|"password"|"token")\s*:\s*"[^"]+"`), `${1}:"[REDACTED]"`}, |
| 119 | // Formato KEY=VALUE |
| 120 | {regexp.MustCompile(`(?im)^(API_KEY|ACCESS_TOKEN|CLIENT_SECRET|CLIENT_KEY|SECRET|PASSWORD)\s*=\s*.*$`), "$1=[REDACTED]"}, |
| 121 | } |
| 122 | out := s |
| 123 | for _, p := range patterns { |
| 124 | out = p.re.ReplaceAllString(out, p.repl) |
| 125 | } |
| 126 | return out |
| 127 | } |
| 128 | |
| 129 | // NewJSONReader cria um io.Reader a partir de um []byte para enviar em requisições HTTP |
| 130 | func NewJSONReader(data []byte) io.Reader { |
no outgoing calls
no test coverage detected