DrupalDirectoryDestination.php in Backup and Migrate 5.0.x
File
src/Drupal/Destination/DrupalDirectoryDestination.php
View source
<?php
namespace Drupal\backup_migrate\Drupal\Destination;
use Drupal\backup_migrate\Core\Destination\DirectoryDestination;
use Drupal\backup_migrate\Core\Exception\BackupMigrateException;
use Drupal\backup_migrate\Core\File\BackupFileReadableInterface;
use Drupal\Core\File\Exception\FileException;
use Drupal\Core\File\FileSystemInterface;
use Drupal\Core\StreamWrapper\PrivateStream;
class DrupalDirectoryDestination extends DirectoryDestination {
public function saveTheFile(BackupFileReadableInterface $file) {
$this
->checkDirectory();
try {
\Drupal::service('file_system')
->move($file
->realpath(), $this
->idToPath($file
->getFullName()), FileSystemInterface::EXISTS_REPLACE);
} catch (FileException $e) {
return FALSE;
}
}
protected function checkDirectory() {
$dir = $this
->confGet('directory');
$is_private = strpos($dir, 'private://') === 0;
if ($is_private) {
if (!PrivateStream::basePath()) {
throw new BackupMigrateException("The backup file could not be saved to '%dir' because your private files system path has not been set.", [
'%dir' => $dir,
]);
}
if (!\Drupal::service('file_system')
->prepareDirectory($dir, FileSystemInterface::CREATE_DIRECTORY && FileSystemInterface::MODIFY_PERMISSIONS)) {
throw new BackupMigrateException("The backup file could not be saved to '%dir' because the directory could not be created or cannot be written to. Please make sure your private files directory is writable by the web server.", [
'%dir' => $dir,
]);
}
}
else {
$real = \Drupal::service('file_system')
->realpath($dir);
if ($real) {
$in_root = strpos($real, DRUPAL_ROOT) === 0;
if ($in_root) {
throw new BackupMigrateException("The backup file could not be saved to '%dir' because that directory may be publicly accessible via the web. Please save your backups to the private file directory or a directory outside of the web root.", [
'%dir' => $dir,
]);
}
}
}
parent::checkDirectory();
}
public function queryFiles(array $filters = [], $sort = 'datestamp', $sort_direction = SORT_DESC, $count = 100, $start = 0) {
$out = $this
->listFiles($count + $start);
foreach ($out as $key => $file) {
$out[$key] = $this
->loadFileMetadata($file);
}
if ($filters) {
$out = array_filter($out, function ($file) use ($filters) {
foreach ($filters as $key => $value) {
if ($file
->getMeta($key) !== $value) {
return FALSE;
}
}
return TRUE;
});
}
if ($sort && $sort_direction) {
uasort($out, function ($a, $b) use ($sort, $sort_direction) {
if ($sort_direction == SORT_DESC) {
if ($sort == 'name') {
return $a
->getFullName() <=> $b
->getFullName();
}
return $a
->getMeta($sort) <=> $b
->getMeta($sort);
}
else {
if ($sort == 'name') {
return $b
->getFullName() <=> $a
->getFullName();
}
return $b
->getMeta($sort) <=> $a
->getMeta($sort);
}
});
}
if ($count || $start) {
$out = array_slice($out, $start, $count);
}
return $out;
}
}