require_once(__DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php');
use Friendica\App;
+use Friendica\Core\System;
use Friendica\Core\Config;
+use Friendica\Util\Lock;
require_once 'include/config.php';
require_once 'include/network.php';
require_once 'include/identity.php';
require_once 'update.php';
require_once 'include/dbstructure.php';
+require_once 'include/poller.php';
define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_CODENAME', 'Asparagus');
-define ( 'FRIENDICA_VERSION', '3.5.3dev' );
+define ( 'FRIENDICA_VERSION', '3.6-dev' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
-define ( 'DB_UPDATE_VERSION', 1227 );
+define ( 'DB_UPDATE_VERSION', 1235 );
/**
* @brief Constant with a HTML line break.
define('PROTOCOL_DFRN', 1);
define('PROTOCOL_DIASPORA', 2);
define('PROTOCOL_OSTATUS_SALMON', 3);
-define('PROTOCOL_OSTATUS_FEED', 4);
-define('PROTOCOL_GS_CONVERSATION', 5);
+define('PROTOCOL_OSTATUS_FEED', 4); // Deprecated
+define('PROTOCOL_GS_CONVERSATION', 5); // Deprecated
+define('PROTOCOL_SPLITTED_CONV', 6);
/** @}*/
/**
define ( 'NOTIFY_POKE', 0x0200 );
define ( 'NOTIFY_SHARE', 0x0400 );
+define ( 'SYSTEM_EMAIL', 0x4000 );
+
define ( 'NOTIFY_SYSTEM', 0x8000 );
/* @}*/
define ( 'ACTIVITY_UPDATE', NAMESPACE_ACTIVITY_SCHEMA . 'update' );
define ( 'ACTIVITY_TAG', NAMESPACE_ACTIVITY_SCHEMA . 'tag' );
define ( 'ACTIVITY_FAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'favorite' );
+define ( 'ACTIVITY_UNFAVORITE', NAMESPACE_ACTIVITY_SCHEMA . 'unfavorite' );
define ( 'ACTIVITY_SHARE', NAMESPACE_ACTIVITY_SCHEMA . 'share' );
define ( 'ACTIVITY_DELETE', NAMESPACE_ACTIVITY_SCHEMA . 'delete' );
*/
function get_app() {
global $a;
+
+ if (empty($a)) {
+ $a = new App(dirname(__DIR__));
+ }
+
return $a;
}
killme();
}
-function clean_urls() {
- $a = get_app();
- return true;
-}
-
-function z_path() {
- $base = App::get_baseurl();
-
- if (!clean_urls()) {
- $base .= '/?q=';
- }
-
- return $base;
-}
-
/**
* @brief Returns the baseurl.
*
- * @see App::get_baseurl()
+ * @see System::baseUrl()
*
* @return string
- * @TODO Maybe super-flous and deprecated? Seems to only wrap App::get_baseurl()
+ * @TODO Function is deprecated and only used in some addons
*/
function z_root() {
- return App::get_baseurl();
+ return System::baseUrl();
}
/**
return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
}
-function check_db() {
+/**
+ * @brief Function to check if request was an AJAX (xmlhttprequest) request.
+ *
+ * @param $via_worker boolean Is the check run via the poller?
+ */
+function check_db($via_worker) {
$build = get_config('system', 'build');
if (!x($build)) {
$build = DB_UPDATE_VERSION;
}
if ($build != DB_UPDATE_VERSION) {
- proc_run(PRIORITY_CRITICAL, 'include/dbupdate.php');
+ // When we cannot execute the database update via the worker, we will do it directly
+ if (!Worker::add(PRIORITY_CRITICAL, 'dbupdate') && $via_worker) {
+ update_db(get_app());
+ }
}
}
// We will only change the url to an ip address if there is no existing setting
if (!x($url)) {
- $url = set_config('system', 'url', App::get_baseurl());
+ $url = set_config('system', 'url', System::baseUrl());
}
- if ((!link_compare($url, App::get_baseurl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->get_hostname))) {
- $url = set_config('system', 'url', App::get_baseurl());
+ if ((!link_compare($url, System::baseUrl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->get_hostname))) {
+ $url = set_config('system', 'url', System::baseUrl());
}
return;
* @brief Used to end the current process, after saving session state.
*/
function killme() {
+ global $session_exists;
+
if (!get_app()->is_backend()) {
- session_write_close();
+ if (!$session_exists) {
+ session_abort();
+ } else {
+ session_write_close();
+ }
}
exit();
*/
function goaway($s) {
if (!strstr(normalise_link($s), "http://")) {
- $s = App::get_baseurl() . "/" . $s;
+ $s = System::baseUrl() . "/" . $s;
}
header("Location: $s");
* @return int|bool visitor_id or false
*/
function remote_user() {
+ // You cannot be both local and remote
+ if (local_user()) {
+ return false;
+ }
if ((x($_SESSION, 'authenticated')) && (x($_SESSION, 'visitor_id'))) {
return intval($_SESSION['visitor_id']);
}
function info($s) {
$a = get_app();
- if (local_user() AND get_pconfig(local_user(), 'system', 'ignore_info')) {
+ if (local_user() && get_pconfig(local_user(), 'system', 'ignore_info')) {
return;
}
}
/**
- * @brief Wrap calls to proc_close(proc_open()) and call hook
- * so plugins can take part in process :)
+ * @brief compatibilty wrapper for Worker::add function
*
* @param (integer|array) priority or parameter array, $cmd atrings are deprecated and are ignored
*
- * next args are passed as $cmd command line
- * or: proc_run(PRIORITY_HIGH, "include/notifier.php", "drop", $drop_id);
- * or: proc_run(array('priority' => PRIORITY_HIGH, 'dont_fork' => true), "include/create_shadowentry.php", $post_id);
- *
- * @note $cmd and string args are surrounded with ""
- *
- * @hooks 'proc_run'
- * array $arr
+ * @return boolean "false" if proc_run couldn't be executed
*/
-function proc_run($cmd) {
-
- $a = get_app();
-
+function proc_run() {
$proc_args = func_get_args();
-
- $args = array();
- if (!count($proc_args)) {
- return;
- }
-
- // Preserve the first parameter
- // It could contain a command, the priority or an parameter array
- // If we use the parameter array we have to protect it from the following function
- $run_parameter = array_shift($proc_args);
-
- // expand any arrays
- foreach ($proc_args as $arg) {
- if (is_array($arg)) {
- foreach ($arg as $n) {
- $args[] = $n;
- }
- } else {
- $args[] = $arg;
- }
- }
-
- // Now we add the run parameters back to the array
- array_unshift($args, $run_parameter);
-
- $arr = array('args' => $args, 'run_cmd' => true);
-
- call_hooks("proc_run", $arr);
- if (!$arr['run_cmd'] OR ! count($args)) {
- return;
- }
-
- $priority = PRIORITY_MEDIUM;
- $dont_fork = get_config("system", "worker_dont_fork");
-
- if (is_int($run_parameter)) {
- $priority = $run_parameter;
- } elseif (is_array($run_parameter)) {
- if (isset($run_parameter['priority'])) {
- $priority = $run_parameter['priority'];
- }
- if (isset($run_parameter['dont_fork'])) {
- $dont_fork = $run_parameter['dont_fork'];
- }
- }
-
- $argv = $args;
- array_shift($argv);
-
- $parameters = json_encode($argv);
- $found = dba::select('workerqueue', array('id'), array('parameter' => $parameters), array('limit' => 1));
-
- if (!dbm::is_result($found)) {
- dba::insert('workerqueue', array('parameter' => $parameters, 'created' => datetime_convert(), 'priority' => $priority));
- }
-
- // Should we quit and wait for the poller to be called as a cronjob?
- if ($dont_fork) {
- return;
- }
-
- // Checking number of workers
- $workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` > '%s'", dbesc(NULL_DATE));
-
- // Get number of allowed number of worker threads
- $queues = intval(get_config("system", "worker_queues"));
-
- if ($queues == 0) {
- $queues = 4;
- }
-
- // If there are already enough workers running, don't fork another one
- if ($workers[0]["workers"] >= $queues) {
- return;
- }
-
- // Now call the poller to execute the jobs that we just added to the queue
- $args = array("include/poller.php", "no_cron");
-
- $a->proc_run($args);
+ call_user_func_array('Friendica\Core\Worker::add', $proc_args);
}
function current_theme() {
return($server);
}
+function get_temppath() {
+ $a = get_app();
+
+ $temppath = get_config("system", "temppath");
+
+ if (($temppath != "") && App::directory_usable($temppath)) {
+ // We have a temp path and it is usable
+ return App::realpath($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)) {
+ // Always store the real path, not the path through symlinks
+ $temppath = App::realpath($temppath);
+
+ // To avoid any interferences with other systems we create our own directory
+ $new_temppath = $temppath . "/" . $a->get_hostname();
+ 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)) {
+ // The new path is usable, we are happy
+ set_config("system", "temppath", $new_temppath);
+ return $new_temppath;
+ } else {
+ // We can't create a subdirectory, strange.
+ // But the directory seems to work, so we use it but don't store it.
+ return $temppath;
+ }
+ }
+
+ // Reaching this point means that the operating system is configured badly.
+ return '';
+}
+
function get_cachefile($file, $writemode = true) {
$cache = get_itemcachepath();
$path = $basepath;
}
- if (($path == "") OR (!is_dir($path))) {
+ if (($path == "") || (!is_dir($path))) {
return;
}
if ($dh = opendir($path)) {
while (($file = readdir($dh)) !== false) {
$fullpath = $path . "/" . $file;
- if ((filetype($fullpath) == "dir") and ($file != ".") and ($file != "..")) {
+ if ((filetype($fullpath) == "dir") && ($file != ".") && ($file != "..")) {
clear_cache($basepath, $fullpath);
}
- if ((filetype($fullpath) == "file") and (filectime($fullpath) < (time() - $cachetime))) {
+ if ((filetype($fullpath) == "file") && (filectime($fullpath) < (time() - $cachetime))) {
unlink($fullpath);
}
}
}
$itemcache = get_config('system', 'itemcache');
- if (($itemcache != "") AND App::directory_usable($itemcache)) {
- return $itemcache;
+ if (($itemcache != "") && App::directory_usable($itemcache)) {
+ return App::realpath($itemcache);
}
$temppath = get_temppath();
*/
function get_spoolpath() {
$spoolpath = get_config('system', 'spoolpath');
- if (($spoolpath != "") AND App::directory_usable($spoolpath)) {
+ if (($spoolpath != "") && App::directory_usable($spoolpath)) {
// We have a spool path and it is usable
return $spoolpath;
}
return "";
}
-function get_temppath() {
- $a = get_app();
-
- $temppath = get_config("system", "temppath");
-
- if (($temppath != "") AND App::directory_usable($temppath)) {
- // We have a temp path and it is usable
- return $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 != "") AND App::directory_usable($temppath)) {
- // To avoid any interferences with other systems we create our own directory
- $new_temppath = $temppath . "/" . $a->get_hostname();
- 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)) {
- // The new path is usable, we are happy
- set_config("system", "temppath", $new_temppath);
- return $new_temppath;
- } else {
- // We can't create a subdirectory, strange.
- // But the directory seems to work, so we use it but don't store it.
- return $temppath;
- }
- }
-
- // Reaching this point means that the operating system is configured badly.
- return '';
-}
-
/// @deprecated
function set_template_engine(App $a, $engine = 'internal') {
/// @note This function is no longer necessary, but keep it as a wrapper to the class method
function infinite_scroll_data($module) {
if (get_pconfig(local_user(), 'system', 'infinite_scroll')
- AND ($module == "network") AND ($_GET["mode"] != "minimal")) {
+ && ($module == "network") && ($_GET["mode"] != "minimal")) {
// get the page number
if (is_string($_GET["page"])) {
// try to get the uri from which we load the content
foreach ($_GET AS $param => $value) {
- if (($param != "page") AND ($param != "q")) {
+ if (($param != "page") && ($param != "q")) {
$reload_uri .= "&" . $param . "=" . urlencode($value);
}
}
- if (($a->page_offset != "") AND ! strstr($reload_uri, "&offset=")) {
+ if (($a->page_offset != "") && ! strstr($reload_uri, "&offset=")) {
$reload_uri .= "&offset=" . urlencode($a->page_offset);
}