6 | module Log4Types.Core.Masking
10 | import Log4Types.Core.Value
11 | import Log4Types.Core.Renderer
12 | import Log4Types.Core.Loggable
21 | record Masked (a : Type) where
22 | constructor MkMasked
30 | record Hidden (a : Type) where
31 | constructor MkHidden
36 | record MaskPolicy (a : Type) where
37 | constructor MkMaskPolicy
42 | defaultMask : MaskPolicy a
43 | defaultMask = MkMaskPolicy (const "***")
52 | lastN : Nat -> MaskPolicy String
53 | lastN n = MkMaskPolicy $
\s =>
54 | let hidden = length s `minus` n
56 | then defaultMask.mask s
57 | else replicate hidden maskChar ++ substr hidden n s
64 | emailDomainOnly : MaskPolicy String
65 | emailDomainOnly = MkMaskPolicy $
\s =>
66 | case break (== '@') (reverse (unpack s)) of
67 | (domain, _ :: local) => replicate (length local) maskChar ++ "@" ++ pack (reverse domain)
68 | (_, []) => defaultMask.mask s
72 | Loggable (Masked a) where
73 | logFields renderer m acc = renderer.addField "value" (StrVal (defaultMask.mask m.reveal)) acc
74 | logShow m = defaultMask.mask m.reveal
78 | Loggable (Hidden a) where
79 | logFields _ _ acc = acc
89 | -> (policy : MaskPolicy a)
92 | addMaskedField renderer name policy v =
93 | renderer.addField name (StrVal (policy.mask v))