%PDF- %PDF-
Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Command/ |
Current File : //www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Command/BackupExportCommand.php |
<?php /** * This file is part of the Passwords App * created by Marius David Wieschollek * and licensed under the AGPL. */ namespace OCA\Passwords\Command; use Exception; use OCA\Passwords\Services\BackupService; use OCP\Files\NotPermittedException; use OCP\Files\SimpleFS\ISimpleFile; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputArgument; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; /** * Class BackupExportCommand * * @package OCA\Passwords\Command */ class BackupExportCommand extends Command { /** * @var BackupService */ protected BackupService $backupService; /** * BackupExportCommand constructor. * * @param BackupService $backupService */ public function __construct(BackupService $backupService) { $this->backupService = $backupService; parent::__construct(); } /** * */ protected function configure(): void { $this->setName('passwords:backup:export') ->addArgument('name', InputArgument::REQUIRED, 'The name of the backup') ->addArgument('file', InputArgument::OPTIONAL, 'The path of the export file') ->setDescription('Export a backup to a file'); } /** * @param InputInterface $input * @param OutputInterface $output * * @return int * @throws NotPermittedException * @throws Exception */ protected function execute(InputInterface $input, OutputInterface $output): int { $backup = $this->getBackup($input->getArgument('name')); $exportPath = $this->getFilePath($input, $backup); file_put_contents($exportPath, $backup->getContent()); $output->writeln('Exported backup to '.$exportPath); return 0; } /** * @param $name * * @return ISimpleFile * @throws NotPermittedException * @throws Exception */ protected function getBackup($name): ISimpleFile { $backups = $this->backupService->getBackups(); if(isset($backups[ $name ])) return $backups[ $name ]; throw new Exception("Could not find backup '{$name}'"); } /** * @param InputInterface $input * @param ISimpleFile $backup * * @return string * @throws Exception */ protected function getFilePath(InputInterface $input, ISimpleFile $backup): string { if(!$input->hasArgument('file')) return getcwd().DIRECTORY_SEPARATOR.$backup->getName(); $exportFolder = $input->getArgument('file'); if($exportFolder[0] !== '/') $exportFolder = getcwd().DIRECTORY_SEPARATOR.$exportFolder; $exportFile = $backup->getName(); $fileEnding = substr($exportFile, strrpos($exportFile, '.json')); if(substr($exportFolder, -strlen($fileEnding)) === $fileEnding) { $exportFile = basename($exportFolder); $exportFolder = dirname($exportFolder); } if(!is_dir($exportFolder)) { if(is_file($exportFolder)) throw new Exception('Invalid export file path'); mkdir($exportFolder, 0777, true); } $exportPath = $exportFolder.DIRECTORY_SEPARATOR.$exportFile; if(file_exists($exportPath) && !is_file($exportPath)) throw new Exception('Invalid export file path'); return $this->normalizePath($exportPath); } /** * @param string $path * * @return string */ protected function normalizePath(string $path): string { $path = str_replace(['/', '\\'], DIRECTORY_SEPARATOR, $path); $parts = explode(DIRECTORY_SEPARATOR, $path); $absolutes = []; foreach($parts as $part) { if('.' === $part || empty($part)) continue; if('..' === $part) { array_pop($absolutes); } else { $absolutes[] = $part; } } return DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR, $absolutes); } }