12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- <?php
- namespace Drupal\Core\Security;
- use TYPO3\PharStreamWrapper\Assertable;
- use TYPO3\PharStreamWrapper\Helper;
- use TYPO3\PharStreamWrapper\Exception;
- /**
- * An alternate PharExtensionInterceptor to support phar-based CLI tools.
- *
- * @see \TYPO3\PharStreamWrapper\Interceptor\PharExtensionInterceptor
- */
- class PharExtensionInterceptor implements Assertable {
- /**
- * Determines whether phar file is allowed to execute.
- *
- * The phar file is allowed to execute if:
- * - the base file name has a ".phar" suffix.
- * - it is the CLI tool that has invoked the interceptor.
- *
- * @param string $path
- * The path of the phar file to check.
- * @param string $command
- * The command being carried out.
- *
- * @return bool
- * TRUE if the phar file is allowed to execute.
- *
- * @throws Exception
- * Thrown when the file is not allowed to execute.
- */
- public function assert($path, $command) {
- if ($this->baseFileContainsPharExtension($path)) {
- return TRUE;
- }
- throw new Exception(
- sprintf(
- 'Unexpected file extension in "%s"',
- $path
- ),
- 1535198703
- );
- }
- /**
- * Determines if a path has a .phar extension or invoked execution.
- *
- * @param string $path
- * The path of the phar file to check.
- *
- * @return bool
- * TRUE if the file has a .phar extension or if the execution has been
- * invoked by the phar file.
- */
- private function baseFileContainsPharExtension($path) {
- $baseFile = Helper::determineBaseFile($path);
- if ($baseFile === NULL) {
- return FALSE;
- }
- // If the stream wrapper is registered by invoking a phar file that does
- // not not have .phar extension then this should be allowed. For
- // example, some CLI tools recommend removing the extension.
- $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
- // Find the last entry in the backtrace containing a 'file' key as
- // sometimes the last caller is executed outside the scope of a file. For
- // example, this occurs with shutdown functions.
- do {
- $caller = array_pop($backtrace);
- } while (empty($caller['file']) && !empty($backtrace));
- if (isset($caller['file']) && $baseFile === Helper::determineBaseFile($caller['file'])) {
- return TRUE;
- }
- $fileExtension = pathinfo($baseFile, PATHINFO_EXTENSION);
- return strtolower($fileExtension) === 'phar';
- }
- }
|