X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FProtocol%2FOStatus.php;h=21f07d46b90dcb20bff703a666d56b49766004cb;hb=6db211568ae283d152ee8fa0cfe17a2bab809779;hp=a6e0df4c33e355644cc6e99344f77a39a13fa43e;hpb=5fd20c8491dbaf36d362f3ec294768a1ad8a4bce;p=friendica.git diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index a6e0df4c33..21f07d46b9 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -1,6 +1,6 @@ $contact["id"]], $current); + Contact::update($contact, ['id' => $contact["id"]], $current); if (!empty($author["author-avatar"]) && ($author["author-avatar"] != $current['avatar'])) { Logger::log("Update profile picture for contact ".$contact["id"], Logger::DEBUG); @@ -233,7 +230,7 @@ class OStatus 'about' => $contact["about"], 'location' => $contact["location"], 'success_update' => DateTimeFormat::utcNow(), 'last-update' => DateTimeFormat::utcNow()]; - DBA::update('contact', $fields, ['id' => $cid], $old_contact); + Contact::update($fields, ['id' => $cid], $old_contact); // Update the avatar if (!empty($author["author-avatar"])) { @@ -315,7 +312,7 @@ class OStatus */ public static function import($xml, array $importer, array &$contact, &$hub) { - self::process($xml, $importer, $contact, $hub); + self::process($xml, $importer, $contact, $hub, false, true, Conversation::PUSH); } /** @@ -332,7 +329,7 @@ class OStatus * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException */ - private static function process($xml, array $importer, array &$contact = null, &$hub, $stored = false, $initialize = true) + private static function process($xml, array $importer, array &$contact = null, &$hub, $stored = false, $initialize = true, $direction = Conversation::UNKNOWN) { if ($initialize) { self::$itemlist = []; @@ -400,6 +397,7 @@ class OStatus $header["protocol"] = Conversation::PARCEL_SALMON; $header["source"] = $xml2; + $header["direction"] = $direction; } elseif (!$initialize) { return false; } @@ -447,7 +445,7 @@ class OStatus } // Deletions come with the same uri, so we check for duplicates after processing deletions - if (Item::exists(['uid' => $importer["uid"], 'uri' => $item["uri"]])) { + if (Post::exists(['uid' => $importer["uid"], 'uri' => $item["uri"]])) { Logger::log('Post with URI '.$item["uri"].' already existed for user '.$importer["uid"].'.', Logger::DEBUG); continue; } else { @@ -473,7 +471,7 @@ class OStatus if ($item["verb"] == Activity::O_UNFOLLOW) { $dummy = null; - Contact::removeFollower($importer, $contact, $item, $dummy); + Contact::removeFollower($contact); continue; } @@ -535,7 +533,7 @@ class OStatus } } foreach (self::$itemlist as $item) { - $found = Item::exists(['uid' => $importer["uid"], 'uri' => $item["uri"]]); + $found = Post::exists(['uid' => $importer["uid"], 'uri' => $item["uri"]]); if ($found) { Logger::log("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already exists.", Logger::DEBUG); } elseif ($item['contact-id'] < 0) { @@ -563,7 +561,7 @@ class OStatus private static function deleteNotice(array $item) { $condition = ['uid' => $item['uid'], 'author-id' => $item['author-id'], 'uri' => $item['uri']]; - if (!Item::exists($condition)) { + if (!Post::exists($condition)) { Logger::log('Item from '.$item['author-link'].' with uri '.$item['uri'].' for user '.$item['uid']." wasn't found. We don't delete it."); return; } @@ -675,11 +673,6 @@ class OStatus $item["body"] .= $add_body; - // Only add additional data when there is no picture in the post - if (!strstr($item["body"], '[/img]')) { - $item["body"] = PageInfo::searchAndAppendToBody($item["body"]); - } - Tag::storeFromBody($item['uri-id'], $item['body']); // Mastodon Content Warning @@ -699,7 +692,7 @@ class OStatus } if (isset($item["thr-parent"])) { - if (!Item::exists(['uid' => $importer["uid"], 'uri' => $item['thr-parent']])) { + if (!Post::exists(['uid' => $importer["uid"], 'uri' => $item['thr-parent']])) { if ($related != '') { self::fetchRelated($related, $item["thr-parent"], $importer); } @@ -735,15 +728,16 @@ class OStatus self::$conv_list[$conversation] = true; - $curlResult = DI::httpRequest()->get($conversation, ['accept_content' => 'application/atom+xml, text/html']); + $curlResult = DI::httpClient()->get($conversation, [HTTPClientOptions::ACCEPT_CONTENT => ['application/atom+xml', 'text/html']]); - if (!$curlResult->isSuccess()) { + if (!$curlResult->isSuccess() || empty($curlResult->getBody())) { return; } $xml = ''; - if (stristr($curlResult->getHeader(), 'Content-Type: application/atom+xml')) { + if ($curlResult->inHeader('Content-Type') && + in_array('application/atom+xml', $curlResult->getHeader('Content-Type'))) { $xml = $curlResult->getBody(); } @@ -764,7 +758,7 @@ class OStatus } } if ($file != '') { - $conversation_atom = DI::httpRequest()->get($attribute['href']); + $conversation_atom = DI::httpClient()->get($attribute['href']); if ($conversation_atom->isSuccess()) { $xml = $conversation_atom->getBody(); @@ -810,6 +804,7 @@ class OStatus $conv_data = []; $conv_data['protocol'] = Conversation::PARCEL_SPLIT_CONVERSATION; + $conv_data['direction'] = Conversation::PULL; $conv_data['network'] = Protocol::OSTATUS; $conv_data['uri'] = XML::getFirstNodeValue($xpath, 'atom:id/text()', $entry); @@ -850,12 +845,6 @@ class OStatus $conv_data['source'] = $doc2->saveXML(); - $condition = ['item-uri' => $conv_data['uri'],'protocol' => Conversation::PARCEL_FEED]; - if (DBA::exists('conversation', $condition)) { - Logger::log('Delete deprecated entry for URI '.$conv_data['uri'], Logger::DEBUG); - DBA::delete('conversation', ['item-uri' => $conv_data['uri']]); - } - Logger::log('Store conversation data for uri '.$conv_data['uri'], Logger::DEBUG); Conversation::insert($conv_data); } @@ -883,7 +872,7 @@ class OStatus return; } - $curlResult = DI::httpRequest()->get($self); + $curlResult = DI::httpClient()->get($self); if (!$curlResult->isSuccess()) { return; @@ -898,6 +887,7 @@ class OStatus $item["protocol"] = Conversation::PARCEL_SALMON; $item["source"] = $xml; + $item["direction"] = Conversation::PULL; Logger::log('Conversation '.$item['uri'].' is now fetched.', Logger::DEBUG); } @@ -921,7 +911,7 @@ class OStatus if (DBA::isResult($conversation)) { $stored = true; $xml = $conversation['source']; - if (self::process($xml, $importer, $contact, $hub, $stored, false)) { + if (self::process($xml, $importer, $contact, $hub, $stored, false, Conversation::PULL)) { Logger::log('Got valid cached XML for URI '.$related_uri, Logger::DEBUG); return; } @@ -932,15 +922,16 @@ class OStatus } $stored = false; - $curlResult = DI::httpRequest()->get($related, ['accept_content' => 'application/atom+xml, text/html']); + $curlResult = DI::httpClient()->get($related, [HTTPClientOptions::ACCEPT_CONTENT => ['application/atom+xml', 'text/html']]); - if (!$curlResult->isSuccess()) { + if (!$curlResult->isSuccess() || empty($curlResult->getBody())) { return; } $xml = ''; - if (stristr($curlResult->getHeader(), 'Content-Type: application/atom+xml')) { + if ($curlResult->inHeader('Content-Type') && + in_array('application/atom+xml', $curlResult->getHeader('Content-Type'))) { Logger::log('Directly fetched XML for URI ' . $related_uri, Logger::DEBUG); $xml = $curlResult->getBody(); } @@ -963,7 +954,7 @@ class OStatus } } if ($atom_file != '') { - $curlResult = DI::httpRequest()->get($atom_file); + $curlResult = DI::httpClient()->get($atom_file); if ($curlResult->isSuccess()) { Logger::log('Fetched XML for URI ' . $related_uri, Logger::DEBUG); @@ -975,7 +966,7 @@ class OStatus // Workaround for older GNU Social servers if (($xml == '') && strstr($related, '/notice/')) { - $curlResult = DI::httpRequest()->get(str_replace('/notice/', '/api/statuses/show/', $related) . '.atom'); + $curlResult = DI::httpClient()->get(str_replace('/notice/', '/api/statuses/show/', $related) . '.atom'); if ($curlResult->isSuccess()) { Logger::log('GNU Social workaround to fetch XML for URI ' . $related_uri, Logger::DEBUG); @@ -986,7 +977,7 @@ class OStatus // Even more worse workaround for GNU Social ;-) if ($xml == '') { $related_guess = self::convertHref($related_uri); - $curlResult = DI::httpRequest()->get(str_replace('/notice/', '/api/statuses/show/', $related_guess) . '.atom'); + $curlResult = DI::httpClient()->get(str_replace('/notice/', '/api/statuses/show/', $related_guess) . '.atom'); if ($curlResult->isSuccess()) { Logger::log('GNU Social workaround 2 to fetch XML for URI ' . $related_uri, Logger::DEBUG); @@ -1006,7 +997,7 @@ class OStatus } if ($xml != '') { - self::process($xml, $importer, $contact, $hub, $stored, false); + self::process($xml, $importer, $contact, $hub, $stored, false, Conversation::PULL); } else { Logger::log("XML couldn't be fetched for URI: ".$related_uri." - href: ".$related, Logger::DEBUG); } @@ -1104,7 +1095,9 @@ class OStatus if (($item["object-type"] == Activity\ObjectType::QUESTION) || ($item["object-type"] == Activity\ObjectType::EVENT) ) { - $item["body"] .= "\n" . PageInfo::getFooterFromUrl($attribute['href']); + Post\Media::insert(['uri-id' => $item['uri-id'], 'type' => Post\Media::UNKNOWN, + 'url' => $attribute['href'], 'mimetype' => $attribute['type'] ?? null, + 'size' => $attribute['length'] ?? null, 'description' => $attribute['title'] ?? null]); } break; case "ostatus:conversation": @@ -1131,7 +1124,9 @@ class OStatus } $link_data['related'] = $attribute['href']; } else { - $item["body"] .= "\n" . PageInfo::getFooterFromUrl($attribute['href']); + Post\Media::insert(['uri-id' => $item['uri-id'], 'type' => Post\Media::UNKNOWN, + 'url' => $attribute['href'], 'mimetype' => $attribute['type'] ?? null, + 'size' => $attribute['length'] ?? null, 'description' => $attribute['title'] ?? null]); } break; case "self": @@ -1203,7 +1198,7 @@ class OStatus * @return string The cleaned body * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public static function formatPicturePost($body) + public static function formatPicturePost($body, $uriid) { $siteinfo = BBCode::getAttachedData($body); @@ -1215,7 +1210,7 @@ class OStatus } // Is it a remote picture? Then make a smaller preview here - $preview = ProxyUtils::proxifyUrl($preview, false, ProxyUtils::SIZE_SMALL); + $preview = Post\Link::getByLink($uriid, $preview, ProxyUtils::SIZE_SMALL); // Is it a local picture? Then make it smaller here $preview = str_replace(["-0.jpg", "-0.png"], ["-2.jpg", "-2.png"], $preview); @@ -1280,7 +1275,7 @@ class OStatus XML::addElement($doc, $root, "id", DI::baseUrl() . "/profile/" . $owner["nick"]); XML::addElement($doc, $root, "title", $title); XML::addElement($doc, $root, "subtitle", sprintf("Updates from %s on %s", $owner["name"], DI::config()->get('config', 'sitename'))); - XML::addElement($doc, $root, "logo", $owner["photo"]); + XML::addElement($doc, $root, "logo", User::getAvatarUrl($owner, ProxyUtils::SIZE_SMALL)); XML::addElement($doc, $root, "updated", DateTimeFormat::utcNow(DateTimeFormat::ATOM)); $author = self::addAuthor($doc, $owner, true); @@ -1426,7 +1421,7 @@ class OStatus XML::addElement($doc, $author, "name", $owner["nick"]); XML::addElement($doc, $author, "email", $owner["addr"]); if ($show_profile) { - XML::addElement($doc, $author, "summary", BBCode::convert($owner["about"], false, BBCode::OSTATUS)); + XML::addElement($doc, $author, "summary", BBCode::convertForUriId($owner['uri-id'], $owner["about"], BBCode::OSTATUS)); } $attributes = ["rel" => "alternate", "type" => "text/html", "href" => $owner["url"]]; @@ -1435,25 +1430,25 @@ class OStatus $attributes = [ "rel" => "avatar", "type" => "image/jpeg", // To-Do? - "media:width" => 300, - "media:height" => 300, - "href" => $owner["photo"]]; + "media:width" => ProxyUtils::PIXEL_SMALL, + "media:height" => ProxyUtils::PIXEL_SMALL, + "href" => User::getAvatarUrl($owner, ProxyUtils::SIZE_SMALL)]; XML::addElement($doc, $author, "link", "", $attributes); if (isset($owner["thumb"])) { $attributes = [ "rel" => "avatar", "type" => "image/jpeg", // To-Do? - "media:width" => 80, - "media:height" => 80, - "href" => $owner["thumb"]]; + "media:width" => ProxyUtils::PIXEL_THUMB, + "media:height" => ProxyUtils::PIXEL_THUMB, + "href" => User::getAvatarUrl($owner, ProxyUtils::SIZE_THUMB)]; XML::addElement($doc, $author, "link", "", $attributes); } XML::addElement($doc, $author, "poco:preferredUsername", $owner["nick"]); XML::addElement($doc, $author, "poco:displayName", $owner["name"]); if ($show_profile) { - XML::addElement($doc, $author, "poco:note", BBCode::convert($owner["about"], false, BBCode::OSTATUS)); + XML::addElement($doc, $author, "poco:note", BBCode::convertForUriId($owner['uri-id'], $owner["about"], BBCode::OSTATUS)); if (trim($owner["location"]) != "") { $element = $doc->createElement("poco:address"); @@ -1599,7 +1594,7 @@ class OStatus $condition = ['uid' => $owner["uid"], 'guid' => $repeated_guid, 'private' => [Item::PUBLIC, Item::UNLISTED], 'network' => [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]]; - $repeated_item = Item::selectFirst([], $condition); + $repeated_item = Post::selectFirst([], $condition); if (!DBA::isResult($repeated_item)) { return false; } @@ -1665,7 +1660,7 @@ class OStatus $verb = ActivityNamespace::ACTIVITY_SCHEMA . "favorite"; self::entryContent($doc, $entry, $item, $owner, "Favorite", $verb, false); - $parent = Item::selectFirst([], ['uri' => $item["thr-parent"], 'uid' => $item["uid"]]); + $parent = Post::selectFirst([], ['uri' => $item["thr-parent"], 'uid' => $item["uid"]]); if (DBA::isResult($parent)) { $as_object = $doc->createElement("activity:object"); @@ -1811,7 +1806,7 @@ class OStatus if (!$toplevel) { if (!empty($item['title'])) { - $title = BBCode::convert($item['title'], false, BBCode::OSTATUS); + $title = BBCode::convertForUriId($item['uri-id'], $item['title'], BBCode::OSTATUS); } else { $title = sprintf("New note by %s", $owner["nick"]); } @@ -1893,13 +1888,14 @@ class OStatus XML::addElement($doc, $entry, "id", $item["uri"]); XML::addElement($doc, $entry, "title", html_entity_decode($title, ENT_QUOTES, 'UTF-8')); - $body = self::formatPicturePost($item['body']); + $body = Post\Media::addAttachmentsToBody($item['uri-id'], $item['body']); + $body = self::formatPicturePost($body, $item['uri-id']); if (!empty($item['title'])) { $body = "[b]".$item['title']."[/b]\n\n".$body; } - $body = BBCode::convert($body, false, BBCode::OSTATUS); + $body = BBCode::convertForUriId($item['uri-id'], $body, BBCode::OSTATUS); XML::addElement($doc, $entry, "content", $body, ["type" => "html"]); @@ -1933,29 +1929,33 @@ class OStatus $mentioned = []; if ($item['gravity'] != GRAVITY_PARENT) { - $parent = Item::selectFirst(['guid', 'author-link', 'owner-link'], ['id' => $item['parent']]); + $parent = Post::selectFirst(['guid', 'author-link', 'owner-link'], ['id' => $item['parent']]); - $thrparent = Item::selectFirst(['guid', 'author-link', 'owner-link', 'plink'], ['uid' => $owner["uid"], 'uri' => $item['thr-parent']]); + $thrparent = Post::selectFirst(['guid', 'author-link', 'owner-link', 'plink'], ['uid' => $owner['uid'], 'uri' => $item['thr-parent']]); if (DBA::isResult($thrparent)) { - $mentioned[$thrparent["author-link"]] = $thrparent["author-link"]; - $mentioned[$thrparent["owner-link"]] = $thrparent["owner-link"]; - $parent_plink = $thrparent["plink"]; + $mentioned[$thrparent['author-link']] = $thrparent['author-link']; + $mentioned[$thrparent['owner-link']] = $thrparent['owner-link']; + $parent_plink = $thrparent['plink']; + } elseif (DBA::isResult($parent)) { + $mentioned[$parent['author-link']] = $parent['author-link']; + $mentioned[$parent['owner-link']] = $parent['owner-link']; + $parent_plink = DI::baseUrl() . '/display/' . $parent['guid']; } else { - $mentioned[$parent["author-link"]] = $parent["author-link"]; - $mentioned[$parent["owner-link"]] = $parent["owner-link"]; - $parent_plink = DI::baseUrl()."/display/".$parent["guid"]; + DI::logger()->notice('Missing parent and thr-parent for child item', ['item' => $item]); } - $attributes = [ - "ref" => $item['thr-parent'], - "href" => $parent_plink]; - XML::addElement($doc, $entry, "thr:in-reply-to", "", $attributes); + if (isset($parent_plink)) { + $attributes = [ + 'ref' => $item['thr-parent'], + 'href' => $parent_plink]; + XML::addElement($doc, $entry, 'thr:in-reply-to', '', $attributes); - $attributes = [ - "rel" => "related", - "href" => $parent_plink]; - XML::addElement($doc, $entry, "link", "", $attributes); + $attributes = [ + 'rel' => 'related', + 'href' => $parent_plink]; + XML::addElement($doc, $entry, 'link', '', $attributes); + } } if (intval($item['parent']) > 0) { @@ -2130,12 +2130,12 @@ class OStatus $params = ['order' => ['received' => true], 'limit' => $max_items]; if ($filter === 'posts') { - $ret = Item::selectThread([], $condition, $params); + $ret = Post::selectThread([], $condition, $params); } else { - $ret = Item::select([], $condition, $params); + $ret = Post::select([], $condition, $params); } - $items = Item::inArray($ret); + $items = Post::toArray($ret); $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true;