From 3e797547a37f8c8f22e88965b4a4d278bcc192e0 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 8 Jul 2018 09:37:05 +0000 Subject: [PATCH 1/6] Warnings fixed --- include/api.php | 4 +++- mod/display.php | 21 +++++++++++---------- mod/friendica.php | 2 +- mod/network.php | 4 +--- mod/ping.php | 4 ++-- mod/receive.php | 6 +++--- src/Content/Text/BBCode.php | 4 ++-- src/Core/L10n.php | 4 ++++ src/Core/System.php | 8 ++------ src/Model/GContact.php | 5 +++++ src/Model/Item.php | 6 ++---- src/Object/Post.php | 4 ++-- src/Protocol/DFRN.php | 4 ++-- src/Protocol/Diaspora.php | 4 ++-- src/Protocol/OStatus.php | 4 ++-- src/Worker/Delivery.php | 6 +++++- view/theme/vier/theme.php | 10 ++++++---- 17 files changed, 55 insertions(+), 45 deletions(-) diff --git a/include/api.php b/include/api.php index ad991485a4..42868aa9eb 100644 --- a/include/api.php +++ b/include/api.php @@ -579,7 +579,9 @@ function api_get_user(App $a, $contact_id = null) // $called_api is the API path exploded on / and is expected to have at least 2 elements if (is_null($user) && ($a->argc > (count($called_api) - 1)) && (count($called_api) > 0)) { $argid = count($called_api); - list($user, $null) = explode(".", $a->argv[$argid]); + if (!empty($a->argv[$argid])) { + list($user, $null) = explode(".", $a->argv[$argid]); + } if (is_numeric($user)) { $user = dbesc(api_unique_id_to_nurl(intval($user))); diff --git a/mod/display.php b/mod/display.php index 920cb454f9..10862d57cc 100644 --- a/mod/display.php +++ b/mod/display.php @@ -65,13 +65,13 @@ function display_init(App $a) $item = Item::selectFirstForUser(local_user(), $fields, ['id' => $a->argv[2], 'private' => false, 'uid' => 0]); } - if (!DBM::is_result($item) || $item['deleted']) { + if (!DBM::is_result($item)) { $a->error = 404; notice(L10n::t('Item not found.') . EOL); return; } - if (strstr($_SERVER['HTTP_ACCEPT'], 'application/atom+xml')) { + if (!empty($_SERVER['HTTP_ACCEPT']) && strstr($_SERVER['HTTP_ACCEPT'], 'application/atom+xml')) { logger('Directly serving XML for id '.$item["id"], LOGGER_DEBUG); displayShowFeed($item["id"], false); } @@ -347,19 +347,20 @@ function display_content(App $a, $update = false, $update_uid = 0) Item::update(['unseen' => false], $condition); } - $items = conv_sort(Item::inArray($items_obj), "`commented`"); + $items = Item::inArray($items_obj); + $conversation_items = conv_sort($items, "`commented`"); if (!$update) { $o .= ""; } - $o .= conversation($a, $items, 'display', $update_uid, false, 'commented', local_user()); + $o .= conversation($a, $conversation_items, 'display', $update_uid, false, 'commented', local_user()); // Preparing the meta header - $description = trim(HTML::toPlaintext(BBCode::convert($s[0]["body"], false), 0, true)); - $title = trim(HTML::toPlaintext(BBCode::convert($s[0]["title"], false), 0, true)); - $author_name = $s[0]["author-name"]; + $description = trim(HTML::toPlaintext(BBCode::convert($items["body"], false), 0, true)); + $title = trim(HTML::toPlaintext(BBCode::convert($items["title"], false), 0, true)); + $author_name = $items["author-name"]; - $image = $a->remove_baseurl($s[0]["author-thumb"]); + $image = $a->remove_baseurl($items["author-thumb"]); if ($title == "") { $title = $author_name; @@ -391,7 +392,7 @@ function display_content(App $a, $update = false, $update_uid = 0) $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; - $a->page['htmlhead'] .= ''."\n"; + $a->page['htmlhead'] .= ''."\n"; // Dublin Core $a->page['htmlhead'] .= ''."\n"; @@ -401,7 +402,7 @@ function display_content(App $a, $update = false, $update_uid = 0) $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; - $a->page['htmlhead'] .= ''."\n"; + $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; // article:tag diff --git a/mod/friendica.php b/mod/friendica.php index 1929150f27..e75e9cebae 100644 --- a/mod/friendica.php +++ b/mod/friendica.php @@ -11,7 +11,7 @@ use Friendica\Database\DBM; function friendica_init(App $a) { - if ($a->argv[1] == "json") { + if (!empty($a->argv[1]) && ($a->argv[1] == "json")) { $register_policy = ['REGISTER_CLOSED', 'REGISTER_APPROVE', 'REGISTER_OPEN']; $sql_extra = ''; diff --git a/mod/network.php b/mod/network.php index 7c1ff0afa4..98ffd741f9 100644 --- a/mod/network.php +++ b/mod/network.php @@ -699,9 +699,7 @@ function networkThreadedView(App $a, $update, $parent) $order_mode = 'commented'; } - if ($sql_order == '') { - $sql_order = "$sql_table.$ordering"; - } + $sql_order = "$sql_table.$ordering"; if (x($_GET, 'offset')) { $sql_range = sprintf(" AND $sql_order <= '%s'", dbesc($_GET['offset'])); diff --git a/mod/ping.php b/mod/ping.php index 8028d69ed2..cbd280f534 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -130,7 +130,7 @@ function ping_init(App $a) $condition = ["`unseen` AND `uid` = ? AND `contact-id` != ?", local_user(), local_user()]; $fields = ['id', 'parent', 'verb', 'author-name', 'unseen', 'author-link', 'author-avatar', 'contact-avatar', - 'network', 'created', 'object', 'parent-author-name', 'parent-author-link', 'parent-guid']; + 'network', 'created', 'object', 'parent-author-name', 'parent-author-link', 'parent-guid', 'wall']; $params = ['order' => ['created' => true]]; $items = Item::selectForUser(local_user(), $fields, $condition, $params); @@ -487,7 +487,7 @@ function ping_get_notifications($uid) if ($notification["visible"] && !$notification["deleted"] - && !(x($result, $notification["parent"]) && is_array($result[$notification["parent"]])) + && !(x($result, $notification["parent"]) && !empty($result[$notification["parent"]])) ) { // Should we condense the notifications or show them all? if (PConfig::get(local_user(), 'system', 'detailed_notif')) { diff --git a/mod/receive.php b/mod/receive.php index 41f2225cb4..adb758e384 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -43,9 +43,7 @@ function receive_post(App $a) logger('mod-diaspora: receiving post', LOGGER_DEBUG); - $xml = urldecode($_POST['xml']); - - if (!$xml) { + if (empty($_POST['xml'])) { $postdata = file_get_contents("php://input"); if ($postdata == '') { System::httpExit(500); @@ -54,6 +52,8 @@ function receive_post(App $a) logger('mod-diaspora: message is in the new format', LOGGER_DEBUG); $msg = Diaspora::decodeRaw($importer, $postdata); } else { + $xml = urldecode($_POST['xml']); + logger('mod-diaspora: decode message in the old format', LOGGER_DEBUG); $msg = Diaspora::decode($importer, $xml); diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index 33b3503eca..b4270fec66 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -571,9 +571,9 @@ class BBCode extends BaseObject $return = sprintf('
', $data["type"]); } - if ($data["image"] != "") { + if (!empty($data["image"])) { $return .= sprintf('
', $data["url"], self::proxyUrl($data["image"], $simplehtml), $data["title"]); - } elseif ($data["preview"] != "") { + } elseif (!empty($data["preview"])) { $return .= sprintf('
', $data["url"], self::proxyUrl($data["preview"], $simplehtml), $data["title"]); } diff --git a/src/Core/L10n.php b/src/Core/L10n.php index 277b3401df..24be010955 100644 --- a/src/Core/L10n.php +++ b/src/Core/L10n.php @@ -144,6 +144,10 @@ class L10n { $a = get_app(); + if (empty($s)) { + return ''; + } + if (x($a->strings, $s)) { $t = $a->strings[$s]; $s = is_array($t) ? $t[0] : $t; diff --git a/src/Core/System.php b/src/Core/System.php index abc39e5a2a..84a64ab9a8 100644 --- a/src/Core/System.php +++ b/src/Core/System.php @@ -152,12 +152,8 @@ EOT; if (isset($description["title"])) { $tpl = get_markup_template('http_status.tpl'); - echo replace_macros( - $tpl, - [ - '$title' => $description["title"], - '$description' => $description["description"]] - ); + echo replace_macros($tpl, ['$title' => $description["title"], + '$description' => defaults($description, 'description', '')]); } killme(); diff --git a/src/Model/GContact.php b/src/Model/GContact.php index c413bef4fa..4884353311 100644 --- a/src/Model/GContact.php +++ b/src/Model/GContact.php @@ -662,6 +662,11 @@ class GContact $last_failure_str = ''; $last_contact_str = ''; + if (empty($contact["network"])) { + logger("Empty network for contact url ".$contact["url"]." - Called by: ".System::callstack(), LOGGER_DEBUG); + return false; + } + if (in_array($contact["network"], [NETWORK_PHANTOM])) { logger("Invalid network for contact url ".$contact["url"]." - Called by: ".System::callstack(), LOGGER_DEBUG); return false; diff --git a/src/Model/Item.php b/src/Model/Item.php index 162387185e..05254b8eb1 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -1030,10 +1030,8 @@ class Item extends BaseObject private static function guid($item, $notify) { - $guid = notags(trim($item['guid'])); - - if (!empty($guid)) { - return $guid; + if (!empty($item['guid'])) { + return notags(trim($item['guid'])); } if ($notify) { diff --git a/src/Object/Post.php b/src/Object/Post.php index 216008974a..f9da142fec 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -356,8 +356,8 @@ class Post extends BaseObject 'guid' => urlencode($item['guid']), 'isevent' => $isevent, 'attend' => $attend, - 'linktitle' => L10n::t('View %s\'s profile @ %s', $profile_name, defaults($item, 'author-link', $item['url'])), - 'olinktitle' => L10n::t('View %s\'s profile @ %s', htmlentities($this->getOwnerName()), defaults($item, 'owner-link', $item['url'])), + 'linktitle' => L10n::t('View %s\'s profile @ %s', $profile_name, $item['author-link']), + 'olinktitle' => L10n::t('View %s\'s profile @ %s', htmlentities($this->getOwnerName()), $item['owner-link']), 'to' => L10n::t('to'), 'via' => L10n::t('via'), 'wall' => L10n::t('Wall-to-Wall'), diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 72ab89d925..6525601feb 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -952,10 +952,10 @@ class DFRN if (isset($parent_item)) { $conversation = dba::selectFirst('conversation', ['conversation-uri', 'conversation-href'], ['item-uri' => $item['parent-uri']]); if (DBM::is_result($conversation)) { - if ($r['conversation-uri'] != '') { + if ($conversation['conversation-uri'] != '') { $conversation_uri = $conversation['conversation-uri']; } - if ($r['conversation-href'] != '') { + if ($conversation['conversation-href'] != '') { $conversation_href = $conversation['conversation-href']; } } diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index d567be144d..2ce54317eb 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -1349,7 +1349,7 @@ class Diaspora $author = ""; // Fetch the author - for the old and the new Diaspora version - if ($source_xml->post->status_message->diaspora_handle) { + if ($source_xml->post->status_message && $source_xml->post->status_message->diaspora_handle) { $author = (string)$source_xml->post->status_message->diaspora_handle; } elseif ($source_xml->author && ($source_xml->getName() == "status_message")) { $author = (string)$source_xml->author; @@ -2165,7 +2165,7 @@ class Diaspora } // Send all existing comments and likes to the requesting server - $comments = Item::select(['id', 'verb', 'self'], ['parent' => $item['id']]); + $comments = Item::select(['id', 'parent', 'verb', 'self'], ['parent' => $item['id']]); while ($comment = Item::fetch($comments)) { if ($comment['id'] == $comment['parent']) { continue; diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index 4ef80ddca0..40218b0dfd 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -1173,12 +1173,12 @@ class OStatus $guid = ""; preg_match("/guid='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $guid = $matches[1]; } preg_match('/guid="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $guid = $matches[1]; } diff --git a/src/Worker/Delivery.php b/src/Worker/Delivery.php index 0c8ff27faf..4e76c68f79 100644 --- a/src/Worker/Delivery.php +++ b/src/Worker/Delivery.php @@ -61,7 +61,7 @@ class Delivery extends BaseObject $condition = ['id' => [$item_id, $parent_id], 'visible' => true, 'moderated' => false]; $params = ['order' => ['id']]; - $itemdata = Item::select([], $condition, $params); + $itemdata = Item::select(Item::ITEM_FIELDLIST, $condition, $params); $items = []; while ($item = Item::fetch($itemdata)) { @@ -259,6 +259,10 @@ class Delivery extends BaseObject return; } + $user = dba::selectFirst('user', [], ['uid' => $target_uid]); + + $target_importer = array_merge($target_importer, $user); + // Set the user id. This is important if this is a public contact $target_importer['importer_uid'] = $target_uid; DFRN::import($atom, $target_importer); diff --git a/view/theme/vier/theme.php b/view/theme/vier/theme.php index cc08a7d71f..b99433f81b 100644 --- a/view/theme/vier/theme.php +++ b/view/theme/vier/theme.php @@ -29,10 +29,12 @@ function vier_init(App $a) $a->set_template_engine('smarty3'); - if ($a->argv[0].$a->argv[1] === "profile".$a->user['nickname'] || $a->argv[0] === "network" && local_user()) { - vier_community_info(); + if (!empty($a->argv[0]) && !empty($a->argv[1])) { + if ($a->argv[0].$a->argv[1] === "profile".$a->user['nickname'] || $a->argv[0] === "network" && local_user()) { + vier_community_info(); - $a->page['htmlhead'] .= "\n"; + $a->page['htmlhead'] .= "\n"; + } } if ($a->is_mobile || $a->is_tablet) { @@ -104,7 +106,7 @@ EOT; // Hide the left menu bar /// @TODO maybe move this static array out where it should belong? - if (($a->page['aside'] == "") && in_array($a->argv[0], ["community", "events", "help", "manage", "notifications", + if (empty($a->page['aside']) && in_array($a->argv[0], ["community", "events", "help", "manage", "notifications", "probe", "webfinger", "login", "invite", "credits"])) { $a->page['htmlhead'] .= ""; } From 7d6933c8985d0cadac471ace77da9e57dbd27d43 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 8 Jul 2018 11:46:05 +0000 Subject: [PATCH 2/6] Avoid "Trying to get property of non-object" --- src/Model/Item.php | 2 +- src/Protocol/DFRN.php | 67 +++++++++++++++++++++---------------------- src/Protocol/Feed.php | 38 ++++++++++++------------ src/Util/XML.php | 15 ++++++++++ 4 files changed, 68 insertions(+), 54 deletions(-) diff --git a/src/Model/Item.php b/src/Model/Item.php index 05254b8eb1..f10c20936a 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -51,7 +51,7 @@ class Item extends BaseObject 'attach', 'tag', 'bookmark', 'deleted', 'extid', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', 'author-id', 'author-link', 'owner-link', 'contact-uid', - 'signed_text', 'signature', 'signer']; + 'signed_text', 'signature', 'signer', 'network']; // Field list for "item-content" table that is mixed with the item table const MIXED_CONTENT_FIELDLIST = ['title', 'content-warning', 'body', 'location', diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 6525601feb..ddbda750b9 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -1534,8 +1534,8 @@ class DFRN private static function fetchauthor($xpath, $context, $importer, $element, $onlyfetch, $xml = "") { $author = []; - $author["name"] = $xpath->evaluate($element."/atom:name/text()", $context)->item(0)->nodeValue; - $author["link"] = $xpath->evaluate($element."/atom:uri/text()", $context)->item(0)->nodeValue; + $author["name"] = XML::getFirstNodeValue($xpath, $element."/atom:name/text()", $context); + $author["link"] = XML::getFirstNodeValue($xpath, $element."/atom:uri/text()", $context); $fields = ['id', 'uid', 'url', 'network', 'avatar-date', 'avatar', 'name-date', 'uri-date', 'addr', 'name', 'nick', 'about', 'location', 'keywords', 'xmpp', 'bdyear', 'bd', 'hidden', 'contact-type']; @@ -1606,33 +1606,33 @@ class DFRN } // Update contact data - $value = $xpath->evaluate($element . "/dfrn:handle/text()", $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, $element . "/dfrn:handle/text()", $context); if ($value != "") { $poco["addr"] = $value; } - $value = $xpath->evaluate($element . "/poco:displayName/text()", $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, $element . "/poco:displayName/text()", $context); if ($value != "") { $poco["name"] = $value; } - $value = $xpath->evaluate($element . "/poco:preferredUsername/text()", $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, $element . "/poco:preferredUsername/text()", $context); if ($value != "") { $poco["nick"] = $value; } - $value = $xpath->evaluate($element . "/poco:note/text()", $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, $element . "/poco:note/text()", $context); if ($value != "") { $poco["about"] = $value; } - $value = $xpath->evaluate($element . "/poco:address/poco:formatted/text()", $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, $element . "/poco:address/poco:formatted/text()", $context); if ($value != "") { $poco["location"] = $value; } /// @todo Only search for elements with "poco:type" = "xmpp" - $value = $xpath->evaluate($element . "/poco:ims/poco:value/text()", $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, $element . "/poco:ims/poco:value/text()", $context); if ($value != "") { $poco["xmpp"] = $value; } @@ -1645,7 +1645,7 @@ class DFRN /// - poco:country // If the "hide" element is present then the profile isn't searchable. - $hide = intval($xpath->evaluate($element . "/dfrn:hide/text()", $context)->item(0)->nodeValue == "true"); + $hide = intval(XML::getFirstNodeValue($xpath, $element . "/dfrn:hide/text()", $context) == "true"); logger("Hidden status for contact " . $contact_old["url"] . ": " . $hide, LOGGER_DEBUG); @@ -1667,7 +1667,7 @@ class DFRN } // "dfrn:birthday" contains the birthday converted to UTC - $birthday = $xpath->evaluate($element . "/dfrn:birthday/text()", $context)->item(0)->nodeValue; + $birthday = XML::getFirstNodeValue($xpath, $element . "/poco:birthday/text()", $context); if (strtotime($birthday) > time()) { $bd_timestamp = strtotime($birthday); @@ -1676,7 +1676,7 @@ class DFRN } // "poco:birthday" is the birthday in the format "yyyy-mm-dd" - $value = $xpath->evaluate($element . "/poco:birthday/text()", $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, $element . "/poco:birthday/text()", $context); if (!in_array($value, ["", "0000-00-00", "0001-01-01"])) { $bdyear = date("Y"); @@ -2410,9 +2410,9 @@ class DFRN $item["source"] = $xml; // Get the uri - $item["uri"] = $xpath->query("atom:id/text()", $entry)->item(0)->nodeValue; + $item["uri"] = XML::getFirstNodeValue($xpath, "atom:id/text()", $entry); - $item["edited"] = $xpath->query("atom:updated/text()", $entry)->item(0)->nodeValue; + $item["edited"] = XML::getFirstNodeValue($xpath, "atom:updated/text()", $entry); $current = Item::selectFirst(['id', 'uid', 'edited', 'body'], ['uri' => $item["uri"], 'uid' => $importer["importer_uid"]] @@ -2435,11 +2435,11 @@ class DFRN $item["author-link"] = $author["link"]; $item["author-id"] = Contact::getIdForURL($author["link"], 0); - $item["title"] = $xpath->query("atom:title/text()", $entry)->item(0)->nodeValue; + $item["title"] = XML::getFirstNodeValue($xpath, "atom:title/text()", $entry); - $item["created"] = $xpath->query("atom:published/text()", $entry)->item(0)->nodeValue; + $item["created"] = XML::getFirstNodeValue($xpath, "atom:published/text()", $entry); - $item["body"] = $xpath->query("dfrn:env/text()", $entry)->item(0)->nodeValue; + $item["body"] = XML::getFirstNodeValue($xpath, "dfrn:env/text()", $entry); $item["body"] = str_replace([' ',"\t","\r","\n"], ['','','',''], $item["body"]); // make sure nobody is trying to sneak some html tags by us $item["body"] = notags(base64url_decode($item["body"])); @@ -2472,18 +2472,15 @@ class DFRN // We don't need the content element since "dfrn:env" is always present //$item["body"] = $xpath->query("atom:content/text()", $entry)->item(0)->nodeValue; - $item["location"] = $xpath->query("dfrn:location/text()", $entry)->item(0)->nodeValue; + $item["location"] = XML::getFirstNodeValue($xpath, "dfrn:location/text()", $entry); - $georsspoint = $xpath->query("georss:point", $entry); - if ($georsspoint) { - $item["coord"] = $georsspoint->item(0)->nodeValue; - } + $item["coord"] = XML::getFirstNodeValue($xpath, "georss:point", $entry); - $item["private"] = $xpath->query("dfrn:private/text()", $entry)->item(0)->nodeValue; + $item["private"] = XML::getFirstNodeValue($xpath, "dfrn:private/text()", $entry); - $item["extid"] = $xpath->query("dfrn:extid/text()", $entry)->item(0)->nodeValue; + $item["extid"] = XML::getFirstNodeValue($xpath, "dfrn:extid/text()", $entry); - if ($xpath->query("dfrn:bookmark/text()", $entry)->item(0)->nodeValue == "true") { + if (XML::getFirstNodeValue($xpath, "dfrn:bookmark/text()", $entry) == "true") { $item["bookmark"] = true; } @@ -2496,18 +2493,18 @@ class DFRN } } - $item["guid"] = $xpath->query("dfrn:diaspora_guid/text()", $entry)->item(0)->nodeValue; + $item["guid"] = XML::getFirstNodeValue($xpath, "dfrn:diaspora_guid/text()", $entry); // We store the data from "dfrn:diaspora_signature" in a different table, this is done in "Item::insert" - $dsprsig = unxmlify($xpath->query("dfrn:diaspora_signature/text()", $entry)->item(0)->nodeValue); + $dsprsig = unxmlify(XML::getFirstNodeValue($xpath, "dfrn:diaspora_signature/text()", $entry)); if ($dsprsig != "") { $item["dsprsig"] = $dsprsig; } - $item["verb"] = $xpath->query("activity:verb/text()", $entry)->item(0)->nodeValue; + $item["verb"] = XML::getFirstNodeValue($xpath, "activity:verb/text()", $entry); - if ($xpath->query("activity:object-type/text()", $entry)->item(0)->nodeValue != "") { - $item["object-type"] = $xpath->query("activity:object-type/text()", $entry)->item(0)->nodeValue; + if (XML::getFirstNodeValue($xpath, "activity:object-type/text()", $entry) != "") { + $item["object-type"] = XML::getFirstNodeValue($xpath, "activity:object-type/text()", $entry); } $object = $xpath->query("activity:object", $entry)->item(0); @@ -2544,8 +2541,10 @@ class DFRN $termhash = array_shift($parts); $termurl = implode(":", $parts); - if (strlen($item["tag"])) { + if (!empty($item["tag"])) { $item["tag"] .= ","; + } else { + $item["tag"] = ""; } $item["tag"] .= $termhash . "[url=" . $termurl . "]" . $term . "[/url]"; @@ -2561,7 +2560,7 @@ class DFRN self::parseLinks($links, $item); } - $item['conversation-uri'] = $xpath->query('ostatus:conversation/text()', $entry)->item(0)->nodeValue; + $item['conversation-uri'] = XML::getFirstNodeValue($xpath, 'ostatus:conversation/text()', $entry); $conv = $xpath->query('ostatus:conversation', $entry); if (is_object($conv->item(0))) { @@ -2835,11 +2834,11 @@ class DFRN logger("Import DFRN message for user " . $importer["importer_uid"] . " from contact " . $importer["id"], LOGGER_DEBUG); // is it a public forum? Private forums aren't exposed with this method - $forum = intval($xpath->evaluate("/atom:feed/dfrn:community/text()")->item(0)->nodeValue); + $forum = intval(XML::getFirstNodeValue($xpath, "/atom:feed/dfrn:community/text()")); // The account type is new since 3.5.1 if ($xpath->query("/atom:feed/dfrn:account_type")->length > 0) { - $accounttype = intval($xpath->evaluate("/atom:feed/dfrn:account_type/text()")->item(0)->nodeValue); + $accounttype = intval(XML::getFirstNodeValue($xpath, "/atom:feed/dfrn:account_type/text()")); if ($accounttype != $importer["contact-type"]) { dba::update('contact', ['contact-type' => $accounttype], ['id' => $importer["id"]]); @@ -2887,7 +2886,7 @@ class DFRN $newentries = []; $entries = $xpath->query("/atom:feed/atom:entry"); foreach ($entries as $entry) { - $created = $xpath->query("atom:published/text()", $entry)->item(0)->nodeValue; + $created = XML::getFirstNodeValue($xpath, "atom:published/text()", $entry); $newentries[strtotime($created)] = $entry; } diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php index 29ab21d1f1..c0b094caef 100644 --- a/src/Protocol/Feed.php +++ b/src/Protocol/Feed.php @@ -131,11 +131,11 @@ class Feed { if ($value != "") { $author["author-nick"] = $value; } - $value = $xpath->evaluate('atom:author/poco:address/poco:formatted/text()')->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, 'atom:author/poco:address/poco:formatted/text()'); if ($value != "") { $author["author-location"] = $value; } - $value = $xpath->evaluate('atom:author/poco:note/text()')->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, 'atom:author/poco:note/text()'); if ($value != "") { $author["author-about"] = $value; } @@ -149,9 +149,9 @@ class Feed { } } - $author["edited"] = $author["created"] = $xpath->query('/atom:feed/atom:updated/text()')->item(0)->nodeValue; + $author["edited"] = $author["created"] = XML::getFirstNodeValue($xpath, '/atom:feed/atom:updated/text()'); - $author["app"] = $xpath->evaluate('/atom:feed/atom:generator/text()')->item(0)->nodeValue; + $author["app"] = XML::getFirstNodeValue($xpath, '/atom:feed/atom:generator/text()'); $entries = $xpath->query('/atom:feed/atom:entry'); } @@ -226,16 +226,16 @@ class Feed { } } if ($item["plink"] == "") { - $item["plink"] = $xpath->evaluate('link/text()', $entry)->item(0)->nodeValue; + $item["plink"] = XML::getFirstNodeValue($xpath, 'link/text()', $entry); } if ($item["plink"] == "") { - $item["plink"] = $xpath->evaluate('rss:link/text()', $entry)->item(0)->nodeValue; + $item["plink"] = XML::getFirstNodeValue($xpath, 'rss:link/text()', $entry); } - $item["uri"] = $xpath->evaluate('atom:id/text()', $entry)->item(0)->nodeValue; + $item["uri"] = XML::getFirstNodeValue($xpath, 'atom:id/text()', $entry); if ($item["uri"] == "") { - $item["uri"] = $xpath->evaluate('guid/text()', $entry)->item(0)->nodeValue; + $item["uri"] = XML::getFirstNodeValue($xpath, 'guid/text()', $entry); } if ($item["uri"] == "") { $item["uri"] = $item["plink"]; @@ -257,23 +257,23 @@ class Feed { } } - $item["title"] = $xpath->evaluate('atom:title/text()', $entry)->item(0)->nodeValue; + $item["title"] = XML::getFirstNodeValue($xpath, 'atom:title/text()', $entry); if ($item["title"] == "") { - $item["title"] = $xpath->evaluate('title/text()', $entry)->item(0)->nodeValue; + $item["title"] = XML::getFirstNodeValue($xpath, 'title/text()', $entry); } if ($item["title"] == "") { - $item["title"] = $xpath->evaluate('rss:title/text()', $entry)->item(0)->nodeValue; + $item["title"] = XML::getFirstNodeValue($xpath, 'rss:title/text()', $entry); } - $published = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue; + $published = XML::getFirstNodeValue($xpath, 'atom:published/text()', $entry); if ($published == "") { - $published = $xpath->query('pubDate/text()', $entry)->item(0)->nodeValue; + $published = XML::getFirstNodeValue($xpath, 'pubDate/text()', $entry); } if ($published == "") { - $published = $xpath->query('dc:date/text()', $entry)->item(0)->nodeValue; + $published = XML::getFirstNodeValue($xpath, 'dc:date/text()', $entry); } - $updated = $xpath->query('atom:updated/text()', $entry)->item(0)->nodeValue; + $updated = XML::getFirstNodeValue($xpath, 'atom:updated/text()', $entry); if ($updated == "") { $updated = $published; @@ -284,18 +284,18 @@ class Feed { if ($updated != "") { $item["edited"] = $updated; } - $creator = $xpath->query('author/text()', $entry)->item(0)->nodeValue; + $creator = XML::getFirstNodeValue($xpath, 'author/text()', $entry); if ($creator == "") { - $creator = $xpath->query('atom:author/atom:name/text()', $entry)->item(0)->nodeValue; + $creator = XML::getFirstNodeValue($xpath, 'atom:author/atom:name/text()', $entry); } if ($creator == "") { - $creator = $xpath->query('dc:creator/text()', $entry)->item(0)->nodeValue; + $creator = XML::getFirstNodeValue($xpath, 'dc:creator/text()', $entry); } if ($creator != "") { $item["author-name"] = $creator; } - $creator = $xpath->query('dc:creator/text()', $entry)->item(0)->nodeValue; + $creator = XML::getFirstNodeValue($xpath, 'dc:creator/text()', $entry); if ($creator != "") { $item["author-name"] = $creator; diff --git a/src/Util/XML.php b/src/Util/XML.php index 8dc5403243..03e17a5540 100644 --- a/src/Util/XML.php +++ b/src/Util/XML.php @@ -431,4 +431,19 @@ class XML } return $x; } + + public static function getFirstNodeValue($xpath, $element, $context = null) + { + $result = $xpath->evaluate($element, $context); + if (!is_object($result)) { + return ''; + } + + $first_item = $result->item(0); + if (!is_object($first_item)) { + return ''; + } + + return $first_item->nodeValue; + } } From 8a2230bc4c803b5cac552c4e8b945ad922dfc77c Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 8 Jul 2018 12:01:36 +0000 Subject: [PATCH 3/6] Avoid warnings in addons --- include/conversation.php | 1 + 1 file changed, 1 insertion(+) diff --git a/include/conversation.php b/include/conversation.php index 438019fd01..d5ba8a6837 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -721,6 +721,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false, $order = continue; } + $arr = ['item' => $item]; Addon::callHooks('display_item', $arr); $item['pagedrop'] = $page_dropping; From 1d745c25a7b067951ea24c69209b9a54fbbe8c5d Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 8 Jul 2018 12:58:43 +0000 Subject: [PATCH 4/6] Some more places ... --- mod/display.php | 12 +++++----- mod/poco.php | 17 +++++++++----- src/Model/Profile.php | 2 +- src/Protocol/DFRN.php | 2 +- src/Protocol/OStatus.php | 50 +++++++++++++++++++--------------------- src/Util/Network.php | 32 +++++++++++++++++++++++-- 6 files changed, 73 insertions(+), 42 deletions(-) diff --git a/mod/display.php b/mod/display.php index 10862d57cc..1f2e18708d 100644 --- a/mod/display.php +++ b/mod/display.php @@ -356,11 +356,11 @@ function display_content(App $a, $update = false, $update_uid = 0) $o .= conversation($a, $conversation_items, 'display', $update_uid, false, 'commented', local_user()); // Preparing the meta header - $description = trim(HTML::toPlaintext(BBCode::convert($items["body"], false), 0, true)); - $title = trim(HTML::toPlaintext(BBCode::convert($items["title"], false), 0, true)); - $author_name = $items["author-name"]; + $description = trim(HTML::toPlaintext(BBCode::convert($items[0]["body"], false), 0, true)); + $title = trim(HTML::toPlaintext(BBCode::convert($items[0]["title"], false), 0, true)); + $author_name = $items[0]["author-name"]; - $image = $a->remove_baseurl($items["author-thumb"]); + $image = $a->remove_baseurl($items[0]["author-avatar"]); if ($title == "") { $title = $author_name; @@ -392,7 +392,7 @@ function display_content(App $a, $update = false, $update_uid = 0) $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; - $a->page['htmlhead'] .= ''."\n"; + $a->page['htmlhead'] .= ''."\n"; // Dublin Core $a->page['htmlhead'] .= ''."\n"; @@ -402,7 +402,7 @@ function display_content(App $a, $update = false, $update_uid = 0) $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; - $a->page['htmlhead'] .= ''."\n"; + $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; $a->page['htmlhead'] .= ''."\n"; // article:tag diff --git a/mod/poco.php b/mod/poco.php index 671551f832..de3b42bb75 100644 --- a/mod/poco.php +++ b/mod/poco.php @@ -31,7 +31,7 @@ function poco_init(App $a) { $system_mode = true; } - $format = (($_GET['format']) ? $_GET['format'] : 'json'); + $format = defaults($_GET, 'format', 'json'); $justme = false; $global = false; @@ -76,11 +76,11 @@ function poco_init(App $a) { if ($justme) { $sql_extra = " AND `contact`.`self` = 1 "; + } else { + $sql_extra = ""; } -// else -// $sql_extra = " AND `contact`.`self` = 0 "; - if ($cid) { + if (!empty($cid)) { $sql_extra = sprintf(" AND `contact`.`id` = %d ", intval($cid)); } if (x($_GET, 'updatedSince')) { @@ -112,8 +112,9 @@ function poco_init(App $a) { } else { $totalResults = 0; } - $startIndex = intval($_GET['startIndex']); - if (! $startIndex) { + if (!empty($_GET['startIndex'])) { + $startIndex = intval($_GET['startIndex']); + } else { $startIndex = 0; } $itemsPerPage = ((x($_GET, 'count') && intval($_GET['count'])) ? intval($_GET['count']) : $totalResults); @@ -204,6 +205,10 @@ function poco_init(App $a) { if (is_array($contacts)) { if (DBM::is_result($contacts)) { foreach ($contacts as $contact) { + if (!isset($contact['updated'])) { + $contact['updated'] = ''; + } + if (! isset($contact['generation'])) { if ($global) { $contact['generation'] = 3; diff --git a/src/Model/Profile.php b/src/Model/Profile.php index 631ddd2f0d..94d8de572c 100644 --- a/src/Model/Profile.php +++ b/src/Model/Profile.php @@ -112,7 +112,7 @@ class Profile } } - $pdata = self::getByNickname($nickname, $user[0]['uid'], $profile); + $pdata = self::getByNickname($nickname, $user['uid'], $profile); if (empty($pdata) && empty($profiledata)) { logger('profile error: ' . $a->query_string, LOGGER_DEBUG); diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index ddbda750b9..e37bfae560 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -2746,7 +2746,7 @@ class DFRN } $condition = ['uri' => $uri, 'uid' => $importer["importer_uid"]]; - $item = Item::selectFirst(['id', 'parent', 'contact-id', 'file'], $condition); + $item = Item::selectFirst(['id', 'parent', 'contact-id', 'file', 'deleted'], $condition); if (!DBM::is_result($item)) { logger("Item with uri " . $uri . " for user " . $importer["importer_uid"] . " wasn't found.", LOGGER_DEBUG); return; diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index 40218b0dfd..1c0cffb302 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -55,9 +55,9 @@ class OStatus private static function fetchAuthor($xpath, $context, $importer, &$contact, $onlyfetch) { $author = []; - $author["author-link"] = $xpath->evaluate('atom:author/atom:uri/text()', $context)->item(0)->nodeValue; - $author["author-name"] = $xpath->evaluate('atom:author/atom:name/text()', $context)->item(0)->nodeValue; - $addr = $xpath->evaluate('atom:author/atom:email/text()', $context)->item(0)->nodeValue; + $author["author-link"] = XML::getFirstNodeValue($xpath, 'atom:author/atom:uri/text()', $context); + $author["author-name"] = XML::getFirstNodeValue($xpath, 'atom:author/atom:name/text()', $context); + $addr = XML::getFirstNodeValue($xpath, 'atom:author/atom:email/text()', $context); $aliaslink = $author["author-link"]; @@ -126,7 +126,7 @@ class OStatus $author["author-avatar"] = Probe::fixAvatar(current($avatarlist), $author["author-link"]); } - $displayname = $xpath->evaluate('atom:author/poco:displayName/text()', $context)->item(0)->nodeValue; + $displayname = XML::getFirstNodeValue($xpath, 'atom:author/poco:displayName/text()', $context); if ($displayname != "") { $author["author-name"] = $displayname; } @@ -155,27 +155,27 @@ class OStatus $contact['url'] = $author["author-link"]; $contact['nurl'] = normalise_link($contact['url']); - $value = $xpath->evaluate('atom:author/atom:uri/text()', $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, 'atom:author/atom:uri/text()', $context); if ($value != "") { $contact["alias"] = $value; } - $value = $xpath->evaluate('atom:author/poco:displayName/text()', $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, 'atom:author/poco:displayName/text()', $context); if ($value != "") { $contact["name"] = $value; } - $value = $xpath->evaluate('atom:author/poco:preferredUsername/text()', $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, 'atom:author/poco:preferredUsername/text()', $context); if ($value != "") { $contact["nick"] = $value; } - $value = $xpath->evaluate('atom:author/poco:note/text()', $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, 'atom:author/poco:note/text()', $context); if ($value != "") { $contact["about"] = HTML::toBBCode($value); } - $value = $xpath->evaluate('atom:author/poco:address/poco:formatted/text()', $context)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, 'atom:author/poco:address/poco:formatted/text()', $context); if ($value != "") { $contact["location"] = $value; } @@ -390,7 +390,7 @@ class OStatus $author = self::fetchAuthor($xpath, $entry, $importer, $contact, $stored); } - $value = $xpath->evaluate('atom:author/poco:preferredUsername/text()', $entry)->item(0)->nodeValue; + $value = XML::getFirstNodeValue($xpath, 'atom:author/poco:preferredUsername/text()', $context); if ($value != "") { $nickname = $value; } else { @@ -399,9 +399,9 @@ class OStatus $item = array_merge($header, $author); - $item["uri"] = $xpath->query('atom:id/text()', $entry)->item(0)->nodeValue; + $item["uri"] = XML::getFirstNodeValue($xpath, 'atom:id/text()', $entry); - $item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue; + $item["verb"] = XML::getFirstNodeValue($xpath, 'activity:verb/text()', $entry); // Delete a message if (in_array($item["verb"], ['qvitter-delete-notice', ACTIVITY_DELETE, 'delete'])) { @@ -561,19 +561,18 @@ class OStatus */ private static function processPost($xpath, $entry, &$item, $importer) { - $item["body"] = HTML::toBBCode($xpath->query('atom:content/text()', $entry)->item(0)->nodeValue); - $item["object-type"] = $xpath->query('activity:object-type/text()', $entry)->item(0)->nodeValue; + $item["body"] = HTML::toBBCode(XML::getFirstNodeValue($xpath, 'atom:content/text()', $entry)); + $item["object-type"] = XML::getFirstNodeValue($xpath, 'activity:object-type/text()', $entry); if (($item["object-type"] == ACTIVITY_OBJ_BOOKMARK) || ($item["object-type"] == ACTIVITY_OBJ_EVENT)) { - $item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue; - $item["body"] = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; + $item["title"] = XML::getFirstNodeValue($xpath, 'atom:title/text()', $entry); + $item["body"] = XML::getFirstNodeValue($xpath, 'atom:summary/text()', $entry); } elseif ($item["object-type"] == ACTIVITY_OBJ_QUESTION) { - $item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue; + $item["title"] = XML::getFirstNodeValue($xpath, 'atom:title/text()', $entry); } - $item["created"] = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue; - $item["edited"] = $xpath->query('atom:updated/text()', $entry)->item(0)->nodeValue; - $conversation = $xpath->query('ostatus:conversation/text()', $entry)->item(0)->nodeValue; - $item['conversation-uri'] = $conversation; + $item["created"] = XML::getFirstNodeValue($xpath, 'atom:published/text()', $entry); + $item["edited"] = XML::getFirstNodeValue($xpath, 'atom:updated/text()', $entry); + $item['conversation-uri'] = XML::getFirstNodeValue($xpath, 'ostatus:conversation/text()', $entry); $conv = $xpath->query('ostatus:conversation', $entry); if (is_object($conv->item(0))) { @@ -661,7 +660,7 @@ class OStatus // Mastodon Content Warning if (($item["verb"] == ACTIVITY_POST) && $xpath->evaluate('boolean(atom:summary)', $entry)) { - $clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; + $clear_text = XML::getFirstNodeValue($xpath, 'atom:summary/text()', $entry); if (!empty($clear_text)) { $item['content-warning'] = HTML::toBBCode($clear_text); } @@ -787,7 +786,7 @@ class OStatus $conv_data['protocol'] = PROTOCOL_SPLITTED_CONV; $conv_data['network'] = NETWORK_OSTATUS; - $conv_data['uri'] = $xpath->query('atom:id/text()', $entry)->item(0)->nodeValue; + $conv_data['uri'] = XML::getFirstNodeValue($xpath, 'atom:id/text()', $entry); $inreplyto = $xpath->query('thr:in-reply-to', $entry); if (is_object($inreplyto->item(0))) { @@ -798,8 +797,7 @@ class OStatus } } - $conv = $xpath->query('ostatus:conversation/text()', $entry)->item(0)->nodeValue; - $conv_data['conversation-uri'] = $conv; + $conv_data['conversation-uri'] = XML::getFirstNodeValue($xpath, 'ostatus:conversation/text()', $entry); $conv = $xpath->query('ostatus:conversation', $entry); if (is_object($conv->item(0))) { @@ -1003,7 +1001,7 @@ class OStatus $link_data = []; - $orig_uri = $xpath->query('atom:id/text()', $activityobjects)->item(0)->nodeValue; + $orig_uri = XML::getFirstNodeValue($xpath, 'atom:id/text()', $activityobjects); $links = $xpath->query("atom:link", $activityobjects); if ($links) { diff --git a/src/Util/Network.php b/src/Util/Network.php index c3ecaf6060..393b993e35 100644 --- a/src/Util/Network.php +++ b/src/Util/Network.php @@ -410,7 +410,7 @@ class Network $matches = []; $new_location_info = @parse_url($curl_info['redirect_url']); $old_location_info = @parse_url($curl_info['url']); - + preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches); $newurl = trim(array_pop($matches)); @@ -654,7 +654,7 @@ class Network public static function stripTrackingQueryParams($url) { $urldata = parse_url($url); - if (is_string($urldata["query"])) { + if (!empty($urldata["query"])) { $query = $urldata["query"]; parse_str($query, $querydata); @@ -838,14 +838,35 @@ class Network return ""; } + if (empty($parts1["scheme"])) { + $parts1["scheme"] = ''; + } + if (empty($parts2["scheme"])) { + $parts2["scheme"] = ''; + } + if ($parts1["scheme"] != $parts2["scheme"]) { return ""; } + if (empty($parts1["host"])) { + $parts1["host"] = ''; + } + if (empty($parts2["host"])) { + $parts2["host"] = ''; + } + if ($parts1["host"] != $parts2["host"]) { return ""; } + if (empty($parts1["port"])) { + $parts1["port"] = ''; + } + if (empty($parts2["port"])) { + $parts2["port"] = ''; + } + if ($parts1["port"] != $parts2["port"]) { return ""; } @@ -856,6 +877,13 @@ class Network $match .= ":".$parts1["port"]; } + if (empty($parts1["path"])) { + $parts1["path"] = ''; + } + if (empty($parts2["path"])) { + $parts2["path"] = ''; + } + $pathparts1 = explode("/", $parts1["path"]); $pathparts2 = explode("/", $parts2["path"]); From 6d90751110ae32d76b5876784e8c40a80869b72a Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 8 Jul 2018 13:39:48 +0000 Subject: [PATCH 5/6] Added missing "use --- src/Protocol/Feed.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Protocol/Feed.php b/src/Protocol/Feed.php index c0b094caef..7be2ef8b4b 100644 --- a/src/Protocol/Feed.php +++ b/src/Protocol/Feed.php @@ -11,6 +11,7 @@ use Friendica\Core\System; use Friendica\Model\Item; use Friendica\Util\Network; use Friendica\Content\Text\HTML; +use Friendica\Util\XML; use dba; use DOMDocument; From 675a6adf356689c9e504c4a65eacd073aad421eb Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 8 Jul 2018 13:52:11 +0000 Subject: [PATCH 6/6] Added comment --- include/conversation.php | 1 + 1 file changed, 1 insertion(+) diff --git a/include/conversation.php b/include/conversation.php index d5ba8a6837..5ce02a55f6 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -721,6 +721,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false, $order = continue; } + /// @todo Check if this call is needed or not $arr = ['item' => $item]; Addon::callHooks('display_item', $arr);