MCPcopy Create free account
hub / github.com/MaterializeInc/materialize / check_object_privileges

Function check_object_privileges

src/sql/src/rbac.rs:1827–1869  ·  view source on GitHub ↗
(
    catalog: &impl SessionCatalog,
    privileges: Vec<(SystemObjectId, AclMode, RoleId)>,
    role_membership: BTreeSet<RoleId>,
    current_role_id: RoleId,
)

Source from the content-addressed store, hash-verified

1825}
1826
1827fn 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
1871pub const fn all_object_privileges(object_type: SystemObjectType) -> AclMode {
1872 const TABLE_ACL_MODE: AclMode = AclMode::INSERT

Callers 2

validateMethod · 0.85
check_usageFunction · 0.85

Calls 15

expectMethod · 0.80
foldMethod · 0.80
to_error_stringMethod · 0.80
insertMethod · 0.45
entryMethod · 0.45
get_privilegesMethod · 0.45
mapMethod · 0.45
flat_mapMethod · 0.45
iterMethod · 0.45
unionMethod · 0.45

Tested by

no test coverage detected