diff --git a/README.md b/README.md index e655439..d0474c7 100644 --- a/README.md +++ b/README.md @@ -169,6 +169,18 @@ public class CustomizedMaskedLogs [LogMasked] public string? DefaultMasked { get; set; } + /// + /// 9223372036854775807 results in "***" + /// + [LogMasked] + public long? DefaultMaskedLong { get; set; } + + /// + /// 2147483647 results in "***" + /// + [LogMasked] + public int? DefaultMaskedInt { get; set; } + /// /// [123456789,123456789,123456789] results in [***,***,***] /// @@ -211,6 +223,18 @@ public class CustomizedMaskedLogs [LogMasked(ShowFirst = 3)] public string? ShowFirstThreeThenDefaultMasked { get; set; } + /// + /// 9223372036854775807 results in "922***807" + /// + [LogMasked(ShowFirst = 3, ShowLast = 3)] + public long? ShowFirstAndLastThreeAndDefaultMaskLongInTheMiddle { get; set; } + + /// + /// 2147483647 results in "214****647" + /// + [LogMasked(ShowFirst = 3, ShowLast = 3, PreserveLength = true)] + public int? ShowFirstAndLastThreeAndDefaultMaskIntInTheMiddlePreservedLength { get; set; } + /// /// 123456789 results in "123******" /// @@ -230,11 +254,17 @@ public class CustomizedMaskedLogs public string? ShowLastThreeThenDefaultMaskedPreservedLength { get; set; } /// - /// 123456789 results in "123REMOVED" + /// 123456789 results in "123_REMOVED_" /// [LogMasked(Text = "_REMOVED_", ShowFirst = 3)] public string? ShowFirstThreeThenCustomMask { get; set; } + /// + /// d3c4a1f2-3b4e-4f5a-9b6c-7d8e9f0a1b2c results in "d3c4a_REMOVED_" + /// + [LogMasked(Text = "_REMOVED_", ShowFirst = 5)] + public Guid? ShowFirstFiveThenCustomMaskGuid { get; set; } + /// /// 123456789 results in "123_REMOVED_" /// @@ -284,7 +314,7 @@ public class CustomizedMaskedLogs public string? ShowFirstAndLastThreeAndCustomMaskInTheMiddlePreservedLengthIgnored { get; set; } } ``` -snippet source | anchor +snippet source | anchor ## 7. Masking a string property with regular expressions diff --git a/src/Destructurama.Attributed.Tests/MaskedAttributeTests.cs b/src/Destructurama.Attributed.Tests/MaskedAttributeTests.cs index 72dfe58..80686ac 100644 --- a/src/Destructurama.Attributed.Tests/MaskedAttributeTests.cs +++ b/src/Destructurama.Attributed.Tests/MaskedAttributeTests.cs @@ -15,6 +15,18 @@ public class CustomizedMaskedLogs [LogMasked] public string? DefaultMasked { get; set; } + /// + /// 9223372036854775807 results in "***" + /// + [LogMasked] + public long? DefaultMaskedLong { get; set; } + + /// + /// 2147483647 results in "***" + /// + [LogMasked] + public int? DefaultMaskedInt { get; set; } + /// /// [123456789,123456789,123456789] results in [***,***,***] /// @@ -57,6 +69,18 @@ public class CustomizedMaskedLogs [LogMasked(ShowFirst = 3)] public string? ShowFirstThreeThenDefaultMasked { get; set; } + /// + /// 9223372036854775807 results in "922***807" + /// + [LogMasked(ShowFirst = 3, ShowLast = 3)] + public long? ShowFirstAndLastThreeAndDefaultMaskLongInTheMiddle { get; set; } + + /// + /// 2147483647 results in "214****647" + /// + [LogMasked(ShowFirst = 3, ShowLast = 3, PreserveLength = true)] + public int? ShowFirstAndLastThreeAndDefaultMaskIntInTheMiddlePreservedLength { get; set; } + /// /// 123456789 results in "123******" /// @@ -76,11 +100,17 @@ public class CustomizedMaskedLogs public string? ShowLastThreeThenDefaultMaskedPreservedLength { get; set; } /// - /// 123456789 results in "123REMOVED" + /// 123456789 results in "123_REMOVED_" /// [LogMasked(Text = "_REMOVED_", ShowFirst = 3)] public string? ShowFirstThreeThenCustomMask { get; set; } + /// + /// d3c4a1f2-3b4e-4f5a-9b6c-7d8e9f0a1b2c results in "d3c4a_REMOVED_" + /// + [LogMasked(Text = "_REMOVED_", ShowFirst = 5)] + public Guid? ShowFirstFiveThenCustomMaskGuid { get; set; } + /// /// 123456789 results in "123_REMOVED_" /// @@ -289,6 +319,25 @@ public void LogMaskedAttribute_Shows_First_NChars_Then_Replaces_All_With_Custom_ props["ShowFirstThreeThenCustomMask"].LiteralValue().ShouldBe("123_REMOVED_"); } + [Test] + public void LogMaskedAttribute_Shows_First_NChars_Then_Replaces_All_With_Custom_Mask_Guid() + { + // [LogMasked(Text = "_REMOVED_", ShowFirst = 5)] + // -> "d3c4a_REMOVED_" + var customized = new CustomizedMaskedLogs + { + ShowFirstFiveThenCustomMaskGuid = Guid.Parse("d3c4a1f2-3b4e-4f5a-9b6c-7d8e9f0a1b2c") + }; + + var evt = DelegatingSink.Execute(customized); + + var sv = (StructureValue)evt.Properties["Customized"]; + var props = sv.Properties.ToDictionary(p => p.Name, p => p.Value); + + props.ContainsKey("ShowFirstFiveThenCustomMaskGuid").ShouldBeTrue(); + props["ShowFirstFiveThenCustomMaskGuid"].LiteralValue().ShouldBe("d3c4a_REMOVED_"); + } + [Test] public void LogMaskedAttribute_Shows_First_NChars_Then_Replaces_All_With_Custom_Mask_PreservedLength_Ignored() { @@ -691,6 +740,84 @@ public void LogMaskedAttribute_Shows_First_NChars_And_Last_NChars_Then_Replaces_ props["ShowFirstAndLastThreeAndCustomMaskInTheMiddlePreservedLengthIgnored"].LiteralValue().ShouldBe("123_REMOVED_321"); } + [Test] + public void LogMaskedAttribute_Replaces_Long_Value_With_DefaultStars_Mask() + { + // [LogMasked] + // 9223372036854775807 -> "***" + var customized = new CustomizedMaskedLogs + { + DefaultMaskedLong = long.MaxValue + }; + + var evt = DelegatingSink.Execute(customized); + + var sv = (StructureValue)evt.Properties["Customized"]; + var props = sv.Properties.ToDictionary(p => p.Name, p => p.Value); + + props.ContainsKey("DefaultMaskedLong").ShouldBeTrue(); + props["DefaultMaskedLong"].LiteralValue().ShouldBe("***"); + } + + [Test] + public void LogMaskedAttribute_Shows_First_NChars_And_Last_NChars_Replaces_Long_Value_With_Default_StarMask() + { + // [LogMasked(ShowFirst = 3, ShowLast = 3)] + // 9223372036854775807 -> "922***807" + var customized = new CustomizedMaskedLogs + { + ShowFirstAndLastThreeAndDefaultMaskLongInTheMiddle = long.MaxValue + }; + + var evt = DelegatingSink.Execute(customized); + + var sv = (StructureValue)evt.Properties["Customized"]; + var props = sv.Properties.ToDictionary(p => p.Name, p => p.Value); + + props.ContainsKey("ShowFirstAndLastThreeAndDefaultMaskLongInTheMiddle").ShouldBeTrue(); + props["ShowFirstAndLastThreeAndDefaultMaskLongInTheMiddle"].LiteralValue().ShouldBe("922***807"); + } + + [Test] + public void LogMaskedAttribute_Replaces_Int_Value_With_DefaultStars_Mask() + { + // [LogMasked] + // 2147483647 -> "***" + var customized = new CustomizedMaskedLogs + { + DefaultMaskedInt = int.MaxValue + }; + + var evt = DelegatingSink.Execute(customized); + + var sv = (StructureValue)evt.Properties["Customized"]; + var props = sv.Properties.ToDictionary(p => p.Name, p => p.Value); + + props.ContainsKey("DefaultMaskedInt").ShouldBeTrue(); + props["DefaultMaskedInt"].LiteralValue().ShouldBe("***"); + } + + [Test] + public void LogMaskedAttribute_Shows_First_NChars_And_Last_NChars_Replaces_Int_Value_With_Default_StarMask_And_PreservedLength() + { + // [LogMasked(ShowFirst = 3, ShowLast = 3, PreserveLength = true)] + // 2147483647 -> "214****647" + + var customized = new CustomizedMaskedLogs + { + ShowFirstAndLastThreeAndDefaultMaskIntInTheMiddlePreservedLength = int.MaxValue + }; + + var evt = DelegatingSink.Execute(customized); + + var sv = (StructureValue)evt.Properties["Customized"]; + var props = sv.Properties.ToDictionary(p => p.Name, p => p.Value); + + props.ContainsKey("ShowFirstAndLastThreeAndDefaultMaskIntInTheMiddlePreservedLength").ShouldBeTrue(); + props["ShowFirstAndLastThreeAndDefaultMaskIntInTheMiddlePreservedLength"].LiteralValue().ShouldBe("214****647"); + } + + [Test] public void LogMaskedAttribute_Nullify_Bool_Property() { diff --git a/src/Destructurama.Attributed/Attributed/LogMaskedAttribute.cs b/src/Destructurama.Attributed/Attributed/LogMaskedAttribute.cs index 4f61694..6caa70a 100644 --- a/src/Destructurama.Attributed/Attributed/LogMaskedAttribute.cs +++ b/src/Destructurama.Attributed/Attributed/LogMaskedAttribute.cs @@ -119,7 +119,10 @@ private LogEventPropertyValue CreateValue(object? value) { IEnumerable strings => new SequenceValue(strings.Select(s => new ScalarValue(FormatMaskedValue(s)))), string s => new ScalarValue(FormatMaskedValue(s)), - _ => ScalarValue.Null + long l => new ScalarValue(FormatMaskedValue(l.ToString())), + int i => new ScalarValue(FormatMaskedValue(i.ToString())), + Guid g => new ScalarValue(FormatMaskedValue(g.ToString())), + _ => ScalarValue.Null, }; } }