use vibesql_storage::Database;
use crate::errors::ExecutorError;
pub struct PrivilegeChecker;
impl PrivilegeChecker {
pub fn check_select(db: &Database, table_name: &str) -> Result<(), ExecutorError> {
Self::check_privilege(db, table_name, &vibesql_ast::PrivilegeType::Select(None), "SELECT")
}
pub fn check_insert(db: &Database, table_name: &str) -> Result<(), ExecutorError> {
Self::check_privilege(db, table_name, &vibesql_ast::PrivilegeType::Insert(None), "INSERT")
}
pub fn check_update(db: &Database, table_name: &str) -> Result<(), ExecutorError> {
Self::check_privilege(db, table_name, &vibesql_ast::PrivilegeType::Update(None), "UPDATE")
}
pub fn check_delete(db: &Database, table_name: &str) -> Result<(), ExecutorError> {
Self::check_privilege(db, table_name, &vibesql_ast::PrivilegeType::Delete, "DELETE")
}
pub fn check_create(db: &Database, schema_name: &str) -> Result<(), ExecutorError> {
Self::check_privilege(db, schema_name, &vibesql_ast::PrivilegeType::Create, "CREATE")
}
pub fn check_drop(db: &Database, object_name: &str) -> Result<(), ExecutorError> {
Self::check_privilege(db, object_name, &vibesql_ast::PrivilegeType::Delete, "DROP")
}
pub fn check_alter(db: &Database, table_name: &str) -> Result<(), ExecutorError> {
Self::check_privilege(db, table_name, &vibesql_ast::PrivilegeType::Create, "ALTER")
}
fn check_privilege(
db: &Database,
object: &str,
privilege: &vibesql_ast::PrivilegeType,
privilege_name: &str,
) -> Result<(), ExecutorError> {
if !db.is_security_enabled() {
return Ok(());
}
let role = db.get_current_role();
if role == "ADMIN" || role == "DBA" {
return Ok(());
}
if db.catalog.has_privilege(&role, object, privilege) {
Ok(())
} else {
Err(ExecutorError::PermissionDenied {
role,
privilege: privilege_name.to_string(),
object: object.to_string(),
})
}
}
}