]> git.mxchange.org Git - friendica.git/blobdiff - include/network.php
Merge remote branch 'upstream/master'
[friendica.git] / include / network.php
index e89eb94da24dc5b26c042a75a76b8b1cb8efb9a3..4bec4a172778db2c1c452b937787fe25a9f7aaac 100644 (file)
@@ -17,12 +17,12 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_
        
        if (!is_null($accept_content)){
                curl_setopt($ch,CURLOPT_HTTPHEADER, array (
-                       "Accept: "+$accept_content
+                       "Accept: " . $accept_content
                ));
        }
        
        @curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
-       @curl_setopt($ch, CURLOPT_USERAGENT, "Friendika");
+       @curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
 
 
        if(intval($timeout)) {
@@ -60,6 +60,7 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_
        $curl_info = @curl_getinfo($ch);
        $http_code = $curl_info['http_code'];
 
+//     logger('fetch_url:' . $http_code . ' data: ' . $s);
        $header = '';
 
        // Pull out multiple headers, e.g. proxy and continuation headers
@@ -74,11 +75,13 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_
        if($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307) {
         $matches = array();
         preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
-        $url = trim(array_pop($matches));
-        $url_parsed = @parse_url($url);
+        $newurl = trim(array_pop($matches));
+               if(strpos($newurl,'/') === 0)
+                       $newurl = $url . $newurl;
+        $url_parsed = @parse_url($newurl);
         if (isset($url_parsed)) {
             $redirects++;
-            return fetch_url($url,$binary,$redirects,$timeout);
+            return fetch_url($newurl,$binary,$redirects,$timeout);
         }
     }
 
@@ -105,7 +108,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);
@@ -163,11 +166,13 @@ function post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0)
        if($http_code == 301 || $http_code == 302 || $http_code == 303) {
         $matches = array();
         preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
-        $url = trim(array_pop($matches));
-        $url_parsed = @parse_url($url);
+        $newurl = trim(array_pop($matches));
+               if(strpos($newurl,'/') === 0)
+                       $newurl = $url . $newurl;
+        $url_parsed = @parse_url($newurl);
         if (isset($url_parsed)) {
             $redirects++;
-            return post_url($url,$params,$headers,$redirects,$timeout);
+            return fetch_url($newurl,false,$redirects,$timeout);
         }
     }
        $a->set_curl_code($http_code);
@@ -201,6 +206,7 @@ function xml_status($st, $message = '') {
 if(! function_exists('http_status_exit')) {
 function http_status_exit($val) {
 
+    $err = '';
        if($val >= 400)
                $err = 'Error';
        if($val >= 200 && $val < 300)
@@ -298,7 +304,7 @@ function webfinger_dfrn($s,&$hcard) {
 
 
 if(! function_exists('webfinger')) {
-function webfinger($s) {
+function webfinger($s, $debug = false) {
        $host = '';
        if(strstr($s,'@')) {
                $host = substr($s,strpos($s,'@') + 1);
@@ -323,7 +329,7 @@ function webfinger($s) {
 }}
 
 if(! function_exists('lrdd')) {
-function lrdd($uri) {
+function lrdd($uri, $debug = false) {
 
        $a = get_app();
 
@@ -359,6 +365,9 @@ function lrdd($uri) {
 
        logger('lrdd: host_meta: ' . $xml, LOGGER_DATA);
 
+       if(! stristr($xml,'<xrd'))
+               return array();
+
        $h = parse_xml_string($xml);
        if(! $h)
                return array();
@@ -444,7 +453,7 @@ function lrdd($uri) {
                        logger('lrdd: parse error: ' . $e);
                }
 
-               if($dom) {
+               if(isset($dom) && $dom) {
                        $items = $dom->getElementsByTagName('link');
                        foreach($items as $item) {
                                $x = $item->getAttribute('rel');
@@ -535,6 +544,9 @@ function fetch_xrd_links($url) {
        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();
@@ -576,10 +588,14 @@ function fetch_xrd_links($url) {
 
 if(! function_exists('validate_url')) {
 function validate_url(&$url) {
+       
+       // no naked subdomains (allow localhost for tests)
+       if(strpos($url,'.') === false && strpos($url,'/localhost/') === false)
+               return false;
        if(substr($url,0,4) != 'http')
                $url = 'http://' . $url;
        $h = @parse_url($url);
-
+       
        if(($h) && (dns_get_record($h['host'], DNS_A + DNS_CNAME + DNS_PTR))) {
                return true;
        }
@@ -678,18 +694,23 @@ function allowed_email($email) {
 }}
 
 
-if(! function_exists('gravatar_img')) {
-function gravatar_img($email) {
-       $size = 175;
-       $opt = 'identicon';   // psuedo-random geometric pattern if not found
-       $rating = 'pg';
-       $hash = md5(trim(strtolower($email)));
-       
-       $url = 'http://www.gravatar.com/avatar/' . $hash . '.jpg' 
-               . '?s=' . $size . '&d=' . $opt . '&r=' . $rating;
+if(! function_exists('avatar_img')) {
+function avatar_img($email) {
 
-       logger('gravatar: ' . $email . ' ' . $url);
-       return $url;
+       $a = get_app();
+
+       $avatar['size'] = 175;
+       $avatar['email'] = $email;
+       $avatar['url'] = '';
+       $avatar['success'] = false;
+
+       call_hooks('avatar_lookup', $avatar);
+
+       if(! $avatar['success'])
+               $avatar['url'] = $a->get_baseurl() . '/images/person-175.jpg';
+
+       logger('Avatar: ' . $avatar['email'] . ' ' . $avatar['url'], LOGGER_DEBUG);
+       return $avatar['url'];
 }}
 
 
@@ -770,3 +791,88 @@ function add_fcontact($arr,$update = false) {
 
        return $r;
 }
+
+
+function scale_external_images($s,$include_link = true) {
+
+       $a = get_app();
+
+       $matches = null;
+       $c = preg_match_all('/\[img\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
+       if($c) {
+               require_once('include/Photo.php');
+               foreach($matches as $mtch) {
+                       logger('scale_external_image: ' . $mtch[1]);
+                       $hostname = str_replace('www.','',substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3));
+                       if(stristr($mtch[1],$hostname))
+                               continue;
+                       $i = fetch_url($mtch[1]);
+                       if($i) {
+                               $ph = new Photo($i);
+                               if($ph->is_valid()) {
+                                       $orig_width = $ph->getWidth();
+                                       $orig_height = $ph->getHeight();
+
+                                       if($orig_width > 640 || $orig_height > 640) {
+
+                                               $ph->scaleImage(640);
+                                               $new_width = $ph->getWidth();
+                                               $new_height = $ph->getHeight();
+                                               logger('scale_external_images: ' . $orig_width . '->' . $new_width . 'w ' . $orig_height . '->' . $new_height . 'h' . ' match: ' . $mtch[0], LOGGER_DEBUG);
+                                               $s = str_replace($mtch[0],'[img=' . $new_width . 'x' . $new_height. ']' . $mtch[1] . '[/img]'
+                                                       . "\n" . (($include_link) 
+                                                               ? '[url=' . $mtch[1] . ']' . t('view full size') . '[/url]' . "\n"
+                                                               : ''),$s);
+                                               logger('scale_external_images: new string: ' . $s, LOGGER_DEBUG);
+                                       }
+                               }
+                       }
+               }
+       }
+       return $s;
+}
+
+
+function fix_contact_ssl_policy(&$contact,$new_policy) {
+
+       $ssl_changed = false;
+       if((intval($new_policy) == SSL_POLICY_SELFSIGN || $new_policy === 'self') && strstr($contact['url'],'https:')) {
+               $ssl_changed = true;
+               $contact['url']     =   str_replace('https:','http:',$contact['url']);
+               $contact['request'] =   str_replace('https:','http:',$contact['request']);
+               $contact['notify']  =   str_replace('https:','http:',$contact['notify']);
+               $contact['poll']    =   str_replace('https:','http:',$contact['poll']);
+               $contact['confirm'] =   str_replace('https:','http:',$contact['confirm']);
+               $contact['poco']    =   str_replace('https:','http:',$contact['poco']);
+       }
+
+       if((intval($new_policy) == SSL_POLICY_FULL || $new_policy === 'full') && strstr($contact['url'],'http:')) {
+               $ssl_changed = true;
+               $contact['url']     =   str_replace('http:','https:',$contact['url']);
+               $contact['request'] =   str_replace('http:','https:',$contact['request']);
+               $contact['notify']  =   str_replace('http:','https:',$contact['notify']);
+               $contact['poll']    =   str_replace('http:','https:',$contact['poll']);
+               $contact['confirm'] =   str_replace('http:','https:',$contact['confirm']);
+               $contact['poco']    =   str_replace('http:','https:',$contact['poco']);
+       }
+
+       if($ssl_changed) {
+               q("update contact set 
+                       url = '%s', 
+                       request = '%s',
+                       notify = '%s',
+                       poll = '%s',
+                       confirm = '%s',
+                       poco = '%s'
+                       where id = %d limit 1",
+                       dbesc($contact['url']),
+                       dbesc($contact['request']),
+                       dbesc($contact['notify']),
+                       dbesc($contact['poll']),
+                       dbesc($contact['confirm']),
+                       dbesc($contact['poco']),
+                       intval($contact['id'])
+               );
+       }
+}
+