internal/store/revoke_test.go
107 lines · 2746 bytes
5 symbols in this file
1package store
2
3import (
4 "slices"
5 "testing"
6)
7
8func revokeFixture(t *testing.T) (*Store, int64, *[]Revoked) {
9 t.Helper()
10 s := open(t)
11 if err := s.MigrateUp(); err != nil {
12 t.Fatal(err)
13 }
14 uid, err := s.CreateUser("alice", false)
15 if err != nil {
16 t.Fatal(err)
17 }
18 var got []Revoked
19 s.OnRevoke(func(r Revoked) { got = append(got, r) })
20 return s, uid, &got
21}
22
23func keyID(t *testing.T, s *Store, fp string) int64 {
24 t.Helper()
25 k, err := s.SSHKeyByFingerprint(fp)
26 if err != nil {
27 t.Fatal(err)
28 }
29 return k.ID
30}
31
32func TestRemovalsAnnounceTheirKeys(t *testing.T) {
33 s, uid, got := revokeFixture(t)
34 if err := s.AddSSHKey(uid, "SHA256:a", "ssh-ed25519", []byte("a"), "full", ""); err != nil {
35 t.Fatal(err)
36 }
37 if err := s.AddSSHKey(uid, "SHA256:d", "ssh-ed25519", []byte("d"), "deploy:7:ro", ""); err != nil {
38 t.Fatal(err)
39 }
40 a, d := keyID(t, s, "SHA256:a"), keyID(t, s, "SHA256:d")
41
42 if err := s.RemoveSSHKey(uid, "SHA256:a"); err != nil {
43 t.Fatal(err)
44 }
45 if err := s.RemoveDeployKey(7, "SHA256:d"); err != nil {
46 t.Fatal(err)
47 }
48 if err := s.SetUserDisabled(uid, true); err != nil {
49 t.Fatal(err)
50 }
51 if err := s.SetUserDisabled(uid, false); err != nil {
52 t.Fatal(err)
53 }
54 want := []Revoked{{KeyIDs: []int64{a}}, {KeyIDs: []int64{d}}, {UserID: uid}}
55 if !slices.EqualFunc(*got, want, func(x, y Revoked) bool {
56 return slices.Equal(x.KeyIDs, y.KeyIDs) && x.UserID == y.UserID
57 }) {
58 t.Fatalf("announced %+v, want %+v (enabling announces nothing)", *got, want)
59 }
60 // A removal that found nothing announces nothing.
61 if err := s.RemoveSSHKey(uid, "SHA256:a"); err != ErrNotFound {
62 t.Fatalf("second remove: %v", err)
63 }
64 if len(*got) != 3 {
65 t.Fatalf("a miss was announced: %+v", *got)
66 }
67}
68
69func TestDeleteUserAnnounces(t *testing.T) {
70 s, uid, got := revokeFixture(t)
71 if err := s.DeleteUser(uid); err != nil {
72 t.Fatal(err)
73 }
74 if len(*got) != 1 || (*got)[0].UserID != uid {
75 t.Fatalf("announced %+v", *got)
76 }
77}
78
79func TestLiveSSHKeys(t *testing.T) {
80 s, uid, _ := revokeFixture(t)
81 bob, err := s.CreateUser("bob", false)
82 if err != nil {
83 t.Fatal(err)
84 }
85 for _, k := range []struct {
86 uid int64
87 fp string
88 }{{uid, "SHA256:a"}, {bob, "SHA256:b"}} {
89 if err := s.AddSSHKey(k.uid, k.fp, "ssh-ed25519", []byte(k.fp), "full", ""); err != nil {
90 t.Fatal(err)
91 }
92 }
93 a, b := keyID(t, s, "SHA256:a"), keyID(t, s, "SHA256:b")
94 if _, err := s.DB.Exec("UPDATE users SET disabled = 1 WHERE id = ?", bob); err != nil {
95 t.Fatal(err)
96 }
97 live, err := s.LiveSSHKeys([]int64{a, b, 999})
98 if err != nil {
99 t.Fatal(err)
100 }
101 if !live[a] || live[b] || live[999] {
102 t.Fatalf("live = %v; want only %d", live, a)
103 }
104 if live, err := s.LiveSSHKeys(nil); err != nil || len(live) != 0 {
105 t.Fatalf("no ids: %v %v", live, err)
106 }
107}