X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=boot.php;h=6cbb4f07c7200da51d3305c42e4d85e10cf427c6;hb=3eefe8b50003c858d4930c03cc06d2679a14347c;hp=1870e059e9eb36cf3ba9f7ff8b7d245cc143f9c1;hpb=f6ee615a79eaab03adc540704ab17b8a44a3d9e8;p=friendica.git diff --git a/boot.php b/boot.php index 1870e059e9..6cbb4f07c7 100644 --- a/boot.php +++ b/boot.php @@ -2,13 +2,24 @@ set_time_limit(0); -define ( 'BUILD_ID', 1024 ); +define ( 'BUILD_ID', 1033 ); +define ( 'FRIENDIKA_VERSION', '2.10.0902' ); define ( 'DFRN_PROTOCOL_VERSION', '2.0' ); define ( 'EOL', "
\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); define ( 'DOWN_ARROW', '⇩' ); + +/** + * SSL redirection policies + */ + +define ( 'SSL_POLICY_NONE', 0 ); +define ( 'SSL_POLICY_FULL', 1 ); +define ( 'SSL_POLICY_SELFSIGN', 2 ); + + /** * log levels */ @@ -35,6 +46,13 @@ define ( 'REL_VIP', 1); define ( 'REL_FAN', 2); define ( 'REL_BUD', 3); +/** + * Hook array order + */ + +define ( 'HOOK_HOOK', 0); +define ( 'HOOK_FILE', 1); +define ( 'HOOK_FUNCTION', 2); /** * @@ -95,7 +113,7 @@ define ( 'ACTIVITY_OBJ_HEART', NAMESPACE_DFRN . '/heart' ); define ( 'ACTIVITY_FRIEND', NAMESPACE_ACTIVITY_SCHEMA . 'make-friend' ); define ( 'ACTIVITY_FOLLOW', NAMESPACE_ACTIVITY_SCHEMA . 'follow' ); -define ( 'ACTIVITY_UNFOLLOW', NAMESPACE_ACTIVITY_SCHEMA . 'unfollow' ); +define ( 'ACTIVITY_UNFOLLOW', NAMESPACE_ACTIVITY_SCHEMA . 'stop-following' ); define ( 'ACTIVITY_POST', NAMESPACE_ACTIVITY_SCHEMA . 'post' ); define ( 'ACTIVITY_UPDATE', NAMESPACE_ACTIVITY_SCHEMA . 'update' ); define ( 'ACTIVITY_TAG', NAMESPACE_ACTIVITY_SCHEMA . 'tag' ); @@ -174,8 +192,11 @@ class App { public $pager; public $strings; public $path; + public $hooks; + public $timezone; public $interactive = true; + private $scheme; private $hostname; private $baseurl; @@ -202,14 +223,14 @@ class App { if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") $this->query_string = substr($_SERVER['QUERY_STRING'],2); if(x($_GET,'q')) - $this->cmd = trim($_GET['q'],'/'); + $this->cmd = trim($_GET['q'],'/\\'); /** * Figure out if we are running at the top of a domain * or in a sub-directory and adjust accordingly */ - $path = trim(dirname($_SERVER['SCRIPT_NAME']),'/'); + $path = trim(dirname($_SERVER['SCRIPT_NAME']),'/\\'); if(isset($path) && strlen($path) && ($path != $this->path)) $this->path = $path; @@ -259,10 +280,17 @@ class App { } function get_baseurl($ssl = false) { - if(strlen($this->baseurl)) - return $this->baseurl; - $this->baseurl = (($ssl) ? 'https' : $this->scheme) . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' ); + $scheme = $this->scheme; + + if(x($this->config,'ssl_policy')) { + if(($ssl) || ($this->config['ssl_policy'] == SSL_POLICY_FULL)) + $scheme = 'https'; + if(($this->config['ssl_policy'] == SSL_POLICY_SELFSIGN) && (local_user() || x($_POST,'auth-params'))) + $scheme = 'https'; + } + + $this->baseurl = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' ); return $this->baseurl; } @@ -298,9 +326,11 @@ class App { } function init_pagehead() { + $this->page['title'] = $this->config['sitename']; $tpl = load_view_file("view/head.tpl"); $this->page['htmlhead'] = replace_macros($tpl,array( - '$baseurl' => $this->get_baseurl() . '/' + '$baseurl' => $this->get_baseurl() . '/', + '$generator' => 'Friendika' . ' ' . FRIENDIKA_VERSION )); } @@ -370,7 +400,8 @@ function system_unavailable() { // Primarily involved with database upgrade, but also sets the // base url for use in cmdline programs which don't have -// $_SERVER variables. +// $_SERVER variables, and synchronising the state of installed plugins. + if(! function_exists('check_config')) { function check_config(&$a) { @@ -402,6 +433,70 @@ function check_config(&$a) { set_config('system','build', BUILD_ID); } } + + /** + * + * Synchronise plugins: + * + * $a->config['system']['addon'] contains a comma-separated list of names + * of plugins/addons which are used on this system. + * Go through the database list of already installed addons, and if we have + * an entry, but it isn't in the config list, call the uninstall procedure + * and mark it uninstalled in the database (for now we'll remove it). + * Then go through the config list and if we have a plugin that isn't installed, + * call the install procedure and add it to the database. + * + */ + + $r = q("SELECT * FROM `addon` WHERE `installed` = 1"); + if(count($r)) + $installed = $r; + else + $installed = array(); + + $plugins = get_config('system','addon'); + $plugins_arr = array(); + + if($plugins) + $plugins_arr = explode(',',str_replace(' ', '',$plugins)); + + $installed_arr = array(); + + if(count($installed)) { + foreach($installed as $i) { + if(! in_array($i['name'],$plugins_arr)) { + logger("Addons: uninstalling " . $i['name']); + q("DELETE FROM `addon` WHERE `id` = %d LIMIT 1", + intval($i['id']) + ); + + @include_once('addon/' . $i['name'] . '/' . $i['name'] . '.php'); + if(function_exists($i['name'] . '_uninstall')) { + $func = $i['name'] . '_uninstall'; + $func(); + } + } + else + $installed_arr[] = $i['name']; + } + } + + if(count($plugins_arr)) { + foreach($plugins_arr as $p) { + if(! in_array($p,$installed_arr)) { + logger("Addons: installing " . $p); + @include_once('addon/' . $p . '/' . $p . '.php'); + if(function_exists($p . '_install')) { + $func = $p . '_install'; + $func(); + $r = q("INSERT INTO `addon` (`name`, `installed`) VALUES ( '%s', 1 ) ", + dbesc($p) + ); + } + } + } + } + return; }} @@ -832,7 +927,6 @@ function xmlify($str) { case "'" : $buffer .= '''; break; - case "\"" : $buffer .= '"'; break; @@ -868,6 +962,11 @@ function unxmlify($s) { if(! function_exists('hex2bin')) { function hex2bin($s) { + if(! ctype_xdigit($s)) { + logger('hex2bin: illegal input: ' . print_r(debug_backtrace(), true)); + return($s); + } + return(pack("H*",$s)); }} @@ -1021,7 +1120,6 @@ if(! function_exists('set_config')) { function set_config($family,$key,$value) { global $a; - $a->config[$family][$key] = $value; if(get_config($family,$key,true) === false) { $ret = q("INSERT INTO `config` ( `cat`, `k`, `v` ) VALUES ( '%s', '%s', '%s' ) ", @@ -1038,12 +1136,32 @@ function set_config($family,$key,$value) { dbesc($family), dbesc($key) ); + + $a->config[$family][$key] = $value; + if($ret) return $value; return $ret; }} +if(! function_exists('load_pconfig')) { +function load_pconfig($uid,$family) { + global $a; + $r = q("SELECT * FROM `pconfig` WHERE `cat` = '%s' AND `uid` = %d", + dbesc($family), + intval($uid) + ); + if(count($r)) { + foreach($r as $rr) { + $k = $rr['k']; + $a->config[$uid][$family][$k] = $rr['v']; + } + } +}} + + + if(! function_exists('get_pconfig')) { function get_pconfig($uid,$family, $key, $instore = false) { @@ -1057,11 +1175,13 @@ function get_pconfig($uid,$family, $key, $instore = false) { return $a->config[$uid][$family][$key]; } } + $ret = q("SELECT `v` FROM `pconfig` WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1", intval($uid), dbesc($family), dbesc($key) ); + if(count($ret)) { $a->config[$uid][$family][$key] = $ret[0]['v']; return $ret[0]['v']; @@ -1094,7 +1214,6 @@ if(! function_exists('set_pconfig')) { function set_pconfig($uid,$family,$key,$value) { global $a; - $a->config[$uid][$family][$key] = $value; if(get_pconfig($uid,$family,$key,true) === false) { $ret = q("INSERT INTO `pconfig` ( `uid`, `cat`, `k`, `v` ) VALUES ( %d, '%s', '%s', '%s' ) ", @@ -1108,11 +1227,14 @@ function set_pconfig($uid,$family,$key,$value) { return $ret; } $ret = q("UPDATE `pconfig` SET `v` = '%s' WHERE `uid` = %d AND `cat` = '%s' AND `k` = '%s' LIMIT 1", - intval($uid), dbesc($value), + intval($uid), dbesc($family), dbesc($key) ); + + $a->config[$uid][$family][$key] = $value; + if($ret) return $value; return $ret; @@ -1389,7 +1511,7 @@ function validate_url(&$url) { $url = 'http://' . $url; $h = parse_url($url); - if(($h) && (checkdnsrr($h['host'], 'ANY'))) { + if(($h) && (dns_get_record($h['host'], DNS_A + DNS_CNAME + DNS_PTR))) { return true; } return false; @@ -1404,7 +1526,7 @@ function validate_email($addr) { return false; $h = substr($addr,strpos($addr,'@') + 1); - if(($h) && (checkdnsrr($h, 'ANY'))) { + if(($h) && (dns_get_record($h, DNS_A + DNS_CNAME + DNS_PTR + DNS_MX))) { return true; } return false; @@ -1550,7 +1672,6 @@ function attribute_contains($attr,$s) { if(! function_exists('logger')) { function logger($msg,$level = 0) { - $debugging = get_config('system','debugging'); $loglevel = intval(get_config('system','loglevel')); $logfile = get_config('system','logfile'); @@ -1582,7 +1703,12 @@ function activity_match($haystack,$needle) { if(! function_exists('get_tags')) { function get_tags($s) { $ret = array(); - if(preg_match_all('/([@#][^ \x0D\x0A,:?]*)([ \x0D\x0A,:?]|$)/',$s,$match)) { + + // ignore anything in a code block + + $s = preg_replace('/\[code\](.*?)\[\/code\]/sm','',$s); + + if(preg_match_all('/([@#][^ \x0D\x0A,:?]+)([ \x0D\x0A,:?]|$)/',$s,$match)) { foreach($match[1] as $match) { if(strstr($match,"]")) { // we might be inside a bbcode color tag - leave it alone @@ -1650,6 +1776,11 @@ if(! function_exists('contact_block')) { function contact_block() { $o = ''; $a = get_app(); + + $shown = get_pconfig($a->profile['uid'],'system','display_friend_count'); + if(! $shown) + $shown = 24; + if((! is_array($a->profile)) || ($a->profile['hide-friends'])) return $o; $r = q("SELECT COUNT(*) AS `total` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 and `pending` = 0", @@ -1662,8 +1793,9 @@ function contact_block() { $o .= '

' . t('No contacts') . '

'; return $o; } - $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 and `pending` = 0 ORDER BY RAND() LIMIT 24", - intval($a->profile['uid']) + $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 and `pending` = 0 ORDER BY RAND() LIMIT %d", + intval($a->profile['uid']), + intval($shown) ); if(count($r)) { $o .= '

' . $total . ' ' . t('Contacts') . '

'; @@ -1685,6 +1817,10 @@ function contact_block() { $o .= '
' . t('View Contacts') . '
'; } + + $arr = array('contacts' => $r, 'output' => $o); + + call_hooks('contact_block_end', $arr); return $o; }} @@ -1758,7 +1894,7 @@ function aes_encrypt($val,$ky) if(! function_exists('linkify')) { function linkify($s) { - $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'\%]*)/", ' $1', $s); + $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'\%]*)/", ' $1', $s); return($s); }} @@ -1855,7 +1991,7 @@ function profile_load(&$a, $nickname, $profile = 0) { $a->profile = $r[0]; - $a->page['title'] = $a->profile['name']; + $a->page['title'] = $a->profile['name'] . " @ " . $a->config['sitename']; $_SESSION['theme'] = $a->profile['theme']; if(! (x($a->page,'aside'))) @@ -1894,8 +2030,12 @@ function profile_sidebar($profile) { if((! is_array($profile)) && (! count($profile))) return $o; + call_hooks('profile_sidebar_enter', $profile); + $fullname = '
' . $profile['name'] . '
'; + $pdesc = '
' . $profile['pdesc'] . '
'; + $tabs = ''; $photo = '
' . $profile['name'] . '
'; @@ -1924,7 +2064,7 @@ function profile_sidebar($profile) { $gender = ((x($profile,'gender') == 1) ? '
' . t('Gender:') . ' ' . $profile['gender'] . '
' : ''); - $pubkey = ((x($profile,'key') == 1) ? '' : ''); + $pubkey = ((x($profile,'pubkey') == 1) ? '' : ''); $marital = ((x($profile,'marital') == 1) ? '
' . t('Status:') . ' ' . $profile['marital'] . '
' : ''); @@ -1934,6 +2074,7 @@ function profile_sidebar($profile) { $o .= replace_macros($tpl, array( '$fullname' => $fullname, + '$pdesc' => $pdesc, '$tabs' => $tabs, '$photo' => $photo, '$connect' => $connect, @@ -1944,5 +2085,187 @@ function profile_sidebar($profile) { '$homepage' => $homepage )); + + $arr = array('profile' => $profile, 'entry' => $o); + + call_hooks('profile_sidebar', $arr); + return $o; -}} \ No newline at end of file +}} + + +if(! function_exists('register_hook')) { +function register_hook($hook,$file,$function) { + + $r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1", + dbesc($hook), + dbesc($file), + dbesc($function) + ); + if(count($r)) + return true; + + $r = q("INSERT INTO `hook` (`hook`, `file`, `function`) VALUES ( '%s', '%s', '%s' ) ", + dbesc($hook), + dbesc($file), + dbesc($function) + ); + return $r; +}} + +if(! function_exists('unregister_hook')) { +function unregister_hook($hook,$file,$function) { + + $r = q("DELETE FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1", + dbesc($hook), + dbesc($file), + dbesc($function) + ); + return $r; +}} + + +if(! function_exists('load_hooks')) { +function load_hooks() { + $a = get_app(); + $r = q("SELECT * FROM `hook` WHERE 1"); + if(count($r)) { + foreach($r as $rr) { + $a->hooks[] = array($rr['hook'], $rr['file'], $rr['function']); + } + } +}} + + +if(! function_exists('call_hooks')) { +function call_hooks($name, &$data = null) { + $a = get_app(); + + if(count($a->hooks)) { + foreach($a->hooks as $hook) { + if($hook[HOOK_HOOK] === $name) { + @include_once($hook[HOOK_FILE]); + if(function_exists($hook[HOOK_FUNCTION])) { + $func = $hook[HOOK_FUNCTION]; + $func($a,$data); + } + } + } + } +}} + + +if(! function_exists('day_translate')) { +function day_translate($s) { + $ret = str_replace(array('Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday'), + array( t('Monday'), t('Tuesday'), t('Wednesday'), t('Thursday'), t('Friday'), t('Saturday'), t('Sunday')), + $s); + + $ret = str_replace(array('January','February','March','April','May','June','July','August','September','October','November','December'), + array( t('January'), t('February'), t('March'), t('April'), t('May'), t('June'), t('July'), t('August'), t('September'), t('October'), t('November'), t('December')), + $ret); + + return $ret; +}} + +if(! function_exists('get_birthdays')) { +function get_birthdays() { + + $a = get_app(); + $o = ''; + + if(! local_user()) + return $o; + + $bd_format = get_config('system','birthday_format'); + if(! $bd_format) + $bd_format = 'g A l F d' ; // 8 AM Friday January 18 + + $r = q("SELECT `event`.*, `event`.`id` AS `eid`, `contact`.* FROM `event` + LEFT JOIN `contact` ON `contact`.`id` = `event`.`cid` + WHERE `event`.`uid` = %d AND `type` = 'birthday' AND `start` < '%s' AND `finish` > '%s' + ORDER BY `start` DESC ", + intval(local_user()), + dbesc(datetime_convert('UTC','UTC','now + 6 days')), + dbesc(datetime_convert('UTC','UTC','now')) + ); + + if($r && count($r)) { + $o .= '
' . t('Birthdays this week:') . '
'; + $o .= '
' . t("\x28Adjusted for local time\x29") . '
'; + $o .= '
'; + + foreach($r as $rr) { + $now = strtotime('now'); + $today = (((strtotime($rr['start'] . ' +00:00') < $now) && (strtotime($rr['finish'] . ' +00:00') > $now)) ? true : false); + + $o .= '
' . $rr['name'] . ' ' + . day_translate(datetime_convert('UTC', $a->timezone, $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : '') + . '
' ; + } + + $o .= '
'; + } + + return $o; + +}} + +/** + * + * Compare two URLs to see if they are the same, but ignore + * slight but hopefully insignificant differences such as if one + * is https and the other isn't, or if one is www.something and + * the other isn't - and also ignore case differences. + * + * Return true if the URLs match, otherwise false. + * + */ + +if(! function_exists('link_compare')) { +function link_compare($a,$b) { + $a1 = str_replace(array('https:','//www.'), array('http:','//'), $a); + $b1 = str_replace(array('https:','//www.'), array('http:','//'), $b); + if(strcasecmp($a1,$b1) === 0) + return true; + return false; +}} + + +if(! function_exists('prepare_body')) { +function prepare_body($item) { + + require_once('include/bbcode.php'); + + $s = smilies(bbcode($item['body'])); + + return $s; +}} + +/** + * + * Wrap calls to proc_close(proc_open()) and call hook + * so plugins can take part in process :) + * + * args: + * $cmd program to run + * next args are passed as $cmd command line + * + * e.g.: proc_run("ls","-la","/tmp"); + * + * $cmd and string args are surrounded with "" + */ + +if(! function_exists('run_proc')) { +function proc_run($cmd){ + $args = func_get_args(); + call_hooks("proc_run", $args); + + foreach ($args as &$arg){ + if(is_string($arg)) $arg='"'.$arg.'"'; + } + $cmdline = implode($args," "); + proc_close(proc_open($cmdline." &",array(),$foo)); +}} +