
Masking.pudu
Pudu65 lines2.8 KB
1/** @Log.Enrichers.Masking.Module — sensitive property values hidden before sinks */2module PuduLangLog.Enrichers.Masking34import Std.Regex as Regex5import PuduLangLog.Domain.Masking as Masking6import PuduLangLog.Enricher as Enricher7import PuduLangLog as Log8910export const MASK: Str = "***"111213const EMAIL: Str = "[A-Za-z0-9._%+\\-]+@[A-Za-z0-9.\\-]+\\.[A-Za-z]\{2,\}"141516const CARD_NUMBER: Str = "\\b[0-9]\{4\}(?:[ \\-]?[0-9]\{4\})\{2\}[ \\-]?[0-9]\{1,7\}\\b"171819const IBAN: Str = "\\b[A-Z]\{2\}[0-9]\{2\}[A-Z0-9]\{11,30\}\\b"20212223export fn properties(names: Array[Str], mask: Str) -> Enricher.Enricher {24 Enricher.from(fn(event: Log.Event) -> Log.Event {25 Log.Event {26 ..event,27 properties: event.properties.map(|property: Log.Property| Masking.property(&property, &names, mask))28 }29 })30}31323334export fn patterns(expressions: Array[Str], mask: Str) -> Result[Enricher.Enricher, Str] {35 var compiled: Array[Regex.Regex] = []36 for expression in expressions {37 match Regex.compile(expression) {38 case Ok(regex) => { compiled = compiled.push(regex) }39 case Err(problem) => { return Err("The pattern `" + expression + "` does not compile: " + Regex.explain(&problem)) }40 }41 }42 Ok(Enricher.from(fn(event: Log.Event) -> Log.Event {43 Log.Event {44 ..event,45 properties: event.properties.map(|property: Log.Property| Log.Property{name: property.name, value: Masking.text(&property.value, &compiled, mask)}),46 failure: match event.failure {47 case Some(problem) => Some(maskedFailure(&problem, &compiled, mask))48 case None => None49 }50 }51 }))52}535455export fn sensitive(mask: Str) -> Result[Enricher.Enricher, Str] { patterns([EMAIL, CARD_NUMBER, IBAN], mask) }565758fn maskedFailure(problem: &Log.Failure, compiled: &Array[Regex.Regex], mask: Str) -> Log.Failure {59 let message = match Masking.text(&Log.Scalar(Log.Text(problem.message)), compiled, mask) {60 case Log.Scalar(Log.Text(masked)) => masked61 case _ => problem.message62 }63 Log.Failure{..*problem, message: message, causes: problem.causes.map(|cause: Log.Failure| maskedFailure(&cause, compiled, mask))}64}65