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'; } }