]> git.mxchange.org Git - friendica.git/blobdiff - mod/item.php
Prevent ActivityPub message transmission to blocked followers
[friendica.git] / mod / item.php
index 38ff3b2a3e1779d5e242d26b248c8bec4b75aacb..9828d1acb28d40984bcb2eaa97d27e50f7c901bf 100644 (file)
 
 use Friendica\App;
 use Friendica\Content\Item as ItemHelper;
+use Friendica\Content\PageInfo;
 use Friendica\Content\Text\BBCode;
 use Friendica\Core\Hook;
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
-use Friendica\Core\Renderer;
 use Friendica\Core\Session;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
@@ -47,18 +47,16 @@ use Friendica\Model\FileTag;
 use Friendica\Model\Item;
 use Friendica\Model\Notify\Type;
 use Friendica\Model\Photo;
+use Friendica\Model\Post;
 use Friendica\Model\Tag;
 use Friendica\Network\HTTPException;
 use Friendica\Object\EMail\ItemCCEMail;
 use Friendica\Protocol\Activity;
 use Friendica\Protocol\Diaspora;
 use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Security;
-use Friendica\Util\Strings;
+use Friendica\Security\Security;
 use Friendica\Worker\Delivery;
 
-require_once __DIR__ . '/../include/items.php';
-
 function item_post(App $a) {
        if (!Session::isAuthenticated()) {
                throw new HTTPException\ForbiddenException();
@@ -137,6 +135,16 @@ function item_post(App $a) {
                        throw new HTTPException\NotFoundException(DI::l10n()->t('Unable to locate original post.'));
                }
 
+               // When commenting on a public post then store the post for the current user
+               // This enables interaction like starring and saving into folders
+               if ($toplevel_item['uid'] == 0) {
+                       $stored = Item::storeForUserByUriId($toplevel_item['uri-id'], local_user());
+                       Logger::info('Public item stored for user', ['uri-id' => $toplevel_item['uri-id'], 'uid' => $uid, 'stored' => $stored]);
+                       if ($stored) {
+                               $toplevel_item = Item::selectFirst([], ['id' => $stored]);
+                       }
+               }
+
                $toplevel_item_id = $toplevel_item['id'];
                $parent_user = $toplevel_item['uid'];
 
@@ -233,7 +241,7 @@ function item_post(App $a) {
                        ];
                }
 
-               $att_bbcode = add_page_info_data($attachment);
+               $att_bbcode = "\n" . PageInfo::getFooterFromData($attachment);
                $body .= $att_bbcode;
        }
 
@@ -251,7 +259,7 @@ function item_post(App $a) {
                $objecttype        = $orig_post['object-type'];
                $app               = $orig_post['app'];
                $categories        = $orig_post['file'] ?? '';
-               $title             = Strings::escapeTags(trim($_REQUEST['title']));
+               $title             = trim($_REQUEST['title'] ?? '');
                $body              = trim($body);
                $private           = $orig_post['private'];
                $pubmail_enabled   = $orig_post['pubmail'];
@@ -272,13 +280,13 @@ function item_post(App $a) {
                        $str_group_deny    = isset($_REQUEST['group_deny'])    ? $aclFormatter->toString($_REQUEST['group_deny'])    : $user['deny_gid']  ?? '';
                }
 
-               $title             = Strings::escapeTags(trim($_REQUEST['title']    ?? ''));
-               $location          = Strings::escapeTags(trim($_REQUEST['location'] ?? ''));
-               $coord             = Strings::escapeTags(trim($_REQUEST['coord']    ?? ''));
-               $verb              = Strings::escapeTags(trim($_REQUEST['verb']     ?? ''));
-               $emailcc           = Strings::escapeTags(trim($_REQUEST['emailcc']  ?? ''));
+               $title             = trim($_REQUEST['title']    ?? '');
+               $location          = trim($_REQUEST['location'] ?? '');
+               $coord             = trim($_REQUEST['coord']    ?? '');
+               $verb              = trim($_REQUEST['verb']     ?? '');
+               $emailcc           = trim($_REQUEST['emailcc']  ?? '');
                $body              = trim($body);
-               $network           = Strings::escapeTags(trim(($_REQUEST['network']  ?? '') ?: Protocol::DFRN));
+               $network           = trim(($_REQUEST['network']  ?? '') ?: Protocol::DFRN);
                $guid              = System::createUUID();
 
                $postopts = $_REQUEST['postopts'] ?? '';
@@ -324,7 +332,7 @@ function item_post(App $a) {
                                System::jsonExit(['preview' => '']);
                        }
 
-                       info(DI::l10n()->t('Empty post discarded.'));
+                       notice(DI::l10n()->t('Empty post discarded.'));
                        if ($return_path) {
                                DI::baseUrl()->redirect($return_path);
                        }
@@ -367,9 +375,9 @@ function item_post(App $a) {
 
        // get contact info for owner
        if ($profile_uid == local_user() || $allow_comment) {
-               $contact_record = $author;
+               $contact_record = $author ?: [];
        } else {
-               $contact_record = DBA::selectFirst('contact', [], ['uid' => $profile_uid, 'self' => true]);
+               $contact_record = DBA::selectFirst('contact', [], ['uid' => $profile_uid, 'self' => true]) ?: [];
        }
 
        // Look for any tags and linkify them
@@ -423,7 +431,7 @@ function item_post(App $a) {
 
        $original_contact_id = $contact_id;
 
-       if (!$toplevel_item_id && count($forum_contact) && ($private_forum || $only_to_forum)) {
+       if (!$toplevel_item_id && !empty($forum_contact) && ($private_forum || $only_to_forum)) {
                // we tagged a forum in a top level post. Now we change the post
                $private = $private_forum;
 
@@ -523,9 +531,8 @@ function item_post(App $a) {
                                if (strlen($attachments)) {
                                        $attachments .= ',';
                                }
-                               $attachments .= '[attach]href="' . DI::baseUrl() . '/attach/' . $attachment['id'] .
-                                               '" length="' . $attachment['filesize'] . '" type="' . $attachment['filetype'] .
-                                               '" title="' . ($attachment['filename'] ? $attachment['filename'] : '') . '"[/attach]';
+                               $attachments .= Post\Media::getAttachElement(DI::baseUrl() . '/attach/' . $attachment['id'],
+                                       $attachment['filesize'], $attachment['filetype'], $attachment['filename'] ?? '');
                        }
                        $body = str_replace($match[1],'',$body);
                }
@@ -564,9 +571,9 @@ function item_post(App $a) {
        $datarray['gravity']       = $gravity;
        $datarray['network']       = $network;
        $datarray['contact-id']    = $contact_id;
-       $datarray['owner-name']    = $contact_record['name'];
-       $datarray['owner-link']    = $contact_record['url'];
-       $datarray['owner-avatar']  = $contact_record['thumb'];
+       $datarray['owner-name']    = $contact_record['name'] ?? '';
+       $datarray['owner-link']    = $contact_record['url'] ?? '';
+       $datarray['owner-avatar']  = $contact_record['thumb'] ?? '';
        $datarray['owner-id']      = Contact::getIdForURL($datarray['owner-link']);
        $datarray['author-name']   = $author['name'];
        $datarray['author-link']   = $author['url'];
@@ -694,7 +701,6 @@ function item_post(App $a) {
                // update filetags in pconfig
                FileTag::updatePconfig($uid, $categories_old, $categories_new, 'category');
 
-               info(DI::l10n()->t('Post updated.'));
                if ($return_path) {
                        DI::baseUrl()->redirect($return_path);
                }
@@ -716,7 +722,7 @@ function item_post(App $a) {
        $post_id = Item::insert($datarray);
 
        if (!$post_id) {
-               info(DI::l10n()->t('Item wasn\'t stored.'));
+               notice(DI::l10n()->t('Item wasn\'t stored.'));
                if ($return_path) {
                        DI::baseUrl()->redirect($return_path);
                }
@@ -745,8 +751,8 @@ function item_post(App $a) {
        FileTag::updatePconfig($uid, $categories_old, $categories_new, 'category');
 
        // These notifications are sent if someone else is commenting other your wall
-       if ($toplevel_item_id) {
-               if ($contact_record != $author) {
+       if ($contact_record != $author) {
+               if ($toplevel_item_id) {
                        notification([
                                'type'         => Type::COMMENT,
                                'notify_flags' => $user['notify-flags'],
@@ -764,9 +770,7 @@ function item_post(App $a) {
                                'parent'       => $toplevel_item_id,
                                'parent_uri'   => $toplevel_item['uri']
                        ]);
-               }
-       } else {
-               if (($contact_record != $author) && !count($forum_contact)) {
+               } elseif (empty($forum_contact)) {
                        notification([
                                'type'         => Type::WALL,
                                'notify_flags' => $user['notify-flags'],
@@ -801,12 +805,6 @@ function item_post(App $a) {
                }
        }
 
-       // Insert an item entry for UID=0 for global entries.
-       // We now do it in the background to save some time.
-       // This is important in interactive environments like the frontend or the API.
-       // We don't fork a new process since this is done anyway with the following command
-       Worker::add(['priority' => PRIORITY_HIGH, 'dont_fork' => true], "CreateShadowEntry", $post_id);
-
        // When we are doing some forum posting via ! we have to start the notifier manually.
        // These kind of posts don't initiate the notifier call in the item class.
        if ($only_to_forum) {
@@ -819,7 +817,6 @@ function item_post(App $a) {
                return $post_id;
        }
 
-       info(DI::l10n()->t('Post published.'));
        item_post_return(DI::baseUrl(), $api_source, $return_path);
        // NOTREACHED
 }
@@ -883,7 +880,7 @@ function drop_item(int $id, string $return = '')
        $item = Item::selectFirstForUser(local_user(), $fields, ['id' => $id]);
 
        if (!DBA::isResult($item)) {
-               notice(DI::l10n()->t('Item not found.') . EOL);
+               notice(DI::l10n()->t('Item not found.'));
                DI::baseUrl()->redirect('network');
        }
 
@@ -899,40 +896,8 @@ function drop_item(int $id, string $return = '')
        }
 
        if ((local_user() == $item['uid']) || $contact_id) {
-               // Check if we should do HTML-based delete confirmation
-               if (!empty($_REQUEST['confirm'])) {
-                       // <form> can't take arguments in its "action" parameter
-                       // so add any arguments as hidden inputs
-                       $query = explode_querystring(DI::args()->getQueryString());
-                       $inputs = [];
-
-                       foreach ($query['args'] as $arg) {
-                               if (strpos($arg, 'confirm=') === false) {
-                                       $arg_parts = explode('=', $arg);
-                                       $inputs[] = ['name' => $arg_parts[0], 'value' => $arg_parts[1]];
-                               }
-                       }
-
-                       return Renderer::replaceMacros(Renderer::getMarkupTemplate('confirm.tpl'), [
-                               '$method' => 'get',
-                               '$message' => DI::l10n()->t('Do you really want to delete this item?'),
-                               '$extra_inputs' => $inputs,
-                               '$confirm' => DI::l10n()->t('Yes'),
-                               '$confirm_url' => $query['base'],
-                               '$confirm_name' => 'confirmed',
-                               '$cancel' => DI::l10n()->t('Cancel'),
-                       ]);
-               }
-               // Now check how the user responded to the confirmation query
-               if (!empty($_REQUEST['canceled'])) {
-                       DI::baseUrl()->redirect('display/' . $item['guid']);
-               }
-
-               $is_comment = ($item['gravity'] == GRAVITY_COMMENT) ? true : false;
-               $parentitem = null;
-               if (!empty($item['parent'])){
-                       $fields = ['guid'];
-                       $parentitem = Item::selectFirstForUser(local_user(), $fields, ['id' => $item['parent']]);
+               if (!empty($item['parent'])) {
+                       $parentitem = Item::selectFirstForUser(local_user(), ['guid'], ['id' => $item['parent']]);
                }
 
                // delete the item
@@ -944,19 +909,17 @@ function drop_item(int $id, string $return = '')
                $return_url = str_replace("update_", "", $return_url);
 
                // Check if delete a comment
-               if ($is_comment) {
+               if ($item['gravity'] == GRAVITY_COMMENT) {
                        // Return to parent guid
                        if (!empty($parentitem)) {
                                DI::baseUrl()->redirect('display/' . $parentitem['guid']);
                                //NOTREACHED
-                       }
-                       // In case something goes wrong
+                       } // In case something goes wrong
                        else {
                                DI::baseUrl()->redirect('network');
                                //NOTREACHED
                        }
-               }
-               else {
+               } else {
                        // if unknown location or deleting top level post called from display
                        if (empty($return_url) || strpos($return_url, 'display') !== false) {
                                DI::baseUrl()->redirect('network');