From 67a9fcf1bfe946abdc1db4783858ab2363788ae9 Mon Sep 17 00:00:00 2001 From: aott Date: Wed, 4 Dec 2024 16:29:43 +0100 Subject: [PATCH 1/2] Fix escaped double quotes at the end of a line --- src/dotenv.net/Parser.cs | 3 +- src/dotenv.net/dotenv.net.csproj | 6 ++-- tests/dotenv.net.Tests/DotEnv.Fluent.Tests.cs | 29 +++++++++++++++++++ .../dotenv.net.Tests/dotenv.net.Tests.csproj | 3 ++ tests/dotenv.net.Tests/escape.env | 6 ++++ tests/dotenv.net.Tests/multi-lines.env | 1 + 6 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 tests/dotenv.net.Tests/escape.env diff --git a/src/dotenv.net/Parser.cs b/src/dotenv.net/Parser.cs index acaeb4d..f4ff2d7 100644 --- a/src/dotenv.net/Parser.cs +++ b/src/dotenv.net/Parser.cs @@ -11,7 +11,7 @@ internal static class Parser private const string DoubleQuotes = "\""; private static readonly Regex IsQuotedLineStart = new("^[a-zA-Z0-9_ .-]+=\\s*\".*$", RegexOptions.Compiled); - private static readonly Regex IsQuotedLineEnd = new("(?> Parse(ReadOnlySpan rawEnvRows, bool trimValues) @@ -86,6 +86,7 @@ private static string StripQuotes(this string value) modified = true; } + trimmed = trimmed.Replace(@"\\", @"\").Replace("\\\"", "\"");; return modified ? trimmed : value; } diff --git a/src/dotenv.net/dotenv.net.csproj b/src/dotenv.net/dotenv.net.csproj index f7ad23a..2e74af7 100644 --- a/src/dotenv.net/dotenv.net.csproj +++ b/src/dotenv.net/dotenv.net.csproj @@ -12,12 +12,12 @@ https://github.com/bolorundurowb/dotenv.net default README.md - 3.2.1 + 3.3.0 git dotnet, environment, variables, env, dotenv, net core, autofac true - 3.2.1 - 3.2.1 + 3.3.0 + 3.3.0 en-NG netstandard1.6;netstandard2.0;netstandard2.1 dotenv.net diff --git a/tests/dotenv.net.Tests/DotEnv.Fluent.Tests.cs b/tests/dotenv.net.Tests/DotEnv.Fluent.Tests.cs index 3507186..77469b8 100644 --- a/tests/dotenv.net.Tests/DotEnv.Fluent.Tests.cs +++ b/tests/dotenv.net.Tests/DotEnv.Fluent.Tests.cs @@ -16,6 +16,7 @@ public class DotEnvFluentTests private const string AsciiEnvFileName = "ascii.env"; private const string GenericEnvFileName = "generic.env"; private const string IncompleteEnvFileName = "incomplete.env"; + private const string EscapedCharactersEnvFileName = "escape.env"; [Fact] public void ConfigShouldThrowWithNonExistentEnvAndTrackedExceptions() @@ -139,6 +140,9 @@ public void ConfigLoadsMultilineEnvs() EnvReader.GetStringValue("DOUBLE_QUOTE") .Should() .Be("double"); + EnvReader.GetStringValue("DOUBLE_QUOTE_EQUALS2") + .Should() + .Be("double=2"); EnvReader.GetStringValue("DOUBLE_QUOTE_MULTI_LINE") .Should() .Be($"dou{Environment.NewLine}bler"); @@ -168,4 +172,29 @@ public void ConfigShouldLoadEnvWithInvalidEnvEntries() .Should() .BeFalse(); } + + [Fact] + public void ConfigLoadsEnvWithEscapedCharacters() + { + DotEnv.Fluent() + .WithEnvFiles(EscapedCharactersEnvFileName) + .WithoutTrimValues() + .Load(); + + EnvReader.GetStringValue("unescaped") + .Should() + .Be("unescaped Value\\"); + + EnvReader.GetStringValue("more_escaped") + .Should() + .Be("more escaped Value\\\\"); + + EnvReader.GetStringValue("escaped") + .Should() + .Be("escaped Value\"\r\nsecondLine"); + + EnvReader.GetStringValue("escape_in_the_middle") + .Should() + .Be("this time we \" escaped in the middle"); + } } diff --git a/tests/dotenv.net.Tests/dotenv.net.Tests.csproj b/tests/dotenv.net.Tests/dotenv.net.Tests.csproj index e75eec9..7520ebc 100644 --- a/tests/dotenv.net.Tests/dotenv.net.Tests.csproj +++ b/tests/dotenv.net.Tests/dotenv.net.Tests.csproj @@ -29,6 +29,9 @@ Always + + Always + Always diff --git a/tests/dotenv.net.Tests/escape.env b/tests/dotenv.net.Tests/escape.env new file mode 100644 index 0000000..8712c87 --- /dev/null +++ b/tests/dotenv.net.Tests/escape.env @@ -0,0 +1,6 @@ +unescaped="unescaped Value\\" +more_escaped="more escaped Value\\\\" +escaped="escaped Value\" +secondLine" +irrelevantValue="" +escape_in_the_middle="this time we \" escaped in the middle" \ No newline at end of file diff --git a/tests/dotenv.net.Tests/multi-lines.env b/tests/dotenv.net.Tests/multi-lines.env index 6e8df71..3a8bc38 100644 --- a/tests/dotenv.net.Tests/multi-lines.env +++ b/tests/dotenv.net.Tests/multi-lines.env @@ -1,4 +1,5 @@ DOUBLE_QUOTE="double" +DOUBLE_QUOTE_EQUALS2="double=2" DOUBLE_QUOTE_MULTI_LINE="dou bler" DOUBLE_QUOTE_EVEN_MORE_LINES="dou From 477916f30a8ae8c33ac045300c864bbb3d09349d Mon Sep 17 00:00:00 2001 From: aott Date: Wed, 4 Dec 2024 16:31:47 +0100 Subject: [PATCH 2/2] Fix test --- tests/dotenv.net.Tests/DotEnv.Fluent.Tests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/dotenv.net.Tests/DotEnv.Fluent.Tests.cs b/tests/dotenv.net.Tests/DotEnv.Fluent.Tests.cs index 77469b8..ff06ad7 100644 --- a/tests/dotenv.net.Tests/DotEnv.Fluent.Tests.cs +++ b/tests/dotenv.net.Tests/DotEnv.Fluent.Tests.cs @@ -191,7 +191,7 @@ public void ConfigLoadsEnvWithEscapedCharacters() EnvReader.GetStringValue("escaped") .Should() - .Be("escaped Value\"\r\nsecondLine"); + .Be($"escaped Value\"{Environment.NewLine}secondLine"); EnvReader.GetStringValue("escape_in_the_middle") .Should()