<command>OCA\Files\Command\TransferOwnership</command>
<command>OCA\Files\Command\ScanAppData</command>
<command>OCA\Files\Command\RepairTree</command>
+ <command>OCA\Files\Command\Get</command>
+ <command>OCA\Files\Command\Delete</command>
</commands>
<activity>
'OCA\\Files\\Capabilities' => $baseDir . '/../lib/Capabilities.php',
'OCA\\Files\\Collaboration\\Resources\\Listener' => $baseDir . '/../lib/Collaboration/Resources/Listener.php',
'OCA\\Files\\Collaboration\\Resources\\ResourceProvider' => $baseDir . '/../lib/Collaboration/Resources/ResourceProvider.php',
+ 'OCA\\Files\\Command\\Delete' => $baseDir . '/../lib/Command/Delete.php',
'OCA\\Files\\Command\\DeleteOrphanedFiles' => $baseDir . '/../lib/Command/DeleteOrphanedFiles.php',
+ 'OCA\\Files\\Command\\Get' => $baseDir . '/../lib/Command/Get.php',
'OCA\\Files\\Command\\RepairTree' => $baseDir . '/../lib/Command/RepairTree.php',
'OCA\\Files\\Command\\Scan' => $baseDir . '/../lib/Command/Scan.php',
'OCA\\Files\\Command\\ScanAppData' => $baseDir . '/../lib/Command/ScanAppData.php',
'OCA\\Files\\Capabilities' => __DIR__ . '/..' . '/../lib/Capabilities.php',
'OCA\\Files\\Collaboration\\Resources\\Listener' => __DIR__ . '/..' . '/../lib/Collaboration/Resources/Listener.php',
'OCA\\Files\\Collaboration\\Resources\\ResourceProvider' => __DIR__ . '/..' . '/../lib/Collaboration/Resources/ResourceProvider.php',
+ 'OCA\\Files\\Command\\Delete' => __DIR__ . '/..' . '/../lib/Command/Delete.php',
'OCA\\Files\\Command\\DeleteOrphanedFiles' => __DIR__ . '/..' . '/../lib/Command/DeleteOrphanedFiles.php',
+ 'OCA\\Files\\Command\\Get' => __DIR__ . '/..' . '/../lib/Command/Get.php',
'OCA\\Files\\Command\\RepairTree' => __DIR__ . '/..' . '/../lib/Command/RepairTree.php',
'OCA\\Files\\Command\\Scan' => __DIR__ . '/..' . '/../lib/Command/Scan.php',
'OCA\\Files\\Command\\ScanAppData' => __DIR__ . '/..' . '/../lib/Command/ScanAppData.php',
--- /dev/null
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Files\Command;
+
+use OC\Core\Command\Info\FileUtils;
+use OCA\Files_Sharing\SharedStorage;
+use OCP\Files\Folder;
+use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Helper\QuestionHelper;
+use Symfony\Component\Console\Input\InputArgument;
+use Symfony\Component\Console\Input\InputInterface;
+use Symfony\Component\Console\Input\InputOption;
+use Symfony\Component\Console\Output\OutputInterface;
+use Symfony\Component\Console\Question\ConfirmationQuestion;
+
+class Delete extends Command {
+ private FileUtils $fileUtils;
+
+ public function __construct(FileUtils $fileUtils) {
+ $this->fileUtils = $fileUtils;
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files:delete')
+ ->setDescription('Delete a file or folder')
+ ->addArgument('file', InputArgument::REQUIRED, "File id or path")
+ ->addOption('force', 'f', InputOption::VALUE_NONE, "Don't ask for configuration and don't output any warnings");
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $fileInput = $input->getArgument('file');
+ $inputIsId = is_numeric($fileInput);
+ $force = $input->getOption('force');
+ $node = $this->fileUtils->getNode($fileInput);
+
+ if (!$node) {
+ $output->writeln("<error>file $fileInput not found</error>");
+ return 1;
+ }
+
+ $deleteConfirmed = $force;
+ if (!$deleteConfirmed) {
+ /** @var QuestionHelper $helper */
+ $helper = $this->getHelper('question');
+ $storage = $node->getStorage();
+ if (!$inputIsId && $storage->instanceOfStorage(SharedStorage::class) && $node->getInternalPath() === '') {
+ /** @var SharedStorage $storage */
+ [,$user] = explode('/', $fileInput, 3);
+ $question = new ConfirmationQuestion("<info>$fileInput</info> in a shared file, do you want to unshare the file <info>$user</info> instead of deleting the source file? [Y/n] ", true);
+ if ($helper->ask($input, $output, $question)) {
+ $storage->unshareStorage();
+ return 0;
+ } else {
+ $node = $storage->getShare()->getNode();
+ $output->writeln("");
+ }
+ }
+
+ $filesByUsers = $this->fileUtils->getFilesByUser($node);
+ if (count($filesByUsers) > 1) {
+ $output->writeln("Warning: the provided file is accessible by more than one user");
+ $output->writeln(" all of the following users will lose access to the file when deleted:");
+ $output->writeln("");
+ foreach ($filesByUsers as $user => $filesByUser) {
+ $output->writeln($user . ":");
+ foreach($filesByUser as $file) {
+ $output->writeln(" - " . $file->getPath());
+ }
+ }
+ $output->writeln("");
+ }
+
+ if ($node instanceof Folder) {
+ $maybeContents = " and all it's contents";
+ } else {
+ $maybeContents = "";
+ }
+ $question = new ConfirmationQuestion("Delete " . $node->getPath() . $maybeContents . "? [y/N] ", false);
+ $deleteConfirmed = $helper->ask($input, $output, $question);
+ }
+
+ if ($deleteConfirmed) {
+ if ($node->isDeletable()) {
+ $node->delete();
+ } else {
+ $output->writeln("<error>File cannot be deleted, insufficient permissions.</error>");
+ }
+ }
+
+ return 0;
+ }
+
+}
--- /dev/null
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCA\Files\Command;
+
+
+use OC\Core\Command\Info\FileUtils;
+use OCP\Files\File;
+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 Get extends Command {
+ private FileUtils $fileUtils;
+
+ public function __construct(FileUtils $fileUtils) {
+ $this->fileUtils = $fileUtils;
+ parent::__construct();
+ }
+
+ protected function configure(): void {
+ $this
+ ->setName('files:get')
+ ->setDescription('Get the contents of a file')
+ ->addArgument('file', InputArgument::REQUIRED, "File id or path")
+ ->addArgument('output', InputArgument::OPTIONAL, "Target file to output to, defaults to STDOUT");
+ }
+
+ public function execute(InputInterface $input, OutputInterface $output): int {
+ $fileInput = $input->getArgument('file');
+ $outputName = $input->getArgument('output');
+ $node = $this->fileUtils->getNode($fileInput);
+
+ if (!$node) {
+ $output->writeln("<error>file $fileInput not found</error>");
+ return 1;
+ }
+
+ if ($node instanceof File) {
+ $isTTY = stream_isatty(STDOUT);
+ if ($outputName === null && $isTTY && $node->getMimePart() !== 'text') {
+ $output->writeln([
+ "<error>Warning: Binary output can mess up your terminal</error>",
+ " Use <info>occ files:get $fileInput -</info> to output it to the terminal anyway",
+ " Or <info>occ files:get $fileInput <FILE></info> to save to a file instead"
+ ]);
+ return 1;
+ }
+ $source = $node->fopen('r');
+ $target = (!$outputName || strtolower($outputName) === '-') ? STDOUT : fopen($outputName, 'w');
+ stream_copy_to_stream($source, $target);
+ return 0;
+ } else {
+ $output->writeln("<error>$fileInput is a directory</error>");
+ return 1;
+ }
+ }
+
+}
+++ /dev/null
-<?php
-
-declare(strict_types=1);
-/**
- * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-namespace OC\Core\Command\Info;
-
-use OCA\Files_Sharing\SharedStorage;
-use OCP\Files\Folder;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Helper\QuestionHelper;
-use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
-use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Component\Console\Question\ConfirmationQuestion;
-
-class Delete extends Command {
- private FileUtils $fileUtils;
-
- public function __construct(FileUtils $fileUtils) {
- $this->fileUtils = $fileUtils;
- parent::__construct();
- }
-
- protected function configure(): void {
- $this
- ->setName('info:file:delete')
- ->setDescription('Delete a file or folder')
- ->addArgument('file', InputArgument::REQUIRED, "File id or path")
- ->addOption('force', 'f', InputOption::VALUE_NONE, "Don't ask for configuration and don't output any warnings");
- }
-
- public function execute(InputInterface $input, OutputInterface $output): int {
- $fileInput = $input->getArgument('file');
- $inputIsId = is_numeric($fileInput);
- $force = $input->getOption('force');
- $node = $this->fileUtils->getNode($fileInput);
-
- if (!$node) {
- $output->writeln("<error>file $fileInput not found</error>");
- return 1;
- }
-
- $deleteConfirmed = $force;
- if (!$deleteConfirmed) {
- /** @var QuestionHelper $helper */
- $helper = $this->getHelper('question');
- $storage = $node->getStorage();
- if (!$inputIsId && $storage->instanceOfStorage(SharedStorage::class) && $node->getInternalPath() === '') {
- /** @var SharedStorage $storage */
- [,$user] = explode('/', $fileInput, 3);
- $question = new ConfirmationQuestion("<info>$fileInput</info> in a shared file, do you want to unshare the file <info>$user</info> instead of deleting the source file? [Y/n] ", true);
- if ($helper->ask($input, $output, $question)) {
- $storage->unshareStorage();
- return 0;
- } else {
- $node = $storage->getShare()->getNode();
- $output->writeln("");
- }
- }
-
- $filesByUsers = $this->fileUtils->getFilesByUser($node);
- if (count($filesByUsers) > 1) {
- $output->writeln("Warning: the provided file is accessible by more than one user");
- $output->writeln(" all of the following users will lose access to the file when deleted:");
- $output->writeln("");
- foreach ($filesByUsers as $user => $filesByUser) {
- $output->writeln($user . ":");
- foreach($filesByUser as $file) {
- $output->writeln(" - " . $file->getPath());
- }
- }
- $output->writeln("");
- }
-
- if ($node instanceof Folder) {
- $maybeContents = " and all it's contents";
- } else {
- $maybeContents = "";
- }
- $question = new ConfirmationQuestion("Delete " . $node->getPath() . $maybeContents . "? [y/N] ", false);
- $deleteConfirmed = $helper->ask($input, $output, $question);
- }
-
- if ($deleteConfirmed) {
- if ($node->isDeletable()) {
- $node->delete();
- } else {
- $output->writeln("<error>File cannot be deleted, insufficient permissions.</error>");
- }
- }
-
- return 0;
- }
-
-}
+++ /dev/null
-<?php
-
-declare(strict_types=1);
-/**
- * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
- *
- * @license GNU AGPL version 3 or any later version
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-namespace OC\Core\Command\Info;
-
-
-use OCP\Files\File;
-use OCP\Util;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputArgument;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Input\InputOption;
-use Symfony\Component\Console\Output\OutputInterface;
-
-class Get extends Command {
- private FileUtils $fileUtils;
-
- public function __construct(FileUtils $fileUtils) {
- $this->fileUtils = $fileUtils;
- parent::__construct();
- }
-
- protected function configure(): void {
- $this
- ->setName('info:file:get')
- ->setDescription('Get the contents of a file')
- ->addArgument('file', InputArgument::REQUIRED, "File id or path")
- ->addOption('output', 'o', InputOption::VALUE_REQUIRED, "Target file to output to");
- }
-
- public function execute(InputInterface $input, OutputInterface $output): int {
- $fileInput = $input->getArgument('file');
- $outputName = $input->getOption('output');
- $node = $this->fileUtils->getNode($fileInput);
-
- if (!$node) {
- $output->writeln("<error>file $fileInput not found</error>");
- return 1;
- }
-
- if ($node instanceof File) {
- $isTTY = stream_isatty(STDOUT);
- if ($outputName === null && $isTTY && $node->getMimePart() !== 'text') {
- $output->writeln([
- "<error>Warning: Binary output can mess up your terminal</error>",
- " Use '--output STDOUT' to output it to the terminal anyway",
- " Or '--output <FILE>' to save to a file instead"
- ]);
- return 1;
- }
- $source = $node->fopen('r');
- $target = (!$outputName || strtolower($outputName) === 'stdout') ? STDOUT : fopen($outputName, 'w');
- stream_copy_to_stream($source, $target);
- return 0;
- } else {
- $output->writeln("<error>$fileInput is a directory</error>");
- return 1;
- }
- }
-
-}
$application->add(\OC::$server->get(OC\Core\Command\Info\File::class));
$application->add(\OC::$server->get(OC\Core\Command\Info\Space::class));
- $application->add(\OC::$server->get(OC\Core\Command\Info\Get::class));
- $application->add(\OC::$server->get(OC\Core\Command\Info\Delete::class));
$application->add(new OC\Core\Command\Db\ConvertType(\OC::$server->getConfig(), new \OC\DB\ConnectionFactory(\OC::$server->getSystemConfig())));
$application->add(new OC\Core\Command\Db\ConvertMysqlToMB4(\OC::$server->getConfig(), \OC::$server->getDatabaseConnection(), \OC::$server->getURLGenerator(), \OC::$server->get(LoggerInterface::class)));