aboutsummaryrefslogtreecommitdiff
path: root/guix-data-service/model/build-server-token-seed.scm
blob: 454425b1bf5b16ec120c352ca04c5fc2ef0c3399 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
(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)))
    (string-filter
     (base64-encode
      (bytevector-hash
       (string->utf8 source-string)
       (hash-algorithm sha1)))
     ;; Remove the + / and = to make handling the value easier
     char-set:letter+digit)))

(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)))))