diff --git a/lnbits/core/crud.py b/lnbits/core/crud.py index 9e1e8fd6..a51c958f 100644 --- a/lnbits/core/crud.py +++ b/lnbits/core/crud.py @@ -8,18 +8,16 @@ from loguru import logger from lnbits import bolt11 from lnbits.db import COCKROACH, POSTGRES, Connection -from lnbits.settings import readonly_variables, settings +from lnbits.settings import ( + AdminSettings, + EditableSetings, + SuperSettings, + readonly_variables, + settings, +) from . import db -from .models import ( - AdminSettings, - BalanceCheck, - Payment, - SuperSettings, - UpdateSettings, - User, - Wallet, -) +from .models import BalanceCheck, Payment, User, Wallet # accounts # -------- @@ -603,7 +601,7 @@ async def delete_admin_settings(): await db.execute("DELETE FROM settings") -async def update_admin_settings(data: UpdateSettings): +async def update_admin_settings(data: EditableSetings): q, values = get_q_and_values(data) await db.execute(f"UPDATE settings SET {q}", (values,)) # type: ignore diff --git a/lnbits/core/models.py b/lnbits/core/models.py index 5ec78ca4..c7d8e598 100644 --- a/lnbits/core/models.py +++ b/lnbits/core/models.py @@ -199,91 +199,3 @@ class BalanceCheck(BaseModel): @classmethod def from_row(cls, row: Row): return cls(wallet=row["wallet"], service=row["service"], url=row["url"]) - - -# admin -# -------- -class UpdateSettings(BaseModel, extra=Extra.forbid): - @validator( - "lnbits_admin_users", - "lnbits_allowed_users", - "lnbits_theme_options", - "lnbits_disabled_extensions", - "lnbits_admin_extensions", - pre=True, - ) - def validate(cls, val): - if type(val) == str: - val = val.split(",") if val else [] - return val - - lnbits_backend_wallet_class: str = Query(None) - lnbits_admin_users: List[str] = Query(None) - lnbits_allowed_users: List[str] = Query(None) - lnbits_admin_extensions: List[str] = Query(None) - lnbits_disabled_extensions: List[str] = Query(None) - lnbits_theme_options: List[str] = Query(None) - lnbits_force_https: bool = Query(None) - lnbits_reserve_fee_min: int = Query(None, ge=0) - lnbits_reserve_fee_percent: float = Query(None, ge=0) - lnbits_service_fee: float = Query(None, ge=0) - lnbits_hide_api: bool = Query(None) - lnbits_site_title: str = Query(None) - lnbits_site_tagline: str = Query(None) - lnbits_site_description: str = Query(None) - lnbits_default_wallet_name: str = Query(None) - lnbits_denomination: str = Query(None) - lnbits_custom_logo: str = Query(None) - lnbits_ad_space: str = Query(None) - lnbits_ad_space_title: str = Query(None) - lnbits_ad_space_enabled: bool = Query(None) - - # funding sources - fake_wallet_secret: str = Query(None) - lnbits_endpoint: str = Query(None) - lnbits_key: str = Query(None) - cliche_endpoint: str = Query(None) - corelightning_rpc: str = Query(None) - eclair_url: str = Query(None) - eclair_pass: str = Query(None) - lnd_rest_endpoint: str = Query(None) - lnd_rest_cert: str = Query(None) - lnd_rest_macaroon: str = Query(None) - lnd_rest_macaroon_encrypted: str = Query(None) - lnd_cert: str = Query(None) - lnd_admin_macaroon: str = Query(None) - lnd_invoice_macaroon: str = Query(None) - lnd_grpc_endpoint: str = Query(None) - lnd_grpc_cert: str = Query(None) - lnd_grpc_port: int = Query(None, ge=0) - lnd_grpc_admin_macaroon: str = Query(None) - lnd_grpc_invoice_macaroon: str = Query(None) - lnd_grpc_macaroon: str = Query(None) - lnd_grpc_macaroon_encrypted: str = Query(None) - lnpay_api_endpoint: str = Query(None) - lnpay_api_key: str = Query(None) - lnpay_wallet_key: str = Query(None) - lntxbot_api_endpoint: str = Query(None) - lntxbot_key: str = Query(None) - opennode_api_endpoint: str = Query(None) - opennode_key: str = Query(None) - spark_url: str = Query(None) - spark_token: str = Query(None) - lntips_api_endpoint: str = Query(None) - lntips_api_key: str = Query(None) - lntips_admin_key: str = Query(None) - lntips_invoice_key: str = Query(None) - - boltz_mempool_space_url: str = Query(None) - boltz_mempool_space_url_ws: str = Query(None) - boltz_network: str = Query(None) - boltz_url: str = Query(None) - - -class SuperSettings(UpdateSettings): - super_user: str - - -class AdminSettings(UpdateSettings): - super_user: bool - lnbits_allowed_funding_sources: Optional[List[str]] diff --git a/lnbits/core/views/admin_api.py b/lnbits/core/views/admin_api.py index cb65be40..f2489fa0 100644 --- a/lnbits/core/views/admin_api.py +++ b/lnbits/core/views/admin_api.py @@ -6,10 +6,11 @@ from fastapi.params import Depends from starlette.exceptions import HTTPException from lnbits.core.crud import get_wallet -from lnbits.core.models import AdminSettings, UpdateSettings, User +from lnbits.core.models import User from lnbits.core.services import update_wallet_balance from lnbits.decorators import check_admin from lnbits.server import server_restart +from lnbits.settings import AdminSettings, EditableSetings from .. import core_app from ..crud import delete_admin_settings, get_admin_settings, update_admin_settings @@ -58,7 +59,7 @@ async def api_topup_balance( status_code=HTTPStatus.OK, dependencies=[Depends(check_admin)], ) -async def api_update_settings(data: UpdateSettings): +async def api_update_settings(data: EditableSetings): await update_admin_settings(data) return {"status": "Success"} diff --git a/lnbits/settings.py b/lnbits/settings.py index ff4b5a64..1c829734 100644 --- a/lnbits/settings.py +++ b/lnbits/settings.py @@ -9,8 +9,6 @@ import httpx from loguru import logger from pydantic import BaseSettings, Field, validator -# from .core.crud import create_admin_settings, get_super_settings - def list_parse_fallback(v): try: @@ -40,24 +38,7 @@ readonly_variables = [ ] -class Settings(BaseSettings): - - lnbits_admin_ui: bool = Field(default=False) - - # .env - debug: bool = Field(default=False) - host: str = Field(default="127.0.0.1") - port: int = Field(default=5000) - forwarded_allow_ips: str = Field(default="*") - lnbits_path: str = Field(default=".") - lnbits_commit: str = Field(default="unknown") - super_user: str = Field(default="") - - # saas - lnbits_saas_callback: Optional[str] = Field(default=None) - lnbits_saas_secret: Optional[str] = Field(default=None) - lnbits_saas_instance_id: Optional[str] = Field(default=None) - +class EditableSetings(BaseSettings): # users lnbits_admin_users: List[str] = Field(default=[]) lnbits_allowed_users: List[str] = Field(default=[]) @@ -80,8 +61,6 @@ class Settings(BaseSettings): lnbits_ad_space_enabled: bool = Field(default=False) # ops - lnbits_data_folder: str = Field(default="./data") - lnbits_database_url: str = Field(default=None) lnbits_force_https: bool = Field(default=False) lnbits_reserve_fee_min: int = Field(default=2000) lnbits_reserve_fee_percent: float = Field(default=1.0) @@ -91,20 +70,6 @@ class Settings(BaseSettings): # funding sources lnbits_backend_wallet_class: str = Field(default="VoidWallet") - lnbits_allowed_funding_sources: List[str] = Field( - default=[ - "VoidWallet", - "FakeWallet", - "CLightningWallet", - "LndRestWallet", - "LndWallet", - "LntxbotWallet", - "LNPayWallet", - "LNbitsWallet", - "OpenNodeWallet", - "LnTipsWallet", - ] - ) fake_wallet_secret: str = Field(default="ToTheMoon1") lnbits_endpoint: str = Field(default="https://legend.lnbits.com") lnbits_key: Optional[str] = Field(default=None) @@ -146,13 +111,36 @@ class Settings(BaseSettings): boltz_mempool_space_url: str = Field(default="https://mempool.space") boltz_mempool_space_url_ws: str = Field(default="wss://mempool.space") + +class ReadOnlySettings(BaseSettings): + lnbits_admin_ui: bool = Field(default=False) + + # .env + debug: bool = Field(default=False) + host: str = Field(default="127.0.0.1") + port: int = Field(default=5000) + forwarded_allow_ips: str = Field(default="*") + lnbits_path: str = Field(default=".") + lnbits_commit: str = Field(default="unknown") + + # saas + lnbits_saas_callback: Optional[str] = Field(default=None) + lnbits_saas_secret: Optional[str] = Field(default=None) + lnbits_saas_instance_id: Optional[str] = Field(default=None) + + # ops + lnbits_data_folder: str = Field(default="./data") + lnbits_database_url: str = Field(default=None) + + +class Settings(EditableSetings, ReadOnlySettings): @validator( "lnbits_admin_users", "lnbits_allowed_users", "lnbits_theme_options", "lnbits_admin_extensions", "lnbits_disabled_extensions", - "lnbits_allowed_funding_sources", + "lnbits_allowed_funding_sources", # ???? pre=True, ) def validate(cls, val): @@ -172,6 +160,28 @@ class Settings(BaseSettings): json_loads = list_parse_fallback +class SuperSettings(EditableSetings): + super_user: str + + +class AdminSettings(EditableSetings): + super_user: bool + lnbits_allowed_funding_sources: List[str] = Field( + default=[ + "VoidWallet", + "FakeWallet", + "CLightningWallet", + "LndRestWallet", + "LndWallet", + "LntxbotWallet", + "LNPayWallet", + "LNbitsWallet", + "OpenNodeWallet", + "LnTipsWallet", + ] + ) + + settings = Settings() settings.lnbits_path = str(path.dirname(path.realpath(__file__)))