Skip to content

Commit 508fd44

Browse files
Implement variable name whitelist (#398)
1 parent c9af337 commit 508fd44

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

src/Loader/Loader.php

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,25 @@
88

99
class Loader implements LoaderInterface
1010
{
11+
/**
12+
* The variable name whitelist.
13+
*
14+
* @var string[]|null
15+
*/
16+
protected $whitelist;
17+
18+
/**
19+
* Create a new loader instance.
20+
*
21+
* @param string[]|null $whitelist
22+
*
23+
* @return void
24+
*/
25+
public function __construct(array $whitelist = null)
26+
{
27+
$this->whitelist = $whitelist;
28+
}
29+
1130
/**
1231
* Load the given environment file content into the repository.
1332
*
@@ -20,7 +39,7 @@ class Loader implements LoaderInterface
2039
*/
2140
public function load(RepositoryInterface $repository, $content)
2241
{
23-
return self::processEntries(
42+
return $this->processEntries(
2443
$repository,
2544
Lines::process(Regex::split("/(\r\n|\n|\r)/", $content)->getSuccess())
2645
);
@@ -39,14 +58,16 @@ public function load(RepositoryInterface $repository, $content)
3958
*
4059
* @return array<string,string|null>
4160
*/
42-
private static function processEntries(RepositoryInterface $repository, array $entries)
61+
private function processEntries(RepositoryInterface $repository, array $entries)
4362
{
4463
$vars = [];
4564

4665
foreach ($entries as $entry) {
4766
list($name, $value) = Parser::parse($entry);
48-
$vars[$name] = self::resolveNestedVariables($repository, $value);
49-
$repository->set($name, $vars[$name]);
67+
if ($this->whitelist === null || in_array($name, $this->whitelist, true)) {
68+
$vars[$name] = self::resolveNestedVariables($repository, $value);
69+
$repository->set($name, $vars[$name]);
70+
}
5071
}
5172

5273
return $vars;

tests/Dotenv/LoaderTest.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,18 @@ public function testLoaderWithNoReaders()
2020
$this->assertSame($expected, $loader->load($repository, $content));
2121
}
2222

23+
public function testLoaderWithWhitelist()
24+
{
25+
$adapter = new ArrayAdapter();
26+
$repository = RepositoryBuilder::create()->withReaders([$adapter])->withWriters([$adapter])->make();
27+
$loader = new Loader(['FOO']);
28+
29+
$this->assertSame(['FOO' => 'Hello'], $loader->load($repository, "FOO=\"Hello\"\nBAR=\"World!\"\n"));
30+
$this->assertTrue($adapter->get('FOO')->isDefined());
31+
$this->assertSame('Hello', $adapter->get('FOO')->get());
32+
$this->assertFalse($adapter->get('BAR')->isDefined());
33+
}
34+
2335
public function providesAdapters()
2436
{
2537
return [

0 commit comments

Comments
 (0)