
| Current Path : /var/www/html/vendor/enlightn/security-checker/src/ |
Linux ift1.ift-informatik.de 5.4.0-216-generic #236-Ubuntu SMP Fri Apr 11 19:53:21 UTC 2025 x86_64 |
| Current File : /var/www/html/vendor/enlightn/security-checker/src/AdvisoryFetcher.php |
<?php
namespace Enlightn\SecurityChecker;
use GuzzleHttp\Client;
use Psr\Http\Message\ResponseInterface;
class AdvisoryFetcher
{
/**
* @var \GuzzleHttp\Client
*/
private $client;
/**
* @var string
*/
private $tempDir;
const ADVISORIES_URL = 'https://codeload.github.com/FriendsOfPHP/security-advisories/zip/master';
const CACHE_FILE_NAME = 'php_security_advisories.json';
const ARCHIVE_FILE_NAME = 'php_security_advisories.zip';
const EXTRACT_PATH = 'php_security_advisories';
public function __construct($tempDir = null)
{
$this->client = new Client();
$this->tempDir = is_null($tempDir) ? sys_get_temp_dir() : $tempDir;
}
/**
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function fetchAdvisories()
{
$archivePath = $this->fetchAdvisoriesArchive();
(new Filesystem)->deleteDirectory($extractPath = $this->getExtractDirectoryPath());
$zip = new ZipExtractor;
$zip->extract($archivePath, $extractPath);
return $extractPath;
}
/**
* @return string
* @throws \GuzzleHttp\Exception\GuzzleException
*/
public function fetchAdvisoriesArchive()
{
$headers = [];
$cacheResult = [];
if (! empty($cache = $this->getCacheFile())) {
$cacheResult = json_decode($cache, true);
if (is_file($cacheResult['ArchivePath'])) {
// Set cache headers only if both the cache file and archive file exist.
$headers = [
'If-None-Match' => $cacheResult['Key'],
'If-Modified-Since' => $cacheResult['Date'],
];
}
}
$response = $this->client->get(self::ADVISORIES_URL, [
'headers' => $headers,
]);
if ($response->getStatusCode() !== 304) {
$this->writeCacheFile($response);
$this->storeAdvisoriesArchive((string) $response->getBody());
return $this->getArchiveFilePath();
}
// If a 304 Not Modified header is found, simply rely on the cached archive file.
return $cacheResult['ArchivePath'];
}
/**
* @param string $content
* @return false|int
*/
public function storeAdvisoriesArchive($content)
{
return file_put_contents($this->getArchiveFilePath(), $content);
}
/**
* @return false|string|null
*/
public function getCacheFile()
{
if (! is_file($path = $this->getCacheFilePath())) {
return null;
}
return file_get_contents($path);
}
public function getCacheFilePath()
{
return $this->tempDir.DIRECTORY_SEPARATOR.self::CACHE_FILE_NAME;
}
public function getArchiveFilePath()
{
return $this->tempDir.DIRECTORY_SEPARATOR.self::ARCHIVE_FILE_NAME;
}
public function getExtractDirectoryPath()
{
return $this->tempDir.DIRECTORY_SEPARATOR.self::EXTRACT_PATH;
}
public function setClient(Client $client)
{
$this->client = $client;
}
protected function writeCacheFile(ResponseInterface $response)
{
$cache = [
'Key' => $response->getHeader('Etag')[0],
'Date' => $response->getHeader('Date')[0],
'ArchivePath' => $this->getArchiveFilePath(),
];
file_put_contents($this->getCacheFilePath(), json_encode($cache), LOCK_EX);
}
}