From a255b3693ea5e752b10d616da66431b7b2ff4515 Mon Sep 17 00:00:00 2001
From: Jean-Paul Calderone <exarkun@twistedmatrix.com>
Date: Fri, 1 Oct 2021 11:52:30 -0400
Subject: [PATCH] add protocol sequence diagrams for zkap purchase and use

---
 .gitlab-ci.yml                            |   2 +-
 docs.nix                                  |   2 -
 docs/default.nix                          |   2 +
 docs/docs.nix                             |  20 ++++
 docs/source/conf.py                       |   4 +-
 docs/source/dev/README.rst                | 113 ++++++++++++++++++++--
 docs/source/dev/architecture-overview.dot |  17 +++-
 privatestorageio.nix                      |  19 ----
 8 files changed, 147 insertions(+), 32 deletions(-)
 delete mode 100644 docs.nix
 create mode 100644 docs/default.nix
 create mode 100644 docs/docs.nix
 delete mode 100644 privatestorageio.nix

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index d6b06fae..8ef000d0 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -8,7 +8,7 @@ default:
 docs:
   stage: "build"
   script:
-    - "nix-build docs.nix"
+    - "nix-build docs"
     - "cp --recursive --no-preserve=mode result/docs/. docs/build/"
   artifacts:
     paths:
diff --git a/docs.nix b/docs.nix
deleted file mode 100644
index 4c8b230a..00000000
--- a/docs.nix
+++ /dev/null
@@ -1,2 +0,0 @@
-{ pkgs ? import ./nixpkgs-2105.nix { } }:
-pkgs.callPackage ./privatestorageio.nix { }
diff --git a/docs/default.nix b/docs/default.nix
new file mode 100644
index 00000000..488a7493
--- /dev/null
+++ b/docs/default.nix
@@ -0,0 +1,2 @@
+{ pkgs ? import ../nixpkgs-2105.nix { } }:
+pkgs.callPackage ./docs.nix { }
diff --git a/docs/docs.nix b/docs/docs.nix
new file mode 100644
index 00000000..03ac07df
--- /dev/null
+++ b/docs/docs.nix
@@ -0,0 +1,20 @@
+{ stdenv, lib, graphviz, plantuml, python3, sphinx }:
+let
+  pyenv = python3.withPackages (ps: [ ps.sphinx ps.sphinxcontrib_plantuml ]);
+in
+stdenv.mkDerivation rec {
+  version = "0.0";
+  name = "privatestorageio-${version}";
+  src = lib.cleanSource ../.;
+
+  phases = [ "unpackPhase" "buildPhase" ];
+
+  depsBuildBuild = [
+    graphviz
+    plantuml
+  ];
+
+  buildPhase = ''
+    ${pyenv}/bin/sphinx-build -W docs/source $out/docs
+  '';
+}
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 66aa921e..747a90a8 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -20,7 +20,7 @@
 # -- Project information -----------------------------------------------------
 
 project = 'PrivateStorageio'
-copyright = '2019, PrivateStorage.io, LLC'
+copyright = '2021, PrivateStorage.io, LLC'
 author = 'PrivateStorage.io, LLC'
 
 # The short X.Y version
@@ -38,8 +38,10 @@ release = '0.0'
 # Add any Sphinx extension module names here, as strings. They can be
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
+
 extensions = [
     "sphinx.ext.graphviz",
+    "sphinxcontrib.plantuml",
 ]
 
 # Add any paths that contain templates here, relative to this directory.
diff --git a/docs/source/dev/README.rst b/docs/source/dev/README.rst
index 14d2de31..19940b80 100644
--- a/docs/source/dev/README.rst
+++ b/docs/source/dev/README.rst
@@ -57,14 +57,115 @@ To update the channel, the script will need to be updated,
 along with the filenames that have the channel in them.
 
 
-Architecture overview
----------------------
-
-.. graphviz:: architecture-overview.dot
-
+Interactions
+------------
+
+Storage-Time Purchase (ie Payment)
+``````````````````````````````````
+
+.. uml::
+
+   actor User as User
+   participant GridSync
+   participant ZKAPAuthorizer
+   database    ZKAPAuthzDB as "ZKAPAuthorizer"
+   participant Browser
+   participant PaymentServer as "Payment Server"
+   database    PaymentServerDB as "Payment Server"
+   participant WebServer as "Web Server"
+   participant Stripe
+
+   User           -> GridSync       : buy storage-time
+   activate User
+   GridSync       -> GridSync       : generate voucher
+   GridSync       -> ZKAPAuthorizer : redeem voucher
+   activate ZKAPAuthorizer
+   ZKAPAuthorizer -> ZKAPAuthzDB    : store voucher
+   ZKAPAuthorizer -> GridSync       : acknowledge
+   GridSync       -> Browser        : open payment page
+
+   loop until redeemed
+       GridSync       -> ZKAPAuthorizer : query voucher state
+       ZKAPAuthorizer -> GridSync       : not paid
+   end
+
+   Browser       -> WebServer  : request payment form
+   WebServer     -> Browser    : payment form
+   Browser       -> User       : Payment form displayed
+   activate User
+   User          -> Browser    : Submit payment details
+   Browser       -> Stripe     : Submit payment details
+
+   alt payment details accepted
+       Stripe         -> Browser         : details okay, return card token
+       Browser        -> PaymentServer   : create charge using card token
+       PaymentServer  -> Stripe          : charge card using token
+       note left: the user has now paid for the service
+       Stripe         -> PaymentServer   : acknowledge
+       PaymentServer  -> PaymentServerDB : store voucher paid state
+   else payment details rejected
+       Stripe    -> Browser        : payment failure
+   end
+
+   Browser       -> User       : payment processing results displayed
+   deactivate User
+
+   group repeat for each redemption group
+       ZKAPAuthorizer -> ZKAPAuthzDB    : generate and store random tokens
+       ZKAPAuthorizer -> PaymentServer  : redeem voucher with blinded tokens
+       PaymentServer  -> ZKAPAuthorizer : return signatures for blinded tokens
+       ZKAPAuthorizer -> ZKAPAuthzDB    : store unblinded signatures for tokens
+       note right: the user has now been authorized to use the service
+   end
+   deactivate ZKAPAuthorizer
+
+   loop until redeemed
+       GridSync       -> ZKAPAuthorizer : query voucher state
+       ZKAPAuthorizer -> GridSync       : fully redeemed
+   end
+
+   GridSync           -> User           : storage-time available displayed
+   deactivate User
+
+Storage-Time Spending (ie Use)
+``````````````````````````````
+
+.. uml::
+
+   participant MagicFolder
+   participant TahoeLAFS as "Tahoe-LAFS"
+   participant ZKAPAuthorizer
+   database    ZKAPAuthzDB as "ZKAPAuthorizer"
+   participant StorageNode as "Storage Node"
+   participant SpendingService as "Spending Service"
+
+   MagicFolder -> TahoeLAFS : store some data
+   activate MagicFolder
+
+   TahoeLAFS -> ZKAPAuthorizer : store some data
+   activate TahoeLAFS
+
+   loop until tokens accepted
+       ZKAPAuthorizer <- ZKAPAuthzDB : load some tokens
+       ZKAPAuthorizer -> StorageNode : store some data using these tokens
+       StorageNode -> SpendingService : spend these tokens
+
+       alt spent tokens
+           SpendingService -> StorageNode: already spent, rejected
+           StorageNode -> ZKAPAuthorizer: already spent, rejected
+       else fresh tokens
+           SpendingService -> StorageNode: spent, allowed
+           StorageNode -> ZKAPAuthorizer: data stored
+           ZKAPAuthorizer -> ZKAPAuthzDB: discard spent tokens
+       end
+
+       ZKAPAuthorizer -> TahoeLAFS: data stored
+       deactivate TahoeLAFS
+       TahoeLAFS -> MagicFolder: data stored
+       deactivate MagicFolder
+   end
 
 .. include::
       ../../../morph/grid/local/README.rst
 
 .. _Nix: https://nixos.org/nix
-
diff --git a/docs/source/dev/architecture-overview.dot b/docs/source/dev/architecture-overview.dot
index cc95fbb7..925305b5 100644
--- a/docs/source/dev/architecture-overview.dot
+++ b/docs/source/dev/architecture-overview.dot
@@ -6,23 +6,34 @@ digraph subscriptions {
                 rankdir=LR
                 GridSync                 [label="GridSync",                          shape=circle]
                 Browser                  [label="Browser",                           shape=circle]
-                TahoeLAFS                [label="Tahoe-LAFS",                        shape=circle]
+                ZKAPAuthorizer           [label="ZKAPAuthorizer",                    shape=circle]
         }
 
-
         subgraph cluster_pscontrolled {
                 label = "PrivateStorage.io Operated"
                 rankdir = TB
                 PSWebServer              [label="PrivateStorage.io Web Server",      shape=box]
                 SubscriptionConfigWHPeer [label="Subscription Config Wormhole Peer", shape=box]
                 PaymentServer            [label="Payment Server",                    shape=box]
-                SATIssuer                [label="SAT Issuer",                        shape=box]
                 PSStorageGrid            [label="PrivateStorage.io Storage Grid",    shape=box]
         }
 
         User                     [label="User",                              shape=egg]
         Stripe                   [label="Stripe",                            shape=pentagon]
 
+	User                     -> GridSync                 [label="1. Initiate ZKAP Purchase",  fontcolor=red, color=red]
+	GridSync                 -> GridSync                 [label="2. Generate random voucher", fontcolor=blue, color=blue]
+	GridSync                 -> ZKAPAuthorizer           [label="3. Redeem voucher",          fontcolor=brown, color=brown]
+
+        GridSync                 -> Browser                  [label="4. Open payment window",     fontcolor=gold3, color=gold3]
+        User                     -> Browser                  [label="5. Enter payment info",      fontcolor=blue, color=blue]
+        Browser                  -> Stripe                   [label="6. Submit payment form",     fontcolor=brown, color=brown]
+        Stripe                   -> Browser                  [label="7. Payment ok",              fontcolor=black, color=black]
+        Stripe                   -> PaymentServer            [label="8. Payment notification",    fontcolor=magenta, color=magenta]
+
+	ZKAPAuthorizer           -> PaymentServer            [label="9. Redeem voucher",          ]
+
+
         User                     -> PSWebServer              [label="1. Get wormhole code",    fontcolor=red, color=red]
         PSWebServer              -> User                     [label="2. 7-petulant-banana",    fontcolor=blue, color=blue]
         User                     -> GridSync                 [label="3. 7-petulant-banana",    fontcolor=brown, color=brown]
diff --git a/privatestorageio.nix b/privatestorageio.nix
deleted file mode 100644
index cde46b16..00000000
--- a/privatestorageio.nix
+++ /dev/null
@@ -1,19 +0,0 @@
-{ stdenv, lib, graphviz, python3Packages }:
-stdenv.mkDerivation rec {
-  version = "0.0";
-  name = "privatestorageio-${version}";
-  src = lib.cleanSource ./.;
-
-  depsBuildBuild = [
-    graphviz
-  ];
-
-  buildPhase = ''
-  ${python3Packages.sphinx}/bin/sphinx-build -W docs/source docs/build
-  '';
-
-  installPhase = ''
-  mkdir $out
-  mv docs/build $out/docs
-  '';
-}
-- 
GitLab