credentials_redact.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. // Package dto provides data transfer objects for HTTP handlers.
  2. package dto
  3. import "github.com/Wei-Shaw/sub2api/internal/service"
  4. // RedactCredentials 复制一份 in,剥离 service.SensitiveCredentialKeys 列出的所有敏感子键,
  5. // 并产出一个 has_<key> 状态 map 表示哪些敏感键存在且非零值。
  6. //
  7. // 输入 nil 时返回 nil, nil(避免响应里出现空对象)。
  8. // 不修改入参;调用方拿到的 out 可安全序列化进 JSON 返回前端。
  9. func RedactCredentials(in map[string]any) (out map[string]any, status map[string]bool) {
  10. if in == nil {
  11. return nil, nil
  12. }
  13. out = make(map[string]any, len(in))
  14. for k, v := range in {
  15. if service.IsSensitiveCredentialKey(k) {
  16. if isCredentialValuePresent(v) {
  17. if status == nil {
  18. status = make(map[string]bool, 4)
  19. }
  20. status["has_"+k] = true
  21. }
  22. continue
  23. }
  24. out[k] = v
  25. }
  26. return out, status
  27. }
  28. // isCredentialValuePresent 判断值是否"存在且非零"。空字符串、nil、false 均视为未配置;
  29. // 其余非零类型(数字、对象、字符串等)视为已配置。
  30. func isCredentialValuePresent(v any) bool {
  31. switch x := v.(type) {
  32. case nil:
  33. return false
  34. case string:
  35. return x != ""
  36. case bool:
  37. return x
  38. default:
  39. return true
  40. }
  41. }