Register hosts under Containers/VMs/Docker with encrypted key storage, and require re-authentication for sensitive account changes.
74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package settings
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestNodesAndNodeKeysRoundTrip(t *testing.T) {
|
|
dir := t.TempDir()
|
|
keyBytes := make([]byte, 32)
|
|
for index := range keyBytes {
|
|
keyBytes[index] = byte(index + 3)
|
|
}
|
|
t.Setenv(ConfigKeyEnvVar, base64.StdEncoding.EncodeToString(keyBytes))
|
|
|
|
store := NodeStore{
|
|
Nodes: []Node{
|
|
{
|
|
ID: "aaaaaaaa-bbbb-4ccc-8ddd-eeeeeeeeeeee",
|
|
Kind: NodeKindContainer,
|
|
Name: "ct1",
|
|
HostIP: "127.0.0.1",
|
|
Username: "clustercanvas",
|
|
GroupName: AdministratorsGroupName,
|
|
PublicKey: "ssh-ed25519 AAAA",
|
|
KeyAlgo: "ed25519",
|
|
CreatedAt: time.Now().UTC(),
|
|
},
|
|
},
|
|
}
|
|
if err := SaveNodes(dir, store); err != nil {
|
|
t.Fatalf("SaveNodes: %v", err)
|
|
}
|
|
loaded, err := LoadNodes(dir)
|
|
if err != nil {
|
|
t.Fatalf("LoadNodes: %v", err)
|
|
}
|
|
if len(loaded.Nodes) != 1 || loaded.Nodes[0].Name != "ct1" {
|
|
t.Fatalf("loaded = %+v", loaded)
|
|
}
|
|
|
|
keyStore := NodeKeyStore{
|
|
Keys: []NodeKeyEntry{
|
|
{
|
|
NodeID: loaded.Nodes[0].ID,
|
|
PrivateKey: "-----BEGIN OPENSSH PRIVATE KEY-----\ntest\n-----END OPENSSH PRIVATE KEY-----\n",
|
|
Algorithm: "ed25519",
|
|
KDFRounds: 100,
|
|
},
|
|
},
|
|
}
|
|
if err := SaveNodeKeys(dir, keyStore, keyBytes); err != nil {
|
|
t.Fatalf("SaveNodeKeys: %v", err)
|
|
}
|
|
loadedKeys, err := LoadNodeKeys(dir, keyBytes)
|
|
if err != nil {
|
|
t.Fatalf("LoadNodeKeys: %v", err)
|
|
}
|
|
if len(loadedKeys.Keys) != 1 || loadedKeys.Keys[0].KDFRounds != 100 {
|
|
t.Fatalf("keys = %+v", loadedKeys)
|
|
}
|
|
}
|
|
|
|
func TestLoadNodesOrEmptyMissing(t *testing.T) {
|
|
store, err := LoadNodesOrEmpty(t.TempDir())
|
|
if err != nil {
|
|
t.Fatalf("LoadNodesOrEmpty: %v", err)
|
|
}
|
|
if len(store.Nodes) != 0 {
|
|
t.Fatalf("expected empty, got %d", len(store.Nodes))
|
|
}
|
|
}
|