fix: python versions were defined incorrectly and remove 3.9 (#3006)

* chore: update requirements to python3.10
* chore: format RUF007 rule for py310
* wrongly specified python version
python3.13 there is a greenlet build error
This commit is contained in:
dni ⚡
2025-03-03 12:53:30 +01:00
committed by GitHub
parent 4ce14e2312
commit c5964436b5
16 changed files with 351 additions and 382 deletions
+84 -88
View File
@@ -11,7 +11,7 @@ from hashlib import sha256
from os import path
from pathlib import Path
from time import gmtime, strftime, time
from typing import Any, Optional
from typing import Any
import httpx
from loguru import logger
@@ -77,7 +77,7 @@ class RedirectPath(BaseModel):
other.from_path, list(other.header_filters.items())
) or other.redirect_matches(self.from_path, list(self.header_filters.items()))
def find_in_conflict(self, others: list[RedirectPath]) -> Optional[RedirectPath]:
def find_in_conflict(self, others: list[RedirectPath]) -> RedirectPath | None:
for other in others:
if self.in_conflict(other):
return other
@@ -153,7 +153,7 @@ class InstalledExtensionsSettings(LNbitsSettings):
def find_extension_redirect(
self, path: str, req_headers: list[tuple[bytes, bytes]]
) -> Optional[RedirectPath]:
) -> RedirectPath | None:
headers = [(k.decode(), v.decode()) for k, v in req_headers]
return next(
(
@@ -167,8 +167,8 @@ class InstalledExtensionsSettings(LNbitsSettings):
def activate_extension_paths(
self,
ext_id: str,
upgrade_hash: Optional[str] = None,
ext_redirects: Optional[list[dict]] = None,
upgrade_hash: str | None = None,
ext_redirects: list[dict] | None = None,
):
self.lnbits_deactivated_extensions.discard(ext_id)
@@ -231,12 +231,12 @@ class ExchangeHistorySettings(LNbitsSettings):
class ThemesSettings(LNbitsSettings):
lnbits_site_title: str = Field(default="LNbits")
lnbits_site_tagline: str = Field(default="free and open-source lightning wallet")
lnbits_site_description: Optional[str] = Field(
lnbits_site_description: str | None = Field(
default="The world's most powerful suite of bitcoin tools."
)
lnbits_show_home_page_elements: bool = Field(default=True)
lnbits_default_wallet_name: str = Field(default="LNbits wallet")
lnbits_custom_badge: Optional[str] = Field(default=None)
lnbits_custom_badge: str | None = Field(default=None)
lnbits_custom_badge_color: str = Field(default="warning")
lnbits_theme_options: list[str] = Field(
default=[
@@ -251,17 +251,15 @@ class ThemesSettings(LNbitsSettings):
"bitcoin",
]
)
lnbits_custom_logo: Optional[str] = Field(default=None)
lnbits_custom_image: Optional[str] = Field(
default="/static/images/logos/lnbits.svg"
)
lnbits_custom_logo: str | None = Field(default=None)
lnbits_custom_image: str | None = Field(default="/static/images/logos/lnbits.svg")
lnbits_ad_space_title: str = Field(default="Supported by")
lnbits_ad_space: str = Field(
default="https://shop.lnbits.com/;/static/images/bitcoin-shop-banner.png;/static/images/bitcoin-shop-banner.png,https://affil.trezor.io/aff_c?offer_id=169&aff_id=33845;/static/images/bitcoin-hardware-wallet.png;/static/images/bitcoin-hardware-wallet.png,https://opensats.org/;/static/images/open-sats.png;/static/images/open-sats.png"
) # sneaky sneaky
lnbits_ad_space_enabled: bool = Field(default=False)
lnbits_allowed_currencies: list[str] = Field(default=[])
lnbits_default_accounting_currency: Optional[str] = Field(default=None)
lnbits_default_accounting_currency: str | None = Field(default=None)
lnbits_qr_logo: str = Field(default="/static/images/logos/lnbits.png")
lnbits_default_reaction: str = Field(default="confettiBothSides")
lnbits_default_theme: str = Field(default="salvador")
@@ -282,7 +280,7 @@ class FeeSettings(LNbitsSettings):
lnbits_service_fee: float = Field(default=0)
lnbits_service_fee_ignore_internal: bool = Field(default=True)
lnbits_service_fee_max: int = Field(default=0)
lnbits_service_fee_wallet: Optional[str] = Field(default=None)
lnbits_service_fee_wallet: str | None = Field(default=None)
# WARN: this same value must be used for balance check and passed to
# funding_source.pay_invoice(), it may cause a vulnerability if the values differ
@@ -413,121 +411,121 @@ class FakeWalletFundingSource(LNbitsSettings):
class LNbitsFundingSource(LNbitsSettings):
lnbits_endpoint: str = Field(default="https://demo.lnbits.com")
lnbits_key: Optional[str] = Field(default=None)
lnbits_admin_key: Optional[str] = Field(default=None)
lnbits_invoice_key: Optional[str] = Field(default=None)
lnbits_key: str | None = Field(default=None)
lnbits_admin_key: str | None = Field(default=None)
lnbits_invoice_key: str | None = Field(default=None)
class ClicheFundingSource(LNbitsSettings):
cliche_endpoint: Optional[str] = Field(default=None)
cliche_endpoint: str | None = Field(default=None)
class CoreLightningFundingSource(LNbitsSettings):
corelightning_rpc: Optional[str] = Field(default=None)
corelightning_rpc: str | None = Field(default=None)
corelightning_pay_command: str = Field(default="pay")
clightning_rpc: Optional[str] = Field(default=None)
clightning_rpc: str | None = Field(default=None)
class CoreLightningRestFundingSource(LNbitsSettings):
corelightning_rest_url: Optional[str] = Field(default=None)
corelightning_rest_macaroon: Optional[str] = Field(default=None)
corelightning_rest_cert: Optional[str] = Field(default=None)
corelightning_rest_url: str | None = Field(default=None)
corelightning_rest_macaroon: str | None = Field(default=None)
corelightning_rest_cert: str | None = Field(default=None)
class EclairFundingSource(LNbitsSettings):
eclair_url: Optional[str] = Field(default=None)
eclair_pass: Optional[str] = Field(default=None)
eclair_url: str | None = Field(default=None)
eclair_pass: str | None = Field(default=None)
class LndRestFundingSource(LNbitsSettings):
lnd_rest_endpoint: Optional[str] = Field(default=None)
lnd_rest_cert: Optional[str] = Field(default=None)
lnd_rest_macaroon: Optional[str] = Field(default=None)
lnd_rest_macaroon_encrypted: Optional[str] = Field(default=None)
lnd_rest_endpoint: str | None = Field(default=None)
lnd_rest_cert: str | None = Field(default=None)
lnd_rest_macaroon: str | None = Field(default=None)
lnd_rest_macaroon_encrypted: str | None = Field(default=None)
lnd_rest_route_hints: bool = Field(default=True)
lnd_rest_allow_self_payment: bool = Field(default=False)
lnd_cert: Optional[str] = Field(default=None)
lnd_admin_macaroon: Optional[str] = Field(default=None)
lnd_invoice_macaroon: Optional[str] = Field(default=None)
lnd_rest_admin_macaroon: Optional[str] = Field(default=None)
lnd_rest_invoice_macaroon: Optional[str] = Field(default=None)
lnd_cert: str | None = Field(default=None)
lnd_admin_macaroon: str | None = Field(default=None)
lnd_invoice_macaroon: str | None = Field(default=None)
lnd_rest_admin_macaroon: str | None = Field(default=None)
lnd_rest_invoice_macaroon: str | None = Field(default=None)
class LndGrpcFundingSource(LNbitsSettings):
lnd_grpc_endpoint: Optional[str] = Field(default=None)
lnd_grpc_cert: Optional[str] = Field(default=None)
lnd_grpc_port: Optional[int] = Field(default=None)
lnd_grpc_admin_macaroon: Optional[str] = Field(default=None)
lnd_grpc_invoice_macaroon: Optional[str] = Field(default=None)
lnd_grpc_macaroon: Optional[str] = Field(default=None)
lnd_grpc_macaroon_encrypted: Optional[str] = Field(default=None)
lnd_grpc_endpoint: str | None = Field(default=None)
lnd_grpc_cert: str | None = Field(default=None)
lnd_grpc_port: int | None = Field(default=None)
lnd_grpc_admin_macaroon: str | None = Field(default=None)
lnd_grpc_invoice_macaroon: str | None = Field(default=None)
lnd_grpc_macaroon: str | None = Field(default=None)
lnd_grpc_macaroon_encrypted: str | None = Field(default=None)
class LnPayFundingSource(LNbitsSettings):
lnpay_api_endpoint: Optional[str] = Field(default=None)
lnpay_api_key: Optional[str] = Field(default=None)
lnpay_wallet_key: Optional[str] = Field(default=None)
lnpay_admin_key: Optional[str] = Field(default=None)
lnpay_api_endpoint: str | None = Field(default=None)
lnpay_api_key: str | None = Field(default=None)
lnpay_wallet_key: str | None = Field(default=None)
lnpay_admin_key: str | None = Field(default=None)
class BlinkFundingSource(LNbitsSettings):
blink_api_endpoint: Optional[str] = Field(default="https://api.blink.sv/graphql")
blink_ws_endpoint: Optional[str] = Field(default="wss://ws.blink.sv/graphql")
blink_token: Optional[str] = Field(default=None)
blink_api_endpoint: str | None = Field(default="https://api.blink.sv/graphql")
blink_ws_endpoint: str | None = Field(default="wss://ws.blink.sv/graphql")
blink_token: str | None = Field(default=None)
class ZBDFundingSource(LNbitsSettings):
zbd_api_endpoint: Optional[str] = Field(default="https://api.zebedee.io/v0/")
zbd_api_key: Optional[str] = Field(default=None)
zbd_api_endpoint: str | None = Field(default="https://api.zebedee.io/v0/")
zbd_api_key: str | None = Field(default=None)
class PhoenixdFundingSource(LNbitsSettings):
phoenixd_api_endpoint: Optional[str] = Field(default="http://localhost:9740/")
phoenixd_api_password: Optional[str] = Field(default=None)
phoenixd_api_endpoint: str | None = Field(default="http://localhost:9740/")
phoenixd_api_password: str | None = Field(default=None)
class AlbyFundingSource(LNbitsSettings):
alby_api_endpoint: Optional[str] = Field(default="https://api.getalby.com/")
alby_access_token: Optional[str] = Field(default=None)
alby_api_endpoint: str | None = Field(default="https://api.getalby.com/")
alby_access_token: str | None = Field(default=None)
class OpenNodeFundingSource(LNbitsSettings):
opennode_api_endpoint: Optional[str] = Field(default=None)
opennode_key: Optional[str] = Field(default=None)
opennode_admin_key: Optional[str] = Field(default=None)
opennode_invoice_key: Optional[str] = Field(default=None)
opennode_api_endpoint: str | None = Field(default=None)
opennode_key: str | None = Field(default=None)
opennode_admin_key: str | None = Field(default=None)
opennode_invoice_key: str | None = Field(default=None)
class SparkFundingSource(LNbitsSettings):
spark_url: Optional[str] = Field(default=None)
spark_token: Optional[str] = Field(default=None)
spark_url: str | None = Field(default=None)
spark_token: str | None = Field(default=None)
class LnTipsFundingSource(LNbitsSettings):
lntips_api_endpoint: Optional[str] = Field(default=None)
lntips_api_key: Optional[str] = Field(default=None)
lntips_admin_key: Optional[str] = Field(default=None)
lntips_invoice_key: Optional[str] = Field(default=None)
lntips_api_endpoint: str | None = Field(default=None)
lntips_api_key: str | None = Field(default=None)
lntips_admin_key: str | None = Field(default=None)
lntips_invoice_key: str | None = Field(default=None)
class NWCFundingSource(LNbitsSettings):
nwc_pairing_url: Optional[str] = Field(default=None)
nwc_pairing_url: str | None = Field(default=None)
class BreezSdkFundingSource(LNbitsSettings):
breez_api_key: Optional[str] = Field(default=None)
breez_greenlight_seed: Optional[str] = Field(default=None)
breez_greenlight_invite_code: Optional[str] = Field(default=None)
breez_greenlight_device_key: Optional[str] = Field(default=None)
breez_greenlight_device_cert: Optional[str] = Field(default=None)
breez_api_key: str | None = Field(default=None)
breez_greenlight_seed: str | None = Field(default=None)
breez_greenlight_invite_code: str | None = Field(default=None)
breez_greenlight_device_key: str | None = Field(default=None)
breez_greenlight_device_cert: str | None = Field(default=None)
breez_use_trampoline: bool = Field(default=True)
class BoltzFundingSource(LNbitsSettings):
boltz_client_endpoint: Optional[str] = Field(default="127.0.0.1:9002")
boltz_client_macaroon: Optional[str] = Field(default=None)
boltz_client_wallet: Optional[str] = Field(default="lnbits")
boltz_client_cert: Optional[str] = Field(default=None)
boltz_client_endpoint: str | None = Field(default="127.0.0.1:9002")
boltz_client_macaroon: str | None = Field(default=None)
boltz_client_wallet: str | None = Field(default="lnbits")
boltz_client_cert: str | None = Field(default=None)
class LightningSettings(LNbitsSettings):
@@ -562,8 +560,8 @@ class FundingSourcesSettings(
class WebPushSettings(LNbitsSettings):
lnbits_webpush_pubkey: Optional[str] = Field(default=None)
lnbits_webpush_privkey: Optional[str] = Field(default=None)
lnbits_webpush_pubkey: str | None = Field(default=None)
lnbits_webpush_privkey: str | None = Field(default=None)
class NodeUISettings(LNbitsSettings):
@@ -669,9 +667,9 @@ class AuditSettings(LNbitsSettings):
def audit_http_request(
self,
http_method: Optional[str] = None,
path: Optional[str] = None,
http_response_code: Optional[str] = None,
http_method: str | None = None,
path: str | None = None,
http_response_code: str | None = None,
) -> bool:
if not self.lnbits_audit_enabled:
return False
@@ -689,7 +687,7 @@ class AuditSettings(LNbitsSettings):
return True
def _is_http_request_path_auditable(self, path: Optional[str]):
def _is_http_request_path_auditable(self, path: str | None):
if len(self.lnbits_audit_exclude_paths) != 0 and path:
for exclude_path in self.lnbits_audit_exclude_paths:
if _re_fullmatch_safe(exclude_path, path):
@@ -706,9 +704,7 @@ class AuditSettings(LNbitsSettings):
return False
def _is_http_response_code_auditable(
self, http_response_code: Optional[str]
) -> bool:
def _is_http_response_code_auditable(self, http_response_code: str | None) -> bool:
if not http_response_code:
# No response code means only request filters should apply
return True
@@ -805,9 +801,9 @@ class EnvSettings(LNbitsSettings):
class SaaSSettings(LNbitsSettings):
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)
lnbits_saas_callback: str | None = Field(default=None)
lnbits_saas_secret: str | None = Field(default=None)
lnbits_saas_instance_id: str | None = Field(default=None)
class PersistenceSettings(LNbitsSettings):
@@ -905,7 +901,7 @@ class Settings(EditableSettings, ReadOnlySettings, TransientSettings, BaseSettin
or user_id == self.super_user
)
def is_super_user(self, user_id: Optional[str] = None) -> bool:
def is_super_user(self, user_id: str | None = None) -> bool:
return user_id == self.super_user
def is_admin_user(self, user_id: str) -> bool:
@@ -924,12 +920,12 @@ class SuperSettings(EditableSettings):
class AdminSettings(EditableSettings):
is_super_user: bool
lnbits_allowed_funding_sources: Optional[list[str]]
lnbits_allowed_funding_sources: list[str] | None
class SettingsField(BaseModel):
id: str
value: Optional[Any]
value: Any | None
tag: str = "core"