Skip to content

Commit

Permalink
Fixed parsing regressions (#339)
Browse files Browse the repository at this point in the history
  • Loading branch information
GrahamCampbell committed Jan 29, 2019
1 parent 84f6081 commit 22165d0
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 4 deletions.
6 changes: 3 additions & 3 deletions src/Parser.php
Expand Up @@ -108,7 +108,7 @@ private static function parseValue($value)
return array_reduce(str_split($value), function ($data, $char) use ($value) {
switch ($data[1]) {
case self::INITIAL_STATE:
if ($char === '"') {
if ($char === '"' || $char === '\'') {
return [$data[0], self::QUOTED_STATE];
} elseif ($char === '#') {
return [$data[0], self::COMMENT_STATE];
Expand All @@ -124,15 +124,15 @@ private static function parseValue($value)
return [$data[0].$char, self::UNQUOTED_STATE];
}
case self::QUOTED_STATE:
if ($char === '"') {
if ($char === $value[0]) {
return [$data[0], self::WHITESPACE_STATE];
} elseif ($char === '\\') {
return [$data[0], self::ESCAPE_STATE];
} else {
return [$data[0].$char, self::QUOTED_STATE];
}
case self::ESCAPE_STATE:
if ($char === '"' || $char === '\\') {
if ($char === $value[0] || $char === '\\') {
return [$data[0].$char, self::QUOTED_STATE];
} else {
throw new InvalidFileException(
Expand Down
7 changes: 7 additions & 0 deletions tests/Dotenv/DotenvTest.php
Expand Up @@ -84,9 +84,13 @@ public function testQuotedDotenvLoadsEnvironmentVars()
$this->assertSame('baz', getenv('QBAR'));
$this->assertSame('with spaces', getenv('QSPACED'));
$this->assertEmpty(getenv('QNULL'));

$this->assertSame('pgsql:host=localhost;dbname=test', getenv('QEQUALS'));
$this->assertSame('test some escaped characters like a quote (") or maybe a backslash (\\)', getenv('QESCAPED'));
$this->assertSame('iiiiviiiixiiiiviiii\\n', getenv('QSLASH'));

$this->assertSame('test some escaped characters like a quote (\') or maybe a backslash (\\)', getenv('SQESCAPED'));
$this->assertSame('iiiiviiiixiiiiviiii\\n', getenv('SQSLASH'));
}

public function testLargeDotenvLoadsEnvironmentVars()
Expand Down Expand Up @@ -274,6 +278,9 @@ public function testDotenvAllowsSpecialCharacters()
$this->assertSame('jdgEB4{QgEC]HL))&GcXxokB+wqoN+j>xkV7K?m$r', getenv('SPVAR3'));
$this->assertSame('22222:22#2^{', getenv('SPVAR4'));
$this->assertSame('test some escaped characters like a quote " or maybe a backslash \\', getenv('SPVAR5'));
$this->assertSame('secret!@', getenv('SPVAR6'));
$this->assertSame('secret!@#', getenv('SPVAR7'));
$this->assertSame('secret!@#', getenv('SPVAR8'));
}

public function testMutlilineLoading()
Expand Down
11 changes: 10 additions & 1 deletion tests/Dotenv/ParserTest.php
Expand Up @@ -64,8 +64,17 @@ public function testParseInvalidName()
* @expectedException \Dotenv\Exception\InvalidFileException
* @expectedExceptionMessage Failed to parse dotenv file due to an unexpected escape sequence. Failed at ["iiiiviiiixiiiiviiii\n"].
*/
public function testParserEscaping()
public function testParserEscapingDouble()
{
Parser::parse('FOO_BAD="iiiiviiiixiiiiviiii\\n"');
}

/**
* @expectedException \Dotenv\Exception\InvalidFileException
* @expectedExceptionMessage Failed to parse dotenv file due to an unexpected escape sequence. Failed at ['iiiiviiiixiiiiviiii\n'].
*/
public function testParserEscapingSingle()
{
Parser::parse('FOO_BAD=\'iiiiviiiixiiiiviiii\\n\'');
}
}
3 changes: 3 additions & 0 deletions tests/fixtures/env/quoted.env
Expand Up @@ -8,3 +8,6 @@ QWHITESPACE = "no space"

QESCAPED="test some escaped characters like a quote (\") or maybe a backslash (\\)"
QSLASH="iiiiviiiixiiiiviiii\\n"

SQESCAPED='test some escaped characters like a quote (\') or maybe a backslash (\\)'
SQSLASH='iiiiviiiixiiiiviiii\\n'
3 changes: 3 additions & 0 deletions tests/fixtures/env/specialchars.env
Expand Up @@ -3,3 +3,6 @@ SPVAR2="?BUty3koaV3%GA*hMAwH}B"
SPVAR3="jdgEB4{QgEC]HL))&GcXxokB+wqoN+j>xkV7K?m$r"
SPVAR4="22222:22#2^{"
SPVAR5="test some escaped characters like a quote \" or maybe a backslash \\" # not escaped
SPVAR6=secret!@#
SPVAR7='secret!@#'
SPVAR8="secret!@#"

0 comments on commit 22165d0

Please sign in to comment.