#[cfg(feature = "permission")]
use crate::access::PermissionAction;
#[cfg(feature = "permission")]
pub(super) fn audit_admin_bypass(role: &str, table: &str, operation: &PermissionAction) {
#[cfg(feature = "tracing")]
{
tracing::warn!(
target: "dbnexus.security.audit",
role = role,
table = table,
operation = ?operation,
"Admin role bypassed permission check (vuln-0001 audit)"
);
}
#[cfg(not(feature = "tracing"))]
{
eprintln!(
"[SECURITY AUDIT] Admin role '{}' bypassed permission check: operation={:?} table={}",
role, operation, table
);
}
}
pub fn warn_if_default_admin_role_used(admin_role: &str) -> bool {
if admin_role == "admin" {
#[cfg(feature = "tracing")]
{
tracing::warn!(
target: "dbnexus.security.audit",
admin_role = admin_role,
"Using default admin_role 'admin' is insecure (vuln-0001). \
Set a custom admin_role via DbConfig.admin_role or DbPoolBuilder::admin_role()."
);
}
#[cfg(not(feature = "tracing"))]
{
eprintln!(
"[SECURITY WARNING] Using default admin_role 'admin' is insecure. \
Set a custom admin_role via DbConfig.admin_role or DbPoolBuilder::admin_role()."
);
}
true
} else {
false
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_vuln_0001_warn_default_admin_role() {
assert!(
warn_if_default_admin_role_used("admin"),
"default admin_role 'admin' should trigger warning"
);
}
#[test]
fn test_vuln_0001_custom_admin_role_no_warning() {
assert!(
!warn_if_default_admin_role_used("super-admin-2026"),
"custom admin_role should not trigger warning"
);
}
#[cfg(feature = "permission")]
#[test]
fn test_vuln_0001_audit_admin_bypass_no_panic() {
audit_admin_bypass("admin", "users", &PermissionAction::Select);
audit_admin_bypass("admin", "users", &PermissionAction::Insert);
audit_admin_bypass("admin", "orders", &PermissionAction::Delete);
}
}