blob: 3a9c19b7cbd2eb2dc245b6742356a220f74d714b [file] [log] [blame]
package model
import (
"context"
"database/sql"
"encoding/hex"
"errors"
"fmt"
"time"
)
var ErrKeyNotFound = errors.New("key not found in cache")
func (s *sqlModel) GetKey(ctx context.Context, keyID []byte) (*PgpKey, error) {
q := `
SELECT fingerprint, okay, key_data
FROM pgp_keys
WHERE fingerprint = $1
LIMIT 1
`
data := sqlPGPKey{}
err := s.db.Get(&data, q, hex.EncodeToString(keyID))
if err == sql.ErrNoRows {
return nil, ErrKeyNotFound
}
if err != nil {
return nil, err
}
fp, err := hex.DecodeString(data.Fingerprint)
if err != nil {
return nil, fmt.Errorf("data corruption: could not decode fingerprint")
}
kd, err := hex.DecodeString(data.KeyData)
if err != nil {
return nil, fmt.Errorf("data corruption: could not decode keydata")
}
key := PgpKey{
Fingerprint: fp,
KeyData: kd,
Okay: data.Okay,
}
return &key, err
}
func (s *sqlModel) PutKey(ctx context.Context, key *PgpKey) error {
q := `
INSERT INTO pgp_keys
(fingerprint, time_created, okay, key_data)
VALUES
(:fingerprint, :time_created, :okay, :key_data)
ON CONFLICT (fingerprint)
DO UPDATE SET
fingerprint = :fingerprint,
time_created = :time_created,
key_data = :key_data,
okay = :okay
WHERE pgp_keys.okay = FALSE
`
keyData := []byte{}
if key.KeyData != nil {
keyData = key.KeyData
}
data := &sqlPGPKey{
Fingerprint: hex.EncodeToString(key.Fingerprint),
KeyData: hex.EncodeToString(keyData),
TimeCreated: time.Now().UnixNano(),
Okay: key.Okay,
}
if _, err := s.db.NamedExecContext(ctx, q, data); err != nil {
return fmt.Errorf("INSERT pgp_keys: %v", err)
}
return nil
}