<?php
-set_time_limit(0);
-ini_set('pcre.backtrack_limit', 250000);
-
-
-define ( 'FRIENDIKA_VERSION', '2.2.1029' );
+define ( 'FRIENDIKA_VERSION', '2.2.1052' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
-define ( 'DB_UPDATE_VERSION', 1073 );
+define ( 'DB_UPDATE_VERSION', 1076 );
define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
* Network and protocol family types
*/
+define ( 'NETWORK_ZOT', 'zot!'); // Zot!
define ( 'NETWORK_DFRN', 'dfrn'); // Friendika, Mistpark, other DFRN implementations
define ( 'NETWORK_OSTATUS', 'stat'); // status.net, identi.ca, GNU-social, other OStatus implementations
define ( 'NETWORK_FEED', 'feed'); // RSS/Atom feeds with no known "post/notify" protocol
define ( 'MAX_LIKERS', 75);
+/**
+ * Communication timeout
+ */
+
+define ( 'ZCURL_TIMEOUT' , (-1));
+
+
/**
* email notification options
*/
* various namespaces we may need to parse
*/
+define ( 'NAMESPACE_ZOT', 'http://purl.org/macgirvin/zot' );
define ( 'NAMESPACE_DFRN' , 'http://purl.org/macgirvin/dfrn/1.0' );
define ( 'NAMESPACE_THREAD' , 'http://purl.org/syndication/thread/1.0' );
define ( 'NAMESPACE_TOMB' , 'http://purl.org/atompub/tombstones/1.0' );
define ( 'NAMESPACE_FEED', 'http://schemas.google.com/g/2010#updates-from' );
define ( 'NAMESPACE_OSTATUS', 'http://ostatus.org/schema/1.0' );
define ( 'NAMESPACE_STATUSNET', 'http://status.net/schema/api/1/' );
-
+define ( 'NAMESPACE_ATOM1', 'http://www.w3.org/2005/Atom' );
/**
* activity stream defines
*/
*
*/
-if (get_magic_quotes_gpc()) {
- $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
- while (list($key, $val) = each($process)) {
- foreach ($val as $k => $v) {
- unset($process[$key][$k]);
- if (is_array($v)) {
- $process[$key][stripslashes($k)] = $v;
- $process[] = &$process[$key][stripslashes($k)];
- } else {
- $process[$key][stripslashes($k)] = stripslashes($v);
- }
- }
- }
- unset($process);
+function startup() {
+ error_reporting(E_ERROR | E_WARNING | E_PARSE);
+ set_time_limit(0);
+ ini_set('pcre.backtrack_limit', 250000);
+
+
+ if (get_magic_quotes_gpc()) {
+ $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
+ while (list($key, $val) = each($process)) {
+ foreach ($val as $k => $v) {
+ unset($process[$key][$k]);
+ if (is_array($v)) {
+ $process[$key][stripslashes($k)] = $v;
+ $process[] = &$process[$key][stripslashes($k)];
+ } else {
+ $process[$key][stripslashes($k)] = stripslashes($v);
+ }
+ }
+ }
+ unset($process);
+ }
+
}
/*
$this->query_string = '';
+ startup();
+
$this->scheme = ((isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'])) ? 'https' : 'http' );
if(x($_SERVER,'SERVER_NAME')) {
$this->hostname = $_SERVER['SERVER_NAME'];
-
+ if(x($_SERVER,'SERVER_PORT') && $_SERVER['SERVER_PORT'] != 80 && $_SERVER['SERVER_PORT'] != 443)
+ $this->hostname .= ':' . $_SERVER['SERVER_PORT'];
/**
* Figure out if we are running at the top of a domain
* or in a sub-directory and adjust accordingly
$s = @curl_exec($ch);
- $http_code = intval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
- $header = substr($s,0,strpos($s,"\r\n\r\n"));
- if(preg_match('/HTTP\/.+? 100/',$header)) {
- // 100 Continue has two headers, get the real one
- $s = substr($s,strlen($header)+4);
- $header = substr($s,0,strpos($s,"\r\n\r\n"));
+ $base = $s;
+ $curl_info = curl_getinfo($ch);
+ $http_code = $curl_info['http_code'];
+
+ $header = '';
+
+ // Pull out multiple headers, e.g. proxy and continuation headers
+ // allow for HTTP/2.x without fixing code
+
+ while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
+ $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
+ $header .= $chunk;
+ $base = substr($base,strlen($chunk));
}
+
if($http_code == 301 || $http_code == 302 || $http_code == 303 || $http_code == 307) {
$matches = array();
preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
return fetch_url($url,$binary,$redirects);
}
}
- $a->set_curl_code($http_code);
- $body = substr($s,strlen($header)+4);
+ $a->set_curl_code($http_code);
- /* one more try to make sure there are no more headers */
-
- if(strpos($body,'HTTP/') === 0) {
- $header = substr($body,0,strpos($body,"\r\n\r\n"));
- $body = substr($body,strlen($header)+4);
- }
+ $body = substr($s,strlen($header));
$a->set_curl_headers($header);
$curl_time = intval(get_config('system','curl_timeout'));
curl_setopt($ch, CURLOPT_TIMEOUT, (($curl_time !== false) ? $curl_time : 60));
- if(is_array($headers))
+ if(defined('LIGHTTPD')) {
+ if(!is_array($headers)) {
+ $headers = array('Expect:');
+ } else {
+ if(!in_array('Expect:', $headers)) {
+ array_push($headers, 'Expect:');
+ }
+ }
+ }
+ if($headers)
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$check_cert = get_config('system','verifyssl');
$s = @curl_exec($ch);
- $http_code = intval(curl_getinfo($ch, CURLINFO_HTTP_CODE));
- $header = substr($s,0,strpos($s,"\r\n\r\n"));
- if(preg_match('/HTTP\/.+? 100/',$header)) {
- // 100 Continue has two headers, get the real one
- $s = substr($s,strlen($header)+4);
- $header = substr($s,0,strpos($s,"\r\n\r\n"));
+ $base = $s;
+ $curl_info = curl_getinfo($ch);
+ $http_code = $curl_info['http_code'];
+
+ $header = '';
+
+ // Pull out multiple headers, e.g. proxy and continuation headers
+ // allow for HTTP/2.x without fixing code
+
+ while(preg_match('/^HTTP\/[1-2].+? [1-5][0-9][0-9]/',$base)) {
+ $chunk = substr($base,0,strpos($base,"\r\n\r\n")+4);
+ $header .= $chunk;
+ $base = substr($base,strlen($chunk));
}
+
if($http_code == 301 || $http_code == 302 || $http_code == 303) {
$matches = array();
preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
}
}
$a->set_curl_code($http_code);
- $body = substr($s,strlen($header)+4);
-
- /* one more try to make sure there are no more headers */
-
- if(strpos($body,'HTTP/') === 0) {
- $header = substr($body,0,strpos($body,"\r\n\r\n"));
- $body = substr($body,strlen($header)+4);
- }
+ $body = substr($s,strlen($header));
$a->set_curl_headers($header);
$s = preg_replace('/\[code\](.*?)\[\/code\]/sm','',$s);
- if(preg_match_all('/([@#][^ \x0D\x0A,:?]+ [^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) {
+ // Match full names against @tags including the space between first and last
+ // We will look these up afterward to see if they are full names or not recognisable.
+
+ if(preg_match_all('/(@[^ \x0D\x0A,:?]+ [^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) {
foreach($match[1] as $mtch) {
if(strstr($mtch,"]")) {
// we might be inside a bbcode color tag - leave it alone
}
}
+ // Otherwise pull out single word tags. These can be @nickname, @first_last
+ // and #hash tags.
+
if(preg_match_all('/([@#][^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) {
foreach($match[1] as $mtch) {
if(strstr($mtch,"]")) {
// we might be inside a bbcode color tag - leave it alone
continue;
}
+ // ignore strictly numeric tags like #1
+ if((strpos($mtch,'#') === 0) && ctype_digit(substr($mtch,1)))
+ continue;
if(substr($mtch,-1,1) === '.')
$ret[] = substr($mtch,0,-1);
else
}
}}
+function generate_guid() {
+ $found = true;
+ do {
+ $guid = substr(random_string(),0,16);
+ $x = q("SELECT `uid` FROM `user` WHERE `guid` = '%s' LIMIT 1",
+ dbesc($guid)
+ );
+ if(! count($x))
+ $found = false;
+ } while ($found == true );
+ return $guid;
+}
\ No newline at end of file