(
catalog: &impl SessionCatalog,
privileges: Vec<(SystemObjectId, AclMode, RoleId)>,
role_membership: BTreeSet<RoleId>,
current_role_id: RoleId,
)
| 1825 | } |
| 1826 | |
| 1827 | fn check_object_privileges( |
| 1828 | catalog: &impl SessionCatalog, |
| 1829 | privileges: Vec<(SystemObjectId, AclMode, RoleId)>, |
| 1830 | role_membership: BTreeSet<RoleId>, |
| 1831 | current_role_id: RoleId, |
| 1832 | ) -> Result<(), UnauthorizedError> { |
| 1833 | let mut role_memberships: BTreeMap<RoleId, BTreeSet<RoleId>> = BTreeMap::new(); |
| 1834 | role_memberships.insert(current_role_id, role_membership); |
| 1835 | for (object_id, acl_mode, role_id) in privileges { |
| 1836 | // Temporary schemas are owned by the connection that created them, |
| 1837 | // so users implicitly have all privileges on their own temp schema. |
| 1838 | // The schema may not exist yet (lazy creation), so we skip the check. |
| 1839 | if matches!( |
| 1840 | &object_id, |
| 1841 | SystemObjectId::Object(ObjectId::Schema((_, SchemaSpecifier::Temporary))) |
| 1842 | ) { |
| 1843 | continue; |
| 1844 | } |
| 1845 | |
| 1846 | let role_membership = role_memberships |
| 1847 | .entry(role_id) |
| 1848 | .or_insert_with_key(|role_id| catalog.collect_role_membership(role_id)); |
| 1849 | let object_privileges = catalog |
| 1850 | .get_privileges(&object_id) |
| 1851 | .expect("only object types with privileges will generate required privileges"); |
| 1852 | let role_privileges = role_membership |
| 1853 | .iter() |
| 1854 | .flat_map(|role_id| object_privileges.get_acl_items_for_grantee(role_id)) |
| 1855 | .map(|mz_acl_item| mz_acl_item.acl_mode) |
| 1856 | .fold(AclMode::empty(), |accum, acl_mode| accum.union(acl_mode)); |
| 1857 | if !role_privileges.contains(acl_mode) { |
| 1858 | let role_name = catalog.get_role(&role_id).name().to_string(); |
| 1859 | let privileges = acl_mode.to_error_string(); |
| 1860 | return Err(UnauthorizedError::Privilege { |
| 1861 | object_description: ErrorMessageObjectDescription::from_sys_id(&object_id, catalog), |
| 1862 | role_name, |
| 1863 | privileges, |
| 1864 | }); |
| 1865 | } |
| 1866 | } |
| 1867 | |
| 1868 | Ok(()) |
| 1869 | } |
| 1870 | |
| 1871 | pub const fn all_object_privileges(object_type: SystemObjectType) -> AclMode { |
| 1872 | const TABLE_ACL_MODE: AclMode = AclMode::INSERT |
no test coverage detected