X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fitems.php;h=848c21df366d405d16a00b24eaadbd0b36c58847;hb=5b96c7b3e39a4dd6516115e0fb187cc0ecc0e07d;hp=5a0aa9ed51649921a2206ebdc4512946dce8f82e;hpb=33e572409d403966e18cf90e4af79e89e9b19be0;p=friendica.git
diff --git a/include/items.php b/include/items.php
index 5a0aa9ed51..848c21df36 100644
--- a/include/items.php
+++ b/include/items.php
@@ -9,12 +9,16 @@ require_once('include/tags.php');
require_once('include/files.php');
require_once('include/text.php');
require_once('include/email.php');
-require_once('include/ostatus_conversation.php');
require_once('include/threads.php');
require_once('include/socgraph.php');
+require_once('include/plaintext.php');
+require_once('include/ostatus.php');
require_once('mod/share.php');
-function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
+require_once('library/defuse/php-encryption-1.2.1/Crypto.php');
+
+
+function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0, $forpubsub = false) {
$sitefeed = ((strlen($owner_nick)) ? false : true); // not yet implemented, need to rewrite huge chunks of following logic
@@ -37,7 +41,7 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
// default permissions - anonymous user
- $sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '' ";
+ $sql_extra = " AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' ";
$r = q("SELECT `contact`.*, `user`.`uid` AS `user_uid`, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`
FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`
@@ -55,6 +59,7 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
$birthday = feed_birthday($owner_id,$owner['timezone']);
$sql_post_table = "";
+ $visibility = "";
if(! $public_feed) {
@@ -114,6 +119,19 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
else
$sort = 'ASC';
+ // Include answers to status.net posts in pubsub feeds
+ if($forpubsub) {
+ $sql_post_table = "INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`
+ LEFT JOIN `item` AS `thritem` ON `thritem`.`uri`=`item`.`thr-parent` AND `thritem`.`uid`=`item`.`uid`";
+ $visibility = sprintf("AND (`item`.`parent` = `item`.`id`) OR (`item`.`network` = '%s' AND ((`thread`.`network`='%s') OR (`thritem`.`network` = '%s')))",
+ dbesc(NETWORK_DFRN), dbesc(NETWORK_OSTATUS), dbesc(NETWORK_OSTATUS));
+ $date_field = "`received`";
+ $sql_order = "`item`.`received` DESC";
+ } else {
+ $date_field = "`changed`";
+ $sql_order = "`item`.`parent` ".$sort.", `item`.`created` ASC";
+ }
+
if(! strlen($last_update))
$last_update = 'now -30 days';
@@ -133,7 +151,7 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
// AND ( `item`.`edited` > '%s' OR `item`.`changed` > '%s' )
// dbesc($check_date),
- $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
+ $r = q("SELECT STRAIGHT_JOIN `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`network`, `contact`.`photo`, `contact`.`url`,
`contact`.`name-date`, `contact`.`uri-date`, `contact`.`avatar-date`,
`contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
@@ -144,9 +162,9 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id`
WHERE `item`.`uid` = %d AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`parent` != 0
- AND `item`.`wall` = 1 AND `item`.`changed` > '%s'
+ AND ((`item`.`wall` = 1) $visibility) AND `item`.$date_field > '%s'
$sql_extra
- ORDER BY `parent` %s, `created` ASC LIMIT 0, 300",
+ ORDER BY $sql_order LIMIT 0, 300",
intval($owner_id),
dbesc($check_date),
dbesc($sort)
@@ -464,12 +482,26 @@ function get_atom_elements($feed, $item, $contact = array()) {
// look for a photo. We should check media size and find the best one,
// but for now let's just find any author photo
+ // Additionally we look for an alternate author link. On OStatus this one is the one we want.
+
+ $authorlinks = $item->feed->data["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["feed"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["author"][0]["child"]["http://www.w3.org/2005/Atom"]["link"];
+ if (is_array($authorlinks)) {
+ foreach ($authorlinks as $link) {
+ $linkdata = array_shift($link["attribs"]);
+
+ if ($linkdata["rel"] == "alternate")
+ $res["author-link"] = $linkdata["href"];
+ };
+ }
$rawauthor = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'author');
if($rawauthor && $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link']) {
$base = $rawauthor[0]['child'][SIMPLEPIE_NAMESPACE_ATOM_10]['link'];
foreach($base as $link) {
+ if($link['attribs']['']['rel'] === 'alternate')
+ $res['author-link'] = unxmlify($link['attribs']['']['href']);
+
if(!x($res, 'author-avatar') || !$res['author-avatar']) {
if($link['attribs']['']['rel'] === 'photo' || $link['attribs']['']['rel'] === 'avatar')
$res['author-avatar'] = unxmlify($link['attribs']['']['href']);
@@ -828,7 +860,7 @@ function get_atom_elements($feed, $item, $contact = array()) {
logger('get_atom_elements: Looking for status.net repeated message');
$message = $child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["content"][0]["data"];
- $orig_uri = $child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["id"][0]["data"];
+ $orig_id = ostatus_convert_href($child["http://activitystrea.ms/spec/1.0/"]["object"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["id"][0]["data"]);
$author = $child[SIMPLEPIE_NAMESPACE_ATOM_10]["author"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10];
$uri = $author["uri"][0]["data"];
$name = $author["name"][0]["data"];
@@ -836,10 +868,10 @@ function get_atom_elements($feed, $item, $contact = array()) {
$avatar = $avatar["href"];
if (($name != "") and ($uri != "") and ($avatar != "") and ($message != "")) {
- logger('get_atom_elements: fixing sender of repeated message.');
+ logger('get_atom_elements: fixing sender of repeated message. '.$orig_id, LOGGER_DEBUG);
if (!intval(get_config('system','wall-to-wall_share'))) {
- $prefix = share_header($name, $uri, $avatar, "", "", $orig_uri);
+ $prefix = share_header($name, $uri, $avatar, "", "", $orig_link);
$res["body"] = $prefix.html2bbcode($message)."[/share]";
} else {
@@ -856,20 +888,6 @@ function get_atom_elements($feed, $item, $contact = array()) {
}
}
- // Search for ostatus conversation url
- $links = $item->feed->data["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["feed"][0]["child"][SIMPLEPIE_NAMESPACE_ATOM_10]["entry"][0]["child"]["http://www.w3.org/2005/Atom"]["link"];
-
- if (is_array($links)) {
- foreach ($links as $link) {
- $conversation = array_shift($link["attribs"]);
-
- if ($conversation["rel"] == "ostatus:conversation") {
- $res["ostatus_conversation"] = $conversation["href"];
- logger('get_atom_elements: found conversation url '.$res["ostatus_conversation"]);
- }
- };
- }
-
if (isset($contact["network"]) AND ($contact["network"] == NETWORK_FEED) AND $contact['fetch_further_information']) {
$preview = "";
@@ -1068,7 +1086,15 @@ function encode_rel_links($links) {
return xmlify($o);
}
+function add_guid($item) {
+ $r = q("SELECT `guid` FROM `guid` WHERE `guid` = '%s' LIMIT 1", dbesc($item["guid"]));
+ if ($r)
+ return;
+ q("INSERT INTO `guid` (`guid`,`plink`,`uri`,`network`) VALUES ('%s','%s','%s','%s')",
+ dbesc($item["guid"]), dbesc($item["plink"]),
+ dbesc($item["uri"]), dbesc($item["network"]));
+}
function item_store($arr,$force_parent = false, $notify = false, $dontcache = false) {
@@ -1090,13 +1116,12 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
unset($arr['dsprsig']);
}
- // if an OStatus conversation url was passed in, it is stored and then
- // removed from the array.
- $ostatus_conversation = null;
-
- if (isset($arr["ostatus_conversation"])) {
- $ostatus_conversation = $arr["ostatus_conversation"];
- unset($arr["ostatus_conversation"]);
+ // Converting the plink
+ if ($arr['network'] == NETWORK_OSTATUS) {
+ if (isset($arr['plink']))
+ $arr['plink'] = ostatus_convert_href($arr['plink']);
+ elseif (isset($arr['uri']))
+ $arr['plink'] = ostatus_convert_href($arr['uri']);
}
if(x($arr, 'gravity'))
@@ -1115,7 +1140,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
/* check for create date and expire time */
$uid = intval($arr['uid']);
- $r = q("SELECT expire FROM user WHERE uid = %d", $uid);
+ $r = q("SELECT expire FROM user WHERE uid = %d", intval($uid));
if(count($r)) {
$expire_interval = $r[0]['expire'];
if ($expire_interval>0) {
@@ -1129,11 +1154,10 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
}
// If there is no guid then take the same guid that was taken before for the same uri
- if ((trim($arr['guid']) == "") AND (trim($arr['uri']) != "")) {
+ if ((trim($arr['guid']) == "") AND (trim($arr['uri']) != "") AND (trim($arr['network']) != "")) {
logger('item_store: checking for an existing guid for uri '.$arr['uri'], LOGGER_DEBUG);
- $r = q("SELECT `guid` FROM `item` WHERE `uri` = '%s' AND `guid` != '' LIMIT 1",
- dbesc(trim($arr['uri']))
- );
+ $r = q("SELECT `guid` FROM `guid` WHERE `uri` = '%s' AND `network` = '%s' LIMIT 1",
+ dbesc(trim($arr['uri'])), dbesc(trim($arr['network'])));
if(count($r)) {
$arr['guid'] = $r[0]["guid"];
@@ -1141,6 +1165,21 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
}
}
+ // If there is no guid then take the same guid that was taken before for the same plink
+ if ((trim($arr['guid']) == "") AND (trim($arr['plink']) != "") AND (trim($arr['network']) != "")) {
+ logger('item_store: checking for an existing guid for plink '.$arr['plink'], LOGGER_DEBUG);
+ $r = q("SELECT `guid`, `uri` FROM `guid` WHERE `plink` = '%s' AND `network` = '%s' LIMIT 1",
+ dbesc(trim($arr['plink'])), dbesc(trim($arr['network'])));
+
+ if(count($r)) {
+ $arr['guid'] = $r[0]["guid"];
+ logger('item_store: found guid '.$arr['guid'].' for plink '.$arr['plink'], LOGGER_DEBUG);
+
+ if ($r[0]["uri"] != $arr['uri'])
+ logger('Different uri for same guid: '.$arr['uri'].' and '.$r[0]["uri"].' - this shouldnt happen!', LOGGER_DEBUG);
+ }
+ }
+
// 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))
@@ -1339,7 +1378,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
$arr['gravity'] = 0;
}
else {
- logger('item_store: item parent was not found - ignoring item');
+ logger('item_store: item parent '.$arr['parent-uri'].' for '.$arr['uid'].' was not found - ignoring item');
return 0;
}
@@ -1347,12 +1386,26 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
}
}
- $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
+ $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1",
dbesc($arr['uri']),
+ dbesc($arr['network']),
intval($arr['uid'])
);
if($r && count($r)) {
- logger('item-store: duplicate item ignored. ' . print_r($arr,true));
+ logger('duplicated item with the same uri found. ' . print_r($arr,true));
+ return 0;
+ }
+
+ // Check for an existing post with the same content. There seems to be a problem with OStatus.
+ $r = q("SELECT `id` FROM `item` WHERE `body` = '%s' AND `network` = '%s' AND `created` = '%s' AND `contact-id` = %d AND `uid` = %d LIMIT 1",
+ dbesc($arr['body']),
+ dbesc($arr['network']),
+ dbesc($arr['created']),
+ intval($arr['contact-id']),
+ intval($arr['uid'])
+ );
+ if($r && count($r)) {
+ logger('duplicated item with the same body found. ' . print_r($arr,true));
return 0;
}
@@ -1400,6 +1453,10 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
);
if(count($r)) {
+
+ // Store the guid and other relevant data
+ add_guid($arr);
+
$current_post = $r[0]['id'];
logger('item_store: created item ' . $current_post);
@@ -1459,10 +1516,6 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
intval($current_post)
);
- // Complete ostatus threads
- if ($ostatus_conversation)
- complete_conversation($current_post, $ostatus_conversation);
-
$arr['id'] = $current_post;
$arr['parent'] = $parent_id;
$arr['allow_cid'] = $allow_cid;
@@ -1621,12 +1674,12 @@ 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=".$match[1]."]".str_replace("#", "#", $match[2])."[/url]");
+ return("[url=".str_replace("#", "#", $match[1])."]".str_replace("#", "#", $match[2])."[/url]");
},$item["body"]);
$item["body"] = preg_replace_callback("/\[bookmark\=([$URLSearchString]*)\](.*?)\[\/bookmark\]/ism",
function ($match){
- return("[bookmark=".$match[1]."]".str_replace("#", "#", $match[2])."[/bookmark]");
+ return("[bookmark=".str_replace("#", "#", $match[1])."]".str_replace("#", "#", $match[2])."[/bookmark]");
},$item["body"]);
$item["body"] = preg_replace_callback("/\[attachment (.*)\](.*?)\[\/attachment\]/ism",
@@ -1638,6 +1691,7 @@ function item_body_set_hashtags(&$item) {
$item["body"] = preg_replace("/#\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
"#$2", $item["body"]);
+
foreach($tags as $tag) {
if(strpos($tag,'#') !== 0)
continue;
@@ -1932,13 +1986,13 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
if($contact['duplex'] && $contact['issued-id'])
$idtosend = '1:' . $orig_id;
- $rino = ((function_exists('mcrypt_encrypt')) ? 1 : 0);
+
+ $rino = get_config('system','rino_encrypt');
+ $rino = intval($rino);
- $rino_enable = get_config('system','rino_encrypt');
-
- if(! $rino_enable)
- $rino = 0;
+
+
$ssl_val = intval(get_config('system','ssl_policy'));
$ssl_policy = '';
@@ -1955,7 +2009,7 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
break;
}
- $url = $contact['notify'] . '&dfrn_id=' . $idtosend . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . (($rino) ? '&rino=1' : '');
+ $url = $contact['notify'] . '&dfrn_id=' . $idtosend . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . (($rino) ? '&rino='.$rino : '');
logger('dfrn_deliver: ' . $url);
@@ -1986,7 +2040,7 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
$challenge = hex2bin((string) $res->challenge);
$perm = (($res->perm) ? $res->perm : null);
$dfrn_version = (float) (($res->dfrn_version) ? $res->dfrn_version : 2.0);
- $rino_allowed = ((intval($res->rino) === 1) ? 1 : 0);
+ $rino_remote_version = intval($res->rino);
$page = (($owner['page-flags'] == PAGE_COMMUNITY) ? 1 : 0);
if($owner['page-flags'] == PAGE_PRVGROUP)
@@ -2047,11 +2101,46 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
if($page)
$postvars['page'] = $page;
- if($rino && $rino_allowed && (! $dissolve)) {
- $key = substr(random_string(),0,16);
- $data = bin2hex(aes_encrypt($postvars['data'],$key));
- $postvars['data'] = $data;
- logger('rino: sent key = ' . $key, LOGGER_DEBUG);
+
+ if($rino>0 && $rino_remote_version>0 && (! $dissolve)) {
+ logger('rino version: '. $rino_remote_version);
+
+ switch($rino_remote_version) {
+ case 1:
+ // Deprecated rino version!
+ $key = substr(random_string(),0,16);
+ $data = aes_encrypt($postvars['data'],$key);
+ break;
+ case 2:
+ // RINO 2 based on php-encryption
+ try {
+ $key = Crypto::createNewRandomKey();
+ } catch (CryptoTestFailed $ex) {
+ logger('Cannot safely create a key');
+ return -1;
+ } catch (CannotPerformOperation $ex) {
+ logger('Cannot safely create a key');
+ return -1;
+ }
+ try {
+ $data = Crypto::encrypt($postvars['data'], $key);
+ } catch (CryptoTestFailed $ex) {
+ logger('Cannot safely perform encryption');
+ return -1;
+ } catch (CannotPerformOperation $ex) {
+ logger('Cannot safely perform encryption');
+ return -1;
+ }
+ break;
+ default:
+ logger("rino: invalid requested verision '$rino_remote_version'");
+ return -1;
+ }
+
+ $postvars['rino'] = $rino_remote_version;
+ $postvars['data'] = bin2hex($data);
+
+ #logger('rino: sent key = ' . $key, LOGGER_DEBUG);
if($dfrn_version >= 2.1) {
@@ -2078,6 +2167,7 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
$postvars['key'] = bin2hex($postvars['key']);
}
+
logger('dfrn_deliver: ' . "SENDING: " . print_r($postvars,true), LOGGER_DATA);
@@ -2158,6 +2248,17 @@ function edited_timestamp_is_newer($existing, $update) {
*/
function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0) {
+ if ($contact['network'] === NETWORK_OSTATUS) {
+ if ($pass < 2) {
+ // Test - remove before flight
+ //$tempfile = tempnam(get_temppath(), "ostatus");
+ //file_put_contents($tempfile, $xml);
+
+ logger("Consume OStatus messages ", LOGGER_DEBUG);
+ ostatus_import($xml,$importer,$contact, $hub);
+ }
+ return;
+ }
require_once('library/simplepie/simplepie.inc');
require_once('include/contact_selectors.php');
@@ -2876,9 +2977,6 @@ function item_is_remote_self($contact, &$datarray) {
$datarray['private'] = 0;
}
- //if (!isset($datarray["app"]) OR ($datarray["app"] == ""))
- // $datarray["app"] = network_to_name($contact['network']);
-
if ($contact['network'] != NETWORK_FEED) {
// Store the original post
$r = item_store($datarray2, false, false);
@@ -4058,9 +4156,12 @@ function new_follower($importer,$contact,$datarray,$item,$sharing = false) {
$name = notags(trim($datarray['author-name']));
$photo = notags(trim($datarray['author-avatar']));
- $rawtag = $item->get_item_tags(NAMESPACE_ACTIVITY,'actor');
- if($rawtag && $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'])
- $nick = $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'];
+ if (is_object($item)) {
+ $rawtag = $item->get_item_tags(NAMESPACE_ACTIVITY,'actor');
+ if($rawtag && $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'])
+ $nick = $rawtag[0]['child'][NAMESPACE_POCO]['preferredUsername'][0]['data'];
+ } else
+ $nick = $item;
if(is_array($contact)) {
if(($contact['network'] == NETWORK_OSTATUS && $contact['rel'] == CONTACT_IS_SHARING)
@@ -4226,10 +4327,48 @@ function atom_author($tag,$name,$uri,$h,$w,$photo) {
$o .= "<$tag>\r\n";
- $o .= "