mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-20 18:44:20 +01:00
sanitize mint URL before adding (#606)
This commit is contained in:
10
cashu/wallet/utils.py
Normal file
10
cashu/wallet/utils.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
def sanitize_url(url: str) -> str:
|
||||||
|
# extract host from url and lower case it, remove trailing slash from url
|
||||||
|
protocol = url.split("://")[0]
|
||||||
|
host = url.split("://")[1].split("/")[0].lower()
|
||||||
|
path = (
|
||||||
|
url.split("://")[1].split("/", 1)[1].rstrip("/")
|
||||||
|
if "/" in url.split("://")[1]
|
||||||
|
else ""
|
||||||
|
)
|
||||||
|
return f"{protocol}://{host}{'/' + path if path else ''}"
|
||||||
@@ -8,9 +8,6 @@ import bolt11
|
|||||||
from bip32 import BIP32
|
from bip32 import BIP32
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
from cashu.core.crypto.keys import derive_keyset_id
|
|
||||||
from cashu.core.json_rpc.base import JSONRPCSubscriptionKinds
|
|
||||||
|
|
||||||
from ..core.base import (
|
from ..core.base import (
|
||||||
BlindedMessage,
|
BlindedMessage,
|
||||||
BlindedSignature,
|
BlindedSignature,
|
||||||
@@ -22,10 +19,16 @@ from ..core.base import (
|
|||||||
WalletKeyset,
|
WalletKeyset,
|
||||||
)
|
)
|
||||||
from ..core.crypto import b_dhke
|
from ..core.crypto import b_dhke
|
||||||
|
from ..core.crypto.keys import derive_keyset_id
|
||||||
from ..core.crypto.secp import PrivateKey, PublicKey
|
from ..core.crypto.secp import PrivateKey, PublicKey
|
||||||
from ..core.db import Database
|
from ..core.db import Database
|
||||||
from ..core.errors import KeysetNotFoundError
|
from ..core.errors import KeysetNotFoundError
|
||||||
from ..core.helpers import amount_summary, calculate_number_of_blank_outputs, sum_proofs
|
from ..core.helpers import (
|
||||||
|
amount_summary,
|
||||||
|
calculate_number_of_blank_outputs,
|
||||||
|
sum_proofs,
|
||||||
|
)
|
||||||
|
from ..core.json_rpc.base import JSONRPCSubscriptionKinds
|
||||||
from ..core.migrations import migrate_databases
|
from ..core.migrations import migrate_databases
|
||||||
from ..core.models import (
|
from ..core.models import (
|
||||||
PostCheckStateResponse,
|
PostCheckStateResponse,
|
||||||
@@ -34,7 +37,8 @@ from ..core.models import (
|
|||||||
from ..core.p2pk import Secret
|
from ..core.p2pk import Secret
|
||||||
from ..core.settings import settings
|
from ..core.settings import settings
|
||||||
from ..core.split import amount_split
|
from ..core.split import amount_split
|
||||||
from ..wallet.crud import (
|
from . import migrations
|
||||||
|
from .crud import (
|
||||||
bump_secret_derivation,
|
bump_secret_derivation,
|
||||||
get_keysets,
|
get_keysets,
|
||||||
get_proofs,
|
get_proofs,
|
||||||
@@ -48,7 +52,6 @@ from ..wallet.crud import (
|
|||||||
update_lightning_invoice,
|
update_lightning_invoice,
|
||||||
update_proof,
|
update_proof,
|
||||||
)
|
)
|
||||||
from . import migrations
|
|
||||||
from .htlc import WalletHTLC
|
from .htlc import WalletHTLC
|
||||||
from .mint_info import MintInfo
|
from .mint_info import MintInfo
|
||||||
from .p2pk import WalletP2PK
|
from .p2pk import WalletP2PK
|
||||||
@@ -56,6 +59,7 @@ from .proofs import WalletProofs
|
|||||||
from .secrets import WalletSecrets
|
from .secrets import WalletSecrets
|
||||||
from .subscriptions import SubscriptionManager
|
from .subscriptions import SubscriptionManager
|
||||||
from .transactions import WalletTransactions
|
from .transactions import WalletTransactions
|
||||||
|
from .utils import sanitize_url
|
||||||
from .v1_api import LedgerAPI
|
from .v1_api import LedgerAPI
|
||||||
|
|
||||||
|
|
||||||
@@ -107,8 +111,8 @@ class Wallet(
|
|||||||
self.proofs: List[Proof] = []
|
self.proofs: List[Proof] = []
|
||||||
self.name = name
|
self.name = name
|
||||||
self.unit = Unit[unit]
|
self.unit = Unit[unit]
|
||||||
|
url = sanitize_url(url)
|
||||||
|
|
||||||
url = url.rstrip("/")
|
|
||||||
super().__init__(url=url, db=self.db)
|
super().__init__(url=url, db=self.db)
|
||||||
logger.debug("Wallet initialized")
|
logger.debug("Wallet initialized")
|
||||||
logger.debug(f"Mint URL: {url}")
|
logger.debug(f"Mint URL: {url}")
|
||||||
|
|||||||
63
tests/test_wallet_utils.py
Normal file
63
tests/test_wallet_utils.py
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
from typing import List, Union
|
||||||
|
|
||||||
|
from cashu.core.errors import CashuError
|
||||||
|
from cashu.wallet.utils import sanitize_url
|
||||||
|
|
||||||
|
|
||||||
|
async def assert_err(f, msg: Union[str, CashuError]):
|
||||||
|
"""Compute f() and expect an error message 'msg'."""
|
||||||
|
try:
|
||||||
|
await f
|
||||||
|
except Exception as exc:
|
||||||
|
error_message: str = str(exc.args[0])
|
||||||
|
if isinstance(msg, CashuError):
|
||||||
|
if msg.detail not in error_message:
|
||||||
|
raise Exception(
|
||||||
|
f"CashuError. Expected error: {msg.detail}, got: {error_message}"
|
||||||
|
)
|
||||||
|
return
|
||||||
|
if msg not in error_message:
|
||||||
|
raise Exception(f"Expected error: {msg}, got: {error_message}")
|
||||||
|
return
|
||||||
|
raise Exception(f"Expected error: {msg}, got no error")
|
||||||
|
|
||||||
|
|
||||||
|
async def assert_err_multiple(f, msgs: List[str]):
|
||||||
|
"""Compute f() and expect an error message 'msg'."""
|
||||||
|
try:
|
||||||
|
await f
|
||||||
|
except Exception as exc:
|
||||||
|
for msg in msgs:
|
||||||
|
if msg in str(exc.args[0]):
|
||||||
|
return
|
||||||
|
raise Exception(f"Expected error: {msgs}, got: {exc.args[0]}")
|
||||||
|
raise Exception(f"Expected error: {msgs}, got no error")
|
||||||
|
|
||||||
|
|
||||||
|
def test_sanitize_url():
|
||||||
|
url = "https://localhost:3338"
|
||||||
|
assert sanitize_url(url) == "https://localhost:3338"
|
||||||
|
|
||||||
|
url = "https://mint.com:3338"
|
||||||
|
assert sanitize_url(url) == "https://mint.com:3338"
|
||||||
|
|
||||||
|
url = "https://Mint.com:3338"
|
||||||
|
assert sanitize_url(url) == "https://mint.com:3338"
|
||||||
|
|
||||||
|
url = "https://mint.com:3338/"
|
||||||
|
assert sanitize_url(url) == "https://mint.com:3338"
|
||||||
|
|
||||||
|
url = "https://mint.com:3338/abc"
|
||||||
|
assert sanitize_url(url) == "https://mint.com:3338/abc"
|
||||||
|
|
||||||
|
url = "https://mint.com:3338/Abc"
|
||||||
|
assert sanitize_url(url) == "https://mint.com:3338/Abc"
|
||||||
|
|
||||||
|
url = "https://mint.com:3338/abc/"
|
||||||
|
assert sanitize_url(url) == "https://mint.com:3338/abc"
|
||||||
|
|
||||||
|
url = "https://mint.com:3338/Abc/"
|
||||||
|
assert sanitize_url(url) == "https://mint.com:3338/Abc"
|
||||||
|
|
||||||
|
url = "https://Mint.com:3338/Abc/def"
|
||||||
|
assert sanitize_url(url) == "https://mint.com:3338/Abc/def"
|
||||||
Reference in New Issue
Block a user