summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMS <ms@taler.net>2020-11-17 15:52:51 +0100
committerMS <ms@taler.net>2020-11-17 15:52:51 +0100
commit354f6f6608eb14e8fd27669f08d8eabacd35098f (patch)
tree4ec3328e17b5971d4825dd845aa6bc442d11e7a6
parent17286a9c07b8fa3932e11d315060ae55cf4a5ca0 (diff)
downloadbank-354f6f6608eb14e8fd27669f08d8eabacd35098f.tar.gz
bank-354f6f6608eb14e8fd27669f08d8eabacd35098f.tar.bz2
bank-354f6f6608eb14e8fd27669f08d8eabacd35098f.zip
Improve Payto parser
m---------talerbank/app/static/web-common0
-rw-r--r--talerbank/app/tests.py29
-rw-r--r--talerbank/app/views.py24
3 files changed, 33 insertions, 20 deletions
diff --git a/talerbank/app/static/web-common b/talerbank/app/static/web-common
-Subproject 2457613ecc8b8971bd47119b1a02a2f290bb483
+Subproject eaefc57f2ea5434ad6b7f1c11ee4daa0fc92c76
diff --git a/talerbank/app/tests.py b/talerbank/app/tests.py
index b5c926e..86e5998 100644
--- a/talerbank/app/tests.py
+++ b/talerbank/app/tests.py
@@ -336,17 +336,28 @@ class ReservePubExtractionTestCase(TestCase):
class PaytoParseTestCase(TestCase):
- def test_payto_parse(self):
+ def test_payto_wrong_protocol(self):
+ self.assertRaises(Exception, PaytoParse, "http://foo/bar")
+ def test_payto_with_port_number(self):
+ parsed = PaytoParse("payto://iban/localhost:1234/account")
+ self.assertEqual(parsed.bank, "localhost:1234")
+ def test_payto_malformed(self):
+ self.assertRaises(Exception, PaytoParse, "payto:foo/bar")
+ def test_payto_noamount(self):
parsed = PaytoParse(
- "payto://x-taler-bank/bank.int.taler.net/Exchange?subject=0T096A11M57GWGG0P6ZM9Z8G5829BFJFH2AN9R5T80FJ931DX7GG&amount=EUR:1"
- )
- self.assertTrue("Exchange" == parsed.account)
- self.assertTrue(
- "0T096A11M57GWGG0P6ZM9Z8G5829BFJFH2AN9R5T80FJ931DX7GG" == parsed.subject
+ "payto://x-taler-bank/bank.int.taler.net/Exchange?message=0T096A11M57GWGG0P6ZM9Z8G5829BFJFH2AN9R5T80FJ931DX7GG"
)
- self.assertTrue(parsed.amount.value == 1)
- self.assertTrue(parsed.amount.fraction == 0)
- self.assertTrue(parsed.amount.currency == "EUR")
+ def test_payto_parse(self):
+ parsed = PaytoParse(
+ "payto://x-taler-bank/bank.int.taler.net/Exchange?message=0T096A11M57GWGG0P6ZM9Z8G5829BFJFH2AN9R5T80FJ931DX7GG&amount=EUR:1"
+ )
+ self.assertEqual("Exchange", parsed.target)
+ self.assertEqual("0T096A11M57GWGG0P6ZM9Z8G5829BFJFH2AN9R5T80FJ931DX7GG", parsed.message)
+ self.assertEqual(parsed.amount.value, 1)
+ self.assertEqual(parsed.amount.fraction, 0)
+ self.assertEqual(parsed.amount.currency, "EUR")
+ self.assertEqual(parsed.authority, "x-taler-bank")
+ self.assertEqual(parsed.bank, "bank.int.taler.net")
class PublicAccountsTestCase(TestCase):
diff --git a/talerbank/app/views.py b/talerbank/app/views.py
index fc1eb54..1ac0c99 100644
--- a/talerbank/app/views.py
+++ b/talerbank/app/views.py
@@ -102,17 +102,19 @@ def allow_origin_star(view_func):
class PaytoParse:
def __init__(self, payto_uri):
- parsed_payto = urlparse(payto_uri)
- if parsed_payto.scheme != "payto":
- raise Exception("Bad Payto URI: '%s'" % payto_uri)
- path_as_list = parsed_payto.path.split("/")
- if len(path_as_list) == 0:
- raise Exception("No account/user name found: '%s'" % payto_uri)
- self.account = path_as_list[-1]
- params = dict(parse_qsl(parsed_payto.query))
- self.subject = params.get("subject")
- self.amount = Amount.parse(params.get("amount"))
-
+ obj = urlparse(payto_uri)
+ path = obj.path.split("/")
+ if obj.scheme != "payto" or \
+ len(path) != 3 or \
+ not obj.netloc or \
+ not re.match("^payto://", payto_uri):
+ raise Exception(f"Bad Payto URI: {payto_uri}")
+ self.target = path.pop()
+ self.bank = path.pop()
+ self.authority = obj.netloc
+ params = dict(parse_qsl(obj.query))
+ self.message = params.get("message")
+ self.amount = Amount.parse(params.get("amount")) if "amount" in params else None
##
# Exception raised upon failing login.