From 6a4170f4cc3a902db31ab34b03033a3659c3168b Mon Sep 17 00:00:00 2001 From: Tiago vasconcelos Date: Tue, 21 Jun 2022 15:33:23 +0100 Subject: [PATCH] scrubbing works, duplicated code warning --- lnbits/extensions/scrub/models.py | 4 -- lnbits/extensions/scrub/tasks.py | 78 ++++++++++++++++++++++--------- 2 files changed, 55 insertions(+), 27 deletions(-) diff --git a/lnbits/extensions/scrub/models.py b/lnbits/extensions/scrub/models.py index 2168240df..db05e4f17 100644 --- a/lnbits/extensions/scrub/models.py +++ b/lnbits/extensions/scrub/models.py @@ -1,9 +1,5 @@ -import json from sqlite3 import Row -from typing import Dict, Optional -from urllib.parse import ParseResult, parse_qs, urlencode, urlparse, urlunparse -from fastapi.param_functions import Query from pydantic import BaseModel from starlette.requests import Request diff --git a/lnbits/extensions/scrub/tasks.py b/lnbits/extensions/scrub/tasks.py index 4498464e0..1cdd15c6b 100644 --- a/lnbits/extensions/scrub/tasks.py +++ b/lnbits/extensions/scrub/tasks.py @@ -1,15 +1,17 @@ import asyncio import json +from http import HTTPStatus +from urllib.parse import urlparse import httpx +from fastapi import HTTPException -from lnbits.core import db as core_db -from lnbits.core.crud import get_wallet +from lnbits import bolt11 from lnbits.core.models import Payment +from lnbits.core.services import pay_invoice from lnbits.tasks import register_invoice_listener -from .crud import get_scrub_by_wallet, get_scrub_link -from .models import ScrubLink +from .crud import get_scrub_by_wallet async def wait_for_paid_invoices(): @@ -23,7 +25,7 @@ async def wait_for_paid_invoices(): async def on_invoice_paid(payment: Payment) -> None: # (avoid loops) - if "scrub" == payment.extra.get("tag"): + if "scrubed" == payment.extra.get("tag"): # already scrubbed return @@ -32,23 +34,53 @@ async def on_invoice_paid(payment: Payment) -> None: if not scrub_link: return - from lnbits.core.views.api import ( - CreateLNURLData, - api_lnurlscan, - api_payments_pay_lnurl, + from lnbits.core.views.api import api_lnurlscan + + # DECODE LNURLP OR LNADDRESS + data = await api_lnurlscan(scrub_link.payoraddress) + + + # I REALLY HATE THIS DUPLICATION OF CODE!! CORE/VIEWS/API.PY, LINE 267 + domain = urlparse(data["callback"]).netloc + + async with httpx.AsyncClient() as client: + try: + r = await client.get( + data["callback"], + params={"amount": payment.amount}, + timeout=40, + ) + if r.is_error: + raise httpx.ConnectError + except (httpx.ConnectError, httpx.RequestError): + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail=f"Failed to connect to {domain}.", + ) + + params = json.loads(r.text) + if params.get("status") == "ERROR": + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail=f"{domain} said: '{params.get('reason', '')}'", + ) + + invoice = bolt11.decode(params["pr"]) + if invoice.amount_msat != payment.amount: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, + detail=f"{domain} returned an invalid invoice. Expected {payment.amount} msat, got {invoice.amount_msat}.", + ) + + payment_hash = await pay_invoice( + wallet_id=payment.wallet_id, + payment_request=params["pr"], + description=data["description"], + extra={"tag": "scrubed"}, ) - wallet = await get_wallet(wallet_id=payment.wallet_id) - assert wallet - - # PAY LNURLP AND LNADDRESS - invoice = await api_lnurlscan(scrub_link.payoraddress) - invoice_data = CreateLNURLData( - callback = invoice["callback"], - description_hash = invoice["description_hash"], - amount = payment.amount - ) - print("INV", invoice_data, wallet) - - invoice_paid = await api_payments_pay_lnurl(data=invoice_data, wallet=wallet.adminkey) - print("PAID", invoice_paid) + return { + "payment_hash": payment_hash, + # maintain backwards compatibility with API clients: + "checking_id": payment_hash, + }