. /** * ActivityPub implementation for GNU social * * @package GNUsocial * @author Diogo Cordeiro * @copyright 2018-2019 Free Software Foundation, Inc http://www.fsf.org * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later * @link http://www.gnu.org/software/social/ */ defined('GNUSOCIAL') || die(); /** * Inbox Request Handler * * @category Plugin * @package GNUsocial * @author Diogo Cordeiro * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ class apActorOutboxAction extends ManagedAction { protected $needLogin = false; protected $canPost = true; /** * Handle the Outbox request * * @author Daniel Supernault */ protected function handle() { try { $profile = Profile::getByID($this->trimmed('id')); $profile_id = $profile->getID(); } catch (Exception $e) { ActivityPubReturn::error('Invalid Actor URI.', 404); } if (!$profile->isLocal()) { ActivityPubReturn::error("This is not a local user.", 403); } if (!isset($_GET["page"])) { $page = 0; } else { $page = intval($this->trimmed('page')); } if ($page < 0) { ActivityPubReturn::error('Invalid page number.'); } $since = ($page - 1) * PROFILES_PER_MINILIST; $limit = (($page - 1) == 0 ? 1 : $page) * PROFILES_PER_MINILIST; /* Calculate total items */ $total_notes = $profile->noticeCount(); $total_pages = ceil($total_notes / PROFILES_PER_MINILIST); $res = [ '@context' => [ "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1", ], 'id' => common_local_url('apActorOutbox', ['id' => $profile_id]).(($page != 0) ? '?page='.$page : ''), 'type' => ($page == 0 ? 'OrderedCollection' : 'OrderedCollectionPage'), 'totalItems' => $total_notes ]; if ($page == 0) { $res['first'] = common_local_url('apActorOutbox', ['id' => $profile_id]).'?page=1'; } else { $res['orderedItems'] = $this->generate_outbox($profile); $res['partOf'] = common_local_url('apActorOutbox', ['id' => $profile_id]); if ($page+1 < $total_pages) { $res['next'] = common_local_url('apActorOutbox', ['id' => $profile_id]).'page='.($page+1 == 1 ? 2 : $page+1); } if ($page > 1) { $res['prev'] = common_local_url('apActorOutbox', ['id' => $profile_id]).'?page='.($page-1 <= 0 ? 1 : $page-1); } } ActivityPubReturn::answer($res); } /** * Generates a list of people following given profile. * * @param Profile $profile * @return array of Notices * @throws EmptyPkeyValueException * @throws InvalidUrlException * @throws ServerException * @author Daniel Supernault */ public function generate_outbox($profile) { /* Fetch Notices */ $notices = []; $notice = $profile->getNotices(); while ($notice->fetch()) { $note = $notice; // TODO: Handle other types if ($note->object_type == 'http://activitystrea.ms/schema/1.0/note') { $notices[] = Activitypub_create::create_to_array( $note->getProfile()->getUri(), common_local_url('apNotice', ['id' => $note->getID()]), Activitypub_notice::notice_to_array($note) ); } } return $notices; } }