]> git.mxchange.org Git - friendica.git/blobdiff - include/network.php
attribution issue - don't take author name from contact if available from item.
[friendica.git] / include / network.php
old mode 100644 (file)
new mode 100755 (executable)
index ade8a40..25db62d
@@ -5,41 +5,49 @@
 // results. 
 
 if(! function_exists('fetch_url')) {
-function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0) {
+function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_content=Null) {
 
        $a = get_app();
 
-       $ch = curl_init($url);
+       $ch = @curl_init($url);
        if(($redirects > 8) || (! $ch)) 
                return false;
 
-       curl_setopt($ch, CURLOPT_HEADER, true);
-       curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
-       curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
+       @curl_setopt($ch, CURLOPT_HEADER, true);
+       
+       if (!is_null($accept_content)){
+               curl_setopt($ch,CURLOPT_HTTPHEADER, array (
+                       "Accept: "+$accept_content
+               ));
+       }
+       
+       @curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
+       @curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
+
 
        if(intval($timeout)) {
-               curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+               @curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
        }
        else {
                $curl_time = intval(get_config('system','curl_timeout'));
-               curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
+               @curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
        }
        // by default we will allow self-signed certs
        // but you can override this
 
        $check_cert = get_config('system','verifyssl');
-       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
+       @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
 
        $prx = get_config('system','proxy');
        if(strlen($prx)) {
-               curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
-               curl_setopt($ch, CURLOPT_PROXY, $prx);
-               $prxusr = get_config('system','proxyuser');
+               @curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
+               @curl_setopt($ch, CURLOPT_PROXY, $prx);
+               $prxusr = @get_config('system','proxyuser');
                if(strlen($prxusr))
-                       curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
+                       @curl_setopt($ch, CURLOPT_PROXYUSERPWD, $prxusr);
        }
        if($binary)
-               curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
+               @curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
 
        $a->set_curl_code(0);
 
@@ -49,7 +57,7 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0) {
        $s = @curl_exec($ch);
 
        $base = $s;
-       $curl_info = curl_getinfo($ch);
+       $curl_info = @curl_getinfo($ch);
        $http_code = $curl_info['http_code'];
 
        $header = '';
@@ -80,7 +88,7 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0) {
 
        $a->set_curl_headers($header);
 
-       curl_close($ch);
+       @curl_close($ch);
        return($body);
 }}
 
@@ -97,7 +105,7 @@ function post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0)
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
        curl_setopt($ch, CURLOPT_POST,1);
        curl_setopt($ch, CURLOPT_POSTFIELDS,$params);
-       curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
+       curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
 
        if(intval($timeout)) {
                curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
@@ -259,22 +267,29 @@ function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
 // or if the resultant personal XRD doesn't contain a supported 
 // subscription/friend-request attribute.
 
+// amended 7/9/2011 to return an hcard which could save potentially loading 
+// a lengthy content page to scrape dfrn attributes
+
 if(! function_exists('webfinger_dfrn')) {
-function webfinger_dfrn($s) {
+function webfinger_dfrn($s,&$hcard) {
        if(! strstr($s,'@')) {
                return $s;
        }
+       $profile_link = '';
+
        $links = webfinger($s);
        logger('webfinger_dfrn: ' . $s . ':' . print_r($links,true), LOGGER_DATA);
        if(count($links)) {
-               foreach($links as $link)
+               foreach($links as $link) {
                        if($link['@attributes']['rel'] === NAMESPACE_DFRN)
-                               return $link['@attributes']['href'];
-               foreach($links as $link)
+                               $profile_link = $link['@attributes']['href'];
                        if($link['@attributes']['rel'] === NAMESPACE_OSTATUSSUB)
-                               return 'stat:' . $link['@attributes']['template'];              
+                               $profile_link = 'stat:' . $link['@attributes']['template'];     
+                       if($link['@attributes']['rel'] === 'http://microformats.org/profile/hcard')
+                               $hcard = $link['@attributes']['href'];                          
+               }
        }
-       return '';
+       return $profile_link;
 }}
 
 // Given an email style address, perform webfinger lookup and 
@@ -422,7 +437,12 @@ function lrdd($uri) {
        // don't try and parse raw xml as html
        if(! strstr($html,'<?xml')) {
                require_once('library/HTML5/Parser.php');
-               $dom = @HTML5_Parser::parse($html);
+
+               try {
+                       $dom = HTML5_Parser::parse($html);
+               } catch (DOMException $e) {
+                       logger('lrdd: parse error: ' . $e);
+               }
 
                if($dom) {
                        $items = $dom->getElementsByTagName('link');
@@ -508,13 +528,16 @@ function fetch_xrd_links($url) {
 
        $xrd_timeout = intval(get_config('system','xrd_timeout'));
        $redirects = 0;
-       $xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 30));
+       $xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 20));
 
        logger('fetch_xrd_links: ' . $xml, LOGGER_DATA);
 
        if ((! $xml) || (! stristr($xml,'<xrd')))
                return array();
 
+       // fix diaspora's bad xml
+       $xml = str_replace(array('href=&quot;','&quot;/>'),array('href="','"/>'),$xml);
+
        $h = parse_xml_string($xml);
        if(! $h)
                return array();
@@ -536,7 +559,7 @@ function fetch_xrd_links($url) {
                        $aliases = array($alias);
                else
                        $aliases = $alias;
-               if(count($aliases)) {
+               if(is_array($aliases) && count($aliases)) {
                        foreach($aliases as $alias) {
                                $links[]['@attributes'] = array('rel' => 'alias' , 'href' => $alias);
                        }
@@ -556,6 +579,9 @@ function fetch_xrd_links($url) {
 
 if(! function_exists('validate_url')) {
 function validate_url(&$url) {
+       // no naked subdomains
+       if(strpos($url,'.') === false)
+               return false;
        if(substr($url,0,4) != 'http')
                $url = 'http://' . $url;
        $h = @parse_url($url);
@@ -694,23 +720,59 @@ function parse_xml_string($s,$strict = true) {
        return $x;
 }}
 
-function add_fcontact($arr) {
-
-       $r = q("insert into fcontact ( `url`,`name`,`photo`,`request`,`nick`,`addr`,
-               `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey` )
-               values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
-               dbesc($arr['url']),
-               dbesc($arr['name']),
-               dbesc($arr['photo']),
-               dbesc($arr['request']),
-               dbesc($arr['nick']),
-               dbesc($arr['addr']),
-               dbesc($arr['notify']),
-               dbesc($arr['poll']),
-               dbesc($arr['confirm']),
-               dbesc($arr['network']),
-               dbesc($arr['alias']),
-               dbesc($arr['pubkey'])
-       );
+function add_fcontact($arr,$update = false) {
+
+       if($update) {
+               $r = q("UPDATE `fcontact` SET
+                       `name` = '%s',
+                       `photo` = '%s',
+                       `request` = '%s',
+                       `nick` = '%s',
+                       `addr` = '%s',
+                       `batch` = '%s',
+                       `notify` = '%s',
+                       `poll` = '%s',
+                       `confirm` = '%s',
+                       `alias` = '%s',
+                       `pubkey` = '%s',
+                       `updated` = '%s'
+                       WHERE `url` = '%s' AND `network` = '%s' LIMIT 1", 
+                       dbesc($arr['name']),
+                       dbesc($arr['photo']),
+                       dbesc($arr['request']),
+                       dbesc($arr['nick']),
+                       dbesc($arr['addr']),
+                       dbesc($arr['batch']),
+                       dbesc($arr['notify']),
+                       dbesc($arr['poll']),
+                       dbesc($arr['confirm']),
+                       dbesc($arr['alias']),
+                       dbesc($arr['pubkey']),
+                       dbesc(datetime_convert()),
+                       dbesc($arr['url']),
+                       dbesc($arr['network'])
+               );
+       }
+       else {
+               $r = q("insert into fcontact ( `url`,`name`,`photo`,`request`,`nick`,`addr`,
+                       `batch`, `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated` )
+                       values('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
+                       dbesc($arr['url']),
+                       dbesc($arr['name']),
+                       dbesc($arr['photo']),
+                       dbesc($arr['request']),
+                       dbesc($arr['nick']),
+                       dbesc($arr['addr']),
+                       dbesc($arr['batch']),
+                       dbesc($arr['notify']),
+                       dbesc($arr['poll']),
+                       dbesc($arr['confirm']),
+                       dbesc($arr['network']),
+                       dbesc($arr['alias']),
+                       dbesc($arr['pubkey']),
+                       dbesc(datetime_convert())
+               );
+       }
+
        return $r;
 }