]> git.mxchange.org Git - friendica.git/blobdiff - mod/item.php
Merge pull request #4322 from annando/forum-mention
[friendica.git] / mod / item.php
index 18e4cefd3e66f382603b8e99f1d1c07730e18643..623c2f2f8184404963922f2e7e8f0dd2723b8e80 100644 (file)
@@ -15,6 +15,7 @@
  * information.
  */
 use Friendica\App;
+use Friendica\Core\Addon;
 use Friendica\Core\Config;
 use Friendica\Core\System;
 use Friendica\Core\Worker;
@@ -50,7 +51,8 @@ function item_post(App $a) {
                killme();
        }
 
-       call_hooks('post_local_start', $_REQUEST);
+       Addon::callHooks('post_local_start', $_REQUEST);
+
        logger('postvars ' . print_r($_REQUEST,true), LOGGER_DATA);
 
        $api_source = defaults($_REQUEST, 'api_source', false);
@@ -172,7 +174,7 @@ function item_post(App $a) {
        }
 
        $user = dba::selectFirst('user', [], ['uid' => $profile_uid]);
-       if (!DBM::is_result($user) && !$orig_post) {
+       if (!DBM::is_result($user) && !$parent) {
                return;
        }
 
@@ -230,8 +232,7 @@ function item_post(App $a) {
                $network           = notags(trim($_REQUEST['network']));
                $guid              = get_guid(32);
 
-               item_add_language_opt($_REQUEST);
-               $postopts = $_REQUEST['postopts'] ? $_REQUEST['postopts'] : "";
+               $postopts = defaults($_REQUEST, 'postopts', '');
 
                $private = ((strlen($str_group_allow) || strlen($str_contact_allow) || strlen($str_group_deny) || strlen($str_contact_deny)) ? 1 : 0);
 
@@ -262,7 +263,7 @@ function item_post(App $a) {
                // if using the API, we won't see pubmail_enable - figure out if it should be set
                if ($api_source && $profile_uid && $profile_uid == local_user() && !$private) {
                        if (function_exists('imap_open') && !Config::get('system', 'imap_disabled')) {
-                               $pubmail_enabled = dba::exists('mailacct', ["`uid` = ? AND `server` != ?", local_user(), '']);
+                               $pubmail_enabled = dba::exists('mailacct', ["`uid` = ? AND `server` != ? AND `pubmail`", local_user(), '']);
                        }
                }
 
@@ -345,14 +346,14 @@ function item_post(App $a) {
        if ($parent) {
                if ($thr_parent_contact['network'] == NETWORK_OSTATUS) {
                        $contact = '@[url=' . $thr_parent_contact['url'] . ']' . $thr_parent_contact['nick'] . '[/url]';
-                       if (!in_array($contact, $tags)) {
+                       if (!stripos(implode($tags), '[url=' . $thr_parent_contact['url'] . ']')) {
                                $tags[] = $contact;
                        }
                }
 
                if ($parent_contact['network'] == NETWORK_OSTATUS) {
                        $contact = '@[url=' . $parent_contact['url'] . ']' . $parent_contact['nick'] . '[/url]';
-                       if (!in_array($contact, $tags)) {
+                       if (!stripos(implode($tags), '[url=' . $parent_contact['url'] . ']')) {
                                $tags[] = $contact;
                        }
                }
@@ -366,7 +367,6 @@ function item_post(App $a) {
 
        if (count($tags)) {
                foreach ($tags as $tag) {
-
                        $tag_type = substr($tag, 0, 1);
 
                        if ($tag_type == '#') {
@@ -440,6 +440,7 @@ function item_post(App $a) {
 
        $match = null;
 
+       /// @todo these lines should be moved to Model/Photo
        if (!$preview && preg_match_all("/\[img([\=0-9x]*?)\](.*?)\[\/img\]/",$body,$match)) {
                $images = $match[2];
                if (count($images)) {
@@ -456,7 +457,7 @@ function item_post(App $a) {
                                        continue;
                                }
 
-                               /// @todo these lines should be moved to Model/Photo
+                               // Ensure to only modify photos that you own
                                $srch = '<' . intval($original_contact_id) . '>';
 
                                $condition = ['allow_cid' => $srch, 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '',
@@ -479,10 +480,20 @@ function item_post(App $a) {
         */
        $match = false;
 
+       /// @todo these lines should be moved to Model/Attach (Once it exists)
        if (!$preview && preg_match_all("/\[attachment\](.*?)\[\/attachment\]/", $body, $match)) {
                $attaches = $match[1];
                if (count($attaches)) {
                        foreach ($attaches as $attach) {
+                               // Ensure to only modify attachments that you own
+                               $srch = '<' . intval($original_contact_id) . '>';
+
+                               $condition = ['allow_cid' => $srch, 'allow_gid' => '', 'deny_cid' => '', 'deny_gid' => '',
+                                               'id' => $attach];
+                               if (!dba::exists('attach', $condition)) {
+                                       continue;
+                               }
+
                                $fields = ['allow_cid' => $str_contact_allow, 'allow_gid' => $str_group_allow,
                                                'deny_cid' => $str_contact_deny, 'deny_gid' => $str_group_deny];
                                $condition = ['id' => $attach];
@@ -626,7 +637,7 @@ function item_post(App $a) {
        $datarray['object']        = $object;
 
        /*
-        * These fields are for the convenience of plugins...
+        * These fields are for the convenience of addons...
         * 'self' if true indicates the owner is posting on their own wall
         * If parent is 0 it is a top-level post.
         */
@@ -653,9 +664,6 @@ function item_post(App $a) {
                $datarray['edit'] = true;
        }
 
-       // Search for hashtags
-       item_body_set_hashtags($datarray);
-
        // preview mode - prepare the body for display and send it via json
        if ($preview) {
                require_once 'include/conversation.php';
@@ -668,10 +676,10 @@ function item_post(App $a) {
                killme();
        }
 
-       call_hooks('post_local',$datarray);
+       Addon::callHooks('post_local',$datarray);
 
        if (x($datarray, 'cancel')) {
-               logger('mod_item: post cancelled by plugin.');
+               logger('mod_item: post cancelled by addon.');
                if ($return_path) {
                        goaway($return_path);
                }
@@ -781,7 +789,7 @@ function item_post(App $a) {
                }
        }
 
-       call_hooks('post_local_end', $datarray);
+       Addon::callHooks('post_local_end', $datarray);
 
        if (strlen($emailcc) && $profile_uid == local_user()) {
                $erecips = explode(',', $emailcc);
@@ -917,22 +925,10 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n
                        // Checking for the alias that is used for OStatus
                        $pattern = "/[@!]\[url\=(.*?)\](.*?)\[\/url\]/ism";
                        if (preg_match($pattern, $tag, $matches)) {
-
-                               $r = q("SELECT `alias`, `name` FROM `contact` WHERE `nurl` = '%s' AND `alias` != '' AND `uid` = 0",
-                                       normalise_link($matches[1]));
-                               if (!DBM::is_result($r)) {
-                                       $r = q("SELECT `alias`, `name` FROM `gcontact` WHERE `nurl` = '%s' AND `alias` != ''",
-                                               normalise_link($matches[1]));
-                               }
-                               if (DBM::is_result($r)) {
-                                       $data = $r[0];
-                               } else {
-                                       $data = Probe::uri($matches[1]);
-                               }
-
+                               $data = Contact::getDetailsByURL($matches[1]);
                                if ($data["alias"] != "") {
-                                       $newtag = '@[url=' . $data["alias"] . ']' . $data["name"] . '[/url]';
-                                       if (!stristr($str_tags, $newtag)) {
+                                       $newtag = '@[url=' . $data["alias"] . ']' . $data["nick"] . '[/url]';
+                                       if (!stripos($str_tags, '[url=' . $data["alias"] . ']')) {
                                                if (strlen($str_tags)) {
                                                        $str_tags .= ',';
                                                }
@@ -953,124 +949,68 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n
                $name = $nameparts[0];
 
                // Try to detect the contact in various ways
-               if ((strpos($name, '@')) || (strpos($name, 'http://'))) {
-                       // Is it in format @user@domain.tld or @http://domain.tld/...?
-
-                       // First check the contact table for the address
-                       $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network`, `notify`, `forum`, `prv` FROM `contact`
-                               WHERE `addr` = '%s' AND `uid` = %d AND
-                                       (`network` != '%s' OR (`notify` != '' AND `alias` != ''))
-                               LIMIT 1",
-                                       dbesc($name),
-                                       intval($profile_uid),
-                                       dbesc(NETWORK_OSTATUS)
-                       );
-
-                       // Then check in the contact table for the url
-                       if (!DBM::is_result($r)) {
-                               $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network`, `notify`, `forum`, `prv` FROM `contact`
-                                       WHERE `nurl` = '%s' AND `uid` = %d AND
-                                               (`network` != '%s' OR (`notify` != '' AND `alias` != ''))
-                                       LIMIT 1",
-                                               dbesc(normalise_link($name)),
-                                               intval($profile_uid),
-                                               dbesc(NETWORK_OSTATUS)
-                               );
-                       }
-
-                       // Then check in the global contacts for the address
-                       if (!DBM::is_result($r)) {
-                               $r = q("SELECT `url`, `nick`, `name`, `alias`, `network`, `notify` FROM `gcontact`
-                                       WHERE `addr` = '%s' AND (`network` != '%s' OR (`notify` != '' AND `alias` != ''))
-                                       LIMIT 1",
-                                               dbesc($name),
-                                               dbesc(NETWORK_OSTATUS)
-                               );
-                       }
-
-                       // Then check in the global contacts for the url
-                       if (!DBM::is_result($r)) {
-                               $r = q("SELECT `url`, `nick`, `name`, `alias`, `network`, `notify` FROM `gcontact`
-                                       WHERE `nurl` = '%s' AND (`network` != '%s' OR (`notify` != '' AND `alias` != ''))
-                                       LIMIT 1",
-                                               dbesc(normalise_link($name)),
-                                               dbesc(NETWORK_OSTATUS)
-                               );
-                       }
-
-                       if (!DBM::is_result($r)) {
-                               $probed = Probe::uri($name);
-                               if ($result['network'] != NETWORK_PHANTOM) {
-                                       GContact::update($probed);
-                                       $r = q("SELECT `url`, `name`, `nick`, `network`, `alias`, `notify` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1",
-                                               dbesc(normalise_link($probed["url"])));
-                               }
-                       }
+               if (strpos($name, 'http://')) {
+                       // At first we have to ensure that the contact exists
+                       Contact::getIdForURL($name);
+
+                       // Now we should have something
+                       $contact = Contact::getDetailsByURL($name);
+               } elseif (strpos($name, '@')) {
+                       // This function automatically probes when no entry was found
+                       $contact = Contact::getDetailsByAddr($name);
                } else {
-                       $r = false;
+                       $contact = false;
+                       $fields = ['id', 'url', 'nick', 'name', 'alias', 'network'];
+
                        if (strrpos($name, '+')) {
                                // Is it in format @nick+number?
                                $tagcid = intval(substr($name, strrpos($name, '+') + 1));
+                               $contact = dba::selectFirst('contact', $fields, ['id' => $tagcid, 'uid' => $profile_uid]);
+                       }
 
-                               $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
-                                               intval($tagcid),
-                                               intval($profile_uid)
-                               );
+                       // select someone by nick or attag in the current network
+                       if (!DBM::is_result($contact) && ($network != "")) {
+                               $condition = ["(`nick` = ? OR `attag` = ?) AND `network` = ? AND `uid` = ?",
+                                               $name, $name, $network, $profile_uid];
+                               $contact = dba::selectFirst('contact', $fields, $condition);
                        }
 
-                       // select someone by attag or nick and the name passed in the current network
-                       if (!DBM::is_result($r) && ($network != ""))
-                               $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `network` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
-                                               dbesc($name),
-                                               dbesc($name),
-                                               dbesc($network),
-                                               intval($profile_uid)
-                               );
-
-                       //select someone from this user's contacts by name in the current network
-                       if (!DBM::is_result($r) && ($network != "")) {
-                               $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `name` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1",
-                                               dbesc($name),
-                                               dbesc($network),
-                                               intval($profile_uid)
-                               );
+                       //select someone by name in the current network
+                       if (!DBM::is_result($contact) && ($network != "")) {
+                               $condition = ['name' => $name, 'network' => $network, 'uid' => $profile_uid];
+                               $contact = dba::selectFirst('contact', $fields, $condition);
                        }
 
-                       // select someone by attag or nick and the name passed in
-                       if (!DBM::is_result($r)) {
-                               $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
-                                               dbesc($name),
-                                               dbesc($name),
-                                               intval($profile_uid)
-                               );
+                       // select someone by nick or attag in any network
+                       if (!DBM::is_result($contact)) {
+                               $condition = ["(`nick` = ? OR `attag` = ?) AND `uid` = ?", $name, $name, $profile_uid];
+                               $contact = dba::selectFirst('contact', $fields, $condition);
                        }
 
-                       // select someone from this user's contacts by name
-                       if (!DBM::is_result($r)) {
-                               $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1",
-                                               dbesc($name),
-                                               intval($profile_uid)
-                               );
+                       // select someone by name in any network
+                       if (!DBM::is_result($contact)) {
+                               $condition = ['name' => $name, 'uid' => $profile_uid];
+                               $contact = dba::selectFirst('contact', $fields, $condition);
                        }
                }
 
-               if (DBM::is_result($r)) {
-                       if (strlen($inform) && (isset($r[0]["notify"]) || isset($r[0]["id"]))) {
+               if ($contact) {
+                       if (strlen($inform) && (isset($contact["notify"]) || isset($contact["id"]))) {
                                $inform .= ',';
                        }
 
-                       if (isset($r[0]["id"])) {
-                               $inform .= 'cid:' . $r[0]["id"];
-                       } elseif (isset($r[0]["notify"])) {
-                               $inform  .= $r[0]["notify"];
+                       if (isset($contact["id"])) {
+                               $inform .= 'cid:' . $contact["id"];
+                       } elseif (isset($contact["notify"])) {
+                               $inform  .= $contact["notify"];
                        }
 
-                       $profile = $r[0]["url"];
-                       $alias   = $r[0]["alias"];
-                       $newname = $r[0]["nick"];
-                       if (($newname == "") || (($r[0]["network"] != NETWORK_OSTATUS) && ($r[0]["network"] != NETWORK_TWITTER)
-                               && ($r[0]["network"] != NETWORK_STATUSNET) && ($r[0]["network"] != NETWORK_APPNET))) {
-                               $newname = $r[0]["name"];
+                       $profile = $contact["url"];
+                       $alias   = $contact["alias"];
+                       $newname = $contact["nick"];
+                       if (($newname == "") || (($contact["network"] != NETWORK_OSTATUS) && ($contact["network"] != NETWORK_TWITTER)
+                               && ($contact["network"] != NETWORK_STATUSNET) && ($contact["network"] != NETWORK_APPNET))) {
+                               $newname = $contact["name"];
                        }
                }
 
@@ -1095,7 +1035,7 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n
                         */
                        if (strlen($alias)) {
                                $newtag = '@[url=' . $alias . ']' . $newname . '[/url]';
-                               if (!stristr($str_tags, $newtag)) {
+                               if (!stripos($str_tags, '[url=' . $alias . ']')) {
                                        if (strlen($str_tags)) {
                                                $str_tags .= ',';
                                        }
@@ -1105,5 +1045,5 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n
                }
        }
 
-       return ['replaced' => $replaced, 'contact' => $r[0]];
+       return ['replaced' => $replaced, 'contact' => $contact];
 }