. // }}} /** * Base class for feed controllers * * @package GNUsocial * @category Controller * * @author Hugo Sales * @copyright 2021 Free Software Foundation, Inc http://www.fsf.org * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ namespace Component\Feed\Util; use App\Core\Controller; use App\Core\Event; use App\Core\Log; use App\Core\VisibilityScope; use App\Entity\Actor; use App\Util\Common; abstract class FeedController extends Controller { /** * Post-processing of the result of a feed controller, to remove any * notes or actors the user specified, as well as format the raw * list of notes into a usable format */ public static function postProcess(array $result): array { $actor = Common::actor(); if (\array_key_exists('notes', $result)) { $notes = $result['notes']; self::enforceScope($notes, $actor); Event::handle('FilterNoteList', [$actor, &$notes, $result['request']]); Event::handle('FormatNoteList', [$notes, &$result['notes']]); } return $result; } private static function enforceScope(array &$notes, ?Actor $actor): void { $filtered_notes = []; foreach ($notes as $note) { switch ($note->getScope()) { case VisibilityScope::LOCAL: // The controller handles it if private case VisibilityScope::PUBLIC: $filtered_notes[] = $note; break; case VisibilityScope::ADDRESSEE: // If the actor is logged in and if (!\is_null($actor) && ( // Is either the author Or $note->getActorId() == $actor->getId() // one of the targets || \in_array($actor->getId(), $note->getNotificationTargetIds()) )) { $filtered_notes[] = $note; } break; case VisibilityScope::GROUP: // Only for the group to see break; case VisibilityScope::COLLECTION: case VisibilityScope::MESSAGE: // Only for the collection to see (they will only find it in their notifications) break; default: Log::warning("Unknown scope found: {$note->getScope()}."); } } // Replace notes with filtered ones I/O $notes = $filtered_notes; } }