]> git.mxchange.org Git - friendica.git/blobdiff - include/items.php
typo
[friendica.git] / include / items.php
index b6a5888001496c78bfa4fd39733fc7b011772a12..d06cc30cd4adfbab86505061a3b5b3c7da908072 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 
 require_once('bbcode.php');
+require_once('oembed.php');
+require_once('include/salmon.php');
 
 function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0) {
 
@@ -375,6 +377,21 @@ function get_atom_elements($feed,$item) {
        }
 
 
+       /**
+        * If there's a copy of the body content which is guaranteed to have survived mangling in transit, use it.
+        */
+
+       $have_real_body = false;
+
+       $rawenv = $item->get_item_tags(NAMESPACE_DFRN, 'env');
+       if($rawenv) {
+               $have_real_body = true;
+               $res['body'] = $rawenv[0]['data'];
+               $res['body'] = str_replace(array(' ',"\t","\r","\n"), array('','','',''),$res['body']);
+               $res['body'] = base64url_decode($res['body']);
+               $res['realbody'] = true;
+       }
+
        $maxlen = get_max_import_size();
        if($maxlen && (strlen($res['body']) > $maxlen))
                $res['body'] = substr($res['body'],0, $maxlen);
@@ -390,11 +407,13 @@ function get_atom_elements($feed,$item) {
        // html.
 
 
-       if((strpos($res['body'],'<')) || (strpos($res['body'],'>'))) {
+       if((! $have_real_body) || (strpos($res['body'],'<')) || (strpos($res['body'],'>'))) {
 
                $res['body'] = preg_replace('#<object[^>]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s',
                        '[youtube]$1[/youtube]', $res['body']);
 
+               $res['body'] = oembed_html2bbcode($res['body']);
+       
                $config = HTMLPurifier_Config::createDefault();
                $config->set('Cache.DefinitionImpl', null);
 
@@ -436,14 +455,16 @@ function get_atom_elements($feed,$item) {
 
        $rawedited = $item->get_item_tags(SIMPLEPIE_NAMESPACE_ATOM_10,'updated');
        if($rawedited)
-               $res['edited'] = unxmlify($rawcreated[0]['data']);
+               $res['edited'] = unxmlify($rawedited[0]['data']);
 
+       if((x($res,'edited')) && (! (x($res,'created'))))
+               $res['created'] = $res['edited']; 
 
        if(! $res['created'])
-               $res['created'] = $item->get_date();
+               $res['created'] = $item->get_date('c');
 
        if(! $res['edited'])
-               $res['edited'] = $item->get_date();
+               $res['edited'] = $item->get_date('c');
 
 
        $rawowner = $item->get_item_tags(NAMESPACE_DFRN, 'owner');
@@ -640,18 +661,21 @@ function item_store($arr) {
        $arr['private']       = ((x($arr,'private'))       ? intval($arr['private'])             : 0 );
        $arr['body']          = ((x($arr,'body'))          ? escape_tags(trim($arr['body']))     : '');
 
-       // The content body has been through a lot of filtering and transport escaping by now. 
+       // The content body may have been through a lot of filtering and transport escaping by now. 
        // We don't want to skip any filters, however a side effect of all this filtering 
        // is that ampersands and <> may have been double encoded, depending on which filter chain
-       // they came through. 
-
-       $arr['body']          = str_replace(
-                                                               array('&amp;amp;', '&amp;gt;', '&amp;lt;', '&amp;quot;'),
-                                                               array('&amp;'    , '&gt;'    , '&lt;',     '&quot;'),
-                                                               $arr['body']
-                                                       );
-
+       // they came through. The presence of $res['realbody'] means we have something encoded in a 
+       // transport safe manner at the source and does not require any filter corrections. 
 
+       if(x($arr,'realbody'))
+               unset($arr['realbody']);
+       else {
+               $arr['body']          = str_replace(
+                                                                       array('&amp;amp;', '&amp;gt;', '&amp;lt;', '&amp;quot;'),
+                                                                       array('&amp;'    , '&gt;'    , '&lt;',     '&quot;'),
+                                                                       $arr['body']
+                                                               );
+       }
 
        if($arr['parent-uri'] === $arr['uri']) {
                $parent_id = 0;
@@ -903,6 +927,10 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0) {
                $feed->enable_order_by_date(false);
        $feed->init();
 
+       if($feed->error())
+               logger('consume_feed: Error parsing XML: ' . $feed->error());
+
+
        // Check at the feed level for updated contact name and/or photo
 
        $name_updated  = '';
@@ -1157,6 +1185,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0) {
                                        continue;
                                }
                                $datarray = get_atom_elements($feed,$item);
+
                                if($contact['network'] === 'stat') {
                                        if(strlen($datarray['title']))
                                                unset($datarray['title']);
@@ -1167,7 +1196,8 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0) {
                                        );
                                        $datarray['last-child'] = 1;
                                }
-                               if(($contact['network'] === 'feed') || (! strlen($contact['poll']))) {
+
+                               if(($contact['network'] === 'feed') || (! strlen($contact['notify']))) {
                                        // one way feed - no remote comment ability
                                        $datarray['last-child'] = 0;
                                }
@@ -1223,7 +1253,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0) {
                                        $datarray['last-child'] = 1;
                                }
 
-                               if(($contact['network'] === 'feed') || (! strlen($contact['poll']))) {
+                               if(($contact['network'] === 'feed') || (! strlen($contact['notify']))) {
                                        // one way feed - no remote comment ability
                                        $datarray['last-child'] = 0;
                                }
@@ -1412,6 +1442,7 @@ function atom_entry($item,$type,$author,$owner,$comment = false) {
        $o .= '<title>' . xmlify($item['title']) . '</title>' . "\r\n";
        $o .= '<published>' . xmlify(datetime_convert('UTC','UTC',$item['created'] . '+00:00',ATOM_TIME)) . '</published>' . "\r\n";
        $o .= '<updated>' . xmlify(datetime_convert('UTC','UTC',$item['edited'] . '+00:00',ATOM_TIME)) . '</updated>' . "\r\n";
+       $o .= '<dfrn:env>' . base64url_encode($item['body'], true) . '</dfrn:env>' . "\r\n";
        $o .= '<content type="' . $type . '" >' . xmlify(($type === 'html') ? bbcode($item['body']) : $item['body']) . '</content>' . "\r\n";
        $o .= '<link rel="alternate" href="' . xmlify($a->get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id']) . '" />' . "\r\n";
        if($comment)