Skip to content
Snippets Groups Projects
Commit 0c19bb3e authored by Tim van Dijen's avatar Tim van Dijen
Browse files

Rewrite MetaDataStorageHandlerSerialize using symfony/filesystem

parent 98fc8b59
No related branches found
No related tags found
No related merge requests found
...@@ -8,6 +8,18 @@ use SimpleSAML\Assert\Assert; ...@@ -8,6 +8,18 @@ use SimpleSAML\Assert\Assert;
use SimpleSAML\Configuration; use SimpleSAML\Configuration;
use SimpleSAML\Logger; use SimpleSAML\Logger;
use SimpleSAML\Utils; use SimpleSAML\Utils;
use Symfony\Component\Filesystem\Exception\IOException;
use Symfony\Component\Filesystem\Path;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpFoundation\File\File;
use function array_key_exists;
use function rawurlencode;
use function serialize;
use function strlen;
use function substr;
use function unserialize;
use function var_export;
/** /**
* Class for handling metadata files in serialized format. * Class for handling metadata files in serialized format.
...@@ -45,7 +57,6 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource ...@@ -45,7 +57,6 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource
parent::__construct(); parent::__construct();
$globalConfig = Configuration::getInstance(); $globalConfig = Configuration::getInstance();
$cfgHelp = Configuration::loadFromArray($config, 'serialize metadata source'); $cfgHelp = Configuration::loadFromArray($config, 'serialize metadata source');
$this->directory = $cfgHelp->getString('directory'); $this->directory = $cfgHelp->getString('directory');
...@@ -80,35 +91,22 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource ...@@ -80,35 +91,22 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource
{ {
$ret = []; $ret = [];
$dh = @opendir($this->directory); $loc = new File($this->directory, false);
if ($dh === false) { if (!$this->fileSystem->exists($this->directory) || !$loc->isReadable()) {
Logger::warning( Logger::warning(
'Serialize metadata handler: Unable to open directory: ' . var_export($this->directory, true) 'Serialize metadata handler: Unable to open directory: ' . var_export($this->directory, true)
); );
return $ret; return $ret;
} }
while (($entry = readdir($dh)) !== false) { $finder = new Finder();
if ($entry[0] === '.') { $finder->directories()->name(sprintf('/%s$/' . self::EXTENSION))->in($this->directory);
// skip '..', '.' and hidden files
continue;
}
$path = $this->directory . '/' . $entry;
if (!is_dir($path)) { $ret = [];
Logger::warning( foreach ($finder as $file) {
'Serialize metadata handler: Metadata directory contained a file where only directories should ' . $ret[] = rawurlencode($file->getPathName());
'exist: ' . var_export($path, true)
);
continue;
}
$ret[] = rawurldecode($entry);
} }
closedir($dh);
return $ret; return $ret;
} }
...@@ -124,32 +122,23 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource ...@@ -124,32 +122,23 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource
{ {
$ret = []; $ret = [];
$dir = $this->directory . '/' . rawurlencode($set); $loc = new File(Path::canonicalize($this->directory . '/' . rawurlencode($set)), false);
if (!is_dir($dir)) { if (!$this->fileSystem->exists($loc) || !$loc->isReadable()) {
// probably some code asked for a metadata set which wasn't available Logger::warning(sprintf(
return $ret; 'Serialize metadata handler: Unable to open directory: %s',
} var_export($loc->getPathName(), true),
));
$dh = @opendir($dir);
if ($dh === false) {
Logger::warning(
'Serialize metadata handler: Unable to open directory: ' . var_export($dir, true)
);
return $ret; return $ret;
} }
$extLen = strlen(self::EXTENSION); $extLen = strlen(self::EXTENSION);
while (($file = readdir($dh)) !== false) { $finder = new Finder();
if (strlen($file) <= $extLen) { $finder->directories()->name(sprintf('/%s/$', self::EXTENSION))->in($this->directory);
continue;
}
if (substr($file, -$extLen) !== self::EXTENSION) { $ret = [];
continue; foreach ($finder as $file) {
} $entityId = substr($file->getPathName(), 0, -$extLen);
$entityId = substr($file, 0, -$extLen);
$entityId = rawurldecode($entityId); $entityId = rawurldecode($entityId);
$md = $this->getMetaData($entityId, $set); $md = $this->getMetaData($entityId, $set);
...@@ -158,8 +147,6 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource ...@@ -158,8 +147,6 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource
} }
} }
closedir($dh);
return $ret; return $ret;
} }
...@@ -177,17 +164,15 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource ...@@ -177,17 +164,15 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource
{ {
$filePath = $this->getMetadataPath($entityId, $set); $filePath = $this->getMetadataPath($entityId, $set);
if (!file_exists($filePath)) { if (!$this->fileSystem->exists($filePath)) {
return null; return null;
} }
$data = @file_get_contents($filePath); $file = new File($filePath);
if ($data === false) { try {
/** @var array $error */ $data = $file->getContent();
$error = error_get_last(); } catch (IOException $e) {
Logger::warning( Logger::warning('Error reading file ' . $filePath . ': ' . $e->getMessage());
'Error reading file ' . $filePath . ': ' . $error['message']
);
return null; return null;
} }
...@@ -216,38 +201,37 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource ...@@ -216,38 +201,37 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource
*/ */
public function saveMetadata(string $entityId, string $set, array $metadata): bool public function saveMetadata(string $entityId, string $set, array $metadata): bool
{ {
$filePath = $this->getMetadataPath($entityId, $set); $old = new File($this->getMetadataPath($entityId, $set), false);
$newPath = $filePath . '.new'; $new = new File($old->getPathName() . '.new', false);
$dir = dirname($filePath); $loc = new File($old->getPath(), false);
if (!is_dir($dir)) { if (!$loc->isDir()) {
Logger::info('Creating directory: ' . $dir); Logger::info('Creating directory: ' . $loc);
$res = @mkdir($dir, 0777, true); try {
if ($res === false) { $this->fileSystem->mkdir($loc, 0777);
/** @var array $error */ } catch (IOException $e) {
$error = error_get_last(); Logger::error('Failed to create directory ' . $loc . ': ' . $e->getMessage());
Logger::error('Failed to create directory ' . $dir . ': ' . $error['message']);
return false; return false;
} }
} }
$data = serialize($metadata); $data = serialize($metadata);
Logger::debug('Writing: ' . $newPath); Logger::debug('Writing: ' . $new->getPathName());
$res = file_put_contents($newPath, $data); try {
if ($res === false) { $this->fileSystem->appendToFile($new->getPathName(), $data);
/** @var array $error */ } catch (IOException $e) {
$error = error_get_last(); Logger::error('Error saving file ' . $new->getPathName() . ': ' . $e->getMessage());
Logger::error('Error saving file ' . $newPath . ': ' . $error['message']);
return false; return false;
} }
$res = rename($newPath, $filePath); try {
if ($res === false) { $this->fileSystem->rename($new->getPathName(), $old->getPathName(), true);
/** @var array $error */ } catch (IOException $e) {
$error = error_get_last(); Logger::error(
Logger::error('Error renaming ' . $newPath . ' to ' . $filePath . ': ' . $error['message']); sprintf('Error renaming %s to %s: %s', $new->getPathName(), $old->getPathName(), $e->getMessage())
);
return false; return false;
} }
...@@ -265,7 +249,7 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource ...@@ -265,7 +249,7 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource
{ {
$filePath = $this->getMetadataPath($entityId, $set); $filePath = $this->getMetadataPath($entityId, $set);
if (!file_exists($filePath)) { if (!$this->fileSystem->exists($filePath)) {
Logger::warning( Logger::warning(
'Attempted to erase nonexistent metadata entry ' . 'Attempted to erase nonexistent metadata entry ' .
var_export($entityId, true) . ' in set ' . var_export($set, true) . '.' var_export($entityId, true) . ' in set ' . var_export($set, true) . '.'
...@@ -273,14 +257,14 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource ...@@ -273,14 +257,14 @@ class MetaDataStorageHandlerSerialize extends MetaDataStorageSource
return; return;
} }
$res = unlink($filePath); try {
if ($res === false) { $this->fileSystem->remove($filePath);
/** @var array $error */ } catch (IOException $e) {
$error = error_get_last(); Logger::error(sprintf(
Logger::error( 'Failed to delete file %s: %s',
'Failed to delete file ' . $filePath . $filePath,
': ' . $error['message'] $e->getMessage(),
); ));
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment