diff --git a/src/_zkapauthorizer/eliot.py b/src/_zkapauthorizer/eliot.py index da3960d07a9f2ef09fb112fed4dd33bae61bc545..a2e99d8b89e2c885ab83f2a54c83b1a07333f376 100644 --- a/src/_zkapauthorizer/eliot.py +++ b/src/_zkapauthorizer/eliot.py @@ -32,6 +32,12 @@ PRIVACYPASS_MESSAGE = Field( u"The PrivacyPass request-binding data associated with a pass.", ) +INVALID_REASON = Field( + u"reason", + unicode, + u"The reason given by the server for rejecting a pass as invalid.", +) + PASS_COUNT = Field( u"count", int, @@ -41,7 +47,25 @@ PASS_COUNT = Field( GET_PASSES = MessageType( u"zkapauthorizer:get-passes", [PRIVACYPASS_MESSAGE, PASS_COUNT], - u"Passes are being spent.", + u"An attempt to spend passes is beginning.", +) + +SPENT_PASSES = MessageType( + u"zkapauthorizer:spent-passes", + [PASS_COUNT], + u"An attempt to spend passes has succeeded.", +) + +INVALID_PASSES = MessageType( + u"zkapauthorizer:invalid-passes", + [INVALID_REASON, PASS_COUNT], + u"An attempt to spend passes has found some to be invalid.", +) + +RESET_PASSES = MessageType( + u"zkapauthorizer:reset-passes", + [PRIVACYPASS_MESSAGE, PASS_COUNT], + u"Some passes involved in a failed spending attempt have not definitely been spent and are being returned for future use.", ) SIGNATURE_CHECK_FAILED = MessageType( diff --git a/src/_zkapauthorizer/spending.py b/src/_zkapauthorizer/spending.py index 78fd7263eab769fe1585446e9b7af465d769b8f6..20f0f775f17622f868e19790a35f7725b53f4759 100644 --- a/src/_zkapauthorizer/spending.py +++ b/src/_zkapauthorizer/spending.py @@ -26,6 +26,9 @@ import attr from .eliot import ( GET_PASSES, + SPENT_PASSES, + INVALID_PASSES, + RESET_PASSES, ) class IPassGroup(Interface): @@ -195,10 +198,20 @@ class SpendingController(object): return PassGroup(message, self, zip(unblinded_tokens, passes)) def _mark_spent(self, unblinded_tokens): + SPENT_PASSES.log( + count=len(unblinded_tokens), + ) self.discard_unblinded_tokens(unblinded_tokens) def _mark_invalid(self, reason, unblinded_tokens): + INVALID_PASSES.log( + reason=reason, + count=len(unblinded_tokens), + ) self.invalidate_unblinded_tokens(reason, unblinded_tokens) def _reset(self, unblinded_tokens): + RESET_PASSES.log( + count=len(unblinded_tokens), + ) self.reset_unblinded_tokens(unblinded_tokens)