From b320a0b4584c51e6be8e96fc5839dd9e53127de0 Mon Sep 17 00:00:00 2001 From: Jean-Paul Calderone <exarkun@twistedmatrix.com> Date: Mon, 4 May 2020 11:50:12 -0400 Subject: [PATCH] Avoid allowing null/None into model for voucher expected-tokens count --- docs/source/interface.rst | 19 +++++++++++-------- src/_zkapauthorizer/model.py | 3 --- src/_zkapauthorizer/schema.py | 12 ++++++++---- src/_zkapauthorizer/tests/test_controller.py | 1 - 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/docs/source/interface.rst b/docs/source/interface.rst index 8b035cf..2c004f2 100644 --- a/docs/source/interface.rst +++ b/docs/source/interface.rst @@ -42,32 +42,35 @@ If the voucher is not known then the response is **NOT FOUND**. For any voucher which has previously been submitted, the response is **OK** with an ``application/json`` content-type response body like:: - { "value": <string> + { "number": <string> + , "expected-tokens": <integer> , "created": <iso8601 timestamp> , "state": <state object> , "version": 1 } -The ``value`` property merely indicates the voucher which was requested. +The ``number`` property merely indicates the voucher which was requested. +The ``expected-tokens`` property indicates the total number of ZKAPs the client for which the client intends to redeem the voucher. +Vouchers created using old versions of ZKAPAuthorizer will have a best-guess value here because the real value was not recorded. The ``created`` property indicates when the voucher was first added to the node. -The ``redeemed`` property indicates whether or not the voucher has successfully been redeemed with a payment server yet. -The ``token-count`` property gives the number of blinded token signatures the client received in exchange for redemption of the voucher -(each blinded token signature can be used to construct a one ZKAP), -if it has been redeemed. -If it has not been redeemed then it is ``null``. - The ``state`` property is an object that gives more details about the current state of the voucher. The following values are possible:: { "name": "pending" + , "counter": <integer> } +The integer *counter* value indicates how many successful sub-redemptions have completed for this voucher. + :: { "name": "redeeming" , "started": <iso8601 timestamp> + , "counter": <integer> } +The integer *counter* value has the same meaning as it does for the *pending* state. + :: { "name": "redeemed" diff --git a/src/_zkapauthorizer/model.py b/src/_zkapauthorizer/model.py index 636c3a1..679352e 100644 --- a/src/_zkapauthorizer/model.py +++ b/src/_zkapauthorizer/model.py @@ -951,9 +951,6 @@ class Voucher(object): number, created, expected_tokens, state = row[:4] - if expected_tokens is None: - raise ValueError("Bluib") - return cls( number=number, expected_tokens=expected_tokens, diff --git a/src/_zkapauthorizer/schema.py b/src/_zkapauthorizer/schema.py index 5966299..a23d337 100644 --- a/src/_zkapauthorizer/schema.py +++ b/src/_zkapauthorizer/schema.py @@ -146,10 +146,14 @@ _UPGRADES = { """, """ -- Record the total number of tokens for which we expect to be able to - -- redeem this voucher. For rows in the database before this column - -- was added, we forgot how many tokens we expected. All rows added - -- after this column is added should have a non-NULL value. - ALTER TABLE [vouchers] ADD COLUMN [expected-tokens] integer + -- redeem this voucher. We don't want to allow NULL values here at + -- all because that allows insertion of garbage data going forward. + -- However to add a non-NULL column to a table we have to supply a + -- default value. Since no real vouchers have ever been issued at the + -- time of this upgrade we'll just make up some value. It doesn't + -- particularly matter if it is wrong for some testing voucher someone + -- used. + ALTER TABLE [vouchers] ADD COLUMN [expected-tokens] integer NOT NULL DEFAULT 32768 """, ], } diff --git a/src/_zkapauthorizer/tests/test_controller.py b/src/_zkapauthorizer/tests/test_controller.py index 643749d..d133a3d 100644 --- a/src/_zkapauthorizer/tests/test_controller.py +++ b/src/_zkapauthorizer/tests/test_controller.py @@ -358,7 +358,6 @@ class PaymentControllerTests(TestCase): ), ) - @given(tahoe_configs(), datetimes(), vouchers(), voucher_counters(), integers(min_value=0, max_value=100)) def test_stop_redeeming_on_error(self, get_config, now, voucher, counter, extra_tokens): """ -- GitLab