Continued:

- added curly braces/spaces
- added TODOs (type-hints, old-lost code)
- more usage of dbm::is_result()
- combined some if() return stuff into a simple return statement

Signed-off-by: Roland Haeder <roland@mxchange.org>
This commit is contained in:
Roland Häder 2017-04-14 16:59:51 +02:00
commit 03d23838f5
No known key found for this signature in database
GPG key ID: B72F8185C6C7BD78

View file

@ -138,8 +138,9 @@ function title_is_body($title, $body) {
$body = html_entity_decode($body, ENT_QUOTES, 'UTF-8'); $body = html_entity_decode($body, ENT_QUOTES, 'UTF-8');
$body = str_replace(array("\n", "\r", "\t", " "), array("", "", "", ""), $body); $body = str_replace(array("\n", "\r", "\t", " "), array("", "", "", ""), $body);
if (strlen($title) < strlen($body)) if (strlen($title) < strlen($body)) {
$body = substr($body, 0, strlen($title)); $body = substr($body, 0, strlen($title));
}
if (($title != $body) and (substr($title, -3) == "...")) { if (($title != $body) and (substr($title, -3) == "...")) {
$pos = strrpos($title, "..."); $pos = strrpos($title, "...");
@ -250,7 +251,7 @@ function query_page_info($url, $no_photos = false, $photo = "", $keywords = fals
} }
} }
return($data); return $data;
} }
function add_page_keywords($url, $no_photos = false, $photo = "", $keywords = false, $keyword_blacklist = "") { function add_page_keywords($url, $no_photos = false, $photo = "", $keywords = false, $keyword_blacklist = "") {
@ -270,7 +271,7 @@ function add_page_keywords($url, $no_photos = false, $photo = "", $keywords = fa
} }
} }
return($tags); return $tags;
} }
function add_page_info($url, $no_photos = false, $photo = "", $keywords = false, $keyword_blacklist = "") { function add_page_info($url, $no_photos = false, $photo = "", $keywords = false, $keyword_blacklist = "") {
@ -278,7 +279,7 @@ function add_page_info($url, $no_photos = false, $photo = "", $keywords = false,
$text = add_page_info_data($data); $text = add_page_info_data($data);
return($text); return $text;
} }
function add_page_info_to_body($body, $texturl = false, $no_photos = false) { function add_page_info_to_body($body, $texturl = false, $no_photos = false) {
@ -294,36 +295,42 @@ function add_page_info_to_body($body, $texturl = false, $no_photos = false) {
// Adding these spaces is a quick hack due to my problems with regular expressions :) // Adding these spaces is a quick hack due to my problems with regular expressions :)
preg_match("/[^!#@]\[url\]([$URLSearchString]*)\[\/url\]/ism", " " . $body, $matches); preg_match("/[^!#@]\[url\]([$URLSearchString]*)\[\/url\]/ism", " " . $body, $matches);
if (!$matches) if (!$matches) {
preg_match("/[^!#@]\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", " " . $body, $matches); preg_match("/[^!#@]\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", " " . $body, $matches);
}
// Convert urls without bbcode elements // Convert urls without bbcode elements
if (!$matches AND $texturl) { if (!$matches AND $texturl) {
preg_match("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", " ".$body, $matches); preg_match("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", " ".$body, $matches);
// Yeah, a hack. I really hate regular expressions :) // Yeah, a hack. I really hate regular expressions :)
if ($matches) if ($matches) {
$matches[1] = $matches[2]; $matches[1] = $matches[2];
} }
}
if ($matches) if ($matches) {
$footer = add_page_info($matches[1], $no_photos); $footer = add_page_info($matches[1], $no_photos);
}
// Remove the link from the body if the link is attached at the end of the post // Remove the link from the body if the link is attached at the end of the post
if (isset($footer) AND (trim($footer) != "") AND (strpos($footer, $matches[1]))) { if (isset($footer) AND (trim($footer) != "") AND (strpos($footer, $matches[1]))) {
$removedlink = trim(str_replace($matches[1], "", $body)); $removedlink = trim(str_replace($matches[1], "", $body));
if (($removedlink == "") OR strstr($body, $removedlink)) if (($removedlink == "") OR strstr($body, $removedlink)) {
$body = $removedlink;
$url = str_replace(array('/', '.'), array('\/', '\.'), $matches[1]);
$removedlink = preg_replace("/\[url\=".$url."\](.*?)\[\/url\]/ism", '', $body);
if (($removedlink == "") OR strstr($body, $removedlink))
$body = $removedlink; $body = $removedlink;
} }
$url = str_replace(array('/', '.'), array('\/', '\.'), $matches[1]);
$removedlink = preg_replace("/\[url\=" . $url . "\](.*?)\[\/url\]/ism", '', $body);
if (($removedlink == "") OR strstr($body, $removedlink)) {
$body = $removedlink;
}
}
// Add the page information to the bottom // Add the page information to the bottom
if (isset($footer) AND (trim($footer) != "")) if (isset($footer) AND (trim($footer) != "")) {
$body .= $footer; $body .= $footer;
}
return $body; return $body;
} }
@ -337,12 +344,13 @@ function add_page_info_to_body($body, $texturl = false, $no_photos = false) {
*/ */
function item_add_language_opt(&$arr) { function item_add_language_opt(&$arr) {
if (version_compare(PHP_VERSION, '5.3.0', '<')) return; // LanguageDetect.php not available ? if (version_compare(PHP_VERSION, '5.3.0', '<')) {
// LanguageDetect.php not available ?
return;
}
if (x($arr, 'postopts') ) if (x($arr, 'postopts') ) {
{ if (strstr($arr['postopts'], 'lang=') ) {
if (strstr($arr['postopts'], 'lang=') )
{
// do not override // do not override
/// @TODO Add parameter to request overriding /// @TODO Add parameter to request overriding
return; return;
@ -353,8 +361,9 @@ function item_add_language_opt(&$arr) {
} }
require_once('library/langdet/Text/LanguageDetect.php'); require_once('library/langdet/Text/LanguageDetect.php');
$naked_body = preg_replace('/\[(.+?)\]/','', $arr['body']); $naked_body = preg_replace('/\[(.+?)\]/','', $arr['body']);
$l = new Text_LanguageDetect; $l = new Text_LanguageDetect();
//$lng = $l->detectConfidence($naked_body); //$lng = $l->detectConfidence($naked_body);
//$arr['postopts'] = (($lng['language']) ? 'lang=' . $lng['language'] . ';' . $lng['confidence'] : ''); //$arr['postopts'] = (($lng['language']) ? 'lang=' . $lng['language'] . ';' . $lng['confidence'] : '');
$lng = $l->detect($naked_body, 3); $lng = $l->detect($naked_body, 3);
@ -401,6 +410,8 @@ function uri_to_guid($uri, $host = "") {
return $guid_prefix.$host_hash; return $guid_prefix.$host_hash;
} }
/// @TODO Maybe $arr must be called-by-reference? This function modifies it
/// @TODO add type-hint array
function item_store($arr, $force_parent = false, $notify = false, $dontcache = false) { function item_store($arr, $force_parent = false, $notify = false, $dontcache = false) {
$a = get_app(); $a = get_app();
@ -425,8 +436,10 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
} }
} }
// If a Diaspora signature structure was passed in, pull it out of the /*
// item array and set it aside for later storage. * If a Diaspora signature structure was passed in, pull it out of the
* item array and set it aside for later storage.
*/
$dsprsig = null; $dsprsig = null;
if (x($arr, 'dsprsig')) { if (x($arr, 'dsprsig')) {
@ -437,27 +450,28 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
// Converting the plink // Converting the plink
if ($arr['network'] == NETWORK_OSTATUS) { if ($arr['network'] == NETWORK_OSTATUS) {
if (isset($arr['plink'])) if (isset($arr['plink'])) {
$arr['plink'] = ostatus::convert_href($arr['plink']); $arr['plink'] = ostatus::convert_href($arr['plink']);
elseif (isset($arr['uri'])) } elseif (isset($arr['uri'])) {
$arr['plink'] = ostatus::convert_href($arr['uri']); $arr['plink'] = ostatus::convert_href($arr['uri']);
} }
}
if (x($arr, 'gravity')) if (x($arr, 'gravity')) {
$arr['gravity'] = intval($arr['gravity']); $arr['gravity'] = intval($arr['gravity']);
elseif ($arr['parent-uri'] === $arr['uri']) } elseif ($arr['parent-uri'] === $arr['uri']) {
$arr['gravity'] = 0; $arr['gravity'] = 0;
elseif (activity_match($arr['verb'],ACTIVITY_POST)) } elseif (activity_match($arr['verb'],ACTIVITY_POST)) {
$arr['gravity'] = 6; $arr['gravity'] = 6;
else } else {
$arr['gravity'] = 6; // extensible catchall $arr['gravity'] = 6; // extensible catchall
}
if (! x($arr,'type')) if (! x($arr, 'type')) {
$arr['type'] = 'remote'; $arr['type'] = 'remote';
}
// check for create date and expire time
/* check for create date and expire time */
$uid = intval($arr['uid']); $uid = intval($arr['uid']);
$r = q("SELECT expire FROM user WHERE uid = %d", intval($uid)); $r = q("SELECT expire FROM user WHERE uid = %d", intval($uid));
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
@ -472,8 +486,11 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
} }
} }
// Do we already have this item? /*
// We have to check several networks since Friendica posts could be repeated via OStatus (maybe Diasporsa as well) * Do we already have this item?
* We have to check several networks since Friendica posts could be repeated
* via OStatus (maybe Diasporsa as well)
*/
if (in_array(trim($arr['network']), array(NETWORK_DIASPORA, NETWORK_DFRN, NETWORK_OSTATUS, ""))) { if (in_array(trim($arr['network']), array(NETWORK_DIASPORA, NETWORK_DFRN, NETWORK_OSTATUS, ""))) {
$r = q("SELECT `id`, `network` FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `network` IN ('%s', '%s', '%s') LIMIT 1", $r = q("SELECT `id`, `network` FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `network` IN ('%s', '%s', '%s') LIMIT 1",
dbesc(trim($arr['uri'])), dbesc(trim($arr['uri'])),
@ -482,14 +499,17 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
dbesc(NETWORK_DFRN), dbesc(NETWORK_DFRN),
dbesc(NETWORK_OSTATUS) dbesc(NETWORK_OSTATUS)
); );
if ($r) { if (dbm::is_result($r)) {
// We only log the entries with a different user id than 0. Otherwise we would have too many false positives // We only log the entries with a different user id than 0. Otherwise we would have too many false positives
if ($uid != 0) if ($uid != 0) {
logger("Item with uri ".$arr['uri']." already existed for user ".$uid." with id ".$r[0]["id"]." target network ".$r[0]["network"]." - new network: ".$arr['network']); logger("Item with uri ".$arr['uri']." already existed for user ".$uid." with id ".$r[0]["id"]." target network ".$r[0]["network"]." - new network: ".$arr['network']);
return($r[0]["id"]); }
return $r[0]["id"];
} }
} }
/// @TODO old-lost code?
// Shouldn't happen but we want to make absolutely sure it doesn't leak from a plugin. // Shouldn't happen but we want to make absolutely sure it doesn't leak from a plugin.
// Deactivated, since the bbcode parser can handle with it - and it destroys posts with some smileys that contain "<" // Deactivated, since the bbcode parser can handle with it - and it destroys posts with some smileys that contain "<"
//if ((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false)) //if ((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
@ -497,13 +517,13 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
item_add_language_opt($arr); item_add_language_opt($arr);
if ($notify) if ($notify) {
$guid_prefix = ""; $guid_prefix = "";
elseif ((trim($arr['guid']) == "") AND (trim($arr['plink']) != "")) } elseif ((trim($arr['guid']) == "") AND (trim($arr['plink']) != "")) {
$arr['guid'] = uri_to_guid($arr['plink']); $arr['guid'] = uri_to_guid($arr['plink']);
elseif ((trim($arr['guid']) == "") AND (trim($arr['uri']) != "")) } elseif ((trim($arr['guid']) == "") AND (trim($arr['uri']) != "")) {
$arr['guid'] = uri_to_guid($arr['uri']); $arr['guid'] = uri_to_guid($arr['uri']);
else { } else {
$parsed = parse_url($arr["author-link"]); $parsed = parse_url($arr["author-link"]);
$guid_prefix = hash("crc32", $parsed["host"]); $guid_prefix = hash("crc32", $parsed["host"]);
} }
@ -555,15 +575,18 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
$arr['file'] = ((x($arr, 'file')) ? trim($arr['file']) : ''); $arr['file'] = ((x($arr, 'file')) ? trim($arr['file']) : '');
// Items cannot be stored before they happen ... // Items cannot be stored before they happen ...
if ($arr['created'] > datetime_convert()) if ($arr['created'] > datetime_convert()) {
$arr['created'] = datetime_convert(); $arr['created'] = datetime_convert();
}
// We haven't invented time travel by now. // We haven't invented time travel by now.
if ($arr['edited'] > datetime_convert()) if ($arr['edited'] > datetime_convert()) {
$arr['edited'] = datetime_convert(); $arr['edited'] = datetime_convert();
}
if (($arr['author-link'] == "") AND ($arr['owner-link'] == "")) if (($arr['author-link'] == "") AND ($arr['owner-link'] == "")) {
logger("Both author-link and owner-link are empty. Called by: " . App::callstack(), LOGGER_DEBUG); logger("Both author-link and owner-link are empty. Called by: " . App::callstack(), LOGGER_DEBUG);
}
if ($arr['plink'] == "") { if ($arr['plink'] == "") {
$arr['plink'] = App::get_baseurl() . '/display/' . urlencode($arr['guid']); $arr['plink'] = App::get_baseurl() . '/display/' . urlencode($arr['guid']);
@ -582,59 +605,74 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
dbesc(normalise_link($arr['author-link'])) dbesc(normalise_link($arr['author-link']))
); );
if (!dbm::is_result($r)) if (!dbm::is_result($r)) {
$r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", $r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($arr['contact-id']), intval($arr['contact-id']),
intval($arr['uid']) intval($arr['uid'])
); );
}
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$arr['network'] = $r[0]["network"]; $arr['network'] = $r[0]["network"];
}
// Fallback to friendica (why is it empty in some cases?) // Fallback to friendica (why is it empty in some cases?)
if ($arr['network'] == "") if ($arr['network'] == "") {
$arr['network'] = NETWORK_DFRN; $arr['network'] = NETWORK_DFRN;
}
logger("item_store: Set network to " . $arr["network"] . " for " . $arr["uri"], LOGGER_DEBUG); logger("item_store: Set network to " . $arr["network"] . " for " . $arr["uri"], LOGGER_DEBUG);
} }
// The contact-id should be set before "item_store" was called - but there seems to be some issues // The contact-id should be set before "item_store" was called - but there seems to be some issues
if ($arr["contact-id"] == 0) { if ($arr["contact-id"] == 0) {
// First we are looking for a suitable contact that matches with the author of the post /*
// This is done only for comments (See below explanation at "gcontact-id") * First we are looking for a suitable contact that matches with the author of the post
if ($arr['parent-uri'] != $arr['uri']) * This is done only for comments (See below explanation at "gcontact-id")
*/
if ($arr['parent-uri'] != $arr['uri']) {
$arr["contact-id"] = get_contact($arr['author-link'], $uid); $arr["contact-id"] = get_contact($arr['author-link'], $uid);
}
// If not present then maybe the owner was found // If not present then maybe the owner was found
if ($arr["contact-id"] == 0) if ($arr["contact-id"] == 0) {
$arr["contact-id"] = get_contact($arr['owner-link'], $uid); $arr["contact-id"] = get_contact($arr['owner-link'], $uid);
}
// Still missing? Then use the "self" contact of the current user // Still missing? Then use the "self" contact of the current user
if ($arr["contact-id"] == 0) { if ($arr["contact-id"] == 0) {
$r = q("SELECT `id` FROM `contact` WHERE `self` AND `uid` = %d", intval($uid)); $r = q("SELECT `id` FROM `contact` WHERE `self` AND `uid` = %d", intval($uid));
if ($r)
if (dbm::is_result($r)) {
$arr["contact-id"] = $r[0]["id"]; $arr["contact-id"] = $r[0]["id"];
} }
}
logger("Contact-id was missing for post ".$arr["guid"]." from user id ".$uid." - now set to ".$arr["contact-id"], LOGGER_DEBUG); logger("Contact-id was missing for post ".$arr["guid"]." from user id ".$uid." - now set to ".$arr["contact-id"], LOGGER_DEBUG);
} }
if ($arr["gcontact-id"] == 0) { if ($arr["gcontact-id"] == 0) {
// The gcontact should mostly behave like the contact. But is is supposed to be global for the system. /*
// This means that wall posts, repeated posts, etc. should have the gcontact id of the owner. * The gcontact should mostly behave like the contact. But is is supposed to be global for the system.
// On comments the author is the better choice. * This means that wall posts, repeated posts, etc. should have the gcontact id of the owner.
if ($arr['parent-uri'] === $arr['uri']) * On comments the author is the better choice.
*/
if ($arr['parent-uri'] === $arr['uri']) {
$arr["gcontact-id"] = get_gcontact_id(array("url" => $arr['owner-link'], "network" => $arr['network'], $arr["gcontact-id"] = get_gcontact_id(array("url" => $arr['owner-link'], "network" => $arr['network'],
"photo" => $arr['owner-avatar'], "name" => $arr['owner-name'])); "photo" => $arr['owner-avatar'], "name" => $arr['owner-name']));
else } else {
$arr["gcontact-id"] = get_gcontact_id(array("url" => $arr['author-link'], "network" => $arr['network'], $arr["gcontact-id"] = get_gcontact_id(array("url" => $arr['author-link'], "network" => $arr['network'],
"photo" => $arr['author-avatar'], "name" => $arr['author-name'])); "photo" => $arr['author-avatar'], "name" => $arr['author-name']));
} }
}
if ($arr["author-id"] == 0) if ($arr["author-id"] == 0) {
$arr["author-id"] = get_contact($arr["author-link"], 0); $arr["author-id"] = get_contact($arr["author-link"], 0);
}
if ($arr["owner-id"] == 0) if ($arr["owner-id"] == 0) {
$arr["owner-id"] = get_contact($arr["owner-link"], 0); $arr["owner-id"] = get_contact($arr["owner-link"], 0);
}
if ($arr['guid'] != "") { if ($arr['guid'] != "") {
// Checking if there is already an item with the same guid // Checking if there is already an item with the same guid
@ -684,9 +722,11 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
dbesc($r[0]['parent-uri']), dbesc($r[0]['parent-uri']),
intval($arr['uid']) intval($arr['uid'])
); );
if ($z && count($z))
if (dbm::is_result($z)) {
$r = $z; $r = $z;
} }
}
$parent_id = $r[0]['id']; $parent_id = $r[0]['id'];
$parent_deleted = $r[0]['deleted']; $parent_deleted = $r[0]['deleted'];
@ -697,20 +737,23 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
$arr['wall'] = $r[0]['wall']; $arr['wall'] = $r[0]['wall'];
$notify_type = 'comment-new'; $notify_type = 'comment-new';
// if the parent is private, force privacy for the entire conversation /*
// This differs from the above settings as it subtly allows comments from * If the parent is private, force privacy for the entire conversation
// email correspondents to be private even if the overall thread is not. * This differs from the above settings as it subtly allows comments from
* email correspondents to be private even if the overall thread is not.
if ($r[0]['private']) */
if ($r[0]['private']) {
$arr['private'] = $r[0]['private']; $arr['private'] = $r[0]['private'];
}
// Edge case. We host a public forum that was originally posted to privately. /*
// The original author commented, but as this is a comment, the permissions * Edge case. We host a public forum that was originally posted to privately.
// weren't fixed up so it will still show the comment as private unless we fix it here. * The original author commented, but as this is a comment, the permissions
* weren't fixed up so it will still show the comment as private unless we fix it here.
if ((intval($r[0]['forum_mode']) == 1) && (! $r[0]['private'])) */
if ((intval($r[0]['forum_mode']) == 1) && (! $r[0]['private'])) {
$arr['private'] = 0; $arr['private'] = 0;
}
// If its a post from myself then tag the thread as "mention" // If its a post from myself then tag the thread as "mention"
logger("item_store: Checking if parent ".$parent_id." has to be tagged as mention for user ".$arr['uid'], LOGGER_DEBUG); logger("item_store: Checking if parent ".$parent_id." has to be tagged as mention for user ".$arr['uid'], LOGGER_DEBUG);
@ -725,10 +768,10 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
} }
} }
} else { } else {
/*
// Allow one to see reply tweets from status.net even when * Allow one to see reply tweets from status.net even when
// we don't have or can't see the original post. * we don't have or can't see the original post.
*/
if ($force_parent) { if ($force_parent) {
logger('item_store: $force_parent=true, reply converted to top-level post.'); logger('item_store: $force_parent=true, reply converted to top-level post.');
$parent_id = 0; $parent_id = 0;
@ -788,14 +831,15 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
} else { } else {
$isglobal = q("SELECT `global` FROM `item` WHERE `uid` = 0 AND `uri` = '%s'", dbesc($arr["uri"])); $isglobal = q("SELECT `global` FROM `item` WHERE `uid` = 0 AND `uri` = '%s'", dbesc($arr["uri"]));
$arr["global"] = (count($isglobal) > 0); $arr["global"] = (dbm::is_result($isglobal) && count($isglobal) > 0);
} }
// ACL settings // ACL settings
if (strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid)) if (strlen($allow_cid) || strlen($allow_gid) || strlen($deny_cid) || strlen($deny_gid)) {
$private = 1; $private = 1;
else } else {
$private = $arr['private']; $private = $arr['private'];
}
$arr["allow_cid"] = $allow_cid; $arr["allow_cid"] = $allow_cid;
$arr["allow_gid"] = $allow_gid; $arr["allow_gid"] = $allow_gid;
@ -807,19 +851,22 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
// Fill the cache field // Fill the cache field
put_item_in_cache($arr); put_item_in_cache($arr);
if ($notify) if ($notify) {
call_hooks('post_local', $arr); call_hooks('post_local', $arr);
else } else {
call_hooks('post_remote', $arr); call_hooks('post_remote', $arr);
}
if (x($arr, 'cancel')) { if (x($arr, 'cancel')) {
logger('item_store: post cancelled by plugin.'); logger('item_store: post cancelled by plugin.');
return 0; return 0;
} }
// Check for already added items. /*
// There is a timing issue here that sometimes creates double postings. * Check for already added items.
// An unique index would help - but the limitations of MySQL (maximum size of index values) prevent this. * There is a timing issue here that sometimes creates double postings.
* An unique index would help - but the limitations of MySQL (maximum size of index values) prevent this.
*/
if ($arr["uid"] == 0) { if ($arr["uid"] == 0) {
$r = qu("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = 0 LIMIT 1", dbesc(trim($arr['uri']))); $r = qu("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = 0 LIMIT 1", dbesc(trim($arr['uri'])));
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
@ -920,8 +967,9 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
logger('item_store: created item '.$current_post); logger('item_store: created item '.$current_post);
item_set_last_item($arr); item_set_last_item($arr);
if (!$parent_id || ($arr['parent-uri'] === $arr['uri'])) if (!$parent_id || ($arr['parent-uri'] === $arr['uri'])) {
$parent_id = $current_post; $parent_id = $current_post;
}
// Set parent id // Set parent id
$r = q("UPDATE `item` SET `parent` = %d WHERE `id` = %d", $r = q("UPDATE `item` SET `parent` = %d WHERE `id` = %d",
@ -934,28 +982,31 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
// update the commented timestamp on the parent // update the commented timestamp on the parent
// Only update "commented" if it is really a comment // Only update "commented" if it is really a comment
if (($arr['verb'] == ACTIVITY_POST) OR !get_config("system", "like_no_comment")) if (($arr['verb'] == ACTIVITY_POST) OR !get_config("system", "like_no_comment")) {
q("UPDATE `item` SET `commented` = '%s', `changed` = '%s' WHERE `id` = %d", q("UPDATE `item` SET `commented` = '%s', `changed` = '%s' WHERE `id` = %d",
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc(datetime_convert()), dbesc(datetime_convert()),
intval($parent_id) intval($parent_id)
); );
else } else {
q("UPDATE `item` SET `changed` = '%s' WHERE `id` = %d", q("UPDATE `item` SET `changed` = '%s' WHERE `id` = %d",
dbesc(datetime_convert()), dbesc(datetime_convert()),
intval($parent_id) intval($parent_id)
); );
}
if ($dsprsig) { if ($dsprsig) {
// Friendica servers lower than 3.4.3-2 had double encoded the signature ... /*
// We can check for this condition when we decode and encode the stuff again. * Friendica servers lower than 3.4.3-2 had double encoded the signature ...
* We can check for this condition when we decode and encode the stuff again.
*/
if (base64_encode(base64_decode(base64_decode($dsprsig->signature))) == base64_decode($dsprsig->signature)) { if (base64_encode(base64_decode(base64_decode($dsprsig->signature))) == base64_decode($dsprsig->signature)) {
$dsprsig->signature = base64_decode($dsprsig->signature); $dsprsig->signature = base64_decode($dsprsig->signature);
logger("Repaired double encoded signature from handle ".$dsprsig->signer, LOGGER_DEBUG); logger("Repaired double encoded signature from handle ".$dsprsig->signer, LOGGER_DEBUG);
} }
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ", q("INSERT INTO `sign` (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
intval($current_post), intval($current_post),
dbesc($dsprsig->signed_text), dbesc($dsprsig->signed_text),
dbesc($dsprsig->signature), dbesc($dsprsig->signature),
@ -965,8 +1016,10 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
$deleted = tag_deliver($arr['uid'], $current_post); $deleted = tag_deliver($arr['uid'], $current_post);
// current post can be deleted if is for a community page and no mention are /*
// in it. * current post can be deleted if is for a community page and no mention are
* in it.
*/
if (!$deleted AND !$dontcache) { if (!$deleted AND !$dontcache) {
$r = q('SELECT * FROM `item` WHERE `id` = %d', intval($current_post)); $r = q('SELECT * FROM `item` WHERE `id` = %d', intval($current_post));
@ -989,13 +1042,17 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
q("COMMIT"); q("COMMIT");
// Due to deadlock issues with the "term" table we are doing these steps after the commit. /*
// This is not perfect - but a workable solution until we found the reason for the problem. * Due to deadlock issues with the "term" table we are doing these steps after the commit.
* This is not perfect - but a workable solution until we found the reason for the problem.
*/
create_tags_from_item($current_post); create_tags_from_item($current_post);
create_files_from_item($current_post); create_files_from_item($current_post);
// If this is now the last-child, force all _other_ children of this parent to *not* be last-child /*
// It is done after the transaction to avoid dead locks. * If this is now the last-child, force all _other_ children of this parent to *not* be last-child
* It is done after the transaction to avoid dead locks.
*/
if ($arr['last-child']) { if ($arr['last-child']) {
$r = q("UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d AND `id` != %d", $r = q("UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d AND `id` != %d",
dbesc($arr['uri']), dbesc($arr['uri']),
@ -1036,7 +1093,7 @@ function item_set_last_item($arr) {
if (!$update AND ($arr["network"] == NETWORK_DFRN) AND ($arr["parent-uri"] === $arr["uri"])) { if (!$update AND ($arr["network"] == NETWORK_DFRN) AND ($arr["parent-uri"] === $arr["uri"])) {
$isforum = q("SELECT `forum` FROM `contact` WHERE `id` = %d AND `forum`", $isforum = q("SELECT `forum` FROM `contact` WHERE `id` = %d AND `forum`",
intval($arr['contact-id'])); intval($arr['contact-id']));
if ($isforum) { if (dbm::is_result($isforum)) {
$update = true; $update = true;
} }
} }
@ -1071,8 +1128,9 @@ function item_body_set_hashtags(&$item) {
$tags = get_tags($item["body"]); $tags = get_tags($item["body"]);
// No hashtags? // No hashtags?
if (!count($tags)) if (!count($tags)) {
return(false); return false;
}
// This sorting is important when there are hashtags that are part of other hashtags // This sorting is important when there are hashtags that are part of other hashtags
// Otherwise there could be problems with hashtags like #test and #test2 // Otherwise there could be problems with hashtags like #test and #test2
@ -1082,6 +1140,7 @@ function item_body_set_hashtags(&$item) {
$URLSearchString = "^\[\]"; $URLSearchString = "^\[\]";
/// @TODO old-lost code?
// All hashtags should point to the home server // All hashtags should point to the home server
//$item["body"] = preg_replace("/#\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", //$item["body"] = preg_replace("/#\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
// "#[url=".App::get_baseurl()."/search?tag=$2]$2[/url]", $item["body"]); // "#[url=".App::get_baseurl()."/search?tag=$2]$2[/url]", $item["body"]);
@ -1109,13 +1168,10 @@ function item_body_set_hashtags(&$item) {
$item["body"] = preg_replace("/&num;\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", $item["body"] = preg_replace("/&num;\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
"&num;$2", $item["body"]); "&num;$2", $item["body"]);
foreach ($tags as $tag) { foreach ($tags as $tag) {
if (strpos($tag,'#') !== 0) if ((strpos($tag, '#') !== 0) || (strpos($tag, '[url=')) {
continue;
if (strpos($tag,'[url='))
continue; continue;
}
$basetag = str_replace('_',' ',substr($tag,1)); $basetag = str_replace('_',' ',substr($tag,1));
@ -1124,8 +1180,9 @@ function item_body_set_hashtags(&$item) {
$item["body"] = str_replace($tag, $newtag, $item["body"]); $item["body"] = str_replace($tag, $newtag, $item["body"]);
if (!stristr($item["tag"], "/search?tag=" . $basetag . "]" . $basetag . "[/url]")) { if (!stristr($item["tag"], "/search?tag=" . $basetag . "]" . $basetag . "[/url]")) {
if (strlen($item["tag"])) if (strlen($item["tag"])) {
$item["tag"] = ','.$item["tag"]; $item["tag"] = ','.$item["tag"];
}
$item["tag"] = $newtag.$item["tag"]; $item["tag"] = $newtag.$item["tag"];
} }
} }
@ -1136,10 +1193,12 @@ function item_body_set_hashtags(&$item) {
function get_item_guid($id) { function get_item_guid($id) {
$r = q("SELECT `guid` FROM `item` WHERE `id` = %d LIMIT 1", intval($id)); $r = q("SELECT `guid` FROM `item` WHERE `id` = %d LIMIT 1", intval($id));
if (dbm::is_result($r)) if (dbm::is_result($r)) {
return($r[0]["guid"]); return $r[0]["guid"];
else } else {
return(""); /// @TODO This else-block can be elimited again
return "";
}
} }
function get_item_id($guid, $uid = 0) { function get_item_id($guid, $uid = 0) {
@ -1147,8 +1206,9 @@ function get_item_id($guid, $uid = 0) {
$nick = ""; $nick = "";
$id = 0; $id = 0;
if ($uid == 0) if ($uid == 0) {
$uid == local_user(); $uid == local_user();
}
// Does the given user have this item? // Does the given user have this item?
if ($uid) { if ($uid) {
@ -1174,13 +1234,14 @@ function get_item_id($guid, $uid = 0) {
$nick = $r[0]["nickname"]; $nick = $r[0]["nickname"];
} }
} }
return(array("nick" => $nick, "id" => $id)); return array("nick" => $nick, "id" => $id);
} }
// return - test // return - test
function get_item_contact($item, $contacts) { function get_item_contact($item, $contacts) {
if (! count($contacts) || (! is_array($item))) if (! count($contacts) || (! is_array($item))) {
return false; return false;
}
foreach ($contacts as $contact) { foreach ($contacts as $contact) {
if ($contact['id'] == $item['contact-id']) { if ($contact['id'] == $item['contact-id']) {
return $contact; return $contact;
@ -1198,8 +1259,6 @@ function get_item_contact($item, $contacts) {
*/ */
function tag_deliver($uid, $item_id) { function tag_deliver($uid, $item_id) {
//
$a = get_app(); $a = get_app();
$mention = false; $mention = false;
@ -1228,9 +1287,10 @@ function tag_deliver($uid, $item_id) {
$link = normalise_link(App::get_baseurl() . '/profile/' . $u[0]['nickname']); $link = normalise_link(App::get_baseurl() . '/profile/' . $u[0]['nickname']);
// Diaspora uses their own hardwired link URL in @-tags /*
// instead of the one we supply with webfinger * Diaspora uses their own hardwired link URL in @-tags
* instead of the one we supply with webfinger
*/
$dlink = normalise_link(App::get_baseurl() . '/u/' . $u[0]['nickname']); $dlink = normalise_link(App::get_baseurl() . '/u/' . $u[0]['nickname']);
$cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism', $item['body'], $matches,PREG_SET_ORDER); $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism', $item['body'], $matches,PREG_SET_ORDER);
@ -1262,22 +1322,21 @@ function tag_deliver($uid, $item_id) {
call_hooks('tagged', $arr); call_hooks('tagged', $arr);
if ((! $community_page) && (! $prvgroup)) if ((! $community_page) && (! $prvgroup)) {
return; return;
}
/*
// tgroup delivery - setup a second delivery chain * tgroup delivery - setup a second delivery chain
// prevent delivery looping - only proceed * prevent delivery looping - only proceed
// if the message originated elsewhere and is a top-level post * if the message originated elsewhere and is a top-level post
*/
if (($item['wall']) || ($item['origin']) || ($item['id'] != $item['parent'])) { if (($item['wall']) || ($item['origin']) || ($item['id'] != $item['parent'])) {
return; return;
} }
// now change this copy of the post to a forum head message and deliver to all the tgroup members // now change this copy of the post to a forum head message and deliver to all the tgroup members
$c = q("SELECT `name`, `url`, `thumb` FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
$c = q("select name, url, thumb from contact where self = 1 and uid = %d limit 1",
intval($u[0]['uid']) intval($u[0]['uid'])
); );
if (! dbm::is_result($c)) { if (! dbm::is_result($c)) {
@ -1332,12 +1391,12 @@ function tgroup_check($uid, $item) {
$community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false); $community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
$prvgroup = (($u[0]['page-flags'] == PAGE_PRVGROUP) ? true : false); $prvgroup = (($u[0]['page-flags'] == PAGE_PRVGROUP) ? true : false);
$link = normalise_link(App::get_baseurl() . '/profile/' . $u[0]['nickname']); $link = normalise_link(App::get_baseurl() . '/profile/' . $u[0]['nickname']);
// Diaspora uses their own hardwired link URL in @-tags /*
// instead of the one we supply with webfinger * Diaspora uses their own hardwired link URL in @-tags
* instead of the one we supply with webfinger
*/
$dlink = normalise_link(App::get_baseurl() . '/u/' . $u[0]['nickname']); $dlink = normalise_link(App::get_baseurl() . '/u/' . $u[0]['nickname']);
$cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism', $item['body'], $matches,PREG_SET_ORDER); $cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism', $item['body'], $matches,PREG_SET_ORDER);
@ -1354,17 +1413,19 @@ function tgroup_check($uid, $item) {
return false; return false;
} }
/// @TODO Combines both return statements into one /// @TODO Combine both return statements into one
return (($community_page) || ($prvgroup)); return (($community_page) || ($prvgroup));
} }
/* /**
This function returns true if $update has an edited timestamp newer * This function returns true if $update has an edited timestamp newer
than $existing, i.e. $update contains new data which should override * than $existing, i.e. $update contains new data which should override
what's already there. If there is no timestamp yet, the update is * what's already there. If there is no timestamp yet, the update is
assumed to be newer. If the update has no timestamp, the existing * assumed to be newer. If the update has no timestamp, the existing
item is assumed to be up-to-date. If the timestamps are equal it * item is assumed to be up-to-date. If the timestamps are equal it
assumes the update has been seen before and should be ignored. * assumes the update has been seen before and should be ignored.
*
* @todo fix type-hints (both array)
*/ */
function edited_timestamp_is_newer ($existing, $update) { function edited_timestamp_is_newer ($existing, $update) {
if (!x($existing, 'edited') || !$existing['edited']) { if (!x($existing, 'edited') || !$existing['edited']) {
@ -1404,8 +1465,9 @@ function edited_timestamp_is_newer($existing, $update) {
* model where comments can have sub-threads. That would require some massive sorting * model where comments can have sub-threads. That would require some massive sorting
* to get all the feed items into a mostly linear ordering, and might still require * to get all the feed items into a mostly linear ordering, and might still require
* recursion. * recursion.
*
* @todo find proper type-hints
*/ */
function consume_feed($xml, $importer, &$contact, &$hub, $datedir = 0, $pass = 0) { function consume_feed($xml, $importer, &$contact, &$hub, $datedir = 0, $pass = 0) {
if ($contact['network'] === NETWORK_OSTATUS) { if ($contact['network'] === NETWORK_OSTATUS) {
if ($pass < 2) { if ($pass < 2) {
@ -1441,7 +1503,7 @@ function consume_feed($xml, $importer,&$contact, &$hub, $datedir = 0, $pass = 0)
WHERE `contact`.`id` = %d AND `user`.`uid` = %d", WHERE `contact`.`id` = %d AND `user`.`uid` = %d",
dbesc($contact["id"]), dbesc($importer["uid"]) dbesc($contact["id"]), dbesc($importer["uid"])
); );
if ($r) { if (dbm::is_result($r)) {
logger("Now import the DFRN feed"); logger("Now import the DFRN feed");
dfrn::import($xml, $r[0], true); dfrn::import($xml, $r[0], true);
return; return;
@ -1449,26 +1511,32 @@ function consume_feed($xml, $importer,&$contact, &$hub, $datedir = 0, $pass = 0)
} }
} }
/// @TODO type-hint is array
function item_is_remote_self($contact, &$datarray) { function item_is_remote_self($contact, &$datarray) {
$a = get_app(); $a = get_app();
if (!$contact['remote_self']) if (!$contact['remote_self']) {
return false; return false;
}
// Prevent the forwarding of posts that are forwarded // Prevent the forwarding of posts that are forwarded
if ($datarray["extid"] == NETWORK_DFRN) if ($datarray["extid"] == NETWORK_DFRN) {
return false; return false;
}
// Prevent to forward already forwarded posts // Prevent to forward already forwarded posts
if ($datarray["app"] == $a->get_hostname()) if ($datarray["app"] == $a->get_hostname()) {
return false; return false;
}
// Only forward posts // Only forward posts
if ($datarray["verb"] != ACTIVITY_POST) if ($datarray["verb"] != ACTIVITY_POST) {
return false; return false;
}
if (($contact['network'] != NETWORK_FEED) AND $datarray['private']) if (($contact['network'] != NETWORK_FEED) AND $datarray['private']) {
return false; return false;
}
$datarray2 = $datarray; $datarray2 = $datarray;
logger('remote-self start - Contact '.$contact['url'].' - '.$contact['remote_self'].' Item '.print_r($datarray, true), LOGGER_DEBUG); logger('remote-self start - Contact '.$contact['url'].' - '.$contact['remote_self'].' Item '.print_r($datarray, true), LOGGER_DEBUG);
@ -1495,20 +1563,23 @@ function item_is_remote_self($contact, &$datarray) {
$datarray["extid"] = $contact['network']; $datarray["extid"] = $contact['network'];
$urlpart = parse_url($datarray2['author-link']); $urlpart = parse_url($datarray2['author-link']);
$datarray["app"] = $urlpart["host"]; $datarray["app"] = $urlpart["host"];
} else } else {
$datarray['private'] = 0; $datarray['private'] = 0;
} }
}
if ($contact['network'] != NETWORK_FEED) { if ($contact['network'] != NETWORK_FEED) {
// Store the original post // Store the original post
$r = item_store($datarray2, false, false); $r = item_store($datarray2, false, false);
logger('remote-self post original item - Contact '.$contact['url'].' return '.$r.' Item '.print_r($datarray2, true), LOGGER_DEBUG); logger('remote-self post original item - Contact '.$contact['url'].' return '.$r.' Item '.print_r($datarray2, true), LOGGER_DEBUG);
} else } else {
$datarray["app"] = "Feed"; $datarray["app"] = "Feed";
}
return true; return true;
} }
/// @TODO find proper type-hints
function new_follower($importer, $contact, $datarray, $item, $sharing = false) { function new_follower($importer, $contact, $datarray, $item, $sharing = false) {
$url = notags(trim($datarray['author-link'])); $url = notags(trim($datarray['author-link']));
$name = notags(trim($datarray['author-name'])); $name = notags(trim($datarray['author-name']));
@ -1559,6 +1630,7 @@ function new_follower($importer, $contact, $datarray, $item, $sharing = false) {
update_contact_avatar($photo, $importer["uid"], $contact_record["id"], true); update_contact_avatar($photo, $importer["uid"], $contact_record["id"], true);
} }
/// @TODO Encapsulate this into a function/method
$r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
intval($importer['uid']) intval($importer['uid'])
); );
@ -1647,17 +1719,18 @@ function subscribe_to_hub($url, $importer, $contact, $hubmode = 'subscribe') {
); );
} }
// Diaspora has different message-ids in feeds than they do /*
// through the direct Diaspora protocol. If we try and use * Diaspora has different message-ids in feeds than they do
// the feed, we'll get duplicates. So don't. * through the direct Diaspora protocol. If we try and use
* the feed, we'll get duplicates. So don't.
if ((! dbm::is_result($r)) || $contact['network'] === NETWORK_DIASPORA) */
if ((! dbm::is_result($r)) || $contact['network'] === NETWORK_DIASPORA) {
return; return;
}
$push_url = get_config('system','url') . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id']; $push_url = get_config('system','url') . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id'];
// Use a single verify token, even if multiple hubs // Use a single verify token, even if multiple hubs
$verify_token = ((strlen($contact['hub-verify'])) ? $contact['hub-verify'] : random_string()); $verify_token = ((strlen($contact['hub-verify'])) ? $contact['hub-verify'] : random_string());
$params= 'hub.mode=' . $hubmode . '&hub.callback=' . urlencode($push_url) . '&hub.topic=' . urlencode($contact['poll']) . '&hub.verify=async&hub.verify_token=' . $verify_token; $params= 'hub.mode=' . $hubmode . '&hub.callback=' . urlencode($push_url) . '&hub.topic=' . urlencode($contact['poll']) . '&hub.verify=async&hub.verify_token=' . $verify_token;
@ -1681,8 +1754,9 @@ function subscribe_to_hub($url, $importer, $contact, $hubmode = 'subscribe') {
function fix_private_photos($s, $uid, $item = null, $cid = 0) { function fix_private_photos($s, $uid, $item = null, $cid = 0) {
if (get_config('system','disable_embedded')) if (get_config('system','disable_embedded')) {
return $s; return $s;
}
$a = get_app(); $a = get_app();
@ -1717,17 +1791,18 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
dbesc($i), dbesc($i),
intval($res), intval($res),
intval($uid) intval($uid)
); );
if ($r) { if (dbm::is_result($r)) {
/*
// Check to see if we should replace this photo link with an embedded image * Check to see if we should replace this photo link with an embedded image
// 1. No need to do so if the photo is public * 1. No need to do so if the photo is public
// 2. If there's a contact-id provided, see if they're in the access list * 2. If there's a contact-id provided, see if they're in the access list
// for the photo. If so, embed it. * for the photo. If so, embed it.
// 3. Otherwise, if we have an item, see if the item permissions match the photo * 3. Otherwise, if we have an item, see if the item permissions match the photo
// permissions, regardless of order but first check to see if they're an exact * permissions, regardless of order but first check to see if they're an exact
// match to save some processing overhead. * match to save some processing overhead.
*/
if (has_permissions($r[0])) { if (has_permissions($r[0])) {
if ($cid) { if ($cid) {
$recips = enumerate_permissions($r[0]); $recips = enumerate_permissions($r[0]);
@ -1735,10 +1810,11 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
$replace = true; $replace = true;
} }
} elseif ($item) { } elseif ($item) {
if (compare_permissions($item, $r[0])) if (compare_permissions($item, $r[0])) {
$replace = true; $replace = true;
} }
} }
}
if ($replace) { if ($replace) {
$data = $r[0]['data']; $data = $r[0]['data'];
$type = $r[0]['type']; $type = $r[0]['type'];
@ -1779,36 +1855,46 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
$new_body = $new_body . $orig_body; $new_body = $new_body . $orig_body;
return($new_body); return $new_body;
} }
/// @TODO type-hint is array
function has_permissions($obj) { function has_permissions($obj) {
if (($obj['allow_cid'] != '') || ($obj['allow_gid'] != '') || ($obj['deny_cid'] != '') || ($obj['deny_gid'] != '')) return (
return true; (
return false; x($obj, 'allow_cid')
) || (
x($obj, 'allow_gid')
) || (
x($obj, 'deny_cid')
) || (
x($obj, 'deny_gid')
)
);
} }
/// @TODO type-hint is array
function compare_permissions($obj1, $obj2) { function compare_permissions($obj1, $obj2) {
// first part is easy. Check that these are exactly the same. // first part is easy. Check that these are exactly the same.
if (($obj1['allow_cid'] == $obj2['allow_cid']) if (($obj1['allow_cid'] == $obj2['allow_cid'])
&& ($obj1['allow_gid'] == $obj2['allow_gid']) && ($obj1['allow_gid'] == $obj2['allow_gid'])
&& ($obj1['deny_cid'] == $obj2['deny_cid']) && ($obj1['deny_cid'] == $obj2['deny_cid'])
&& ($obj1['deny_gid'] == $obj2['deny_gid'])) && ($obj1['deny_gid'] == $obj2['deny_gid'])) {
return true; return true;
}
// This is harder. Parse all the permissions and compare the resulting set. // This is harder. Parse all the permissions and compare the resulting set.
$recipients1 = enumerate_permissions($obj1); $recipients1 = enumerate_permissions($obj1);
$recipients2 = enumerate_permissions($obj2); $recipients2 = enumerate_permissions($obj2);
sort($recipients1); sort($recipients1);
sort($recipients2); sort($recipients2);
if ($recipients1 == $recipients2)
return true; /// @TODO Comparison of arrays, maybe use array_diff_assoc() here?
return false; return ($recipients1 == $recipients2);
} }
// returns an array of contact-ids that are allowed to see this object // returns an array of contact-ids that are allowed to see this object
/// @TODO type-hint is array
function enumerate_permissions($obj) { function enumerate_permissions($obj) {
$allow_people = expand_acl($obj['allow_cid']); $allow_people = expand_acl($obj['allow_cid']);
$allow_groups = expand_groups(expand_acl($obj['allow_gid'])); $allow_groups = expand_groups(expand_acl($obj['allow_gid']));
@ -1826,40 +1912,48 @@ function item_getfeedtags($item) {
$cnt = preg_match_all('|\#\[url\=(.*?)\](.*?)\[\/url\]|', $item['tag'], $matches); $cnt = preg_match_all('|\#\[url\=(.*?)\](.*?)\[\/url\]|', $item['tag'], $matches);
if ($cnt) { if ($cnt) {
for ($x = 0; $x < $cnt; $x ++) { for ($x = 0; $x < $cnt; $x ++) {
if ($matches[1][$x]) if ($matches[1][$x]) {
$ret[$matches[2][$x]] = array('#', $matches[1][$x], $matches[2][$x]); $ret[$matches[2][$x]] = array('#', $matches[1][$x], $matches[2][$x]);
} }
} }
}
$matches = false; $matches = false;
$cnt = preg_match_all('|\@\[url\=(.*?)\](.*?)\[\/url\]|', $item['tag'], $matches); $cnt = preg_match_all('|\@\[url\=(.*?)\](.*?)\[\/url\]|', $item['tag'], $matches);
if ($cnt) { if ($cnt) {
for ($x = 0; $x < $cnt; $x ++) { for ($x = 0; $x < $cnt; $x ++) {
if ($matches[1][$x]) if ($matches[1][$x]) {
$ret[] = array('@', $matches[1][$x], $matches[2][$x]); $ret[] = array('@', $matches[1][$x], $matches[2][$x]);
} }
} }
}
return $ret; return $ret;
} }
function item_expire($uid, $days, $network = "", $force = false) { function item_expire($uid, $days, $network = "", $force = false) {
if ((! $uid) || ($days < 1)) if ((! $uid) || ($days < 1)) {
return; return;
}
// $expire_network_only = save your own wall posts /*
// and just expire conversations started by others * $expire_network_only = save your own wall posts
* and just expire conversations started by others
*/
$expire_network_only = get_pconfig($uid,'expire', 'network_only'); $expire_network_only = get_pconfig($uid,'expire', 'network_only');
$sql_extra = ((intval($expire_network_only)) ? " AND wall = 0 " : ""); $sql_extra = ((intval($expire_network_only)) ? " AND wall = 0 " : "");
if ($network != "") { if ($network != "") {
$sql_extra .= sprintf(" AND network = '%s' ", dbesc($network)); $sql_extra .= sprintf(" AND network = '%s' ", dbesc($network));
// There is an index "uid_network_received" but not "uid_network_created"
// This avoids the creation of another index just for one purpose. /*
// And it doesn't really matter wether to look at "received" or "created" * There is an index "uid_network_received" but not "uid_network_created"
* This avoids the creation of another index just for one purpose.
* And it doesn't really matter wether to look at "received" or "created"
*/
$range = "AND `received` < UTC_TIMESTAMP() - INTERVAL %d DAY "; $range = "AND `received` < UTC_TIMESTAMP() - INTERVAL %d DAY ";
} else } else {
$range = "AND `created` < UTC_TIMESTAMP() - INTERVAL %d DAY "; $range = "AND `created` < UTC_TIMESTAMP() - INTERVAL %d DAY ";
}
$r = q("SELECT `file`, `resource-id`, `starred`, `type`, `id` FROM `item` $r = q("SELECT `file`, `resource-id`, `starred`, `type`, `id` FROM `item`
WHERE `uid` = %d $range WHERE `uid` = %d $range
@ -1870,15 +1964,17 @@ function item_expire($uid, $days, $network = "", $force = false) {
intval($days) intval($days)
); );
if (! dbm::is_result($r)) if (! dbm::is_result($r)) {
return; return;
}
$expire_items = get_pconfig($uid, 'expire', 'items'); $expire_items = get_pconfig($uid, 'expire', 'items');
$expire_items = (($expire_items === false) ? 1 : intval($expire_items)); // default if not set: 1 $expire_items = (($expire_items === false) ? 1 : intval($expire_items)); // default if not set: 1
// Forcing expiring of items - but not notes and marked items // Forcing expiring of items - but not notes and marked items
if ($force) if ($force) {
$expire_items = true; $expire_items = true;
}
$expire_notes = get_pconfig($uid, 'expire', 'notes'); $expire_notes = get_pconfig($uid, 'expire', 'notes');
$expire_notes = (($expire_notes === false) ? 1 : intval($expire_notes)); // default if not set: 1 $expire_notes = (($expire_notes === false) ? 1 : intval($expire_notes)); // default if not set: 1
@ -1895,19 +1991,21 @@ function item_expire($uid, $days, $network = "", $force = false) {
// don't expire filed items // don't expire filed items
if (strpos($item['file'],'[') !== false) if (strpos($item['file'],'[') !== false) {
continue; continue;
}
// Only expire posts, not photos and photo comments // Only expire posts, not photos and photo comments
if ($expire_photos==0 && strlen($item['resource-id'])) if ($expire_photos == 0 && strlen($item['resource-id'])) {
continue; continue;
if ($expire_starred==0 && intval($item['starred'])) } elseif ($expire_starred == 0 && intval($item['starred'])) {
continue; continue;
if ($expire_notes==0 && $item['type']=='note') } elseif ($expire_notes == 0 && $item['type'] == 'note') {
continue; continue;
if ($expire_items==0 && $item['type']!='note') } elseif ($expire_items == 0 && $item['type'] != 'note') {
continue; continue;
}
drop_item($item['id'], false); drop_item($item['id'], false);
} }
@ -1916,12 +2014,13 @@ function item_expire($uid, $days, $network = "", $force = false) {
} }
/// @TODO type-hint is array
function drop_items($items) { function drop_items($items) {
$uid = 0; $uid = 0;
if (! local_user() && ! remote_user()) if (! local_user() && ! remote_user()) {
return; return;
}
if (count($items)) { if (count($items)) {
foreach ($items as $item) { foreach ($items as $item) {
@ -2036,11 +2135,12 @@ function drop_item($id, $interactive = true) {
} }
} }
// If item is a link to a photo resource, nuke all the associated photos /*
// (visitors will not have photo resources) * If item is a link to a photo resource, nuke all the associated photos
// This only applies to photos uploaded from the photos page. Photos inserted into a post do not * (visitors will not have photo resources)
// generate a resource-id and therefore aren't intimately linked to the item. * This only applies to photos uploaded from the photos page. Photos inserted into a post do not
* generate a resource-id and therefore aren't intimately linked to the item.
*/
if (strlen($item['resource-id'])) { 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']), dbesc($item['resource-id']),
@ -2050,7 +2150,6 @@ function drop_item($id, $interactive = true) {
} }
// If item is a link to an event, nuke the event record. // If item is a link to an event, nuke the event record.
if (intval($item['event-id'])) { if (intval($item['event-id'])) {
q("DELETE FROM `event` WHERE `id` = %d AND `uid` = %d", q("DELETE FROM `event` WHERE `id` = %d AND `uid` = %d",
intval($item['event-id']), intval($item['event-id']),
@ -2060,7 +2159,6 @@ function drop_item($id, $interactive = true) {
} }
// If item has attachments, drop them // If item has attachments, drop them
foreach (explode(", ", $item['attach']) as $attach) { foreach (explode(", ", $item['attach']) as $attach) {
preg_match("|attach/(\d+)|", $attach, $matches); preg_match("|attach/(\d+)|", $attach, $matches);
q("DELETE FROM `attach` WHERE `id` = %d AND `uid` = %d", q("DELETE FROM `attach` WHERE `id` = %d AND `uid` = %d",
@ -2074,7 +2172,7 @@ function drop_item($id, $interactive = true) {
// clean up item_id and sign meta-data tables // clean up item_id and sign meta-data tables
/* /*
// Old code - caused very long queries and warning entries in the mysql logfiles: /// @TODO Old code - caused very long queries and warning entries in the mysql logfiles:
$r = q("DELETE FROM item_id where iid in (select id from item where parent = %d and uid = %d)", $r = q("DELETE FROM item_id where iid in (select id from item where parent = %d and uid = %d)",
intval($item['id']), intval($item['id']),
@ -2097,9 +2195,10 @@ function drop_item($id, $interactive = true) {
$parentid = ""; $parentid = "";
foreach ($r AS $row) { foreach ($r as $row) {
if ($parentid != "") if ($parentid != "") {
$parentid .= ", "; $parentid .= ", ";
]
$parentid .= $row["id"]; $parentid .= $row["id"];
} }
@ -2228,8 +2327,10 @@ function posted_dates($uid, $wall) {
$dthen = substr($dthen, 0, 8).'01'; $dthen = substr($dthen, 0, 8).'01';
$ret = array(); $ret = array();
// Starting with the current month, get the first and last days of every /*
// month down to and including the month of the first post * Starting with the current month, get the first and last days of every
* month down to and including the month of the first post
*/
while (substr($dnow, 0, 7) >= substr($dthen, 0, 7)) { while (substr($dnow, 0, 7) >= substr($dthen, 0, 7)) {
$dstart = substr($dnow, 0, 8) . '01'; $dstart = substr($dnow, 0, 8) . '01';
$dend = substr($dnow, 0, 8) . get_dim(intval($dnow),intval(substr($dnow,5))); $dend = substr($dnow, 0, 8) . get_dim(intval($dnow),intval(substr($dnow,5)));
@ -2251,9 +2352,11 @@ function posted_date_widget($url, $uid, $wall) {
} }
// For former Facebook folks that left because of "timeline" // For former Facebook folks that left because of "timeline"
/*
/* if ($wall && intval(get_pconfig($uid,'system','no_wall_archive_widget'))) * @TODO old-lost code?
return $o;*/ if ($wall && intval(get_pconfig($uid, 'system', 'no_wall_archive_widget')))
return $o;
*/
$visible_years = get_pconfig($uid,'system','archive_visible_years'); $visible_years = get_pconfig($uid,'system','archive_visible_years');
if (! $visible_years) { if (! $visible_years) {