X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FActivityPub%2FTransmitter.php;h=1d5192d93be6bb2286738b6ae6ead3a3d202d01c;hb=9b8b2b36cdf39852068b3dd372409501f8e31344;hp=88e047c1362bd2c26dbd7d0f640b1bf7d93f63ae;hpb=d81b7c840e065162e78249ad31ac35c94058f93e;p=friendica.git diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index 88e047c136..1d5192d93b 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -21,6 +21,7 @@ use Friendica\Model\User; use Friendica\Util\DateTimeFormat; use Friendica\Content\Text\BBCode; use Friendica\Content\Text\Plaintext; +use Friendica\Util\XML; use Friendica\Util\JsonLD; use Friendica\Util\LDSignature; use Friendica\Model\Profile; @@ -228,11 +229,6 @@ class Transmitter return []; } - // On old installations and never changed contacts this might not be filled - if (empty($contact['avatar'])) { - $contact['avatar'] = $contact['photo']; - } - $data = ['@context' => ActivityPub::CONTEXT]; $data['id'] = $contact['url']; $data['diaspora:guid'] = $user['guid']; @@ -253,7 +249,7 @@ class Transmitter 'publicKeyPem' => $user['pubkey']]; $data['endpoints'] = ['sharedInbox' => System::baseUrl() . '/inbox']; $data['icon'] = ['type' => 'Image', - 'url' => $contact['avatar']]; + 'url' => $contact['photo']]; $data['generator'] = self::getService(); @@ -362,7 +358,7 @@ class Transmitter if (Config::get('debug', 'total_ap_delivery')) { // Will be activated in a later step - $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]; + $networks = Protocol::FEDERATED; } else { // For now only send to these contacts: $networks = [Protocol::ACTIVITYPUB, Protocol::OSTATUS]; @@ -422,46 +418,48 @@ class Transmitter } } - $parents = Item::select(['id', 'author-link', 'owner-link', 'gravity', 'uri'], ['parent' => $item['parent']]); - while ($parent = Item::fetch($parents)) { - if ($parent['gravity'] == GRAVITY_PARENT) { - $profile = APContact::getByURL($parent['owner-link'], false); - if (!empty($profile)) { - if ($item['gravity'] != GRAVITY_PARENT) { - // Comments to forums are directed to the forum - // But comments to forums aren't directed to the followers collection - if ($profile['type'] == 'Group') { - $data['to'][] = $profile['url']; + if (!empty($item['parent'])) { + $parents = Item::select(['id', 'author-link', 'owner-link', 'gravity', 'uri'], ['parent' => $item['parent']]); + while ($parent = Item::fetch($parents)) { + if ($parent['gravity'] == GRAVITY_PARENT) { + $profile = APContact::getByURL($parent['owner-link'], false); + if (!empty($profile)) { + if ($item['gravity'] != GRAVITY_PARENT) { + // Comments to forums are directed to the forum + // But comments to forums aren't directed to the followers collection + if ($profile['type'] == 'Group') { + $data['to'][] = $profile['url']; + } else { + $data['cc'][] = $profile['url']; + if (!$item['private'] && !empty($actor_profile['followers'])) { + $data['cc'][] = $actor_profile['followers']; + } + } } else { - $data['cc'][] = $profile['url']; - if (!$item['private']) { + // Public thread parent post always are directed to the followers + if (!$item['private'] && !$forum_mode) { $data['cc'][] = $actor_profile['followers']; } } - } else { - // Public thread parent post always are directed to the followes - if (!$item['private'] && !$forum_mode) { - $data['cc'][] = $actor_profile['followers']; - } } } - } - // Don't include data from future posts - if ($parent['id'] >= $last_id) { - continue; - } + // Don't include data from future posts + if ($parent['id'] >= $last_id) { + continue; + } - $profile = APContact::getByURL($parent['author-link'], false); - if (!empty($profile)) { - if (($profile['type'] == 'Group') || ($parent['uri'] == $item['thr-parent'])) { - $data['to'][] = $profile['url']; - } else { - $data['cc'][] = $profile['url']; + $profile = APContact::getByURL($parent['author-link'], false); + if (!empty($profile)) { + if (($profile['type'] == 'Group') || ($parent['uri'] == $item['thr-parent'])) { + $data['to'][] = $profile['url']; + } else { + $data['cc'][] = $profile['url']; + } } } + DBA::close($parents); } - DBA::close($parents); $data['to'] = array_unique($data['to']); $data['cc'] = array_unique($data['cc']); @@ -532,7 +530,7 @@ class Transmitter if (Config::get('debug', 'total_ap_delivery')) { // Will be activated in a later step - $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]; + $networks = Protocol::FEDERATED; } else { // For now only send to these contacts: $networks = [Protocol::ACTIVITYPUB, Protocol::OSTATUS]; @@ -770,6 +768,8 @@ class Transmitter $type = 'TentativeAccept'; } elseif ($item['verb'] == ACTIVITY_FOLLOW) { $type = 'Follow'; + } elseif ($item['verb'] == ACTIVITY_TAG) { + $type = 'Add'; } else { $type = ''; } @@ -873,6 +873,8 @@ class Transmitter if (in_array($data['type'], ['Create', 'Update', 'Delete'])) { $data['object'] = self::createNote($item); + } elseif ($data['type'] == 'Add') { + $data = self::createAddTag($item, $data); } elseif ($data['type'] == 'Announce') { $data = self::createAnnounce($item, $data); } elseif ($data['type'] == 'Follow') { @@ -1134,7 +1136,7 @@ class Transmitter { $event = []; $event['name'] = $item['event-summary']; - $event['content'] = BBCode::convert($item['event-desc'], false, 7); + $event['content'] = BBCode::convert($item['event-desc'], false, 9); $event['startTime'] = DateTimeFormat::utc($item['event-start'] . '+00:00', DateTimeFormat::ATOM); if (!$item['event-nofinish']) { @@ -1224,7 +1226,7 @@ class Transmitter $regexp = "/[@!]\[url\=([^\[\]]*)\].*?\[\/url\]/ism"; $body = preg_replace_callback($regexp, ['self', 'mentionCallback'], $body); - $data['content'] = BBCode::convert($body, false, 7); + $data['content'] = BBCode::convert($body, false, 9); } $data['source'] = ['content' => $item['body'], 'mediaType' => "text/bbcode"]; @@ -1249,6 +1251,30 @@ class Transmitter return $data; } + /** + * Creates an an "add tag" entry + * + * @param array $item + * @param array $data activity data + * + * @return array with activity data for adding tags + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @throws \ImagickException + */ + private static function createAddTag($item, $data) + { + $object = XML::parseString($item['object'], false); + $target = XML::parseString($item["target"], false); + + $data['diaspora:guid'] = $item['guid']; + $data['actor'] = $item['author-link']; + $data['target'] = (string)$target->id; + $data['summary'] = BBCode::toPlaintext($item['body']); + $data['object'] = ['id' => (string)$object->id, 'type' => 'tag', 'name' => (string)$object->title, 'content' => (string)$object->content]; + + return $data; + } + /** * Creates an announce object entry * @@ -1448,6 +1474,10 @@ class Transmitter public static function sendActivity($activity, $target, $uid, $id = '') { $profile = APContact::getByURL($target); + if (empty($profile['inbox'])) { + Logger::warning('No inbox found for target', ['target' => $target, 'profile' => $profile]); + return; + } $owner = User::getOwnerDataById($uid); @@ -1484,6 +1514,10 @@ class Transmitter public static function sendFollowObject($object, $target, $uid = 0) { $profile = APContact::getByURL($target); + if (empty($profile['inbox'])) { + Logger::warning('No inbox found for target', ['target' => $target, 'profile' => $profile]); + return; + } if (empty($uid)) { // Fetch the list of administrators @@ -1530,19 +1564,26 @@ class Transmitter public static function sendContactAccept($target, $id, $uid) { $profile = APContact::getByURL($target); + if (empty($profile['inbox'])) { + Logger::warning('No inbox found for target', ['target' => $target, 'profile' => $profile]); + return; + } $owner = User::getOwnerDataById($uid); $data = ['@context' => ActivityPub::CONTEXT, 'id' => System::baseUrl() . '/activity/' . System::createGUID(), 'type' => 'Accept', 'actor' => $owner['url'], - 'object' => ['id' => $id, 'type' => 'Follow', + 'object' => [ + 'id' => (string)$id, + 'type' => 'Follow', 'actor' => $profile['url'], - 'object' => $owner['url']], + 'object' => $owner['url'] + ], 'instrument' => self::getService(), 'to' => [$profile['url']]]; - Logger::log('Sending accept to ' . $target . ' for user ' . $uid . ' with id ' . $id, Logger::DEBUG); + Logger::debug('Sending accept to ' . $target . ' for user ' . $uid . ' with id ' . $id); $signed = LDSignature::sign($data, $owner); HTTPSignature::transmit($signed, $profile['inbox'], $uid); @@ -1560,19 +1601,26 @@ class Transmitter public static function sendContactReject($target, $id, $uid) { $profile = APContact::getByURL($target); + if (empty($profile['inbox'])) { + Logger::warning('No inbox found for target', ['target' => $target, 'profile' => $profile]); + return; + } $owner = User::getOwnerDataById($uid); $data = ['@context' => ActivityPub::CONTEXT, 'id' => System::baseUrl() . '/activity/' . System::createGUID(), 'type' => 'Reject', 'actor' => $owner['url'], - 'object' => ['id' => $id, 'type' => 'Follow', + 'object' => [ + 'id' => (string)$id, + 'type' => 'Follow', 'actor' => $profile['url'], - 'object' => $owner['url']], + 'object' => $owner['url'] + ], 'instrument' => self::getService(), 'to' => [$profile['url']]]; - Logger::log('Sending reject to ' . $target . ' for user ' . $uid . ' with id ' . $id, Logger::DEBUG); + Logger::debug('Sending reject to ' . $target . ' for user ' . $uid . ' with id ' . $id); $signed = LDSignature::sign($data, $owner); HTTPSignature::transmit($signed, $profile['inbox'], $uid); @@ -1590,6 +1638,10 @@ class Transmitter public static function sendContactUndo($target, $cid, $uid) { $profile = APContact::getByURL($target); + if (empty($profile['inbox'])) { + Logger::warning('No inbox found for target', ['target' => $target, 'profile' => $profile]); + return; + } $object_id = self::activityIDFromContact($cid); if (empty($object_id)) {