From bf869f40b988adb61fca9f3d0e4f902e51f0a79f Mon Sep 17 00:00:00 2001 From: James Titcumb Date: Tue, 28 Jan 2025 21:52:58 +0000 Subject: [PATCH] Check the additional php.ini dir is writable --- .../Ini/StandardAdditionalPhpIniDirectory.php | 13 +++++++++++ .../StandardAdditionalPhpIniDirectoryTest.php | 23 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/Installing/Ini/StandardAdditionalPhpIniDirectory.php b/src/Installing/Ini/StandardAdditionalPhpIniDirectory.php index a627b90..84a4b50 100644 --- a/src/Installing/Ini/StandardAdditionalPhpIniDirectory.php +++ b/src/Installing/Ini/StandardAdditionalPhpIniDirectory.php @@ -10,6 +10,7 @@ use Symfony\Component\Console\Output\OutputInterface; use function file_exists; +use function is_writable; use function rtrim; use function sprintf; use function touch; @@ -43,6 +44,18 @@ public function setup( return false; } + if (! file_exists($additionalIniFilesPath) || ! is_writable($additionalIniFilesPath)) { + $output->writeln( + sprintf( + 'PHP is configured to use additional INI file path %s, but it did not exist, or is not writable by PIE.', + $additionalIniFilesPath, + ), + OutputInterface::VERBOSITY_VERBOSE, + ); + + return false; + } + $expectedIniFile = sprintf( '%s%s%d-%s.ini', rtrim($additionalIniFilesPath, DIRECTORY_SEPARATOR), diff --git a/test/unit/Installing/Ini/StandardAdditionalPhpIniDirectoryTest.php b/test/unit/Installing/Ini/StandardAdditionalPhpIniDirectoryTest.php index 404a1d0..83f5b9e 100644 --- a/test/unit/Installing/Ini/StandardAdditionalPhpIniDirectoryTest.php +++ b/test/unit/Installing/Ini/StandardAdditionalPhpIniDirectoryTest.php @@ -134,6 +134,29 @@ public function testSetupReturnsWhenAdditionalPhpIniDirectoryIsNotSet(): void )); } + public function testSetupReturnsWhenAdditionalPhpIniDirectoryDoesNotExist(): void + { + $this->mockPhpBinary + ->expects(self::once()) + ->method('additionalIniDirectory') + ->willReturn('/path/to/something/does/not/exist'); + + $this->checkAndAddExtensionToIniIfNeeded + ->expects(self::never()) + ->method('__invoke'); + + self::assertFalse($this->standardAdditionalPhpIniDirectory->setup( + $this->targetPlatform, + $this->downloadedPackage, + $this->binaryFile, + $this->output, + )); + self::assertStringContainsString( + 'PHP is configured to use additional INI file path /path/to/something/does/not/exist, but it did not exist, or is not writable by PIE.', + $this->output->fetch(), + ); + } + public function testReturnsTrueWhenCheckAndAddExtensionIsInvoked(): void { $additionalPhpIniDirectory = tempnam(sys_get_temp_dir(), 'pie_additional_php_ini_path');