X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=mod%2Fitem.php;h=c4e66ebeb0601d884260f2a6cd345773a97fa7fc;hb=fc7d0360bb059bf87c5c531a2bfd5bcee3aef3f6;hp=9d7b954a84465a41d505a8b27d2d82c514817f2d;hpb=fa778e0040df784c9eec5392731473e58fbfa0be;p=friendica.git diff --git a/mod/item.php b/mod/item.php index 9d7b954a84..c4e66ebeb0 100644 --- a/mod/item.php +++ b/mod/item.php @@ -6,6 +6,8 @@ * 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). + * Also processed here are posts and comments coming through the + * statusnet/twitter API. * All of these become an "item" which is our basic unit of * information. * Posts that originate externally or do not fall into the above @@ -13,6 +15,9 @@ * */ +require_once('include/crypto.php'); +require_once('include/enotify.php'); + function item_post(&$a) { if((! local_user()) && (! remote_user())) @@ -33,22 +38,62 @@ function item_post(&$a) { call_hooks('post_local_start', $_POST); + $api_source = ((x($_POST,'api_source') && $_POST['api_source']) ? true : false); + $return_path = ((x($_POST,'return')) ? $_POST['return'] : ''); + + /** + * Is this a reply to something? + */ + $parent = ((x($_POST,'parent')) ? intval($_POST['parent']) : 0); + $parent_uri = ((x($_POST,'parent_uri')) ? trim($_POST['parent_uri']) : ''); $parent_item = null; $parent_contact = null; + $thr_parent = ''; + $parid = 0; + $r = false; - if($parent) { - $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", - intval($parent) - ); - if(! count($r)) { + if($parent || $parent_uri) { + + if(! x($_POST,'type')) + $_POST['type'] = 'net-comment'; + + if($parent) { + $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1", + intval($parent) + ); + } + elseif($parent_uri && local_user()) { + // This is coming from an API source, and we are logged in + $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", + dbesc($parent_uri), + intval(local_user()) + ); + } + // if this isn't the real parent of the conversation, find it + if($r !== false && count($r)) { + $parid = $r[0]['parent']; + if($r[0]['id'] != $r[0]['parent']) { + $r = q("SELECT * FROM `item` WHERE `id` = `parent` AND `parent` = %d LIMIT 1", + intval($parid) + ); + } + } + + if(($r === false) || (! count($r))) { notice( t('Unable to locate original post.') . EOL); if(x($_POST,'return')) - goaway($a->get_baseurl() . "/" . $_POST['return'] ); + goaway($a->get_baseurl() . "/" . $return_path ); killme(); } $parent_item = $r[0]; + $parent = $r[0]['id']; + + // multi-level threading - preserve the info but re-parent to our single level threading + if(($parid) && ($parid != $parent)) + $thr_parent = $parent_uri; + if($parent_item['contact-id'] && $uid) { $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($parent_item['contact-id']), @@ -59,14 +104,16 @@ function item_post(&$a) { } } + if($parent) logger('mod_post: parent=' . $parent); + $profile_uid = ((x($_POST,'profile_uid')) ? intval($_POST['profile_uid']) : 0); $post_id = ((x($_POST['post_id'])) ? intval($_POST['post_id']) : 0); - $app = ((x($_POST['source'])) ? notags($_POST['source']) : ''); + $app = ((x($_POST['source'])) ? strip_tags($_POST['source']) : ''); if(! can_write_wall($a,$profile_uid)) { notice( t('Permission denied.') . EOL) ; if(x($_POST,'return')) - goaway($a->get_baseurl() . "/" . $_POST['return'] ); + goaway($a->get_baseurl() . "/" . $return_path ); killme(); } @@ -92,7 +139,7 @@ function item_post(&$a) { ); if(count($r)) $user = $r[0]; - + if($orig_post) { $str_group_allow = $orig_post['allow_gid']; $str_contact_allow = $orig_post['allow_cid']; @@ -135,14 +182,40 @@ function item_post(&$a) { $pubmail_enable = ((x($_POST,'pubmail_enable') && intval($_POST['pubmail_enable']) && (! $private)) ? 1 : 0); + // 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)) { + $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1); + if(! $mail_disabled) { + $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1", + intval(local_user()) + ); + if(count($r) && intval($r[0]['pubmail'])) + $pubmail_enabled = true; + } + } + + if(! strlen($body)) { info( t('Empty post discarded.') . EOL ); if(x($_POST,'return')) - goaway($a->get_baseurl() . "/" . $_POST['return'] ); + goaway($a->get_baseurl() . "/" . $return_path ); killme(); } } + if(($api_source) + && (! array_key_exists('allow_cid',$_REQUEST)) + && (! array_key_exists('allow_gid',$_REQUEST)) + && (! array_key_exists('deny_cid',$_REQUEST)) + && (! array_key_exists('deny_gid',$_REQUEST))) { + $str_group_allow = $user['allow_gid']; + $str_contact_allow = $user['allow_cid']; + $str_group_deny = $user['deny_gid']; + $str_contact_deny = $user['deny_cid']; + } + + // get contact info for poster $author = null; @@ -180,16 +253,16 @@ function item_post(&$a) { $contact_record = $r[0]; } + + $post_type = notags(trim($_POST['type'])); if($post_type === 'net-comment') { if($parent_item !== null) { - if($parent_item['type'] === 'remote') { - $post_type = 'remote-comment'; - } - else { + if($parent_item['wall'] == 1) $post_type = 'wall-comment'; - } + else + $post_type = 'remote-comment'; } } @@ -244,6 +317,10 @@ function item_post(&$a) { } + /** + * Next link in any attachment references we find in the post. + */ + $match = false; if(preg_match_all("/\[attachment\](.*?)\[\/attachment\]/",$body,$match)) { @@ -257,6 +334,10 @@ function item_post(&$a) { if(count($r)) { $r = q("UPDATE `attach` SET `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `uid` = %d AND `id` = %d LIMIT 1", + dbesc($str_contact_allow), + dbesc($str_group_allow), + dbesc($str_contact_deny), + dbesc($str_group_deny), intval($profile_uid), intval($attach) ); @@ -265,15 +346,27 @@ function item_post(&$a) { } } + // embedded bookmark in post? set bookmark flag + + $bookmark = 0; + if(preg_match_all("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",$body,$match,PREG_SET_ORDER)) { + $bookmark = 1; +// foreach($match as $mtch) { +// $body = str_replace( +// '[bookmark=' . $mtch[1] . ']' . $mtch[2] . '[/bookmark]', +// '[url=' . $mtch[1] . ']' . $mtch[2] . '[/url]', +// $body +// ); +// } + } - - + $body = bb_translate_video($body); /** * Fold multi-line [code] sequences */ - $body = preg_replace('/\[\/code\]\s*\[code\]/m',"\n",$body); + $body = preg_replace('/\[\/code\]\s*\[code\]/ism',"\n",$body); /** * Look for any tags and linkify them @@ -285,21 +378,34 @@ function item_post(&$a) { $tags = get_tags($body); - if(($parent_contact) && ($parent_contact['network'] === 'stat') && ($parent_contact['nick']) && (! in_array('@' . $parent_contact['nick'],$tags))) { + /** + * add a statusnet style reply tag if the original post was from there + * and we are replying, and there isn't one already + */ + + if(($parent_contact) && ($parent_contact['network'] === NETWORK_OSTATUS) + && ($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) { + + if(isset($profile)) + unset($profile); if(strpos($tag,'#') === 0) { if(strpos($tag,'[url=')) continue; $basetag = str_replace('_',' ',substr($tag,1)); $body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body); - if(strlen($str_tags)) - $str_tags .= ','; - $str_tags .= '#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]'; + + $newtag = '#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]'; + if(! stristr($str_tags,$newtag)) { + if(strlen($str_tags)) + $str_tags .= ','; + $str_tags .= $newtag; + } continue; } if(strpos($tag,'@') === 0) { @@ -325,7 +431,19 @@ function item_post(&$a) { else { $newname = $name; $alias = ''; - if(strstr($name,'_')) { + $tagcid = 0; + if(strrpos($newname,'+')) { + $tagcid = intval(substr($newname,strrpos($newname,'+') + 1)); + if(strpos($name,' ')) + $name = substr($name,0,strpos($name,' ')); + } + if($tagcid) { + $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", + intval($tagcid), + intval($profile_uid) + ); + } + elseif(strstr($name,'_') || strstr($name,' ')) { $newname = str_replace('_',' ',$name); $r = q("SELECT * FROM `contact` WHERE `name` = '%s' AND `uid` = %d LIMIT 1", dbesc($newname), @@ -333,7 +451,8 @@ function item_post(&$a) { ); } else { - $r = q("SELECT * FROM `contact` WHERE `nick` = '%s' AND `uid` = %d LIMIT 1", + $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1", + dbesc($name), dbesc($name), intval($profile_uid) ); @@ -356,17 +475,23 @@ function item_post(&$a) { if($profile) { $body = str_replace('@' . $name, '@' . '[url=' . $profile . ']' . $newname . '[/url]', $body); $profile = str_replace(',','%2c',$profile); - if(strlen($str_tags)) - $str_tags .= ','; - $str_tags .= '@[url=' . $profile . ']' . $newname . '[/url]'; + $newtag = '@[url=' . $profile . ']' . $newname . '[/url]'; + if(! stristr($str_tags,$newtag)) { + if(strlen($str_tags)) + $str_tags .= ','; + $str_tags .= $newtag; + } // Status.Net seems to require the numeric ID URL in a mention if the person isn't // subscribed to you. But the nickname URL is OK if they are. Grrr. We'll tag both. if(strlen($alias)) { - if(strlen($str_tags)) - $str_tags .= ','; - $str_tags .= '@[url=' . $alias . ']' . $newname . '[/url]'; + $newtag = '@[url=' . $alias . ']' . $newname . '[/url]'; + if(! stristr($str_tags,$newtag)) { + if(strlen($str_tags)) + $str_tags .= ','; + $str_tags .= $newtag; + } } } } @@ -385,7 +510,7 @@ function item_post(&$a) { if(count($r)) { if(strlen($attachments)) $attachments .= ','; - $attachments .= '[attach]href="' . $a->get_baseurl() . '/attach/' . $r[0]['id'] . '" size="' . $r[0]['filesize'] . '" type="' . $r[0]['filetype'] . '" title="' . (($r[0]['filename']) ? $r[0]['filename'] : ' ') . '"[/attach]'; + $attachments .= '[attach]href="' . $a->get_baseurl() . '/attach/' . $r[0]['id'] . '" length="' . $r[0]['filesize'] . '" type="' . $r[0]['filetype'] . '" title="' . (($r[0]['filename']) ? $r[0]['filename'] : '') . '"[/attach]'; } $body = str_replace($match[1],'',$body); } @@ -400,7 +525,12 @@ function item_post(&$a) { $verb = ACTIVITY_POST ; $gravity = (($parent) ? 6 : 0 ); - + + // even if the post arrived via API we are considering that it + // originated on this site by default for determining relayability. + + $origin = ((x($_REQUEST,'origin')) ? intval($_REQUEST['origin']) : 1); + $notify_type = (($parent) ? 'comment-new' : 'wall-new' ); $uri = item_new_uri($a->get_hostname(),$profile_uid); @@ -419,6 +549,8 @@ function item_post(&$a) { $datarray['author-avatar'] = $author['thumb']; $datarray['created'] = datetime_convert(); $datarray['edited'] = datetime_convert(); + $datarray['commented'] = datetime_convert(); + $datarray['received'] = datetime_convert(); $datarray['changed'] = datetime_convert(); $datarray['uri'] = $uri; $datarray['title'] = $title; @@ -436,6 +568,10 @@ function item_post(&$a) { $datarray['private'] = $private; $datarray['pubmail'] = $pubmail_enable; $datarray['attach'] = $attachments; + $datarray['bookmark'] = intval($bookmark); + $datarray['thr-parent'] = $thr_parent; + $datarray['postopts'] = ''; + $datarray['origin'] = $origin; /** * These fields are for the convenience of plugins... @@ -445,10 +581,13 @@ function item_post(&$a) { $datarray['parent'] = $parent; $datarray['self'] = $self; - $datarray['prvnets'] = $user['prvnets']; +// $datarray['prvnets'] = $user['prvnets']; if($orig_post) $datarray['edit'] = true; + else + $datarray['guid'] = get_guid(); + call_hooks('post_local',$datarray); @@ -462,9 +601,9 @@ function item_post(&$a) { ); proc_run('php', "include/notifier.php", 'edit_post', "$post_id"); - if((x($_POST,'return')) && strlen($_POST['return'])) { - logger('return: ' . $_POST['return']); - goaway($a->get_baseurl() . "/" . $_POST['return'] ); + if((x($_POST,'return')) && strlen($return_path)) { + logger('return: ' . $return_path); + goaway($a->get_baseurl() . "/" . $return_path ); } killme(); } @@ -472,10 +611,11 @@ function item_post(&$a) { $post_id = 0; - $r = q("INSERT INTO `item` (`uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`, - `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `changed`, `uri`, `title`, `body`, `app`, `location`, `coord`, - `tag`, `inform`, `verb`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail`, `attach` ) - VALUES( %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s' )", + $r = q("INSERT INTO `item` (`guid`, `uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`, + `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `commented`, `received`, `changed`, `uri`, `thr-parent`, `title`, `body`, `app`, `location`, `coord`, + `tag`, `inform`, `verb`, `postopts`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail`, `attach`, `bookmark`,`origin` ) + VALUES( '%s', %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d )", + dbesc($datarray['guid']), intval($datarray['uid']), dbesc($datarray['type']), intval($datarray['wall']), @@ -489,8 +629,11 @@ function item_post(&$a) { dbesc($datarray['author-avatar']), dbesc($datarray['created']), dbesc($datarray['edited']), + dbesc($datarray['commented']), + dbesc($datarray['received']), dbesc($datarray['changed']), dbesc($datarray['uri']), + dbesc($datarray['thr-parent']), dbesc($datarray['title']), dbesc($datarray['body']), dbesc($datarray['app']), @@ -499,13 +642,16 @@ function item_post(&$a) { dbesc($datarray['tag']), dbesc($datarray['inform']), dbesc($datarray['verb']), + dbesc($datarray['postopts']), dbesc($datarray['allow_cid']), dbesc($datarray['allow_gid']), dbesc($datarray['deny_cid']), dbesc($datarray['deny_gid']), intval($datarray['private']), intval($datarray['pubmail']), - dbesc($datarray['attach']) + dbesc($datarray['attach']), + intval($datarray['bookmark']), + intval($datarray['origin']) ); $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1", @@ -534,136 +680,71 @@ function item_post(&$a) { intval($post_id) ); - // Send a notification email to the conversation owner, unless the owner is me and I wrote this item - if(($user['notify-flags'] & NOTIFY_COMMENT) && ($contact_record != $author)) { - push_lang($user['language']); - require_once('bbcode.php'); - $from = $author['name']; - - // name of the automated email sender - $msg['notificationfromname'] = stripslashes($datarray['author-name']);; - // noreply address to send from - $msg['notificationfromemail'] = t('noreply') . '@' . $a->get_hostname(); - - // text version - // process the message body to display properly in text mode - $msg['textversion'] - = html_entity_decode(strip_tags(bbcode(stripslashes($datarray['body']))), ENT_QUOTES, 'UTF-8'); - - // html version - // process the message body to display properly in text mode - $msg['htmlversion'] - = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r","\\n\\n" ,"\\n"), "
\n",$datarray['body'])))); - - // load the template for private message notifications - $tpl = get_intltext_template('cmnt_received_html_body_eml.tpl'); - $email_html_body_tpl = replace_macros($tpl,array( - '$username' => $user['username'], - '$sitename' => $a->config['sitename'], // name of this site - '$siteurl' => $a->get_baseurl(), // descriptive url of this site - '$thumb' => $author['thumb'], // thumbnail url for sender icon - '$email' => $importer['email'], // email address to send to - '$url' => $author['url'], // full url for the site - '$from' => $from, // name of the person sending the message - '$body' => $msg['htmlversion'], // html version of the message - '$display' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id, + if($contact_record != $author) { + notification(array( + 'type' => NOTIFY_COMMENT, + 'notify_flags' => $user['notify-flags'], + 'language' => $user['language'], + 'to_name' => $user['username'], + 'to_email' => $user['email'], + 'item' => $datarray, + 'link' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id, + 'source_name' => $datarray['author-name'], + 'source_link' => $datarray['author-link'], + 'source_photo' => $datarray['author-avatar'], + 'verb' => ACTIVITY_POST, + 'otype' => 'item' )); - // load the template for private message notifications - $tpl = get_intltext_template('cmnt_received_text_body_eml.tpl'); - $email_text_body_tpl = replace_macros($tpl,array( - '$username' => $user['username'], - '$sitename' => $a->config['sitename'], // name of this site - '$siteurl' => $a->get_baseurl(), // descriptive url of this site - '$thumb' => $author['thumb'], // thumbnail url for sender icon - '$email' => $importer['email'], // email address to send to - '$url' => $author['url'], // profile url for the author - '$from' => $from, // name of the person sending the message - '$body' => $msg['textversion'], // text version of the message - '$display' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id, - )); - - // use the EmailNotification library to send the message - require_once("include/EmailNotification.php"); - EmailNotification::sendTextHtmlEmail( - $msg['notificationfromname'], - t("Administrator@") . $a->get_hostname(), - t("noreply") . '@' . $a->get_hostname(), - $user['email'], - sprintf( t('%s commented on an item at %s'), $from , $a->config['sitename']), - $email_html_body_tpl, - $email_text_body_tpl - ); + } - pop_lang(); + // We won't be able to sign Diaspora comments for authenticated visitors - we don't have their private key + + if($self) { + require_once('include/bb2diaspora.php'); + $signed_body = html_entity_decode(bb2diaspora($datarray['body'])); + $myaddr = $a->user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); + if($datarray['verb'] === ACTIVITY_LIKE) + $signed_text = $datarray['guid'] . ';' . 'Post' . ';' . $parent_item['guid'] . ';' . 'true' . ';' . $myaddr; + else + $signed_text = $datarray['guid'] . ';' . $parent_item['guid'] . ';' . $signed_body . ';' . $myaddr; + + $authorsig = base64_encode(rsa_sign($signed_text,$a->user['prvkey'],'sha256')); + + q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ", + intval($post_id), + dbesc($signed_text), + dbesc(base64_encode($authorsig)), + dbesc($myaddr) + ); } } else { $parent = $post_id; - // let me know if somebody did a wall-to-wall post on my profile - - if(($user['notify-flags'] & NOTIFY_WALL) && ($contact_record != $author)) { - push_lang($user['language']); - require_once('bbcode.php'); - $from = $author['name']; - - // name of the automated email sender - $msg['notificationfromname'] = $from; - // noreply address to send from - $msg['notificationfromemail'] = t('noreply') . '@' . $a->get_hostname(); - - // text version - // process the message body to display properly in text mode - $msg['textversion'] - = html_entity_decode(strip_tags(bbcode(stripslashes($datarray['body']))), ENT_QUOTES, 'UTF-8'); - - // html version - // process the message body to display properly in text mode - $msg['htmlversion'] - = html_entity_decode(bbcode(stripslashes(str_replace(array("\\r\\n", "\\r","\\n\\n" ,"\\n"), "
\n",$datarray['body'])))); - - // load the template for private message notifications - $tpl = load_view_file('view/wall_received_html_body_eml.tpl'); - $email_html_body_tpl = replace_macros($tpl,array( - '$username' => $user['username'], - '$sitename' => $a->config['sitename'], // name of this site - '$siteurl' => $a->get_baseurl(), // descriptive url of this site - '$thumb' => $author['thumb'], // thumbnail url for sender icon - '$url' => $author['url'], // full url for the site - '$from' => $from, // name of the person sending the message - '$body' => $msg['htmlversion'], // html version of the message - '$display' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id, + if($contact_record != $author) { + notification(array( + 'type' => NOTIFY_WALL, + 'notify_flags' => $user['notify-flags'], + 'language' => $user['language'], + 'to_name' => $user['username'], + 'to_email' => $user['email'], + 'item' => $datarray, + 'link' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id, + 'source_name' => $datarray['author-name'], + 'source_link' => $datarray['author-link'], + 'source_photo' => $datarray['author-avatar'], + 'verb' => ACTIVITY_POST, + 'otype' => 'item' )); - - // load the template for private message notifications - $tpl = load_view_file('view/wall_received_text_body_eml.tpl'); - $email_text_body_tpl = replace_macros($tpl,array( - '$username' => $user['username'], - '$sitename' => $a->config['sitename'], // name of this site - '$siteurl' => $a->get_baseurl(), // descriptive url of this site - '$thumb' => $author['thumb'], // thumbnail url for sender icon - '$url' => $author['url'], // full url for the site - '$from' => $from, // name of the person sending the message - '$body' => $msg['textversion'], // text version of the message - '$display' => $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id, - )); - - // use the EmailNotification library to send the message - require_once("include/EmailNotification.php"); - EmailNotification::sendTextHtmlEmail( - $msg['notificationfromname'], - t("Administrator@") . $a->get_hostname(), - t("noreply") . '@' . $a->get_hostname(), - $user['email'], - sprintf( t('%s posted to your profile wall at %s') , $from , $a->config['sitename']), - $email_html_body_tpl, - $email_text_body_tpl - ); - pop_lang(); } } + // fallback so that parent always gets set to non-zero. + + if(! $parent) + $parent = $post_id; + $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), @@ -686,11 +767,17 @@ 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'] ); + goaway($a->get_baseurl() . "/" . $return_path ); // NOTREACHED } - proc_run('php', "include/notifier.php", $notify_type, "$post_id"); + // update the commented timestamp on the parent + + q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d LIMIT 1", + dbesc(datetime_convert()), + dbesc(datetime_convert()), + intval($parent) + ); $datarray['id'] = $post_id; $datarray['plink'] = $a->get_baseurl() . '/display/' . $user['nickname'] . '/' . $post_id; @@ -704,12 +791,12 @@ function item_post(&$a) { $addr = trim($recip); if(! strlen($addr)) continue; - $disclaimer = '
' . sprintf( t('This message was sent to you by %s, a member of the Friendika social network.'),$a->user['username']) + $disclaimer = '
' . sprintf( t('This message was sent to you by %s, a member of the Friendica social network.'),$a->user['username']) . '
'; $disclaimer .= sprintf( t('You may visit them online at %s'), $a->get_baseurl() . '/profile/' . $a->user['nickname']) . EOL; $disclaimer .= t('Please contact the sender by replying to this post if you do not wish to receive these messages.') . EOL; - $subject = '[Friendika]' . ' ' . sprintf( t('%s posted an update.'),$a->user['username']); + $subject = '[Friendica]' . ' ' . sprintf( t('%s posted an update.'),$a->user['username']); $headers = 'From: ' . $a->user['username'] . ' <' . $a->user['email'] . '>' . "\n"; $headers .= 'MIME-Version: 1.0' . "\n"; $headers .= 'Content-Type: text/html; charset=UTF-8' . "\n"; @@ -722,13 +809,28 @@ function item_post(&$a) { } } + // This is a real juggling act on shared hosting services which kill your processes + // e.g. dreamhost. We used to start delivery to our native delivery agents in the background + // and then run our plugin delivery from the foreground. We're now doing plugin delivery first, + // because as soon as you start loading up a bunch of remote delivey processes, *this* page is + // likely to get killed off. If you end up looking at an /item URL and a blank page, + // it's very likely the delivery got killed before all your friends could be notified. + // Currently the only realistic fixes are to use a reliable server - which precludes shared hosting, + // or cut back on plugins which do remote deliveries. + + proc_run('php', "include/notifier.php", $notify_type, "$post_id"); + logger('post_complete'); - if((x($_POST,'return')) && strlen($_POST['return'])) { - logger('return: ' . $_POST['return']); - goaway($a->get_baseurl() . "/" . $_POST['return'] ); - } - if($_POST['api_source']) + + // figure out how to return, depending on from whence we came + + if($api_source) return; + + if($return_path) { + goaway($a->get_baseurl() . "/" . $return_path); + } + $json = array('success' => 1); if(x($_POST,'jsreload') && strlen($_POST['jsreload'])) $json['reload'] = $a->get_baseurl() . '/' . $_POST['jsreload'];