internal/store/revoke_test.go

ba0a7d33f3a65ce53aafb074fda1682cf1cecfdf
gitbay/internal/store/revoke_test.go history · blame · raw

107 lines · 2746 bytes

  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}