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 = str_replace(array("\n", "\r", "\t", " "), array("", "", "", ""), $body);
if (strlen($title) < strlen($body))
if (strlen($title) < strlen($body)) {
$body = substr($body, 0, strlen($title));
}
if (($title != $body) and (substr($title, -3) == "...")) {
$pos = strrpos($title, "...");
@ -149,7 +150,7 @@ function title_is_body($title, $body) {
}
}
return($title == $body);
return ($title == $body);
}
function add_page_info_data($data) {
@ -218,7 +219,7 @@ function add_page_info_data($data) {
/// @todo make a positive list of allowed characters
$hashtag = str_replace(array(" ", "+", "/", ".", "#", "'", "", "`", "(", ")", "", ""),
array("", "", "", "", "", "", "", "", "", "", "", ""), $keyword);
$hashtags .= "#[url=".App::get_baseurl()."/search?tag=".rawurlencode($hashtag)."]".$hashtag."[/url] ";
$hashtags .= "#[url=" . App::get_baseurl() . "/search?tag=" . rawurlencode($hashtag) . "]" . $hashtag . "[/url] ";
}
}
@ -233,7 +234,7 @@ function query_page_info($url, $no_photos = false, $photo = "", $keywords = fals
$data["images"][0]["src"] = $photo;
}
logger('fetch page info for '.$url.' '.print_r($data, true), LOGGER_DEBUG);
logger('fetch page info for ' . $url . ' ' . print_r($data, true), LOGGER_DEBUG);
if (!$keywords AND isset($data["keywords"])) {
unset($data["keywords"]);
@ -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 = "") {
@ -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 = "") {
@ -278,52 +279,58 @@ function add_page_info($url, $no_photos = false, $photo = "", $keywords = false,
$text = add_page_info_data($data);
return($text);
return $text;
}
function add_page_info_to_body($body, $texturl = false, $no_photos = false) {
logger('add_page_info_to_body: fetch page info for body '.$body, LOGGER_DEBUG);
logger('add_page_info_to_body: fetch page info for body ' . $body, LOGGER_DEBUG);
$URLSearchString = "^\[\]";
// Fix for Mastodon where the mentions are in a different format
$body = preg_replace("/\[url\=([$URLSearchString]*)\]([#!@])(.*?)\[\/url\]/ism",
'$2[url=$1]$3[/url]', $body);
'$2[url=$1]$3[/url]', $body);
// 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)
preg_match("/[^!#@]\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", " ".$body, $matches);
if (!$matches) {
preg_match("/[^!#@]\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", " " . $body, $matches);
}
// Convert urls without bbcode elements
if (!$matches AND $texturl) {
preg_match("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", " ".$body, $matches);
// Yeah, a hack. I really hate regular expressions :)
if ($matches)
if ($matches) {
$matches[1] = $matches[2];
}
}
if ($matches)
if ($matches) {
$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
if (isset($footer) AND (trim($footer) != "") AND (strpos($footer, $matches[1]))) {
$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))
$removedlink = preg_replace("/\[url\=" . $url . "\](.*?)\[\/url\]/ism", '', $body);
if (($removedlink == "") OR strstr($body, $removedlink)) {
$body = $removedlink;
}
}
// Add the page information to the bottom
if (isset($footer) AND (trim($footer) != ""))
if (isset($footer) AND (trim($footer) != "")) {
$body .= $footer;
}
return $body;
}
@ -337,12 +344,13 @@ function add_page_info_to_body($body, $texturl = false, $no_photos = false) {
*/
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 (strstr($arr['postopts'], 'lang=') )
{
if (x($arr, 'postopts') ) {
if (strstr($arr['postopts'], 'lang=') ) {
// do not override
/// @TODO Add parameter to request overriding
return;
@ -353,8 +361,9 @@ function item_add_language_opt(&$arr) {
}
require_once('library/langdet/Text/LanguageDetect.php');
$naked_body = preg_replace('/\[(.+?)\]/','', $arr['body']);
$l = new Text_LanguageDetect;
$l = new Text_LanguageDetect();
//$lng = $l->detectConfidence($naked_body);
//$arr['postopts'] = (($lng['language']) ? 'lang=' . $lng['language'] . ';' . $lng['confidence'] : '');
$lng = $l->detect($naked_body, 3);
@ -364,7 +373,7 @@ function item_add_language_opt(&$arr) {
$postopts .= 'lang=';
$sep = "";
foreach ($lng as $language => $score) {
$postopts .= $sep . $language.";".$score;
$postopts .= $sep . $language . ";" . $score;
$sep = ':';
}
$arr['postopts'] = $postopts;
@ -401,6 +410,8 @@ function uri_to_guid($uri, $host = "") {
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) {
$a = get_app();
@ -425,11 +436,13 @@ 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;
if (x($arr,'dsprsig')) {
if (x($arr, 'dsprsig')) {
$encoded_signature = $arr['dsprsig'];
$dsprsig = json_decode(base64_decode($arr['dsprsig']));
unset($arr['dsprsig']);
@ -437,27 +450,28 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
// Converting the plink
if ($arr['network'] == NETWORK_OSTATUS) {
if (isset($arr['plink']))
if (isset($arr['plink'])) {
$arr['plink'] = ostatus::convert_href($arr['plink']);
elseif (isset($arr['uri']))
} elseif (isset($arr['uri'])) {
$arr['plink'] = ostatus::convert_href($arr['uri']);
}
}
if (x($arr, 'gravity'))
if (x($arr, 'gravity')) {
$arr['gravity'] = intval($arr['gravity']);
elseif ($arr['parent-uri'] === $arr['uri'])
} elseif ($arr['parent-uri'] === $arr['uri']) {
$arr['gravity'] = 0;
elseif (activity_match($arr['verb'],ACTIVITY_POST))
} elseif (activity_match($arr['verb'],ACTIVITY_POST)) {
$arr['gravity'] = 6;
else
} else {
$arr['gravity'] = 6; // extensible catchall
}
if (! x($arr,'type'))
if (! x($arr, 'type')) {
$arr['type'] = 'remote';
}
/* check for create date and expire time */
// check for create date and expire time
$uid = intval($arr['uid']);
$r = q("SELECT expire FROM user WHERE uid = %d", intval($uid));
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, ""))) {
$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'])),
@ -482,14 +499,17 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
dbesc(NETWORK_DFRN),
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
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']);
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.
// 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))
@ -497,76 +517,79 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
item_add_language_opt($arr);
if ($notify)
if ($notify) {
$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']);
elseif ((trim($arr['guid']) == "") AND (trim($arr['uri']) != ""))
} elseif ((trim($arr['guid']) == "") AND (trim($arr['uri']) != "")) {
$arr['guid'] = uri_to_guid($arr['uri']);
else {
} else {
$parsed = parse_url($arr["author-link"]);
$guid_prefix = hash("crc32", $parsed["host"]);
}
$arr['wall'] = ((x($arr,'wall')) ? intval($arr['wall']) : 0);
$arr['guid'] = ((x($arr,'guid')) ? notags(trim($arr['guid'])) : get_guid(32, $guid_prefix));
$arr['uri'] = ((x($arr,'uri')) ? notags(trim($arr['uri'])) : item_new_uri($a->get_hostname(), $uid, $arr['guid']));
$arr['extid'] = ((x($arr,'extid')) ? notags(trim($arr['extid'])) : '');
$arr['author-name'] = ((x($arr,'author-name')) ? trim($arr['author-name']) : '');
$arr['author-link'] = ((x($arr,'author-link')) ? notags(trim($arr['author-link'])) : '');
$arr['author-avatar'] = ((x($arr,'author-avatar')) ? notags(trim($arr['author-avatar'])) : '');
$arr['owner-name'] = ((x($arr,'owner-name')) ? trim($arr['owner-name']) : '');
$arr['owner-link'] = ((x($arr,'owner-link')) ? notags(trim($arr['owner-link'])) : '');
$arr['owner-avatar'] = ((x($arr,'owner-avatar')) ? notags(trim($arr['owner-avatar'])) : '');
$arr['created'] = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC', $arr['created']) : datetime_convert());
$arr['edited'] = ((x($arr,'edited') !== false) ? datetime_convert('UTC','UTC', $arr['edited']) : datetime_convert());
$arr['commented'] = ((x($arr,'commented') !== false) ? datetime_convert('UTC','UTC', $arr['commented']) : datetime_convert());
$arr['received'] = ((x($arr,'received') !== false) ? datetime_convert('UTC','UTC', $arr['received']) : datetime_convert());
$arr['changed'] = ((x($arr,'changed') !== false) ? datetime_convert('UTC','UTC', $arr['changed']) : datetime_convert());
$arr['title'] = ((x($arr,'title')) ? trim($arr['title']) : '');
$arr['location'] = ((x($arr,'location')) ? trim($arr['location']) : '');
$arr['coord'] = ((x($arr,'coord')) ? notags(trim($arr['coord'])) : '');
$arr['last-child'] = ((x($arr,'last-child')) ? intval($arr['last-child']) : 0 );
$arr['visible'] = ((x($arr,'visible') !== false) ? intval($arr['visible']) : 1 );
$arr['wall'] = ((x($arr, 'wall')) ? intval($arr['wall']) : 0);
$arr['guid'] = ((x($arr, 'guid')) ? notags(trim($arr['guid'])) : get_guid(32, $guid_prefix));
$arr['uri'] = ((x($arr, 'uri')) ? notags(trim($arr['uri'])) : item_new_uri($a->get_hostname(), $uid, $arr['guid']));
$arr['extid'] = ((x($arr, 'extid')) ? notags(trim($arr['extid'])) : '');
$arr['author-name'] = ((x($arr, 'author-name')) ? trim($arr['author-name']) : '');
$arr['author-link'] = ((x($arr, 'author-link')) ? notags(trim($arr['author-link'])) : '');
$arr['author-avatar'] = ((x($arr, 'author-avatar')) ? notags(trim($arr['author-avatar'])) : '');
$arr['owner-name'] = ((x($arr, 'owner-name')) ? trim($arr['owner-name']) : '');
$arr['owner-link'] = ((x($arr, 'owner-link')) ? notags(trim($arr['owner-link'])) : '');
$arr['owner-avatar'] = ((x($arr, 'owner-avatar')) ? notags(trim($arr['owner-avatar'])) : '');
$arr['created'] = ((x($arr, 'created') !== false) ? datetime_convert('UTC','UTC', $arr['created']) : datetime_convert());
$arr['edited'] = ((x($arr, 'edited') !== false) ? datetime_convert('UTC','UTC', $arr['edited']) : datetime_convert());
$arr['commented'] = ((x($arr, 'commented') !== false) ? datetime_convert('UTC','UTC', $arr['commented']) : datetime_convert());
$arr['received'] = ((x($arr, 'received') !== false) ? datetime_convert('UTC','UTC', $arr['received']) : datetime_convert());
$arr['changed'] = ((x($arr, 'changed') !== false) ? datetime_convert('UTC','UTC', $arr['changed']) : datetime_convert());
$arr['title'] = ((x($arr, 'title')) ? trim($arr['title']) : '');
$arr['location'] = ((x($arr, 'location')) ? trim($arr['location']) : '');
$arr['coord'] = ((x($arr, 'coord')) ? notags(trim($arr['coord'])) : '');
$arr['last-child'] = ((x($arr, 'last-child')) ? intval($arr['last-child']) : 0 );
$arr['visible'] = ((x($arr, 'visible') !== false) ? intval($arr['visible']) : 1 );
$arr['deleted'] = 0;
$arr['parent-uri'] = ((x($arr,'parent-uri')) ? notags(trim($arr['parent-uri'])) : $arr['uri']);
$arr['verb'] = ((x($arr,'verb')) ? notags(trim($arr['verb'])) : '');
$arr['object-type'] = ((x($arr,'object-type')) ? notags(trim($arr['object-type'])) : '');
$arr['object'] = ((x($arr,'object')) ? trim($arr['object']) : '');
$arr['target-type'] = ((x($arr,'target-type')) ? notags(trim($arr['target-type'])) : '');
$arr['target'] = ((x($arr,'target')) ? trim($arr['target']) : '');
$arr['plink'] = ((x($arr,'plink')) ? notags(trim($arr['plink'])) : '');
$arr['allow_cid'] = ((x($arr,'allow_cid')) ? trim($arr['allow_cid']) : '');
$arr['allow_gid'] = ((x($arr,'allow_gid')) ? trim($arr['allow_gid']) : '');
$arr['deny_cid'] = ((x($arr,'deny_cid')) ? trim($arr['deny_cid']) : '');
$arr['deny_gid'] = ((x($arr,'deny_gid')) ? trim($arr['deny_gid']) : '');
$arr['private'] = ((x($arr,'private')) ? intval($arr['private']) : 0 );
$arr['bookmark'] = ((x($arr,'bookmark')) ? intval($arr['bookmark']) : 0 );
$arr['body'] = ((x($arr,'body')) ? trim($arr['body']) : '');
$arr['tag'] = ((x($arr,'tag')) ? notags(trim($arr['tag'])) : '');
$arr['attach'] = ((x($arr,'attach')) ? notags(trim($arr['attach'])) : '');
$arr['app'] = ((x($arr,'app')) ? notags(trim($arr['app'])) : '');
$arr['origin'] = ((x($arr,'origin')) ? intval($arr['origin']) : 0 );
$arr['network'] = ((x($arr,'network')) ? trim($arr['network']) : '');
$arr['postopts'] = ((x($arr,'postopts')) ? trim($arr['postopts']) : '');
$arr['resource-id'] = ((x($arr,'resource-id')) ? trim($arr['resource-id']) : '');
$arr['event-id'] = ((x($arr,'event-id')) ? intval($arr['event-id']) : 0 );
$arr['inform'] = ((x($arr,'inform')) ? trim($arr['inform']) : '');
$arr['file'] = ((x($arr,'file')) ? trim($arr['file']) : '');
$arr['parent-uri'] = ((x($arr, 'parent-uri')) ? notags(trim($arr['parent-uri'])) : $arr['uri']);
$arr['verb'] = ((x($arr, 'verb')) ? notags(trim($arr['verb'])) : '');
$arr['object-type'] = ((x($arr, 'object-type')) ? notags(trim($arr['object-type'])) : '');
$arr['object'] = ((x($arr, 'object')) ? trim($arr['object']) : '');
$arr['target-type'] = ((x($arr, 'target-type')) ? notags(trim($arr['target-type'])) : '');
$arr['target'] = ((x($arr, 'target')) ? trim($arr['target']) : '');
$arr['plink'] = ((x($arr, 'plink')) ? notags(trim($arr['plink'])) : '');
$arr['allow_cid'] = ((x($arr, 'allow_cid')) ? trim($arr['allow_cid']) : '');
$arr['allow_gid'] = ((x($arr, 'allow_gid')) ? trim($arr['allow_gid']) : '');
$arr['deny_cid'] = ((x($arr, 'deny_cid')) ? trim($arr['deny_cid']) : '');
$arr['deny_gid'] = ((x($arr, 'deny_gid')) ? trim($arr['deny_gid']) : '');
$arr['private'] = ((x($arr, 'private')) ? intval($arr['private']) : 0 );
$arr['bookmark'] = ((x($arr, 'bookmark')) ? intval($arr['bookmark']) : 0 );
$arr['body'] = ((x($arr, 'body')) ? trim($arr['body']) : '');
$arr['tag'] = ((x($arr, 'tag')) ? notags(trim($arr['tag'])) : '');
$arr['attach'] = ((x($arr, 'attach')) ? notags(trim($arr['attach'])) : '');
$arr['app'] = ((x($arr, 'app')) ? notags(trim($arr['app'])) : '');
$arr['origin'] = ((x($arr, 'origin')) ? intval($arr['origin']) : 0 );
$arr['network'] = ((x($arr, 'network')) ? trim($arr['network']) : '');
$arr['postopts'] = ((x($arr, 'postopts')) ? trim($arr['postopts']) : '');
$arr['resource-id'] = ((x($arr, 'resource-id')) ? trim($arr['resource-id']) : '');
$arr['event-id'] = ((x($arr, 'event-id')) ? intval($arr['event-id']) : 0 );
$arr['inform'] = ((x($arr, 'inform')) ? trim($arr['inform']) : '');
$arr['file'] = ((x($arr, 'file')) ? trim($arr['file']) : '');
// Items cannot be stored before they happen ...
if ($arr['created'] > datetime_convert())
if ($arr['created'] > datetime_convert()) {
$arr['created'] = datetime_convert();
}
// We haven't invented time travel by now.
if ($arr['edited'] > datetime_convert())
if ($arr['edited'] > datetime_convert()) {
$arr['edited'] = datetime_convert();
}
if (($arr['author-link'] == "") AND ($arr['owner-link'] == ""))
logger("Both author-link and owner-link are empty. Called by: ".App::callstack(), LOGGER_DEBUG);
if (($arr['author-link'] == "") AND ($arr['owner-link'] == "")) {
logger("Both author-link and owner-link are empty. Called by: " . App::callstack(), LOGGER_DEBUG);
}
if ($arr['plink'] == "") {
$arr['plink'] = App::get_baseurl().'/display/'.urlencode($arr['guid']);
$arr['plink'] = App::get_baseurl() . '/display/' . urlencode($arr['guid']);
}
if ($arr['network'] == "") {
@ -582,59 +605,74 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
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",
intval($arr['contact-id']),
intval($arr['uid'])
);
}
if (dbm::is_result($r))
if (dbm::is_result($r)) {
$arr['network'] = $r[0]["network"];
}
// Fallback to friendica (why is it empty in some cases?)
if ($arr['network'] == "")
if ($arr['network'] == "") {
$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
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")
if ($arr['parent-uri'] != $arr['uri'])
/*
* 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")
*/
if ($arr['parent-uri'] != $arr['uri']) {
$arr["contact-id"] = get_contact($arr['author-link'], $uid);
}
// 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);
}
// Still missing? Then use the "self" contact of the current user
if ($arr["contact-id"] == 0) {
$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"];
}
}
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) {
// 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.
// On comments the author is the better choice.
if ($arr['parent-uri'] === $arr['uri'])
/*
* 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.
* 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'],
"photo" => $arr['owner-avatar'], "name" => $arr['owner-name']));
else
} else {
$arr["gcontact-id"] = get_gcontact_id(array("url" => $arr['author-link'], "network" => $arr['network'],
"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);
}
if ($arr["owner-id"] == 0)
if ($arr["owner-id"] == 0) {
$arr["owner-id"] = get_contact($arr["owner-link"], 0);
}
if ($arr['guid'] != "") {
// Checking if there is already an item with the same guid
@ -684,8 +722,10 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
dbesc($r[0]['parent-uri']),
intval($arr['uid'])
);
if ($z && count($z))
if (dbm::is_result($z)) {
$r = $z;
}
}
$parent_id = $r[0]['id'];
@ -697,20 +737,23 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
$arr['wall'] = $r[0]['wall'];
$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
// email correspondents to be private even if the overall thread is not.
if ($r[0]['private'])
/*
* If the parent is private, force privacy for the entire conversation
* 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']) {
$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
// 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']))
/*
* 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
* 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'])) {
$arr['private'] = 0;
}
// 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);
@ -725,10 +768,10 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
}
}
} else {
// Allow one to see reply tweets from status.net even when
// we don't have or can't see the original post.
/*
* Allow one to see reply tweets from status.net even when
* we don't have or can't see the original post.
*/
if ($force_parent) {
logger('item_store: $force_parent=true, reply converted to top-level post.');
$parent_id = 0;
@ -788,14 +831,15 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
} else {
$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
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;
else
} else {
$private = $arr['private'];
}
$arr["allow_cid"] = $allow_cid;
$arr["allow_gid"] = $allow_gid;
@ -807,19 +851,22 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
// Fill the cache field
put_item_in_cache($arr);
if ($notify)
if ($notify) {
call_hooks('post_local', $arr);
else
} else {
call_hooks('post_remote', $arr);
}
if (x($arr,'cancel')) {
if (x($arr, 'cancel')) {
logger('item_store: post cancelled by plugin.');
return 0;
}
// Check for already added items.
// 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.
/*
* Check for already added items.
* 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) {
$r = qu("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = 0 LIMIT 1", dbesc(trim($arr['uri'])));
if (dbm::is_result($r)) {
@ -904,7 +951,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
if ($r[0]["entries"] > 1) {
// There are duplicates. We delete our just created entry.
logger('Duplicated post occurred. uri = '.$arr['uri'].' uid = '.$arr['uid']);
logger('Duplicated post occurred. uri = ' . $arr['uri'] . ' uid = ' . $arr['uid']);
// Yes, we could do a rollback here - but we are having many users with MyISAM.
q("DELETE FROM `item` WHERE `id` = %d", intval($current_post));
@ -920,8 +967,9 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
logger('item_store: created item '.$current_post);
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;
}
// Set parent id
$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
// 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",
dbesc(datetime_convert()),
dbesc(datetime_convert()),
intval($parent_id)
);
else
} else {
q("UPDATE `item` SET `changed` = '%s' WHERE `id` = %d",
dbesc(datetime_convert()),
intval($parent_id)
);
}
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)) {
$dsprsig->signature = base64_decode($dsprsig->signature);
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),
dbesc($dsprsig->signed_text),
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);
// 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) {
$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");
// 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_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']) {
$r = q("UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d AND `id` != %d",
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"])) {
$isforum = q("SELECT `forum` FROM `contact` WHERE `id` = %d AND `forum`",
intval($arr['contact-id']));
if ($isforum) {
if (dbm::is_result($isforum)) {
$update = true;
}
}
@ -1071,8 +1128,9 @@ function item_body_set_hashtags(&$item) {
$tags = get_tags($item["body"]);
// No hashtags?
if (!count($tags))
return(false);
if (!count($tags)) {
return false;
}
// 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
@ -1082,6 +1140,7 @@ function item_body_set_hashtags(&$item) {
$URLSearchString = "^\[\]";
/// @TODO old-lost code?
// All hashtags should point to the home server
//$item["body"] = preg_replace("/#\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
// "#[url=".App::get_baseurl()."/search?tag=$2]$2[/url]", $item["body"]);
@ -1092,40 +1151,38 @@ function item_body_set_hashtags(&$item) {
// mask hashtags inside of url, bookmarks and attachments to avoid urls in urls
$item["body"] = preg_replace_callback("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
function ($match) {
return("[url=".str_replace("#", "&num;", $match[1])."]".str_replace("#", "&num;", $match[2])."[/url]");
return ("[url=" . str_replace("#", "&num;", $match[1]) . "]" . str_replace("#", "&num;", $match[2]) . "[/url]");
}, $item["body"]);
$item["body"] = preg_replace_callback("/\[bookmark\=([$URLSearchString]*)\](.*?)\[\/bookmark\]/ism",
function ($match) {
return("[bookmark=".str_replace("#", "&num;", $match[1])."]".str_replace("#", "&num;", $match[2])."[/bookmark]");
return ("[bookmark=" . str_replace("#", "&num;", $match[1]) . "]" . str_replace("#", "&num;", $match[2]) . "[/bookmark]");
}, $item["body"]);
$item["body"] = preg_replace_callback("/\[attachment (.*)\](.*?)\[\/attachment\]/ism",
function ($match) {
return("[attachment ".str_replace("#", "&num;", $match[1])."]".$match[2]."[/attachment]");
return ("[attachment " . str_replace("#", "&num;", $match[1]) . "]" . $match[2] . "[/attachment]");
}, $item["body"]);
// Repair recursive urls
$item["body"] = preg_replace("/&num;\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
"&num;$2", $item["body"]);
foreach($tags as $tag) {
if (strpos($tag,'#') !== 0)
continue;
if (strpos($tag,'[url='))
foreach ($tags as $tag) {
if ((strpos($tag, '#') !== 0) || (strpos($tag, '[url=')) {
continue;
}
$basetag = str_replace('_',' ',substr($tag,1));
$newtag = '#[url='.App::get_baseurl().'/search?tag='.rawurlencode($basetag).']'.$basetag.'[/url]';
$newtag = '#[url=' . App::get_baseurl() . '/search?tag=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
$item["body"] = str_replace($tag, $newtag, $item["body"]);
if (!stristr($item["tag"], "/search?tag=".$basetag."]".$basetag."[/url]")) {
if (strlen($item["tag"]))
if (!stristr($item["tag"], "/search?tag=" . $basetag . "]" . $basetag . "[/url]")) {
if (strlen($item["tag"])) {
$item["tag"] = ','.$item["tag"];
}
$item["tag"] = $newtag.$item["tag"];
}
}
@ -1136,10 +1193,12 @@ function item_body_set_hashtags(&$item) {
function get_item_guid($id) {
$r = q("SELECT `guid` FROM `item` WHERE `id` = %d LIMIT 1", intval($id));
if (dbm::is_result($r))
return($r[0]["guid"]);
else
return("");
if (dbm::is_result($r)) {
return $r[0]["guid"];
} else {
/// @TODO This else-block can be elimited again
return "";
}
}
function get_item_id($guid, $uid = 0) {
@ -1147,8 +1206,9 @@ function get_item_id($guid, $uid = 0) {
$nick = "";
$id = 0;
if ($uid == 0)
if ($uid == 0) {
$uid == local_user();
}
// Does the given user have this item?
if ($uid) {
@ -1174,14 +1234,15 @@ function get_item_id($guid, $uid = 0) {
$nick = $r[0]["nickname"];
}
}
return(array("nick" => $nick, "id" => $id));
return array("nick" => $nick, "id" => $id);
}
// return - test
function get_item_contact($item, $contacts) {
if (! count($contacts) || (! is_array($item)))
if (! count($contacts) || (! is_array($item))) {
return false;
foreach($contacts as $contact) {
}
foreach ($contacts as $contact) {
if ($contact['id'] == $item['contact-id']) {
return $contact;
break; // NOTREACHED
@ -1198,8 +1259,6 @@ function get_item_contact($item, $contacts) {
*/
function tag_deliver($uid, $item_id) {
//
$a = get_app();
$mention = false;
@ -1228,14 +1287,15 @@ function tag_deliver($uid, $item_id) {
$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']);
$cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism', $item['body'], $matches,PREG_SET_ORDER);
if ($cnt) {
foreach($matches as $mtch) {
foreach ($matches as $mtch) {
if (link_compare($link, $mtch[1]) || link_compare($dlink, $mtch[1])) {
$mention = true;
logger('tag_deliver: mention found: ' . $mtch[2]);
@ -1262,22 +1322,21 @@ function tag_deliver($uid, $item_id) {
call_hooks('tagged', $arr);
if ((! $community_page) && (! $prvgroup))
if ((! $community_page) && (! $prvgroup)) {
return;
}
// tgroup delivery - setup a second delivery chain
// prevent delivery looping - only proceed
// if the message originated elsewhere and is a top-level post
/*
* tgroup delivery - setup a second delivery chain
* prevent delivery looping - only proceed
* if the message originated elsewhere and is a top-level post
*/
if (($item['wall']) || ($item['origin']) || ($item['id'] != $item['parent'])) {
return;
}
// 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'])
);
if (! dbm::is_result($c)) {
@ -1332,12 +1391,12 @@ function tgroup_check($uid, $item) {
$community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
$prvgroup = (($u[0]['page-flags'] == PAGE_PRVGROUP) ? true : false);
$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']);
$cnt = preg_match_all('/[\@\!]\[url\=(.*?)\](.*?)\[\/url\]/ism', $item['body'], $matches,PREG_SET_ORDER);
@ -1354,23 +1413,25 @@ function tgroup_check($uid, $item) {
return false;
}
/// @TODO Combines both return statements into one
/// @TODO Combine both return statements into one
return (($community_page) || ($prvgroup));
}
/*
This function returns true if $update has an edited timestamp newer
than $existing, i.e. $update contains new data which should override
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
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.
*/
function edited_timestamp_is_newer($existing, $update) {
if (!x($existing,'edited') || !$existing['edited']) {
/**
* This function returns true if $update has an edited timestamp newer
* than $existing, i.e. $update contains new data which should override
* 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
* 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.
*
* @todo fix type-hints (both array)
*/
function edited_timestamp_is_newer ($existing, $update) {
if (!x($existing, 'edited') || !$existing['edited']) {
return true;
}
if (!x($update,'edited') || !$update['edited']) {
if (!x($update, 'edited') || !$update['edited']) {
return false;
}
@ -1404,9 +1465,10 @@ function edited_timestamp_is_newer($existing, $update) {
* 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
* 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 ($pass < 2) {
// Test - remove before flight
@ -1429,7 +1491,7 @@ function consume_feed($xml, $importer,&$contact, &$hub, $datedir = 0, $pass = 0)
if ($contact['network'] === NETWORK_DFRN) {
logger("Consume DFRN messages", LOGGER_DEBUG);
$r = q("SELECT `contact`.*, `contact`.`uid` AS `importer_uid`,
$r = q("SELECT `contact`.*, `contact`.`uid` AS `importer_uid`,
`contact`.`pubkey` AS `cpubkey`,
`contact`.`prvkey` AS `cprvkey`,
`contact`.`thumb` AS `thumb`,
@ -1441,7 +1503,7 @@ function consume_feed($xml, $importer,&$contact, &$hub, $datedir = 0, $pass = 0)
WHERE `contact`.`id` = %d AND `user`.`uid` = %d",
dbesc($contact["id"]), dbesc($importer["uid"])
);
if ($r) {
if (dbm::is_result($r)) {
logger("Now import the DFRN feed");
dfrn::import($xml, $r[0], true);
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) {
$a = get_app();
if (!$contact['remote_self'])
if (!$contact['remote_self']) {
return false;
}
// Prevent the forwarding of posts that are forwarded
if ($datarray["extid"] == NETWORK_DFRN)
if ($datarray["extid"] == NETWORK_DFRN) {
return false;
}
// Prevent to forward already forwarded posts
if ($datarray["app"] == $a->get_hostname())
if ($datarray["app"] == $a->get_hostname()) {
return false;
}
// Only forward posts
if ($datarray["verb"] != ACTIVITY_POST)
if ($datarray["verb"] != ACTIVITY_POST) {
return false;
}
if (($contact['network'] != NETWORK_FEED) AND $datarray['private'])
if (($contact['network'] != NETWORK_FEED) AND $datarray['private']) {
return false;
}
$datarray2 = $datarray;
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'];
$urlpart = parse_url($datarray2['author-link']);
$datarray["app"] = $urlpart["host"];
} else
} else {
$datarray['private'] = 0;
}
}
if ($contact['network'] != NETWORK_FEED) {
// Store the original post
$r = item_store($datarray2, false, false);
logger('remote-self post original item - Contact '.$contact['url'].' return '.$r.' Item '.print_r($datarray2, true), LOGGER_DEBUG);
} else
} else {
$datarray["app"] = "Feed";
}
return true;
}
/// @TODO find proper type-hints
function new_follower($importer, $contact, $datarray, $item, $sharing = false) {
$url = notags(trim($datarray['author-link']));
$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);
}
/// @TODO Encapsulate this into a function/method
$r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
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
// the feed, we'll get duplicates. So don't.
if ((! dbm::is_result($r)) || $contact['network'] === NETWORK_DIASPORA)
/*
* Diaspora has different message-ids in feeds than they do
* 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) {
return;
}
$push_url = get_config('system','url') . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id'];
// Use a single verify token, even if multiple hubs
$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;
@ -1681,8 +1754,9 @@ function subscribe_to_hub($url, $importer, $contact, $hubmode = 'subscribe') {
function fix_private_photos($s, $uid, $item = null, $cid = 0) {
if (get_config('system','disable_embedded'))
if (get_config('system','disable_embedded')) {
return $s;
}
$a = get_app();
@ -1707,8 +1781,8 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
// Only embed locally hosted photos
$replace = false;
$i = basename($image);
$i = str_replace(array('.jpg','.png','.gif'),array('', '',''), $i);
$x = strpos($i,'-');
$i = str_replace(array('.jpg', '.png', '.gif'),array('', '',''), $i);
$x = strpos($i, '-');
if ($x) {
$res = substr($i, $x+1);
@ -1717,17 +1791,18 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
dbesc($i),
intval($res),
intval($uid)
);
if ($r) {
// 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
// 2. If there's a contact-id provided, see if they're in the access list
// for the photo. If so, embed it.
// 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
// match to save some processing overhead.
if (dbm::is_result($r)) {
/*
* 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
* 2. If there's a contact-id provided, see if they're in the access list
* for the photo. If so, embed it.
* 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
* match to save some processing overhead.
*/
if (has_permissions($r[0])) {
if ($cid) {
$recips = enumerate_permissions($r[0]);
@ -1735,8 +1810,9 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
$replace = true;
}
} elseif ($item) {
if (compare_permissions($item, $r[0]))
if (compare_permissions($item, $r[0])) {
$replace = true;
}
}
}
if ($replace) {
@ -1779,36 +1855,46 @@ function fix_private_photos($s, $uid, $item = null, $cid = 0) {
$new_body = $new_body . $orig_body;
return($new_body);
return $new_body;
}
/// @TODO type-hint is array
function has_permissions($obj) {
if (($obj['allow_cid'] != '') || ($obj['allow_gid'] != '') || ($obj['deny_cid'] != '') || ($obj['deny_gid'] != ''))
return true;
return false;
return (
(
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) {
// first part is easy. Check that these are exactly the same.
if (($obj1['allow_cid'] == $obj2['allow_cid'])
&& ($obj1['allow_gid'] == $obj2['allow_gid'])
&& ($obj1['deny_cid'] == $obj2['deny_cid'])
&& ($obj1['deny_gid'] == $obj2['deny_gid']))
&& ($obj1['deny_gid'] == $obj2['deny_gid'])) {
return true;
}
// This is harder. Parse all the permissions and compare the resulting set.
$recipients1 = enumerate_permissions($obj1);
$recipients2 = enumerate_permissions($obj2);
sort($recipients1);
sort($recipients2);
if ($recipients1 == $recipients2)
return true;
return false;
/// @TODO Comparison of arrays, maybe use array_diff_assoc() here?
return ($recipients1 == $recipients2);
}
// returns an array of contact-ids that are allowed to see this object
/// @TODO type-hint is array
function enumerate_permissions($obj) {
$allow_people = expand_acl($obj['allow_cid']);
$allow_groups = expand_groups(expand_acl($obj['allow_gid']));
@ -1825,17 +1911,19 @@ function item_getfeedtags($item) {
$matches = false;
$cnt = preg_match_all('|\#\[url\=(.*?)\](.*?)\[\/url\]|', $item['tag'], $matches);
if ($cnt) {
for($x = 0; $x < $cnt; $x ++) {
if ($matches[1][$x])
for ($x = 0; $x < $cnt; $x ++) {
if ($matches[1][$x]) {
$ret[$matches[2][$x]] = array('#', $matches[1][$x], $matches[2][$x]);
}
}
}
$matches = false;
$cnt = preg_match_all('|\@\[url\=(.*?)\](.*?)\[\/url\]|', $item['tag'], $matches);
if ($cnt) {
for($x = 0; $x < $cnt; $x ++) {
if ($matches[1][$x])
for ($x = 0; $x < $cnt; $x ++) {
if ($matches[1][$x]) {
$ret[] = array('@', $matches[1][$x], $matches[2][$x]);
}
}
}
return $ret;
@ -1843,23 +1931,29 @@ function item_getfeedtags($item) {
function item_expire($uid, $days, $network = "", $force = false) {
if ((! $uid) || ($days < 1))
if ((! $uid) || ($days < 1)) {
return;
}
// $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 = save your own wall posts
* and just expire conversations started by others
*/
$expire_network_only = get_pconfig($uid,'expire', 'network_only');
$sql_extra = ((intval($expire_network_only)) ? " AND wall = 0 " : "");
if ($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 ";
} else
} else {
$range = "AND `created` < UTC_TIMESTAMP() - INTERVAL %d DAY ";
}
$r = q("SELECT `file`, `resource-id`, `starred`, `type`, `id` FROM `item`
WHERE `uid` = %d $range
@ -1870,61 +1964,66 @@ function item_expire($uid, $days, $network = "", $force = false) {
intval($days)
);
if (! dbm::is_result($r))
if (! dbm::is_result($r)) {
return;
}
$expire_items = get_pconfig($uid, 'expire','items');
$expire_items = (($expire_items===false)?1:intval($expire_items)); // default if not set: 1
$expire_items = get_pconfig($uid, 'expire', 'items');
$expire_items = (($expire_items === false) ? 1 : intval($expire_items)); // default if not set: 1
// Forcing expiring of items - but not notes and marked items
if ($force)
if ($force) {
$expire_items = true;
}
$expire_notes = get_pconfig($uid, 'expire','notes');
$expire_notes = (($expire_notes===false)?1:intval($expire_notes)); // default if not set: 1
$expire_notes = get_pconfig($uid, 'expire', 'notes');
$expire_notes = (($expire_notes === false) ? 1 : intval($expire_notes)); // default if not set: 1
$expire_starred = get_pconfig($uid, 'expire','starred');
$expire_starred = (($expire_starred===false)?1:intval($expire_starred)); // default if not set: 1
$expire_starred = get_pconfig($uid, 'expire', 'starred');
$expire_starred = (($expire_starred === false) ? 1 : intval($expire_starred)); // default if not set: 1
$expire_photos = get_pconfig($uid, 'expire','photos');
$expire_photos = (($expire_photos===false)?0:intval($expire_photos)); // default if not set: 0
$expire_photos = get_pconfig($uid, 'expire', 'photos');
$expire_photos = (($expire_photos === false) ? 0 : intval($expire_photos)); // default if not set: 0
logger('expire: # items=' . count($r). "; expire items: $expire_items, expire notes: $expire_notes, expire starred: $expire_starred, expire photos: $expire_photos");
foreach($r as $item) {
foreach ($r as $item) {
// don't expire filed items
if (strpos($item['file'],'[') !== false)
if (strpos($item['file'],'[') !== false) {
continue;
}
// 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;
if ($expire_starred==0 && intval($item['starred']))
} elseif ($expire_starred == 0 && intval($item['starred'])) {
continue;
if ($expire_notes==0 && $item['type']=='note')
} elseif ($expire_notes == 0 && $item['type'] == 'note') {
continue;
if ($expire_items==0 && $item['type']!='note')
} elseif ($expire_items == 0 && $item['type'] != 'note') {
continue;
}
drop_item($item['id'],false);
drop_item($item['id'], false);
}
proc_run(PRIORITY_HIGH, "include/notifier.php", "expire", $uid);
}
/// @TODO type-hint is array
function drop_items($items) {
$uid = 0;
if (! local_user() && ! remote_user())
if (! local_user() && ! remote_user()) {
return;
}
if (count($items)) {
foreach($items as $item) {
foreach ($items as $item) {
$owner = drop_item($item,false);
if ($owner && ! $uid)
$uid = $owner;
@ -1966,7 +2065,7 @@ function drop_item($id, $interactive = true) {
// check if logged in user is either the author or owner of this item
if (is_array($_SESSION['remote'])) {
foreach($_SESSION['remote'] as $visitor) {
foreach ($_SESSION['remote'] as $visitor) {
if ($visitor['uid'] == $item['uid'] && $visitor['cid'] == $item['contact-id']) {
$contact_id = $visitor['cid'];
break;
@ -1983,7 +2082,7 @@ function drop_item($id, $interactive = true) {
// so add any arguments as hidden inputs
$query = explode_querystring($a->query_string);
$inputs = array();
foreach($query['args'] as $arg) {
foreach ($query['args'] as $arg) {
if (strpos($arg, 'confirm=') === false) {
$arg_parts = explode('=', $arg);
$inputs[] = array('name' => $arg_parts[0], 'value' => $arg_parts[1]);
@ -2022,7 +2121,7 @@ function drop_item($id, $interactive = true) {
$matches = false;
$cnt = preg_match_all('/<(.*?)>/', $item['file'], $matches,PREG_SET_ORDER);
if ($cnt) {
foreach($matches as $mtch) {
foreach ($matches as $mtch) {
file_tag_unsave_file($item['uid'], $item['id'], $mtch[1],true);
}
}
@ -2031,16 +2130,17 @@ function drop_item($id, $interactive = true) {
$cnt = preg_match_all('/\[(.*?)\]/', $item['file'], $matches,PREG_SET_ORDER);
if ($cnt) {
foreach($matches as $mtch) {
foreach ($matches as $mtch) {
file_tag_unsave_file($item['uid'], $item['id'], $mtch[1],false);
}
}
// If item is a link to a photo resource, nuke all the associated photos
// (visitors will not have photo resources)
// 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 item is a link to a photo resource, nuke all the associated photos
* (visitors will not have photo resources)
* 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'])) {
q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d ",
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 (intval($item['event-id'])) {
q("DELETE FROM `event` WHERE `id` = %d AND `uid` = %d",
intval($item['event-id']),
@ -2060,8 +2159,7 @@ function drop_item($id, $interactive = true) {
}
// If item has attachments, drop them
foreach(explode(", ", $item['attach']) as $attach) {
foreach (explode(", ", $item['attach']) as $attach) {
preg_match("|attach/(\d+)|", $attach, $matches);
q("DELETE FROM `attach` WHERE `id` = %d AND `uid` = %d",
intval($matches[1]),
@ -2074,7 +2172,7 @@ function drop_item($id, $interactive = true) {
// 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)",
intval($item['id']),
@ -2097,9 +2195,10 @@ function drop_item($id, $interactive = true) {
$parentid = "";
foreach ($r AS $row) {
if ($parentid != "")
foreach ($r as $row) {
if ($parentid != "") {
$parentid .= ", ";
]
$parentid .= $row["id"];
}
@ -2174,7 +2273,7 @@ function first_post_date($uid, $wall = false) {
intval($wall ? 1 : 0)
);
if (dbm::is_result($r)) {
// logger('first_post_date: ' . $r[0]['id'] . ' ' . $r[0]['created'], LOGGER_DATA);
// logger('first_post_date: ' . $r[0]['id'] . ' ' . $r[0]['created'], LOGGER_DATA);
return substr(datetime_convert('',date_default_timezone_get(), $r[0]['created']),0,10);
}
return false;
@ -2182,7 +2281,7 @@ function first_post_date($uid, $wall = false) {
/* modified posted_dates() {below} to arrange the list in years */
function list_post_dates($uid, $wall) {
$dnow = datetime_convert('',date_default_timezone_get(),'now','Y-m-d');
$dnow = datetime_convert('',date_default_timezone_get(), 'now','Y-m-d');
$dthen = first_post_date($uid, $wall);
if (! $dthen) {
@ -2190,8 +2289,8 @@ function list_post_dates($uid, $wall) {
}
// Set the start and end date to the beginning of the month
$dnow = substr($dnow,0,8).'01';
$dthen = substr($dthen,0,8).'01';
$dnow = substr($dnow, 0, 8) . '01';
$dthen = substr($dthen, 0, 8) . '01';
$ret = array();
@ -2200,12 +2299,12 @@ function list_post_dates($uid, $wall) {
* month down to and including the month of the first post
*/
while (substr($dnow, 0, 7) >= substr($dthen, 0, 7)) {
$dyear = intval(substr($dnow,0,4));
$dstart = substr($dnow,0,8) . '01';
$dend = substr($dnow,0,8) . get_dim(intval($dnow),intval(substr($dnow,5)));
$start_month = datetime_convert('', '', $dstart,'Y-m-d');
$end_month = datetime_convert('', '', $dend,'Y-m-d');
$str = day_translate(datetime_convert('', '', $dnow,'F'));
$dyear = intval(substr($dnow, 0, 4));
$dstart = substr($dnow, 0, 8) . '01';
$dend = substr($dnow, 0, 8) . get_dim(intval($dnow), intval(substr($dnow, 5)));
$start_month = datetime_convert('', '', $dstart, 'Y-m-d');
$end_month = datetime_convert('', '', $dend, 'Y-m-d');
$str = day_translate(datetime_convert('', '', $dnow, 'F'));
if (!$ret[$dyear]) {
$ret[$dyear] = array();
}
@ -2216,7 +2315,7 @@ function list_post_dates($uid, $wall) {
}
function posted_dates($uid, $wall) {
$dnow = datetime_convert('',date_default_timezone_get(),'now','Y-m-d');
$dnow = datetime_convert('', date_default_timezone_get(), 'now', 'Y-m-d');
$dthen = first_post_date($uid, $wall);
if (! $dthen) {
@ -2224,18 +2323,20 @@ function posted_dates($uid, $wall) {
}
// Set the start and end date to the beginning of the month
$dnow = substr($dnow,0,8).'01';
$dthen = substr($dthen,0,8).'01';
$dnow = substr($dnow, 0, 8).'01';
$dthen = substr($dthen, 0, 8).'01';
$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)) {
$dstart = substr($dnow,0,8) . '01';
$dend = substr($dnow,0,8) . get_dim(intval($dnow),intval(substr($dnow,5)));
$start_month = datetime_convert('', '', $dstart,'Y-m-d');
$end_month = datetime_convert('', '', $dend,'Y-m-d');
$str = day_translate(datetime_convert('', '', $dnow,'F Y'));
$dstart = substr($dnow, 0, 8) . '01';
$dend = substr($dnow, 0, 8) . get_dim(intval($dnow),intval(substr($dnow,5)));
$start_month = datetime_convert('', '', $dstart, 'Y-m-d');
$end_month = datetime_convert('', '', $dend, 'Y-m-d');
$str = day_translate(datetime_convert('', '', $dnow, 'F Y'));
$ret[] = array($str, $end_month, $start_month);
$dnow = datetime_convert('', '', $dnow . ' -1 month', 'Y-m-d');
}
@ -2251,9 +2352,11 @@ function posted_date_widget($url, $uid, $wall) {
}
// For former Facebook folks that left because of "timeline"
/* if ($wall && intval(get_pconfig($uid,'system','no_wall_archive_widget')))
return $o;*/
/*
* @TODO old-lost code?
if ($wall && intval(get_pconfig($uid, 'system', 'no_wall_archive_widget')))
return $o;
*/
$visible_years = get_pconfig($uid,'system','archive_visible_years');
if (! $visible_years) {
@ -2266,7 +2369,7 @@ function posted_date_widget($url, $uid, $wall) {
return $o;
}
$cutoff_year = intval(datetime_convert('',date_default_timezone_get(),'now','Y')) - $visible_years;
$cutoff_year = intval(datetime_convert('',date_default_timezone_get(), 'now', 'Y')) - $visible_years;
$cutoff = ((array_key_exists($cutoff_year, $ret))? true : false);
$o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(