57 lines
1.8 KiB
Go
57 lines
1.8 KiB
Go
package alerts
|
|
|
|
import (
|
|
"context"
|
|
"crypto/ed25519"
|
|
"crypto/rand"
|
|
"linkport/internal/model"
|
|
"testing"
|
|
"time"
|
|
|
|
"golang.org/x/crypto/ssh"
|
|
)
|
|
|
|
func TestAssetCertificateAlertsRecoverAfterRenewal(t *testing.T) {
|
|
s := fixtureStore(t)
|
|
now := time.Now().UTC().Truncate(time.Second)
|
|
_, key, err := ed25519.GenerateKey(rand.Reader)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
signer, _ := ssh.NewSignerFromKey(key)
|
|
asset := model.Asset{ID: "cert", Name: "secret-name-not-for-webhooks", Type: "ssh_certificate"}
|
|
content := func(expiry time.Time) string {
|
|
cert := &ssh.Certificate{Key: signer.PublicKey(), CertType: ssh.UserCert, KeyId: "secret-subject-not-for-webhooks", ValidAfter: uint64(now.Add(-time.Hour).Unix()), ValidBefore: uint64(expiry.Unix())}
|
|
if err := cert.SignCert(rand.Reader, signer); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return string(ssh.MarshalAuthorizedKey(cert))
|
|
}
|
|
asset.Content = content(now.Add(-time.Minute))
|
|
if err = s.SaveAsset(asset); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
e := New(s, &fixtureSource{})
|
|
if err = e.check(context.Background(), now); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
items, err := s.Alerts()
|
|
if err != nil || len(items) != 1 || items[0].Kind != "certificate_expired" || items[0].ResourceID != "cert" || items[0].Status != "active" {
|
|
t.Fatalf("asset alert missing: %+v %v", items, err)
|
|
}
|
|
if items[0].Message != "Asset certificate has expired; upload a renewed certificate" {
|
|
t.Fatal("unexpected sensitive alert detail")
|
|
}
|
|
asset.Content = content(now.Add(90 * 24 * time.Hour))
|
|
if err = s.SaveAsset(asset); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err = e.check(context.Background(), now.Add(time.Second)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
items, err = s.Alerts()
|
|
if err != nil || len(items) != 1 || items[0].Status != "resolved" {
|
|
t.Fatalf("renewed alert did not recover %+v %v", items, err)
|
|
}
|
|
}
|