feat: add lud17 support for wallet parse dialog (#3289)

This commit is contained in:
dni ⚡ 2025-07-23 15:27:00 +02:00 committed by GitHub
parent bdfefc2506
commit 0d2ff2e663
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 44 additions and 13 deletions

View file

@ -14,3 +14,7 @@ class CreateLnurlPayment(BaseModel):
class CreateLnurlWithdraw(BaseModel): class CreateLnurlWithdraw(BaseModel):
lnurl_w: Lnurl lnurl_w: Lnurl
class LnurlScan(BaseModel):
lnurl: Lnurl

View file

@ -23,7 +23,7 @@ from lnurl.models import (
from loguru import logger from loguru import logger
from lnbits.core.models import CreateLnurlWithdraw, Payment from lnbits.core.models import CreateLnurlWithdraw, Payment
from lnbits.core.models.lnurl import CreateLnurlPayment from lnbits.core.models.lnurl import CreateLnurlPayment, LnurlScan
from lnbits.decorators import ( from lnbits.decorators import (
WalletTypeInfo, WalletTypeInfo,
require_admin_key, require_admin_key,
@ -40,6 +40,7 @@ lnurl_router = APIRouter(tags=["LNURL"])
@lnurl_router.get( @lnurl_router.get(
"/api/v1/lnurlscan/{code}", "/api/v1/lnurlscan/{code}",
dependencies=[Depends(require_invoice_key)], dependencies=[Depends(require_invoice_key)],
deprecated=True,
response_model=LnurlPayResponse response_model=LnurlPayResponse
| LnurlWithdrawResponse | LnurlWithdrawResponse
| LnurlAuthResponse | LnurlAuthResponse
@ -58,6 +59,24 @@ async def api_lnurlscan(code: str) -> LnurlResponseModel:
return res return res
@lnurl_router.post(
"/api/v1/lnurlscan",
dependencies=[Depends(require_invoice_key)],
response_model=LnurlPayResponse
| LnurlWithdrawResponse
| LnurlAuthResponse
| LnurlErrorResponse,
)
async def api_lnurlscan_post(scan: LnurlScan) -> LnurlResponseModel:
try:
res = await lnurl_handle(scan.lnurl, user_agent=settings.user_agent, timeout=5)
except LnurlResponseException as exc:
raise HTTPException(
status_code=HTTPStatus.BAD_REQUEST, detail=str(exc)
) from exc
return res
@lnurl_router.post("/api/v1/lnurlauth") @lnurl_router.post("/api/v1/lnurlauth")
async def api_perform_lnurlauth( async def api_perform_lnurlauth(
data: LnurlAuthResponse, key_type: WalletTypeInfo = Depends(require_admin_key) data: LnurlAuthResponse, key_type: WalletTypeInfo = Depends(require_admin_key)

View file

@ -352,11 +352,9 @@ window.WalletPageLogic = {
}, },
lnurlScan() { lnurlScan() {
LNbits.api LNbits.api
.request( .request('POST', '/api/v1/lnurlscan', this.g.wallet.adminkey, {
'GET', lnurl: this.parse.data.request
'/api/v1/lnurlscan/' + this.parse.data.request, })
this.g.wallet.adminkey
)
.then(response => { .then(response => {
const data = response.data const data = response.data
if (data.status === 'ERROR') { if (data.status === 'ERROR') {
@ -404,19 +402,29 @@ window.WalletPageLogic = {
this.decodeRequest() this.decodeRequest()
this.parse.camera.show = false this.parse.camera.show = false
}, },
isLnurl(req) {
return (
req.toLowerCase().startsWith('lnurl1') ||
req.startsWith('lnurlp://') ||
req.startsWith('lnurlw://') ||
req.startsWith('lnurlauth://') ||
req.match(/[\w.+-~_]+@[\w.+-~_]/)
)
},
decodeRequest() { decodeRequest() {
this.parse.show = true this.parse.show = true
this.parse.data.request = this.parse.data.request.trim().toLowerCase() this.parse.data.request = this.parse.data.request.trim()
let req = this.parse.data.request const req = this.parse.data.request.toLowerCase()
if (req.startsWith('lightning:')) { if (req.startsWith('lightning:')) {
this.parse.data.request = req.slice(10) this.parse.data.request = this.parse.data.request.slice(10)
} else if (req.startsWith('lnurl:')) { } else if (req.startsWith('lnurl:')) {
this.parse.data.request = req.slice(6) this.parse.data.request = this.parse.data.request.slice(6)
} else if (req.includes('lightning=lnurl1')) { } else if (req.includes('lightning=lnurl1')) {
this.parse.data.request = req.split('lightning=')[1].split('&')[0] this.parse.data.request = this.parse.data.request
.split('lightning=')[1]
.split('&')[0]
} }
req = this.parse.data.request if (this.isLnurl(this.parse.data.request)) {
if (req.startsWith('lnurl1') || req.match(/[\w.+-~_]+@[\w.+-~_]/)) {
this.lnurlScan() this.lnurlScan()
return return
} }