aboutsummaryrefslogtreecommitdiffstats
path: root/include/network.php
diff options
context:
space:
mode:
Diffstat (limited to 'include/network.php')
-rw-r--r--include/network.php200
1 files changed, 124 insertions, 76 deletions
diff --git a/include/network.php b/include/network.php
index 555e76802..8b9a8a6a6 100644
--- a/include/network.php
+++ b/include/network.php
@@ -1,4 +1,4 @@
-<?php
+<?php /** @file */
@@ -6,10 +6,20 @@ function get_capath() {
return appdirpath() . '/library/cacert.pem';
}
+
+
// curl wrapper. If binary flag is true, return binary
// results.
-if(! function_exists('fetch_url')) {
+/**
+ * fetch_url is deprecated and being replaced by the more capable z_fetch_url
+ * please use that function instead.
+ * Once all occurrences of fetch_url are removed from the codebase we will
+ * remove this function and perhaps rename z_fetch_url back to fetch_url
+ */
+
+
+
function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_content=Null) {
$a = get_app();
@@ -28,8 +38,7 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_
}
@curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- //@curl_setopt($ch, CURLOPT_USERAGENT, "Friendica");
- @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Friendica)");
+ @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Red)");
if(intval($timeout)) {
@@ -98,11 +107,11 @@ function fetch_url($url,$binary = false, &$redirects = 0, $timeout = 0, $accept_
$a->set_curl_headers($header);
@curl_close($ch);
return($body);
-}}
+}
// post request to $url. $params is an array of post variables.
-if(! function_exists('post_url')) {
+
function post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0) {
$a = get_app();
$ch = curl_init($url);
@@ -114,7 +123,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, "Friendica");
+ curl_setopt($ch, CURLOPT_USERAGENT, "Red");
if(intval($timeout)) {
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
@@ -193,9 +202,29 @@ function post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0)
curl_close($ch);
return($body);
-}}
+}
+
+/**
+ * @function z_fetch_url
+ * @param string $url
+ * URL to fetch
+ * @param boolean $binary = false
+ * TRUE if asked to return binary results (file download)
+ * @param int $redirects = 0
+ * internal use, recursion counter
+ * @param array $opts (optional parameters)
+ * 'accept_content' => supply Accept: header with 'accept_content' as the value
+ * 'timeout' => int seconds, default system config value or 60 seconds
+ * 'http_auth' => username:password
+ * 'novalidate' => do not validate SSL certs, default is to validate using our CA list
+ *
+ * @returns array
+ * 'return_code' => HTTP return code or 0 if timeout or failure
+ * 'success' => boolean true (if HTTP 2xx result) or false
+ * 'header' => HTTP headers
+ * 'body' => fetched content
+ */
-if(! function_exists('z_fetch_url')) {
function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
$ret = array('return_code' => 0, 'success' => false, 'header' => "", 'body' => "");
@@ -210,7 +239,7 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
@curl_setopt($ch, CURLOPT_CAINFO, get_capath());
@curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
- @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Friendica Red)");
+ @curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (compatible; Red)");
if (x($opts,'accept_content')){
curl_setopt($ch,CURLOPT_HTTPHEADER, array (
@@ -231,6 +260,10 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
@curl_setopt($ch, CURLOPT_USERPWD, $opts['http_auth']);
}
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
+ ((x($opts,'novalidate') && intval($opts['novalidate'])) ? false : true));
+
+
$prx = get_config('system','proxy');
if(strlen($prx)) {
@curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);
@@ -283,12 +316,12 @@ function z_fetch_url($url, $binary = false, $redirects = 0, $opts = array()) {
$ret['header'] = $header;
@curl_close($ch);
return($ret);
-}}
+}
+
-if(! function_exists('z_post_url')) {
-function z_post_url($url,$params, $headers = null, $redirects = 0, $timeout = 0) {
+function z_post_url($url,$params, $redirects = 0, $opts = array()) {
$ret = array('return_code' => 0, 'success' => false, 'header' => "", 'body' => "");
@@ -301,30 +334,30 @@ function z_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, "Friendica");
+ curl_setopt($ch, CURLOPT_USERAGENT, "Red");
- if(intval($timeout)) {
- curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
+
+ if (x($opts,'accept_content')){
+ curl_setopt($ch,CURLOPT_HTTPHEADER, array (
+ "Accept: " . $opts['accept_content']
+ ));
+ }
+
+ if(x($opts,'timeout') && intval($opts['timeout'])) {
+ @curl_setopt($ch, CURLOPT_TIMEOUT, $opts['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));
}
- if(defined('LIGHTTPD')) {
- if(!is_array($headers)) {
- $headers = array('Expect:');
- } else {
- if(!in_array('Expect:', $headers)) {
- array_push($headers, 'Expect:');
- }
- }
+ if(x($opts,'http_auth')) {
+ // "username" . ':' . "password"
+ @curl_setopt($ch, CURLOPT_USERPWD, $opts['http_auth']);
}
- if($headers)
- curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
-
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
+ @curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,
+ ((x($opts,'novalidate') && intval($opts['novalidate'])) ? false : true));
$prx = get_config('system','proxy');
if(strlen($prx)) {
@@ -365,9 +398,9 @@ function z_post_url($url,$params, $headers = null, $redirects = 0, $timeout = 0)
if (isset($url_parsed)) {
curl_close($ch);
if($http_code == 303) {
- return z_fetch_url($newurl,false,$headers,$redirects++,$timeout);
+ return z_fetch_url($newurl,false,$redirects++,$opts);
} else {
- return z_post_url($newurl,$params,$headers,$redirects++,$timeout);
+ return z_post_url($newurl,$params,$redirects++,$opts);
}
}
}
@@ -378,7 +411,7 @@ function z_post_url($url,$params, $headers = null, $redirects = 0, $timeout = 0)
$ret['header'] = $header;
curl_close($ch);
return($ret);
-}}
+}
@@ -394,7 +427,7 @@ function json_return_and_die($x) {
// Outputs a basic dfrn XML status structure to STDOUT, with a <status> variable
// of $st and an optional text <message> of $message and terminates the current process.
-if(! function_exists('xml_status')) {
+
function xml_status($st, $message = '') {
$xml_message = ((strlen($message)) ? "\t<message>" . xmlify($message) . "</message>\r\n" : '');
@@ -406,29 +439,37 @@ function xml_status($st, $message = '') {
echo '<?xml version="1.0" encoding="UTF-8"?>'."\r\n";
echo "<result>\r\n\t<status>$st</status>\r\n$xml_message</result>\r\n";
killme();
-}}
-
+}
-if(! function_exists('http_status_exit')) {
-function http_status_exit($val) {
+/**
+ * @function http_status_exit
+ *
+ * Send HTTP status header and exit
+ * @param int $val
+ * integer HTTP status result value
+ * @param string $msg
+ * optional message
+ * @returns (does not return, process is terminated)
+ */
+
+function http_status_exit($val,$msg = '') {
$err = '';
if($val >= 400)
- $err = 'Error';
+ $msg = (($msg) ? $msg : 'Error');
if($val >= 200 && $val < 300)
- $err = 'OK';
+ $msg = (($msg) ? $msg : 'OK');
- logger('http_status_exit ' . $val);
- header($_SERVER["SERVER_PROTOCOL"] . ' ' . $val . ' ' . $err);
+ logger('http_status_exit ' . $val . ' ' . $msg);
+ header($_SERVER['SERVER_PROTOCOL'] . ' ' . $val . ' ' . $msg);
killme();
-
-}}
+}
// convert an XML document to a normalised, case-corrected array
// used by webfinger
-if(! function_exists('convert_xml_element_to_array')) {
+
function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
// If we're getting too deep, bail out
@@ -468,7 +509,7 @@ function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
} else {
return (trim(strval($xml_element)));
}
-}}
+}
// Given an email style address, perform webfinger lookup and
// return the resulting DFRN profile URL, or if no DFRN profile URL
@@ -482,7 +523,7 @@ function convert_xml_element_to_array($xml_element, &$recursion_depth=0) {
// 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,&$hcard) {
if(! strstr($s,'@')) {
return $s;
@@ -502,14 +543,14 @@ function webfinger_dfrn($s,&$hcard) {
}
}
return $profile_link;
-}}
+}
// Given an email style address, perform webfinger lookup and
// return the array of link attributes from the personal XRD file.
// On error/failure return an empty array.
-if(! function_exists('webfinger')) {
+
function webfinger($s, $debug = false) {
$host = '';
if(strstr($s,'@')) {
@@ -532,9 +573,9 @@ function webfinger($s, $debug = false) {
}
}
return array();
-}}
+}
+
-if(! function_exists('lrdd')) {
function lrdd($uri, $debug = false) {
$a = get_app();
@@ -702,7 +743,7 @@ function lrdd($uri, $debug = false) {
return array();
-}}
+}
@@ -710,7 +751,7 @@ function lrdd($uri, $debug = false) {
// host. Returns the LRDD template or an empty string on
// error/failure.
-if(! function_exists('fetch_lrdd_template')) {
+
function fetch_lrdd_template($host) {
$tpl = '';
@@ -732,13 +773,13 @@ function fetch_lrdd_template($host) {
if(! strpos($tpl,'{uri}'))
$tpl = '';
return $tpl;
-}}
+}
// Given a URL, retrieve the page as an XRD document.
// Return an array of links.
// on error/failure return empty array.
-if(! function_exists('fetch_xrd_links')) {
+
function fetch_xrd_links($url) {
$xrd_timeout = intval(get_config('system','xrd_timeout'));
@@ -783,14 +824,14 @@ function fetch_xrd_links($url) {
return $links;
-}}
+}
// Take a URL from the wild, prepend http:// if necessary
// and check DNS to see if it's real (or check if is a valid IP address)
// return true if it's OK, false if something is wrong with it
-if(! function_exists('validate_url')) {
+
function validate_url(&$url) {
// no naked subdomains (allow localhost for tests)
@@ -804,11 +845,11 @@ function validate_url(&$url) {
return true;
}
return false;
-}}
+}
// checks that email is an actual resolvable internet address
-if(! function_exists('validate_email')) {
+
function validate_email($addr) {
if(get_config('system','disable_email_validation'))
@@ -822,14 +863,14 @@ function validate_email($addr) {
return true;
}
return false;
-}}
+}
// Check $url against our list of allowed sites,
// wildcards allowed. If allowed_sites is unset return true;
// If url is allowed, return true.
// otherwise, return false
-if(! function_exists('allowed_url')) {
+
function allowed_url($url) {
$h = @parse_url($url);
@@ -864,14 +905,14 @@ function allowed_url($url) {
}
}
return $found;
-}}
+}
// check if email address is allowed to register here.
// Compare against our list (wildcards allowed).
// Returns false if not allowed, true if allowed or if
// allowed list is not configured.
-if(! function_exists('allowed_email')) {
+
function allowed_email($email) {
@@ -898,10 +939,10 @@ function allowed_email($email) {
}
}
return $found;
-}}
+}
+
-if(! function_exists('avatar_img')) {
function avatar_img($email) {
$a = get_app();
@@ -918,10 +959,10 @@ function avatar_img($email) {
logger('Avatar: ' . $avatar['email'] . ' ' . $avatar['url'], LOGGER_DEBUG);
return $avatar['url'];
-}}
+}
+
-if(! function_exists('parse_xml_string')) {
function parse_xml_string($s,$strict = true) {
if($strict) {
if(! strstr($s,'<?xml'))
@@ -940,7 +981,7 @@ function parse_xml_string($s,$strict = true) {
libxml_clear_errors();
}
return $x;
-}}
+}
function add_fcontact($arr,$update = false) {
@@ -1008,14 +1049,21 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
$s = htmlspecialchars_decode($s);
$matches = null;
- $c = preg_match_all('/\[img.*?\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
+ $c = preg_match_all('/\[img(.*?)\](.*?)\[\/img\]/ism',$s,$matches,PREG_SET_ORDER);
if($c) {
- require_once('include/Photo.php');
+ require_once('include/photo/photo_driver.php');
+
foreach($matches as $mtch) {
- logger('scale_external_image: ' . $mtch[1]);
+ logger('scale_external_image: ' . $mtch[1] . ' ' . $mtch[2]);
+
+ if(substr($mtch[1],0,1) == '=') {
+ $owidth = intval(substr($mtch[1],1));
+ if(intval($owidth) > 0 && intval($owidth) < 640)
+ continue;
+ }
$hostname = str_replace('www.','',substr($a->get_baseurl(),strpos($a->get_baseurl(),'://')+3));
- if(stristr($mtch[1],$hostname))
+ if(stristr($mtch[2],$hostname))
continue;
// $scale_replace, if passed, is an array of two elements. The
@@ -1024,9 +1072,9 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
// This allows Friendica to display the smaller remote image if
// one exists, while still linking to the full-size image
if($scale_replace)
- $scaled = str_replace($scale_replace[0], $scale_replace[1], $mtch[1]);
+ $scaled = str_replace($scale_replace[0], $scale_replace[1], $mtch[2]);
else
- $scaled = $mtch[1];
+ $scaled = $mtch[2];
$i = fetch_url($scaled);
$cache = get_config('system','itemcache');
@@ -1036,10 +1084,10 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
}
// guess mimetype from headers or filename
- $type = guess_image_type($mtch[1],true);
+ $type = guess_image_type($mtch[2],true);
if($i) {
- $ph = new Photo($i, $type);
+ $ph = photo_factory($i, $type);
if($ph->is_valid()) {
$orig_width = $ph->getWidth();
$orig_height = $ph->getHeight();
@@ -1052,7 +1100,7 @@ function scale_external_images($s, $include_link = true, $scale_replace = false)
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. ']' . $scaled . '[/img]'
. "\n" . (($include_link)
- ? '[url=' . $mtch[1] . ']' . t('view full size') . '[/url]' . "\n"
+ ? '[zrl=' . $mtch[2] . ']' . t('view full size') . '[/zrl]' . "\n"
: ''),$s);
logger('scale_external_images: new string: ' . $s, LOGGER_DEBUG);
}