fix(web/panettone): Don't add extra padding when already padded

Because of math being upsetting, we were adding 4 padding characters to
an already-properly-padded base64 string, which broke tazjin.

This also breaks this function out into panettone.util, and adds a test
for it.

Change-Id: I7bc8a440ad9d0917272dd9f2e341081ea14693da
Reviewed-on: https://cl.tvl.fyi/c/depot/+/5782
Autosubmit: grfn <grfn@gws.fyi>
Reviewed-by: tazjin <tazjin@tvl.su>
Tested-by: BuildkiteCI
This commit is contained in:
Griffin Smith 2022-05-28 14:17:36 -04:00 committed by clbot
parent b39ca017c0
commit 1fbed8e317
5 changed files with 20 additions and 8 deletions

View file

@ -42,6 +42,7 @@ depot.nix.buildLisp.program {
./test/package.lisp
./test/model_test.lisp
./test/inline-markdown_test.lisp
./test/util_test.lisp
];
expression = "(fiveam:run!)";

View file

@ -78,12 +78,6 @@ the user, however email addresses are temporarily not available."
;; TODO(tazjin): Figure out actual displayName mapping in tokens.
:displayname username)))
(defun add-missing-base64-padding (s)
"Add any missing padding characters to the (un-padded) base64 string `S', such
that it can be successfully decoded by the `BASE64' package"
;; I apologize
(format nil "~A~v@{~A~:*~}" s (- 4 (mod (length s) 4)) "="))
(defun fetch-token (code)
"Fetches the access token on completion of user authentication through
the OAuth2 endpoint and returns the resulting user object."
@ -117,5 +111,5 @@ the OAuth2 endpoint and returns the resulting user object."
;; lisp base64 library doesn't know how to deal with
;; that - we need to add those extra padding
;; characters here.
(add-missing-base64-padding payload)))))
(panettone.util:add-missing-base64-padding payload)))))
(claims-to-user claims))))))

View file

@ -1,7 +1,7 @@
(defpackage panettone.util
(:use :cl :klatre)
(:import-from :alexandria :when-let)
(:export :integer-env))
(:export :integer-env :add-missing-base64-padding))
(defpackage panettone.css
(:use :cl :lass)

View file

@ -5,3 +5,11 @@
(when-let ((str (uiop:getenvp var)))
(try-parse-integer str))
default))
(defun add-missing-base64-padding (s)
"Add any missing padding characters to the (un-padded) base64 string `S', such
that it can be successfully decoded by the `BASE64' package"
;; I apologize
(let* ((needed-padding (mod (length s) 4))
(pad-chars (if (zerop needed-padding) 0 (- 4 needed-padding))))
(format nil "~A~v@{~A~:*~}" s pad-chars "=")))

View file

@ -0,0 +1,9 @@
(in-package :panettone.tests)
(declaim (optimize (safety 3)))
(test add-missing-base64-padding-test
(is (string=
"abcdef"
(base64:base64-string-to-string
(panettone.util:add-missing-base64-padding
"YWJjZGVm")))))