From 82321114abb1339837d05ce119be45bef3c06595 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 1 Nov 2017 23:20:43 +0000 Subject: [PATCH] If a post is dedicated to a single forum then it will be rewritten to a forum post --- include/dfrn.php | 93 +++++++++++++++++++++++++++++++++++++++++++----- mod/item.php | 4 ++- object/Item.php | 4 ++- 3 files changed, 90 insertions(+), 11 deletions(-) diff --git a/include/dfrn.php b/include/dfrn.php index 55c51cb011..faa98c8e29 100644 --- a/include/dfrn.php +++ b/include/dfrn.php @@ -1987,6 +1987,81 @@ class dfrn { return true; } + /** + * @brief Check and possibly rewrite a post if it was a dedicated forum post + * + * @param array $item the new item record + * + * @return boolean Was the post be rewritten? + */ + private static function rewriteDedicatedForumPost($item) { + $fields = array('author-link', 'allow_cid', 'contact-id', 'private', 'wall', 'id', 'parent'); + $condition = array('uri' => $item['uri'], 'uid' => $item['uid']); + $existing = dba::select('item', $fields, $condition, array('limit' => 1)); + if (!dbm::is_result($existing)) { + return false; + } + + // Only rewrite if the former post was a private starting post + if (!$existing['wall'] || !$existing['private'] || ($existing['id'] != $existing['parent'])) { + return false; + } + + // Is the post only directed to a sigle forum + if ($existing['allow_cid'] != '<'.$item['contact-id'].'>') { + return false; + } + + $fields = array('id'); + $condition = array('uid' => $item['uid'], 'self' => true); + $self = dba::select('contact', $fields, $condition, array('limit' => 1)); + if (!dbm::is_result($self)) { + return false; + } + + // is the original item created by the "self" user. + if ($self['id'] != $existing['contact-id']) { + return false; + } + + $fields = array('forum', 'prv'); + $condition = array('id' => $item['contact-id']); + $contact = dba::select('contact', $fields, $condition, array('limit' => 1)); + if (!dbm::is_result($contact)) { + return false; + } + + // Is the post from a forum? + if (!$contact['forum'] && !$contact['prv']) { + return false; + } + + /// @todo There is an ugly downside of this whole rewrite process: These items loose the ability to be edited by the user. + logger('Item '.$item['uri'].' will be rewritten.', LOGGER_DEBUG); + + $item = store_conversation($item); + unset($fields['dsprsig']); + + // Rewrite to a public post if it comes from a public forum + if ($contact['forum']) { + $item['allow_cid'] = ''; + $item['allow_gid'] = ''; + $item['deny_cid'] = ''; + $item['deny_gid'] = ''; + $item['private'] = false; + } + + $item['wall'] = false; + + $item["owner-id"] = get_contact($item["owner-link"], 0); + + $condition = array('uri' => $item["uri"], 'uid' => $item["uid"]); + dba::update('item', $item, $condition); + + add_thread($existing['id']); + return true; + } + /** * @brief Updates an item * @@ -2006,15 +2081,15 @@ class dfrn { return false; } - $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s', `changed` = '%s' WHERE `uri` = '%s' AND `uid` IN (0, %d)", - dbesc($item["title"]), - dbesc($item["body"]), - dbesc($item["tag"]), - dbesc(datetime_convert("UTC","UTC",$item["edited"])), - dbesc(datetime_convert()), - dbesc($item["uri"]), - intval($importer["importer_uid"]) - ); + if (!self::rewriteDedicatedForumPost($item)) { + $fields = array('title' => $item["title"], 'body' => $item["body"], + 'tag' => $item["tag"], 'changed' => datetime_convert(), + 'edited' => datetime_convert("UTC", "UTC", $item["edited"])); + + $condition = array("`uri` = ? AND `uid` IN (0, ?)", $item["uri"], $importer["importer_uid"]); + dba::update('item', $fields, $condition); + } + create_tags_from_itemuri($item["uri"], $importer["importer_uid"]); update_thread_uri($item["uri"], $importer["importer_uid"]); diff --git a/mod/item.php b/mod/item.php index 0bb0d17dbe..77f927223b 100644 --- a/mod/item.php +++ b/mod/item.php @@ -575,6 +575,7 @@ function item_post(App $a) { $tagged = array(); $private_forum = false; + $only_to_forum = false; if (count($tags)) { foreach ($tags as $tag) { @@ -608,12 +609,13 @@ function item_post(App $a) { // When the forum is private or the forum is addressed with a "!" make the post private if (is_array($success['contact']) && ($success['contact']['prv'] || ($tag_type == '!'))) { $private_forum = true; + $only_to_forum = ($tag_type == '!'); $private_id = $success['contact']['id']; } } } - if ($private_forum && !$parent && !$private) { + if ($private_forum && !$parent && (!$private || $only_to_forum)) { // we tagged a private forum in a top level post and the message was public. // Restrict it. $private = 1; diff --git a/object/Item.php b/object/Item.php index 4f89ea804c..c7a1bcabbd 100644 --- a/object/Item.php +++ b/object/Item.php @@ -127,7 +127,9 @@ class Item extends BaseObject { ? t('Private Message') : false); $shareable = ((($conv->get_profile_owner() == local_user()) && ($item['private'] != 1)) ? true : false); - if (local_user() && link_compare($a->contact['url'],$item['author-link'])) { + + /// @todo The check for the contact-id is here to block editing of rewritten forum posts - see function dfrn::rewriteDedicatedForumPost + if (local_user() && link_compare($a->contact['url'],$item['author-link']) && ($a->contact['id'] == $item['contact-id'])) { if ($item["event-id"] != 0) { $edpost = array("events/event/".$item['event-id'], t("Edit")); } else { -- 2.39.5