Add a new module to handle build server token seeds

The intent with these tokens is for them to be provided when build events are
submitted, preventing unauthorised submission of build events.

It should be possible to make the database public, so it shouldn't contain any
secret information. To have secret tokens that aren't in the database, store a
token seed, and combine this with some secret data to compute the secret.
This commit is contained in:
Christopher Baines 2019-11-23 11:33:04 +00:00
parent 9a3dbb1d5b
commit 79d85f5847

View file

@ -0,0 +1,36 @@
(define-module (guix-data-service model build-server-token-seed)
#:use-module (ice-9 match)
#:use-module (rnrs bytevectors)
#:use-module (squee)
#:use-module (gcrypt hash)
#:use-module (gcrypt base64)
#:export (compute-tokens-for-build-server))
(define (compute-token secret-key-base build-server-id token-seed)
(let ((source-string
(simple-format #f "~A:~A:~A"
secret-key-base
build-server-id
token-seed)))
(base64-encode
(bytevector-hash
(string->utf8 source-string)
(hash-algorithm sha1)))))
(define (compute-tokens-for-build-server conn secret-key-base build-server-id)
(define query
"
SELECT token_seed
FROM build_server_token_seeds
WHERE build_server_id = $1
ORDER BY token_seed")
(map
(match-lambda
((token-seed)
(cons token-seed
(compute-token secret-key-base
build-server-id
token-seed))))
(exec-query conn query (list (number->string build-server-id)))))