Merge branch 'main' into diagon-alley

This commit is contained in:
Tiago Vasconcelos 2022-12-19 15:56:17 +00:00
commit 8fdebc2a98
5 changed files with 39 additions and 38 deletions

View file

@ -6,7 +6,7 @@ from uuid import uuid4
from lnbits import bolt11 from lnbits import bolt11
from lnbits.db import COCKROACH, POSTGRES, Connection from lnbits.db import COCKROACH, POSTGRES, Connection
from lnbits.settings import AdminSettings, EditableSetings, SuperSettings, settings from lnbits.settings import AdminSettings, EditableSettings, SuperSettings, settings
from . import db from . import db
from .models import BalanceCheck, Payment, User, Wallet from .models import BalanceCheck, Payment, User, Wallet
@ -579,7 +579,7 @@ async def delete_admin_settings():
await db.execute("DELETE FROM settings") await db.execute("DELETE FROM settings")
async def update_admin_settings(data: EditableSetings): async def update_admin_settings(data: EditableSettings):
await db.execute(f"UPDATE settings SET editable_settings = ?", (json.dumps(data),)) await db.execute(f"UPDATE settings SET editable_settings = ?", (json.dumps(data),))

View file

@ -23,7 +23,7 @@ from lnbits.helpers import url_for, urlsafe_short_hash
from lnbits.requestvars import g from lnbits.requestvars import g
from lnbits.settings import ( from lnbits.settings import (
FAKE_WALLET, FAKE_WALLET,
EditableSetings, EditableSettings,
get_wallet_class, get_wallet_class,
readonly_variables, readonly_variables,
send_admin_user_to_saas, send_admin_user_to_saas,
@ -474,7 +474,7 @@ async def init_admin_settings(super_user: str = None):
if not account.wallets or len(account.wallets) == 0: if not account.wallets or len(account.wallets) == 0:
await create_wallet(user_id=account.id) await create_wallet(user_id=account.id)
editable_settings = EditableSetings.from_dict(settings.dict()) editable_settings = EditableSettings.from_dict(settings.dict())
return await create_admin_settings(account.id, editable_settings.dict()) return await create_admin_settings(account.id, editable_settings.dict())

View file

@ -9,7 +9,7 @@ from lnbits.core.models import User
from lnbits.core.services import update_cached_settings, update_wallet_balance from lnbits.core.services import update_cached_settings, update_wallet_balance
from lnbits.decorators import check_admin, check_super_user from lnbits.decorators import check_admin, check_super_user
from lnbits.server import server_restart from lnbits.server import server_restart
from lnbits.settings import AdminSettings, EditableSetings from lnbits.settings import AdminSettings, EditableSettings
from .. import core_app from .. import core_app
from ..crud import delete_admin_settings, get_admin_settings, update_admin_settings from ..crud import delete_admin_settings, get_admin_settings, update_admin_settings
@ -28,7 +28,7 @@ async def api_get_settings(
status_code=HTTPStatus.OK, status_code=HTTPStatus.OK,
dependencies=[Depends(check_admin)], dependencies=[Depends(check_admin)],
) )
async def api_update_settings(data: EditableSetings): async def api_update_settings(data: EditableSettings):
await update_admin_settings(data) await update_admin_settings(data)
update_cached_settings(dict(data)) update_cached_settings(dict(data))
return {"status": "Success"} return {"status": "Success"}

View file

@ -8,7 +8,7 @@ from starlette.requests import Request
from starlette.responses import HTMLResponse from starlette.responses import HTMLResponse
from lnbits.core.models import User from lnbits.core.models import User
from lnbits.decorators import check_admin from lnbits.decorators import check_user_exists
from lnbits.extensions.satspay.helpers import public_charge from lnbits.extensions.satspay.helpers import public_charge
from . import satspay_ext, satspay_renderer from . import satspay_ext, satspay_renderer
@ -18,7 +18,7 @@ templates = Jinja2Templates(directory="templates")
@satspay_ext.get("/", response_class=HTMLResponse) @satspay_ext.get("/", response_class=HTMLResponse)
async def index(request: Request, user: User = Depends(check_admin)): async def index(request: Request, user: User = Depends(check_user_exists)):
return satspay_renderer().TemplateResponse( return satspay_renderer().TemplateResponse(
"satspay/index.html", "satspay/index.html",
{"request": request, "user": user.dict(), "admin": user.admin}, {"request": request, "user": user.dict(), "admin": user.admin},

View file

@ -22,7 +22,7 @@ def list_parse_fallback(v):
return [] return []
class LNbitsSetings(BaseSettings): class LNbitsSettings(BaseSettings):
def validate(cls, val): def validate(cls, val):
if type(val) == str: if type(val) == str:
val = val.split(",") if val else [] val = val.split(",") if val else []
@ -35,14 +35,14 @@ class LNbitsSetings(BaseSettings):
json_loads = list_parse_fallback json_loads = list_parse_fallback
class UsersSetings(LNbitsSetings): class UsersSettings(LNbitsSettings):
lnbits_admin_users: List[str] = Field(default=[]) lnbits_admin_users: List[str] = Field(default=[])
lnbits_allowed_users: List[str] = Field(default=[]) lnbits_allowed_users: List[str] = Field(default=[])
lnbits_admin_extensions: List[str] = Field(default=[]) lnbits_admin_extensions: List[str] = Field(default=[])
lnbits_disabled_extensions: List[str] = Field(default=[]) lnbits_disabled_extensions: List[str] = Field(default=[])
class ThemesSetings(LNbitsSetings): class ThemesSettings(LNbitsSettings):
lnbits_site_title: str = Field(default="LNbits") lnbits_site_title: str = Field(default="LNbits")
lnbits_site_tagline: str = Field(default="free and open-source lightning wallet") lnbits_site_tagline: str = Field(default="free and open-source lightning wallet")
lnbits_site_description: str = Field(default=None) lnbits_site_description: str = Field(default=None)
@ -58,7 +58,7 @@ class ThemesSetings(LNbitsSetings):
lnbits_ad_space_enabled: bool = Field(default=False) lnbits_ad_space_enabled: bool = Field(default=False)
class OpsSetings(LNbitsSetings): class OpsSettings(LNbitsSettings):
lnbits_force_https: bool = Field(default=False) lnbits_force_https: bool = Field(default=False)
lnbits_reserve_fee_min: int = Field(default=2000) lnbits_reserve_fee_min: int = Field(default=2000)
lnbits_reserve_fee_percent: float = Field(default=1.0) lnbits_reserve_fee_percent: float = Field(default=1.0)
@ -67,29 +67,30 @@ class OpsSetings(LNbitsSetings):
lnbits_denomination: str = Field(default="sats") lnbits_denomination: str = Field(default="sats")
class FakeWalletFundingSource(LNbitsSetings): class FakeWalletFundingSource(LNbitsSettings):
fake_wallet_secret: str = Field(default="ToTheMoon1") fake_wallet_secret: str = Field(default="ToTheMoon1")
class LNbitsFundingSource(LNbitsSetings): class LNbitsFundingSource(LNbitsSettings):
lnbits_endpoint: str = Field(default="https://legend.lnbits.com") lnbits_endpoint: str = Field(default="https://legend.lnbits.com")
lnbits_key: Optional[str] = Field(default=None) lnbits_key: Optional[str] = Field(default=None)
class ClicheFundingSource(LNbitsSetings): class ClicheFundingSource(LNbitsSettings):
cliche_endpoint: Optional[str] = Field(default=None) cliche_endpoint: Optional[str] = Field(default=None)
class CoreLightningFundingSource(LNbitsSetings): class CoreLightningFundingSource(LNbitsSettings):
corelightning_rpc: Optional[str] = Field(default=None) corelightning_rpc: Optional[str] = Field(default=None)
clightning_rpc: Optional[str] = Field(default=None)
class EclairFundingSource(LNbitsSetings): class EclairFundingSource(LNbitsSettings):
eclair_url: Optional[str] = Field(default=None) eclair_url: Optional[str] = Field(default=None)
eclair_pass: Optional[str] = Field(default=None) eclair_pass: Optional[str] = Field(default=None)
class LndRestFundingSource(LNbitsSetings): class LndRestFundingSource(LNbitsSettings):
lnd_rest_endpoint: Optional[str] = Field(default=None) lnd_rest_endpoint: Optional[str] = Field(default=None)
lnd_rest_cert: Optional[str] = Field(default=None) lnd_rest_cert: Optional[str] = Field(default=None)
lnd_rest_macaroon: Optional[str] = Field(default=None) lnd_rest_macaroon: Optional[str] = Field(default=None)
@ -99,7 +100,7 @@ class LndRestFundingSource(LNbitsSetings):
lnd_invoice_macaroon: Optional[str] = Field(default=None) lnd_invoice_macaroon: Optional[str] = Field(default=None)
class LndGrpcFundingSource(LNbitsSetings): class LndGrpcFundingSource(LNbitsSettings):
lnd_grpc_endpoint: Optional[str] = Field(default=None) lnd_grpc_endpoint: Optional[str] = Field(default=None)
lnd_grpc_cert: Optional[str] = Field(default=None) lnd_grpc_cert: Optional[str] = Field(default=None)
lnd_grpc_port: Optional[int] = Field(default=None) lnd_grpc_port: Optional[int] = Field(default=None)
@ -109,28 +110,28 @@ class LndGrpcFundingSource(LNbitsSetings):
lnd_grpc_macaroon_encrypted: Optional[str] = Field(default=None) lnd_grpc_macaroon_encrypted: Optional[str] = Field(default=None)
class LnPayFundingSource(LNbitsSetings): class LnPayFundingSource(LNbitsSettings):
lnpay_api_endpoint: Optional[str] = Field(default=None) lnpay_api_endpoint: Optional[str] = Field(default=None)
lnpay_api_key: Optional[str] = Field(default=None) lnpay_api_key: Optional[str] = Field(default=None)
lnpay_wallet_key: Optional[str] = Field(default=None) lnpay_wallet_key: Optional[str] = Field(default=None)
class LnTxtBotFundingSource(LNbitsSetings): class LnTxtBotFundingSource(LNbitsSettings):
lntxbot_api_endpoint: Optional[str] = Field(default=None) lntxbot_api_endpoint: Optional[str] = Field(default=None)
lntxbot_key: Optional[str] = Field(default=None) lntxbot_key: Optional[str] = Field(default=None)
class OpenNodeFundingSource(LNbitsSetings): class OpenNodeFundingSource(LNbitsSettings):
opennode_api_endpoint: Optional[str] = Field(default=None) opennode_api_endpoint: Optional[str] = Field(default=None)
opennode_key: Optional[str] = Field(default=None) opennode_key: Optional[str] = Field(default=None)
class SparkFundingSource(LNbitsSetings): class SparkFundingSource(LNbitsSettings):
spark_url: Optional[str] = Field(default=None) spark_url: Optional[str] = Field(default=None)
spark_token: Optional[str] = Field(default=None) spark_token: Optional[str] = Field(default=None)
class LnTipsFundingSource(LNbitsSetings): class LnTipsFundingSource(LNbitsSettings):
lntips_api_endpoint: Optional[str] = Field(default=None) lntips_api_endpoint: Optional[str] = Field(default=None)
lntips_api_key: Optional[str] = Field(default=None) lntips_api_key: Optional[str] = Field(default=None)
lntips_admin_key: Optional[str] = Field(default=None) lntips_admin_key: Optional[str] = Field(default=None)
@ -138,14 +139,14 @@ class LnTipsFundingSource(LNbitsSetings):
# todo: must be extracted # todo: must be extracted
class BoltzExtensionSettings(LNbitsSetings): class BoltzExtensionSettings(LNbitsSettings):
boltz_network: str = Field(default="main") boltz_network: str = Field(default="main")
boltz_url: str = Field(default="https://boltz.exchange/api") boltz_url: str = Field(default="https://boltz.exchange/api")
boltz_mempool_space_url: str = Field(default="https://mempool.space") boltz_mempool_space_url: str = Field(default="https://mempool.space")
boltz_mempool_space_url_ws: str = Field(default="wss://mempool.space") boltz_mempool_space_url_ws: str = Field(default="wss://mempool.space")
class FundingSourcesSetings( class FundingSourcesSettings(
FakeWalletFundingSource, FakeWalletFundingSource,
LNbitsFundingSource, LNbitsFundingSource,
ClicheFundingSource, ClicheFundingSource,
@ -162,11 +163,11 @@ class FundingSourcesSetings(
lnbits_backend_wallet_class: str = Field(default="VoidWallet") lnbits_backend_wallet_class: str = Field(default="VoidWallet")
class EditableSetings( class EditableSettings(
UsersSetings, UsersSettings,
ThemesSetings, ThemesSettings,
OpsSetings, OpsSettings,
FundingSourcesSetings, FundingSourcesSettings,
BoltzExtensionSettings, BoltzExtensionSettings,
): ):
@validator( @validator(
@ -187,7 +188,7 @@ class EditableSetings(
) )
class EnvSettings(LNbitsSetings): class EnvSettings(LNbitsSettings):
debug: bool = Field(default=False) debug: bool = Field(default=False)
host: str = Field(default="127.0.0.1") host: str = Field(default="127.0.0.1")
port: int = Field(default=5000) port: int = Field(default=5000)
@ -197,18 +198,18 @@ class EnvSettings(LNbitsSetings):
super_user: str = Field(default="") super_user: str = Field(default="")
class SaaSSettings(LNbitsSetings): class SaaSSettings(LNbitsSettings):
lnbits_saas_callback: Optional[str] = Field(default=None) lnbits_saas_callback: Optional[str] = Field(default=None)
lnbits_saas_secret: Optional[str] = Field(default=None) lnbits_saas_secret: Optional[str] = Field(default=None)
lnbits_saas_instance_id: Optional[str] = Field(default=None) lnbits_saas_instance_id: Optional[str] = Field(default=None)
class PersistenceSettings(LNbitsSetings): class PersistenceSettings(LNbitsSettings):
lnbits_data_folder: str = Field(default="./data") lnbits_data_folder: str = Field(default="./data")
lnbits_database_url: str = Field(default=None) lnbits_database_url: str = Field(default=None)
class SuperUserSettings(LNbitsSetings): class SuperUserSettings(LNbitsSettings):
lnbits_allowed_funding_sources: List[str] = Field( lnbits_allowed_funding_sources: List[str] = Field(
default=[ default=[
"VoidWallet", "VoidWallet",
@ -242,18 +243,18 @@ class ReadOnlySettings(
return [f for f in inspect.signature(cls).parameters if not f.startswith("_")] return [f for f in inspect.signature(cls).parameters if not f.startswith("_")]
class Settings(EditableSetings, ReadOnlySettings): class Settings(EditableSettings, ReadOnlySettings):
@classmethod @classmethod
def from_row(cls, row: Row) -> "Settings": def from_row(cls, row: Row) -> "Settings":
data = dict(row) data = dict(row)
return cls(**data) return cls(**data)
class SuperSettings(EditableSetings): class SuperSettings(EditableSettings):
super_user: str super_user: str
class AdminSettings(EditableSetings): class AdminSettings(EditableSettings):
super_user: bool super_user: bool
lnbits_allowed_funding_sources: Optional[List[str]] lnbits_allowed_funding_sources: Optional[List[str]]