Why: U7 account audit and identity gates advanced on main while U3 account initialization and recovery were in progress. Evidence: SELF merge-tree checks passed with go test ./... and isolated PostgreSQL store/server tests; exact-head replay follows. Impact: Preserve pending-account grants, proof-linked recovery, protected CLI delivery, account serialization, and atomic audit. Refs: IAM U3 r1; U7 PR #185
58 lines
1.9 KiB
Go
58 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
func TestLegacyUserCredentialCommandsStopBeforeOpeningStorage(t *testing.T) {
|
|
data := t.TempDir()
|
|
for _, args := range [][]string{
|
|
{"reset-password", "--data", data, "--owner", "victim", "--password", "attacker-password"},
|
|
{"issue-login-key", "--data", data, "--owner", "victim", "--purpose", "recover", "--revoke-all-credentials"},
|
|
} {
|
|
if code := runUser(args); code != 2 {
|
|
t.Fatalf("legacy command did not reject before storage: %v code=%d", args[0], code)
|
|
}
|
|
}
|
|
out := filepath.Join(data, "delivery.json")
|
|
if code := runUser([]string{"create", "--data", data, "--owner", "victim", "--password", "attacker-password", "--out", out}); code != 2 {
|
|
t.Fatalf("password-bearing local create accepted: %d", code)
|
|
}
|
|
if _, err := os.Stat(filepath.Join(data, "agent-system.db")); !os.IsNotExist(err) {
|
|
t.Fatalf("rejected commands opened/created a database: %v", err)
|
|
}
|
|
if _, err := os.Stat(out); !os.IsNotExist(err) {
|
|
t.Fatalf("rejected commands wrote a delivery file: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestCredentialDeliveryCreatesExclusive0600File(t *testing.T) {
|
|
dir := t.TempDir()
|
|
out := filepath.Join(dir, "credential.json")
|
|
if err := os.WriteFile(out, []byte("old"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := deliverCredential(out, "activation", "alice", "secret", nil); err == nil {
|
|
t.Fatal("existing permissive file was overwritten")
|
|
}
|
|
bytes, err := os.ReadFile(out)
|
|
if err != nil || string(bytes) != "old" {
|
|
t.Fatalf("existing file changed: %q %v", bytes, err)
|
|
}
|
|
out = filepath.Join(dir, "new.json")
|
|
if err := deliverCredential(out, "activation", "alice", "secret", nil); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
info, err := os.Stat(out)
|
|
if err != nil || info.Mode().Perm() != 0o600 {
|
|
t.Fatalf("delivery mode: %v %v", info, err)
|
|
}
|
|
bytes, err = os.ReadFile(out)
|
|
if err != nil || !strings.Contains(string(bytes), `"secret": "secret"`) {
|
|
t.Fatalf("delivery payload: %v", err)
|
|
}
|
|
}
|