diff --git a/src/libfintx.Sepa/Helper/SepaHelper.cs b/src/libfintx.Sepa/Helper/SepaHelper.cs new file mode 100644 index 0000000..58754ad --- /dev/null +++ b/src/libfintx.Sepa/Helper/SepaHelper.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security; +using System.Text; +using System.Text.RegularExpressions; +using System.Xml; + +namespace libfintx.Sepa.Helper +{ + public static class SepaHelper + { + public static string Escape(string str) + { + // Zunächst XML-escapen + var escaped = SecurityElement.Escape(str); + // Dann sicherstellen, dass nur gemäß SEPA gültige Zeichen verwendet werden + return ConvertToValidSepaString(escaped); + } + + public static string ConvertToValidSepaString(string str) + { + return new string(str.Select(c => ConvertToValidSepaString(c)).SelectMany(s => s).ToArray()); + } + + /// + /// Hier findet kein XML-Escaping statt, sondern es wird sichergestellt, dass nur die in SEPA gültigen Zeichen verwendet werden. + /// + /// + /// + private static string ConvertToValidSepaString(char c) + { + switch (c) + { + case 'Ä': return "Ae"; + case 'Ö': return "Oe"; + case 'Ü': return "Ue"; + case 'ä': return "ae"; + case 'ö': return "oe"; + case 'ü': return "ue"; + case 'ß': return "ss"; + } + + if (!Regex.Match($"{c}", @"^[\sa-zA-Z0-9/?:\(\)\.,'+-]$").Success) + return string.Empty; + + return $"{c}"; + } + } +} \ No newline at end of file diff --git a/src/libfintx.Sepa/Pain/pain00100203.cs b/src/libfintx.Sepa/Pain/pain00100203.cs index 23a7e3b..f646953 100644 --- a/src/libfintx.Sepa/Pain/pain00100203.cs +++ b/src/libfintx.Sepa/Pain/pain00100203.cs @@ -25,6 +25,7 @@ using System.Collections.Generic; using System.Security; using libfintx.Globals; +using libfintx.Sepa.Helper; namespace libfintx.Sepa { @@ -52,9 +53,9 @@ public static string Create(string Accountholder, string AccountholderIBAN, stri var Amount_ = Amount.ToString().Replace(",", "."); - var Accountholder_ = SecurityElement.Escape(Accountholder); - var Receiver_ = SecurityElement.Escape(Receiver); - var Usage_ = SecurityElement.Escape(Usage); + var Accountholder_ = SepaHelper.Escape(Accountholder); + var Receiver_ = SepaHelper.Escape(Receiver); + var Usage_ = SepaHelper.Escape(Usage); string Message = "" + "" + diff --git a/src/libfintx.Sepa/Pain/pain00100303.cs b/src/libfintx.Sepa/Pain/pain00100303.cs index 8e70053..ee53c09 100644 --- a/src/libfintx.Sepa/Pain/pain00100303.cs +++ b/src/libfintx.Sepa/Pain/pain00100303.cs @@ -25,6 +25,7 @@ using System.Collections.Generic; using System.Security; using libfintx.Globals; +using libfintx.Sepa.Helper; namespace libfintx.Sepa { @@ -53,9 +54,9 @@ public static string Create(string Accountholder, string AccountholderIBAN, stri var Amount_ = Amount.ToString().Replace(",", "."); - var Accountholder_ = SecurityElement.Escape(Accountholder); - var Receiver_ = SecurityElement.Escape(Receiver); - var Usage_ = SecurityElement.Escape(Usage); + var Accountholder_ = SepaHelper.Escape(Accountholder); + var Receiver_ = SepaHelper.Escape(Receiver); + var Usage_ = SepaHelper.Escape(Usage); string Message = "" + "" + diff --git a/src/libfintx.Sepa/Pain/pain00800202.cs b/src/libfintx.Sepa/Pain/pain00800202.cs index b39032b..fdfb2ef 100644 --- a/src/libfintx.Sepa/Pain/pain00800202.cs +++ b/src/libfintx.Sepa/Pain/pain00800202.cs @@ -25,6 +25,7 @@ using System.Collections.Generic; using System.Security; using libfintx.Globals; +using libfintx.Sepa.Helper; namespace libfintx.Sepa { @@ -63,9 +64,9 @@ public static string Create(string Accountholder, string AccountholderIBAN, stri var Amount_ = Amount.ToString().Replace(",", "."); - var Accountholder_ = SecurityElement.Escape(Accountholder); - var Payer_ = SecurityElement.Escape(Payer); - var Usage_ = SecurityElement.Escape(Usage); + var Accountholder_ = SepaHelper.Escape(Accountholder); + var Payer_ = SepaHelper.Escape(Payer); + var Usage_ = SepaHelper.Escape(Usage); string Message = "" + "" + diff --git a/src/libfintx.Sepa/libfintx.Sepa.csproj b/src/libfintx.Sepa/libfintx.Sepa.csproj index 7bcb7d8..48e2b92 100644 --- a/src/libfintx.Sepa/libfintx.Sepa.csproj +++ b/src/libfintx.Sepa/libfintx.Sepa.csproj @@ -8,10 +8,16 @@ + + + Designer + + + diff --git a/src/libfintx.Tests/Pain/pain00100103Tests.cs b/src/libfintx.Tests/Pain/pain00100103Tests.cs index 0b1b1f9..08472a8 100644 --- a/src/libfintx.Tests/Pain/pain00100103Tests.cs +++ b/src/libfintx.Tests/Pain/pain00100103Tests.cs @@ -3,11 +3,26 @@ using libfintx.FinTS; using System.Collections.Generic; using libfintx.Sepa; +using System.Reflection; +using System.IO; +using System.Text.RegularExpressions; +using libfintx.Sepa.Helper; + namespace libfintx.Tests.Pain { public class pain00100103Tests { + [Fact] + public void Test_Escape() + { + string str = SepaHelper.Escape(@"Hübner;;;\\\"); + Assert.Equal("Huebner", str); + + str = SepaHelper.Escape(@"Der Verwendungszweck der Überweisung ####ist die Mietzahlung."); + Assert.Equal("Der Verwendungszweck der Ueberweisung ist die Mietzahlung.", str); + } + [Fact(Skip = "You have to set the Arrange variables for this test")] public void Create_StateUnderTest_ExpectedBehavior() {