]> git.mxchange.org Git - friendica.git/blobdiff - mod/item.php
Merge commit 'mike/master'
[friendica.git] / mod / item.php
index 36b51a537ed711ac0b0c4edc4df55d1afc251c73..8c6b181c0d557dfdbd4631e45fb09359d0375877 100644 (file)
@@ -1,11 +1,17 @@
 <?php
 
-// This is the POST destination for most all locally posted
-// text stuff. This function handles status, wall-to-wall status, 
-// local comments, and remote coments - that are posted on this site 
-// (as opposed to being delivered in a feed).
-// All of these become an "item" which is our basic unit of 
-// information. 
+/**
+ *
+ * This is the POST destination for most all locally posted
+ * text stuff. This function handles status, wall-to-wall status, 
+ * local comments, and remote coments - that are posted on this site 
+ * (as opposed to being delivered in a feed).
+ * All of these become an "item" which is our basic unit of 
+ * information.
+ * Posts that originate externally or do not fall into the above 
+ * posting categories go through item_store() instead of this function. 
+ *
+ */  
 
 function item_post(&$a) {
 
@@ -16,9 +22,12 @@ function item_post(&$a) {
 
        $uid = local_user();
 
+       call_hooks('post_local_start', $_POST);
+
        $parent = ((x($_POST,'parent')) ? intval($_POST['parent']) : 0);
 
        $parent_item = null;
+       $parent_contact = null;
 
        if($parent) {
                $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
@@ -26,9 +35,19 @@ function item_post(&$a) {
                );
                if(! count($r)) {
                        notice( t('Unable to locate original post.') . EOL);
-                       goaway($a->get_baseurl() . "/" . $_POST['return'] );
+                       if(x($_POST,'return')) 
+                               goaway($a->get_baseurl() . "/" . $_POST['return'] );
+                       killme();
                }
                $parent_item = $r[0];
+               if($parent_item['contact-id'] && $uid) {
+                       $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
+                               intval($parent_item['contact-id']),
+                               intval($uid)
+                       );
+                       if(count($r))
+                               $parent_contact = $r[0];
+               }
        }
 
        $profile_uid = ((x($_POST,'profile_uid')) ? intval($_POST['profile_uid']) : 0);
@@ -36,7 +55,9 @@ function item_post(&$a) {
 
        if(! can_write_wall($a,$profile_uid)) {
                notice( t('Permission denied.') . EOL) ;
-               return;
+               if(x($_POST,'return')) 
+                       goaway($a->get_baseurl() . "/" . $_POST['return'] );
+               killme();
        }
 
        $user = null;
@@ -71,11 +92,13 @@ function item_post(&$a) {
        $location          = notags(trim($_POST['location']));
        $coord             = notags(trim($_POST['coord']));
        $verb              = notags(trim($_POST['verb']));
+       $emailcc           = notags(trim($_POST['emailcc']));
 
        if(! strlen($body)) {
                notice( t('Empty post discarded.') . EOL );
-               goaway($a->get_baseurl() . "/" . $_POST['return'] );
-
+               if(x($_POST,'return')) 
+                       goaway($a->get_baseurl() . "/" . $_POST['return'] );
+               killme();
        }
 
        // get contact info for poster
@@ -131,42 +154,45 @@ function item_post(&$a) {
 
        /**
         *
-        * If a photo was uploaded into the message using the ajax uploader,
-        * it can be seen by anybody. Set the permissions to match the message.
-        * Ideally this should be done when the photo was uploaded, but the permissions 
-        * may not have been set at that time, and passing the permission arrays via 
-        * javascript to the ajax upload is going to be a challenge.
-        * This is a compromise. Granted there is a window of time when the photo
-        * is public. You are welcome to suggest other ways to fix this.
+        * When a photo was uploaded into the message using the (profile wall) ajax 
+        * uploader, The permissions are initially set to disallow anybody but the
+        * owner from seeing it. This is because the permissions may not yet have been
+        * set for the post. If it's private, the photo permissions should be set
+        * appropriately. But we didn't know the final permissions on the post until
+        * now. So now we'll look for links of uploaded messages that are in the
+        * post and set them to the same permissions as the post itself.
         *
         */
 
        $match = null;
 
-       if($private) {
-               if(preg_match_all("/\[img\](.+?)\[\/img\]/",$body,$match)) {
-                       $images = $match[1];
-                       if(count($images)) {
-                               foreach($images as $image) {
-                                       if(! stristr($image,$a->get_baseurl() . '/photo/'))
-                                               continue;
-                                       $image_uri = substr($image,strrpos($image,'/') + 1);
-                                       $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
-                                       $r = q("UPDATE `photo` SET `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s'
-                                               WHERE `resource-id` = '%s' AND `album` = '%s' ",
-                                               dbesc($str_contact_allow),
-                                               dbesc($str_group_allow),
-                                               dbesc($str_contact_deny),
-                                               dbesc($str_group_deny),
-                                               dbesc($image_uri),
-                                               dbesc( t('Wall Photos'))
-                                       );
-  
-                               }
+       if(preg_match_all("/\[img\](.+?)\[\/img\]/",$body,$match)) {
+               $images = $match[1];
+               if(count($images)) {
+                       foreach($images as $image) {
+                               if(! stristr($image,$a->get_baseurl() . '/photo/'))
+                                       continue;
+                               $image_uri = substr($image,strrpos($image,'/') + 1);
+                               $image_uri = substr($image_uri,0, strpos($image_uri,'-'));
+                               $r = q("UPDATE `photo` SET `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s'
+                                       WHERE `resource-id` = '%s' AND `album` = '%s' ",
+                                       dbesc($str_contact_allow),
+                                       dbesc($str_group_allow),
+                                       dbesc($str_contact_deny),
+                                       dbesc($str_group_deny),
+                                       dbesc($image_uri),
+                                       dbesc( t('Wall Photos'))
+                               );
                        }
                }
        }
 
+       /**
+        * Fold multi-line [code] sequences
+        */
+
+       $body = preg_replace('/\[\/code\]\s*\[code\]/m',"\n",$body); 
 
        /**
         * Look for any tags and linkify them
@@ -175,8 +201,13 @@ function item_post(&$a) {
        $str_tags = '';
        $inform   = '';
 
+
        $tags = get_tags($body);
 
+       if(($parent_contact) && ($parent_contact['network'] === 'stat') && ($parent_contact['nick']) && (! in_array('@' . $parent_contact['nick'],$tags))) {
+               $body = '@' . $parent_contact['nick'] . ' ' . $body;
+               $tags[] = '@' . $parent_contact['nick'];
+       }               
 
        if(count($tags)) {
                foreach($tags as $tag) {
@@ -189,6 +220,7 @@ function item_post(&$a) {
                                continue;
                        }
                        if(strpos($tag,'@') === 0) {
+                               $stat = false;
                                $name = substr($tag,1);
                                if((strpos($name,'@')) || (strpos($name,'http://'))) {
                                        $newname = $name;
@@ -222,14 +254,19 @@ function item_post(&$a) {
                                        }
                                        if(count($r)) {
                                                $profile = $r[0]['url'];
-                                               $newname = $r[0]['name'];
+                                               if($r[0]['network'] === 'stat') {
+                                                       $newname = $r[0]['nick'];
+                                                       $stat = true;
+                                               }
+                                               else
+                                                       $newname = $r[0]['name'];
                                                if(strlen($inform))
                                                        $inform .= ',';
                                                $inform .= 'cid:' . $r[0]['id'];
                                        }
                                }
                                if($profile) {
-                                       $body = str_replace($name,'[url=' . $profile . ']' . $newname   . '[/url]', $body);
+                                       $body = str_replace('@' . $name, '@' . '[url=' . $profile . ']' . $newname      . '[/url]', $body);
                                        $profile = str_replace(',','%2c',$profile);
                                        if(strlen($str_tags))
                                                $str_tags .= ',';
@@ -239,6 +276,8 @@ function item_post(&$a) {
                }
        }
 
+
+
        $wall = 0;
        if($post_type === 'wall' || $post_type === 'wall-comment')
                $wall = 1;
@@ -395,10 +434,11 @@ function item_post(&$a) {
                        }
                }
 
-               $r = q("UPDATE `item` SET `parent` = %d, `parent-uri` = '%s', `changed` = '%s', `last-child` = 1, `visible` = 1
+               $r = q("UPDATE `item` SET `parent` = %d, `parent-uri` = '%s', `plink` = '%s', `changed` = '%s', `last-child` = 1, `visible` = 1
                        WHERE `id` = %d LIMIT 1",
                        intval($parent),
                        dbesc(($parent == $post_id) ? $uri : $parent_item['uri']),
+                       dbesc($a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id),
                        dbesc(datetime_convert()),
                        intval($post_id)
                );
@@ -413,21 +453,63 @@ function item_post(&$a) {
                        );
                }
        }
+       else {
+               logger('mod_item: unable to retrieve post that was just stored.');
+               notify( t('System error. Post not saved.'));
+               goaway($a->get_baseurl() . "/" . $_POST['return'] );
+               // NOTREACHED
+       }
 
        $php_path = ((strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php');
 
        logger('mod_item: notifier invoked: ' . "\"$php_path\" \"include/notifier.php\" \"$notify_type\" \"$post_id\" &");
 
-       proc_close(proc_open("\"$php_path\" \"include/notifier.php\" \"$notify_type\" \"$post_id\" &",
-               array(),$foo));
+       proc_run($php_path, "include/notifier.php", $notify_type, "$post_id");
 
        $datarray['id'] = $post_id;
 
        call_hooks('post_local_end', $datarray);
 
-       goaway($a->get_baseurl() . "/" . $_POST['return'] );
-       return; // NOTREACHED
+       if(strlen($emailcc) && $profile_uid == local_user()) {
+               $erecips = explode(',', $emailcc);
+               if(count($erecips)) {
+                       foreach($erecips as $recip) {
+                               $addr = trim($recip);
+                               if(! strlen($addr))
+                                       continue;
+                               $disclaimer = '<hr />' . t('This message was sent to you by ') . $a->user['username'] 
+                                       . t(', a member of the Friendika social network.') . '<br />';
+                               $disclaimer .= t('You may visit them online at') . ' ' 
+                                       . $a->get_baseurl() . '/profile/' . $a->user['nickname'] . '<br />';
+                               $disclaimer .= t('Please contact the sender by replying to this post if you do not wish to receive these messages.') . '<br />'; 
+
+                               $subject  = '[Friendika]' . ' ' . $a->user['username'] . ' ' . t('posted an update.');
+                               $headers  = 'From: ' . $a->user['username'] . ' <' . $a->user['email'] . '>' . "\n";
+                               $headers .= 'MIME-Version: 1.0' . "\n";
+                               $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
+                               $headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
+                               $link = '<a href="' . $a->get_baseurl() . '/profile/' . $a->user['nickname'] . '"><img src="' . $author['thumb'] . '" alt="' . $a->user['username'] . '" /></a><br /><br />';
+                               $html    = prepare_body($datarray);
+                               $message = '<html><body>' . $link . $html . $disclaimer . '</body></html>';
+                               @mail($addr, $subject, $message, $headers);
+                       }
+               }
+       }
+
+       logger('post_complete');
+       if((x($_POST,'return')) && strlen($_POST['return'])) {
+               logger('return: ' . $_POST['return']);
+               goaway($a->get_baseurl() . "/" . $_POST['return'] );
+       }
+       $json = array('success' => 1);
+       if(x($_POST,'jsreload') && strlen($_POST['jsreload']))
+               $json['reload'] = $a->get_baseurl() . '/' . $_POST['jsreload'];
+
+       logger('post_json: ' . print_r($json,true), LOGGER_DEBUG);
+
+       echo json_encode($json);
+       killme();
+       // NOTREACHED
 }
 
 
@@ -475,7 +557,7 @@ function item_content(&$a) {
                        // generate a resource-id and therefore aren't intimately linked to the item. 
 
                        if(strlen($item['resource-id'])) {
-                               $q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d ",
+                               q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d ",
                                        dbesc($item['resource-id']),
                                        intval($item['uid'])
                                );
@@ -517,11 +599,11 @@ function item_content(&$a) {
                        
                        // send the notification upstream/downstream as the case may be
 
-                       proc_close(proc_open("\"$php_path\" \"include/notifier.php\" \"drop\" \"$drop_id\" &",
-                               array(), $foo));
+                       //proc_close(proc_open("\"$php_path\" \"include/notifier.php\" \"drop\" \"$drop_id\" &", array(), $foo));
+                       proc_run($php_path,"include/notifier.php","drop","$drop_id");
 
                        goaway($a->get_baseurl() . '/' . $_SESSION['return_url']);
-                       return; //NOTREACHED
+                       //NOTREACHED
                }
                else {
                        notice( t('Permission denied.') . EOL);