fix app compliance

This commit is contained in:
Adphi 2020-01-26 15:37:16 +01:00
parent 2447aea115
commit e03bd71092
6 changed files with 51 additions and 262 deletions

View File

@ -11,11 +11,11 @@
<namespace>OCCWeb</namespace>
<category>tools</category>
<website>https://git.adphi.net/Adphi/OCCWeb</website>
<screenshot>https://git.adphi.net/Adphi/OCCWeb/raw/master/appinfo/screenshot.png</screenshot>
<repository>https://git.adphi.net/Adphi/OCCWeb</repository>
<bugs>https://git.adphi.net/Adphi/OCCWeb/issues</bugs>
<repository>https://git.adphi.net/Adphi/OCCWeb</repository>
<screenshot>https://git.adphi.net/Adphi/OCCWeb/raw/master/appinfo/screenshot.png</screenshot>
<dependencies>
<nextcloud min-version="13" max-version="16"/>
<nextcloud min-version="13" max-version="18"/>
</dependencies>
<navigations>
<navigation role="admin">

Binary file not shown.

View File

@ -0,0 +1,20 @@
<?php
namespace OCA\OCCWeb\Controller;
use OC\AppFramework\Http\Request;
class FakeRequest extends Request {
public $server = array(
'argv' => ["occ"],
);
/**
* FakeRequest constructor.
*/
public function __construct() {
}
}

View File

@ -1,225 +0,0 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Joas Schilling <coding@schilljs.com>
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Miha Frangez <miha.frangez@gmail.com>
* @author Morris Jobke <hey@morrisjobke.de>
* @author noveens <noveen.sachdeva@research.iiit.ac.in>
* @author Robin Appelman <robin@icewind.nl>
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author Victor Dubiniuk <dubiniuk@owncloud.com>
*
* @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 <http://www.gnu.org/licenses/>
*
*/
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(
// '<comment>The current PHP memory limit ' .
// 'is below the recommended value of 512MB.</comment>'
// );
// }
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(
'<comment>Nextcloud is in maintenance mode - ' .
'no apps have been loaded</comment>' . 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);
}
}
}

View File

@ -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);
}

View File

@ -1,18 +1,16 @@
<?php
/**
* Created by IntelliJ IDEA.
* User: philippe-adrien
* Date: 2019-01-18
* Time: 19:08
*/
namespace OCA\OCCWeb\Controller;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Output\ConsoleOutputInterface;
use Symfony\Component\Console\Output\ConsoleSectionOutput;
use Symfony\Component\Console\Output\OutputInterface;
/**
* @method ConsoleSectionOutput section()
*/
class OccOutput extends BufferedOutput implements ConsoleOutputInterface
{
@ -31,4 +29,8 @@ class OccOutput extends BufferedOutput implements ConsoleOutputInterface
{
}
public function __call($name, $arguments) {
// TODO: Implement @method ConsoleSectionOutput section()
}
}