diff --git a/lnbits/core/extensions/api.py b/lnbits/core/extensions/api.py index a5f7fabe4..bbef2ac8c 100644 --- a/lnbits/core/extensions/api.py +++ b/lnbits/core/extensions/api.py @@ -108,7 +108,7 @@ def extension_api_method( ) -> Callable[[ExtensionAPI, _RequestModel], Awaitable[_ResponseModel]]: @wraps(function) async def wrapper(self: ExtensionAPI, request: _RequestModel) -> _ResponseModel: - if require_auth and not self.user_id: + if require_auth and not self.has_authenticated_context(): raise PermissionError( f"Extension API method '{method_id}' requires authentication." ) @@ -128,20 +128,32 @@ class ExtensionAPI: permissions: Iterable[Any], *, user_id: str | None = None, - wallet_id: str | None = None, + context: str = "user", ) -> None: self.extension_id = extension_id self.permissions, self.permission_policies = self._permission_data(permissions) self.user_id = user_id - self.wallet_id = wallet_id + self.context = context self._uuid = secrets.token_urlsafe(12).replace("-", "_") + def __repr__(self) -> str: + return ( + "ExtensionAPI(" + f"extension_id={self.extension_id!r}, " + f"context={self.context!r}, " + f"_uuid={self._uuid!r}" + ")" + ) + def require_permission(self, permission: str | None) -> None: if permission and permission not in self.permissions: raise PermissionError( f"Extension '{self.extension_id}' is missing permission '{permission}'." ) + def has_authenticated_context(self) -> bool: + return bool(self.user_id) or self.context == "event" + @extension_api_method( method_id="storage.get", namespace="storage", diff --git a/lnbits/core/extensions/wasm.py b/lnbits/core/extensions/wasm.py index 8e50ea223..d9ba0555c 100644 --- a/lnbits/core/extensions/wasm.py +++ b/lnbits/core/extensions/wasm.py @@ -23,6 +23,7 @@ async def invoke_wasm_extension_export( payload: Mapping[str, Any] | None = None, *, user: Any | None = None, + context: str = "user", ) -> dict[str, Any]: extension = _get_registered_extension(app, ext_id) permissions = await _extension_permissions(extension) @@ -30,7 +31,9 @@ async def invoke_wasm_extension_export( extension.id, permissions, user_id=_user_id(user), + context=context, ) + print("### api", api) return await asyncio.to_thread( _invoke_wasm_extension_export_sync, diff --git a/lnbits/core/tasks.py b/lnbits/core/tasks.py index aa65ff05f..9c46ca3e8 100644 --- a/lnbits/core/tasks.py +++ b/lnbits/core/tasks.py @@ -138,6 +138,7 @@ async def dispatch_wasm_invoice_paid(app: FastAPI, payment: Any) -> None: extension.id, export_name, _wasm_invoice_paid_payload(payment), + context="event", ) except Exception as exc: logger.warning(