diff --git a/src/Controller/BrowserPluginController.php b/src/Controller/BrowserPluginController.php index 8a5d2cb2..9940d426 100644 --- a/src/Controller/BrowserPluginController.php +++ b/src/Controller/BrowserPluginController.php @@ -26,12 +26,15 @@ use App\Entity\UserSystem\User; use App\Services\InfoProviderSystem\ProviderRegistry; use App\Services\InfoProviderSystem\SubmittedPageStorage; use App\Services\InfoProviderSystem\DTOs\BrowserSubmittedPage; +use App\Settings\InfoProviderSystem\BrowserPluginSettings; use App\Settings\SystemSettings\CustomizationSettings; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Attribute\MapRequestPayload; +use Symfony\Component\HttpKernel\Exception\HttpException; +use Symfony\Component\HttpKernel\Exception\ServiceUnavailableHttpException; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; @@ -48,6 +51,7 @@ class BrowserPluginController extends AbstractController private readonly SubmittedPageStorage $browserHtmlStorage, private readonly ProviderRegistry $providerRegistry, private readonly CustomizationSettings $customizationSettings, + private readonly BrowserPluginSettings $browserPluginSettings, ) { } @@ -62,6 +66,7 @@ class BrowserPluginController extends AbstractController public function getInfo(): JsonResponse { $this->denyAccessUnlessGranted('@info_providers.create_parts'); + $this->throwIfDisabled(); $activeProviders = $this->providerRegistry->getActiveProviders(); @@ -105,6 +110,7 @@ class BrowserPluginController extends AbstractController ): JsonResponse { $this->denyAccessUnlessGranted('@info_providers.create_parts'); + $this->throwIfDisabled(); $payload = $request->getPayload(); @@ -125,4 +131,11 @@ class BrowserPluginController extends AbstractController 'redirect_url' => $redirectUrl ?? null, ]); } + + public function throwIfDisabled(): void + { + if (!$this->browserPluginSettings->enabled) { + throw HttpException::fromStatusCode(451, "Browser plugin feature is disabled by the administrator, ask him to enable it in system settings."); + } + } } diff --git a/src/Settings/InfoProviderSystem/BrowserPluginSettings.php b/src/Settings/InfoProviderSystem/BrowserPluginSettings.php new file mode 100644 index 00000000..1ad5c50b --- /dev/null +++ b/src/Settings/InfoProviderSystem/BrowserPluginSettings.php @@ -0,0 +1,40 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\InfoProviderSystem; + +use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\Metadata\EnvVarMode; +use Jbtronics\SettingsBundle\Settings\Settings; +use Jbtronics\SettingsBundle\Settings\SettingsParameter; +use Symfony\Component\Translation\TranslatableMessage as TM; + +#[Settings(name: "browser_plugin", label: new TM("settings.ips.browser_plugin"), description: new TM("settings.ips.browser_plugin.description"))] +#[SettingsIcon("fa-cloud-arrow-up")] +class BrowserPluginSettings +{ + #[SettingsParameter(label: new TM("settings.ips.lcsc.enabled"), description: new TM("settings.ips.browser_plugin.enabled.help"), + envVar: "bool:BROWSER_PLUGIN_ENABLED", envVarMode: EnvVarMode::OVERWRITE + )] + public bool $enabled = false; +} diff --git a/src/Settings/InfoProviderSystem/InfoProviderSettings.php b/src/Settings/InfoProviderSystem/InfoProviderSettings.php index 3e2a27ef..96de19cb 100644 --- a/src/Settings/InfoProviderSystem/InfoProviderSettings.php +++ b/src/Settings/InfoProviderSystem/InfoProviderSettings.php @@ -37,6 +37,9 @@ class InfoProviderSettings #[EmbeddedSettings] public ?InfoProviderGeneralSettings $general = null; + #[EmbeddedSettings] + public ?BrowserPluginSettings $browserPlugin = null; + #[EmbeddedSettings] public ?GenericWebProviderSettings $genericWebProvider = null; diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index 7a1e549a..b5fec280 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -13619,5 +13619,23 @@ Buerklin-API Authentication server: Pages recently submitted from your browser extension. Click to create a part using the captured HTML. + + + settings.ips.browser_plugin + Browser plugin + + + + + settings.ips.browser_plugin.description + The browser plugin allows to submit pages to Part-DB directly from a browser to create new parts. HTML content is submitted, so that extraction even works on DDOS protected pages, or pages requiring javascript for correct rendering. The Generic Web or AI Web extractor needs to be enabled to be useful. + + + + + settings.ips.browser_plugin.enabled.help + When enabled users with the info provider permission can submit pages to Part-DB and retrieve them later. + +