]> git.mxchange.org Git - friendica.git/blobdiff - boot.php
Merge pull request #788 from annando/master
[friendica.git] / boot.php
index 9fd9b2c6484f36b0c98f0fdd503192f348534c29..418d46e5a2cb658d334f77f0b5f722cff35575dd 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -12,10 +12,9 @@ require_once('library/Mobile_Detect/Mobile_Detect.php');
 require_once('include/features.php');
 
 define ( 'FRIENDICA_PLATFORM',     'Friendica');
-define ( 'FRIENDICA_VERSION',      '3.1.1575' );
+define ( 'FRIENDICA_VERSION',      '3.2' );
 define ( 'DFRN_PROTOCOL_VERSION',  '2.23'    );
-define ( 'DB_UPDATE_VERSION',      1157      );
-
+define ( 'DB_UPDATE_VERSION',      1163      );
 define ( 'EOL',                    "<br />\r\n"     );
 define ( 'ATOM_TIME',              'Y-m-d\TH:i:s\Z' );
 
@@ -140,6 +139,8 @@ define ( 'NETWORK_LINKEDIN',         'lnkd');    // LinkedIn
 define ( 'NETWORK_XMPP',             'xmpp');    // XMPP
 define ( 'NETWORK_MYSPACE',          'mysp');    // MySpace
 define ( 'NETWORK_GPLUS',            'goog');    // Google+
+define ( 'NETWORK_PUMPIO',           'pump');    // pump.io
+define ( 'NETWORK_TWITTER',          'twit');    // Twitter
 
 define ( 'NETWORK_PHANTOM',          'unkn');    // Place holder
 
@@ -162,6 +163,8 @@ $netgroup_ids = array(
        NETWORK_XMPP     => (-10),
        NETWORK_MYSPACE  => (-11),
        NETWORK_GPLUS    => (-12),
+       NETWORK_PUMPIO   => (-13),
+       NETWORK_TWITTER  => (-14),
 
        NETWORK_PHANTOM  => (-127),
 );
@@ -204,10 +207,12 @@ define ( 'NOTIFY_SYSTEM',   0x8000 );
 
 define ( 'TERM_UNKNOWN',   0 );
 define ( 'TERM_HASHTAG',   1 );
-define ( 'TERM_MENTION',   2 );   
+define ( 'TERM_MENTION',   2 );
 define ( 'TERM_CATEGORY',  3 );
 define ( 'TERM_PCATEGORY', 4 );
 define ( 'TERM_FILE',      5 );
+define ( 'TERM_SAVEDSEARCH', 6 );
+define ( 'TERM_CONVERSATION', 7 );
 
 define ( 'TERM_OBJ_POST',  1 );
 define ( 'TERM_OBJ_PHOTO', 2 );
@@ -284,7 +289,7 @@ define ( 'GRAVITY_COMMENT',      6);
  */
 
 function startup() {
-       
+
        error_reporting(E_ERROR | E_WARNING | E_PARSE);
 
        set_time_limit(0);
@@ -355,7 +360,8 @@ if(! class_exists('App')) {
                public  $identities;
                public  $is_mobile;
                public  $is_tablet;
-       
+               public  $performance = array();
+
                public $nav_sel;
 
                public $category;
@@ -381,11 +387,22 @@ if(! class_exists('App')) {
                        'force_max_items' => 0,
                        'thread_allow' => true,
                        'stylesheet' => '',
-                       'template_engine' => 'internal',
+                       'template_engine' => 'smarty3',
                );
 
-               public $smarty3_ldelim = '{{';
-               public $smarty3_rdelim = '}}';
+               // array of registered template engines ('name'=>'class name')
+               public $template_engines = array();
+               // array of instanced template engines ('name'=>'instance')
+               public $template_engine_instance = array();
+
+               private $ldelim = array(
+                       'internal' => '',
+                       'smarty3' => '{{'
+               );
+               private $rdelim = array(
+                       'internal' => '',
+                       'smarty3' => '}}'
+               );
 
                private $scheme;
                private $hostname;
@@ -393,19 +410,32 @@ if(! class_exists('App')) {
                private $db;
 
                private $curl_code;
+               private $curl_content_type;
                private $curl_headers;
 
                private $cached_profile_image;
                private $cached_profile_picdate;
-                                                       
+
                function __construct() {
 
                        global $default_timezone, $argv, $argc;
 
+                       if (file_exists(".htpreconfig.php"))
+                               @include(".htpreconfig.php");
+
                        $this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
 
                        date_default_timezone_set($this->timezone);
 
+                       $this->performance["start"] = microtime(true);
+                       $this->performance["database"] = 0;
+                       $this->performance["network"] = 0;
+                       $this->performance["file"] = 0;
+                       $this->performance["rendering"] = 0;
+                       $this->performance["parser"] = 0;
+                       $this->performance["marktime"] = 0;
+                       $this->performance["markstart"] = microtime(true);
+
                        $this->config = array();
                        $this->page = array();
                        $this->pager= array();
@@ -414,11 +444,19 @@ if(! class_exists('App')) {
 
                        startup();
 
+                       set_include_path(
+                                       'include' . PATH_SEPARATOR
+                                       . 'library' . PATH_SEPARATOR
+                                       . 'library/phpsec' . PATH_SEPARATOR
+                                       . 'library/langdet' . PATH_SEPARATOR
+                                       . '.' );
+
+
                        $this->scheme = 'http';
                        if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
                                $this->scheme = 'https';
                        elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
-                       $this->scheme = 'https';
+                               $this->scheme = 'https';
 
                        if(x($_SERVER,'SERVER_NAME')) {
                                $this->hostname = $_SERVER['SERVER_NAME'];
@@ -443,19 +481,16 @@ if(! class_exists('App')) {
                                if(isset($path) && strlen($path) && ($path != $this->path))
                                        $this->path = $path;
                        }
+
+                       if ($hostname != "")
+                               $this->hostname = $hostname;
+
                        if (is_array($argv) && $argc>1 && substr(end($argv), 0, 4)=="http" ) {
                                $this->set_baseurl(array_pop($argv) );
                                $argc --;
                        }
 
-                       set_include_path(
-                                       "include/$this->hostname" . PATH_SEPARATOR
-                                       . 'include' . PATH_SEPARATOR
-                                       . 'library' . PATH_SEPARATOR
-                                       . 'library/phpsec' . PATH_SEPARATOR
-                                       . 'library/langdet' . PATH_SEPARATOR
-                                       . '.' );
-            
+                       set_include_path("include/$this->hostname" . PATH_SEPARATOR . get_include_path());
 
                        if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") {
                                $this->query_string = substr($_SERVER['QUERY_STRING'],2);
@@ -522,6 +557,17 @@ if(! class_exists('App')) {
                        $mobile_detect = new Mobile_Detect();
                        $this->is_mobile = $mobile_detect->isMobile();
                        $this->is_tablet = $mobile_detect->isTablet();
+
+                       /**
+                        * register template engines
+                        */
+                       $dc = get_declared_classes();
+                       foreach ($dc as $k) {
+                               if (in_array("ITemplateEngine", class_implements($k))){
+                                       $this->register_template_engine($k);
+                               }
+                       }
+
                }
 
                function get_basepath() {
@@ -600,7 +646,11 @@ if(! class_exists('App')) {
                function set_pager_itemspage($n) {
                        $this->pager['itemspage'] = ((intval($n) > 0) ? intval($n) : 0);
                        $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
+               }
 
+               function set_pager_page($n) {
+                       $this->pager['page'] = $n;
+                       $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
                }
 
                function init_pagehead() {
@@ -616,17 +666,17 @@ if(! class_exists('App')) {
                         */
                        if(!isset($this->page['htmlhead']))
                                $this->page['htmlhead'] = '';
-                       $tpl = get_markup_template('head.tpl');
 
                        // If we're using Smarty, then doing replace_macros() will replace
                        // any unrecognized variables with a blank string. Since we delay
                        // replacing $stylesheet until later, we need to replace it now
                        // with another variable name
                        if($this->theme['template_engine'] === 'smarty3')
-                               $stylesheet = $this->smarty3_ldelim . '$stylesheet' . $this->smarty3_rdelim;
+                               $stylesheet = $this->get_template_ldelim('smarty3') . '$stylesheet' . $this->get_template_rdelim('smarty3');
                        else
                                $stylesheet = '$stylesheet';
 
+                       $tpl = get_markup_template('head.tpl');
                        $this->page['htmlhead'] = replace_macros($tpl,array(
                                '$baseurl' => $this->get_baseurl(), // FIXME for z_path!!!!
                                '$local_user' => local_user(),
@@ -657,6 +707,14 @@ if(! class_exists('App')) {
                        return $this->curl_code;
                }
 
+               function set_curl_content_type($content_type) {
+                       $this->curl_content_type = $content_type;
+               }
+
+               function get_curl_content_type() {
+                       return $this->curl_content_type;
+               }
+
                function set_curl_headers($headers) {
                        $this->curl_headers = $headers;
                }
@@ -688,6 +746,95 @@ if(! class_exists('App')) {
                }
 
 
+               /**
+                * register template engine class
+                * if $name is "", is used class static property $class::$name
+                * @param string $class
+                * @param string $name
+                */
+               function register_template_engine($class, $name = '') {
+                       if ($name===""){
+                               $v = get_class_vars( $class );
+                               if(x($v,"name")) $name = $v['name'];
+                       }
+                       if ($name===""){
+                               echo "template engine <tt>$class</tt> cannot be registered without a name.\n";
+                               killme(); 
+                       }
+                       $this->template_engines[$name] = $class;
+               }
+
+               /**
+                * return template engine instance. If $name is not defined,
+                * return engine defined by theme, or default
+                * 
+                * @param strin $name Template engine name
+                * @return object Template Engine instance
+                */
+               function template_engine($name = ''){
+                       if ($name!=="") {
+                               $template_engine = $name;
+                       } else {
+                               $template_engine = 'smarty3';
+                               if (x($this->theme, 'template_engine')) {
+                                       $template_engine = $this->theme['template_engine'];
+                               }
+                       }
+
+                       if (isset($this->template_engines[$template_engine])){
+                               if(isset($this->template_engine_instance[$template_engine])){
+                                       return $this->template_engine_instance[$template_engine];
+                               } else {
+                                       $class = $this->template_engines[$template_engine];
+                                       $obj = new $class;
+                                       $this->template_engine_instance[$template_engine] = $obj;
+                                       return $obj;
+                               }
+                       }
+
+                       echo "template engine <tt>$template_engine</tt> is not registered!\n"; killme();
+               }
+
+               function get_template_engine() {
+                       return $this->theme['template_engine'];
+               }
+
+               function set_template_engine($engine = 'smarty3') {
+                       $this->theme['template_engine'] = $engine;
+                       /*
+                       $this->theme['template_engine'] = 'smarty3';
+
+                       switch($engine) {
+                               case 'smarty3':
+                                       if(is_writable('view/smarty3/'))
+                                               $this->theme['template_engine'] = 'smarty3';
+                                       break;
+                               default:
+                                       break;
+                       }
+                       */
+               }
+
+               function get_template_ldelim($engine = 'smarty3') {
+                       return $this->ldelim[$engine];
+               }
+
+               function get_template_rdelim($engine = 'smarty3') {
+                       return $this->rdelim[$engine];
+               }
+
+               function save_timestamp($stamp, $value) {
+                       $duration = (float)(microtime(true)-$stamp);
+
+                       $this->performance[$value] += (float)$duration;
+                       $this->performance["marktime"] += (float)$duration;
+               }
+
+               function mark_timestamp($mark) {
+                       //$this->performance["markstart"] -= microtime(true) - $this->performance["marktime"];
+                       $this->performance["markstart"] = microtime(true) - $this->performance["markstart"] - $this->performance["marktime"];
+               }
+
        }
 }
 
@@ -772,18 +919,26 @@ function is_ajax() {
        return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
 }
 
+function check_db() {
 
-// Primarily involved with database upgrade, but also sets the
-// base url for use in cmdline programs which don't have
-// $_SERVER variables, and synchronising the state of installed plugins.
+       $build = get_config('system','build');
+       if(! x($build)) {
+               set_config('system','build',DB_UPDATE_VERSION);
+               $build = DB_UPDATE_VERSION;
+       }
+       if($build != DB_UPDATE_VERSION)
+               proc_run('php', 'include/dbupdate.php');
+
+}
 
 
-if(! function_exists('check_config')) {
-       function check_config(&$a) {
 
-               $build = get_config('system','build');
-               if(! x($build))
-                       $build = set_config('system','build',DB_UPDATE_VERSION);
+
+// Sets the base url for use in cmdline programs which don't have
+// $_SERVER variables
+
+if(! function_exists('check_url')) {
+       function check_url(&$a) {
 
                $url = get_config('system','url');
 
@@ -798,6 +953,19 @@ if(! function_exists('check_config')) {
                if((! link_compare($url,$a->get_baseurl())) && (! preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/",$a->get_hostname)))
                        $url = set_config('system','url',$a->get_baseurl());
 
+               return;
+       }
+}
+
+
+// Automatic database updates
+
+if(! function_exists('update_db')) {
+       function update_db(&$a) {
+
+               $build = get_config('system','build');
+               if(! x($build))
+                       $build = set_config('system','build',DB_UPDATE_VERSION);
 
                if($build != DB_UPDATE_VERSION) {
                        $stored = intval($build);
@@ -847,9 +1015,10 @@ if(! function_exists('check_config')) {
                                                                        '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
                                                                ));
                                                                $subject=sprintf(t('Update Error at %s'), $a->get_baseurl());
-                                                                       
+                                                               require_once('include/email.php');
+                                                               $subject = email_header_encode($subject,'UTF-8');
                                                                mail($a->config['admin_email'], $subject, $email_msg,
-                                                                       'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
+                                                                       'From: ' . 'Administrator' . '@' . $_SERVER['SERVER_NAME'] . "\n"
                                                                        . 'Content-type: text/plain; charset=UTF-8' . "\n"
                                                                        . 'Content-transfer-encoding: 8bit' );
                                                                //try the logger
@@ -859,13 +1028,21 @@ if(! function_exists('check_config')) {
                                                        else {
                                                                set_config('database','update_' . $x, 'success');
                                                                set_config('system','build', $x + 1);
-                                                       }                                                               
+                                                       }
                                                }
                                        }
                                }
                        }
                }
 
+               return;
+       }
+}
+
+
+if(! function_exists('check_plugins')) {
+       function check_plugins(&$a) {
+
                /**
                 *
                 * Synchronise plugins:
@@ -1107,6 +1284,10 @@ if(! function_exists('get_max_import_size')) {
  * Profile information is placed in the App structure for later retrieval.
  * Honours the owner's chosen theme for display.
  *
+ * IMPORTANT: Should only be run in the _init() functions of a module. That ensures that
+ * the theme is chosen before the _init() function of a theme is run, which will usually
+ * load a lot of theme-specific content
+ *
  */
 
 if(! function_exists('profile_load')) {
@@ -1115,7 +1296,7 @@ if(! function_exists('profile_load')) {
                $user = q("select uid from user where nickname = '%s' limit 1",
                        dbesc($nickname)
                );
-               
+
                if(! ($user && count($user))) {
                        logger('profile error: ' . $a->query_string, LOGGER_DEBUG);
                        notice( t('Requested account is not available.') . EOL );
@@ -1137,7 +1318,7 @@ if(! function_exists('profile_load')) {
                }
 
                $r = null;
-                          
+
                if($profile) {
                        $profile_int = intval($profile);
                        $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `contact`.`avatar-date` AS picdate, `user`.* FROM `profile`
@@ -1161,12 +1342,12 @@ if(! function_exists('profile_load')) {
                        $a->error = 404;
                        return;
                }
-       
+
                // fetch user tags if this isn't the default profile
 
                if(! $r[0]['is-default']) {
                        $x = q("select `pub_keywords` from `profile` where uid = %d and `is-default` = 1 limit 1",
-                                       intval($profile_uid)
+                                       intval($r[0]['profile_uid'])
                        );
                        if($x && count($x))
                                $r[0]['pub_keywords'] = $x[0]['pub_keywords'];
@@ -1174,7 +1355,7 @@ if(! function_exists('profile_load')) {
 
                $a->profile = $r[0];
 
-               $a->profile['mobile-theme'] = get_pconfig($profile_uid, 'system', 'mobile_theme');
+               $a->profile['mobile-theme'] = get_pconfig($a->profile['profile_uid'], 'system', 'mobile_theme');
 
 
                $a->page['title'] = $a->profile['name'] . " @ " . $a->config['sitename'];
@@ -1185,6 +1366,8 @@ if(! function_exists('profile_load')) {
                 * load/reload current theme info
                 */
 
+               $a->set_template_engine(); // reset the template engine to the default in case the user's theme doesn't specify one
+
                $theme_info_file = "view/theme/".current_theme()."/theme.php";
                if (file_exists($theme_info_file)){
                        require_once($theme_info_file);
@@ -1260,7 +1443,7 @@ if(! function_exists('profile_sidebar')) {
                        }
                }
 
-               if(get_my_url() && $profile['unkmail'])
+               if( get_my_url() && $profile['unkmail'] && ($profile['uid'] != local_user()) )
                        $wallmessage = t('Message');
                else
                        $wallmessage = false;
@@ -1297,9 +1480,15 @@ if(! function_exists('profile_sidebar')) {
 
 
                        }
-
-
                }
+        if ($profile['uid'] == local_user() && !feature_enabled(local_user(),'multi_profiles')) {
+            $profile['edit'] = array($a->get_baseurl(). '/profiles/'.$profile['id'], t('Edit profile'),"", t('Edit profile'));
+               $profile['menu'] = array(
+                               'chg_photo' => t('Change profile photo'),
+                               'cr_new' => null,
+                               'entries' => array(),
+                       );
+        }
 
 
 
@@ -1343,8 +1532,6 @@ if(! function_exists('profile_sidebar')) {
                }
 
 
-               $tpl = get_markup_template('profile_vcard.tpl');
-
                $p = array();
                foreach($profile as $k => $v) {
                        $k = str_replace('-','_',$k);
@@ -1354,6 +1541,8 @@ if(! function_exists('profile_sidebar')) {
                if($a->theme['template_engine'] === 'internal')
                        $location = template_escape($location);
 
+
+               $tpl = get_markup_template('profile_vcard.tpl');
                $o .= replace_macros($tpl, array(
                        '$profile' => $p,
                        '$connect'  => $connect,
@@ -1611,7 +1800,7 @@ if(! function_exists('current_theme')) {
 //             $mobile_detect = new Mobile_Detect();
 //             $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet();
                $is_mobile = $a->is_mobile || $a->is_tablet;
-       
+
                if($is_mobile) {
                        if(isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) {
                                $system_theme = '';
@@ -1784,6 +1973,13 @@ if(! function_exists('profile_tabs')){
                                'title' => t('Photo Albums'),
                                'id' => 'photo-tab',
                        ),
+                       array(
+                               'label' => t('Videos'),
+                               'url'   => $a->get_baseurl() . '/videos/' . $nickname,
+                               'sel'   => ((!isset($tab)&&$a->argv[0]=='videos')?'active':''),
+                               'title' => t('Videos'),
+                               'id' => 'video-tab',
+                       ),
                );
        
                if ($is_owner){
@@ -1869,6 +2065,36 @@ function build_querystring($params, $name=null) {
     return $ret;    
 }
 
+function explode_querystring($query) {
+       $arg_st = strpos($query, '?');
+       if($arg_st !== false) {
+               $base = substr($query, 0, $arg_st);
+               $arg_st += 1;
+       }
+       else {
+               $base = '';
+               $arg_st = 0;
+       }
+
+       $args = explode('&', substr($query, $arg_st));
+       foreach($args as $k=>$arg) {
+               if($arg === '')
+                       unset($args[$k]);
+       }
+       $args = array_values($args);
+
+       if(!$base) {
+               $base = $args[0];
+               unset($args[0]);
+               $args = array_values($args);
+       }
+
+       return array(
+               'base' => $base,
+               'args' => $args,
+       );
+}
+
 /**
 * Returns the complete URL of the current page, e.g.: http(s)://something.com/network
 *
@@ -1897,10 +2123,7 @@ function random_digits($digits) {
 function get_cachefile($file, $writemode = true) {
        $cache = get_config("system","itemcache");
 
-       if ($cache == "")
-               return("");
-
-       if (!is_dir($cache))
+       if ((! $cache) || (! is_dir($cache)))
                return("");
 
        $subfolder = $cache."/".substr($file, 0, 2);
@@ -1946,16 +2169,9 @@ function clear_cache($basepath = "", $path = "") {
 }
 
 function set_template_engine(&$a, $engine = 'internal') {
+// This function is no longer necessary, but keep it as a wrapper to the class method
+// to avoid breaking themes again unnecessarily
 
-       $a->theme['template_engine'] = 'internal';
-
-       if(is_writable('view/smarty3/')) {
-               switch($engine) {
-                       case 'smarty3':
-                               $a->theme['template_engine'] = 'smarty3';
-                               break;
-                       default:
-                               break;
-               }
-       }
+       $a->set_template_engine($engine);
 }
+