diff --git a/appinfo/info.xml b/appinfo/info.xml index cc6bcd0..7b1cde4 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -11,11 +11,11 @@ OCCWeb tools https://git.adphi.net/Adphi/OCCWeb - https://git.adphi.net/Adphi/OCCWeb/raw/master/appinfo/screenshot.png - https://git.adphi.net/Adphi/OCCWeb https://git.adphi.net/Adphi/OCCWeb/issues + https://git.adphi.net/Adphi/OCCWeb + https://git.adphi.net/Adphi/OCCWeb/raw/master/appinfo/screenshot.png - + diff --git a/lib/Controller/.DS_Store b/lib/Controller/.DS_Store deleted file mode 100644 index 5008ddf..0000000 Binary files a/lib/Controller/.DS_Store and /dev/null differ diff --git a/lib/Controller/FakeRequest.php b/lib/Controller/FakeRequest.php new file mode 100644 index 0000000..d4dce50 --- /dev/null +++ b/lib/Controller/FakeRequest.php @@ -0,0 +1,20 @@ + ["occ"], + ); + + /** + * FakeRequest constructor. + */ + public function __construct() { + } + +} diff --git a/lib/Controller/OCCApplication.php b/lib/Controller/OCCApplication.php deleted file mode 100644 index 928d264..0000000 --- a/lib/Controller/OCCApplication.php +++ /dev/null @@ -1,225 +0,0 @@ - - * @author Jörn Friedrich Dreyer - * @author Lukas Reschke - * @author Miha Frangez - * @author Morris Jobke - * @author noveens - * @author Robin Appelman - * @author Thomas Müller - * @author Victor Dubiniuk - * - * @license AGPL-3.0 - * - * This code is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * 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, version 3, - * along with this program. If not, see - * - */ -namespace OCA\OCCWeb\Controller; - -//use OC\MemoryInfo; -use OC\NeedsUpdateException; -use OC_App; -use OCP\AppFramework\QueryException; -use OCP\Console\ConsoleEvent; -use OCP\IConfig; -use OCP\ILogger; -use Symfony\Component\Console\Application as SymfonyApplication; -use Symfony\Component\Console\Input\InputInterface; -use Symfony\Component\Console\Input\InputOption; -use Symfony\Component\Console\Output\ConsoleOutputInterface; -use Symfony\Component\Console\Output\OutputInterface; -use Symfony\Component\EventDispatcher\EventDispatcherInterface; - -class OCCApplication { - /** @var IConfig */ - private $config; - /** @var EventDispatcherInterface */ - private $dispatcher; - /** @var ILogger */ - private $logger; -// /** @var MemoryInfo */ -// private $memoryInfo; - - /** - * @param IConfig $config - * @param EventDispatcherInterface $dispatcher - * @param ILogger $logger - * @param MemoryInfo $memoryInfo - */ - public function __construct(IConfig $config, - EventDispatcherInterface $dispatcher, - ILogger $logger/*, - MemoryInfo $memoryInfo*/) { - $defaults = \OC::$server->getThemingDefaults(); - $this->config = $config; - $this->application = new SymfonyApplication($defaults->getName(), \OC_Util::getVersionString()); - $this->dispatcher = $dispatcher; - $this->logger = $logger; -// $this->memoryInfo = $memoryInfo; - } - - /** - * @param InputInterface $input - * @param ConsoleOutputInterface $output - * @throws \Exception - */ - public function loadCommands( - InputInterface $input, - ConsoleOutputInterface $output - ) { - // $application is required to be defined in the register_command scripts - $application = $this->application; - $inputDefinition = $application->getDefinition(); - $inputDefinition->addOption( - new InputOption( - 'no-warnings', - null, - InputOption::VALUE_NONE, - 'Skip global warnings, show command output only', - null - ) - ); - try { - $input->bind($inputDefinition); - } catch (\RuntimeException $e) { - //expected if there are extra options - } - if ($input->getOption('no-warnings')) { - $output->setVerbosity(OutputInterface::VERBOSITY_QUIET); - } - -// if ($this->memoryInfo->isMemoryLimitSufficient() === false) { -// $output->getErrorOutput()->writeln( -// 'The current PHP memory limit ' . -// 'is below the recommended value of 512MB.' -// ); -// } - - try { - require_once \OC::$SERVERROOT . '/core/register_command.php'; - if ($this->config->getSystemValue('installed', false)) { - if (\OCP\Util::needUpgrade()) { - throw new NeedsUpdateException(); - } elseif ($this->config->getSystemValue('maintenance', false)) { - $this->writeMaintenanceModeInfo($input, $output); - } else { - OC_App::loadApps(); - foreach (\OC::$server->getAppManager()->getInstalledApps() as $app) { - $appPath = \OC_App::getAppPath($app); - if ($appPath === false) { - continue; - } - // load commands using info.xml - $info = \OC_App::getAppInfo($app); - if (isset($info['commands'])) { - $this->loadCommandsFromInfoXml($info['commands']); - } - // load from register_command.php - \OC_App::registerAutoloading($app, $appPath); - $file = $appPath . '/appinfo/register_command.php'; - if (file_exists($file)) { - try { - require $file; - } catch (\Exception $e) { - $this->logger->logException($e); - } - } - } - } - } else if ($input->getArgument('command') !== '_completion' && $input->getArgument('command') !== 'maintenance:install') { - $output->writeln("Nextcloud is not installed - only a limited number of commands are available"); - } - } catch(NeedsUpdateException $e) { - if ($input->getArgument('command') !== '_completion') { - $output->writeln("Nextcloud or one of the apps require upgrade - only a limited number of commands are available"); - $output->writeln("You may use your browser or the occ upgrade command to do the upgrade"); - } - } - - if ($input->getFirstArgument() !== 'check') { - $errors = \OC_Util::checkServer(\OC::$server->getSystemConfig()); - if (!empty($errors)) { - foreach ($errors as $error) { - $output->writeln((string)$error['error']); - $output->writeln((string)$error['hint']); - $output->writeln(''); - } - throw new \Exception("Environment not properly prepared."); - } - } - } - - /** - * Write a maintenance mode info. - * The commands "_completion" and "maintenance:mode" are excluded. - * - * @param InputInterface $input The input implementation for reading inputs. - * @param ConsoleOutputInterface $output The output implementation - * for writing outputs. - * @return void - */ - private function writeMaintenanceModeInfo( - InputInterface $input, ConsoleOutputInterface $output - ) { - if ($input->getArgument('command') !== '_completion' - && $input->getArgument('command') !== 'maintenance:mode') { - $errOutput = $output->getErrorOutput(); - $errOutput->writeln( - 'Nextcloud is in maintenance mode - ' . - 'no apps have been loaded' . PHP_EOL - ); - } - } - - /** - * Sets whether to automatically exit after a command execution or not. - * - * @param bool $boolean Whether to automatically exit after a command execution or not - */ - public function setAutoExit($boolean) { - $this->application->setAutoExit($boolean); - } - - /** - * @param InputInterface $input - * @param OutputInterface $output - * @return int - * @throws \Exception - */ - public function run(InputInterface $input = null, OutputInterface $output = null) { - $this->dispatcher->dispatch(ConsoleEvent::EVENT_RUN, new ConsoleEvent( - ConsoleEvent::EVENT_RUN, - ['occ'] - )); - return $this->application->run($input, $output); - } - - private function loadCommandsFromInfoXml($commands) { - foreach ($commands as $command) { - try { - $c = \OC::$server->query($command); - } catch (QueryException $e) { - if (class_exists($command)) { - $c = new $command(); - } else { - throw new \Exception("Console command '$command' is unknown and could not be loaded"); - } - } - - $this->application->add($c); - } - } -} diff --git a/lib/Controller/OCCController.php b/lib/Controller/OCCController.php index 38dcc9b..ac0b64c 100644 --- a/lib/Controller/OCCController.php +++ b/lib/Controller/OCCController.php @@ -2,6 +2,10 @@ namespace OCA\OCCWeb\Controller; +use Exception; +use OC; +use OC\Console\Application; +use OC\MemoryInfo; use OCP\IRequest; use OCP\AppFramework\Http\TemplateResponse; use OCP\AppFramework\Http\DataResponse; @@ -18,49 +22,42 @@ class OccController extends Controller private $application; private $output; - public $server; - - public function __construct(ILogger $logger, $AppName, IRequest $request, $UserId) + public function __construct(ILogger $logger, $AppName, IRequest $request, $userId) { parent::__construct($AppName, $request); $this->logger = $logger; - $this->userId = $UserId; + $this->userId = $userId; - $this->server = array( - 'argv' => ["occ"], - ); - $this->application = new OCCApplication( - \OC::$server->getConfig(), - \OC::$server->getEventDispatcher(), - \OC::$server->getLogger()/*, - \OC::$server->query(\OC\MemoryInfo::class)*/ + $this->application = new Application( + OC::$server->getConfig(), + OC::$server->getEventDispatcher(), + new FakeRequest(), + OC::$server->getLogger(), + OC::$server->query(MemoryInfo::class) ); $this->application->setAutoExit(false); -// $this->output = new OCCOutput(); $this->output = new OccOutput(OutputInterface::VERBOSITY_NORMAL, true); $this->application->loadCommands(new StringInput(""), $this->output); } /** - * CAUTION: the @Stuff turns off security checks; for this page no admin is - * required and no CSRF check. If you don't know what CSRF is, read - * it up in the docs or you might create a security hole. This is - * basically the only required method to add this exemption, don't - * add it to any other method if you don't exactly know what it does - * * @NoCSRFRequired */ public function index() { - return new TemplateResponse('occweb', 'index'); // templates/index.php + return new TemplateResponse('occweb', 'index'); } + /** + * @param $input + * @return string + */ private function run($input) { try { $this->application->run($input, $this->output); return $this->output->fetch(); - } catch (\Exception $ex) { + } catch (Exception $ex) { exceptionHandler($ex); } catch (Error $ex) { exceptionHandler($ex); @@ -68,20 +65,15 @@ class OccController extends Controller } /** - * @NoAdminRequired * @param string $command * @return DataResponse */ public function cmd($command) { - - $this->logger->info($command); + $this->logger->debug($command); $input = new StringInput($command); - // TODO : Interactive ? $response = $this->run($input); -// $this->logger->info($response); -// $converter = new AnsiToHtmlConverter(); -// return new DataResponse($converter->convert($response)); + $this->logger->debug($response); return new DataResponse($response); } diff --git a/lib/Controller/OCCOutput.php b/lib/Controller/OCCOutput.php index 2cedece..6f8546e 100644 --- a/lib/Controller/OCCOutput.php +++ b/lib/Controller/OCCOutput.php @@ -1,18 +1,16 @@