use Friendica\Core\Protocol;
use Friendica\Core\System;
use Friendica\Core\Worker;
-use Friendica\Database\DBM;
+use Friendica\Database\DBA;
use Friendica\Database\DBStructure;
use Friendica\Model\Contact;
use Friendica\Model\Conversation;
define('FRIENDICA_PLATFORM', 'Friendica');
define('FRIENDICA_CODENAME', 'The Tazmans Flax-lily');
-define('FRIENDICA_VERSION', '2018.08-dev');
+define('FRIENDICA_VERSION', '2018.12-dev');
define('DFRN_PROTOCOL_VERSION', '2.23');
-define('DB_UPDATE_VERSION', 1276);
+define('DB_UPDATE_VERSION', 1288);
define('NEW_UPDATE_ROUTINE_VERSION', 1170);
/**
* @brief Image storage quality.
*
* Lower numbers save space at cost of image detail.
- * For ease of upgrade, please do not change here. Change jpeg quality with
- * $a->config['system']['jpeg_quality'] = n;
- * in .htconfig.php, where n is netween 1 and 100, and with very poor results
- * below about 50
+ * For ease of upgrade, please do not change here. Set [system] jpegquality = n in config/local.ini.php,
+ * where n is between 1 and 100, and with very poor results below about 50
*/
define('JPEG_QUALITY', 100);
/**
- * $a->config['system']['png_quality'] from 0 (uncompressed) to 9
+ * [system] png_quality = n where is between 0 (uncompressed) to 9
*/
define('PNG_QUALITY', 8);
* this length (on the longest side, the other side will be scaled appropriately).
* Modify this value using
*
- * $a->config['system']['max_image_length'] = n;
+ * [system]
+ * max_image_length = n;
*
- * in .htconfig.php
+ * in config/local.ini.php
*
* If you don't want to set a maximum length, set to -1. The default value is
* defined by 'MAX_IMAGE_LENGTH' below.
* log levels
* @{
*/
-define('LOGGER_NORMAL', 0);
-define('LOGGER_TRACE', 1);
-define('LOGGER_DEBUG', 2);
-define('LOGGER_DATA', 3);
-define('LOGGER_ALL', 4);
+define('LOGGER_WARNING', 0);
+define('LOGGER_INFO', 1);
+define('LOGGER_TRACE', 2);
+define('LOGGER_DEBUG', 3);
+define('LOGGER_DATA', 4);
+define('LOGGER_ALL', 5);
/* @}*/
/**
* @}
*/
-/**
- * @name Contact_is
- *
- * Relationship types
- * @{
- */
-define('CONTACT_IS_FOLLOWER', 1);
-define('CONTACT_IS_SHARING', 2);
-define('CONTACT_IS_FRIEND', 3);
-/**
- * @}
- */
-
/**
* @name Update
*
* @}
*/
-/**
- * @name page/profile types
- *
- * PAGE_NORMAL is a typical personal profile account
- * PAGE_SOAPBOX automatically approves all friend requests as CONTACT_IS_SHARING, (readonly)
- * PAGE_COMMUNITY automatically approves all friend requests as CONTACT_IS_SHARING, but with
- * write access to wall and comments (no email and not included in page owner's ACL lists)
- * PAGE_FREELOVE automatically approves all friend requests as full friends (CONTACT_IS_FRIEND).
- *
- * @{
- */
-define('PAGE_NORMAL', 0);
-define('PAGE_SOAPBOX', 1);
-define('PAGE_COMMUNITY', 2);
-define('PAGE_FREELOVE', 3);
-define('PAGE_BLOG', 4);
-define('PAGE_PRVGROUP', 5);
-/**
- * @}
- */
-
-/**
- * @name account types
- *
- * ACCOUNT_TYPE_PERSON - the account belongs to a person
- * Associated page types: PAGE_NORMAL, PAGE_SOAPBOX, PAGE_FREELOVE
- *
- * ACCOUNT_TYPE_ORGANISATION - the account belongs to an organisation
- * Associated page type: PAGE_SOAPBOX
- *
- * ACCOUNT_TYPE_NEWS - the account is a news reflector
- * Associated page type: PAGE_SOAPBOX
- *
- * ACCOUNT_TYPE_COMMUNITY - the account is community forum
- * Associated page types: PAGE_COMMUNITY, PAGE_PRVGROUP
- *
- * ACCOUNT_TYPE_RELAY - the account is a relay
- * This will only be assigned to contacts, not to user accounts
- * @{
- */
-define('ACCOUNT_TYPE_PERSON', 0);
-define('ACCOUNT_TYPE_ORGANISATION', 1);
-define('ACCOUNT_TYPE_NEWS', 2);
-define('ACCOUNT_TYPE_COMMUNITY', 3);
-define('ACCOUNT_TYPE_RELAY', 4);
-/**
- * @}
- */
-
/**
* @name CP
*
* @}
*/
-/**
- * @name Protocols
- * @deprecated since version 3.6
- * @see Conversation
- *
- * Different protocols that we are storing
- * @{
- */
-define('PROTOCOL_UNKNOWN' , Conversation::PROTOCOL_UNKNOWN);
-define('PROTOCOL_DFRN' , Conversation::PROTOCOL_DFRN);
-define('PROTOCOL_DIASPORA' , Conversation::PROTOCOL_DIASPORA);
-define('PROTOCOL_OSTATUS_SALMON' , Conversation::PROTOCOL_OSTATUS_SALMON);
-define('PROTOCOL_OSTATUS_FEED' , Conversation::PROTOCOL_OSTATUS_FEED); // Deprecated
-define('PROTOCOL_GS_CONVERSATION', Conversation::PROTOCOL_GS_CONVERSATION); // Deprecated
-define('PROTOCOL_SPLITTED_CONV' , Conversation::PROTOCOL_SPLITTED_CONV);
-/**
- * @}
- */
-
-/**
- * @name Network constants
- * @deprecated since version 3.6
- * @see Protocol
- *
- * Network and protocol family types
- * @{
- */
-define('NETWORK_DFRN' , Protocol::DFRN); // Friendica, Mistpark, other DFRN implementations
-define('NETWORK_ZOT' , Protocol::ZOT); // Zot! - Currently unsupported
-define('NETWORK_OSTATUS' , Protocol::OSTATUS); // GNU-social, Pleroma, Mastodon, other OStatus implementations
-define('NETWORK_FEED' , Protocol::FEED); // RSS/Atom feeds with no known "post/notify" protocol
-define('NETWORK_DIASPORA' , Protocol::DIASPORA); // Diaspora
-define('NETWORK_MAIL' , Protocol::MAIL); // IMAP/POP
-define('NETWORK_FACEBOOK' , Protocol::FACEBOOK); // Facebook API
-define('NETWORK_LINKEDIN' , Protocol::LINKEDIN); // LinkedIn
-define('NETWORK_XMPP' , Protocol::XMPP); // XMPP - Currently unsupported
-define('NETWORK_MYSPACE' , Protocol::MYSPACE); // MySpace - Currently unsupported
-define('NETWORK_GPLUS' , Protocol::GPLUS); // Google+
-define('NETWORK_PUMPIO' , Protocol::PUMPIO); // pump.io
-define('NETWORK_TWITTER' , Protocol::TWITTER); // Twitter
-define('NETWORK_DIASPORA2', Protocol::DIASPORA2); // Diaspora connector
-define('NETWORK_STATUSNET', Protocol::STATUSNET); // Statusnet connector
-define('NETWORK_APPNET' , Protocol::APPNET); // app.net - Dead protocol
-define('NETWORK_NEWS' , Protocol::NEWS); // Network News Transfer Protocol - Currently unsupported
-define('NETWORK_ICALENDAR', Protocol::ICALENDAR); // iCalendar - Currently unsupported
-define('NETWORK_PNUT' , Protocol::PNUT); // pnut.io - Currently unsupported
-define('NETWORK_PHANTOM' , Protocol::PHANTOM); // Place holder
-/**
- * @}
- */
-
/**
* These numbers are used in stored permissions
* and existing allocations MUST NEVER BE CHANGED
* OR RE-ASSIGNED! You may only add to them.
*/
$netgroup_ids = [
- NETWORK_DFRN => (-1),
- NETWORK_ZOT => (-2),
- NETWORK_OSTATUS => (-3),
- NETWORK_FEED => (-4),
- NETWORK_DIASPORA => (-5),
- NETWORK_MAIL => (-6),
- NETWORK_FACEBOOK => (-8),
- NETWORK_LINKEDIN => (-9),
- NETWORK_XMPP => (-10),
- NETWORK_MYSPACE => (-11),
- NETWORK_GPLUS => (-12),
- NETWORK_PUMPIO => (-13),
- NETWORK_TWITTER => (-14),
- NETWORK_DIASPORA2 => (-15),
- NETWORK_STATUSNET => (-16),
- NETWORK_APPNET => (-17),
- NETWORK_NEWS => (-18),
- NETWORK_ICALENDAR => (-19),
- NETWORK_PNUT => (-20),
-
- NETWORK_PHANTOM => (-127),
+ Protocol::DFRN => (-1),
+ Protocol::ZOT => (-2),
+ Protocol::OSTATUS => (-3),
+ Protocol::FEED => (-4),
+ Protocol::DIASPORA => (-5),
+ Protocol::MAIL => (-6),
+ Protocol::FACEBOOK => (-8),
+ Protocol::LINKEDIN => (-9),
+ Protocol::XMPP => (-10),
+ Protocol::MYSPACE => (-11),
+ Protocol::GPLUS => (-12),
+ Protocol::PUMPIO => (-13),
+ Protocol::TWITTER => (-14),
+ Protocol::DIASPORA2 => (-15),
+ Protocol::STATUSNET => (-16),
+ Protocol::NEWS => (-18),
+ Protocol::ICALENDAR => (-19),
+ Protocol::PNUT => (-20),
+
+ Protocol::PHANTOM => (-127),
];
/**
*/
function get_app()
{
- global $a;
-
- if (empty($a)) {
- $a = new App(dirname(__DIR__));
- BaseObject::setApp($a);
- }
-
- return $a;
+ return BaseObject::getApp();
}
/**
return $return;
}
-/**
- * @brief Returns the baseurl.
- *
- * @see System::baseUrl()
- *
- * @return string
- * @TODO Function is deprecated and only used in some addons
- */
-function z_root()
-{
- return System::baseUrl();
-}
-
-/**
- * @brief Return absolut URL for given $path.
- *
- * @param string $path given path
- *
- * @return string
- */
-function absurl($path)
-{
- if (strpos($path, '/') === 0) {
- return z_path() . $path;
- }
- return $path;
-}
-
-/**
- * @brief Function to check if request was an AJAX (xmlhttprequest) request.
- *
- * @return boolean
- */
-function is_ajax()
-{
- return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
-}
-
/**
* @brief Function to check if request was an AJAX (xmlhttprequest) request.
*
// and www.example.com vs example.com.
// We will only change the url to an ip address if there is no existing setting
- if (empty($url) || (!link_compare($url, System::baseUrl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->get_hostname))) {
+ if (empty($url) || (!link_compare($url, System::baseUrl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->getHostName()))) {
Config::set('system', 'url', System::baseUrl());
}
return;
}
+ // run the pre_update_nnnn functions in update.php
+ for ($x = $stored + 1; $x <= $current; $x++) {
+ $r = run_update_function($x, 'pre_update');
+ if (!$r) {
+ break;
+ }
+ }
+
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time());
- // run update routine
- // it update the structure in one call
+ // update the structure in one call
$retval = DBStructure::update(false, true);
if ($retval) {
DBStructure::updateFail(
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success');
}
- // run any left update_nnnn functions in update.php
+ // run the update_nnnn functions in update.php
for ($x = $stored + 1; $x <= $current; $x++) {
- $r = run_update_function($x);
+ $r = run_update_function($x, 'update');
if (!$r) {
break;
}
return;
}
-function run_update_function($x)
+function run_update_function($x, $prefix)
{
- if (function_exists('update_' . $x)) {
+ $funcname = $prefix . '_' . $x;
+
+ if (function_exists($funcname)) {
// 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
// If the update fails or times-out completely you may need to
// delete the config entry to try again.
- $t = Config::get('database', 'update_' . $x);
+ $t = Config::get('database', $funcname);
if (!is_null($t)) {
return false;
}
- Config::set('database', 'update_' . $x, time());
+ Config::set('database', $funcname, time());
// call the specific update
-
- $func = 'update_' . $x;
- $retval = $func();
+ $retval = $funcname();
if ($retval) {
//send the administrator an e-mail
);
return false;
} else {
- Config::set('database', 'update_' . $x, 'success');
- Config::set('system', 'build', $x);
+ Config::set('database', $funcname, 'success');
+
+ if ($prefix == 'update') {
+ Config::set('system', 'build', $x);
+ }
+
return true;
}
} else {
- Config::set('database', 'update_' . $x, 'success');
- Config::set('system', 'build', $x);
- return true;
- }
-}
-
-/**
- * @brief Synchronise addons:
- *
- * $a->config['system']['addon'] contains a comma-separated list of names
- * of 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 addon that isn't installed,
- * call the install procedure and add it to the database.
- *
- * @param object $a App
- */
-function check_addons(App $a)
-{
- $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
- if (DBM::is_result($r)) {
- $installed = $r;
- } else {
- $installed = [];
- }
-
- $addons = Config::get('system', 'addon');
- $addons_arr = [];
-
- if ($addons) {
- $addons_arr = explode(',', str_replace(' ', '', $addons));
- }
-
- $a->addons = $addons_arr;
+ Config::set('database', $funcname, 'success');
- $installed_arr = [];
-
- if (count($installed)) {
- foreach ($installed as $i) {
- if (!in_array($i['name'], $addons_arr)) {
- Addon::uninstall($i['name']);
- } else {
- $installed_arr[] = $i['name'];
- }
+ if ($prefix == 'update') {
+ Config::set('system', 'build', $x);
}
- }
- if (count($addons_arr)) {
- foreach ($addons_arr as $p) {
- if (!in_array($p, $installed_arr)) {
- Addon::install($p);
- }
- }
+ return true;
}
-
- Addon::loadHooks();
-
- return;
}
/**
/**
* @brief Redirect to another URL and terminate this process.
*/
-function goaway($path)
+function goaway($path = '')
{
if (strstr(normalise_link($path), 'http://')) {
$url = $path;
*/
function notice($s)
{
+ if (empty($_SESSION)) {
+ return;
+ }
+
$a = get_app();
if (!x($_SESSION, 'sysmsg')) {
$_SESSION['sysmsg'] = [];
}
}
-/**
- * @brief Wrapper around config to limit the text length of an incoming message
- *
- * @return int
- */
-function get_max_import_size()
-{
- $a = get_app();
- return (x($a->config, 'max_import_size') ? $a->config['max_import_size'] : 0);
-}
-
function feed_birthday($uid, $tz)
{
/**
$tz = 'UTC';
}
- $p = q(
- "SELECT `dob` FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1",
- intval($uid)
- );
-
- if (DBM::is_result($p)) {
- $tmp_dob = substr($p[0]['dob'], 5);
+ $profile = DBA::selectFirst('profile', ['dob'], ['is-default' => true, 'uid' => $uid]);
+ if (DBA::isResult($profile)) {
+ $tmp_dob = substr($profile['dob'], 5);
if (intval($tmp_dob)) {
$y = DateTimeFormat::timezoneNow($tz, 'Y');
$bd = $y . '-' . $tmp_dob . ' 00:00';
{
$a = get_app();
- $adminlist = explode(",", str_replace(" ", "", $a->config['admin_email']));
+ $admin_email = Config::get('config', 'admin_email');
- //if(local_user() && x($a->user,'email') && x($a->config,'admin_email') && ($a->user['email'] === $a->config['admin_email']))
- /// @TODO This if() + 2 returns can be shrinked into one return
- if (local_user() && x($a->user, 'email') && x($a->config, 'admin_email') && in_array($a->user['email'], $adminlist)) {
- return true;
- }
- return false;
+ $adminlist = explode(',', str_replace(' ', '', $admin_email));
+
+ return local_user() && $admin_email && in_array(defaults($a->user, 'email', ''), $adminlist);
}
/**
function curPageURL()
{
$pageURL = 'http';
- if ($_SERVER["HTTPS"] == "on") {
+ if (!empty($_SERVER["HTTPS"]) && ($_SERVER["HTTPS"] == "on")) {
$pageURL .= "s";
}
$temppath = Config::get("system", "temppath");
- if (($temppath != "") && App::directory_usable($temppath)) {
+ if (($temppath != "") && App::isDirectoryUsable($temppath)) {
// We have a temp path and it is usable
- return App::realpath($temppath);
+ return App::getRealPath($temppath);
}
// We don't have a working preconfigured temp path, so we take the system path.
$temppath = sys_get_temp_dir();
// Check if it is usable
- if (($temppath != "") && App::directory_usable($temppath)) {
+ if (($temppath != "") && App::isDirectoryUsable($temppath)) {
// Always store the real path, not the path through symlinks
- $temppath = App::realpath($temppath);
+ $temppath = App::getRealPath($temppath);
// To avoid any interferences with other systems we create our own directory
- $new_temppath = $temppath . "/" . $a->get_hostname();
+ $new_temppath = $temppath . "/" . $a->getHostName();
if (!is_dir($new_temppath)) {
/// @TODO There is a mkdir()+chmod() upwards, maybe generalize this (+ configurable) into a function/method?
mkdir($new_temppath);
}
- if (App::directory_usable($new_temppath)) {
+ if (App::isDirectoryUsable($new_temppath)) {
// The new path is usable, we are happy
Config::set("system", "temppath", $new_temppath);
return $new_temppath;
}
$itemcache = Config::get('system', 'itemcache');
- if (($itemcache != "") && App::directory_usable($itemcache)) {
- return App::realpath($itemcache);
+ if (($itemcache != "") && App::isDirectoryUsable($itemcache)) {
+ return App::getRealPath($itemcache);
}
$temppath = get_temppath();
mkdir($itemcache);
}
- if (App::directory_usable($itemcache)) {
+ if (App::isDirectoryUsable($itemcache)) {
Config::set("system", "itemcache", $itemcache);
return $itemcache;
}
function get_spoolpath()
{
$spoolpath = Config::get('system', 'spoolpath');
- if (($spoolpath != "") && App::directory_usable($spoolpath)) {
+ if (($spoolpath != "") && App::isDirectoryUsable($spoolpath)) {
// We have a spool path and it is usable
return $spoolpath;
}
mkdir($spoolpath);
}
- if (App::directory_usable($spoolpath)) {
+ if (App::isDirectoryUsable($spoolpath)) {
// The new path is usable, we are happy
Config::set("system", "spoolpath", $spoolpath);
return $spoolpath;
return $valid;
}
-function current_load()
-{
- if (!function_exists('sys_getloadavg')) {
- return false;
- }
-
- $load_arr = sys_getloadavg();
-
- if (!is_array($load_arr)) {
- return false;
- }
-
- return max($load_arr[0], $load_arr[1]);
-}
-
-/**
- * @brief get c-style args
- *
- * @return int
- */
-function argc()
-{
- return get_app()->argc;
-}
-
-/**
- * @brief Returns the value of a argv key
- *
- * @param int $x argv key
- * @return string Value of the argv key
- */
-function argv($x)
-{
- if (array_key_exists($x, get_app()->argv)) {
- return get_app()->argv[$x];
- }
-
- return '';
-}
-
/**
* @brief Get the data which is needed for infinite scroll
*