blob: 3a9c19b7cbd2eb2dc245b6742356a220f74d714b [file] [log] [blame]
lb5tr716ecf62019-08-05 17:33:29 -07001package model
2
3import (
4 "context"
5 "database/sql"
6 "encoding/hex"
7 "errors"
8 "fmt"
9 "time"
10)
11
12var ErrKeyNotFound = errors.New("key not found in cache")
13
14func (s *sqlModel) GetKey(ctx context.Context, keyID []byte) (*PgpKey, error) {
15 q := `
16 SELECT fingerprint, okay, key_data
17 FROM pgp_keys
18 WHERE fingerprint = $1
19 LIMIT 1
20 `
21 data := sqlPGPKey{}
22 err := s.db.Get(&data, q, hex.EncodeToString(keyID))
23
24 if err == sql.ErrNoRows {
25 return nil, ErrKeyNotFound
26 }
27
28 if err != nil {
29 return nil, err
30 }
31
32 fp, err := hex.DecodeString(data.Fingerprint)
33 if err != nil {
34 return nil, fmt.Errorf("data corruption: could not decode fingerprint")
35 }
36
37 kd, err := hex.DecodeString(data.KeyData)
38 if err != nil {
39 return nil, fmt.Errorf("data corruption: could not decode keydata")
40 }
41
42 key := PgpKey{
43 Fingerprint: fp,
44 KeyData: kd,
45 Okay: data.Okay,
46 }
47
48 return &key, err
49}
50
51func (s *sqlModel) PutKey(ctx context.Context, key *PgpKey) error {
52 q := `
53 INSERT INTO pgp_keys
54 (fingerprint, time_created, okay, key_data)
55 VALUES
56 (:fingerprint, :time_created, :okay, :key_data)
57 ON CONFLICT (fingerprint)
58 DO UPDATE SET
59 fingerprint = :fingerprint,
60 time_created = :time_created,
61 key_data = :key_data,
62 okay = :okay
63 WHERE pgp_keys.okay = FALSE
64 `
65
66 keyData := []byte{}
67 if key.KeyData != nil {
68 keyData = key.KeyData
69 }
70
71 data := &sqlPGPKey{
72 Fingerprint: hex.EncodeToString(key.Fingerprint),
73 KeyData: hex.EncodeToString(keyData),
74 TimeCreated: time.Now().UnixNano(),
75 Okay: key.Okay,
76 }
77
78 if _, err := s.db.NamedExecContext(ctx, q, data); err != nil {
79 return fmt.Errorf("INSERT pgp_keys: %v", err)
80 }
81
82 return nil
83}