]> git.mxchange.org Git - friendica.git/blobdiff - include/items.php
Merge remote-tracking branch 'upstream/develop' into 1509-new-feed-import
[friendica.git] / include / items.php
index eaa0565467d2459facee812f082151fbc3b907be..0d442e317031d2a750f52973ad388447a6e20962 100644 (file)
@@ -13,6 +13,7 @@ require_once('include/threads.php');
 require_once('include/socgraph.php');
 require_once('include/plaintext.php');
 require_once('include/ostatus.php');
+require_once('include/feed.php');
 require_once('mod/share.php');
 
 require_once('library/defuse/php-encryption-1.2.1/Crypto.php');
@@ -969,7 +970,7 @@ function query_page_info($url, $no_photos = false, $photo = "", $keywords = fals
        $data = Cache::get("parse_url:".$url);
        if (is_null($data)){
                $data = parseurl_getsiteinfo($url, true);
-               Cache::set("parse_url:".$url,serialize($data));
+               Cache::set("parse_url:".$url,serialize($data), CACHE_DAY);
        } else
                $data = unserialize($data);
 
@@ -1096,6 +1097,48 @@ function add_guid($item) {
                dbesc($item["uri"]), dbesc($item["network"]));
 }
 
+// Adds a "lang" specification in a "postopts" element of given $arr,
+// if possible and not already present.
+// Expects "body" element to exist in $arr.
+// TODO: add a parameter to request forcing override
+function item_add_language_opt(&$arr) {
+
+       if (version_compare(PHP_VERSION, '5.3.0', '<')) return; // LanguageDetect.php not available ?
+
+       if ( x($arr, 'postopts') )
+       {
+               if ( strstr($arr['postopts'], 'lang=') )
+               {
+                       // do not override
+                       // TODO: add parameter to request overriding
+                       return;
+               }
+               $postopts = $arr['postopts'];
+       }
+       else
+       {
+               $postopts = "";
+       }
+
+       require_once('library/langdet/Text/LanguageDetect.php');
+       $naked_body = preg_replace('/\[(.+?)\]/','',$arr['body']);
+       $l = new Text_LanguageDetect;
+       //$lng = $l->detectConfidence($naked_body);
+       //$arr['postopts'] = (($lng['language']) ? 'lang=' . $lng['language'] . ';' . $lng['confidence'] : '');
+       $lng = $l->detect($naked_body, 3);
+
+       if (sizeof($lng) > 0) {
+               if ($postopts != "") $postopts .= '&'; // arbitrary separator, to be reviewed
+               $postopts .= 'lang=';
+               $sep = "";
+               foreach ($lng as $language => $score) {
+                       $postopts .= $sep . $language.";".$score;
+                       $sep = ':';
+               }
+               $arr['postopts'] = $postopts;
+       }
+}
+
 function item_store($arr,$force_parent = false, $notify = false, $dontcache = false) {
 
        // If it is a posting where users should get notifications, then define it as wall posting
@@ -1185,32 +1228,16 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
        //if((strpos($arr['body'],'<') !== false) || (strpos($arr['body'],'>') !== false))
        //      $arr['body'] = strip_tags($arr['body']);
 
+       item_add_language_opt($arr);
 
-       if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
-               require_once('library/langdet/Text/LanguageDetect.php');
-               $naked_body = preg_replace('/\[(.+?)\]/','',$arr['body']);
-               $l = new Text_LanguageDetect;
-               //$lng = $l->detectConfidence($naked_body);
-               //$arr['postopts'] = (($lng['language']) ? 'lang=' . $lng['language'] . ';' . $lng['confidence'] : '');
-               $lng = $l->detect($naked_body, 3);
-
-               if (sizeof($lng) > 0) {
-                       $postopts = "";
-
-                       foreach ($lng as $language => $score) {
-                               if ($postopts == "")
-                                       $postopts = "lang=";
-                               else
-                                       $postopts .= ":";
-
-                               $postopts .= $language.";".$score;
-                       }
-                       $arr['postopts'] = $postopts;
-               }
-       }
+       if ($notify)
+               $guid_prefix = "";
+       else
+               $guid_prefix = $arr['network'];
 
        $arr['wall']          = ((x($arr,'wall'))          ? intval($arr['wall'])                : 0);
-       $arr['uri']           = ((x($arr,'uri'))           ? notags(trim($arr['uri']))           : random_string());
+       $arr['guid']          = ((x($arr,'guid'))          ? notags(trim($arr['guid']))          : get_guid(32, $guid_prefix));
+       $arr['uri']           = ((x($arr,'uri'))           ? notags(trim($arr['uri']))           : $arr['guid']);
        $arr['extid']         = ((x($arr,'extid'))         ? notags(trim($arr['extid']))         : '');
        $arr['author-name']   = ((x($arr,'author-name'))   ? notags(trim($arr['author-name']))   : '');
        $arr['author-link']   = ((x($arr,'author-link'))   ? notags(trim($arr['author-link']))   : '');
@@ -1248,7 +1275,6 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
        $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['guid']          = ((x($arr,'guid'))          ? notags(trim($arr['guid']))          : get_guid(32, $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 );
@@ -1423,7 +1449,10 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
        // Fill the cache field
        put_item_in_cache($arr);
 
-       call_hooks('post_remote',$arr);
+       if ($notify)
+               call_hooks('post_local',$arr);
+       else
+               call_hooks('post_remote',$arr);
 
        if(x($arr,'cancel')) {
                logger('item_store: post cancelled by plugin.');
@@ -1569,7 +1598,10 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa
 
                $r = q('SELECT * FROM `item` WHERE id = %d', intval($current_post));
                if (count($r) == 1) {
-                       call_hooks('post_remote_end', $r[0]);
+                       if ($notify)
+                               call_hooks('post_local_end', $r[0]);
+                       else
+                               call_hooks('post_remote_end', $r[0]);
                } else
                        logger('item_store: new item not found in DB, id ' . $current_post);
        }
@@ -1986,13 +2018,14 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
        if($contact['duplex'] && $contact['issued-id'])
                $idtosend = '1:' . $orig_id;
 
-    
+
        $rino = get_config('system','rino_encrypt');
        $rino = intval($rino);
+       // use RINO1 if mcrypt isn't installed and RINO2 was selected
+       if ($rino==2 and !function_exists('mcrypt_create_iv')) $rino=1;
 
-   
+       logger("Local rino version: ". $rino, LOGGER_DEBUG);
 
-       
        $ssl_val = intval(get_config('system','ssl_policy'));
        $ssl_policy = '';
 
@@ -2043,6 +2076,8 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
        $rino_remote_version = intval($res->rino);
        $page         = (($owner['page-flags'] == PAGE_COMMUNITY) ? 1 : 0);
 
+       logger("Remote rino version: ".$rino_remote_version." for ".$contact["url"], LOGGER_DEBUG);
+
        if($owner['page-flags'] == PAGE_PRVGROUP)
                $page = 2;
 
@@ -2120,26 +2155,26 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
                                        return -1;
                                } catch (CannotPerformOperation $ex) {
                                        logger('Cannot safely create a key');
-                                       return -1; 
+                                       return -1;
                                }
                                try {
                                        $data = Crypto::encrypt($postvars['data'], $key);
                                } catch (CryptoTestFailed $ex) {
                                        logger('Cannot safely perform encryption');
-                                       return -1; 
+                                       return -1;
                                } catch (CannotPerformOperation $ex) {
                                        logger('Cannot safely perform encryption');
-                                       return -1; 
+                                       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);
 
 
@@ -2167,7 +2202,7 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
 
                $postvars['key'] = bin2hex($postvars['key']);
        }
-       
+
 
        logger('dfrn_deliver: ' . "SENDING: " . print_r($postvars,true), LOGGER_DATA);
 
@@ -2250,16 +2285,20 @@ 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;
        }
 
+       if ($contact['network'] === NETWORK_FEED) {
+               if ($pass < 2) {
+                       logger("Consume feeds", LOGGER_DEBUG);
+                       feed_import($xml,$importer,$contact, $hub);
+               }
+               return;
+       }
+
        require_once('library/simplepie/simplepie.inc');
        require_once('include/contact_selectors.php');
 
@@ -4299,7 +4338,7 @@ function subscribe_to_hub($url,$importer,$contact,$hubmode = 'subscribe') {
 
        logger('subscribe_to_hub: ' . $hubmode . ' ' . $contact['name'] . ' to hub ' . $url . ' endpoint: '  . $push_url . ' with verifier ' . $verify_token);
 
-       if(! strlen($contact['hub-verify'])) {
+       if(!strlen($contact['hub-verify']) OR ($contact['hub-verify'] != $verify_token)) {
                $r = q("UPDATE `contact` SET `hub-verify` = '%s' WHERE `id` = %d",
                        dbesc($verify_token),
                        intval($contact['id'])