Added settings controlling if browser plugin is active or not

This commit is contained in:
Jan Böhmer 2026-05-14 21:27:44 +02:00
parent b11f4a4f9c
commit 01886e8ce5
4 changed files with 74 additions and 0 deletions

View file

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

View file

@ -0,0 +1,40 @@
<?php
/*
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
*
* Copyright (C) 2019 - 2026 Jan Böhmer (https://github.com/jbtronics)
*
* 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 <https://www.gnu.org/licenses/>.
*/
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;
}

View file

@ -37,6 +37,9 @@ class InfoProviderSettings
#[EmbeddedSettings]
public ?InfoProviderGeneralSettings $general = null;
#[EmbeddedSettings]
public ?BrowserPluginSettings $browserPlugin = null;
#[EmbeddedSettings]
public ?GenericWebProviderSettings $genericWebProvider = null;

View file

@ -13619,5 +13619,23 @@ Buerklin-API Authentication server:
<target>Pages recently submitted from your browser extension. Click to create a part using the captured HTML.</target>
</segment>
</unit>
<unit id="lVUU9s7" name="settings.ips.browser_plugin">
<segment>
<source>settings.ips.browser_plugin</source>
<target>Browser plugin</target>
</segment>
</unit>
<unit id="IrJs3fI" name="settings.ips.browser_plugin.description">
<segment>
<source>settings.ips.browser_plugin.description</source>
<target>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.</target>
</segment>
</unit>
<unit id="_8UrMCB" name="settings.ips.browser_plugin.enabled.help">
<segment>
<source>settings.ips.browser_plugin.enabled.help</source>
<target>When enabled users with the info provider permission can submit pages to Part-DB and retrieve them later.</target>
</segment>
</unit>
</file>
</xliff>