Checks if a `session` is authorized to use `resolved_ids`. If not, an error is returned.
(
catalog: &impl SessionCatalog,
session: &dyn SessionMetadata,
resolved_ids: &ResolvedIds,
item_types: &BTreeSet<CatalogItemType>,
)
| 354 | |
| 355 | /// Checks if a `session` is authorized to use `resolved_ids`. If not, an error is returned. |
| 356 | pub fn check_usage( |
| 357 | catalog: &impl SessionCatalog, |
| 358 | session: &dyn SessionMetadata, |
| 359 | resolved_ids: &ResolvedIds, |
| 360 | item_types: &BTreeSet<CatalogItemType>, |
| 361 | ) -> Result<(), UnauthorizedError> { |
| 362 | rbac_check_preamble(catalog, session)?; |
| 363 | |
| 364 | // See: doc/developer/design/20260508_restrict_to_user_objects.md |
| 365 | check_restrict_to_user_objects(catalog, session, resolved_ids)?; |
| 366 | |
| 367 | // Obtain all roles that the current session is a member of. |
| 368 | let role_membership = catalog.collect_role_membership(&session.role_metadata().current_role); |
| 369 | |
| 370 | // Certain statements depend on objects that haven't been created yet, like sub-sources, so we |
| 371 | // need to filter those out. |
| 372 | let existing_resolved_ids = |
| 373 | resolved_ids.retain_items(|item_id| catalog.try_get_item(item_id).is_some()); |
| 374 | |
| 375 | let required_privileges = generate_usage_privileges( |
| 376 | catalog, |
| 377 | &existing_resolved_ids, |
| 378 | session.role_metadata().current_role, |
| 379 | item_types, |
| 380 | ) |
| 381 | .into_iter() |
| 382 | .collect(); |
| 383 | |
| 384 | let mut rbac_requirements = RbacRequirements::empty(); |
| 385 | rbac_requirements.privileges = required_privileges; |
| 386 | let rbac_requirements = filter_requirements(catalog, session, rbac_requirements); |
| 387 | let required_privileges = rbac_requirements.privileges; |
| 388 | |
| 389 | check_object_privileges( |
| 390 | catalog, |
| 391 | required_privileges, |
| 392 | role_membership, |
| 393 | session.role_metadata().current_role, |
| 394 | )?; |
| 395 | |
| 396 | Ok(()) |
| 397 | } |
| 398 | |
| 399 | /// Checks if a session is authorized to execute a plan. If not, an error is returned. |
| 400 | /// |
no test coverage detected