aboutsummaryrefslogtreecommitdiffstats
path: root/boot.php
diff options
context:
space:
mode:
Diffstat (limited to 'boot.php')
-rwxr-xr-x[-rw-r--r--]boot.php2060
1 files changed, 1149 insertions, 911 deletions
diff --git a/boot.php b/boot.php
index 8d2e7c6e8..de1c640a6 100644..100755
--- a/boot.php
+++ b/boot.php
@@ -1,4 +1,29 @@
<?php
+/** @file */
+
+/**
+ * Red Matrix.
+ *
+ * The Red Matrix (aka "Red") is an open source decentralised communications
+ * platform combined with a decentralised identity/authentication framework
+ * wrapped in an extensible content management system, providing website designers
+ * the ability to embed fully decentralised communications and social tools
+ * into many traditional website designs (blogs, forums, small business
+ * websites, charitable organisations, etc.). Red also provides DNS mobility
+ * and internet scale privacy/access control.
+ *
+ * This allows any individual website to participate in a matrix of linked
+ * sites and people and media sharing which is far greater than the reach
+ * of an individual site.
+ *
+ * If you are reading the source code and come across a function
+ * or code block which is not documented, but you have a good idea what it
+ * does, please add some descriptive comments and push it to the main project.
+ * Even if your description isn't perfect, it gives us a base which we
+ * can build on and correct - so that eventually everything is fully
+ * documented.
+ */
+
require_once('include/config.php');
require_once('include/network.php');
@@ -12,11 +37,13 @@ require_once('include/permissions.php');
require_once('library/Mobile_Detect/Mobile_Detect.php');
require_once('include/BaseObject.php');
require_once('include/features.php');
+require_once('include/taxonomy.php');
-define ( 'FRIENDICA_PLATFORM', 'Friendica Red');
-define ( 'FRIENDICA_VERSION', trim(file_get_contents('version.inc')) . 'R');
-define ( 'ZOT_REVISION', 1 );
-define ( 'DB_UPDATE_VERSION', 1031 );
+
+define ( 'RED_PLATFORM', 'Red Matrix' );
+define ( 'RED_VERSION', trim(file_get_contents('version.inc')) . 'R');
+define ( 'ZOT_REVISION', 1 );
+define ( 'DB_UPDATE_VERSION', 1058 );
define ( 'EOL', '<br />' . "\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
@@ -92,7 +119,7 @@ define ( 'DEFAULT_DB_ENGINE', 'MyISAM' );
define ( 'SSL_POLICY_NONE', 0 );
define ( 'SSL_POLICY_FULL', 1 );
-define ( 'SSL_POLICY_SELFSIGN', 2 );
+define ( 'SSL_POLICY_SELFSIGN', 2 ); // NOT supported in Red
/**
@@ -130,6 +157,12 @@ define ( 'UPDATE_SUCCESS', 0);
define ( 'UPDATE_FAILED', 1);
+
+define ( 'CLIENT_MODE_NORMAL', 0x0000);
+define ( 'CLIENT_MODE_LOAD', 0x0001);
+define ( 'CLIENT_MODE_UPDATE', 0x0002);
+
+
/**
*
* page/profile types
@@ -146,6 +179,7 @@ define ( 'PAGE_NORMAL', 0x0000 );
define ( 'PAGE_HIDDEN', 0x0001 );
define ( 'PAGE_AUTOCONNECT', 0x0002 );
define ( 'PAGE_APPLICATION', 0x0004 );
+define ( 'PAGE_DIRECTORY_CHANNEL', 0x0008 ); // system channel used for directory synchronisation
define ( 'PAGE_REMOVED', 0x8000 );
@@ -153,6 +187,18 @@ define ( 'PAGE_REMOVED', 0x8000 );
//define ( 'PAGE_BLOG', 4 );
//define ( 'PAGE_PRVGROUP', 5 );
+
+/**
+ * Photo types
+ */
+
+define ( 'PHOTO_NORMAL', 0x0000 );
+define ( 'PHOTO_PROFILE', 0x0001 );
+define ( 'PHOTO_XCHAN', 0x0002 );
+define ( 'PHOTO_THING', 0x0004 );
+
+
+
/**
* Network and protocol family types
*/
@@ -223,6 +269,8 @@ define ( 'MAIL_DELETED', 0x0001);
define ( 'MAIL_REPLIED', 0x0002);
define ( 'MAIL_ISREPLY', 0x0004);
define ( 'MAIL_SEEN', 0x0008);
+define ( 'MAIL_RECALLED', 0x0010);
+define ( 'MAIL_OBSCURED', 0x0020);
define ( 'ATTACH_FLAG_DIR', 0x0001);
@@ -280,18 +328,21 @@ define ( 'XCHAN_FLAGS_HIDDEN', 0x0001);
* Tag/term types
*/
-define ( 'TERM_UNKNOWN', 0 );
-define ( 'TERM_HASHTAG', 1 );
-define ( 'TERM_MENTION', 2 );
-define ( 'TERM_CATEGORY', 3 );
-define ( 'TERM_PCATEGORY', 4 );
-define ( 'TERM_FILE', 5 );
-define ( 'TERM_SAVEDSEARCH', 6 );
-
-
-define ( 'TERM_OBJ_POST', 1 );
-define ( 'TERM_OBJ_PHOTO', 2 );
+define ( 'TERM_UNKNOWN', 0 );
+define ( 'TERM_HASHTAG', 1 );
+define ( 'TERM_MENTION', 2 );
+define ( 'TERM_CATEGORY', 3 );
+define ( 'TERM_PCATEGORY', 4 );
+define ( 'TERM_FILE', 5 );
+define ( 'TERM_SAVEDSEARCH', 6 );
+define ( 'TERM_THING', 7 );
+define ( 'TERM_OBJ_POST', 1 );
+define ( 'TERM_OBJ_PHOTO', 2 );
+define ( 'TERM_OBJ_PROFILE', 3 );
+define ( 'TERM_OBJ_CHANNEL', 4 );
+define ( 'TERM_OBJ_OBJECT', 5 );
+define ( 'TERM_OBJ_THING', 6 );
/**
@@ -346,6 +397,7 @@ define ( 'ACTIVITY_OBJ_EVENT', NAMESPACE_ACTIVITY_SCHEMA . 'event' );
define ( 'ACTIVITY_OBJ_GROUP', NAMESPACE_ACTIVITY_SCHEMA . 'group' );
define ( 'ACTIVITY_OBJ_TAGTERM', NAMESPACE_ZOT . '/activity/tagterm' );
define ( 'ACTIVITY_OBJ_PROFILE', NAMESPACE_ZOT . '/activity/profile' );
+define ( 'ACTIVITY_OBJ_THING', NAMESPACE_ZOT . '/activity/thing' );
/**
* item weight for query ordering
@@ -386,6 +438,7 @@ define ( 'ITEM_SPAM', 0x0008);
define ( 'ITEM_DELETED', 0x0010);
define ( 'ITEM_UNPUBLISHED', 0x0020);
define ( 'ITEM_WEBPAGE', 0x0040); // is a static web page, not a conversational item
+define ( 'ITEM_DELAYED_PUBLISH', 0x0080);
/**
* Item Flags
@@ -402,7 +455,8 @@ define ( 'ITEM_NOTSHOWN', 0x0080); // technically visible but not normal
define ( 'ITEM_NSFW', 0x0100);
define ( 'ITEM_RELAY', 0x0200); // used only in the communication layers, not stored
define ( 'ITEM_MENTIONSME', 0x0400);
-
+define ( 'ITEM_NOCOMMENT', 0x0800); // commenting/followups are disabled
+define ( 'ITEM_OBSCURED', 0x1000); // bit-mangled to protect from casual browsing by site admin
/**
*
@@ -453,466 +507,538 @@ function startup() {
*
*/
-if(! class_exists('App')) {
- class App {
+
+class App {
- public $account = null; // account record
- public $channel = null; // channel record
- public $observer = null; // xchan record
-
- private $perms = null; // observer permissions
- private $widgets = array(); // widgets for this page
- private $widgetlist = null; // widget ordering and inclusion directives
-
- public $groups;
- public $language;
- public $module_loaded = false;
- public $query_string;
- public $config; // config cache
- public $page;
- public $profile;
- public $user;
- public $cid;
- public $contact;
- public $contacts;
- public $content;
- public $data = array();
- public $error = false;
- public $cmd;
- public $argv;
- public $argc;
- public $module;
- public $pager;
- public $strings;
- public $hooks;
- public $timezone;
- public $interactive = true;
- public $plugins;
- private $apps = array();
- public $identities;
- public $css_sources = array();
- public $js_sources = array();
- public $theme_info = array();
+ public $account = null; // account record
+ public $channel = null; // channel record
+ public $observer = null; // xchan record
+ public $profile_uid = 0; // If applicable, the uid of the person whose stuff this is.
+
+
+
+ private $perms = null; // observer permissions
+ private $widgets = array(); // widgets for this page
+ private $widgetlist = null; // widget ordering and inclusion directives
+
+ public $groups;
+ public $language;
+ public $module_loaded = false;
+ public $query_string;
+ public $config; // config cache
+ public $page;
+ public $profile;
+ public $user;
+ public $cid;
+ public $contact;
+ public $contacts;
+ public $content;
+ public $data = array();
+ public $error = false;
+ public $cmd;
+ public $argv;
+ public $argc;
+ public $module;
+ public $pager;
+ public $strings;
+ public $hooks;
+ public $timezone;
+ public $interactive = true;
+ public $plugins;
+ private $apps = array();
+ public $identities;
+ public $css_sources = array();
+ public $js_sources = array();
+ public $theme_info = array();
- public $nav_sel;
-
- public $category;
-
- // Allow themes to control internal parameters
- // by changing App values in theme.php
-
- public $sourcename = '';
- public $videowidth = 425;
- public $videoheight = 350;
- public $force_max_items = 0;
- public $theme_thread_allow = true;
-
- // An array for all theme-controllable parameters
- // Mostly unimplemented yet. Only options 'template_engine' and
- // beyond are used.
-
- private $theme = array(
- 'sourcename' => '',
- 'videowidth' => 425,
- 'videoheight' => 350,
- 'force_max_items' => 0,
- 'thread_allow' => true,
- 'stylesheet' => '',
- 'template_engine' => 'internal',
- );
-
- private $ldelim = array(
- 'internal' => '',
- 'smarty3' => '{{'
- );
- private $rdelim = array(
- 'internal' => '',
- 'smarty3' => '}}'
- );
+ public $nav_sel;
+
+ public $category;
+
+ // Allow themes to control internal parameters
+ // by changing App values in theme.php
+
+ public $sourcename = '';
+ public $videowidth = 425;
+ public $videoheight = 350;
+ public $force_max_items = 0;
+ public $theme_thread_allow = true;
+
+ // An array for all theme-controllable parameters
+ // Mostly unimplemented yet. Only options 'template_engine' and
+ // beyond are used.
+
+ private $theme = array(
+ 'sourcename' => '',
+ 'videowidth' => 425,
+ 'videoheight' => 350,
+ 'force_max_items' => 0,
+ 'thread_allow' => true,
+ 'stylesheet' => '',
+ 'template_engine' => 'smarty3',
+ );
- private $scheme;
- private $hostname;
- private $baseurl;
- private $path;
+ // 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 $db;
+ private $scheme;
+ private $hostname;
+ private $baseurl;
+ private $path;
+ private $db;
- private $curl_code;
- private $curl_headers;
+ private $curl_code;
+ private $curl_headers;
- private $cached_profile_image;
- private $cached_profile_picdate;
+ private $cached_profile_image;
+ private $cached_profile_picdate;
- function __construct() {
+ function __construct() {
- global $default_timezone;
+ global $default_timezone;
+ $this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
- $this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC');
+ date_default_timezone_set($this->timezone);
- date_default_timezone_set($this->timezone);
+ $this->config = array('system'=>array());
+ $this->page = array();
+ $this->pager= array();
- $this->config = array();
- $this->page = array();
- $this->pager= array();
+ $this->query_string = '';
- $this->query_string = '';
+ startup();
- 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 = 'http';
+ if(x($_SERVER,'HTTPS') && $_SERVER['HTTPS'])
+ $this->scheme = 'https';
+ elseif(x($_SERVER,'SERVER_PORT') && (intval($_SERVER['SERVER_PORT']) == 443))
+ $this->scheme = 'https';
- if(x($_SERVER,'SERVER_NAME')) {
- $this->hostname = $_SERVER['SERVER_NAME'];
+ 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
- */
+ 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
+ */
- $path = trim(dirname($_SERVER['SCRIPT_NAME']),'/\\');
- if(isset($path) && strlen($path) && ($path != $this->path))
- $this->path = $path;
- }
+ $path = trim(dirname($_SERVER['SCRIPT_NAME']),'/\\');
+ if(isset($path) && strlen($path) && ($path != $this->path))
+ $this->path = $path;
+ }
- set_include_path(
- "include/$this->hostname" . PATH_SEPARATOR
- . 'include' . PATH_SEPARATOR
- . 'library' . PATH_SEPARATOR
- . 'library/phpsec' . PATH_SEPARATOR
- . 'library/langdet' . PATH_SEPARATOR
- . '.' );
-
- if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") {
- $this->query_string = substr($_SERVER['QUERY_STRING'],2);
- // removing trailing / - maybe a nginx problem
- if (substr($this->query_string, 0, 1) == "/")
- $this->query_string = substr($this->query_string, 1);
- }
- if(x($_GET,'q'))
- $this->cmd = trim($_GET['q'],'/\\');
+ set_include_path("include/$this->hostname" . PATH_SEPARATOR . get_include_path());
- // unix style "homedir"
+ if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") {
+ $this->query_string = substr($_SERVER['QUERY_STRING'],2);
+ // removing trailing / - maybe a nginx problem
+ if (substr($this->query_string, 0, 1) == "/")
+ $this->query_string = substr($this->query_string, 1);
+ }
+ if(x($_GET,'q'))
+ $this->cmd = trim($_GET['q'],'/\\');
- if(substr($this->cmd,0,1) === '~')
- $this->cmd = 'channel/' . substr($this->cmd,1);
+ // unix style "homedir"
+ if(substr($this->cmd,0,1) === '~')
+ $this->cmd = 'channel/' . substr($this->cmd,1);
- /**
- *
- * Break the URL path into C style argc/argv style arguments for our
- * modules. Given "http://example.com/module/arg1/arg2", $this->argc
- * will be 3 (integer) and $this->argv will contain:
- * [0] => 'module'
- * [1] => 'arg1'
- * [2] => 'arg2'
- *
- *
- * There will always be one argument. If provided a naked domain
- * URL, $this->argv[0] is set to "home".
- *
- */
- $this->argv = explode('/',$this->cmd);
- $this->argc = count($this->argv);
- if((array_key_exists('0',$this->argv)) && strlen($this->argv[0])) {
- $this->module = str_replace(".", "_", $this->argv[0]);
- $this->module = str_replace("-", "_", $this->module);
- }
- else {
- $this->argc = 1;
- $this->argv = array('home');
- $this->module = 'home';
- }
+ /**
+ *
+ * Break the URL path into C style argc/argv style arguments for our
+ * modules. Given "http://example.com/module/arg1/arg2", $this->argc
+ * will be 3 (integer) and $this->argv will contain:
+ * [0] => 'module'
+ * [1] => 'arg1'
+ * [2] => 'arg2'
+ *
+ *
+ * There will always be one argument. If provided a naked domain
+ * URL, $this->argv[0] is set to "home".
+ *
+ */
+ $this->argv = explode('/',$this->cmd);
+ $this->argc = count($this->argv);
+ if((array_key_exists('0',$this->argv)) && strlen($this->argv[0])) {
+ $this->module = str_replace(".", "_", $this->argv[0]);
+ $this->module = str_replace("-", "_", $this->module);
+ }
+ else {
+ $this->argc = 1;
+ $this->argv = array('home');
+ $this->module = 'home';
+ }
- /**
- * See if there is any page number information, and initialise
- * pagination
- */
- $this->pager['page'] = ((x($_GET,'page') && intval($_GET['page']) > 0) ? intval($_GET['page']) : 1);
- $this->pager['itemspage'] = 50;
- $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
- if($this->pager['start'] < 0)
- $this->pager['start'] = 0;
- $this->pager['total'] = 0;
+ /**
+ * See if there is any page number information, and initialise
+ * pagination
+ */
- /**
- * Detect mobile devices
- */
+ $this->pager['page'] = ((x($_GET,'page') && intval($_GET['page']) > 0) ? intval($_GET['page']) : 1);
+ $this->pager['itemspage'] = 50;
+ $this->pager['start'] = ($this->pager['page'] * $this->pager['itemspage']) - $this->pager['itemspage'];
+ if($this->pager['start'] < 0)
+ $this->pager['start'] = 0;
+ $this->pager['total'] = 0;
- $mobile_detect = new Mobile_Detect();
- $this->is_mobile = $mobile_detect->isMobile();
- $this->is_tablet = $mobile_detect->isTablet();
+ /**
+ * Detect mobile devices
+ */
- BaseObject::set_app($this);
- }
+ $mobile_detect = new Mobile_Detect();
+ $this->is_mobile = $mobile_detect->isMobile();
+ $this->is_tablet = $mobile_detect->isTablet();
- function get_baseurl($ssl = false) {
- $scheme = $this->scheme;
+ $this->head_set_icon('/images/rhash-32.png');
- if((x($this->config,'system')) && (x($this->config['system'],'ssl_policy'))) {
- if(intval($this->config['system']['ssl_policy']) === intval(SSL_POLICY_FULL))
- $scheme = 'https';
+ BaseObject::set_app($this);
+
+ /**
+ * register template engines
+ */
+ $dc = get_declared_classes();
+ foreach ($dc as $k) {
+ if (in_array("ITemplateEngine", class_implements($k))){
+ $this->register_template_engine($k);
+ }
+ }
+ }
- // Basically, we have $ssl = true on any links which can only be seen by a logged in user
- // (and also the login link). Anything seen by an outsider will have it turned off.
+ function get_baseurl($ssl = false) {
+ $scheme = $this->scheme;
- if($this->config['system']['ssl_policy'] == SSL_POLICY_SELFSIGN) {
- if($ssl)
- $scheme = 'https';
- else
- $scheme = 'http';
- }
- }
-
- $this->baseurl = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' );
- return $this->baseurl;
+ if((x($this->config,'system')) && (x($this->config['system'],'ssl_policy'))) {
+ if(intval($this->config['system']['ssl_policy']) === intval(SSL_POLICY_FULL)) {
+ $scheme = 'https';
+ }
}
+
+ $this->baseurl = $scheme . "://" . $this->hostname . ((isset($this->path) && strlen($this->path)) ? '/' . $this->path : '' );
+ return $this->baseurl;
+ }
- function set_baseurl($url) {
-
- if(is_array($this->config) && array_key_exists('system',$this->config) &&
- array_key_exists('baseurl',$this->config['system']) && strlen($this->config['system']['baseurl'])) {
- $url = $this->config['system']['baseurl'];
- }
+ function set_baseurl($url) {
- $parsed = @parse_url($url);
+ if(is_array($this->config)
+ && array_key_exists('system',$this->config)
+ && is_array($this->config['system'])
+ && array_key_exists('baseurl',$this->config['system'])
+ && strlen($this->config['system']['baseurl'])) {
+ $url = $this->config['system']['baseurl'];
+ }
- $this->baseurl = $url;
+ $parsed = @parse_url($url);
- if($parsed) {
- $this->scheme = $parsed['scheme'];
+ $this->baseurl = $url;
- $this->hostname = $parsed['host'];
- if(x($parsed,'port'))
- $this->hostname .= ':' . $parsed['port'];
- if(x($parsed,'path'))
- $this->path = trim($parsed['path'],'\\/');
- }
+ if($parsed) {
+ $this->scheme = $parsed['scheme'];
+ $this->hostname = $parsed['host'];
+ if(x($parsed,'port'))
+ $this->hostname .= ':' . $parsed['port'];
+ if(x($parsed,'path'))
+ $this->path = trim($parsed['path'],'\\/');
}
- function get_hostname() {
- return $this->hostname;
- }
+ }
- function set_hostname($h) {
- $this->hostname = $h;
- }
+ function get_hostname() {
+ return $this->hostname;
+ }
- function set_path($p) {
- $this->path = trim(trim($p),'/');
- }
+ function set_hostname($h) {
+ $this->hostname = $h;
+ }
- function get_path() {
- return $this->path;
- }
+ function set_path($p) {
+ $this->path = trim(trim($p),'/');
+ }
- function set_account($aid) {
- $this->account = $aid;
- }
+ function get_path() {
+ return $this->path;
+ }
- function get_account() {
- return $this->account;
- }
+ function set_account($acct) {
+ $this->account = $acct;
+ }
- function set_channel($channel) {
- $this->channel = $channel;
- }
+ function get_account() {
+ return $this->account;
+ }
- function get_channel() {
- return $this->channel;
- }
+ function set_channel($channel) {
+ $this->channel = $channel;
+ }
+ function get_channel() {
+ return $this->channel;
+ }
- function set_observer($xchan) {
- $this->observer = $xchan;
- }
- function get_observer() {
- return $this->observer;
- }
+ function set_observer($xchan) {
+ $this->observer = $xchan;
+ }
- function set_perms($perms) {
- $this->perms = $perms;
- }
+ function get_observer() {
+ return $this->observer;
+ }
- function get_perms() {
- return $this->perms;
- }
+ function set_perms($perms) {
+ $this->perms = $perms;
+ }
- function get_apps() {
- return $this->apps;
- }
+ function get_perms() {
+ return $this->perms;
+ }
- function set_apps($arr) {
- $this->apps = $arr;
- }
+ function get_apps() {
+ return $this->apps;
+ }
- function set_groups($g) {
- $this->groups = $g;
- }
+ function set_apps($arr) {
+ $this->apps = $arr;
+ }
- function get_groups() {
- return $this->groups;
- }
+ function set_groups($g) {
+ $this->groups = $g;
+ }
- /*
- * Use a theme or app specific widget ordering list to determine what widgets should be included
- * for each module and in what order and optionally what region of the page to place them.
- * For example:
- * view/wgl/mod_connections.wgl:
- * -----------------------------
- * vcard aside
- * follow aside
- * findpeople rightside
- * collections aside
- *
- * If your widgetlist does not include a widget that is destined for the page, it will not be rendered.
- * You can also use this to change the order of presentation, as they will be presented in the order you specify.
- *
- */
+ function get_groups() {
+ return $this->groups;
+ }
- function set_widget($title,$html, $location = 'aside') {
- $widgetlist_file = 'mod_' . $this->module . '.wgl';
- if(! $this->widgetlist) {
- if($this->module && (($f = theme_include($widgetlist_file)) !== '')) {
- $s = file($f, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
- if(is_array($s)) {
- foreach($s as $x) {
- $this->widgetlist[] = explode(' ', $x);
- }
+ /*
+ * Use a theme or app specific widget ordering list to determine what widgets should be included
+ * for each module and in what order and optionally what region of the page to place them.
+ * For example:
+ * view/wgl/mod_connections.wgl:
+ * -----------------------------
+ * vcard aside
+ * follow aside
+ * findpeople rightside
+ * collections aside
+ *
+ * If your widgetlist does not include a widget that is destined for the page, it will not be rendered.
+ * You can also use this to change the order of presentation, as they will be presented in the order you specify.
+ *
+ */
+
+ function set_widget($title,$html, $location = 'aside') {
+ $widgetlist_file = 'mod_' . $this->module . '.wgl';
+ if(! $this->widgetlist) {
+ if($this->module && (($f = theme_include($widgetlist_file)) !== '')) {
+ $s = file($f, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES);
+ if(is_array($s)) {
+ foreach($s as $x) {
+ $this->widgetlist[] = explode(' ', $x);
}
}
- else {
- $this->widgets[] = array('title' => $title, 'html' => $html, 'location' => $location);
- }
}
- if($this->widgetlist) {
- foreach($this->widgetlist as $k => $v) {
- if($v[0] && $v[0] === $title) {
- $this->widgets[$k] = array('title' => $title, 'html' => $html, 'location' => (($v[1]) ? $v[1] : $location));
- }
+ else {
+ $this->widgets[] = array('title' => $title, 'html' => $html, 'location' => $location);
+ }
+ }
+ if($this->widgetlist) {
+ foreach($this->widgetlist as $k => $v) {
+ if($v[0] && $v[0] === $title) {
+ $this->widgets[$k] = array('title' => $title, 'html' => $html, 'location' => (($v[1]) ?$v[1] : $location));
}
}
}
+ }
- function get_widgets($location = '') {
- if($location && count($this->widgets)) {
- $ret = array();
- foreach($widgets as $w)
- if($w['location'] == $location)
- $ret[] = $w;
- $arr = array('location' => $location, 'widgets' => $ret);
- call_hooks('get_widgets', $arr);
- return $arr['widgets'];
- }
-
- $arr = array('location' => $location, 'widgets' => $this->widgets);
+ function get_widgets($location = '') {
+ if($location && count($this->widgets)) {
+ $ret = array();
+ foreach($widgets as $w)
+ if($w['location'] == $location)
+ $ret[] = $w;
+ $arr = array('location' => $location, 'widgets' => $ret);
call_hooks('get_widgets', $arr);
return $arr['widgets'];
- }
-
- function set_pager_total($n) {
- $this->pager['total'] = intval($n);
- }
-
- 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'];
+ }
+ $arr = array('location' => $location, 'widgets' => $this->widgets);
+ call_hooks('get_widgets', $arr);
+ return $arr['widgets'];
+ }
+
+ function set_pager_total($n) {
+ $this->pager['total'] = intval($n);
+ }
- }
+ 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 build_pagehead() {
+ function build_pagehead() {
- $interval = ((local_user()) ? get_pconfig(local_user(),'system','update_interval') : 40000);
- if($interval < 10000)
- $interval = 40000;
+ $interval = ((local_user()) ? get_pconfig(local_user(),'system','update_interval') : 40000);
+ if($interval < 10000)
+ $interval = 40000;
+ if(! x($this->page,'title'))
$this->page['title'] = $this->config['system']['sitename'];
+ /* put the head template at the beginning of page['htmlhead']
+ * since the code added by the modules frequently depends on it
+ * being first
+ */
+ $tpl = get_markup_template('head.tpl');
+ $this->page['htmlhead'] = replace_macros($tpl, array(
+ '$baseurl' => $this->get_baseurl(),
+ '$local_user' => local_user(),
+ '$generator' => RED_PLATFORM . ' ' . RED_VERSION,
+ '$update_interval' => $interval,
+ '$icon' => head_get_icon(),
+ '$head_css' => head_get_css(),
+ '$head_js' => head_get_js(),
+ '$js_strings' => js_strings()
+ )) . $this->page['htmlhead'];
+ }
- /* put the head template at the beginning of page['htmlhead']
- * since the code added by the modules frequently depends on it
- * being first
- */
- $tpl = get_markup_template('head.tpl');
- $this->page['htmlhead'] = replace_macros($tpl, array(
- '$baseurl' => $this->get_baseurl(),
- '$local_user' => local_user(),
- '$generator' => FRIENDICA_PLATFORM . ' ' . FRIENDICA_VERSION,
- '$update_interval' => $interval,
- '$head_css' => head_get_css(),
- '$head_js' => head_get_js(),
- '$js_strings' => js_strings()
- )) . $this->page['htmlhead'];
- }
+ function set_curl_code($code) {
+ $this->curl_code = $code;
+ }
- function set_curl_code($code) {
- $this->curl_code = $code;
- }
+ function get_curl_code() {
+ return $this->curl_code;
+ }
- function get_curl_code() {
- return $this->curl_code;
- }
+ function set_curl_headers($headers) {
+ $this->curl_headers = $headers;
+ }
- function set_curl_headers($headers) {
- $this->curl_headers = $headers;
- }
+ function get_curl_headers() {
+ return $this->curl_headers;
+ }
- function get_curl_headers() {
- return $this->curl_headers;
- }
+
+ /**
+ * 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;
+ }
- function get_template_engine() {
- return $this->theme['template_engine'];
- }
+ /**
+ * 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 = 'internal') {
+ function set_template_engine($engine = 'smarty3') {
- $this->theme['template_engine'] = 'internal';
+ $this->theme['template_engine'] = $engine;
- switch($engine) {
- case 'smarty3':
- if(is_writable('view/tpl/smarty3/'))
- $this->theme['template_engine'] = 'smarty3';
- break;
- default:
- break;
- }
- }
+ /*if ($engine) {
+ case 'smarty3':
+ if(!is_writable('view/tpl/smarty3/'))
+ echo "<b>ERROR</b> folder <tt>view/tpl/smarty3/</tt> must be writable by webserver."; killme();
+
+ break;
+ default:
+ break;
+ }*/
+ }
+ function get_template_ldelim($engine = 'smarty3') {
+ return $this->ldelim[$engine];
+ }
- function get_template_ldelim($engine = 'internal') {
- return $this->ldelim[$engine];
- }
+ function get_template_rdelim($engine = 'smarty3') {
+ return $this->rdelim[$engine];
+ }
- function get_template_rdelim($engine = 'internal') {
- return $this->rdelim[$engine];
- }
+ function head_set_icon($icon) {
+ $this->data['pageicon'] = $icon;
+ }
+ function head_get_icon() {
+ $icon = $this->data['pageicon'];
+ if(! strpos($icon,'://'))
+ $icon = z_root() . $icon;
+ return $icon;
}
+
}
+
// retrieve the App structure
// useful in functions which require it but don't get it passed to them
-if(! function_exists('get_app')) {
- function get_app() {
- global $a;
- return $a;
- }
-};
+function get_app() {
+ global $a;
+ return $a;
+}
+
// Multi-purpose function to check variable state.
@@ -921,38 +1047,36 @@ if(! function_exists('get_app')) {
// if variable is set, returns 1 if has 'non-zero' value, otherwise returns 0.
// e.g. x('') or x(0) returns 0;
-if(! function_exists('x')) {
- function x($s,$k = NULL) {
- if($k != NULL) {
- if((is_array($s)) && (array_key_exists($k,$s))) {
- if($s[$k])
- return (int) 1;
- return (int) 0;
- }
- return false;
- }
- else {
- if(isset($s)) {
- if($s) {
- return (int) 1;
- }
- return (int) 0;
+
+function x($s,$k = NULL) {
+ if($k != NULL) {
+ if((is_array($s)) && (array_key_exists($k,$s))) {
+ if($s[$k])
+ return (int) 1;
+ return (int) 0;
+ }
+ return false;
+ }
+ else {
+ if(isset($s)) {
+ if($s) {
+ return (int) 1;
}
- return false;
+ return (int) 0;
}
+ return false;
}
}
+
// called from db initialisation if db is dead.
-if(! function_exists('system_unavailable')) {
- function system_unavailable() {
- include('system_unavailable.php');
- system_down();
- killme();
- }
-}
+function system_unavailable() {
+ include('system_unavailable.php');
+ system_down();
+ killme();
+}
function clean_urls() {
@@ -991,230 +1115,276 @@ function is_ajax() {
// $_SERVER variables, and synchronising the state of installed plugins.
-if(! function_exists('check_config')) {
-function check_config(&$a) {
-
- $build = get_config('system','db_version');
- if(! x($build))
- $build = set_config('system','db_version',DB_UPDATE_VERSION);
-
-// $url = get_config('system','baseurl');
- // if the url isn't set or the stored url is radically different
- // than the currently visited url, store the current value accordingly.
- // "Radically different" ignores common variations such as http vs https
- // and www.example.com vs example.com.
- // We will only change the url to an ip address if there is no existing setting
+function check_config(&$a) {
-// if(! x($url))
-// $url = set_config('system','baseurl',$a->get_baseurl());
-// 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','baseurl',$a->get_baseurl());
+ $build = get_config('system','db_version');
+ if(! x($build))
+ $build = set_config('system','db_version',DB_UPDATE_VERSION);
+
+ $saved = get_config('system','urlverify');
+ if(! $saved)
+ set_config('system','urlverify',bin2hex(z_root()));
+ if(($saved) && ($saved != bin2hex(z_root()))) {
+ // our URL changed. Do something.
+ $oldurl = hex2bin($saved);
+ fix_system_urls($oldurl,z_root());
+ set_config('system','urlverify',bin2hex(z_root()));
+ }
+ // This will actually set the url to the one stored in .htconfig, and ignore what
+ // we're passing - unless we are installing and it has never been set.
+ $a->set_baseurl($a->get_baseurl());
- if($build != DB_UPDATE_VERSION) {
- $stored = intval($build);
- $current = intval(DB_UPDATE_VERSION);
- if(($stored < $current) && file_exists('install/update.php')) {
+ if($build != DB_UPDATE_VERSION) {
+ $stored = intval($build);
+ $current = intval(DB_UPDATE_VERSION);
+ if(($stored < $current) && file_exists('install/update.php')) {
- load_config('database');
+ load_config('database');
- // We're reporting a different version than what is currently installed.
- // Run any existing update scripts to bring the database up to current.
+ // We're reporting a different version than what is currently installed.
+ // Run any existing update scripts to bring the database up to current.
- require_once('install/update.php');
+ require_once('install/update.php');
- // make sure that boot.php and update.php are the same release, we might be
- // updating right this very second and the correct version of the update.php
- // file may not be here yet. This can happen on a very busy site.
+ // make sure that boot.php and update.php are the same release, we might be
+ // updating right this very second and the correct version of the update.php
+ // file may not be here yet. This can happen on a very busy site.
- if(DB_UPDATE_VERSION == UPDATE_VERSION) {
+ if(DB_UPDATE_VERSION == UPDATE_VERSION) {
- for($x = $stored; $x < $current; $x ++) {
- if(function_exists('update_r' . $x)) {
+ for($x = $stored; $x < $current; $x ++) {
+ if(function_exists('update_r' . $x)) {
- // There could be a lot of processes running or about to run.
- // We want exactly one process to run the update command.
- // So store the fact that we're taking responsibility
- // after first checking to see if somebody else already has.
+ // There could be a lot of processes running or about to run.
+ // We want exactly one process to run the update command.
+ // So store the fact that we're taking responsibility
+ // after first checking to see if somebody else already has.
- // If the update fails or times-out completely you may need to
- // delete the config entry to try again.
+ // If the update fails or times-out completely you may need to
+ // delete the config entry to try again.
- if(get_config('database','update_r' . $x))
- break;
- set_config('database','update_r' . $x, '1');
+ if(get_config('database','update_r' . $x))
+ break;
+ set_config('database','update_r' . $x, '1');
- // call the specific update
+ // call the specific update
- $func = 'update_r' . $x;
- $retval = $func();
- if($retval) {
- //send the administrator an e-mail
+ $func = 'update_r' . $x;
+ $retval = $func();
+ if($retval) {
+ //send the administrator an e-mail
- $email_tpl = get_intltext_template("update_fail_eml.tpl");
- $email_msg = replace_macros($email_tpl, array(
- '$sitename' => $a->config['sitename'],
- '$siteurl' => $a->get_baseurl(),
- '$update' => $x,
- '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
- ));
+ $email_tpl = get_intltext_template("update_fail_eml.tpl");
+ $email_msg = replace_macros($email_tpl, array(
+ '$sitename' => $a->config['sitename'],
+ '$siteurl' => $a->get_baseurl(),
+ '$update' => $x,
+ '$error' => sprintf( t('Update %s failed. See error logs.'), $x)
+ ));
- $subject=sprintf(t('Update Error at %s'), $a->get_baseurl());
+ $subject=sprintf(t('Update Error at %s'), $a->get_baseurl());
- mail($a->config['admin_email'], $subject, $email_msg,
- 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
- . 'Content-type: text/plain; charset=UTF-8' . "\n"
- . 'Content-transfer-encoding: 8bit' );
- //try the logger
- logger('CRITICAL: Update Failed: '. $x);
- }
- else
- set_config('database','update_r' . $x, 'success');
-
+ mail($a->config['admin_email'], $subject, $email_msg,
+ 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
+ . 'Content-type: text/plain; charset=UTF-8' . "\n"
+ . 'Content-transfer-encoding: 8bit' );
+ //try the logger
+ logger('CRITICAL: Update Failed: ' . $x);
}
+ else
+ set_config('database','update_r' . $x, 'success');
+
}
- set_config('system','db_version', DB_UPDATE_VERSION);
}
+ set_config('system','db_version', DB_UPDATE_VERSION);
}
}
+ }
- /**
- *
- * 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.
- *
- */
+ /**
+ *
+ * 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 unload 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();
+ $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
+ if($r)
+ $installed = $r;
+ else
+ $installed = array();
- $plugins = get_config('system','addon');
- $plugins_arr = array();
+ $plugins = get_config('system','addon');
+ $plugins_arr = array();
- if($plugins)
- $plugins_arr = explode(',',str_replace(' ', '',$plugins));
+ if($plugins)
+ $plugins_arr = explode(',',str_replace(' ', '',$plugins));
- $a->plugins = $plugins_arr;
+ $a->plugins = $plugins_arr;
- $installed_arr = array();
+ $installed_arr = array();
- if(count($installed)) {
- foreach($installed as $i) {
- if(! in_array($i['name'],$plugins_arr)) {
- uninstall_plugin($i['name']);
- }
- else {
- $installed_arr[] = $i['name'];
- }
+ if(count($installed)) {
+ foreach($installed as $i) {
+ if(! in_array($i['name'],$plugins_arr)) {
+ unload_plugin($i['name']);
+ }
+ else {
+ $installed_arr[] = $i['name'];
}
}
+ }
- if(count($plugins_arr)) {
- foreach($plugins_arr as $p) {
- if(! in_array($p,$installed_arr)) {
- install_plugin($p);
- }
+ if(count($plugins_arr)) {
+ foreach($plugins_arr as $p) {
+ if(! in_array($p,$installed_arr)) {
+ load_plugin($p);
}
}
+ }
- load_hooks();
+ load_hooks();
+ return;
+}
- return;
+
+
+function fix_system_urls($oldurl,$newurl) {
+
+ require_once('include/crypto.php');
+
+ // Basically a site rename, but this can happen if you change from http to https for instance - even if the site name didn't change
+ // This should fix URL changes on our site, but other sites will end up with orphan hublocs which they will try to contact and will
+ // cause wasted communications.
+ // What we need to do after fixing this up is to send a revocation of the old URL to every other site that we communicate with so
+ // that they can clean up their hubloc tables (this includes directories).
+ // It's a very expensive operation so you don't want to have to do it often or after your site gets to be large.
+
+ $r = q("select xchan_hash, channel_prvkey from xchan left join channel on channel_hash = xchan_hash where xchan_url = '%s'",
+ dbesc($oldurl)
+ );
+ if($r) {
+ foreach($r as $rr) {
+ $channel = substr($rr['xchan_addr'],0,strpos($rr['xchan_addr'],'@'));
+ $parsed = @parse_url($rr['xchan_url']);
+ if(! $parsed)
+ continue;
+ $newhost = $parsed['host'];
+ $rhs = $newhost . (($parsed['port']) ? ':' . $parsed['port'] : '') . (($parsed['path']) ? $parsed['path'] : '');
+
+ $x = q("update xchan set xchan_addr = '%s', xchan_url = '%s', xchan_connurl = '%s' where xchan_hash = '%s' limit 1",
+ dbesc($channel . '@' . $rhs),
+ dbesc($newurl),
+ dbesc($newurl . '/poco/' . $channel),
+ dbesc($rr['xchan_hash'])
+ );
+
+
+ $y = q("update hubloc set hubloc_addr = '%s', hubloc_url = '%s', hubloc_url_sig = '%s', hubloc_host = '%s', hubloc_callback = '%s' where hubloc_hash = '%s' and hubloc_url = '%s' limit 1",
+ dbesc($channel . '@' . $rhs),
+ dbesc($newurl),
+ dbesc(base64url_encode(rsa_sign($newurl,$rr['channel_prvkey']))),
+ dbesc($newhost),
+ dbesc($newurl . '/post'),
+ dbesc($rr['xchan_hash']),
+ dbesc($oldurl)
+ );
+ }
}
}
+
+
// wrapper for adding a login box. If $register == true provide a registration
// link. This will most always depend on the value of $a->config['system']['register_policy'].
// returns the complete html for inserting into the page
-if(! function_exists('login')) {
- function login($register = false, $form_id = 'main-login', $hiddens=false) {
- $a = get_app();
- $o = "";
- $reg = false;
- $reglink = get_config('system','register_link');
- if(! strlen($reglink))
- $reglink = 'register';
-
- if ($register) {
- $reg = array(
- 'title' => t('Create a New Account'),
- 'desc' => t('Register'),
- 'link' => $reglink
- );
- }
- $dest_url = $a->get_baseurl(true) . '/' . $a->query_string;
+function login($register = false, $form_id = 'main-login', $hiddens=false) {
+ $a = get_app();
+ $o = "";
+ $reg = false;
+ $reglink = get_config('system','register_link');
+ if(! strlen($reglink))
+ $reglink = 'register';
+
+ if ($register) {
+ $reg = array(
+ 'title' => t('Create a New Account'),
+ 'desc' => t('Register'),
+ 'link' => $reglink
+ );
+ }
- if(local_user()) {
- $tpl = get_markup_template("logout.tpl");
- }
- else {
- $a->page['htmlhead'] .= replace_macros(get_markup_template("login_head.tpl"),array(
- '$baseurl' => $a->get_baseurl(true)
- ));
+ $dest_url = $a->get_baseurl(true) . '/' . $a->query_string;
- $tpl = get_markup_template("login.tpl");
- if(strlen($a->query_string))
- $_SESSION['login_return_url'] = $a->query_string;
- }
+ if(local_user()) {
+ $tpl = get_markup_template("logout.tpl");
+ }
+ else {
+ $a->page['htmlhead'] .= replace_macros(get_markup_template("login_head.tpl"),array(
+ '$baseurl' => $a->get_baseurl(true)
+ ));
+ $tpl = get_markup_template("login.tpl");
+ if(strlen($a->query_string))
+ $_SESSION['login_return_url'] = $a->query_string;
+ }
- $o .= replace_macros($tpl,array(
- '$dest_url' => $dest_url,
- '$logout' => t('Logout'),
- '$login' => t('Login'),
- '$form_id' => $form_id,
- '$lname' => array('username', t('Email') , '', ''),
- '$lpassword' => array('password', t('Password'), '', ''),
- '$remember' => array('remember', t('Remember me'), '', ''),
- '$hiddens' => $hiddens,
-
- '$register' => $reg,
+ $o .= replace_macros($tpl,array(
+
+ '$dest_url' => $dest_url,
+ '$logout' => t('Logout'),
+ '$login' => t('Login'),
+ '$form_id' => $form_id,
+ '$lname' => array('username', t('Email') , '', ''),
+ '$lpassword' => array('password', t('Password'), '', ''),
+ '$remember' => array('remember', t('Remember me'), '', ''),
+ '$hiddens' => $hiddens,
+
+ '$register' => $reg,
- '$lostpass' => t('Forgot your password?'),
- '$lostlink' => t('Password Reset'),
- ));
+ '$lostpass' => t('Forgot your password?'),
+ '$lostlink' => t('Password Reset'),
+ ));
- call_hooks('login_hook',$o);
+ call_hooks('login_hook',$o);
- return $o;
- }
+ return $o;
}
+
// Used to end the current process, after saving session state.
-if(! function_exists('killme')) {
- function killme() {
- session_write_close();
- exit;
- }
+
+function killme() {
+ session_write_close();
+ exit;
}
+
// redirect to another URL and terminate this process.
-if(! function_exists('goaway')) {
- function goaway($s) {
- header("Location: $s");
- killme();
- }
+
+function goaway($s) {
+ header("Location: $s");
+ killme();
}
+
function get_account_id() {
if(get_app()->account)
return intval(get_app()->account['account_id']);
@@ -1224,62 +1394,62 @@ function get_account_id() {
// Returns the entity id of locally logged in user or false.
-if(! function_exists('local_user')) {
- function local_user() {
- if((x($_SESSION,'authenticated')) && (x($_SESSION,'uid')))
- return intval($_SESSION['uid']);
- return false;
- }
+
+function local_user() {
+ if((x($_SESSION,'authenticated')) && (x($_SESSION,'uid')))
+ return intval($_SESSION['uid']);
+ return false;
}
+
// Returns contact id of authenticated site visitor or false
-if(! function_exists('remote_user')) {
- function remote_user() {
- if((x($_SESSION,'authenticated')) && (x($_SESSION,'visitor_id')))
- return $_SESSION['visitor_id'];
- return false;
- }
+
+function remote_user() {
+ if((x($_SESSION,'authenticated')) && (x($_SESSION,'visitor_id')))
+ return $_SESSION['visitor_id'];
+ return false;
}
+
// contents of $s are displayed prominently on the page the next time
// a page is loaded. Usually used for errors or alerts.
-if(! function_exists('notice')) {
- function notice($s) {
- $a = get_app();
- if(! x($_SESSION,'sysmsg')) $_SESSION['sysmsg'] = array();
- if($a->interactive)
- $_SESSION['sysmsg'][] = $s;
- }
+
+function notice($s) {
+ $a = get_app();
+ if(! x($_SESSION,'sysmsg')) $_SESSION['sysmsg'] = array();
+ if($a->interactive)
+ $_SESSION['sysmsg'][] = $s;
}
-if(! function_exists('info')) {
- function info($s) {
- $a = get_app();
- if(! x($_SESSION,'sysmsg_info')) $_SESSION['sysmsg_info'] = array();
- if($a->interactive)
- $_SESSION['sysmsg_info'][] = $s;
- }
+
+
+function info($s) {
+ $a = get_app();
+ if(! x($_SESSION,'sysmsg_info')) $_SESSION['sysmsg_info'] = array();
+ if($a->interactive)
+ $_SESSION['sysmsg_info'][] = $s;
}
+
// wrapper around config to limit the text length of an incoming message
-if(! function_exists('get_max_import_size')) {
- function get_max_import_size() {
- global $a;
- return ((x($a->config,'max_import_size')) ? $a->config['max_import_size'] : 0 );
- }
+
+function get_max_import_size() {
+ global $a;
+ return ((x($a->config,'max_import_size')) ? $a->config['max_import_size'] : 0 );
}
+
/**
*
* Function : profile_load
* @parameter App $a
* @parameter string $nickname
- * @parameter int $profile
+ * @parameter string $profile
*
* Summary: Loads a profile into the page sidebar.
* The function requires a writeable copy of the main App structure, and the nickname
@@ -1295,8 +1465,10 @@ if(! function_exists('get_max_import_size')) {
*
*/
-if(! function_exists('profile_load')) {
-function profile_load(&$a, $nickname, $profile = 0) {
+
+function profile_load(&$a, $nickname, $profile = '') {
+
+ logger('profile_load: ' . $profile);
$user = q("select channel_id from channel where channel_address = '%s' limit 1",
dbesc($nickname)
@@ -1320,30 +1492,29 @@ function profile_load(&$a, $nickname, $profile = 0) {
return;
}
- $r = q("SELECT abook_profile FROM abook WHERE abook_xchan = '%s' limit 1",
- dbesc($observer['xchan_hash'])
- );
- if($r)
- $profile = $r[0]['abook_profile'];
-
+ if(! $profile) {
+ $r = q("SELECT abook_profile FROM abook WHERE abook_xchan = '%s' and abook_channel = '%d' limit 1",
+ dbesc($observer['xchan_hash']),
+ intval($user[0]['channel_id'])
+ );
+ if($r)
+ $profile = $r[0]['abook_profile'];
+ }
$r = null;
-
-
if($profile) {
- $profile_int = intval($profile);
- $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , channel.* FROM `profile`
- LEFT JOIN channel ON `profile`.`uid` = channel.channel_id
- WHERE channel.channel_address = '%s' AND `profile`.`id` = %d LIMIT 1",
+ $r = q("SELECT profile.uid AS profile_uid, profile.*, channel.* FROM profile
+ LEFT JOIN channel ON profile.uid = channel.channel_id
+ WHERE channel.channel_address = '%s' AND profile.profile_guid = '%s' LIMIT 1",
dbesc($nickname),
- intval($profile_int)
+ dbesc($profile)
);
}
- if(! ($r && count($r))) {
- $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `channel`.* FROM `profile`
- LEFT JOIN `channel` ON `profile`.`uid` = channel.channel_id
- WHERE channel.channel_address = '%s' AND `profile`.`is_default` = 1 LIMIT 1",
+ if(! $r) {
+ $r = q("SELECT profile.uid AS profile_uid, profile.*, channel.* FROM profile
+ LEFT JOIN channel ON profile.uid = channel.channel_id
+ WHERE channel.channel_address = '%s' AND profile.is_default = 1 LIMIT 1",
dbesc($nickname)
);
}
@@ -1366,9 +1537,9 @@ function profile_load(&$a, $nickname, $profile = 0) {
}
$a->profile = $r[0];
+ $a->profile_uid = $r[0]['profile_uid'];
-
- $a->page['title'] = $a->profile['channel_name'] . " @ " . $a->config['sitename'];
+ $a->page['title'] = $a->profile['channel_name'] . " - " . $a->profile['channel_address'] . "@" . $a->get_hostname();
$_SESSION['theme'] = $a->profile['channel_theme'];
@@ -1385,7 +1556,7 @@ function profile_load(&$a, $nickname, $profile = 0) {
}
return;
-}}
+}
function profile_create_sidebar(&$a) {
@@ -1412,126 +1583,128 @@ function profile_create_sidebar(&$a) {
*/
-if(! function_exists('profile_sidebar')) {
- function profile_sidebar($profile, $block = 0) {
- $a = get_app();
+function profile_sidebar($profile, $block = 0) {
- $observer = $a->get_observer();
+ $a = get_app();
- $o = '';
- $location = false;
- $address = false;
- $pdesc = true;
+ $observer = $a->get_observer();
- if((! is_array($profile)) && (! count($profile)))
- return $o;
+ $o = '';
+ $location = false;
+ $address = false;
+ $pdesc = true;
+ if((! is_array($profile)) && (! count($profile)))
+ return $o;
- $is_owner = (($profile['uid'] == local_user()) ? true : false);
- $profile['picdate'] = urlencode($profile['picdate']);
+ head_set_icon($profile['thumb']);
- call_hooks('profile_sidebar_enter', $profile);
+ $is_owner = (($profile['uid'] == local_user()) ? true : false);
- // don't show connect link to yourself
- $connect = (($profile['uid'] != local_user()) ? t('Connect') : False);
+ $profile['picdate'] = urlencode($profile['picdate']);
- // don't show connect link to authenticated visitors either
+ call_hooks('profile_sidebar_enter', $profile);
- if(remote_user() && count($_SESSION['remote'])) {
- foreach($_SESSION['remote'] as $visitor) {
- if($visitor['uid'] == $profile['uid']) {
- $connect = false;
- break;
- }
+ // don't show connect link to yourself
+ $connect = (($profile['uid'] != local_user()) ? t('Connect') : False);
+
+ // don't show connect link to authenticated visitors either
+
+ if(remote_user() && count($_SESSION['remote'])) {
+ foreach($_SESSION['remote'] as $visitor) {
+ if($visitor['uid'] == $profile['uid']) {
+ $connect = false;
+ break;
}
}
+ }
- // show edit profile to yourself
- if($is_owner) {
+ // show edit profile to yourself
+ if($is_owner) {
- $profile['menu'] = array(
- 'chg_photo' => t('Change profile photo'),
- 'entries' => array(),
- );
+ $profile['menu'] = array(
+ 'chg_photo' => t('Change profile photo'),
+ 'entries' => array(),
+ );
- if(feature_enabled(local_user(),'multi_profiles')) {
- $profile['edit'] = array($a->get_baseurl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles'));
- $profile['menu']['cr_new'] = t('Create New Profile');
- }
- else
- $profile['edit'] = array($a->get_baseurl() . '/profiles/' . $profile['id'], t('Edit Profile'),'',t('Edit Profile'));
+ if(feature_enabled(local_user(),'multi_profiles')) {
+ $profile['edit'] = array($a->get_baseurl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles'));
+ $profile['menu']['cr_new'] = t('Create New Profile');
+ }
+ else
+ $profile['edit'] = array($a->get_baseurl() . '/profiles/' . $profile['id'], t('Edit Profile'),'',t('Edit Profile'));
- $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
- local_user());
+ $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
+ local_user());
- if($r) {
- foreach($r as $rr) {
- $profile['menu']['entries'][] = array(
- 'photo' => $rr['thumb'],
- 'id' => $rr['id'],
- 'alt' => t('Profile Image'),
- 'profile_name' => $rr['profile_name'],
- 'isdefault' => $rr['is_default'],
- 'visible_to_everybody' => t('visible to everybody'),
- 'edit_visibility' => t('Edit visibility'),
- );
- }
+ if($r) {
+ foreach($r as $rr) {
+ $profile['menu']['entries'][] = array(
+ 'photo' => $rr['thumb'],
+ 'id' => $rr['id'],
+ 'alt' => t('Profile Image'),
+ 'profile_name' => $rr['profile_name'],
+ 'isdefault' => $rr['is_default'],
+ 'visible_to_everybody' => t('visible to everybody'),
+ 'edit_visibility' => t('Edit visibility'),
+ );
}
}
+ }
- if((x($profile,'address') == 1)
- || (x($profile,'locality') == 1)
- || (x($profile,'region') == 1)
- || (x($profile,'postal_code') == 1)
- || (x($profile,'country_name') == 1))
- $location = t('Location:');
+ if((x($profile,'address') == 1)
+ || (x($profile,'locality') == 1)
+ || (x($profile,'region') == 1)
+ || (x($profile,'postal_code') == 1)
+ || (x($profile,'country_name') == 1))
+ $location = t('Location:');
- $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
- $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
- $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
+ $gender = ((x($profile,'gender') == 1) ? t('Gender:') : False);
+ $marital = ((x($profile,'marital') == 1) ? t('Status:') : False);
+ $homepage = ((x($profile,'homepage') == 1) ? t('Homepage:') : False);
- if(($profile['hidewall'] || $block) && (! local_user()) && (! remote_user())) {
- $location = $pdesc = $gender = $marital = $homepage = False;
- }
+ if(($profile['hidewall'] || $block) && (! local_user()) && (! remote_user())) {
+ $location = $pdesc = $gender = $marital = $homepage = False;
+ }
- $firstname = ((strpos($profile['name'],' '))
- ? trim(substr($profile['name'],0,strpos($profile['name'],' '))) : $profile['name']);
- $lastname = (($firstname === $profile['name']) ? '' : trim(substr($profile['name'],strlen($firstname))));
+ $firstname = ((strpos($profile['name'],' '))
+ ? trim(substr($profile['name'],0,strpos($profile['name'],' '))) : $profile['name']);
+ $lastname = (($firstname === $profile['name']) ? '' : trim(substr($profile['name'],strlen($firstname))));
- if(is_array($observer)
- && perm_is_allowed($profile['uid'],$observer['xchan_hash'],'view_contacts')) {
- $contact_block = contact_block();
- }
+ if(is_array($observer)
+ && perm_is_allowed($profile['uid'],$observer['xchan_hash'],'view_contacts')) {
+ $contact_block = contact_block();
+ }
- $tpl = get_markup_template('profile_vcard.tpl');
-
- $o .= replace_macros($tpl, array(
- '$profile' => $profile,
- '$connect' => $connect,
- '$location' => $location,
- '$gender' => $gender,
- '$pdesc' => $pdesc,
- '$marital' => $marital,
- '$homepage' => $homepage,
- '$contact_block' => $contact_block,
- ));
+ $tpl = get_markup_template('profile_vcard.tpl');
- $arr = array('profile' => &$profile, 'entry' => &$o);
+ $o .= replace_macros($tpl, array(
+ '$profile' => $profile,
+ '$connect' => $connect,
+ '$location' => $location,
+ '$gender' => $gender,
+ '$pdesc' => $pdesc,
+ '$marital' => $marital,
+ '$homepage' => $homepage,
+ '$contact_block' => $contact_block,
+ ));
- call_hooks('profile_sidebar', $arr);
+ $arr = array('profile' => &$profile, 'entry' => &$o);
- return $o;
- }
+ call_hooks('profile_sidebar', $arr);
+
+ return $o;
}
-// FIXME
-if(! function_exists('get_birthdays')) {
+// FIXME or remove
+
+
function get_birthdays() {
$a = get_app();
@@ -1606,11 +1779,11 @@ if(! function_exists('get_birthdays')) {
));
}
-}
+
// FIXME
-if(! function_exists('get_events')) {
+
function get_events() {
require_once('include/bbcode.php');
@@ -1677,7 +1850,7 @@ if(! function_exists('get_events')) {
'$events' => $r,
));
}
-}
+
/**
@@ -1694,107 +1867,133 @@ if(! function_exists('get_events')) {
* $cmd and string args are surrounded with ""
*/
-if(! function_exists('proc_run')) {
- function proc_run($cmd){
- $a = get_app();
+function proc_run($cmd){
- $args = func_get_args();
+ $a = get_app();
- $newargs = array();
- if(! count($args))
- return;
+ $args = func_get_args();
- // expand any arrays
+ $newargs = array();
+ if(! count($args))
+ return;
- foreach($args as $arg) {
- if(is_array($arg)) {
- foreach($arg as $n) {
- $newargs[] = $n;
- }
+ // expand any arrays
+
+ foreach($args as $arg) {
+ if(is_array($arg)) {
+ foreach($arg as $n) {
+ $newargs[] = $n;
}
- else
- $newargs[] = $arg;
}
+ else
+ $newargs[] = $arg;
+ }
- $args = $newargs;
+ $args = $newargs;
- $arr = array('args' => $args, 'run_cmd' => true);
+ $arr = array('args' => $args, 'run_cmd' => true);
- call_hooks("proc_run", $arr);
- if(! $arr['run_cmd'])
- return;
+ call_hooks("proc_run", $arr);
+ if(! $arr['run_cmd'])
+ return;
- if(count($args) && $args[0] === 'php')
- $args[0] = ((x($a->config,'system')) && (x($a->config['system'],'php_path')) && (strlen($a->config['system']['php_path'])) ? $a->config['system']['php_path'] : 'php');
- for($x = 0; $x < count($args); $x ++)
- $args[$x] = escapeshellarg($args[$x]);
+ if(count($args) && $args[0] === 'php')
+ $args[0] = ((x($a->config,'system')) && (x($a->config['system'],'php_path')) && (strlen($a->config['system']['php_path'])) ? $a->config['system']['php_path'] : 'php');
+ for($x = 0; $x < count($args); $x ++)
+ $args[$x] = escapeshellarg($args[$x]);
- $cmdline = implode($args," ");
- if(get_config('system','proc_windows'))
- proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo));
- else
- proc_close(proc_open($cmdline." &",array(),$foo));
- }
+ $cmdline = implode($args," ");
+ if(get_config('system','proc_windows'))
+ proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo));
+ else
+ proc_close(proc_open($cmdline." &",array(),$foo));
}
-if(! function_exists('current_theme')) {
- function current_theme(){
- $app_base_themes = array('redbasic');
+
+
+function current_theme(){
+ $app_base_themes = array('redbasic');
- $a = get_app();
+ $a = get_app();
+ $page_theme = null;
+
+ // Find the theme that belongs to the channel whose stuff we are looking at
+
+ if($a->profile_uid && $a->profile_uid != local_user()) {
+ $r = q("select channel_theme from channel where channel_id = %d limit 1",
+ intval($a->profile_uid)
+ );
+ if($r)
+ $page_theme = $r[0]['channel_theme'];
+ }
+
+ // Allow folks to over-rule channel themes and always use their own on their own site.
+ // The default is for channel themes to take precedence over your own on pages belonging
+ // to that channel.
+
+ if($page_theme && local_user() && local_user() != $a->profile_url) {
+ if(get_pconfig(local_user(),'system','always_my_theme'))
+ $page_theme = null;
+ }
+
// $mobile_detect = new Mobile_Detect();
// $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet();
- $is_mobile = $a->is_mobile || $a->is_tablet;
+ $is_mobile = $a->is_mobile || $a->is_tablet;
- if($is_mobile) {
- $system_theme = ((isset($a->config['system']['mobile-theme'])) ? $a->config['system']['mobile-theme'] : '');
- $theme_name = ((isset($_SESSION) && x($_SESSION,'mobile-theme')) ? $_SESSION['mobile-theme'] : $system_theme);
-
- if($theme_name === '---') {
- // user has selected to have the mobile theme be the same as the normal one
- $system_theme = '';
- $theme_name = '';
- }
- }
- else {
- $system_theme = ((isset($a->config['system']['theme'])) ? $a->config['system']['theme'] : '');
- $theme_name = ((isset($_SESSION) && x($_SESSION,'theme')) ? $_SESSION['theme'] : $system_theme);
+ if($is_mobile) {
+ $system_theme = ((isset($a->config['system']['mobile-theme'])) ? $a->config['system']['mobile-theme'] : '');
+ $theme_name = ((isset($_SESSION) && x($_SESSION,'mobile-theme')) ? $_SESSION['mobile-theme'] : $system_theme);
+
+ if($theme_name === '---') {
+ // user has selected to have the mobile theme be the same as the normal one
+ $system_theme = '';
+ $theme_name = '';
}
+ }
+ else {
+ $system_theme = ((isset($a->config['system']['theme'])) ? $a->config['system']['theme'] : '');
+ $theme_name = ((isset($_SESSION) && x($_SESSION,'theme')) ? $_SESSION['theme'] : $system_theme);
+
+ if($page_theme)
+ $theme_name = $page_theme;
+ }
- if($theme_name &&
- (file_exists('view/theme/' . $theme_name . '/css/style.css') ||
- file_exists('view/theme/' . $theme_name . '/php/style.php')))
- return($theme_name);
+ if($theme_name &&
+ (file_exists('view/theme/' . $theme_name . '/css/style.css') ||
+ file_exists('view/theme/' . $theme_name . '/php/style.php')))
+ return($theme_name);
- foreach($app_base_themes as $t) {
- if(file_exists('view/theme/' . $t . '/css/style.css')||
- file_exists('view/theme/' . $t . '/php/style.php'))
- return($t);
- }
+ foreach($app_base_themes as $t) {
+ if(file_exists('view/theme/' . $t . '/css/style.css')||
+ file_exists('view/theme/' . $t . '/php/style.php'))
+ return($t);
+ }
- $fallback = array_merge(glob('view/theme/*/css/style.css'),glob('view/theme/*/php/style.php'));
- if(count($fallback))
- return (str_replace('view/theme/','', substr($fallback[0],0,-10)));
+ $fallback = array_merge(glob('view/theme/*/css/style.css'),glob('view/theme/*/php/style.php'));
+ if(count($fallback))
+ return (str_replace('view/theme/','', substr($fallback[0],0,-10)));
- }
}
-/*
+
+/**
* Return full URL to theme which is currently in effect.
-* Provide a sane default if nothing is chosen or the specified theme does not exist.
-*/
-if(! function_exists('current_theme_url')) {
- function current_theme_url() {
- global $a;
- $t = current_theme();
- if (file_exists('view/theme/' . $t . '/php/style.php'))
- return('view/theme/' . $t . '/php/style.pcss');
- return('view/theme/' . $t . '/css/style.css');
- }
+ * Provide a sane default if nothing is chosen or the specified theme does not exist.
+ */
+
+function current_theme_url($installing = false) {
+ global $a;
+ $t = current_theme();
+ $uid = '';
+ $uid = (($a->profile_uid) ? '?f=&puid=' . $a->profile_uid : '');
+ if(file_exists('view/theme/' . $t . '/php/style.php'))
+ return('view/theme/' . $t . '/php/style.pcss' . $uid);
+ return('view/theme/' . $t . '/css/style.css');
}
+
function z_birthday($dob,$tz,$format="Y-m-d H:i:s") {
if(! strlen($tz))
@@ -1815,57 +2014,6 @@ function z_birthday($dob,$tz,$format="Y-m-d H:i:s") {
}
-
-if(! function_exists('feed_birthday')) {
- function feed_birthday($uid,$tz) {
-
- /**
- *
- * Determine the next birthday, but only if the birthday is published
- * in the default profile. We _could_ also look for a private profile that the
- * recipient can see, but somebody could get mad at us if they start getting
- * public birthday greetings when they haven't made this info public.
- *
- * Assuming we are able to publish this info, we are then going to convert
- * the start time from the owner's timezone to UTC.
- *
- * This will potentially solve the problem found with some social networks
- * where birthdays are converted to the viewer's timezone and salutations from
- * elsewhere in the world show up on the wrong day. We will convert it to the
- * viewer's timezone also, but first we are going to convert it from the birthday
- * person's timezone to GMT - so the viewer may find the birthday starting at
- * 6:00PM the day before, but that will correspond to midnight to the birthday person.
- *
- */
-
-
- $birthday = '';
-
- if(! strlen($tz))
- $tz = 'UTC';
-
- $p = q("SELECT `dob` FROM `profile` WHERE `is_default` = 1 AND `uid` = %d LIMIT 1",
- intval($uid)
- );
-
- if($p && count($p)) {
- $tmp_dob = substr($p[0]['dob'],5);
- if(intval($tmp_dob)) {
- $y = datetime_convert($tz,$tz,'now','Y');
- $bd = $y . '-' . $tmp_dob . ' 00:00';
- $t_dob = strtotime($bd);
- $now = strtotime(datetime_convert($tz,$tz,'now'));
- if($t_dob < $now)
- $bd = $y + 1 . '-' . $tmp_dob . ' 00:00';
- $birthday = datetime_convert($tz,'UTC',$bd,$format);
- }
- }
-
- return $birthday;
- }
-}
-
-if(! function_exists('is_site_admin')) {
function is_site_admin() {
$a = get_app();
if((intval($_SESSION['authenticated']))
@@ -1873,115 +2021,147 @@ function is_site_admin() {
&& ($a->account['account_roles'] & ACCOUNT_ROLE_ADMIN))
return true;
return false;
-}}
+}
-if(! function_exists('load_contact_links')) {
- function load_contact_links($uid) {
- $a = get_app();
+function load_contact_links($uid) {
- $ret = array();
+ $a = get_app();
- if(! $uid || x($a->contacts,'empty'))
- return;
+ $ret = array();
- logger('load_contact_links');
+ if(! $uid || x($a->contacts,'empty'))
+ return;
- $r = q("SELECT abook_id, abook_flags, abook_my_perms, abook_their_perms, xchan_hash, xchan_photo_m, xchan_name, xchan_url from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and not (abook_flags & %d) ",
- intval($uid),
- intval(ABOOK_FLAG_SELF)
- );
- if($r) {
- foreach($r as $rr){
- $ret[$rr['xchan_hash']] = $rr;
- }
+// logger('load_contact_links');
+
+ $r = q("SELECT abook_id, abook_flags, abook_my_perms, abook_their_perms, xchan_hash, xchan_photo_m, xchan_name, xchan_url from abook left join xchan on abook_xchan = xchan_hash where abook_channel = %d and not (abook_flags & %d) ",
+ intval($uid),
+ intval(ABOOK_FLAG_SELF)
+ );
+ if($r) {
+ foreach($r as $rr){
+ $ret[$rr['xchan_hash']] = $rr;
}
- else
- $ret['empty'] = true;
- $a->contacts = $ret;
- return;
}
+ else
+ $ret['empty'] = true;
+ $a->contacts = $ret;
+ return;
}
-if(! function_exists('profile_tabs')){
- function profile_tabs($a, $is_owner=False, $nickname=Null){
- //echo "<pre>"; var_dump($a->user); killme();
+
+
+function profile_tabs($a, $is_owner=False, $nickname=Null){
+ //echo "<pre>"; var_dump($a->user); killme();
- $channel = $a->get_channel();
+ $channel = $a->get_channel();
- if (is_null($nickname))
- $nickname = $channel['channel_address'];
+ if (is_null($nickname))
+ $nickname = $channel['channel_address'];
- if(x($_GET,'tab'))
- $tab = notags(trim($_GET['tab']));
+ if(x($_GET,'tab'))
+ $tab = notags(trim($_GET['tab']));
- $url = $a->get_baseurl() . '/channel/' . $nickname;
- $pr = $a->get_baseurl() . '/profile/' . $nickname;
-
- $tabs = array(
- array(
- 'label'=>t('Status'),
- 'url' => $url,
- 'sel' => ((argv(0)=='channel')?'active':''),
- 'title' => t('Status Messages and Posts'),
- 'id' => 'status-tab',
- ),
- array(
- 'label' => t('Profile'),
- 'url' => $pr,
- 'sel' => ((argv(0)=='profile')?'active':''),
- 'title' => t('Profile Details'),
- 'id' => 'profile-tab',
- ),
- array(
- 'label' => t('Photos'),
- 'url' => $a->get_baseurl() . '/photos/' . $nickname,
- 'sel' => ((argv(0)=='photos')?'active':''),
- 'title' => t('Photo Albums'),
- 'id' => 'photo-tab',
- ),
+ $url = $a->get_baseurl() . '/channel/' . $nickname;
+ $pr = $a->get_baseurl() . '/profile/' . $nickname;
+
+ $tabs = array(
+ array(
+ 'label' => t('Channel'),
+ 'url' => $url,
+ 'sel' => ((argv(0) == 'channel') ? 'active' : ''),
+ 'title' => t('Status Messages and Posts'),
+ 'id' => 'status-tab',
+ ),
+ array(
+ 'label' => t('About'),
+ 'url' => $pr,
+ 'sel' => ((argv(0) == 'profile') ? 'active' : ''),
+ 'title' => t('Profile Details'),
+ 'id' => 'profile-tab',
+ ),
+ array(
+ 'label' => t('Photos'),
+ 'url' => $a->get_baseurl() . '/photos/' . $nickname,
+ 'sel' => ((argv(0) == 'photos') ? 'active' : ''),
+ 'title' => t('Photo Albums'),
+ 'id' => 'photo-tab',
+ ),
+ );
+
+
+ if ($is_owner){
+ $tabs[] = array(
+ 'label' => t('Events'),
+ 'url' => $a->get_baseurl() . '/events',
+ 'sel' => ((argv(0) == 'events') ? 'active' : ''),
+ 'title' => t('Events and Calendar'),
+ 'id' => 'events-tab',
);
-
- if ($is_owner){
- $tabs[] = array(
- 'label' => t('Events'),
- 'url' => $a->get_baseurl() . '/events',
- 'sel' =>((argv(0)=='events')?'active':''),
- 'title' => t('Events and Calendar'),
- 'id' => 'events-tab',
- );
- }
+ if(feature_enabled(local_user(),'webpages')){
+ $tabs[] = array(
+ 'label' => t('Webpages'),
+ 'url' => $a->get_baseurl() . '/webpages/' . $nickname,
+ 'sel' => ((argv(0) == 'webpages') ? 'active' : ''),
+ 'title' => t('Manage Webpages'),
+ 'id' => 'webpages-tab',
+ );}
+ }
+ else {
+ // FIXME
+ // we probably need a listing of events that were created by
+ // this channel and are visible to the observer
- $arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => (($tab) ? $tab : false), 'tabs' => $tabs);
- call_hooks('profile_tabs', $arr);
+ }
+
+
+ $arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => (($tab) ? $tab : false), 'tabs' => $tabs);
+ call_hooks('profile_tabs', $arr);
- $tpl = get_markup_template('common_tabs.tpl');
+ $tpl = get_markup_template('common_tabs.tpl');
- return replace_macros($tpl,array('$tabs' => $arr['tabs']));
- }
+ return replace_macros($tpl,array('$tabs' => $arr['tabs']));
}
+
function get_my_url() {
+ if(x($_SESSION,'zrl_override'))
+ return $_SESSION['zrl_override'];
if(x($_SESSION,'my_url'))
return $_SESSION['my_url'];
return false;
}
function get_my_address() {
+ if(x($_SESSION,'zid_override'))
+ return $_SESSION['zid_override'];
if(x($_SESSION,'my_address'))
return $_SESSION['my_address'];
return false;
}
+/**
+ * @function zid_init(&$a)
+ * If somebody arrives at our site using a zid, add their xchan to our DB if we don't have it already.
+ * And if they aren't already authenticated here, attempt reverse magic auth.
+ *
+ * @hooks 'zid_init'
+ * string 'zid' - their zid
+ * string 'url' - the destination url
+ *
+ */
+
function zid_init(&$a) {
$tmp_str = get_my_address();
if(validate_email($tmp_str)) {
- proc_run('php','include/gprobe.php',$tmp_str);
+ proc_run('php','include/gprobe.php',bin2hex($tmp_str));
$arr = array('zid' => $tmp_str, 'url' => $a->cmd);
call_hooks('zid_init',$arr);
if((! local_user()) && (! remote_user())) {
+ logger('zid_init: not authenticated. Invoking reverse magic-auth');
$r = q("select * from hubloc where hubloc_addr = '%s' limit 1",
dbesc($tmp_str)
);
@@ -1989,33 +2169,57 @@ function zid_init(&$a) {
$dest = '/' . $a->query_string;
$dest = str_replace(array('?zid=','&zid='),array('?rzid=','&rzid='),$dest);
if($r && ($r[0]['hubloc_url'] != z_root()) && (! strstr($dest,'/magic')) && (! strstr($dest,'/rmagic'))) {
- goaway($r[0]['hubloc_url'] . '/magic' . '?f=&dest=' . z_root() . $dest);
+ goaway($r[0]['hubloc_url'] . '/magic' . '?f=&rev=1&dest=' . z_root() . $dest);
}
}
}
}
-function zid($s,$force = false) {
- if(! strlen($s))
+/**
+ * @function zid($s,$address = '')
+ * Adds a zid parameter to a url
+ * @param string $s
+ * The url to accept the zid
+ * @param boolean $address
+ * $address to use instead of session environment
+ * @return string
+ *
+ * @hooks 'zid'
+ * string url - url to accept zid
+ * string zid - urlencoded zid
+ * string result - the return string we calculated, change it if you want to return something else
+ */
+
+
+function zid($s,$address = '') {
+ if(! strlen($s) || strpos($s,'zid='))
return $s;
$has_params = ((strpos($s,'?')) ? true : false);
+ $num_slashes = substr_count($s,'/');
if(! $has_params)
$has_params = ((strpos($s,'&')) ? true : false);
$achar = strpos($s,'?') ? '&' : '?';
$mine = get_my_url();
- $myaddr = get_my_address();
- if($mine and ! link_compare($mine,$s))
- return $s . (($has_params) ? '' : '/') . $achar . 'zid=' . urlencode($myaddr);
- return $s;
+ $myaddr = (($address) ? $address : get_my_address());
+
+ if($mine && $myaddr && (! link_compare($mine,$s)))
+ $zurl = $s . (($num_slashes >= 3) ? '' : '/') . $achar . 'zid=' . urlencode($myaddr);
+ else
+ $zurl = $s;
+
+ $arr = array('url' => $s, 'zid' => urlencode($myaddr), 'result' => $zurl);
+ call_hooks('zid', $arr);
+ return $arr['result'];
}
/**
-* returns querystring as string from a mapped array
-*
-* @param params Array
-* @return string
-*/
+ * returns querystring as string from a mapped array
+ *
+ * @param params Array
+ * @return string
+ */
+
function build_querystring($params, $name=null) {
$ret = "";
foreach($params as $key=>$val) {
@@ -2084,10 +2288,12 @@ function construct_page(&$a) {
* Build the page - now that we have all the components
*/
+ $installing = false;
- if($a->module != 'install') {
+ if($a->module == 'setup')
+ $installing = true;
+ else
nav($a);
- }
require_once(theme_include('theme_init.php'));
@@ -2101,7 +2307,7 @@ function construct_page(&$a) {
head_add_css(((x($a->page,'template')) ? $a->page['template'] : 'default' ) . '.css');
head_add_css('mod_' . $a->module . '.css');
- head_add_css(current_theme_url());
+ head_add_css(current_theme_url($installing));
head_add_js('mod_' . $a->module . '.js');
@@ -2149,3 +2355,35 @@ function construct_page(&$a) {
function appdirpath() {
return dirname(__FILE__);
}
+
+
+function head_set_icon($icon) {
+ global $a;
+ $a->data['pageicon'] = $icon;
+ logger('head_set_icon: ' . $icon);
+}
+
+function head_get_icon() {
+ global $a;
+ $icon = $a->data['pageicon'];
+ if(! strpos($icon,'://'))
+ $icon = z_root() . $icon;
+ return $icon;
+}
+
+// Used from within PCSS themes to set theme parameters. If there's a
+// puid request variable, that is the "page owner" and normally their theme
+// settings take precedence; unless a local user sets the "always_my_theme"
+// system pconfig, which means they don't want to see anybody else's theme
+// settings except their own while on this site.
+
+function get_theme_uid() {
+ $uid = (($_REQUEST['puid']) ? intval($_REQUEST['puid']) : 0);
+ if(local_user()) {
+ if((get_pconfig(local_user(),'system','always_my_theme')) || (! $uid))
+ return local_user();
+ if(! $uid)
+ return local_user();
+ }
+ return $uid;
+}