package report import ( "math" "strings" ) // Finding contains information about strings that // have been captured by a tree-sitter query. type Finding struct { // Rule is the name of the rule that was matched RuleID string Description string StartLine int EndLine int StartColumn int EndColumn int Line string `json:"-"` Match string // Secret contains the full content of what is matched in // the tree-sitter query. Secret string // File is the name of the file containing the finding File string SymlinkFile string Commit string Link string `json:",omitempty"` // Entropy is the shannon entropy of Value Entropy float32 Author string Email string Date string Message string Tags []string // unique identifier Fingerprint string } // Redact removes sensitive information from a finding. func (f *Finding) Redact(percent uint) { secret := maskSecret(f.Secret, percent) if percent >= 100 { secret = "REDACTED" } f.Line = strings.ReplaceAll(f.Line, f.Secret, secret) f.Match = strings.ReplaceAll(f.Match, f.Secret, secret) f.Secret = secret } func maskSecret(secret string, percent uint) string { if percent > 100 { percent = 100 } len := float64(len(secret)) if len <= 0 { return secret } prc := float64(100 - percent) lth := int64(math.RoundToEven(len * prc / float64(100))) return secret[:lth] + "..." }