vibesql_executor/
privilege_checker.rs1use vibesql_storage::Database;
2
3use crate::errors::ExecutorError;
4
5pub struct PrivilegeChecker;
7
8impl PrivilegeChecker {
9 pub fn check_select(db: &Database, table_name: &str) -> Result<(), ExecutorError> {
11 Self::check_privilege(db, table_name, &vibesql_ast::PrivilegeType::Select(None), "SELECT")
12 }
13
14 pub fn check_insert(db: &Database, table_name: &str) -> Result<(), ExecutorError> {
16 Self::check_privilege(db, table_name, &vibesql_ast::PrivilegeType::Insert(None), "INSERT")
17 }
18
19 pub fn check_update(db: &Database, table_name: &str) -> Result<(), ExecutorError> {
21 Self::check_privilege(db, table_name, &vibesql_ast::PrivilegeType::Update(None), "UPDATE")
22 }
23
24 pub fn check_delete(db: &Database, table_name: &str) -> Result<(), ExecutorError> {
26 Self::check_privilege(db, table_name, &vibesql_ast::PrivilegeType::Delete, "DELETE")
27 }
28
29 pub fn check_create(db: &Database, schema_name: &str) -> Result<(), ExecutorError> {
31 Self::check_privilege(db, schema_name, &vibesql_ast::PrivilegeType::Create, "CREATE")
33 }
34
35 pub fn check_drop(db: &Database, object_name: &str) -> Result<(), ExecutorError> {
37 Self::check_privilege(db, object_name, &vibesql_ast::PrivilegeType::Delete, "DROP")
38 }
39
40 pub fn check_alter(db: &Database, table_name: &str) -> Result<(), ExecutorError> {
42 Self::check_privilege(db, table_name, &vibesql_ast::PrivilegeType::Create, "ALTER")
44 }
45
46 fn check_privilege(
48 db: &Database,
49 object: &str,
50 privilege: &vibesql_ast::PrivilegeType,
51 privilege_name: &str,
52 ) -> Result<(), ExecutorError> {
53 if !db.is_security_enabled() {
55 return Ok(());
56 }
57
58 let role = db.get_current_role();
59
60 if role == "ADMIN" || role == "DBA" {
62 return Ok(());
63 }
64
65 if db.catalog.has_privilege(&role, object, privilege) {
67 Ok(())
68 } else {
69 Err(ExecutorError::PermissionDenied {
70 role,
71 privilege: privilege_name.to_string(),
72 object: object.to_string(),
73 })
74 }
75 }
76}