feat: disable ext builder option

This commit is contained in:
Vlad Stan
2025-09-25 12:08:55 +03:00
parent e4f7783900
commit f04dd1c436
7 changed files with 52 additions and 3 deletions

View File

@@ -84,6 +84,27 @@
/> />
</q-item-section> </q-item-section>
</q-item> </q-item>
<q-item tag="label" v-ripple>
<q-item-section>
<q-item-label>
<span v-text="$t('misc_disable_extensions_builder')"></span>
</q-item-label>
<q-item-label caption>
<span
v-text="$t('misc_disable_extensions_builder_label')"
></span>
</q-item-label>
</q-item-section>
<q-item-section avatar>
<q-toggle
size="md"
v-model="formData.lnbits_extensions_builder_deactivate_non_admins"
checked-icon="check"
color="green"
unchecked-icon="clear"
/>
</q-item-section>
</q-item>
<q-item tag="label" v-ripple> <q-item tag="label" v-ripple>
<q-item-section> <q-item-section>
<q-item-label> <q-item-label>

View File

@@ -54,9 +54,11 @@
v-text="$t('new_version') + ` (${updatableExtensions?.length})`" v-text="$t('new_version') + ` (${updatableExtensions?.length})`"
></span> ></span>
</q-badge> </q-badge>
{% if extension_builder_enabled %}
<q-btn flat no-caps icon="architecture" to="/extensions/builder" <q-btn flat no-caps icon="architecture" to="/extensions/builder"
><span v-text="$t('create_extension')"></span ><span v-text="$t('create_extension')"></span
></q-btn> ></q-btn>
{% endif %}
<q-btn <q-btn
v-if="g.user.admin" v-if="g.user.admin"
flat flat

View File

@@ -46,6 +46,7 @@ from lnbits.decorators import (
check_admin, check_admin,
check_user_exists, check_user_exists,
) )
from lnbits.settings import settings
from ..crud import ( from ..crud import (
create_user_extension, create_user_extension,
@@ -127,12 +128,16 @@ async def api_install_extension(data: CreateExtension):
description=""" description="""
This endpoint generates a zip file for the extension based on the provided data. This endpoint generates a zip file for the extension based on the provided data.
""", """,
dependencies=[Depends(check_user_exists)],
response_model=None,
) )
async def api_build_extension( async def api_build_extension(
data: ExtensionData, data: ExtensionData,
user: User = Depends(check_user_exists),
) -> FileResponse: ) -> FileResponse:
if settings.lnbits_extensions_builder_deactivate_non_admins and not user.admin:
raise HTTPException(
HTTPStatus.FORBIDDEN,
"Extension Builder is disabled for non admin users.",
)
stub_ext_id = "extension_builder_stub" # todo: do not hardcode, fetch from manifest stub_ext_id = "extension_builder_stub" # todo: do not hardcode, fetch from manifest
release, build_dir = await build_extension_from_data(data, stub_ext_id) release, build_dir = await build_extension_from_data(data, stub_ext_id)
@@ -212,6 +217,11 @@ async def api_preview_extension(
data: ExtensionData, data: ExtensionData,
user: User = Depends(check_user_exists), user: User = Depends(check_user_exists),
) -> SimpleStatus: ) -> SimpleStatus:
if settings.lnbits_extensions_builder_deactivate_non_admins and not user.admin:
raise HTTPException(
HTTPStatus.FORBIDDEN,
"Extension Builder is disabled for non admin users.",
)
stub_ext_id = "extension_builder_stub" stub_ext_id = "extension_builder_stub"
working_dir_name = "preview_" + sha256(user.id.encode("utf-8")).hexdigest() working_dir_name = "preview_" + sha256(user.id.encode("utf-8")).hexdigest()
await build_extension_from_data(data, stub_ext_id, working_dir_name) await build_extension_from_data(data, stub_ext_id, working_dir_name)

View File

@@ -151,6 +151,8 @@ async def extensions(request: Request, user: User = Depends(check_user_exists)):
{ {
"user": user.json(), "user": user.json(),
"extension_data": extension_data, "extension_data": extension_data,
"extension_builder_enabled": user.admin
or not settings.lnbits_extensions_builder_deactivate_non_admins,
"ajax": _is_ajax_request(request), "ajax": _is_ajax_request(request),
}, },
) )
@@ -160,6 +162,11 @@ async def extensions(request: Request, user: User = Depends(check_user_exists)):
"/extensions/builder", name="extensions builder", response_class=HTMLResponse "/extensions/builder", name="extensions builder", response_class=HTMLResponse
) )
async def extensions_builder(request: Request, user: User = Depends(check_user_exists)): async def extensions_builder(request: Request, user: User = Depends(check_user_exists)):
if settings.lnbits_extensions_builder_deactivate_non_admins and not user.admin:
raise HTTPException(
HTTPStatus.FORBIDDEN,
"Extension Builder is disabled for non admin users.",
)
return template_renderer().TemplateResponse( return template_renderer().TemplateResponse(
request, request,
"core/extensions_builder.html", "core/extensions_builder.html",
@@ -181,6 +188,11 @@ async def extensions_builder_preview(
page_name: str | None = None, page_name: str | None = None,
user: User = Depends(check_user_exists), user: User = Depends(check_user_exists),
): ):
if settings.lnbits_extensions_builder_deactivate_non_admins and not user.admin:
raise HTTPException(
HTTPStatus.FORBIDDEN,
"Extension Builder is disabled for non admin users.",
)
working_dir_name = "preview_" + sha256(user.id.encode("utf-8")).hexdigest() working_dir_name = "preview_" + sha256(user.id.encode("utf-8")).hexdigest()
html_file_name = "index.html" html_file_name = "index.html"
if page_name == "public_page": if page_name == "public_page":

View File

@@ -51,6 +51,7 @@ class ExtensionsSettings(LNbitsSettings):
lnbits_admin_extensions: list[str] = Field(default=[]) lnbits_admin_extensions: list[str] = Field(default=[])
lnbits_user_default_extensions: list[str] = Field(default=[]) lnbits_user_default_extensions: list[str] = Field(default=[])
lnbits_extensions_deactivate_all: bool = Field(default=False) lnbits_extensions_deactivate_all: bool = Field(default=False)
lnbits_extensions_builder_deactivate_non_admins: bool = Field(default=False)
lnbits_extensions_manifests: list[str] = Field( lnbits_extensions_manifests: list[str] = Field(
default=[ default=[
"https://raw.githubusercontent.com/lnbits/lnbits-extensions/main/extensions.json" "https://raw.githubusercontent.com/lnbits/lnbits-extensions/main/extensions.json"

File diff suppressed because one or more lines are too long

View File

@@ -497,6 +497,9 @@ window.localisation.en = {
miscellanous: 'Miscellanous', miscellanous: 'Miscellanous',
misc_disable_extensions: 'Disable Extensions', misc_disable_extensions: 'Disable Extensions',
misc_disable_extensions_label: 'Disable all extensions', misc_disable_extensions_label: 'Disable all extensions',
misc_disable_extensions_builder: 'Disable Extensions Builder',
misc_disable_extensions_builder_label:
'Disable Extensions Builder for non admin users.',
misc_hide_api: 'Hide API', misc_hide_api: 'Hide API',
misc_hide_api_label: 'Hides wallet api, extensions can choose to honor', misc_hide_api_label: 'Hides wallet api, extensions can choose to honor',
wallets_management: 'Wallets Management', wallets_management: 'Wallets Management',