From 9bace16a45123a203090b648230e428a25453d6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?dni=20=E2=9A=A1?= Date: Wed, 4 Jan 2023 18:27:39 +0100 Subject: [PATCH] refactoring some stuff --- lnbits/extensions/withdraw/crud.py | 9 ++++++++ lnbits/extensions/withdraw/lnurl.py | 30 +++++++++---------------- lnbits/extensions/withdraw/models.py | 2 +- lnbits/extensions/withdraw/views.py | 3 +-- lnbits/extensions/withdraw/views_api.py | 8 ++----- 5 files changed, 23 insertions(+), 29 deletions(-) diff --git a/lnbits/extensions/withdraw/crud.py b/lnbits/extensions/withdraw/crud.py index 8387d2640..9fa5badac 100644 --- a/lnbits/extensions/withdraw/crud.py +++ b/lnbits/extensions/withdraw/crud.py @@ -95,6 +95,15 @@ async def get_withdraw_links(wallet_ids: Union[str, List[str]]) -> List[Withdraw return [WithdrawLink(**row) for row in rows] +async def remove_unique_withdraw_link(link: WithdrawLink, unique_hash: str) -> None: + unique_links = link.usescsv.split(",") + unique_links.remove(unique_hash) + await update_withdraw_link( + link.id, + usescsv=",".join(unique_links), + ) + + async def increment_withdraw_link(link: WithdrawLink) -> None: await update_withdraw_link( link.id, diff --git a/lnbits/extensions/withdraw/lnurl.py b/lnbits/extensions/withdraw/lnurl.py index e9c46f046..85bb1f72a 100644 --- a/lnbits/extensions/withdraw/lnurl.py +++ b/lnbits/extensions/withdraw/lnurl.py @@ -4,24 +4,20 @@ from http import HTTPStatus import httpx import shortuuid - -from fastapi import HTTPException -from fastapi.param_functions import Query +from fastapi import HTTPException, Response, Request, Query from loguru import logger -from starlette.requests import Request -from starlette.responses import HTMLResponse from lnbits.core.crud import update_payment_extra from lnbits.core.services import pay_invoice from . import withdraw_ext -from .crud import get_withdraw_link_by_hash, increment_withdraw_link +from .crud import get_withdraw_link_by_hash, remove_unique_withdraw_link, increment_withdraw_link from .models import WithdrawLink @withdraw_ext.get( "/api/v1/lnurl/{unique_hash}", - response_class=HTMLResponse, + response_class=Response, name="withdraw.api_lnurl_response", ) async def api_lnurl_response(request: Request, unique_hash): @@ -97,8 +93,7 @@ async def api_lnurl_callback( if id_unique_hash: if check_unique_link(link, id_unique_hash): - # remove it from usescsv list - pass + await remove_unique_withdraw_link(link, id_unique_hash) else: raise HTTPException( status_code=HTTPStatus.NOT_FOUND, detail="withdraw not found." @@ -122,8 +117,10 @@ async def api_lnurl_callback( def check_unique_link(link: WithdrawLink, unique_hash: str) -> bool: - unique_links = link.usescsv.split(",") - return any(unique_hash == shortuuid.uuid(name=link.id + link.unique_hash + x.strip()) for x in unique_links) + return any( + unique_hash == shortuuid.uuid(name=link.id + link.unique_hash + x.strip()) + for x in link.usescsv.split(",") + ) async def dispatch_webhook( @@ -166,7 +163,7 @@ async def dispatch_webhook( # FOR LNURLs WHICH ARE UNIQUE @withdraw_ext.get( "/api/v1/lnurl/{unique_hash}/{id_unique_hash}", - response_class=HTMLResponse, + response_class=Response, name="withdraw.api_lnurl_multi_response", ) async def api_lnurl_multi_response(request: Request, unique_hash, id_unique_hash): @@ -182,14 +179,7 @@ async def api_lnurl_multi_response(request: Request, unique_hash, id_unique_hash status_code=HTTPStatus.NOT_FOUND, detail="Withdraw is spent." ) - useslist = link.usescsv.split(",") - found = False - for x in useslist: - tohash = link.id + link.unique_hash + str(x) - if id_unique_hash == shortuuid.uuid(name=tohash): - found = True - - if not found: + if not check_unique_link(link, id_unique_hash): raise HTTPException( status_code=HTTPStatus.NOT_FOUND, detail="LNURL-withdraw not found." ) diff --git a/lnbits/extensions/withdraw/models.py b/lnbits/extensions/withdraw/models.py index ddb9d3801..49421a796 100644 --- a/lnbits/extensions/withdraw/models.py +++ b/lnbits/extensions/withdraw/models.py @@ -1,8 +1,8 @@ import shortuuid from fastapi import Query from lnurl import Lnurl, LnurlWithdrawResponse -from lnurl.models import ClearnetUrl, MilliSatoshi from lnurl import encode as lnurl_encode +from lnurl.models import ClearnetUrl, MilliSatoshi from pydantic import BaseModel from starlette.requests import Request diff --git a/lnbits/extensions/withdraw/views.py b/lnbits/extensions/withdraw/views.py index 3338b5a54..e8e5719a4 100644 --- a/lnbits/extensions/withdraw/views.py +++ b/lnbits/extensions/withdraw/views.py @@ -2,9 +2,8 @@ from http import HTTPStatus from io import BytesIO import pyqrcode -from fastapi import Request, Depends +from fastapi import Depends, HTTPException, Request from fastapi.templating import Jinja2Templates -from starlette.exceptions import HTTPException from starlette.responses import HTMLResponse, StreamingResponse from lnbits.core.models import User diff --git a/lnbits/extensions/withdraw/views_api.py b/lnbits/extensions/withdraw/views_api.py index a1052a01c..525796c90 100644 --- a/lnbits/extensions/withdraw/views_api.py +++ b/lnbits/extensions/withdraw/views_api.py @@ -1,11 +1,7 @@ from http import HTTPStatus -from typing import Optional - -from fastapi import Query, Depends +from fastapi import Depends, HTTPException, Query, Request from lnurl.exceptions import InvalidUrl as LnurlInvalidUrl -from starlette.exceptions import HTTPException -from starlette.requests import Request from lnbits.core.crud import get_user from lnbits.decorators import WalletTypeInfo, get_key_type, require_admin_key @@ -70,7 +66,7 @@ async def api_link_retrieve( async def api_link_create_or_update( req: Request, data: CreateWithdrawData, - link_id: Optional[str] = Query(), + link_id: str = Query(None), wallet: WalletTypeInfo = Depends(require_admin_key), ): if data.uses > 250: