From b457ed68766a559894bcd50c213b2cb3cb3c5d39 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 19 Dec 2017 17:15:56 +0000 Subject: [PATCH] Preparation for being able to comment every public item --- include/conversation.php | 11 ++-- mod/display.php | 110 ++++++++++++++++++++++----------------- src/Object/Post.php | 3 +- src/Object/Thread.php | 8 +-- src/Protocol/DFRN.php | 19 +++---- 5 files changed, 80 insertions(+), 71 deletions(-) diff --git a/include/conversation.php b/include/conversation.php index 5d64bcef76..f10279c333 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -497,7 +497,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { $ssl_state = ((local_user()) ? true : false); $profile_owner = 0; - $page_writeable = false; $live_update_div = ''; $arr_blocked = null; @@ -517,7 +516,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { if ($mode === 'network') { $profile_owner = local_user(); - $page_writeable = true; if (!$update) { /* * The special div is needed for liveUpdate to kick in for this page. @@ -545,7 +543,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { } } elseif ($mode === 'profile') { $profile_owner = $a->profile['profile_uid']; - $page_writeable = can_write_wall($a,$profile_owner); if (!$update) { $tab = notags(trim($_GET['tab'])); @@ -563,7 +560,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { } } elseif ($mode === 'notes') { $profile_owner = local_user(); - $page_writeable = true; if (!$update) { $live_update_div = '
' . "\r\n" . "\r\n"; @@ -617,6 +611,9 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { $page_template = get_markup_template("conversation.tpl"); if ($items && count($items)) { + // Currently disabled. This is a preparation for the ability to comment and share every public item. + // $writable = ($items[0]['uid'] == 0) && in_array($items[0]['network'], array(NETWORK_OSTATUS, NETWORK_DIASPORA)); + $writable = false; if ($mode === 'network-new' || $mode === 'search' || $mode === 'community') { @@ -832,7 +829,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { // Normal View $page_template = get_markup_template("threaded_conversation.tpl"); - $conv = new Thread($mode, $preview); + $conv = new Thread($mode, $preview, $writable); /* * get all the topmost parents diff --git a/mod/display.php b/mod/display.php index 2d22637ece..158523945a 100644 --- a/mod/display.php +++ b/mod/display.php @@ -30,10 +30,11 @@ function display_init(App $a) { } } + $r = false; + // If there is only one parameter, then check if this parameter could be a guid if ($a->argc == 2) { $nick = ""; - $itemuid = 0; $r = false; // Does the local user have this item? @@ -44,7 +45,6 @@ function display_init(App $a) { AND `guid` = ? AND `uid` = ? LIMIT 1", $a->argv[1], local_user()); if (DBM::is_result($r)) { $nick = $a->user["nickname"]; - $itemuid = local_user(); } } @@ -71,43 +71,52 @@ function display_init(App $a) { AND `item`.`guid` = ? LIMIT 1", $a->argv[1]); } - if (DBM::is_result($r)) { - - if (strstr($_SERVER['HTTP_ACCEPT'], 'application/atom+xml')) { - logger('Directly serving XML for id '.$r["id"], LOGGER_DEBUG); - displayShowFeed($r["id"], false); - } - - if ($r["id"] != $r["parent"]) { - $r = dba::fetch_first("SELECT `id`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` - WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` - AND `id` = ?", $r["parent"]); - } - - $profiledata = display_fetchauthor($a, $r); - - if (strstr(normalise_link($profiledata["url"]), normalise_link(System::baseUrl()))) { - $nickname = str_replace(normalise_link(System::baseUrl())."/profile/", "", normalise_link($profiledata["url"])); - - if (($nickname != $a->user["nickname"])) { - $r = dba::fetch_first("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile` - INNER JOIN `contact` on `contact`.`uid` = `profile`.`uid` INNER JOIN `user` ON `profile`.`uid` = `user`.`uid` - WHERE `user`.`nickname` = ? AND `profile`.`is-default` AND `contact`.`self` LIMIT 1", - $nickname - ); - if (DBM::is_result($r)) { - $profiledata = $r; - } - $profiledata["network"] = NETWORK_DFRN; - } else { - $profiledata = array(); - } - } - } else { + if (!DBM::is_result($r)) { $a->error = 404; notice(t('Item not found.') . EOL); return; } + } elseif (($a->argc == 3) && ($nick == '_feed_')) { + $r = dba::fetch_first("SELECT `id`, `parent`, `author-name`, `author-link`, + `author-avatar`, `network`, `body`, `uid`, `owner-link` + FROM `item` WHERE `visible` AND NOT `deleted` AND NOT `moderated` + AND `allow_cid` = '' AND `allow_gid` = '' + AND `deny_cid` = '' AND `deny_gid` = '' + AND NOT `private` AND `uid` = 0 + AND `id` = ? LIMIT 1", $a->argv[2]); + } + + if (DBM::is_result($r)) { + if (strstr($_SERVER['HTTP_ACCEPT'], 'application/atom+xml')) { + logger('Directly serving XML for id '.$r["id"], LOGGER_DEBUG); + displayShowFeed($r["id"], false); + } + + if ($r["id"] != $r["parent"]) { + $r = dba::fetch_first("SELECT `id`, `author-name`, `author-link`, `author-avatar`, `network`, `body`, `uid`, `owner-link` FROM `item` + WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` + AND `id` = ?", $r["parent"]); + } + + $profiledata = display_fetchauthor($a, $r); + + if (strstr(normalise_link($profiledata["url"]), normalise_link(System::baseUrl()))) { + $nickname = str_replace(normalise_link(System::baseUrl())."/profile/", "", normalise_link($profiledata["url"])); + + if (($nickname != $a->user["nickname"])) { + $r = dba::fetch_first("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile` + INNER JOIN `contact` on `contact`.`uid` = `profile`.`uid` INNER JOIN `user` ON `profile`.`uid` = `user`.`uid` + WHERE `user`.`nickname` = ? AND `profile`.`is-default` AND `contact`.`self` LIMIT 1", + $nickname + ); + if (DBM::is_result($r)) { + $profiledata = $r; + } + $profiledata["network"] = NETWORK_DFRN; + } else { + $profiledata = array(); + } + } } profile_load($a, $nick, 0, $profiledata); @@ -223,6 +232,7 @@ function display_content(App $a, $update = 0) { $item_id = (($a->argc > 2) ? $a->argv[2] : 0); if ($a->argc == 2) { + $item_parent = 0; $nick = ""; if (local_user()) { @@ -236,7 +246,19 @@ function display_content(App $a, $update = 0) { } } - if ($nick == "") { + if ($item_parent == 0) { + $r = dba::fetch_first("SELECT `item`.`id`, `item`.`parent` FROM `item` + WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` + AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' + AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' + AND NOT `item`.`private` AND `item`.`uid` = 0 + AND `item`.`guid` = ?", $a->argv[1]); + if (DBM::is_result($r)) { + $item_id = $r["id"]; + $item_parent = $r["parent"]; + } + } + if ($item_parent == 0) { $r = dba::fetch_first("SELECT `user`.`nickname`, `item`.`id`, `item`.`parent` FROM `item` STRAIGHT_JOIN `user` ON `user`.`uid` = `item`.`uid` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' @@ -249,18 +271,6 @@ function display_content(App $a, $update = 0) { $nick = $r["nickname"]; } } - if ($nick == "") { - $r = dba::fetch_first("SELECT `item`.`id`, `item`.`parent` FROM `item` - WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` - AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' - AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' - AND NOT `item`.`private` AND `item`.`uid` = 0 - AND `item`.`guid` = ?", $a->argv[1]); - if (DBM::is_result($r)) { - $item_id = $r["id"]; - $item_parent = $r["parent"]; - } - } } } @@ -283,6 +293,10 @@ function display_content(App $a, $update = 0) { // We are displaying an "alternate" link if that post was public. See issue 2864 $is_public = dba::exists('item', array('id' => $item_id, 'private' => false)); if ($is_public) { + // For the atom feed the nickname doesn't matter at all, we only need the item id. + if ($nick == '') { + $nick = '_feed_'; + } $alternate = System::baseUrl().'/display/'.$nick.'/'.$item_id.'.atom'; $conversation = System::baseUrl().'/display/'.$nick.'/'.$item_parent.'/conversation.atom'; } else { diff --git a/src/Object/Post.php b/src/Object/Post.php index f331538873..08e7548b9f 100644 --- a/src/Object/Post.php +++ b/src/Object/Post.php @@ -145,7 +145,8 @@ class Post extends BaseObject || strlen($item['deny_cid']) || strlen($item['deny_gid'])))) ? t('Private Message') : false); - $shareable = ((($conv->getProfileOwner() == local_user()) && ($item['private'] != 1)) ? true : false); + $shareable = ((in_array($conv->getProfileOwner(), [0, local_user()]) && ($item['private'] != 1)) ? true : false); + if (local_user() && link_compare($a->contact['url'], $item['author-link'])) { if ($item["event-id"] != 0) { $edpost = array("events/event/".$item['event-id'], t("Edit")); diff --git a/src/Object/Thread.php b/src/Object/Thread.php index d159f41c96..2f92d993a7 100644 --- a/src/Object/Thread.php +++ b/src/Object/Thread.php @@ -29,9 +29,9 @@ class Thread extends BaseObject * @param string $mode The mode * @param boolean $preview boolean value */ - public function __construct($mode, $preview) + public function __construct($mode, $preview, $writable = false) { - $this->setMode($mode); + $this->setMode($mode, $writable); $this->preview = $preview; } @@ -42,7 +42,7 @@ class Thread extends BaseObject * * @return void */ - private function setMode($mode) + private function setMode($mode, $writable) { if ($this->getMode() == $mode) { return; @@ -62,7 +62,7 @@ class Thread extends BaseObject break; case 'display': $this->profile_owner = $a->profile['uid']; - $this->writable = can_write_wall($a, $this->profile_owner); + $this->writable = can_write_wall($a, $this->profile_owner) || $writable; break; default: logger('[ERROR] Conversation::setMode : Unhandled mode ('. $mode .').', LOGGER_DEBUG); diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index fd37a810c3..92ac9d8bcc 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -15,6 +15,7 @@ use Friendica\Database\DBM; use Friendica\Model\Contact; use Friendica\Model\GContact; use Friendica\Model\Profile; +use Friendica\Model\User; use Friendica\Object\Image; use Friendica\Protocol\OStatus; use Friendica\Util\XML; @@ -341,19 +342,15 @@ class DFRN $items = $r; $item = $r[0]; - $r = q( - "SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`, `user`.`account-type` - FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid` - WHERE `contact`.`self` AND `user`.`uid` = %d LIMIT 1", - intval($item['uid']) - ); - - if (!DBM::is_result($r)) { - killme(); + if ($item['uid'] != 0) { + $owner = User::getOwnerDataById($item['uid']); + if (!$owner) { + killme(); + } + else { + $owner = ['uid' => 0, 'nick' => '_feed_']; } - $owner = $r[0]; - $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; $type = 'html';