package installer import ( "crypto/ed25519" "crypto/rand" "net" "strings" "testing" "golang.org/x/crypto/ssh" ) func TestFingerprintHostKeyCallback(t *testing.T) { _, privateKey, err := ed25519.GenerateKey(rand.Reader) if err != nil { t.Fatal(err) } publicKey, err := ssh.NewPublicKey(privateKey.Public()) if err != nil { t.Fatal(err) } callback, err := hostKeyCallback(SSHOptions{HostKeyFingerprint: ssh.FingerprintSHA256(publicKey)}) if err != nil { t.Fatal(err) } if err := callback("host", &net.TCPAddr{}, publicKey); err != nil { t.Fatalf("matching fingerprint rejected: %v", err) } callback, err = hostKeyCallback(SSHOptions{HostKeyFingerprint: "SHA256:wrong"}) if err != nil { t.Fatal(err) } if err := callback("host", &net.TCPAddr{}, publicKey); err == nil { t.Fatal("mismatched fingerprint accepted") } } func TestKnownHostsMissingFile(t *testing.T) { if _, err := hostKeyCallback(SSHOptions{KnownHostsFile: t.TempDir() + "/missing"}); err == nil { t.Fatal("missing known_hosts file accepted") } } func TestDeployRejectsMutableDockerImageBeforeConnecting(t *testing.T) { err := Deploy(DeployOptions{ SSHOptions: SSHOptions{ Host: "unreachable.example.test", User: "deploy", }, Token: "token", Docker: true, Image: "reg.rsxx.ru/rsmon/rsmon-worker:latest", }) if err == nil || !strings.Contains(err.Error(), "immutable") { t.Fatalf("Deploy() error = %v, want immutable image error", err) } }