mirror of
https://github.com/J3vb/OwnCord.git
synced 2026-09-03 03:50:00 +03:00
feat(audit): route every LogAudit call through a best-effort WriteAudit helper
Audit writes stay best-effort — a LogAudit failure must never fail or abort the request — but a failed write must no longer be silently discarded. Add db.WriteAudit(auditor, actor, action, targetType, targetID, detail), which logs a failed write with actor/action/target context (never the detail string, which may be sensitive) and never propagates the error. The Auditor interface is satisfied structurally by both *db.DB and the service-layer Store, so api/admin/ws/service all reach the helper without an import cycle. Converts all ~26 call sites from `_ = LogAudit(...)` (and the two backup handlers' inline `if err` blocks) to db.WriteAudit. Pinned by db/audit_test.go: failure logged and not propagated, success logs nothing, detail never leaks. Resolves the repo-wide LogAudit policy question flagged by the D8 note. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -211,7 +211,7 @@ func handleRegister(database *db.DB) http.HandlerFunc {
|
||||
|
||||
ip := clientIP(r)
|
||||
slog.Info("user registered", "username", req.Username, "user_id", uid, "ip", ip)
|
||||
_ = database.LogAudit(uid, "user_register", "user", uid,
|
||||
db.WriteAudit(database, uid, "user_register", "user", uid,
|
||||
"new account created via invite")
|
||||
|
||||
// Issue session.
|
||||
@@ -350,7 +350,7 @@ func handleLogin(database *db.DB, limiter *auth.RateLimiter, partialStore *auth.
|
||||
|
||||
if auth.IsEffectivelyBanned(user) {
|
||||
slog.Warn("banned user login attempt", "username", user.Username, "user_id", user.ID, "ip", ip)
|
||||
_ = database.LogAudit(user.ID, "login_blocked_banned", "user", user.ID,
|
||||
db.WriteAudit(database, user.ID, "login_blocked_banned", "user", user.ID,
|
||||
"banned user attempted login from "+ip)
|
||||
writeJSON(w, http.StatusForbidden, errorResponse{
|
||||
Error: "FORBIDDEN",
|
||||
@@ -405,7 +405,7 @@ func handleLogin(database *db.DB, limiter *auth.RateLimiter, partialStore *auth.
|
||||
// would leave the user permanently "online" if they never open a WS
|
||||
// connection or if the client crashes before connecting.
|
||||
slog.Info("user logged in", "username", user.Username, "user_id", user.ID, "ip", ip)
|
||||
_ = database.LogAudit(user.ID, "user_login", "user", user.ID,
|
||||
db.WriteAudit(database, user.ID, "user_login", "user", user.ID,
|
||||
"logged in from "+ip)
|
||||
writeJSON(w, http.StatusOK, authSuccessResponse{
|
||||
Token: token,
|
||||
@@ -436,7 +436,7 @@ func handleLogout(database *db.DB) http.HandlerFunc {
|
||||
}
|
||||
|
||||
slog.Info("user logged out", "user_id", sess.UserID)
|
||||
_ = database.LogAudit(sess.UserID, "user_logout", "user", sess.UserID, "")
|
||||
db.WriteAudit(database, sess.UserID, "user_logout", "user", sess.UserID, "")
|
||||
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
}
|
||||
@@ -535,7 +535,7 @@ func handleDeleteAccount(database *db.DB, limiter *auth.RateLimiter) http.Handle
|
||||
|
||||
ip := clientIP(r)
|
||||
slog.Info("account deleted", "username", user.Username, "user_id", user.ID, "ip", ip)
|
||||
_ = database.LogAudit(user.ID, "account_deleted", "user", user.ID,
|
||||
db.WriteAudit(database, user.ID, "account_deleted", "user", user.ID,
|
||||
"account self-deleted from "+ip)
|
||||
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
|
||||
@@ -131,7 +131,7 @@ func handleVerifyTOTP(database *db.DB, partialStore *auth.PartialAuthStore, limi
|
||||
}
|
||||
|
||||
slog.Info("totp verified", "user_id", user.ID, "ip", challenge.IP)
|
||||
_ = database.LogAudit(user.ID, "totp_verified", "user", user.ID,
|
||||
db.WriteAudit(database, user.ID, "totp_verified", "user", user.ID,
|
||||
"two-factor verification completed from "+challenge.IP)
|
||||
|
||||
writeJSON(w, http.StatusOK, authSuccessResponse{
|
||||
@@ -296,7 +296,7 @@ func handleConfirmTOTP(database *db.DB, pendingStore *auth.PendingTOTPStore, use
|
||||
}
|
||||
|
||||
slog.Info("totp enabled", "user_id", user.ID)
|
||||
_ = database.LogAudit(user.ID, "totp_enabled", "user", user.ID,
|
||||
db.WriteAudit(database, user.ID, "totp_enabled", "user", user.ID,
|
||||
"two-factor authentication enrolled")
|
||||
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
@@ -379,7 +379,7 @@ func handleDisableTOTP(database *db.DB, pendingStore *auth.PendingTOTPStore, lim
|
||||
}
|
||||
|
||||
slog.Info("totp disabled", "user_id", user.ID)
|
||||
_ = database.LogAudit(user.ID, "totp_disabled", "user", user.ID,
|
||||
db.WriteAudit(database, user.ID, "totp_disabled", "user", user.ID,
|
||||
"two-factor authentication disabled")
|
||||
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
|
||||
Reference in New Issue
Block a user