merge: admin-web H-02 audit

# Conflicts:
#	docs/DEVIATIONS.md
#	internal/admin/endpoints.go
This commit is contained in:
Nixevol
2026-09-30 15:39:20 +08:00
13 changed files with 650 additions and 130 deletions
+8 -5
View File
@@ -374,14 +374,16 @@ func TestEndpointResetPasswordKickFailureFallsBack(t *testing.T) {
t.Fatal(seedErr)
}
kick := &kickRecorder{}
var logBuf bytes.Buffer
var logBuf, auditBuf bytes.Buffer
logger := slog.New(slog.NewTextHandler(&logBuf, nil))
auditLog := slog.New(slog.NewTextHandler(&auditBuf, nil))
h := admin.New(admin.Deps{
DB: db,
Hash: hash,
Tokens: admin.NewRandomAPITokens(),
Locks: admin.NewMemoryLoginLocks(),
Logger: logger,
AuditLogger: auditLog,
KickEndpoint: kick.Kick,
PasswordResetKick: func(_ context.Context, _ string) (bool, error) {
return false, errors.New("fatal kick failed")
@@ -433,11 +435,12 @@ func TestEndpointResetPasswordKickFailureFallsBack(t *testing.T) {
t.Fatalf("want KickEndpoint fallback once, got %d", kick.count())
}
logs := logBuf.String()
if !strings.Contains(logs, "action=endpoint_reset_login_password") {
t.Fatalf("want reset password audit, logs=%s", logs)
auditLogs := auditBuf.String()
if !strings.Contains(auditLogs, "action=endpoint_reset_login_password") {
t.Fatalf("want reset password audit, logs=%s", auditLogs)
}
if !strings.Contains(logs, "result=ok_kick_failed") {
t.Fatalf("audit want ok_kick_failed, logs=%s", logs)
if !strings.Contains(auditLogs, "result=ok_kick_failed") {
t.Fatalf("audit want ok_kick_failed, logs=%s", auditLogs)
}
if !strings.Contains(logs, "password reset kick failed") || !strings.Contains(logs, "fatal kick failed") {
t.Fatalf("want error log for reset kick, logs=%s", logs)