From 22acc12ecaab004cbbea9f37abf4d156db366337 Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Thu, 28 May 2020 09:52:38 -0400
Subject: [PATCH] Add logging to spending-related activity

---
 src/_zkapauthorizer/eliot.py    | 26 +++++++++++++++++++++++++-
 src/_zkapauthorizer/spending.py | 13 +++++++++++++
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/src/_zkapauthorizer/eliot.py b/src/_zkapauthorizer/eliot.py
index da3960d..a2e99d8 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 78fd726..20f0f77 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)
-- 
GitLab