X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FActivityPub%2FTransmitter.php;h=0b80e978637092848a0e6aa5789633bf22977895;hb=7b7132971a64a92a685a5fd860fe4709dce1765a;hp=99c3503b2d3969b8733b49ab5259e240ef16f4c9;hpb=0733ae6aae2bee02335613125bd0ac290b3a4859;p=friendica.git diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index 99c3503b2d..0b80e97863 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -1,19 +1,35 @@ . + * */ + namespace Friendica\Protocol\ActivityPub; -use Friendica\BaseObject; use Friendica\Content\Feature; use Friendica\Content\Text\BBCode; use Friendica\Content\Text\Plaintext; -use Friendica\Core\Cache; -use Friendica\Core\Config; +use Friendica\Core\Cache\Duration; use Friendica\Core\Logger; use Friendica\Core\Protocol; use Friendica\Core\System; use Friendica\Database\DBA; +use Friendica\DI; use Friendica\Model\APContact; use Friendica\Model\Contact; use Friendica\Model\Conversation; @@ -37,10 +53,10 @@ require_once 'include/api.php'; require_once 'mod/share.php'; /** - * @brief ActivityPub Transmitter Protocol class + * ActivityPub Transmitter Protocol class * * To-Do: - * - Undo Announce + * @todo Undo Announce */ class Transmitter { @@ -60,7 +76,7 @@ class Transmitter $count = DBA::count('contact', $condition); $data = ['@context' => ActivityPub::CONTEXT]; - $data['id'] = System::baseUrl() . '/followers/' . $owner['nickname']; + $data['id'] = DI::baseUrl() . '/followers/' . $owner['nickname']; $data['type'] = 'OrderedCollection'; $data['totalItems'] = $count; @@ -71,7 +87,7 @@ class Transmitter } if (empty($page)) { - $data['first'] = System::baseUrl() . '/followers/' . $owner['nickname'] . '?page=1'; + $data['first'] = DI::baseUrl() . '/followers/' . $owner['nickname'] . '?page=1'; } else { $data['type'] = 'OrderedCollectionPage'; $list = []; @@ -82,10 +98,10 @@ class Transmitter } if (!empty($list)) { - $data['next'] = System::baseUrl() . '/followers/' . $owner['nickname'] . '?page=' . ($page + 1); + $data['next'] = DI::baseUrl() . '/followers/' . $owner['nickname'] . '?page=' . ($page + 1); } - $data['partOf'] = System::baseUrl() . '/followers/' . $owner['nickname']; + $data['partOf'] = DI::baseUrl() . '/followers/' . $owner['nickname']; $data['orderedItems'] = $list; } @@ -109,7 +125,7 @@ class Transmitter $count = DBA::count('contact', $condition); $data = ['@context' => ActivityPub::CONTEXT]; - $data['id'] = System::baseUrl() . '/following/' . $owner['nickname']; + $data['id'] = DI::baseUrl() . '/following/' . $owner['nickname']; $data['type'] = 'OrderedCollection'; $data['totalItems'] = $count; @@ -120,7 +136,7 @@ class Transmitter } if (empty($page)) { - $data['first'] = System::baseUrl() . '/following/' . $owner['nickname'] . '?page=1'; + $data['first'] = DI::baseUrl() . '/following/' . $owner['nickname'] . '?page=1'; } else { $data['type'] = 'OrderedCollectionPage'; $list = []; @@ -131,10 +147,10 @@ class Transmitter } if (!empty($list)) { - $data['next'] = System::baseUrl() . '/following/' . $owner['nickname'] . '?page=' . ($page + 1); + $data['next'] = DI::baseUrl() . '/following/' . $owner['nickname'] . '?page=' . ($page + 1); } - $data['partOf'] = System::baseUrl() . '/following/' . $owner['nickname']; + $data['partOf'] = DI::baseUrl() . '/following/' . $owner['nickname']; $data['orderedItems'] = $list; } @@ -157,17 +173,17 @@ class Transmitter $public_contact = Contact::getIdForURL($owner['url'], 0, true); $condition = ['uid' => 0, 'contact-id' => $public_contact, 'author-id' => $public_contact, - 'private' => false, 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT], + 'private' => [Item::PUBLIC, Item::UNLISTED], 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT], 'deleted' => false, 'visible' => true, 'moderated' => false]; $count = DBA::count('item', $condition); $data = ['@context' => ActivityPub::CONTEXT]; - $data['id'] = System::baseUrl() . '/outbox/' . $owner['nickname']; + $data['id'] = DI::baseUrl() . '/outbox/' . $owner['nickname']; $data['type'] = 'OrderedCollection'; $data['totalItems'] = $count; if (empty($page)) { - $data['first'] = System::baseUrl() . '/outbox/' . $owner['nickname'] . '?page=1'; + $data['first'] = DI::baseUrl() . '/outbox/' . $owner['nickname'] . '?page=1'; } else { $data['type'] = 'OrderedCollectionPage'; $list = []; @@ -176,16 +192,18 @@ class Transmitter $items = Item::select(['id'], $condition, ['limit' => [($page - 1) * 20, 20], 'order' => ['created' => true]]); while ($item = Item::fetch($items)) { - $object = self::createObjectFromItemID($item['id']); - unset($object['@context']); - $list[] = $object; + $activity = self::createActivityFromItem($item['id'], true); + // Only list "Create" activity objects here, no reshares + if (is_array($activity['object']) && ($activity['type'] == 'Create')) { + $list[] = $activity['object']; + } } if (!empty($list)) { - $data['next'] = System::baseUrl() . '/outbox/' . $owner['nickname'] . '?page=' . ($page + 1); + $data['next'] = DI::baseUrl() . '/outbox/' . $owner['nickname'] . '?page=' . ($page + 1); } - $data['partOf'] = System::baseUrl() . '/outbox/' . $owner['nickname']; + $data['partOf'] = DI::baseUrl() . '/outbox/' . $owner['nickname']; $data['orderedItems'] = $list; } @@ -202,7 +220,7 @@ class Transmitter { return ['type' => 'Service', 'name' => FRIENDICA_PLATFORM . " '" . FRIENDICA_CODENAME . "' " . FRIENDICA_VERSION . '-' . DB_UPDATE_VERSION, - 'url' => BaseObject::getApp()->getBaseURL()]; + 'url' => DI::baseUrl()->get()]; } /** @@ -223,7 +241,7 @@ class Transmitter } $fields = ['locality', 'region', 'country-name']; - $profile = DBA::selectFirst('profile', $fields, ['uid' => $uid, 'is-default' => true]); + $profile = DBA::selectFirst('profile', $fields, ['uid' => $uid]); if (!DBA::isResult($profile)) { return []; } @@ -238,21 +256,21 @@ class Transmitter $data['id'] = $contact['url']; $data['diaspora:guid'] = $user['guid']; $data['type'] = ActivityPub::ACCOUNT_TYPES[$user['account-type']]; - $data['following'] = System::baseUrl() . '/following/' . $user['nickname']; - $data['followers'] = System::baseUrl() . '/followers/' . $user['nickname']; - $data['inbox'] = System::baseUrl() . '/inbox/' . $user['nickname']; - $data['outbox'] = System::baseUrl() . '/outbox/' . $user['nickname']; + $data['following'] = DI::baseUrl() . '/following/' . $user['nickname']; + $data['followers'] = DI::baseUrl() . '/followers/' . $user['nickname']; + $data['inbox'] = DI::baseUrl() . '/inbox/' . $user['nickname']; + $data['outbox'] = DI::baseUrl() . '/outbox/' . $user['nickname']; $data['preferredUsername'] = $user['nickname']; $data['name'] = $contact['name']; $data['vcard:hasAddress'] = ['@type' => 'vcard:Home', 'vcard:country-name' => $profile['country-name'], 'vcard:region' => $profile['region'], 'vcard:locality' => $profile['locality']]; - $data['summary'] = $contact['about']; + $data['summary'] = BBCode::convert($contact['about'], false); $data['url'] = $contact['url']; $data['manuallyApprovesFollowers'] = in_array($user['page-flags'], [User::PAGE_FLAGS_NORMAL, User::PAGE_FLAGS_PRVGROUP]); $data['publicKey'] = ['id' => $contact['url'] . '#main-key', 'owner' => $contact['url'], 'publicKeyPem' => $user['pubkey']]; - $data['endpoints'] = ['sharedInbox' => System::baseUrl() . '/inbox']; + $data['endpoints'] = ['sharedInbox' => DI::baseUrl() . '/inbox']; $data['icon'] = ['type' => 'Image', 'url' => $contact['photo']]; @@ -271,7 +289,7 @@ class Transmitter { return [ '@context' => ActivityPub::CONTEXT, - 'id' => System::baseUrl() . '/profile/' . $username, + 'id' => DI::baseUrl() . '/profile/' . $username, 'type' => 'Tombstone', 'published' => DateTimeFormat::utcNow(DateTimeFormat::ATOM), 'updated' => DateTimeFormat::utcNow(DateTimeFormat::ATOM), @@ -361,7 +379,11 @@ class Transmitter } } - if (Config::get('debug', 'total_ap_delivery')) { + if (DI::config()->get('system', 'ap_always_bcc')) { + $always_bcc = true; + } + + if (self::isAnnounce($item) || DI::config()->get('debug', 'total_ap_delivery')) { // Will be activated in a later step $networks = Protocol::FEDERATED; } else { @@ -379,10 +401,24 @@ class Transmitter $terms = Term::tagArrayFromItemId($item['id'], [Term::MENTION, Term::IMPLICIT_MENTION]); - if (!$item['private']) { + if ($item['private'] != Item::PRIVATE) { + // Directly mention the original author upon a quoted reshare. + // Else just ensure that the original author receives the reshare. + $announce = self::getAnnounceArray($item); + if (!empty($announce['comment'])) { + $data['to'][] = $announce['actor']['url']; + } elseif (!empty($announce)) { + $data['cc'][] = $announce['actor']['url']; + } + $data = array_merge($data, self::fetchPermissionBlockFromConversation($item)); - $data['to'][] = ActivityPub::PUBLIC_COLLECTION; + // Check if the item is completely public or unlisted + if ($item['private'] == Item::PUBLIC) { + $data['to'][] = ActivityPub::PUBLIC_COLLECTION; + } else { + $data['cc'][] = ActivityPub::PUBLIC_COLLECTION; + } foreach ($terms as $term) { $profile = APContact::getByURL($term['url'], false); @@ -436,13 +472,13 @@ class Transmitter $data['to'][] = $profile['url']; } else { $data['cc'][] = $profile['url']; - if (!$item['private'] && !empty($actor_profile['followers'])) { + if (($item['private'] != Item::PRIVATE) && $item['private'] && !empty($actor_profile['followers'])) { $data['cc'][] = $actor_profile['followers']; } } } else { // Public thread parent post always are directed to the followers - if (!$item['private'] && !$forum_mode) { + if (($item['private'] != Item::PRIVATE) && !$forum_mode) { $data['cc'][] = $actor_profile['followers']; } } @@ -533,7 +569,7 @@ class Transmitter { $inboxes = []; - if (Config::get('debug', 'total_ap_delivery')) { + if (DI::config()->get('debug', 'total_ap_delivery')) { // Will be activated in a later step $networks = Protocol::FEDERATED; } else { @@ -653,6 +689,9 @@ class Transmitter public static function ItemArrayFromMail($mail_id) { $mail = DBA::selectFirst('mail', [], ['id' => $mail_id]); + if (!DBA::isResult($mail)) { + return []; + } $reply = DBA::selectFirst('mail', ['uri'], ['parent-uri' => $mail['parent-uri'], 'reply' => false]); @@ -696,11 +735,6 @@ class Transmitter $mail = self::ItemArrayFromMail($mail_id); $object = self::createNote($mail); - $object['to'] = $object['cc']; - unset($object['cc']); - - $object['tag'] = [['type' => 'Mention', 'href' => $object['to'][0], 'name' => 'test']]; - if (!$object_mode) { $data = ['@context' => ActivityPub::CONTEXT]; } else { @@ -726,6 +760,8 @@ class Transmitter unset($data['bcc']); $object['to'] = $data['to']; + $object['tag'] = [['type' => 'Mention', 'href' => $object['to'][0], 'name' => '']]; + unset($object['cc']); unset($object['bcc']); @@ -757,8 +793,8 @@ class Transmitter // Only check for a reshare, if it is a real reshare and no quoted reshare if (strpos($item['body'], "[share") === 0) { - $announce = api_share_as_retweet($item); - $reshared = !empty($announce['plink']); + $announce = self::getAnnounceArray($item); + $reshared = !empty($announce); } if ($reshared) { @@ -804,7 +840,7 @@ class Transmitter $cachekey = 'APDelivery:createActivity:' . $item_id; if (!$force) { - $data = Cache::get($cachekey); + $data = DI::cache()->get($cachekey); if (!is_null($data)) { return $data; } @@ -812,7 +848,7 @@ class Transmitter $data = ActivityPub\Transmitter::createActivityFromItem($item_id); - Cache::set($cachekey, $data, Cache::QUARTER_HOUR); + DI::cache()->set($cachekey, $data, Duration::QUARTER_HOUR); return $data; } @@ -919,29 +955,6 @@ class Transmitter /// @todo Create "conversation" entry } - /** - * Creates an object array for a given item id - * - * @param integer $item_id - * - * @return array with the object data - * @throws \Friendica\Network\HTTPException\InternalServerErrorException - * @throws \ImagickException - */ - public static function createObjectFromItemID($item_id) - { - $item = Item::selectFirst([], ['id' => $item_id, 'parent-network' => Protocol::NATIVE_SUPPORT]); - - if (!DBA::isResult($item)) { - return false; - } - - $data = ['@context' => ActivityPub::CONTEXT]; - $data = array_merge($data, self::createNote($item)); - - return $data; - } - /** * Creates a location entry for a given item array * @@ -991,7 +1004,7 @@ class Transmitter $terms = Term::tagArrayFromItemId($item['id'], [Term::HASHTAG, Term::MENTION, Term::IMPLICIT_MENTION]); foreach ($terms as $term) { if ($term['type'] == Term::HASHTAG) { - $url = System::baseUrl() . '/search?tag=' . urlencode($term['term']); + $url = DI::baseUrl() . '/search?tag=' . urlencode($term['term']); $tags[] = ['type' => 'Hashtag', 'href' => $url, 'name' => '#' . $term['term']]; } elseif ($term['type'] == Term::MENTION || $term['type'] == Term::IMPLICIT_MENTION) { $contact = Contact::getDetailsByURL($term['url']); @@ -1004,6 +1017,13 @@ class Transmitter $tags[] = ['type' => 'Mention', 'href' => $term['url'], 'name' => $mention]; } } + + $announce = self::getAnnounceArray($item); + // Mention the original author upon commented reshares + if (!empty($announce['comment'])) { + $tags[] = ['type' => 'Mention', 'href' => $announce['actor']['url'], 'name' => '@' . $announce['actor']['addr']]; + } + return $tags; } @@ -1108,7 +1128,7 @@ class Transmitter } /** - * @brief Callback function to replace a Friendica style mention in a mention that is used on AP + * Callback function to replace a Friendica style mention in a mention that is used on AP * * @param array $match Matching values for the callback * @return string Replaced mention @@ -1234,6 +1254,10 @@ class Transmitter */ public static function createNote($item) { + if (empty($item)) { + return []; + } + if ($item['event-type'] == 'event') { $type = 'Event'; } elseif (!empty($item['title'])) { @@ -1301,12 +1325,17 @@ class Transmitter $data['content'] = BBCode::convert($body, false, 9); } - $regexp = "/[@!]\[url\=([^\[\]]*)\].*?\[\/url\]/ism"; - $richbody = preg_replace_callback($regexp, ['self', 'mentionCallback'], $item['body']); - $richbody = BBCode::removeAttachment($richbody); + // The regular "content" field does contain a minimized HTML. This is done since systems like + // Mastodon has got problems with - for example - embedded pictures. + // The contentMap does contain the unmodified HTML. + $language = self::getLanguage($item); + if (!empty($language)) { + $regexp = "/[@!]\[url\=([^\[\]]*)\].*?\[\/url\]/ism"; + $richbody = preg_replace_callback($regexp, ['self', 'mentionCallback'], $item['body']); + $richbody = BBCode::removeAttachment($richbody); - $data['contentMap']['text/html'] = BBCode::convert($richbody, false); - $data['contentMap']['text/markdown'] = BBCode::toMarkdown($item["body"]); + $data['contentMap'][$language] = BBCode::convert($richbody, false); + } $data['source'] = ['content' => $item['body'], 'mediaType' => "text/bbcode"]; @@ -1330,6 +1359,35 @@ class Transmitter return $data; } + /** + * Fetches the language from the post, the user or the system. + * + * @param array $item + * + * @return string language string + */ + private static function getLanguage(array $item) + { + // Try to fetch the language from the post itself + if (!empty($item['language'])) { + $languages = array_keys(json_decode($item['language'], true)); + if (!empty($languages[0])) { + return $languages[0]; + } + } + + // Otherwise use the user's language + if (!empty($item['uid'])) { + $user = DBA::selectFirst('user', ['language'], ['uid' => $item['uid']]); + if (!empty($user['language'])) { + return $user['language']; + } + } + + // And finally just use the system language + return DI::config()->get('system', 'language'); + } + /** * Creates an an "add tag" entry * @@ -1367,46 +1425,80 @@ class Transmitter private static function createAnnounce($item, $data) { $orig_body = $item['body']; - $announce = api_share_as_retweet($item); - if (empty($announce['plink'])) { + $announce = self::getAnnounceArray($item); + if (empty($announce)) { $data['type'] = 'Create'; $data['object'] = self::createNote($item); return $data; } - // Fetch the original id of the object - $activity = ActivityPub::fetchContent($announce['plink'], $item['uid']); - if (!empty($activity)) { - $ldactivity = JsonLD::compact($activity); - $id = JsonLD::fetchElement($ldactivity, '@id'); - $type = str_replace('as:', '', JsonLD::fetchElement($ldactivity, '@type')); - if (!empty($id)) { - if (empty($announce['share-pre-body'])) { - // Pure announce, without a quote - $data['type'] = 'Announce'; - $data['object'] = $id; - return $data; - } - - // Quote - $data['type'] = 'Create'; - $item['body'] = trim($announce['share-pre-body']) . "\n" . $id; - $data['object'] = self::createNote($item); - - /// @todo Finally descide how to implement this in AP. This is a possible way: - $data['object']['attachment'][] = ['type' => $type, 'id' => $id]; - - $data['object']['source']['content'] = $orig_body; - return $data; - } + if (empty($announce['comment'])) { + // Pure announce, without a quote + $data['type'] = 'Announce'; + $data['object'] = $announce['object']['uri']; + return $data; } - $item['body'] = $orig_body; + // Quote $data['type'] = 'Create'; + $item['body'] = $announce['comment'] . "\n" . $announce['object']['plink']; $data['object'] = self::createNote($item); + + /// @todo Finally descide how to implement this in AP. This is a possible way: + $data['object']['attachment'][] = self::createNote($announce['object']); + + $data['object']['source']['content'] = $orig_body; return $data; } + /** + * Return announce related data if the item is an annunce + * + * @param array $item + * + * @return array + */ + public static function getAnnounceArray($item) + { + $reshared = Item::getShareArray($item); + if (empty($reshared['guid'])) { + return []; + } + + $reshared_item = Item::selectFirst([], ['guid' => $reshared['guid']]); + if (!DBA::isResult($reshared_item)) { + return []; + } + + if (!in_array($reshared_item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN])) { + return []; + } + + $profile = APContact::getByURL($reshared_item['author-link'], false); + if (empty($profile)) { + return []; + } + + return ['object' => $reshared_item, 'actor' => $profile, 'comment' => $reshared['comment']]; + } + + /** + * Checks if the provided item array is an announce + * + * @param array $item + * + * @return boolean + */ + public static function isAnnounce($item) + { + $announce = self::getAnnounceArray($item); + if (empty($announce)) { + return false; + } + + return empty($announce['comment']); + } + /** * Creates an activity id for a given contact id * @@ -1423,7 +1515,7 @@ class Transmitter $hash = hash('ripemd128', $contact['uid'].'-'.$contact['id'].'-'.$contact['created']); $uuid = substr($hash, 0, 8). '-' . substr($hash, 8, 4) . '-' . substr($hash, 12, 4) . '-' . substr($hash, 16, 4) . '-' . substr($hash, 20, 12); - return System::baseUrl() . '/activity/' . $uuid; + return DI::baseUrl() . '/activity/' . $uuid; } /** @@ -1440,14 +1532,14 @@ class Transmitter { $owner = User::getOwnerDataById($uid); - $suggestion = DBA::selectFirst('fsuggest', ['url', 'note', 'created'], ['id' => $suggestion_id]); + $suggestion = DI::fsuggest()->getById($suggestion_id); $data = ['@context' => ActivityPub::CONTEXT, - 'id' => System::baseUrl() . '/activity/' . System::createGUID(), + 'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'type' => 'Announce', 'actor' => $owner['url'], - 'object' => $suggestion['url'], - 'content' => $suggestion['note'], + 'object' => $suggestion->url, + 'content' => $suggestion->note, 'instrument' => self::getService(), 'to' => [ActivityPub::PUBLIC_COLLECTION], 'cc' => []]; @@ -1472,7 +1564,7 @@ class Transmitter $owner = User::getOwnerDataById($uid); $data = ['@context' => ActivityPub::CONTEXT, - 'id' => System::baseUrl() . '/activity/' . System::createGUID(), + 'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'type' => 'dfrn:relocate', 'actor' => $owner['url'], 'object' => $owner['url'], @@ -1511,7 +1603,7 @@ class Transmitter } $data = ['@context' => ActivityPub::CONTEXT, - 'id' => System::baseUrl() . '/activity/' . System::createGUID(), + 'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'type' => 'Delete', 'actor' => $owner['url'], 'object' => $owner['url'], @@ -1542,7 +1634,7 @@ class Transmitter $profile = APContact::getByURL($owner['url']); $data = ['@context' => ActivityPub::CONTEXT, - 'id' => System::baseUrl() . '/activity/' . System::createGUID(), + 'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'type' => 'Update', 'actor' => $owner['url'], 'object' => self::getProfile($uid), @@ -1579,7 +1671,7 @@ class Transmitter $owner = User::getOwnerDataById($uid); if (empty($id)) { - $id = System::baseUrl() . '/activity/' . System::createGUID(); + $id = DI::baseUrl() . '/activity/' . System::createGUID(); } $data = ['@context' => ActivityPub::CONTEXT, @@ -1618,7 +1710,7 @@ class Transmitter if (empty($uid)) { // Fetch the list of administrators - $admin_mail = explode(',', str_replace(' ', '', Config::get('config', 'admin_email'))); + $admin_mail = explode(',', str_replace(' ', '', DI::config()->get('config', 'admin_email'))); // We need to use some user as a sender. It doesn't care who it will send. We will use an administrator account. $condition = ['verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false, 'email' => $admin_mail]; @@ -1636,7 +1728,7 @@ class Transmitter $owner = User::getOwnerDataById($uid); $data = ['@context' => ActivityPub::CONTEXT, - 'id' => System::baseUrl() . '/activity/' . System::createGUID(), + 'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'type' => 'Follow', 'actor' => $owner['url'], 'object' => $object, @@ -1668,7 +1760,7 @@ class Transmitter $owner = User::getOwnerDataById($uid); $data = ['@context' => ActivityPub::CONTEXT, - 'id' => System::baseUrl() . '/activity/' . System::createGUID(), + 'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'type' => 'Accept', 'actor' => $owner['url'], 'object' => [ @@ -1705,7 +1797,7 @@ class Transmitter $owner = User::getOwnerDataById($uid); $data = ['@context' => ActivityPub::CONTEXT, - 'id' => System::baseUrl() . '/activity/' . System::createGUID(), + 'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'type' => 'Reject', 'actor' => $owner['url'], 'object' => [ @@ -1745,7 +1837,7 @@ class Transmitter return; } - $id = System::baseUrl() . '/activity/' . System::createGUID(); + $id = DI::baseUrl() . '/activity/' . System::createGUID(); $owner = User::getOwnerDataById($uid); $data = ['@context' => ActivityPub::CONTEXT, @@ -1766,7 +1858,7 @@ class Transmitter private static function prependMentions($body, array $permission_block) { - if (Config::get('system', 'disable_implicit_mentions')) { + if (DI::config()->get('system', 'disable_implicit_mentions')) { return $body; }