(
self,
catalog: &impl SessionCatalog,
session: &dyn SessionMetadata,
resolved_ids: &ResolvedIds,
)
| 223 | } |
| 224 | |
| 225 | fn validate( |
| 226 | self, |
| 227 | catalog: &impl SessionCatalog, |
| 228 | session: &dyn SessionMetadata, |
| 229 | resolved_ids: &ResolvedIds, |
| 230 | ) -> Result<(), UnauthorizedError> { |
| 231 | // Obtain all roles that the current session is a member of. |
| 232 | let role_membership = |
| 233 | catalog.collect_role_membership(&session.role_metadata().current_role); |
| 234 | |
| 235 | check_usage(catalog, session, resolved_ids, self.item_usage)?; |
| 236 | |
| 237 | // Validate that the current session has the required role membership to execute the provided |
| 238 | // plan. |
| 239 | let unheld_membership: Vec<_> = self.role_membership.difference(&role_membership).collect(); |
| 240 | if !unheld_membership.is_empty() { |
| 241 | let role_names = unheld_membership |
| 242 | .into_iter() |
| 243 | .map(|role_id| { |
| 244 | // Some role references may no longer exist due to concurrent drops. |
| 245 | catalog |
| 246 | .try_get_role(role_id) |
| 247 | .map(|role| role.name().to_string()) |
| 248 | .unwrap_or_else(|| role_id.to_string()) |
| 249 | }) |
| 250 | .collect(); |
| 251 | return Err(UnauthorizedError::RoleMembership { role_names }); |
| 252 | } |
| 253 | |
| 254 | // Validate that the current session has the required object ownership to execute the provided |
| 255 | // plan. |
| 256 | let unheld_ownership = self |
| 257 | .ownership |
| 258 | .into_iter() |
| 259 | .filter(|ownership| !check_owner_roles(ownership, &role_membership, catalog)) |
| 260 | .collect(); |
| 261 | ownership_err(unheld_ownership, catalog)?; |
| 262 | |
| 263 | check_object_privileges( |
| 264 | catalog, |
| 265 | self.privileges, |
| 266 | role_membership, |
| 267 | session.role_metadata().current_role, |
| 268 | )?; |
| 269 | |
| 270 | if let Some(action) = self.superuser_action { |
| 271 | return Err(UnauthorizedError::Superuser { action }); |
| 272 | } |
| 273 | |
| 274 | Ok(()) |
| 275 | } |
| 276 | |
| 277 | fn filter_to_mandatory_requirements(self) -> RbacRequirements { |
| 278 | let RbacRequirements { |
no test coverage detected