<?php
/**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
use Friendica\Content\Feature;
use Friendica\Content\Text\BBCode;
-use Friendica\Core\Cache\Duration;
+use Friendica\Core\Cache\Enum\Duration;
use Friendica\Core\Logger;
use Friendica\Core\Protocol;
use Friendica\Core\System;
use Friendica\Model\Item;
use Friendica\Model\Photo;
use Friendica\Model\Post;
-use Friendica\Model\Profile;
use Friendica\Model\Tag;
use Friendica\Model\User;
use Friendica\Network\HTTPException;
use Friendica\Protocol\Relay;
use Friendica\Util\DateTimeFormat;
use Friendica\Util\HTTPSignature;
-use Friendica\Util\JsonLD;
use Friendica\Util\LDSignature;
use Friendica\Util\Map;
use Friendica\Util\Network;
+use Friendica\Util\Strings;
use Friendica\Util\XML;
/**
*/
class Transmitter
{
+ const CACHEKEY_FEATURED = 'transmitter:getFeatured:';
+ const CACHEKEY_CONTACTS = 'transmitter:getContacts:';
+ const CACHEKEY_OUTBOX = 'transmitter:getOutbox:';
+
/**
* Add relay servers to the list of inboxes
*
/**
* Collects a list of contacts of the given owner
*
- * @param array $owner Owner array
- * @param int|array $rel The relevant value(s) contact.rel should match
- * @param string $module The name of the relevant AP endpoint module (followers|following)
- * @param integer $page Page number
+ * @param array $owner Owner array
+ * @param array $rel The relevant value(s) contact.rel should match
+ * @param string $module The name of the relevant AP endpoint module (followers|following)
+ * @param integer $page Page number
+ * @param string $requester URL of the requester
+ * @param boolean $nocache Wether to bypass caching
*
* @return array of owners
* @throws \Exception
*/
- public static function getContacts($owner, $rel, $module, $page = null)
+ public static function getContacts(array $owner, array $rel, string $module, int $page = null, string $requester = null, $nocache = false)
{
+ if (empty($page)) {
+ $cachekey = self::CACHEKEY_CONTACTS . $module . ':'. $owner['uid'];
+ $result = DI::cache()->get($cachekey);
+ if (!$nocache && !is_null($result)) {
+ return $result;
+ }
+ }
+
$parameters = [
'rel' => $rel,
'uid' => $owner['uid'],
$data['type'] = 'OrderedCollection';
$data['totalItems'] = $total;
+ if (!empty($page)) {
+ $data['id'] .= '?' . http_build_query(['page' => $page]);
+ }
+
// When we hide our friends we will only show the pure number but don't allow more.
- $profile = Profile::getByUID($owner['uid']);
- if (!empty($profile['hide-friends'])) {
+ $show_contacts = empty($owner['hide-friends']);
+
+ // Allow fetching the contact list when the requester is part of the list.
+ if (($owner['page-flags'] == User::PAGE_FLAGS_PRVGROUP) && !empty($requester)) {
+ $show_contacts = DBA::exists('contact', ['nurl' => Strings::normaliseLink($requester), 'uid' => $owner['uid'], 'blocked' => false]);
+ }
+
+ if (!$show_contacts) {
+ if (!empty($cachekey)) {
+ DI::cache()->set($cachekey, $data, Duration::DAY);
+ }
+
return $data;
}
}
DBA::close($contacts);
- if (!empty($list)) {
+ if (count($list) == 100) {
$data['next'] = DI::baseUrl() . $modulePath . $owner['nickname'] . '?page=' . ($page + 1);
}
$data['orderedItems'] = $list;
}
+ if (!empty($cachekey)) {
+ DI::cache()->set($cachekey, $data, Duration::DAY);
+ }
+
return $data;
}
* @param array $owner Owner array
* @param integer $page Page number
* @param string $requester URL of requesting account
+ * @param boolean $nocache Wether to bypass caching
*
* @return array of posts
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- public static function getOutbox($owner, $page = null, $requester = '')
+ public static function getOutbox(array $owner, int $page = null, string $requester = '', $nocache = false)
{
+ if (empty($page)) {
+ $cachekey = self::CACHEKEY_OUTBOX . $owner['uid'];
+ $result = DI::cache()->get($cachekey);
+ if (!$nocache && !is_null($result)) {
+ return $result;
+ }
+ }
+
$condition = ['private' => [Item::PUBLIC, Item::UNLISTED]];
if (!empty($requester)) {
$data['type'] = 'OrderedCollection';
$data['totalItems'] = $count;
+ if (!empty($page)) {
+ $data['id'] .= '?' . http_build_query(['page' => $page]);
+ }
+
if (empty($page)) {
$data['first'] = DI::baseUrl() . '/outbox/' . $owner['nickname'] . '?page=1';
} else {
}
DBA::close($items);
- if (!empty($list)) {
+ if (count($list) == 20) {
$data['next'] = DI::baseUrl() . '/outbox/' . $owner['nickname'] . '?page=' . ($page + 1);
}
$data['orderedItems'] = $list;
}
+ if (!empty($cachekey)) {
+ DI::cache()->set($cachekey, $data, Duration::DAY);
+ }
+
+ return $data;
+ }
+
+ /**
+ * Public posts for the given owner
+ *
+ * @param array $owner Owner array
+ * @param integer $page Page number
+ * @param boolean $nocache Wether to bypass caching
+ *
+ * @return array of posts
+ * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+ * @throws \ImagickException
+ */
+ public static function getFeatured(array $owner, int $page = null, $nocache = false)
+ {
+ if (empty($page)) {
+ $cachekey = self::CACHEKEY_FEATURED . $owner['uid'];
+ $result = DI::cache()->get($cachekey);
+ if (!$nocache && !is_null($result)) {
+ return $result;
+ }
+ }
+
+ $owner_cid = Contact::getIdForURL($owner['url'], 0, false);
+
+ $condition = ["`uri-id` IN (SELECT `uri-id` FROM `collection-view` WHERE `cid` = ? AND `type` = ?)",
+ $owner_cid, Post\Collection::FEATURED];
+
+ $condition = DBA::mergeConditions($condition,
+ ['uid' => $owner['uid'],
+ 'author-id' => $owner_cid,
+ 'private' => [Item::PUBLIC, Item::UNLISTED],
+ 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT],
+ 'network' => Protocol::FEDERATED,
+ 'parent-network' => Protocol::FEDERATED,
+ 'origin' => true,
+ 'deleted' => false,
+ 'visible' => true]);
+
+ $count = Post::count($condition);
+
+ $data = ['@context' => ActivityPub::CONTEXT];
+ $data['id'] = DI::baseUrl() . '/featured/' . $owner['nickname'];
+ $data['type'] = 'OrderedCollection';
+ $data['totalItems'] = $count;
+
+ if (!empty($page)) {
+ $data['id'] .= '?' . http_build_query(['page' => $page]);
+ }
+
+ if (empty($page)) {
+ $items = Post::select(['id'], $condition, ['limit' => 20, 'order' => ['created' => true]]);
+ } else {
+ $data['type'] = 'OrderedCollectionPage';
+ $items = Post::select(['id'], $condition, ['limit' => [($page - 1) * 20, 20], 'order' => ['created' => true]]);
+ }
+ $list = [];
+
+ while ($item = Post::fetch($items)) {
+ $activity = self::createActivityFromItem($item['id'], true);
+ $activity['type'] = $activity['type'] == 'Update' ? 'Create' : $activity['type'];
+
+ // Only list "Create" activity objects here, no reshares
+ if (!empty($activity['object']) && ($activity['type'] == 'Create')) {
+ $list[] = $activity['object'];
+ }
+ }
+ DBA::close($items);
+
+ if (count($list) == 20) {
+ $data['next'] = DI::baseUrl() . '/featured/' . $owner['nickname'] . '?page=' . ($page + 1);
+ }
+
+ if (!empty($page)) {
+ $data['partOf'] = DI::baseUrl() . '/featured/' . $owner['nickname'];
+ }
+
+ $data['orderedItems'] = $list;
+
+ if (!empty($cachekey)) {
+ DI::cache()->set($cachekey, $data, Duration::DAY);
+ }
+
return $data;
}
if ($uid != 0) {
$data['following'] = DI::baseUrl() . '/following/' . $owner['nick'];
$data['followers'] = DI::baseUrl() . '/followers/' . $owner['nick'];
- $data['inbox'] = DI::baseUrl() . '/inbox/' . $owner['nick'];
- $data['outbox'] = DI::baseUrl() . '/outbox/' . $owner['nick'];
+ $data['inbox'] = DI::baseUrl() . '/inbox/' . $owner['nick'];
+ $data['outbox'] = DI::baseUrl() . '/outbox/' . $owner['nick'];
+ $data['featured'] = DI::baseUrl() . '/featured/' . $owner['nick'];
} else {
$data['inbox'] = DI::baseUrl() . '/friendica/inbox';
}
}
/**
- * Returns an array with permissions of a given item array
+ * Returns an array with permissions of the thread parent of the given item array
*
* @param array $item
+ * @param bool $is_forum_thread
*
* @return array with permissions
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- private static function fetchPermissionBlockFromConversation($item)
+ private static function fetchPermissionBlockFromThreadParent(array $item, bool $is_forum_thread)
{
- if (empty($item['thr-parent'])) {
+ if (empty($item['thr-parent-id'])) {
return [];
}
- $condition = ['item-uri' => $item['thr-parent'], 'protocol' => Conversation::PARCEL_ACTIVITYPUB];
- $conversation = DBA::selectFirst('conversation', ['source'], $condition);
- if (!DBA::isResult($conversation)) {
+ $parent = Post::selectFirstPost(['author-link'], ['uri-id' => $item['thr-parent-id']]);
+ if (empty($parent)) {
return [];
}
- $activity = json_decode($conversation['source'], true);
+ $permissions = [
+ 'to' => [$parent['author-link']],
+ 'cc' => [],
+ 'bto' => [],
+ 'bcc' => [],
+ ];
- $actor = JsonLD::fetchElement($activity, 'actor', 'id');
- if (!empty($actor)) {
- $permissions['to'][] = $actor;
- $profile = APContact::getByURL($actor);
- } else {
- $profile = [];
- }
+ $parent_profile = APContact::getByURL($parent['author-link']);
$item_profile = APContact::getByURL($item['author-link']);
$exclude[] = $item['author-link'];
$exclude[] = $item['owner-link'];
}
- foreach (['to', 'cc', 'bto', 'bcc'] as $element) {
- if (empty($activity[$element])) {
- continue;
- }
- if (is_string($activity[$element])) {
- $activity[$element] = [$activity[$element]];
- }
-
- foreach ($activity[$element] as $receiver) {
- if (empty($receiver)) {
- continue;
- }
-
- if (!empty($profile['followers']) && $receiver == $profile['followers'] && !empty($item_profile['followers'])) {
- $permissions[$element][] = $item_profile['followers'];
- } elseif (!in_array($receiver, $exclude)) {
- $permissions[$element][] = $receiver;
+ $type = [Tag::TO => 'to', Tag::CC => 'cc', Tag::BTO => 'bto', Tag::BCC => 'bcc'];
+ foreach (Tag::getByURIId($item['thr-parent-id'], [Tag::TO, Tag::CC, Tag::BTO, Tag::BCC]) as $receiver) {
+ if (!empty($parent_profile['followers']) && $receiver['url'] == $parent_profile['followers'] && !empty($item_profile['followers'])) {
+ if (!$is_forum_thread) {
+ $permissions[$type[$receiver['type']]][] = $item_profile['followers'];
}
+ } elseif (!in_array($receiver['url'], $exclude)) {
+ $permissions[$type[$receiver['type']]][] = $receiver['url'];
}
}
+
return $permissions;
}
/**
* Creates an array of permissions from an item thread
*
- * @param array $item Item array
- * @param boolean $blindcopy addressing via "bcc" or "cc"?
- * @param integer $last_id Last item id for adding receivers
- * @param boolean $forum_mode "true" means that we are sending content to a forum
+ * @param array $item Item array
+ * @param boolean $blindcopy addressing via "bcc" or "cc"?
+ * @param integer $last_id Last item id for adding receivers
*
* @return array with permission data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- private static function createPermissionBlockForItem($item, $blindcopy, $last_id = 0, $forum_mode = false)
+ private static function createPermissionBlockForItem($item, $blindcopy, $last_id = 0)
{
if ($last_id == 0) {
$last_id = $item['id'];
}
$always_bcc = false;
+ $is_forum = false;
+ $follower = '';
// Check if we should always deliver our stuff via BCC
if (!empty($item['uid'])) {
- $profile = User::getOwnerDataById($item['uid']);
- if (!empty($profile)) {
- $always_bcc = $profile['hide-friends'];
+ $owner = User::getOwnerDataById($item['uid']);
+ if (!empty($owner)) {
+ $always_bcc = $owner['hide-friends'];
+ $is_forum = ($owner['account-type'] == User::ACCOUNT_TYPE_COMMUNITY) && $owner['manually-approve'];
+
+ $profile = APContact::getByURL($owner['url'], false);
+ $follower = $profile['followers'] ?? '';
}
}
$always_bcc = true;
}
+ $parent = Post::selectFirst(['causer-link', 'post-reason'], ['id' => $item['parent']]);
+ if (($parent['post-reason'] == Item::PR_ANNOUNCEMENT) && !empty($parent['causer-link'])) {
+ $profile = APContact::getByURL($parent['causer-link'], false);
+ $is_forum_thread = isset($profile['type']) && $profile['type'] == 'Group';
+ } else {
+ $is_forum_thread = false;
+ }
+
if (self::isAnnounce($item) || DI::config()->get('debug', 'total_ap_delivery') || self::isAPPost($last_id)) {
// Will be activated in a later step
$networks = Protocol::FEDERATED;
$data['cc'][] = $announce['actor']['url'];
}
- $data = array_merge($data, self::fetchPermissionBlockFromConversation($item));
+ $data = array_merge($data, self::fetchPermissionBlockFromThreadParent($item, $is_forum_thread));
// Check if the item is completely public or unlisted
if ($item['private'] == Item::PUBLIC) {
continue;
}
- if (!empty($profile = APContact::getByURL($contact['url'], false))) {
+ $profile = APContact::getByURL($term['url'], false);
+ if (!empty($profile)) {
+ if ($term['type'] == Tag::EXCLUSIVE_MENTION) {
+ $exclusive = true;
+ if (!empty($profile['followers']) && ($profile['type'] == 'Group')) {
+ $data['cc'][] = $profile['followers'];
+ }
+ }
$data['to'][] = $profile['url'];
}
}
}
- foreach ($receiver_list as $receiver) {
- $contact = DBA::selectFirst('contact', ['url', 'hidden', 'network', 'protocol', 'gsid'], ['id' => $receiver, 'network' => Protocol::FEDERATED]);
- if (!DBA::isResult($contact) || !self::isAPContact($contact, $networks)) {
- continue;
- }
+ if ($is_forum && !$exclusive && !empty($follower)) {
+ $data['cc'][] = $follower;
+ } elseif (!$exclusive) {
+ foreach ($receiver_list as $receiver) {
+ $contact = DBA::selectFirst('contact', ['url', 'hidden', 'network', 'protocol', 'gsid'], ['id' => $receiver, 'network' => Protocol::FEDERATED]);
+ if (!DBA::isResult($contact) || !self::isAPContact($contact, $networks)) {
+ continue;
+ }
- if (!empty($profile = APContact::getByURL($contact['url'], false))) {
- if ($contact['hidden'] || $always_bcc) {
- $data['bcc'][] = $profile['url'];
- } else {
- $data['cc'][] = $profile['url'];
+ if (!empty($profile = APContact::getByURL($contact['url'], false))) {
+ if ($contact['hidden'] || $always_bcc) {
+ $data['bcc'][] = $profile['url'];
+ } else {
+ $data['cc'][] = $profile['url'];
+ }
}
}
}
}
if (!empty($item['parent'])) {
- $parents = Post::select(['id', 'author-link', 'owner-link', 'gravity', 'uri'], ['parent' => $item['parent']]);
+ $parents = Post::select(['id', 'author-link', 'owner-link', 'gravity', 'uri'], ['parent' => $item['parent']], ['order' => ['id']]);
while ($parent = Post::fetch($parents)) {
if ($parent['gravity'] == GRAVITY_PARENT) {
$profile = APContact::getByURL($parent['owner-link'], false);
$data['to'][] = $profile['url'];
} else {
$data['cc'][] = $profile['url'];
- if (($item['private'] != Item::PRIVATE) && !empty($actor_profile['followers'])) {
+ if (($item['private'] != Item::PRIVATE) && !empty($actor_profile['followers'])&& !$is_forum_thread) {
$data['cc'][] = $actor_profile['followers'];
}
}
- } elseif (!$exclusive) {
+ } elseif (!$exclusive && !$is_forum_thread) {
// Public thread parent post always are directed to the followers.
- // This mustn't be done by posts that are directed to forum servers via the exclusive mention.
- // But possibly in that case we could add the "followers" collection of the forum to the message.
- if (($item['private'] != Item::PRIVATE) && !$forum_mode) {
+ if ($item['private'] != Item::PRIVATE) {
$data['cc'][] = $actor_profile['followers'];
}
}
unset($receivers['bcc']);
}
+ foreach (['to' => Tag::TO, 'cc' => Tag::CC, 'bcc' => Tag::BCC] as $element => $type) {
+ if (!empty($receivers[$element])) {
+ foreach ($receivers[$element] as $receiver) {
+ if ($receiver == ActivityPub::PUBLIC_COLLECTION) {
+ $name = Receiver::PUBLIC_COLLECTION;
+ } else {
+ $name = trim(parse_url($receiver, PHP_URL_PATH), '/');
+ }
+ Tag::store($item['uri-id'], $type, $name, $receiver);
+ }
+ }
+ }
+
return $receivers;
}
/**
* Fetches an array of inboxes for the given item and user
*
- * @param array $item Item array
- * @param integer $uid User ID
- * @param boolean $personal fetch personal inboxes
- * @param integer $last_id Last item id for adding receivers
- * @param boolean $forum_mode "true" means that we are sending content to a forum
+ * @param array $item Item array
+ * @param integer $uid User ID
+ * @param boolean $personal fetch personal inboxes
+ * @param integer $last_id Last item id for adding receivers
* @return array with inboxes
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException
*/
- public static function fetchTargetInboxes($item, $uid, $personal = false, $last_id = 0, $forum_mode = false)
+ public static function fetchTargetInboxes($item, $uid, $personal = false, $last_id = 0)
{
- $permissions = self::createPermissionBlockForItem($item, true, $last_id, $forum_mode);
+ $permissions = self::createPermissionBlockForItem($item, true, $last_id);
if (empty($permissions)) {
return [];
}
$mail['title'] = '';
}
+ $mail['content-warning'] = '';
$mail['author-link'] = $mail['owner-link'] = $mail['from-url'];
$mail['owner-id'] = $mail['author-id'];
$mail['allow_cid'] = '<'.$mail['contact-id'].'>';
return false;
}
- // In case of a forum post ensure to return the original post if author and forum are on the same machine
- if (($item['gravity'] == GRAVITY_PARENT) && !empty($item['forum_mode'])) {
- $author = Contact::getById($item['author-id'], ['nurl']);
- if (!empty($author['nurl'])) {
- $self = Contact::selectFirst(['uid'], ['nurl' => $author['nurl'], 'self' => true]);
- if (!empty($self['uid'])) {
- $forum_item = Post::selectFirst(Item::DELIVER_FIELDLIST, ['uri-id' => $item['uri-id'], 'uid' => $self['uid']]);
- if (DBA::isResult($forum_item)) {
- $item = $forum_item;
- }
- }
- }
- }
-
if (empty($item['uri-id'])) {
Logger::warning('Item without uri-id', ['item' => $item]);
return false;
if (in_array($data['type'], ['Create', 'Update', 'Delete'])) {
$data['object'] = $object ?? self::createNote($item);
+ $data['published'] = DateTimeFormat::utcNow(DateTimeFormat::ATOM);
} elseif ($data['type'] == 'Add') {
$data = self::createAddTag($item, $data);
} elseif ($data['type'] == 'Announce') {
$urls = [];
foreach ($uriids as $uriid) {
- foreach (Post\Media::getByURIId($uriid, [Post\Media::DOCUMENT, Post\Media::TORRENT]) as $attachment) {
- if (in_array($attachment['url'], $urls)) {
- continue;
- }
- $urls[] = $attachment['url'];
-
- $attach = ['type' => 'Document',
- 'mediaType' => $attachment['mimetype'],
- 'url' => $attachment['url'],
- 'name' => $attachment['description']];
-
- if (!empty($attachment['height'])) {
- $attach['height'] = $attachment['height'];
- }
-
- if (!empty($attachment['width'])) {
- $attach['width'] = $attachment['width'];
- }
-
- if (!empty($attachment['preview'])) {
- $attach['image'] = $attachment['preview'];
- }
-
- $attachments[] = $attach;
- }
- }
-
- if ($type != 'Note') {
- return $attachments;
- }
-
- foreach ($uriids as $uriid) {
- foreach (Post\Media::getByURIId($uriid, [Post\Media::AUDIO, Post\Media::IMAGE, Post\Media::VIDEO]) as $attachment) {
+ foreach (Post\Media::getByURIId($uriid, [Post\Media::AUDIO, Post\Media::IMAGE, Post\Media::VIDEO, Post\Media::DOCUMENT, Post\Media::TORRENT]) as $attachment) {
if (in_array($attachment['url'], $urls)) {
continue;
}
$attachments[] = $attach;
}
- // Currently deactivated, since it creates side effects on Mastodon and Pleroma.
- // It will be activated, once this cleared.
- /*
- foreach (Post\Media::getByURIId($uriid, [Post\Media::HTML]) as $attachment) {
- if (in_array($attachment['url'], $urls)) {
- continue;
- }
- $urls[] = $attachment['url'];
-
- $attachments[] = ['type' => 'Page',
- 'mediaType' => $attachment['mimetype'],
- 'url' => $attachment['url'],
- 'name' => $attachment['description']];
- }*/
}
return $attachments;
*/
private static function isSensitive($uri_id)
{
- return DBA::exists('tag-view', ['uri-id' => $uri_id, 'name' => 'nsfw']);
+ return DBA::exists('tag-view', ['uri-id' => $uri_id, 'name' => 'nsfw', 'type' => Tag::HASHTAG]);
}
/**
return [];
}
+ // We are treating posts differently when they are directed to a community.
+ // This is done to better support Lemmy. Most of the changes should work with other systems as well.
+ // But to not risk compatibility issues we currently perform the changes only for communities.
+ if ($item['gravity'] == GRAVITY_PARENT) {
+ $isCommunityPost = !empty(Tag::getByURIId($item['uri-id'], [Tag::EXCLUSIVE_MENTION]));
+ $links = Post\Media::getByURIId($item['uri-id'], [Post\Media::HTML]);
+ if ($isCommunityPost && (count($links) == 1)) {
+ $link = $links[0]['url'];
+ }
+ } else {
+ $isCommunityPost = false;
+ }
+
if ($item['event-type'] == 'event') {
$type = 'Event';
} elseif (!empty($item['title'])) {
- $type = 'Article';
+ if (!$isCommunityPost || empty($link)) {
+ $type = 'Article';
+ } else {
+ // "Page" is used by Lemmy for posts that contain an external link
+ $type = 'Page';
+ }
} else {
$type = 'Note';
}
$data['updated'] = DateTimeFormat::utc($item['edited'] . '+00:00', DateTimeFormat::ATOM);
}
- $data['url'] = $item['plink'];
+ $data['url'] = $link ?? $item['plink'];
$data['attributedTo'] = $item['author-link'];
$data['sensitive'] = self::isSensitive($item['uri-id']);
$data['context'] = self::fetchContextURLForItem($item);
if ($type == 'Event') {
$data = array_merge($data, self::createEvent($item));
} else {
+ if ($isCommunityPost) {
+ // For community posts we remove the visible "!user@domain.tld".
+ // This improves the look at systems like Lemmy.
+ // Also in the future we should control the community delivery via other methods.
+ $body = preg_replace("/!\[url\=[^\[\]]*\][^\[\]]*\[\/url\]/ism", '', $body);
+ }
+
+ if ($type == 'Page') {
+ // When we transmit "Page" posts we have to remove the attachment.
+ // The attachment contains the link that we already transmit in the "url" field.
+ $body = preg_replace("/\s*\[attachment .*?\].*?\[\/attachment\]\s*/ism", '', $body);
+ }
+
$body = BBCode::setMentionsToNicknames($body);
$data['content'] = BBCode::convertForUriId($item['uri-id'], $body, BBCode::ACTIVITYPUB);
$signed = LDSignature::sign($data, $owner);
- Logger::log('Deliver profile deletion for user ' . $uid . ' to ' . $inbox . ' via ActivityPub', Logger::DEBUG);
+ Logger::info('Deliver profile deletion for user ' . $uid . ' to ' . $inbox . ' via ActivityPub');
return HTTPSignature::transmit($signed, $inbox, $uid);
}
$signed = LDSignature::sign($data, $owner);
- Logger::log('Deliver profile relocation for user ' . $uid . ' to ' . $inbox . ' via ActivityPub', Logger::DEBUG);
+ Logger::info('Deliver profile relocation for user ' . $uid . ' to ' . $inbox . ' via ActivityPub');
return HTTPSignature::transmit($signed, $inbox, $uid);
}
$signed = LDSignature::sign($data, $owner);
- Logger::log('Deliver profile deletion for user ' . $uid . ' to ' . $inbox . ' via ActivityPub', Logger::DEBUG);
+ Logger::info('Deliver profile deletion for user ' . $uid . ' to ' . $inbox . ' via ActivityPub');
return HTTPSignature::transmit($signed, $inbox, $uid);
}
$signed = LDSignature::sign($data, $owner);
- Logger::log('Deliver profile update for user ' . $uid . ' to ' . $inbox . ' via ActivityPub', Logger::DEBUG);
+ Logger::info('Deliver profile update for user ' . $uid . ' to ' . $inbox . ' via ActivityPub');
return HTTPSignature::transmit($signed, $inbox, $uid);
}
'instrument' => self::getService(),
'to' => [$profile['url']]];
- Logger::log('Sending activity ' . $activity . ' to ' . $target . ' for user ' . $uid, Logger::DEBUG);
+ Logger::info('Sending activity ' . $activity . ' to ' . $target . ' for user ' . $uid);
$signed = LDSignature::sign($data, $owner);
return HTTPSignature::transmit($signed, $profile['inbox'], $uid);
$condition = ['verb' => Activity::FOLLOW, 'uid' => 0, 'parent-uri' => $object,
'author-id' => Contact::getPublicIdByUserId($uid)];
if (Post::exists($condition)) {
- Logger::log('Follow for ' . $object . ' for user ' . $uid . ' does already exist.', Logger::DEBUG);
+ Logger::info('Follow for ' . $object . ' for user ' . $uid . ' does already exist.');
return false;
}
'instrument' => self::getService(),
'to' => [$profile['url']]];
- Logger::log('Sending follow ' . $object . ' to ' . $target . ' for user ' . $uid, Logger::DEBUG);
+ Logger::info('Sending follow ' . $object . ' to ' . $target . ' for user ' . $uid);
$signed = LDSignature::sign($data, $owner);
return HTTPSignature::transmit($signed, $profile['inbox'], $uid);
'instrument' => self::getService(),
'to' => [$profile['url']]];
- Logger::log('Sending undo to ' . $target . ' for user ' . $uid . ' with id ' . $id, Logger::DEBUG);
+ Logger::info('Sending undo to ' . $target . ' for user ' . $uid . ' with id ' . $id);
$signed = LDSignature::sign($data, $owner);
return HTTPSignature::transmit($signed, $profile['inbox'], $uid);