hasRole('super_admin')) { return true; } // Org admin in any organisation. Controllers in sessions 2/3 // restrict the result set per role. return $user->organisations() ->wherePivot('role', 'org_admin') ->exists(); } public function view(User $user, FormSubmissionActionFailure $failure): bool { return $this->canAccess($user, $failure); } public function retry(User $user, FormSubmissionActionFailure $failure): bool { return $this->canAccess($user, $failure); } public function resolve(User $user, FormSubmissionActionFailure $failure): bool { return $this->canAccess($user, $failure); } public function dismiss(User $user, FormSubmissionActionFailure $failure): bool { return $this->canAccess($user, $failure); } private function canAccess(User $user, FormSubmissionActionFailure $failure): bool { $failure->loadMissing('submission'); $submission = $failure->submission; if ($submission === null) { return false; // parent submission deleted } $orgId = (string) $submission->organisation_id; if ($orgId === '') { return false; } if ($user->hasRole('super_admin')) { return true; } // Tenant scope: user must be an org_admin in the failure's // organisation. RFC V3 — IDOR-class FK-chain enforcement. $organisation = $submission->organisation; if (! $organisation instanceof Organisation) { return false; } return $organisation->users() ->where('user_id', $user->id) ->wherePivot('role', 'org_admin') ->exists(); } }