diff --git a/src/Model/Item.php b/src/Model/Item.php index 01a0b7497c..ab291a3306 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -355,6 +355,13 @@ class Item extends BaseObject unset($item['dsprsig']); } + if (!empty($item['diaspora_signed_text'])) { + $diaspora_signed_text = $item['diaspora_signed_text']; + unset($item['diaspora_signed_text']); + } else { + $diaspora_signed_text = ''; + } + // Converting the plink /// @TODO Check if this is really still needed if ($item['network'] == NETWORK_OSTATUS) { @@ -553,7 +560,7 @@ class Item extends BaseObject $fields = ['uri', 'parent-uri', 'id', 'deleted', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid', - 'wall', 'private', 'forum_mode']; + 'wall', 'private', 'forum_mode', 'origin']; $condition = ['uri' => $item['parent-uri'], 'uid' => $item['uid']]; $params = ['order' => ['id' => false]]; $parent = dba::selectFirst('item', $fields, $condition, $params); @@ -805,6 +812,12 @@ class Item extends BaseObject 'signature' => $dsprsig->signature, 'signer' => $dsprsig->signer]); } + if (!empty($diaspora_signed_text)) { + // Formerly we stored the signed text, the signature and the author in different fields. + // We now store the raw data so that we are more flexible. + dba::insert('sign', ['iid' => $current_post, 'signed_text' => $diaspora_signed_text]); + } + $deleted = self::tagDeliver($item['uid'], $current_post); /* @@ -849,6 +862,8 @@ class Item extends BaseObject if ($notify) { Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => true], "Notifier", $notify_type, $current_post); + } elseif (!empty($parent) && $parent['origin']) { + Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => true], "Notifier", "comment-import", $current_post); } return $current_post; @@ -857,9 +872,10 @@ class Item extends BaseObject /** * @brief Distributes public items to the receivers * - * @param integer $itemid Item ID that should be added + * @param integer $itemid Item ID that should be added + * @param string $signed_text Original text (for Diaspora signatures), JSON encoded. */ - public static function distribute($itemid) + public static function distribute($itemid, $signed_text = '') { $condition = ["`id` IN (SELECT `parent` FROM `item` WHERE `id` = ?)", $itemid]; $parent = dba::selectFirst('item', ['owner-id'], $condition); @@ -894,14 +910,22 @@ class Item extends BaseObject $users[$contact['uid']] = $contact['uid']; } + $origin_uid = 0; + if ($item['uri'] != $item['parent-uri']) { - $parents = dba::select('item', ['uid'], ["`uri` = ? AND `uid` != 0", $item['parent-uri']]); + $parents = dba::select('item', ['uid', 'origin'], ["`uri` = ? AND `uid` != 0", $item['parent-uri']]); while ($parent = dba::fetch($parents)) { $users[$parent['uid']] = $parent['uid']; + if ($parent['origin'] && !$item['origin']) { + $origin_uid = $parent['uid']; + } } } foreach ($users as $uid) { + if ($origin_uid == $uid) { + $item['diaspora_signed_text'] = $signed_text; + } self::storeForUser($itemid, $item, $uid); } } diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index e8fdd99c5b..adb1e8cbfa 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -1747,6 +1747,12 @@ class Diaspora self::fetchGuid($datarray); + // If we are the origin of the parent we store the original data. + // We notify our followers during the item storage. + if ($parent_item["origin"]) { + $datarray['diaspora_signed_text'] = json_encode($data); + } + $message_id = Item::insert($datarray); if ($message_id <= 0) { @@ -1756,20 +1762,10 @@ class Diaspora if ($message_id) { logger("Stored comment ".$datarray["guid"]." with message id ".$message_id, LOGGER_DEBUG); if ($datarray['uid'] == 0) { - Item::distribute($message_id); + Item::distribute($message_id, json_encode($data)); } } - // If we are the origin of the parent we store the original data and notify our followers - if ($message_id && $parent_item["origin"]) { - // Formerly we stored the signed text, the signature and the author in different fields. - // We now store the raw data so that we are more flexible. - dba::insert('sign', ['iid' => $message_id, 'signed_text' => json_encode($data)]); - - // notify others - Worker::add(PRIORITY_HIGH, "Notifier", "comment-import", $message_id); - } - return true; } @@ -2071,6 +2067,20 @@ class Diaspora $datarray["body"] = self::constructLikeBody($contact, $parent_item, $guid); + // like on comments have the comment as parent. So we need to fetch the toplevel parent + if ($parent_item["id"] != $parent_item["parent"]) { + $toplevel = dba::selectFirst('item', ['origin'], ['id' => $parent_item["parent"]]); + $origin = $toplevel["origin"]; + } else { + $origin = $parent_item["origin"]; + } + + // If we are the origin of the parent we store the original data. + // We notify our followers during the item storage. + if ($origin) { + $datarray['diaspora_signed_text'] = json_encode($data); + } + $message_id = Item::insert($datarray); if ($message_id <= 0) { @@ -2080,28 +2090,10 @@ class Diaspora if ($message_id) { logger("Stored like ".$datarray["guid"]." with message id ".$message_id, LOGGER_DEBUG); if ($datarray['uid'] == 0) { - Item::distribute($message_id); + Item::distribute($message_id, json_encode($data)); } } - // like on comments have the comment as parent. So we need to fetch the toplevel parent - if ($parent_item["id"] != $parent_item["parent"]) { - $toplevel = dba::selectFirst('item', ['origin'], ['id' => $parent_item["parent"]]); - $origin = $toplevel["origin"]; - } else { - $origin = $parent_item["origin"]; - } - - // If we are the origin of the parent we store the original data and notify our followers - if ($message_id && $origin) { - // Formerly we stored the signed text, the signature and the author in different fields. - // We now store the raw data so that we are more flexible. - dba::insert('sign', ['iid' => $message_id, 'signed_text' => json_encode($data)]); - - // notify others - Worker::add(PRIORITY_HIGH, "Notifier", "comment-import", $message_id); - } - return true; }