X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=mod%2Fitem.php;h=221cba482d77712957883b26c93c0f76c3bb8fb1;hb=63610c7b73fcaf862adbf880d4968dd2b1678d9b;hp=02fda2c2706a8533ee0034ec4caf66f5b5675bbf;hpb=c1a15befc55af63ab95318c160aa4e9c5bbf6517;p=friendica.git diff --git a/mod/item.php b/mod/item.php index 02fda2c270..221cba482d 100644 --- a/mod/item.php +++ b/mod/item.php @@ -102,7 +102,7 @@ function item_post(&$a) { } // if this isn't the real parent of the conversation, find it - if($r !== false && count($r)) { + if(dbm::is_result($r)) { $parid = $r[0]['parent']; $parent_uri = $r[0]['uri']; if($r[0]['id'] != $r[0]['parent']) { @@ -112,10 +112,10 @@ function item_post(&$a) { } } - if(($r === false) || (! count($r))) { + if(! dbm::is_result($r)) { notice( t('Unable to locate original post.') . EOL); if(x($_REQUEST,'return')) - goaway($a->get_baseurl() . "/" . $return_path ); + goaway($return_path); killme(); } $parent_item = $r[0]; @@ -173,7 +173,21 @@ function item_post(&$a) { $profile_uid = ((x($_REQUEST,'profile_uid')) ? intval($_REQUEST['profile_uid']) : 0); $post_id = ((x($_REQUEST,'post_id')) ? intval($_REQUEST['post_id']) : 0); $app = ((x($_REQUEST,'source')) ? strip_tags($_REQUEST['source']) : ''); - $extid = ((x($_REQUEST,'extid')) ? strip_tags($_REQUEST['extid']) : ''); + $extid = ((x($_REQUEST,'extid')) ? strip_tags($_REQUEST['extid']) : ''); + $object = ((x($_REQUEST,'object')) ? $_REQUEST['object'] : ''); + + // Check for multiple posts with the same message id (when the post was created via API) + if (($message_id != '') AND ($profile_uid != 0)) { + $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", + dbesc($message_id), + intval($profile_uid) + ); + + if (dbm::is_result($r)) { + logger("Message with URI ".$message_id." already exists for user ".$profile_uid, LOGGER_DEBUG); + return; + } + } $allow_moderated = false; @@ -184,7 +198,7 @@ function item_post(&$a) { if((x($_REQUEST,'commenter')) && ((! $parent) || (! $parent_item['wall']))) { notice( t('Permission denied.') . EOL) ; if(x($_REQUEST,'return')) - goaway($a->get_baseurl() . "/" . $return_path ); + goaway($return_path); killme(); } @@ -196,7 +210,7 @@ function item_post(&$a) { if((! can_write_wall($a,$profile_uid)) && (! $allow_moderated)) { notice( t('Permission denied.') . EOL) ; if(x($_REQUEST,'return')) - goaway($a->get_baseurl() . "/" . $return_path ); + goaway($return_path); killme(); } @@ -292,7 +306,6 @@ function item_post(&$a) { // If this is a comment, set the permissions from the parent. if($parent_item) { - $private = 0; // for non native networks use the network of the original post as network of the item if (($parent_item['network'] != NETWORK_DIASPORA) @@ -300,19 +313,13 @@ function item_post(&$a) { AND ($network == "")) $network = $parent_item['network']; - if(($parent_item['private']) - || strlen($parent_item['allow_cid']) - || strlen($parent_item['allow_gid']) - || strlen($parent_item['deny_cid']) - || strlen($parent_item['deny_gid'])) { - $private = (($parent_item['private']) ? $parent_item['private'] : 1); - } - $str_contact_allow = $parent_item['allow_cid']; $str_group_allow = $parent_item['allow_gid']; $str_contact_deny = $parent_item['deny_cid']; $str_group_deny = $parent_item['deny_gid']; + $private = $parent_item['private']; } + $pubmail_enable = ((x($_REQUEST,'pubmail_enable') && intval($_REQUEST['pubmail_enable']) && (! $private)) ? 1 : 0); // if using the API, we won't see pubmail_enable - figure out if it should be set @@ -333,7 +340,7 @@ function item_post(&$a) { killme(); info( t('Empty post discarded.') . EOL ); if(x($_REQUEST,'return')) - goaway($a->get_baseurl() . "/" . $return_path ); + goaway($return_path); killme(); } } @@ -457,10 +464,9 @@ function item_post(&$a) { intval($profile_uid) ); - if(! count($r)) + if(! dbm::is_result($r)) continue; - $r = q("UPDATE `photo` SET `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' WHERE `resource-id` = '%s' AND `uid` = %d AND `album` = '%s' ", dbesc($str_contact_allow), @@ -471,7 +477,6 @@ function item_post(&$a) { intval($profile_uid), dbesc( t('Wall Photos')) ); - } } } @@ -714,6 +719,7 @@ function item_post(&$a) { $datarray['moderated'] = $allow_moderated; $datarray['gcontact-id'] = get_gcontact_id(array("url" => $datarray['author-link'], "network" => $datarray['network'], "photo" => $datarray['author-avatar'], "name" => $datarray['author-name'])); + $datarray['object'] = $object; /** * These fields are for the convenience of plugins... @@ -725,6 +731,11 @@ function item_post(&$a) { $datarray['self'] = $self; // $datarray['prvnets'] = $user['prvnets']; + $datarray['parent-uri'] = ($parent == 0) ? $uri : $parent_item['uri']; + $datarray['plink'] = $a->get_baseurl().'/display/'.urlencode($datarray['guid']); + $datarray['last-child'] = 1; + $datarray['visible'] = 1; + if($orig_post) $datarray['edit'] = true; @@ -735,6 +746,9 @@ function item_post(&$a) { if($preview) { require_once('include/conversation.php'); + // We set the datarray ID to -1 because in preview mode the dataray + // doesn't have an ID. + $datarray["id"] = -1; $o = conversation($a,array(array_merge($contact_record,$datarray)),'search', false, true); logger('preview: ' . $o); echo json_encode(array('preview' => $o)); @@ -747,7 +761,7 @@ function item_post(&$a) { if(x($datarray,'cancel')) { logger('mod_item: post cancelled by plugin.'); if($return_path) { - goaway($a->get_baseurl() . "/" . $return_path); + goaway($return_path); } $json = array('cancel' => 1); @@ -786,13 +800,14 @@ function item_post(&$a) { proc_run(PRIORITY_HIGH, "include/notifier.php", 'edit_post', $post_id); if((x($_REQUEST,'return')) && strlen($return_path)) { logger('return: ' . $return_path); - goaway($a->get_baseurl() . "/" . $return_path ); + goaway($return_path); } killme(); - } - else + } else $post_id = 0; + q("COMMIT"); + q("START TRANSACTION;"); $r = q("INSERT INTO `item` (`guid`, `extid`, `uid`,`type`,`wall`,`gravity`, `network`, `contact-id`, `owner-name`,`owner-link`,`owner-avatar`, `owner-id`, @@ -802,7 +817,8 @@ function item_post(&$a) { `tag`, `inform`, `verb`, `object-type`, `postopts`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail`, `attach`, `bookmark`,`origin`, `moderated`, `file`, - `rendered-html`, `rendered-hash`) + `rendered-html`, `rendered-hash`, `gcontact-id`, `object`, + `parent`, `parent-uri`, `plink`, `last-child`, `visible`) VALUES('%s', '%s', %d, '%s', %d, %d, '%s', %d, '%s', '%s', '%s', %d, '%s', '%s', '%s', %d, @@ -811,7 +827,8 @@ function item_post(&$a) { '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, %d, '%s', - '%s', '%s')", + '%s', '%s', %d, '%s', + %d, '%s', '%s', %d, %d)", dbesc($datarray['guid']), dbesc($datarray['extid']), intval($datarray['uid']), @@ -857,23 +874,41 @@ function item_post(&$a) { intval($datarray['moderated']), dbesc($datarray['file']), dbesc($datarray['rendered-html']), - dbesc($datarray['rendered-hash']) + dbesc($datarray['rendered-hash']), + intval($datarray['gcontact-id']), + dbesc($datarray['object']), + intval($datarray['parent']), + dbesc($datarray['parent-uri']), + dbesc($datarray['plink']), + intval($datarray['last-child']), + intval($datarray['visible']) ); - $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1", - dbesc($datarray['uri'])); - if(!count($r)) { + if (dbm::is_result($r)) { + $r = q("SELECT LAST_INSERT_ID() AS `item-id`"); + if (dbm::is_result($r)) { + $post_id = $r[0]['item-id']; + } else { + $post_id = 0; + } + } else { + logger('mod_item: unable to create post.'); + $post_id = 0; + } + + if ($post_id == 0) { + q("COMMIT"); logger('mod_item: unable to retrieve post that was just stored.'); - notice( t('System error. Post not saved.') . EOL); - goaway($a->get_baseurl() . "/" . $return_path ); + notice(t('System error. Post not saved.') . EOL); + goaway($return_path); // NOTREACHED } - $post_id = $r[0]['id']; logger('mod_item: saved item ' . $post_id); $datarray["id"] = $post_id; - $datarray["plink"] = $a->get_baseurl().'/display/'.urlencode($datarray["guid"]); + + item_set_last_item($datarray); // update filetags in pconfig file_tag_update_pconfig($uid,$categories_old,$categories_new,'category'); @@ -881,22 +916,17 @@ function item_post(&$a) { if($parent) { // This item is the last leaf and gets the comment box, clear any ancestors - $r = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent` = %d ", + $r = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent` = %d AND `last-child` AND `id` != %d", dbesc(datetime_convert()), - intval($parent) + intval($parent), + intval($post_id) ); - update_thread($parent, true); - - // Inherit ACLs from the parent item. - $r = q("UPDATE `item` SET `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `private` = %d - WHERE `id` = %d", - dbesc($parent_item['allow_cid']), - dbesc($parent_item['allow_gid']), - dbesc($parent_item['deny_cid']), - dbesc($parent_item['deny_gid']), - intval($parent_item['private']), - intval($post_id) + // update the commented timestamp on the parent + q("UPDATE `item` SET `visible` = 1, `commented` = '%s', `changed` = '%s' WHERE `id` = %d", + dbesc(datetime_convert()), + dbesc(datetime_convert()), + intval($parent) ); if($contact_record != $author) { @@ -927,6 +957,10 @@ function item_post(&$a) { } else { $parent = $post_id; + $r = q("UPDATE `item` SET `parent` = %d WHERE `id` = %d", + intval($parent), + intval($post_id)); + if($contact_record != $author) { notification(array( 'type' => NOTIFY_WALL, @@ -946,41 +980,6 @@ function item_post(&$a) { } } - // 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", - intval($parent), - dbesc(($parent == $post_id) ? $uri : $parent_item['uri']), - dbesc($a->get_baseurl().'/display/'.urlencode($datarray['guid'])), - dbesc(datetime_convert()), - intval($post_id) - ); - - // photo comments turn the corresponding item visible to the profile wall - // This way we don't see every picture in your new photo album posted to your wall at once. - // They will show up as people comment on them. - - if(! $parent_item['visible']) { - $r = q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d", - intval($parent_item['id']) - ); - update_thread($parent_item['id']); - } - - // update the commented timestamp on the parent - - q("UPDATE `item` set `commented` = '%s', `changed` = '%s' WHERE `id` = %d", - dbesc(datetime_convert()), - dbesc(datetime_convert()), - intval($parent) - ); - if ($post_id != $parent) - update_thread($parent); - call_hooks('post_local_end', $datarray); if(strlen($emailcc) && $profile_uid == local_user()) { @@ -1017,21 +1016,24 @@ function item_post(&$a) { } } + if ($post_id == $parent) { + add_thread($post_id); + } else { + update_thread($parent, true); + } + + q("COMMIT"); + create_tags_from_item($post_id); create_files_from_item($post_id); - if ($post_id == $parent) - add_thread($post_id); - - // 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. + // 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 + proc_run(array('priority' => PRIORITY_HIGH, 'dont_fork' => true), "include/create_shadowentry.php", $post_id); + // Call the background process that is delivering the item to the receivers proc_run(PRIORITY_HIGH, "include/notifier.php", $notify_type, $post_id); logger('post_complete'); @@ -1047,7 +1049,7 @@ function item_post_return($baseurl, $api_source, $return_path) { return; if($return_path) { - goaway($baseurl . "/" . $return_path); + goaway($return_path); } $json = array('success' => 1);