Merge pull request #10575 from f321x/lnurlw_prefix

pi: handle lud-17 lnurl URIs
This commit is contained in:
ghost43
2026-04-24 15:00:07 +00:00
committed by GitHub
8 changed files with 58 additions and 7 deletions
+4 -1
View File
@@ -23,6 +23,7 @@ from electrum.network import Network
from electrum.plugin import run_hook
from electrum.gui.common_qt.util import get_font_id
from electrum.util import profiler
from electrum.lnurl import SUPPORTED_LNURL_SCHEMES
from .qeconfig import QEConfig
from .qedaemon import QEDaemon
@@ -235,7 +236,9 @@ class QEAppController(BaseCrashReporter, QObject):
data = str(intent.getDataString())
self.logger.debug(f'received intent: {repr(data)}')
scheme = str(intent.getScheme()).lower()
if scheme == BITCOIN_BIP21_URI_SCHEME or scheme == LIGHTNING_URI_SCHEME:
if scheme == BITCOIN_BIP21_URI_SCHEME \
or scheme == LIGHTNING_URI_SCHEME \
or scheme in SUPPORTED_LNURL_SCHEMES:
self.uriReceived.emit(data)
def startup_finished(self):
+3
View File
@@ -21,6 +21,9 @@ from electrum.i18n import _
_logger = get_logger(__name__)
SUPPORTED_LNURL_SCHEMES = ('lnurlp', 'lnurlw')
class LNURLError(Exception): pass
class UntrustedLNURLError(LNURLError):
+24 -3
View File
@@ -16,7 +16,7 @@ from .util import get_asyncio_loop, log_exceptions
from .transaction import PartialTxOutput
from .lnurl import (decode_lnurl, request_lnurl, callback_lnurl, LNURLError,
lightning_address_to_url, try_resolve_lnurlpay, LNURL6Data,
LNURL3Data, LNURLData)
LNURL3Data, LNURLData, SUPPORTED_LNURL_SCHEMES)
from .bitcoin import opcodes, construct_script
from .lnaddr import LnInvoiceException
from .lnutil import IncompatibleOrInsaneFeatures
@@ -45,9 +45,25 @@ def remove_uri_prefix(data: str, *, prefix: str) -> str:
return data
def maybe_extract_url_from_lud_17_uri(data: str) -> Optional[str]:
"""https://github.com/lnurl/luds/blob/luds/17.md"""
data = data.strip()
try:
parsed = urllib.parse.urlsplit(data)
except ValueError:
return None
if parsed.scheme not in SUPPORTED_LNURL_SCHEMES:
return None
if not (host := parsed.hostname) or not parsed.path:
return None
is_onion = host.endswith('.onion')
url_scheme = 'http' if is_onion else 'https'
return urllib.parse.urlunsplit(parsed._replace(scheme=url_scheme))
RE_ALIAS = r'(.*?)\s*\<([0-9A-Za-z]{1,})\>'
RE_EMAIL = r'\b[A-Za-z0-9._%+-]+@([A-Za-z0-9-]+\.)+[A-Z|a-z]{2,7}\b'
RE_DOMAIN = r'\b([A-Za-z0-9-]+\.)+[A-Z|a-z]{2,7}\b'
RE_EMAIL = r'\b[A-Za-z0-9._%+-]+@([A-Za-z0-9-]+\.)+[A-Za-z]{2,7}\b'
RE_DOMAIN = r'\b([A-Za-z0-9-]+\.)+[A-Za-z]{2,7}\b'
RE_SCRIPT_FN = r'script\((.*)\)'
@@ -98,6 +114,7 @@ class PaymentIdentifier(Logger):
* openalias
* bip21 URI
* lightning-URI (containing bolt11 or lnurl)
* lnurl-URI (lud17 lnurlw/lnurlp URI)
* bolt11 invoice
* lnurl
* lightning address
@@ -228,6 +245,10 @@ class PaymentIdentifier(Logger):
self.logger.debug(f'Exception cause {e.args!r}')
return
self.set_state(PaymentIdentifierState.AVAILABLE)
elif lnurl_url := maybe_extract_url_from_lud_17_uri(text):
self._type = PaymentIdentifierType.LNURL
self.lnurl = lnurl_url
self.set_state(PaymentIdentifierState.NEED_RESOLVE)
elif text.lower().startswith(BITCOIN_BIP21_URI_SCHEME + ':'):
try:
out = parse_bip21_URI(text)