1
0
mirror of https://github.com/flarum/core.git synced 2025-08-14 04:14:06 +02:00

File permissions alert and clear command failure message.

This commit is contained in:
SychO9
2021-09-22 22:08:51 +01:00
parent ffaa88f526
commit 40e0a9672b
12 changed files with 299 additions and 20 deletions

View File

@@ -3,6 +3,9 @@
namespace SychO\PackageManager\Api\Controller;
use Flarum\Bus\Dispatcher;
use Laminas\Diactoros\Response\JsonResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Server\RequestHandlerInterface;
use SychO\PackageManager\Api\Serializer\ExtensionSerializer;
use SychO\PackageManager\Command\RequireExtension;
use SychO\PackageManager\Extension\ExtensionUtils;
@@ -12,10 +15,8 @@ use Illuminate\Support\Arr;
use Psr\Http\Message\ServerRequestInterface;
use Tobscure\JsonApi\Document;
class RequireExtensionController extends AbstractCreateController
class RequireExtensionController implements RequestHandlerInterface
{
public $serializer = ExtensionSerializer::class;
/**
* @var Dispatcher
*/
@@ -26,13 +27,15 @@ class RequireExtensionController extends AbstractCreateController
$this->bus = $bus;
}
protected function data(ServerRequestInterface $request, Document $document)
public function handle(ServerRequestInterface $request): ResponseInterface
{
$actor = RequestUtil::getActor($request);
$package = Arr::get($request->getParsedBody(), 'data.package');
return $this->bus->dispatch(
$data = $this->bus->dispatch(
new RequireExtension($actor, $package)
);
return new JsonResponse($data);
}
}

View File

@@ -4,6 +4,7 @@ namespace SychO\PackageManager\Command;
use Composer\Console\Application;
use Flarum\Extension\ExtensionManager;
use SychO\PackageManager\Exception\ComposerRequireFailedException;
use SychO\PackageManager\Extension\ExtensionUtils;
use SychO\PackageManager\RequirePackageValidator;
use Symfony\Component\Console\Input\ArrayInput;
@@ -56,7 +57,11 @@ class RequireExtensionHandler
'packages' => [$command->package],
]);
$this->composer->run($input, $output);
$exitCode = $this->composer->run($input, $output);
if ($exitCode !== 0) {
throw new ComposerRequireFailedException($command->package, $output->fetch());
}
return ['id' => $extensionId];
}

View File

@@ -0,0 +1,48 @@
<?php
/**
*
*/
namespace SychO\PackageManager\Exception;
use Flarum\Foundation\ErrorHandling\HandledError;
class ComposerCommandFailedExceptionHandler
{
protected const INCOMPATIBLE_REGEX = '/ +- {PACKAGE_NAME} v[0-9.]+ requires flarum\/core/m';
public function handle(ComposerRequireFailedException $e): HandledError
{
return (new HandledError(
$e,
'composer_command_failure',
409
))->withDetails($this->errorDetails($e));
}
protected function errorDetails(ComposerRequireFailedException $e): array
{
$details = [
'output' => $e->getMessage(),
];
if ($guessedCause = $this->guessCause($e)) {
$details['guessed_cause'] = $guessedCause;
}
return [$details];
}
protected function guessCause(ComposerRequireFailedException $e): ?string
{
error_log(str_replace('{PACKAGE_NAME}', preg_quote($e->packageName, '/'), self::INCOMPATIBLE_REGEX));
$hasMatches = preg_match(str_replace('{PACKAGE_NAME}', preg_quote($e->packageName, '/'), self::INCOMPATIBLE_REGEX), $e->getMessage(), $matches);
if ($hasMatches) {
return 'extension_incompatible_with_instance';
}
return null;
}
}

View File

@@ -0,0 +1,24 @@
<?php
/**
*
*/
namespace SychO\PackageManager\Exception;
use Exception;
class ComposerRequireFailedException extends Exception
{
/**
* @var string
*/
public $packageName;
public function __construct(string $packageName, string $output)
{
$this->packageName = $packageName;
parent::__construct($output);
}
}