Merge remote-tracking branch 'upstream/develop' into 1601-api-statuses-lookup

This commit is contained in:
Michael 2017-03-25 11:25:47 +00:00
commit 4665cda00e
73 changed files with 11339 additions and 10913 deletions

117
boot.php
View file

@ -32,7 +32,6 @@ require_once('include/cache.php');
require_once('library/Mobile_Detect/Mobile_Detect.php'); require_once('library/Mobile_Detect/Mobile_Detect.php');
require_once('include/features.php'); require_once('include/features.php');
require_once('include/identity.php'); require_once('include/identity.php');
require_once('include/pidfile.php');
require_once('update.php'); require_once('update.php');
require_once('include/dbstructure.php'); require_once('include/dbstructure.php');
@ -40,7 +39,7 @@ define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_CODENAME', 'Asparagus'); define ( 'FRIENDICA_CODENAME', 'Asparagus');
define ( 'FRIENDICA_VERSION', '3.5.2-dev' ); define ( 'FRIENDICA_VERSION', '3.5.2-dev' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1215 ); define ( 'DB_UPDATE_VERSION', 1216 );
/** /**
* @brief Constant with a HTML line break. * @brief Constant with a HTML line break.
@ -442,10 +441,17 @@ define('SR_SCOPE_ALL', 'all');
define('SR_SCOPE_TAGS', 'tags'); define('SR_SCOPE_TAGS', 'tags');
/* @}*/ /* @}*/
// Normally this constant is defined - but not if "pcntl" isn't installed /**
if (!defined("SIGTERM")) * Lowest possible date time value
define("SIGTERM", 15); */
define ('NULL_DATE', '0001-01-01 00:00:00');
// Normally this constant is defined - but not if "pcntl" isn't installed
if (!defined("SIGTERM")) {
define("SIGTERM", 15);
}
/** /**
* *
* Reverse the effect of magic_quotes_gpc if it is enabled. * Reverse the effect of magic_quotes_gpc if it is enabled.
@ -1346,60 +1352,25 @@ class App {
return false; return false;
} }
/**
* @brief Checks if the process is already running
*
* @param string $taskname The name of the task that will be used for the name of the lockfile
* @param string $task The path and name of the php script
* @param int $timeout The timeout after which a task should be killed
*
* @return bool Is the process running?
*/
function is_already_running($taskname, $task = "", $timeout = 540) {
$lockpath = get_lockpath();
if ($lockpath != '') {
$pidfile = new pidfile($lockpath, $taskname);
if ($pidfile->is_already_running()) {
logger("Already running");
if ($pidfile->running_time() > $timeout) {
$pidfile->kill();
logger("killed stale process");
// Calling a new instance
if ($task != "")
proc_run(PRIORITY_MEDIUM, $task);
}
return true;
}
}
return false;
}
function proc_run($args) { function proc_run($args) {
if (!function_exists("proc_open")) { if (!function_exists("proc_open")) {
return; return;
} }
// Add the php path if it is a php call // If the last worker fork was less than 10 seconds before then don't fork another one.
if (count($args) && ($args[0] === 'php' OR !is_string($args[0]))) { // This should prevent the forking of masses of workers.
$cachekey = "app:proc_run:started";
// If the last worker fork was less than 10 seconds before then don't fork another one. $result = Cache::get($cachekey);
// This should prevent the forking of masses of workers. if (!is_null($result)) {
if (get_config("system", "worker")) { if ((time() - $result) < 10) {
$cachekey = "app:proc_run:started"; return;
$result = Cache::get($cachekey);
if (!is_null($result)) {
if ((time() - $result) < 10) {
return;
}
}
// Set the timestamp of the last proc_run
Cache::set($cachekey, time(), CACHE_MINUTE);
} }
$args[0] = ((x($this->config,'php_path')) && (strlen($this->config['php_path'])) ? $this->config['php_path'] : 'php');
} }
// Set the timestamp of the last proc_run
Cache::set($cachekey, time(), CACHE_MINUTE);
array_unshift($args, ((x($this->config,'php_path')) && (strlen($this->config['php_path'])) ? $this->config['php_path'] : 'php'));
// add baseurl to args. cli scripts can't construct it // add baseurl to args. cli scripts can't construct it
$args[] = $this->get_baseurl(); $args[] = $this->get_baseurl();
@ -1976,10 +1947,9 @@ function get_max_import_size() {
* @brief Wrap calls to proc_close(proc_open()) and call hook * @brief Wrap calls to proc_close(proc_open()) and call hook
* so plugins can take part in process :) * so plugins can take part in process :)
* *
* @param (string|integer|array) $cmd program to run, priority or parameter array * @param (integer|array) priority or parameter array, $cmd atrings are deprecated and are ignored
* *
* next args are passed as $cmd command line * next args are passed as $cmd command line
* e.g.: proc_run("ls","-la","/tmp");
* or: proc_run(PRIORITY_HIGH, "include/notifier.php", "drop", $drop_id); * 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); * or: proc_run(array('priority' => PRIORITY_HIGH, 'dont_fork' => true), "include/create_shadowentry.php", $post_id);
* *
@ -2024,11 +1994,6 @@ function proc_run($cmd){
if (!$arr['run_cmd'] OR !count($args)) if (!$arr['run_cmd'] OR !count($args))
return; return;
if (!get_config("system", "worker") OR (is_string($run_parameter) AND ($run_parameter != 'php'))) {
$a->proc_run($args);
return;
}
$priority = PRIORITY_MEDIUM; $priority = PRIORITY_MEDIUM;
$dont_fork = get_config("system", "worker_dont_fork"); $dont_fork = get_config("system", "worker_dont_fork");
@ -2063,7 +2028,7 @@ function proc_run($cmd){
} }
// Checking number of workers // Checking number of workers
$workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'"); $workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` > '%s'", dbesc(NULL_DATE));
// Get number of allowed number of worker threads // Get number of allowed number of worker threads
$queues = intval(get_config("system", "worker_queues")); $queues = intval(get_config("system", "worker_queues"));
@ -2076,7 +2041,7 @@ function proc_run($cmd){
return; return;
// Now call the poller to execute the jobs that we just added to the queue // Now call the poller to execute the jobs that we just added to the queue
$args = array("php", "include/poller.php", "no_cron"); $args = array("include/poller.php", "no_cron");
$a->proc_run($args); $a->proc_run($args);
} }
@ -2410,38 +2375,6 @@ function get_itemcachepath() {
return ""; return "";
} }
function get_lockpath() {
$lockpath = get_config('system','lockpath');
if (($lockpath != "") AND App::directory_usable($lockpath)) {
// We have a lock path and it is usable
return $lockpath;
}
// We don't have a working preconfigured lock path, so we take the temp path.
$temppath = get_temppath();
if ($temppath != "") {
// To avoid any interferences with other systems we create our own directory
$lockpath = $temppath."/lock";
if (!is_dir($lockpath)) {
mkdir($lockpath);
}
if (App::directory_usable($lockpath)) {
// The new path is usable, we are happy
set_config("system", "lockpath", $lockpath);
return $lockpath;
} 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 "";
}
/** /**
* @brief Returns the path where spool files are stored * @brief Returns the path where spool files are stored
* *

View file

@ -1,5 +1,5 @@
-- ------------------------------------------ -- ------------------------------------------
-- Friendica 3.5.1-rc (Asparagus) -- Friendica 3.5.2-dev (Asparagus)
-- DB_UPDATE_VERSION 1215 -- DB_UPDATE_VERSION 1215
-- ------------------------------------------ -- ------------------------------------------
@ -30,8 +30,8 @@ CREATE TABLE IF NOT EXISTS `attach` (
`filetype` varchar(64) NOT NULL DEFAULT '', `filetype` varchar(64) NOT NULL DEFAULT '',
`filesize` int(11) NOT NULL DEFAULT 0, `filesize` int(11) NOT NULL DEFAULT 0,
`data` longblob NOT NULL, `data` longblob NOT NULL,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`allow_cid` mediumtext, `allow_cid` mediumtext,
`allow_gid` mediumtext, `allow_gid` mediumtext,
`deny_cid` mediumtext, `deny_cid` mediumtext,
@ -58,7 +58,7 @@ CREATE TABLE IF NOT EXISTS `cache` (
`k` varbinary(255) NOT NULL, `k` varbinary(255) NOT NULL,
`v` mediumtext, `v` mediumtext,
`expire_mode` int(11) NOT NULL DEFAULT 0, `expire_mode` int(11) NOT NULL DEFAULT 0,
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`k`), PRIMARY KEY(`k`),
INDEX `expire_mode_updated` (`expire_mode`,`updated`) INDEX `expire_mode_updated` (`expire_mode`,`updated`)
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;
@ -107,7 +107,7 @@ CREATE TABLE IF NOT EXISTS `config` (
CREATE TABLE IF NOT EXISTS `contact` ( CREATE TABLE IF NOT EXISTS `contact` (
`id` int(11) NOT NULL auto_increment, `id` int(11) NOT NULL auto_increment,
`uid` int(11) NOT NULL DEFAULT 0, `uid` int(11) NOT NULL DEFAULT 0,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`self` tinyint(1) NOT NULL DEFAULT 0, `self` tinyint(1) NOT NULL DEFAULT 0,
`remote_self` tinyint(1) NOT NULL DEFAULT 0, `remote_self` tinyint(1) NOT NULL DEFAULT 0,
`rel` tinyint(1) NOT NULL DEFAULT 0, `rel` tinyint(1) NOT NULL DEFAULT 0,
@ -145,14 +145,14 @@ CREATE TABLE IF NOT EXISTS `contact` (
`usehub` tinyint(1) NOT NULL DEFAULT 0, `usehub` tinyint(1) NOT NULL DEFAULT 0,
`subhub` tinyint(1) NOT NULL DEFAULT 0, `subhub` tinyint(1) NOT NULL DEFAULT 0,
`hub-verify` varchar(255) NOT NULL DEFAULT '', `hub-verify` varchar(255) NOT NULL DEFAULT '',
`last-update` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `last-update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`success_update` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `success_update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`failure_update` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `failure_update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`name-date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `name-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`uri-date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `uri-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`avatar-date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `avatar-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`term-date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `term-date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`last-item` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `last-item` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`priority` tinyint(3) NOT NULL DEFAULT 0, `priority` tinyint(3) NOT NULL DEFAULT 0,
`blocked` tinyint(1) NOT NULL DEFAULT 1, `blocked` tinyint(1) NOT NULL DEFAULT 1,
`readonly` tinyint(1) NOT NULL DEFAULT 0, `readonly` tinyint(1) NOT NULL DEFAULT 0,
@ -197,25 +197,13 @@ CREATE TABLE IF NOT EXISTS `conv` (
`recips` text, `recips` text,
`uid` int(11) NOT NULL DEFAULT 0, `uid` int(11) NOT NULL DEFAULT 0,
`creator` varchar(255) NOT NULL DEFAULT '', `creator` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`subject` text, `subject` text,
PRIMARY KEY(`id`), PRIMARY KEY(`id`),
INDEX `uid` (`uid`) INDEX `uid` (`uid`)
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;
--
-- TABLE deliverq
--
CREATE TABLE IF NOT EXISTS `deliverq` (
`id` int(10) unsigned NOT NULL auto_increment,
`cmd` varbinary(32) NOT NULL DEFAULT '',
`item` int(11) NOT NULL DEFAULT 0,
`contact` int(11) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`),
UNIQUE INDEX `cmd_item_contact` (`cmd`,`item`,`contact`)
) DEFAULT CHARSET=utf8mb4;
-- --
-- TABLE event -- TABLE event
-- --
@ -225,10 +213,10 @@ CREATE TABLE IF NOT EXISTS `event` (
`uid` int(11) NOT NULL DEFAULT 0, `uid` int(11) NOT NULL DEFAULT 0,
`cid` int(11) NOT NULL DEFAULT 0, `cid` int(11) NOT NULL DEFAULT 0,
`uri` varchar(255) NOT NULL DEFAULT '', `uri` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`start` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `start` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`finish` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `finish` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`summary` text, `summary` text,
`desc` text, `desc` text,
`location` text, `location` text,
@ -264,7 +252,7 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
`network` varchar(32) NOT NULL DEFAULT '', `network` varchar(32) NOT NULL DEFAULT '',
`alias` varchar(255) NOT NULL DEFAULT '', `alias` varchar(255) NOT NULL DEFAULT '',
`pubkey` text, `pubkey` text,
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`id`), PRIMARY KEY(`id`),
INDEX `addr` (`addr`(32)), INDEX `addr` (`addr`(32)),
INDEX `url` (`url`) INDEX `url` (`url`)
@ -305,7 +293,7 @@ CREATE TABLE IF NOT EXISTS `fsuggest` (
`request` varchar(255) NOT NULL DEFAULT '', `request` varchar(255) NOT NULL DEFAULT '',
`photo` varchar(255) NOT NULL DEFAULT '', `photo` varchar(255) NOT NULL DEFAULT '',
`note` text, `note` text,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`id`) PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;
@ -332,10 +320,10 @@ CREATE TABLE IF NOT EXISTS `gcontact` (
`nurl` varchar(255) NOT NULL DEFAULT '', `nurl` varchar(255) NOT NULL DEFAULT '',
`photo` varchar(255) NOT NULL DEFAULT '', `photo` varchar(255) NOT NULL DEFAULT '',
`connect` varchar(255) NOT NULL DEFAULT '', `connect` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`updated` datetime DEFAULT '0000-00-00 00:00:00', `updated` datetime DEFAULT '0001-01-01 00:00:00',
`last_contact` datetime DEFAULT '0000-00-00 00:00:00', `last_contact` datetime DEFAULT '0001-01-01 00:00:00',
`last_failure` datetime DEFAULT '0000-00-00 00:00:00', `last_failure` datetime DEFAULT '0001-01-01 00:00:00',
`location` varchar(255) NOT NULL DEFAULT '', `location` varchar(255) NOT NULL DEFAULT '',
`about` text, `about` text,
`keywords` text, `keywords` text,
@ -369,7 +357,7 @@ CREATE TABLE IF NOT EXISTS `glink` (
`uid` int(11) NOT NULL DEFAULT 0, `uid` int(11) NOT NULL DEFAULT 0,
`gcid` int(11) NOT NULL DEFAULT 0, `gcid` int(11) NOT NULL DEFAULT 0,
`zcid` int(11) NOT NULL DEFAULT 0, `zcid` int(11) NOT NULL DEFAULT 0,
`updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`id`), PRIMARY KEY(`id`),
UNIQUE INDEX `cid_uid_gcid_zcid` (`cid`,`uid`,`gcid`,`zcid`), UNIQUE INDEX `cid_uid_gcid_zcid` (`cid`,`uid`,`gcid`,`zcid`),
INDEX `gcid` (`gcid`) INDEX `gcid` (`gcid`)
@ -417,10 +405,10 @@ CREATE TABLE IF NOT EXISTS `gserver` (
`noscrape` varchar(255) NOT NULL DEFAULT '', `noscrape` varchar(255) NOT NULL DEFAULT '',
`network` varchar(32) NOT NULL DEFAULT '', `network` varchar(32) NOT NULL DEFAULT '',
`platform` varchar(255) NOT NULL DEFAULT '', `platform` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`last_poco_query` datetime DEFAULT '0000-00-00 00:00:00', `last_poco_query` datetime DEFAULT '0001-01-01 00:00:00',
`last_contact` datetime DEFAULT '0000-00-00 00:00:00', `last_contact` datetime DEFAULT '0001-01-01 00:00:00',
`last_failure` datetime DEFAULT '0000-00-00 00:00:00', `last_failure` datetime DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`id`), PRIMARY KEY(`id`),
INDEX `nurl` (`nurl`(32)) INDEX `nurl` (`nurl`(32))
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;
@ -450,7 +438,7 @@ CREATE TABLE IF NOT EXISTS `intro` (
`duplex` tinyint(1) NOT NULL DEFAULT 0, `duplex` tinyint(1) NOT NULL DEFAULT 0,
`note` text, `note` text,
`hash` varchar(255) NOT NULL DEFAULT '', `hash` varchar(255) NOT NULL DEFAULT '',
`datetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `datetime` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`blocked` tinyint(1) NOT NULL DEFAULT 1, `blocked` tinyint(1) NOT NULL DEFAULT 1,
`ignore` tinyint(1) NOT NULL DEFAULT 0, `ignore` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`) PRIMARY KEY(`id`)
@ -473,11 +461,11 @@ CREATE TABLE IF NOT EXISTS `item` (
`parent-uri` varchar(255) NOT NULL DEFAULT '', `parent-uri` varchar(255) NOT NULL DEFAULT '',
`extid` varchar(255) NOT NULL DEFAULT '', `extid` varchar(255) NOT NULL DEFAULT '',
`thr-parent` varchar(255) NOT NULL DEFAULT '', `thr-parent` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`commented` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `commented` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`received` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `changed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`owner-id` int(11) NOT NULL DEFAULT 0, `owner-id` int(11) NOT NULL DEFAULT 0,
`owner-name` varchar(255) NOT NULL DEFAULT '', `owner-name` varchar(255) NOT NULL DEFAULT '',
`owner-link` varchar(255) NOT NULL DEFAULT '', `owner-link` varchar(255) NOT NULL DEFAULT '',
@ -576,7 +564,7 @@ CREATE TABLE IF NOT EXISTS `locks` (
`id` int(11) NOT NULL auto_increment, `id` int(11) NOT NULL auto_increment,
`name` varchar(128) NOT NULL DEFAULT '', `name` varchar(128) NOT NULL DEFAULT '',
`locked` tinyint(1) NOT NULL DEFAULT 0, `locked` tinyint(1) NOT NULL DEFAULT 0,
`created` datetime DEFAULT '0000-00-00 00:00:00', `created` datetime DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`id`) PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;
@ -600,7 +588,7 @@ CREATE TABLE IF NOT EXISTS `mail` (
`unknown` tinyint(1) NOT NULL DEFAULT 0, `unknown` tinyint(1) NOT NULL DEFAULT 0,
`uri` varchar(255) NOT NULL DEFAULT '', `uri` varchar(255) NOT NULL DEFAULT '',
`parent-uri` varchar(255) NOT NULL DEFAULT '', `parent-uri` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`id`), PRIMARY KEY(`id`),
INDEX `uid_seen` (`uid`,`seen`), INDEX `uid_seen` (`uid`,`seen`),
INDEX `convid` (`convid`), INDEX `convid` (`convid`),
@ -624,7 +612,7 @@ CREATE TABLE IF NOT EXISTS `mailacct` (
`action` int(11) NOT NULL DEFAULT 0, `action` int(11) NOT NULL DEFAULT 0,
`movetofolder` varchar(255) NOT NULL DEFAULT '', `movetofolder` varchar(255) NOT NULL DEFAULT '',
`pubmail` tinyint(1) NOT NULL DEFAULT 0, `pubmail` tinyint(1) NOT NULL DEFAULT 0,
`last_check` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `last_check` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`id`) PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;
@ -649,7 +637,7 @@ CREATE TABLE IF NOT EXISTS `notify` (
`name` varchar(255) NOT NULL DEFAULT '', `name` varchar(255) NOT NULL DEFAULT '',
`url` varchar(255) NOT NULL DEFAULT '', `url` varchar(255) NOT NULL DEFAULT '',
`photo` varchar(255) NOT NULL DEFAULT '', `photo` varchar(255) NOT NULL DEFAULT '',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`msg` mediumtext, `msg` mediumtext,
`uid` int(11) NOT NULL DEFAULT 0, `uid` int(11) NOT NULL DEFAULT 0,
`link` varchar(255) NOT NULL DEFAULT '', `link` varchar(255) NOT NULL DEFAULT '',
@ -685,7 +673,7 @@ CREATE TABLE IF NOT EXISTS `notify-threads` (
CREATE TABLE IF NOT EXISTS `oembed` ( CREATE TABLE IF NOT EXISTS `oembed` (
`url` varbinary(255) NOT NULL, `url` varbinary(255) NOT NULL,
`content` mediumtext, `content` mediumtext,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`url`), PRIMARY KEY(`url`),
INDEX `created` (`created`) INDEX `created` (`created`)
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;
@ -698,7 +686,7 @@ CREATE TABLE IF NOT EXISTS `parsed_url` (
`guessing` tinyint(1) NOT NULL DEFAULT 0, `guessing` tinyint(1) NOT NULL DEFAULT 0,
`oembed` tinyint(1) NOT NULL DEFAULT 0, `oembed` tinyint(1) NOT NULL DEFAULT 0,
`content` mediumtext, `content` mediumtext,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`url`,`guessing`,`oembed`), PRIMARY KEY(`url`,`guessing`,`oembed`),
INDEX `created` (`created`) INDEX `created` (`created`)
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;
@ -725,8 +713,8 @@ CREATE TABLE IF NOT EXISTS `photo` (
`contact-id` int(10) unsigned NOT NULL DEFAULT 0, `contact-id` int(10) unsigned NOT NULL DEFAULT 0,
`guid` varchar(64) NOT NULL DEFAULT '', `guid` varchar(64) NOT NULL DEFAULT '',
`resource-id` varchar(255) NOT NULL DEFAULT '', `resource-id` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`title` varchar(255) NOT NULL DEFAULT '', `title` varchar(255) NOT NULL DEFAULT '',
`desc` text, `desc` text,
`album` varchar(255) NOT NULL DEFAULT '', `album` varchar(255) NOT NULL DEFAULT '',
@ -788,7 +776,7 @@ CREATE TABLE IF NOT EXISTS `poll_result` (
CREATE TABLE IF NOT EXISTS `process` ( CREATE TABLE IF NOT EXISTS `process` (
`pid` int(10) unsigned NOT NULL, `pid` int(10) unsigned NOT NULL,
`command` varbinary(32) NOT NULL DEFAULT '', `command` varbinary(32) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`pid`), PRIMARY KEY(`pid`),
INDEX `command` (`command`) INDEX `command` (`command`)
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;
@ -814,7 +802,7 @@ CREATE TABLE IF NOT EXISTS `profile` (
`gender` varchar(32) NOT NULL DEFAULT '', `gender` varchar(32) NOT NULL DEFAULT '',
`marital` varchar(255) NOT NULL DEFAULT '', `marital` varchar(255) NOT NULL DEFAULT '',
`with` text, `with` text,
`howlong` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `howlong` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`sexual` varchar(255) NOT NULL DEFAULT '', `sexual` varchar(255) NOT NULL DEFAULT '',
`politic` varchar(255) NOT NULL DEFAULT '', `politic` varchar(255) NOT NULL DEFAULT '',
`religion` varchar(255) NOT NULL DEFAULT '', `religion` varchar(255) NOT NULL DEFAULT '',
@ -866,7 +854,7 @@ CREATE TABLE IF NOT EXISTS `push_subscriber` (
`topic` varchar(255) NOT NULL DEFAULT '', `topic` varchar(255) NOT NULL DEFAULT '',
`nickname` varchar(255) NOT NULL DEFAULT '', `nickname` varchar(255) NOT NULL DEFAULT '',
`push` int(11) NOT NULL DEFAULT 0, `push` int(11) NOT NULL DEFAULT 0,
`last_update` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `last_update` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`secret` varchar(255) NOT NULL DEFAULT '', `secret` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY(`id`) PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;
@ -878,8 +866,8 @@ CREATE TABLE IF NOT EXISTS `queue` (
`id` int(11) NOT NULL auto_increment, `id` int(11) NOT NULL auto_increment,
`cid` int(11) NOT NULL DEFAULT 0, `cid` int(11) NOT NULL DEFAULT 0,
`network` varchar(32) NOT NULL DEFAULT '', `network` varchar(32) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`last` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `last` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`content` mediumtext, `content` mediumtext,
`batch` tinyint(1) NOT NULL DEFAULT 0, `batch` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`), PRIMARY KEY(`id`),
@ -896,7 +884,7 @@ CREATE TABLE IF NOT EXISTS `queue` (
CREATE TABLE IF NOT EXISTS `register` ( CREATE TABLE IF NOT EXISTS `register` (
`id` int(11) unsigned NOT NULL auto_increment, `id` int(11) unsigned NOT NULL auto_increment,
`hash` varchar(255) NOT NULL DEFAULT '', `hash` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`uid` int(11) unsigned NOT NULL DEFAULT 0, `uid` int(11) unsigned NOT NULL DEFAULT 0,
`password` varchar(255) NOT NULL DEFAULT '', `password` varchar(255) NOT NULL DEFAULT '',
`language` varchar(16) NOT NULL DEFAULT '', `language` varchar(16) NOT NULL DEFAULT '',
@ -950,7 +938,7 @@ CREATE TABLE IF NOT EXISTS `spam` (
`spam` int(11) NOT NULL DEFAULT 0, `spam` int(11) NOT NULL DEFAULT 0,
`ham` int(11) NOT NULL DEFAULT 0, `ham` int(11) NOT NULL DEFAULT 0,
`term` varchar(255) NOT NULL DEFAULT '', `term` varchar(255) NOT NULL DEFAULT '',
`date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`id`), PRIMARY KEY(`id`),
INDEX `uid` (`uid`), INDEX `uid` (`uid`),
INDEX `spam` (`spam`), INDEX `spam` (`spam`),
@ -969,8 +957,8 @@ CREATE TABLE IF NOT EXISTS `term` (
`term` varchar(255) NOT NULL DEFAULT '', `term` varchar(255) NOT NULL DEFAULT '',
`url` varchar(255) NOT NULL DEFAULT '', `url` varchar(255) NOT NULL DEFAULT '',
`guid` varchar(255) NOT NULL DEFAULT '', `guid` varchar(255) NOT NULL DEFAULT '',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`received` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`global` tinyint(1) NOT NULL DEFAULT 0, `global` tinyint(1) NOT NULL DEFAULT 0,
`aid` int(10) unsigned NOT NULL DEFAULT 0, `aid` int(10) unsigned NOT NULL DEFAULT 0,
`uid` int(10) unsigned NOT NULL DEFAULT 0, `uid` int(10) unsigned NOT NULL DEFAULT 0,
@ -991,11 +979,11 @@ CREATE TABLE IF NOT EXISTS `thread` (
`gcontact-id` int(11) unsigned NOT NULL DEFAULT 0, `gcontact-id` int(11) unsigned NOT NULL DEFAULT 0,
`owner-id` int(11) unsigned NOT NULL DEFAULT 0, `owner-id` int(11) unsigned NOT NULL DEFAULT 0,
`author-id` int(11) unsigned NOT NULL DEFAULT 0, `author-id` int(11) unsigned NOT NULL DEFAULT 0,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`commented` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `commented` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`received` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `changed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`wall` tinyint(1) NOT NULL DEFAULT 0, `wall` tinyint(1) NOT NULL DEFAULT 0,
`private` tinyint(1) NOT NULL DEFAULT 0, `private` tinyint(1) NOT NULL DEFAULT 0,
`pubmail` tinyint(1) NOT NULL DEFAULT 0, `pubmail` tinyint(1) NOT NULL DEFAULT 0,
@ -1047,8 +1035,8 @@ CREATE TABLE IF NOT EXISTS `user` (
`openid` varchar(255) NOT NULL DEFAULT '', `openid` varchar(255) NOT NULL DEFAULT '',
`timezone` varchar(128) NOT NULL DEFAULT '', `timezone` varchar(128) NOT NULL DEFAULT '',
`language` varchar(32) NOT NULL DEFAULT 'en', `language` varchar(32) NOT NULL DEFAULT 'en',
`register_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `register_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`login_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `login_date` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`default-location` varchar(255) NOT NULL DEFAULT '', `default-location` varchar(255) NOT NULL DEFAULT '',
`allow_location` tinyint(1) NOT NULL DEFAULT 0, `allow_location` tinyint(1) NOT NULL DEFAULT 0,
`theme` varchar(255) NOT NULL DEFAULT '', `theme` varchar(255) NOT NULL DEFAULT '',
@ -1072,8 +1060,8 @@ CREATE TABLE IF NOT EXISTS `user` (
`expire` int(11) unsigned NOT NULL DEFAULT 0, `expire` int(11) unsigned NOT NULL DEFAULT 0,
`account_removed` tinyint(1) NOT NULL DEFAULT 0, `account_removed` tinyint(1) NOT NULL DEFAULT 0,
`account_expired` tinyint(1) NOT NULL DEFAULT 0, `account_expired` tinyint(1) NOT NULL DEFAULT 0,
`account_expires_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `account_expires_on` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`expire_notification_sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `expire_notification_sent` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`service_class` varchar(32) NOT NULL DEFAULT '', `service_class` varchar(32) NOT NULL DEFAULT '',
`def_gid` int(11) NOT NULL DEFAULT 0, `def_gid` int(11) NOT NULL DEFAULT 0,
`allow_cid` mediumtext, `allow_cid` mediumtext,
@ -1102,9 +1090,9 @@ CREATE TABLE IF NOT EXISTS `workerqueue` (
`id` int(11) NOT NULL auto_increment, `id` int(11) NOT NULL auto_increment,
`parameter` text, `parameter` text,
`priority` tinyint(3) unsigned NOT NULL DEFAULT 0, `priority` tinyint(3) unsigned NOT NULL DEFAULT 0,
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`pid` int(11) NOT NULL DEFAULT 0, `pid` int(11) NOT NULL DEFAULT 0,
`executed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `executed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
PRIMARY KEY(`id`) PRIMARY KEY(`id`)
) DEFAULT CHARSET=utf8mb4; ) DEFAULT CHARSET=utf8mb4;

View file

@ -152,13 +152,6 @@ Value is in seconds.
Default is 60 seconds. Default is 60 seconds.
Set to 0 for unlimited (not recommended). Set to 0 for unlimited (not recommended).
#### UTF-8 Regular Expressions
During registrations, full names are checked using UTF-8 regular expressions.
This requires PHP to have been compiled with a special setting to allow UTF-8 expressions.
If you are completely unable to register accounts, set no_utf to true.
The default is set to false (meaning UTF8 regular expressions are supported and working).
#### Verify SSL Certitificates #### Verify SSL Certitificates
By default Friendica allows SSL communication between websites that have "self-signed" SSL certificates. By default Friendica allows SSL communication between websites that have "self-signed" SSL certificates.

View file

@ -127,7 +127,7 @@ function mark_for_death($contact) {
if($contact['archive']) if($contact['archive'])
return; return;
if($contact['term-date'] == '0000-00-00 00:00:00') { if ($contact['term-date'] <= NULL_DATE) {
q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d", q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d",
dbesc(datetime_convert()), dbesc(datetime_convert()),
intval($contact['id']) intval($contact['id'])
@ -185,13 +185,13 @@ function unmark_for_death($contact) {
// It's a miracle. Our dead contact has inexplicably come back to life. // It's a miracle. Our dead contact has inexplicably come back to life.
q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d", q("UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d",
dbesc('0000-00-00 00:00:00'), dbesc(NULL_DATE),
intval($contact['id']) intval($contact['id'])
); );
if ($contact['url'] != '') { if ($contact['url'] != '') {
q("UPDATE `contact` SET `term-date` = '%s' WHERE `nurl` = '%s'", q("UPDATE `contact` SET `term-date` = '%s' WHERE `nurl` = '%s'",
dbesc('0000-00-00 00:00:00'), dbesc(NULL_DATE),
dbesc(normalise_link($contact['url'])) dbesc(normalise_link($contact['url']))
); );
} }

View file

@ -6,26 +6,9 @@
* This script is started from mod/item.php to save some time when doing a post. * This script is started from mod/item.php to save some time when doing a post.
*/ */
use \Friendica\Core\Config;
require_once("boot.php");
require_once("include/threads.php"); require_once("include/threads.php");
function create_shadowentry_run($argv, $argc) { function create_shadowentry_run($argv, $argc) {
global $a, $db;
if (is_null($a))
$a = new App;
if (is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
}
Config::load();
if ($argc != 2) { if ($argc != 2) {
return; return;
} }
@ -34,9 +17,4 @@ function create_shadowentry_run($argv, $argc) {
add_shadow_entry($message_id); add_shadow_entry($message_id);
} }
if (array_search(__file__,get_included_files())===0){
create_shadowentry_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}
?> ?>

View file

@ -1,62 +1,24 @@
<?php <?php
if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) {
$directory = dirname($_SERVER["argv"][0]);
if (substr($directory, 0, 1) != "/")
$directory = $_SERVER["PWD"]."/".$directory;
$directory = realpath($directory."/..");
chdir($directory);
}
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
require_once("include/photos.php");
require_once("include/user.php");
function cron_run(&$argv, &$argc){ function cron_run(&$argv, &$argc){
global $a, $db; global $a;
if(is_null($a)) {
$a = new App;
}
if(is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
require_once('include/session.php');
require_once('include/datetime.php'); require_once('include/datetime.php');
require_once('include/items.php');
require_once('include/Contact.php');
require_once('include/email.php');
require_once('include/socgraph.php');
require_once('mod/nodeinfo.php');
require_once('include/post_update.php');
Config::load(); // Poll contacts with specific parameters
if ($argc > 1) {
// Don't check this stuff if the function is called by the poller cron_poll_contacts($argc, $argv);
if (App::callstack() != "poller_run") { return;
if ($a->maxload_reached())
return;
if (App::is_already_running('cron', 'include/cron.php', 540))
return;
} }
$last = get_config('system','last_cron'); $last = get_config('system','last_cron');
$poll_interval = intval(get_config('system','cron_interval')); $poll_interval = intval(get_config('system','cron_interval'));
if(! $poll_interval) if (! $poll_interval) {
$poll_interval = 10; $poll_interval = 10;
}
if($last) { if ($last) {
$next = $last + ($poll_interval * 60); $next = $last + ($poll_interval * 60);
if($next > time()) { if($next > time()) {
logger('cron intervall not reached'); logger('cron intervall not reached');
@ -64,64 +26,50 @@ function cron_run(&$argv, &$argc){
} }
} }
$a->set_baseurl(get_config('system','url'));
load_hooks();
logger('cron: start'); logger('cron: start');
// run queue delivery process in the background // run queue delivery process in the background
proc_run(PRIORITY_NEGLIGIBLE, "include/queue.php"); proc_run(PRIORITY_NEGLIGIBLE, "include/queue.php");
// run the process to discover global contacts in the background // run the process to discover global contacts in the background
proc_run(PRIORITY_LOW, "include/discover_poco.php"); proc_run(PRIORITY_LOW, "include/discover_poco.php");
// run the process to update locally stored global contacts in the background // run the process to update locally stored global contacts in the background
proc_run(PRIORITY_LOW, "include/discover_poco.php", "checkcontact"); proc_run(PRIORITY_LOW, "include/discover_poco.php", "checkcontact");
// Expire and remove user entries // Expire and remove user entries
cron_expire_and_remove_users(); proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "expire_and_remove_users");
// If the worker is active, split the jobs in several sub processes // Check OStatus conversations
if (get_config("system", "worker")) { proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "ostatus_mentions");
// Check OStatus conversations
proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "ostatus_mentions");
// Check every conversation // Check every conversation
proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "ostatus_conversations"); proc_run(PRIORITY_MEDIUM, "include/cronjobs.php", "ostatus_conversations");
// Call possible post update functions // Call possible post update functions
proc_run(PRIORITY_LOW, "include/cronjobs.php", "post_update"); proc_run(PRIORITY_LOW, "include/cronjobs.php", "post_update");
// update nodeinfo data // update nodeinfo data
proc_run(PRIORITY_LOW, "include/cronjobs.php", "nodeinfo"); proc_run(PRIORITY_LOW, "include/cronjobs.php", "nodeinfo");
} else {
// Check OStatus conversations
// Check only conversations with mentions (for a longer time)
ostatus::check_conversations(true);
// Check every conversation // Clear cache entries
ostatus::check_conversations(false); proc_run(PRIORITY_LOW, "include/cronjobs.php", "clear_cache");
// Call possible post update functions // Repair missing Diaspora values in contacts
// see include/post_update.php for more details proc_run(PRIORITY_LOW, "include/cronjobs.php", "repair_diaspora");
post_update();
// update nodeinfo data // Repair entries in the database
nodeinfo_cron(); proc_run(PRIORITY_LOW, "include/cronjobs.php", "repair_database");
}
// once daily run birthday_updates and then expire in background // once daily run birthday_updates and then expire in background
$d1 = get_config('system','last_expire_day'); $d1 = get_config('system','last_expire_day');
$d2 = intval(datetime_convert('UTC','UTC','now','d')); $d2 = intval(datetime_convert('UTC','UTC','now','d'));
if($d2 != intval($d1)) { if($d2 != intval($d1)) {
update_contact_birthdays(); proc_run(PRIORITY_LOW, "include/cronjobs.php", "update_contact_birthdays");
proc_run(PRIORITY_LOW, "include/discover_poco.php", "update_server");
proc_run(PRIORITY_LOW, "include/discover_poco.php", "suggestions"); proc_run(PRIORITY_LOW, "include/discover_poco.php", "suggestions");
@ -131,18 +79,9 @@ function cron_run(&$argv, &$argc){
proc_run(PRIORITY_MEDIUM, 'include/dbclean.php'); proc_run(PRIORITY_MEDIUM, 'include/dbclean.php');
cron_update_photo_albums(); proc_run(PRIORITY_LOW, "include/cronjobs.php", "update_photo_albums");
} }
// Clear cache entries
cron_clear_cache($a);
// Repair missing Diaspora values in contacts
cron_repair_diaspora($a);
// Repair entries in the database
cron_repair_database();
// Poll contacts // Poll contacts
cron_poll_contacts($argc, $argv); cron_poll_contacts($argc, $argv);
@ -153,39 +92,6 @@ function cron_run(&$argv, &$argc){
return; return;
} }
/**
* @brief Update the cached values for the number of photo albums per user
*/
function cron_update_photo_albums() {
$r = q("SELECT `uid` FROM `user` WHERE NOT `account_expired` AND NOT `account_removed`");
if (!dbm::is_result($r)) {
return;
}
foreach ($r AS $user) {
photo_albums($user['uid'], true);
}
}
/**
* @brief Expire and remove user entries
*/
function cron_expire_and_remove_users() {
// expire any expired accounts
q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0
AND `account_expires_on` != '0000-00-00 00:00:00'
AND `account_expires_on` < UTC_TIMESTAMP() ");
// delete user and contact records for recently removed accounts
$r = q("SELECT * FROM `user` WHERE `account_removed` AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
if ($r) {
foreach($r as $user) {
q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid']));
q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid']));
}
}
}
/** /**
* @brief Poll contacts for unreceived messages * @brief Poll contacts for unreceived messages
* *
@ -198,14 +104,15 @@ function cron_poll_contacts($argc, $argv) {
$force = false; $force = false;
$restart = false; $restart = false;
if (($argc > 1) && ($argv[1] == 'force')) if (($argc > 1) && ($argv[1] == 'force')) {
$force = true; $force = true;
}
if (($argc > 1) && ($argv[1] == 'restart')) { if (($argc > 1) && ($argv[1] == 'restart')) {
$restart = true; $restart = true;
$generation = intval($argv[2]); $generation = intval($argv[2]);
if (!$generation) if (!$generation) {
killme(); killme();
}
} }
if (($argc > 1) && intval($argv[1])) { if (($argc > 1) && intval($argv[1])) {
@ -213,14 +120,6 @@ function cron_poll_contacts($argc, $argv) {
$force = true; $force = true;
} }
$interval = intval(get_config('system','poll_interval'));
if (!$interval)
$interval = ((get_config('system','delivery_interval') === false) ? 3 : intval(get_config('system','delivery_interval')));
// If we are using the worker we don't need a delivery interval
if (get_config("system", "worker"))
$interval = false;
$sql_extra = (($manual_id) ? " AND `id` = $manual_id " : ""); $sql_extra = (($manual_id) ? " AND `id` = $manual_id " : "");
reload_plugins(); reload_plugins();
@ -232,9 +131,9 @@ function cron_poll_contacts($argc, $argv) {
// we are unable to match those posts with a Diaspora GUID and prevent duplicates. // we are unable to match those posts with a Diaspora GUID and prevent duplicates.
$abandon_days = intval(get_config('system','account_abandon_days')); $abandon_days = intval(get_config('system','account_abandon_days'));
if($abandon_days < 1) if ($abandon_days < 1) {
$abandon_days = 0; $abandon_days = 0;
}
$abandon_sql = (($abandon_days) $abandon_sql = (($abandon_days)
? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days)) ? sprintf(" AND `user`.`login_date` > UTC_TIMESTAMP() - INTERVAL %d DAY ", intval($abandon_days))
: '' : ''
@ -275,13 +174,15 @@ function cron_poll_contacts($argc, $argv) {
$xml = false; $xml = false;
if($manual_id) if ($manual_id) {
$contact['last-update'] = '0000-00-00 00:00:00'; $contact['last-update'] = NULL_DATE;
}
if(in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS))) if (in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS))) {
$contact['priority'] = 2; $contact['priority'] = 2;
}
if($contact['subhub'] AND in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS))) { if ($contact['subhub'] AND in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS))) {
// We should be getting everything via a hub. But just to be sure, let's check once a day. // We should be getting everything via a hub. But just to be sure, let's check once a day.
// (You can make this more or less frequent if desired by setting 'pushpoll_frequency' appropriately) // (You can make this more or less frequent if desired by setting 'pushpoll_frequency' appropriately)
// This also lets us update our subscription to the hub, and add or replace hubs in case it // This also lets us update our subscription to the hub, and add or replace hubs in case it
@ -303,193 +204,44 @@ function cron_poll_contacts($argc, $argv) {
switch ($contact['priority']) { switch ($contact['priority']) {
case 5: case 5:
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 month")) if (datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 month")) {
$update = true; $update = true;
}
break; break;
case 4: case 4:
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 week")) if (datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 week")) {
$update = true; $update = true;
}
break; break;
case 3: case 3:
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")) if (datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")) {
$update = true; $update = true;
}
break; break;
case 2: case 2:
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 12 hour")) if (datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 12 hour")) {
$update = true; $update = true;
}
break; break;
case 1: case 1:
default: default:
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 hour")) if (datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 hour")) {
$update = true; $update = true;
}
break; break;
} }
if (!$update) if (!$update) {
continue; continue;
}
} }
logger("Polling ".$contact["network"]." ".$contact["id"]." ".$contact["nick"]." ".$contact["name"]); logger("Polling ".$contact["network"]." ".$contact["id"]." ".$contact["nick"]." ".$contact["name"]);
if (($contact['network'] == NETWORK_FEED) AND ($contact['priority'] <= 3)) { if (($contact['network'] == NETWORK_FEED) AND ($contact['priority'] <= 3)) {
proc_run(PRIORITY_MEDIUM, 'include/onepoll.php', $contact['id']); proc_run(PRIORITY_MEDIUM, 'include/onepoll.php', intval($contact['id']));
} else { } else {
proc_run(PRIORITY_LOW, 'include/onepoll.php', $contact['id']); proc_run(PRIORITY_LOW, 'include/onepoll.php', intval($contact['id']));
}
if($interval)
@time_sleep_until(microtime(true) + (float) $interval);
}
}
}
/**
* @brief Clear cache entries
*
* @param App $a
*/
function cron_clear_cache(App $a) {
$last = get_config('system','cache_last_cleared');
if($last) {
$next = $last + (3600); // Once per hour
$clear_cache = ($next <= time());
} else
$clear_cache = true;
if (!$clear_cache)
return;
// clear old cache
Cache::clear();
// clear old item cache files
clear_cache();
// clear cache for photos
clear_cache($a->get_basepath(), $a->get_basepath()."/photo");
// clear smarty cache
clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled");
// clear cache for image proxy
if (!get_config("system", "proxy_disabled")) {
clear_cache($a->get_basepath(), $a->get_basepath()."/proxy");
$cachetime = get_config('system','proxy_cache_time');
if (!$cachetime) $cachetime = PROXY_DEFAULT_TIME;
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
}
// Delete the cached OEmbed entries that are older than one year
q("DELETE FROM `oembed` WHERE `created` < NOW() - INTERVAL 3 MONTH");
// Delete the cached "parse_url" entries that are older than one year
q("DELETE FROM `parsed_url` WHERE `created` < NOW() - INTERVAL 3 MONTH");
// Maximum table size in megabyte
$max_tablesize = intval(get_config('system','optimize_max_tablesize')) * 1000000;
if ($max_tablesize == 0)
$max_tablesize = 100 * 1000000; // Default are 100 MB
if ($max_tablesize > 0) {
// Minimum fragmentation level in percent
$fragmentation_level = intval(get_config('system','optimize_fragmentation')) / 100;
if ($fragmentation_level == 0)
$fragmentation_level = 0.3; // Default value is 30%
// Optimize some tables that need to be optimized
$r = q("SHOW TABLE STATUS");
foreach($r as $table) {
// Don't optimize tables that are too large
if ($table["Data_length"] > $max_tablesize)
continue;
// Don't optimize empty tables
if ($table["Data_length"] == 0)
continue;
// Calculate fragmentation
$fragmentation = $table["Data_free"] / ($table["Data_length"] + $table["Index_length"]);
logger("Table ".$table["Name"]." - Fragmentation level: ".round($fragmentation * 100, 2), LOGGER_DEBUG);
// Don't optimize tables that needn't to be optimized
if ($fragmentation < $fragmentation_level)
continue;
// So optimize it
logger("Optimize Table ".$table["Name"], LOGGER_DEBUG);
q("OPTIMIZE TABLE `%s`", dbesc($table["Name"]));
}
}
set_config('system','cache_last_cleared', time());
}
/**
* @brief Repair missing values in Diaspora contacts
*
* @param App $a
*/
function cron_repair_diaspora(App $a) {
$r = q("SELECT `id`, `url` FROM `contact`
WHERE `network` = '%s' AND (`batch` = '' OR `notify` = '' OR `poll` = '' OR pubkey = '')
ORDER BY RAND() LIMIT 50", dbesc(NETWORK_DIASPORA));
if (dbm::is_result($r)) {
foreach ($r AS $contact) {
if (poco_reachable($contact["url"])) {
$data = probe_url($contact["url"]);
if ($data["network"] == NETWORK_DIASPORA) {
logger("Repair contact ".$contact["id"]." ".$contact["url"], LOGGER_DEBUG);
q("UPDATE `contact` SET `batch` = '%s', `notify` = '%s', `poll` = '%s', pubkey = '%s' WHERE `id` = %d",
dbesc($data["batch"]), dbesc($data["notify"]), dbesc($data["poll"]), dbesc($data["pubkey"]),
intval($contact["id"]));
}
} }
} }
} }
} }
/**
* @brief Do some repairs in database entries
*
*/
function cron_repair_database() {
// Sometimes there seem to be issues where the "self" contact vanishes.
// We haven't found the origin of the problem by now.
$r = q("SELECT `uid` FROM `user` WHERE NOT EXISTS (SELECT `uid` FROM `contact` WHERE `contact`.`uid` = `user`.`uid` AND `contact`.`self`)");
if (dbm::is_result($r)) {
foreach ($r AS $user) {
logger('Create missing self contact for user '.$user['uid']);
user_create_self_contact($user['uid']);
}
}
// Set the parent if it wasn't set. (Shouldn't happen - but does sometimes)
// This call is very "cheap" so we can do it at any time without a problem
q("UPDATE `item` INNER JOIN `item` AS `parent` ON `parent`.`uri` = `item`.`parent-uri` AND `parent`.`uid` = `item`.`uid` SET `item`.`parent` = `parent`.`id` WHERE `item`.`parent` = 0");
// There was an issue where the nick vanishes from the contact table
q("UPDATE `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` SET `nick` = `nickname` WHERE `self` AND `nick`=''");
// Update the global contacts for local users
$r = q("SELECT `uid` FROM `user` WHERE `verified` AND NOT `blocked` AND NOT `account_removed` AND NOT `account_expired`");
if (dbm::is_result($r))
foreach ($r AS $user)
update_gcontact_for_user($user["uid"]);
/// @todo
/// - remove thread entries without item
/// - remove sign entries without item
/// - remove children when parent got lost
/// - set contact-id in item when not present
}
if (array_search(__file__,get_included_files())===0){
cron_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -2,37 +2,11 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
function cronhooks_run(&$argv, &$argc){ function cronhooks_run(&$argv, &$argc){
global $a, $db; global $a;
if(is_null($a)) {
$a = new App;
}
if(is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
require_once('include/session.php');
require_once('include/datetime.php'); require_once('include/datetime.php');
Config::load();
// Don't check this stuff if the function is called by the poller
if (App::callstack() != "poller_run") {
if ($a->maxload_reached())
return;
if (App::is_already_running('cronhooks', 'include/cronhooks.php', 1140))
return;
}
load_hooks();
if (($argc == 2) AND is_array($a->hooks) AND array_key_exists("cron", $a->hooks)) { if (($argc == 2) AND is_array($a->hooks) AND array_key_exists("cron", $a->hooks)) {
foreach ($a->hooks["cron"] as $hook) foreach ($a->hooks["cron"] as $hook)
if ($hook[1] == $argv[1]) { if ($hook[1] == $argv[1]) {
@ -42,7 +16,7 @@ function cronhooks_run(&$argv, &$argc){
return; return;
} }
$last = get_config('system','last_cronhook'); $last = get_config('system', 'last_cronhook');
$poll_interval = intval(get_config('system','cronhook_interval')); $poll_interval = intval(get_config('system','cronhook_interval'));
if(! $poll_interval) if(! $poll_interval)
@ -62,22 +36,16 @@ function cronhooks_run(&$argv, &$argc){
$d = datetime_convert(); $d = datetime_convert();
if (get_config("system", "worker") AND is_array($a->hooks) AND array_key_exists("cron", $a->hooks)) { if (is_array($a->hooks) AND array_key_exists("cron", $a->hooks)) {
foreach ($a->hooks["cron"] as $hook) { foreach ($a->hooks["cron"] as $hook) {
logger("Calling cronhooks for '".$hook[1]."'", LOGGER_DEBUG); logger("Calling cronhooks for '".$hook[1]."'", LOGGER_DEBUG);
proc_run(PRIORITY_MEDIUM, "include/cronhooks.php", $hook[1]); proc_run(PRIORITY_MEDIUM, "include/cronhooks.php", $hook[1]);
} }
} else }
call_hooks('cron', $d);
logger('cronhooks: end'); logger('cronhooks: end');
set_config('system','last_cronhook', time()); set_config('system', 'last_cronhook', time());
return; return;
} }
if (array_search(__file__,get_included_files())===0){
cronhooks_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -1,47 +1,24 @@
<?php <?php
use \Friendica\Core\Config; use \Friendica\Core\Config;
if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) {
$directory = dirname($_SERVER["argv"][0]);
if (substr($directory, 0, 1) != "/")
$directory = $_SERVER["PWD"]."/".$directory;
$directory = realpath($directory."/..");
chdir($directory);
}
require_once("boot.php");
function cronjobs_run(&$argv, &$argc){ function cronjobs_run(&$argv, &$argc){
global $a, $db; global $a;
if(is_null($a)) {
$a = new App;
}
if(is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
require_once('include/session.php');
require_once('include/datetime.php'); require_once('include/datetime.php');
require_once('include/ostatus.php'); require_once('include/ostatus.php');
require_once('include/post_update.php'); require_once('include/post_update.php');
require_once('mod/nodeinfo.php'); require_once('mod/nodeinfo.php');
require_once('include/photos.php');
Config::load(); require_once('include/user.php');
require_once('include/socgraph.php');
$a->set_baseurl(get_config('system','url')); require_once('include/Probe.php');
// No parameter set? So return // No parameter set? So return
if ($argc <= 1) if ($argc <= 1) {
return; return;
}
logger("Starting cronjob ".$argv[1], LOGGER_DEBUG);
// Check OStatus conversations // Check OStatus conversations
// Check only conversations with mentions (for a longer time) // Check only conversations with mentions (for a longer time)
@ -69,10 +46,244 @@ function cronjobs_run(&$argv, &$argc){
return; return;
} }
// Expire and remove user entries
if ($argv[1] == 'expire_and_remove_users') {
cron_expire_and_remove_users();
return;
}
if ($argv[1] == 'update_contact_birthdays') {
update_contact_birthdays();
return;
}
if ($argv[1] == 'update_photo_albums') {
cron_update_photo_albums();
return;
}
// Clear cache entries
if ($argv[1] == 'clear_cache') {
cron_clear_cache($a);
return;
}
// Repair missing Diaspora values in contacts
if ($argv[1] == 'repair_diaspora') {
cron_repair_diaspora($a);
return;
}
// Repair entries in the database
if ($argv[1] == 'repair_database') {
cron_repair_database();
return;
}
logger("Xronjob ".$argv[1]." is unknown.", LOGGER_DEBUG);
return; return;
} }
if (array_search(__file__,get_included_files())===0){ /**
cronjobs_run($_SERVER["argv"],$_SERVER["argc"]); * @brief Update the cached values for the number of photo albums per user
killme(); */
function cron_update_photo_albums() {
$r = q("SELECT `uid` FROM `user` WHERE NOT `account_expired` AND NOT `account_removed`");
if (!dbm::is_result($r)) {
return;
}
foreach ($r AS $user) {
photo_albums($user['uid'], true);
}
}
/**
* @brief Expire and remove user entries
*/
function cron_expire_and_remove_users() {
// expire any expired accounts
q("UPDATE user SET `account_expired` = 1 where `account_expired` = 0
AND `account_expires_on` > '%s'
AND `account_expires_on` < UTC_TIMESTAMP()", dbesc(NULL_DATE));
// delete user and contact records for recently removed accounts
$r = q("SELECT * FROM `user` WHERE `account_removed` AND `account_expires_on` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
if (dbm::is_result($r)) {
foreach ($r as $user) {
q("DELETE FROM `contact` WHERE `uid` = %d", intval($user['uid']));
q("DELETE FROM `user` WHERE `uid` = %d", intval($user['uid']));
}
}
}
/**
* @brief Clear cache entries
*
* @param App $a
*/
function cron_clear_cache(App $a) {
$last = get_config('system','cache_last_cleared');
if ($last) {
$next = $last + (3600); // Once per hour
$clear_cache = ($next <= time());
} else {
$clear_cache = true;
}
if (!$clear_cache) {
return;
}
// clear old cache
Cache::clear();
// clear old item cache files
clear_cache();
// clear cache for photos
clear_cache($a->get_basepath(), $a->get_basepath()."/photo");
// clear smarty cache
clear_cache($a->get_basepath()."/view/smarty3/compiled", $a->get_basepath()."/view/smarty3/compiled");
// clear cache for image proxy
if (!get_config("system", "proxy_disabled")) {
clear_cache($a->get_basepath(), $a->get_basepath()."/proxy");
$cachetime = get_config('system','proxy_cache_time');
if (!$cachetime) {
$cachetime = PROXY_DEFAULT_TIME;
}
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
}
// Delete the cached OEmbed entries that are older than one year
q("DELETE FROM `oembed` WHERE `created` < NOW() - INTERVAL 3 MONTH");
// Delete the cached "parse_url" entries that are older than one year
q("DELETE FROM `parsed_url` WHERE `created` < NOW() - INTERVAL 3 MONTH");
// Maximum table size in megabyte
$max_tablesize = intval(get_config('system','optimize_max_tablesize')) * 1000000;
if ($max_tablesize == 0) {
$max_tablesize = 100 * 1000000; // Default are 100 MB
}
if ($max_tablesize > 0) {
// Minimum fragmentation level in percent
$fragmentation_level = intval(get_config('system','optimize_fragmentation')) / 100;
if ($fragmentation_level == 0) {
$fragmentation_level = 0.3; // Default value is 30%
}
// Optimize some tables that need to be optimized
$r = q("SHOW TABLE STATUS");
foreach ($r as $table) {
// Don't optimize tables that are too large
if ($table["Data_length"] > $max_tablesize) {
continue;
}
// Don't optimize empty tables
if ($table["Data_length"] == 0) {
continue;
}
// Calculate fragmentation
$fragmentation = $table["Data_free"] / ($table["Data_length"] + $table["Index_length"]);
logger("Table ".$table["Name"]." - Fragmentation level: ".round($fragmentation * 100, 2), LOGGER_DEBUG);
// Don't optimize tables that needn't to be optimized
if ($fragmentation < $fragmentation_level) {
continue;
}
// So optimize it
logger("Optimize Table ".$table["Name"], LOGGER_DEBUG);
q("OPTIMIZE TABLE `%s`", dbesc($table["Name"]));
}
}
set_config('system','cache_last_cleared', time());
}
/**
* @brief Repair missing values in Diaspora contacts
*
* @param App $a
*/
function cron_repair_diaspora(App $a) {
$starttime = time();
$r = q("SELECT `id`, `url` FROM `contact`
WHERE `network` = '%s' AND (`batch` = '' OR `notify` = '' OR `poll` = '' OR pubkey = '')
ORDER BY RAND() LIMIT 50", dbesc(NETWORK_DIASPORA));
if (!dbm::is_result($r)) {
return;
}
foreach ($r AS $contact) {
// Quit the loop after 3 minutes
if (time() > ($starttime + 180)) {
return;
}
if (!poco_reachable($contact["url"])) {
continue;
}
$data = Probe::uri($contact["url"]);
if ($data["network"] != NETWORK_DIASPORA) {
continue;
}
logger("Repair contact ".$contact["id"]." ".$contact["url"], LOGGER_DEBUG);
q("UPDATE `contact` SET `batch` = '%s', `notify` = '%s', `poll` = '%s', pubkey = '%s' WHERE `id` = %d",
dbesc($data["batch"]), dbesc($data["notify"]), dbesc($data["poll"]), dbesc($data["pubkey"]),
intval($contact["id"]));
}
}
/**
* @brief Do some repairs in database entries
*
*/
function cron_repair_database() {
// Sometimes there seem to be issues where the "self" contact vanishes.
// We haven't found the origin of the problem by now.
$r = q("SELECT `uid` FROM `user` WHERE NOT EXISTS (SELECT `uid` FROM `contact` WHERE `contact`.`uid` = `user`.`uid` AND `contact`.`self`)");
if (dbm::is_result($r)) {
foreach ($r AS $user) {
logger('Create missing self contact for user '.$user['uid']);
user_create_self_contact($user['uid']);
}
}
// Set the parent if it wasn't set. (Shouldn't happen - but does sometimes)
// This call is very "cheap" so we can do it at any time without a problem
q("UPDATE `item` INNER JOIN `item` AS `parent` ON `parent`.`uri` = `item`.`parent-uri` AND `parent`.`uid` = `item`.`uid` SET `item`.`parent` = `parent`.`id` WHERE `item`.`parent` = 0");
// There was an issue where the nick vanishes from the contact table
q("UPDATE `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` SET `nick` = `nickname` WHERE `self` AND `nick`=''");
// Update the global contacts for local users
$r = q("SELECT `uid` FROM `user` WHERE `verified` AND NOT `blocked` AND NOT `account_removed` AND NOT `account_expired`");
if (dbm::is_result($r)) {
foreach ($r AS $user) {
update_gcontact_for_user($user["uid"]);
}
}
/// @todo
/// - remove thread entries without item
/// - remove sign entries without item
/// - remove children when parent got lost
/// - set contact-id in item when not present
} }

View file

@ -339,7 +339,7 @@ function relative_date($posted_date, $format = null) {
$abs = strtotime($localtime); $abs = strtotime($localtime);
if (is_null($posted_date) || $posted_date === '0000-00-00 00:00:00' || $abs === False) { if (is_null($posted_date) || $posted_date <= NULL_DATE || $abs === False) {
return t('never'); return t('never');
} }

View file

@ -1,17 +1,5 @@
<?php <?php
require_once("dbm.php"); require_once("dbm.php");
# if PDO is avaible for mysql, use the new database abstraction
# TODO: PDO is disabled for release 3.3. We need to investigate why
# the update from 3.2 fails with pdo
/*
if (class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) {
require_once("library/dddbl2/dddbl.php");
require_once("include/dba_pdo.php");
}
*/
require_once('include/datetime.php'); require_once('include/datetime.php');
/** /**
@ -24,13 +12,12 @@ require_once('include/datetime.php');
* *
*/ */
if (! class_exists('dba')) {
class dba { class dba {
private $debug = 0; private $debug = 0;
private $db; private $db;
private $result; private $result;
public $mysqli = true; private $driver;
public $connected = false; public $connected = false;
public $error = false; public $error = false;
@ -53,7 +40,7 @@ class dba {
if ($install) { if ($install) {
if (strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) { if (strlen($server) && ($server !== 'localhost') && ($server !== '127.0.0.1')) {
if (! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) { if (! dns_get_record($server, DNS_A + DNS_CNAME + DNS_PTR)) {
$this->error = sprintf( t('Cannot locate DNS info for database server \'%s\''), $server); $this->error = sprintf(t('Cannot locate DNS info for database server \'%s\''), $server);
$this->connected = false; $this->connected = false;
$this->db = null; $this->db = null;
return; return;
@ -61,37 +48,52 @@ class dba {
} }
} }
if (class_exists('mysqli')) { if (class_exists('\PDO') && in_array('mysql', PDO::getAvailableDrivers())) {
$this->db = @new mysqli($server,$user,$pass,$db); $this->driver = 'pdo';
if (! mysqli_connect_errno()) { $connect = "mysql:host=".$server.";dbname=".$db;
if (isset($a->config["system"]["db_charset"])) {
$connect .= ";charset=".$a->config["system"]["db_charset"];
}
$this->db = @new PDO($connect, $user, $pass);
if (!$this->db->errorCode()) {
$this->connected = true; $this->connected = true;
} }
if (isset($a->config["system"]["db_charset"])) { } elseif (class_exists('mysqli')) {
$this->db->set_charset($a->config["system"]["db_charset"]); $this->driver = 'mysqli';
$this->db = @new mysqli($server,$user,$pass,$db);
if (!mysqli_connect_errno()) {
$this->connected = true;
if (isset($a->config["system"]["db_charset"])) {
$this->db->set_charset($a->config["system"]["db_charset"]);
}
} }
} else { } elseif (function_exists('mysql_connect')) {
$this->mysqli = false; $this->driver = 'mysql';
$this->db = mysql_connect($server,$user,$pass); $this->db = mysql_connect($server,$user,$pass);
if ($this->db && mysql_select_db($db,$this->db)) { if ($this->db && mysql_select_db($db,$this->db)) {
$this->connected = true; $this->connected = true;
if (isset($a->config["system"]["db_charset"])) {
mysql_set_charset($a->config["system"]["db_charset"], $this->db);
}
}
} else {
// No suitable SQL driver was found.
if (!$install) {
system_unavailable();
} }
if (isset($a->config["system"]["db_charset"]))
mysql_set_charset($a->config["system"]["db_charset"], $this->db);
} }
if (!$this->connected) { if (!$this->connected) {
$this->db = null; $this->db = null;
if (!$install) { if (!$install) {
system_unavailable(); system_unavailable();
} }
} }
$a->save_timestamp($stamp1, "network"); $a->save_timestamp($stamp1, "network");
} }
public function getdb() {
return $this->db;
}
/** /**
* @brief Returns the MySQL server version string * @brief Returns the MySQL server version string
* *
@ -101,12 +103,18 @@ class dba {
* @return string * @return string
*/ */
public function server_info() { public function server_info() {
if ($this->mysqli) { switch ($this->driver) {
$return = $this->db->server_info; case 'pdo':
} else { $version = $this->db->getAttribute(PDO::ATTR_SERVER_VERSION);
$return = mysql_get_server_info($this->db); break;
case 'mysqli':
$version = $this->db->server_info;
break;
case 'mysql':
$version = mysql_get_server_info($this->db);
break;
} }
return $return; return $version;
} }
/** /**
@ -130,12 +138,18 @@ class dba {
return 0; return 0;
} }
if ($this->mysqli) { switch ($this->driver) {
$return = $this->result->num_rows; case 'pdo':
} else { $rows = $this->result->rowCount();
$return = mysql_num_rows($this->result); break;
case 'mysqli':
$rows = $this->result->num_rows;
break;
case 'mysql':
$rows = mysql_num_rows($this->result);
break;
} }
return $return; return $rows;
} }
/** /**
@ -172,8 +186,9 @@ class dba {
if ((intval($a->config["system"]["db_loglimit_index"]) > 0)) { if ((intval($a->config["system"]["db_loglimit_index"]) > 0)) {
$log = (in_array($row['key'], $watchlist) AND $log = (in_array($row['key'], $watchlist) AND
($row['rows'] >= intval($a->config["system"]["db_loglimit_index"]))); ($row['rows'] >= intval($a->config["system"]["db_loglimit_index"])));
} else } else {
$log = false; $log = false;
}
if ((intval($a->config["system"]["db_loglimit_index_high"]) > 0) AND ($row['rows'] >= intval($a->config["system"]["db_loglimit_index_high"]))) { if ((intval($a->config["system"]["db_loglimit_index_high"]) > 0) AND ($row['rows'] >= intval($a->config["system"]["db_loglimit_index_high"]))) {
$log = true; $log = true;
@ -203,13 +218,7 @@ class dba {
$this->error = ''; $this->error = '';
// Check the connection (This can reconnect the connection - if configured) $connstr = ($this->connected() ? "Connected" : "Disonnected");
if ($this->mysqli) {
$connected = $this->db->ping();
} else {
$connected = mysql_ping($this->db);
}
$connstr = ($connected ? "Connected" : "Disonnected");
$stamp1 = microtime(true); $stamp1 = microtime(true);
@ -219,10 +228,22 @@ class dba {
$sql = "/*".$a->callstack()." */ ".$sql; $sql = "/*".$a->callstack()." */ ".$sql;
} }
if ($this->mysqli) { $columns = 0;
$result = @$this->db->query($sql);
} else { switch ($this->driver) {
$result = @mysql_query($sql,$this->db); case 'pdo':
$result = @$this->db->query($sql);
// Is used to separate between queries that returning data - or not
if (!is_bool($result)) {
$columns = $result->columnCount();
}
break;
case 'mysqli':
$result = @$this->db->query($sql);
break;
case 'mysql':
$result = @mysql_query($sql,$this->db);
break;
} }
$stamp2 = microtime(true); $stamp2 = microtime(true);
$duration = (float)($stamp2-$stamp1); $duration = (float)($stamp2-$stamp1);
@ -243,16 +264,27 @@ class dba {
} }
} }
if ($this->mysqli) { switch ($this->driver) {
if ($this->db->errno) { case 'pdo':
$this->error = $this->db->error; $errorInfo = $this->db->errorInfo();
$this->errorno = $this->db->errno; if ($errorInfo) {
} $this->error = $errorInfo[2];
} elseif (mysql_errno($this->db)) { $this->errorno = $errorInfo[1];
$this->error = mysql_error($this->db); }
$this->errorno = mysql_errno($this->db); break;
case 'mysqli':
if ($this->db->errno) {
$this->error = $this->db->error;
$this->errorno = $this->db->errno;
}
break;
case 'mysql':
if (mysql_errno($this->db)) {
$this->error = mysql_error($this->db);
$this->errorno = mysql_errno($this->db);
}
break;
} }
if (strlen($this->error)) { if (strlen($this->error)) {
logger('DB Error ('.$connstr.') '.$this->errorno.': '.$this->error); logger('DB Error ('.$connstr.') '.$this->errorno.': '.$this->error);
} }
@ -266,10 +298,16 @@ class dba {
} elseif ($result === true) { } elseif ($result === true) {
$mesg = 'true'; $mesg = 'true';
} else { } else {
if ($this->mysqli) { switch ($this->driver) {
$mesg = $result->num_rows . ' results' . EOL; case 'pdo':
} else { $mesg = $result->rowCount().' results'.EOL;
$mesg = mysql_num_rows($result) . ' results' . EOL; break;
case 'mysqli':
$mesg = $result->num_rows.' results'.EOL;
break;
case 'mysql':
$mesg = mysql_num_rows($result).' results'.EOL;
break;
} }
} }
@ -293,7 +331,7 @@ class dba {
} }
} }
if (($result === true) || ($result === false)) { if (is_bool($result)) {
return $result; return $result;
} }
if ($onlyquery) { if ($onlyquery) {
@ -302,18 +340,32 @@ class dba {
} }
$r = array(); $r = array();
if ($this->mysqli) { switch ($this->driver) {
if ($result->num_rows) { case 'pdo':
while($x = $result->fetch_array(MYSQLI_ASSOC)) while ($x = $result->fetch(PDO::FETCH_ASSOC)) {
$r[] = $x; $r[] = $x;
}
$result->closeCursor();
break;
case 'mysqli':
while ($x = $result->fetch_array(MYSQLI_ASSOC)) {
$r[] = $x;
}
$result->free_result(); $result->free_result();
} break;
} else { case 'mysql':
if (mysql_num_rows($result)) { while ($x = mysql_fetch_array($result, MYSQL_ASSOC)) {
while($x = mysql_fetch_array($result, MYSQL_ASSOC))
$r[] = $x; $r[] = $x;
}
mysql_free_result($result); mysql_free_result($result);
} break;
}
// PDO doesn't return "true" on successful operations - like mysqli does
// Emulate this behaviour by checking if the query returned data and had columns
// This should be reliable enough
if (($this->driver == 'pdo') AND (count($r) == 0) AND ($columns == 0)) {
return true;
} }
//$a->save_timestamp($stamp1, "database"); //$a->save_timestamp($stamp1, "database");
@ -328,12 +380,16 @@ class dba {
$x = false; $x = false;
if ($this->result) { if ($this->result) {
if ($this->mysqli) { switch ($this->driver) {
if ($this->result->num_rows) case 'pdo':
$x = $this->result->fetch(PDO::FETCH_ASSOC);
break;
case 'mysqli':
$x = $this->result->fetch_array(MYSQLI_ASSOC); $x = $this->result->fetch_array(MYSQLI_ASSOC);
} else { break;
if (mysql_num_rows($this->result)) case 'mysql':
$x = mysql_fetch_array($this->result, MYSQL_ASSOC); $x = mysql_fetch_array($this->result, MYSQL_ASSOC);
break;
} }
} }
return($x); return($x);
@ -341,10 +397,16 @@ class dba {
public function qclose() { public function qclose() {
if ($this->result) { if ($this->result) {
if ($this->mysqli) { switch ($this->driver) {
$this->result->free_result(); case 'pdo':
} else { $this->result->closeCursor();
mysql_free_result($this->result); break;
case 'mysqli':
$this->result->free_result();
break;
case 'mysql':
mysql_free_result($this->result);
break;
} }
} }
} }
@ -355,35 +417,65 @@ class dba {
public function escape($str) { public function escape($str) {
if ($this->db && $this->connected) { if ($this->db && $this->connected) {
if ($this->mysqli) { switch ($this->driver) {
return @$this->db->real_escape_string($str); case 'pdo':
} else { return substr(@$this->db->quote($str, PDO::PARAM_STR), 1, -1);
return @mysql_real_escape_string($str,$this->db); case 'mysqli':
return @$this->db->real_escape_string($str);
case 'mysql':
return @mysql_real_escape_string($str,$this->db);
} }
} }
} }
function connected() { function connected() {
if ($this->mysqli) { switch ($this->driver) {
$connected = $this->db->ping(); case 'pdo':
} else { // Not sure if this really is working like expected
$connected = mysql_ping($this->db); $connected = ($this->db->getAttribute(PDO::ATTR_CONNECTION_STATUS) != "");
break;
case 'mysqli':
$connected = $this->db->ping();
break;
case 'mysql':
$connected = mysql_ping($this->db);
break;
} }
return $connected; return $connected;
} }
function insert_id() {
switch ($this->driver) {
case 'pdo':
$id = $this->db->lastInsertId();
break;
case 'mysqli':
$id = $this->db->insert_id;
break;
case 'mysql':
$id = mysql_insert_id($this->db);
break;
}
return $id;
}
function __destruct() { function __destruct() {
if ($this->db) { if ($this->db) {
if ($this->mysqli) { switch ($this->driver) {
$this->db->close(); case 'pdo':
} else { $this->db = null;
mysql_close($this->db); break;
case 'mysqli':
$this->db->close();
break;
case 'mysql':
mysql_close($this->db);
break;
} }
} }
} }
}} }
if (! function_exists('printable')) {
function printable($s) { function printable($s) {
$s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~",".", $s); $s = preg_replace("~([\x01-\x08\x0E-\x0F\x10-\x1F\x7F-\xFF])~",".", $s);
$s = str_replace("\x00",'.',$s); $s = str_replace("\x00",'.',$s);
@ -391,37 +483,32 @@ function printable($s) {
$s = escape_tags($s); $s = escape_tags($s);
} }
return $s; return $s;
}} }
// Procedural functions // Procedural functions
if (! function_exists('dbg')) {
function dbg($state) { function dbg($state) {
global $db; global $db;
if ($db) { if ($db) {
$db->dbg($state); $db->dbg($state);
} }
}} }
if (! function_exists('dbesc')) {
function dbesc($str) { function dbesc($str) {
global $db; global $db;
if ($db && $db->connected) { if ($db && $db->connected) {
return($db->escape($str)); return($db->escape($str));
} else { } else {
return(str_replace("'","\\'",$str)); return(str_replace("'","\\'",$str));
} }
}} }
// Function: q($sql,$args); // Function: q($sql,$args);
// Description: execute SQL query with printf style args. // Description: execute SQL query with printf style args.
// Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d", // Example: $r = q("SELECT * FROM `%s` WHERE `uid` = %d",
// 'user', 1); // 'user', 1);
if (! function_exists('q')) {
function q($sql) { function q($sql) {
global $db; global $db;
$args = func_get_args(); $args = func_get_args();
unset($args[0]); unset($args[0]);
@ -445,8 +532,7 @@ function q($sql) {
*/ */
logger('dba: no database: ' . print_r($args,true)); logger('dba: no database: ' . print_r($args,true));
return false; return false;
}
}}
/** /**
* @brief Performs a query with "dirty reads" * @brief Performs a query with "dirty reads"
@ -458,8 +544,8 @@ function q($sql) {
* @return array Query array * @return array Query array
*/ */
function qu($sql) { function qu($sql) {
global $db; global $db;
$args = func_get_args(); $args = func_get_args();
unset($args[0]); unset($args[0]);
@ -484,7 +570,6 @@ function qu($sql) {
*/ */
logger('dba: no database: ' . print_r($args,true)); logger('dba: no database: ' . print_r($args,true));
return false; return false;
} }
/** /**
@ -492,40 +577,31 @@ function qu($sql) {
* Raw db query, no arguments * Raw db query, no arguments
* *
*/ */
if (! function_exists('dbq')) {
function dbq($sql) { function dbq($sql) {
global $db; global $db;
if ($db && $db->connected) { if ($db && $db->connected) {
$ret = $db->q($sql); $ret = $db->q($sql);
} else { } else {
$ret = false; $ret = false;
} }
return $ret; return $ret;
}} }
// Caller is responsible for ensuring that any integer arguments to // Caller is responsible for ensuring that any integer arguments to
// dbesc_array are actually integers and not malformed strings containing // dbesc_array are actually integers and not malformed strings containing
// SQL injection vectors. All integer array elements should be specifically // SQL injection vectors. All integer array elements should be specifically
// cast to int to avoid trouble. // cast to int to avoid trouble.
if (! function_exists('dbesc_array_cb')) {
function dbesc_array_cb(&$item, $key) { function dbesc_array_cb(&$item, $key) {
if (is_string($item)) if (is_string($item))
$item = dbesc($item); $item = dbesc($item);
}} }
if (! function_exists('dbesc_array')) {
function dbesc_array(&$arr) { function dbesc_array(&$arr) {
if (is_array($arr) && count($arr)) { if (is_array($arr) && count($arr)) {
array_walk($arr,'dbesc_array_cb'); array_walk($arr,'dbesc_array_cb');
} }
}} }
function dba_timer() { function dba_timer() {
return microtime(true); return microtime(true);

View file

@ -5,26 +5,8 @@
*/ */
use \Friendica\Core\Config; use \Friendica\Core\Config;
use \Friendica\Core\PConfig;
require_once("boot.php");
function dbclean_run(&$argv, &$argc) { function dbclean_run(&$argv, &$argc) {
global $a, $db;
if (is_null($a)) {
$a = new App;
}
if (is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
}
Config::load();
if (!Config::get('system', 'dbclean', false)) { if (!Config::get('system', 'dbclean', false)) {
return; return;
} }
@ -35,7 +17,7 @@ function dbclean_run(&$argv, &$argc) {
$stage = 0; $stage = 0;
} }
if (Config::get("system", "worker") AND ($stage == 0)) { if ($stage == 0) {
proc_run(PRIORITY_LOW, 'include/dbclean.php', 1); proc_run(PRIORITY_LOW, 'include/dbclean.php', 1);
proc_run(PRIORITY_LOW, 'include/dbclean.php', 2); proc_run(PRIORITY_LOW, 'include/dbclean.php', 2);
proc_run(PRIORITY_LOW, 'include/dbclean.php', 3); proc_run(PRIORITY_LOW, 'include/dbclean.php', 3);
@ -56,12 +38,8 @@ function remove_orphans($stage = 0) {
$count = 0; $count = 0;
// With activated worker we split the deletion in many small tasks // We split the deletion in many small tasks
if (Config::get("system", "worker")) { $limit = 1000;
$limit = 1000;
} else {
$limit = 10000;
}
if (($stage == 1) OR ($stage == 0)) { if (($stage == 1) OR ($stage == 0)) {
logger("Deleting old global item entries from item table without user copy"); logger("Deleting old global item entries from item table without user copy");
@ -159,14 +137,9 @@ function remove_orphans($stage = 0) {
} }
// Call it again if not all entries were purged // Call it again if not all entries were purged
if (($stage != 0) AND ($count > 0) AND Config::get("system", "worker")) { if (($stage != 0) AND ($count > 0)) {
proc_run(PRIORITY_MEDIUM, 'include/dbclean.php'); proc_run(PRIORITY_MEDIUM, 'include/dbclean.php');
} }
} }
if (array_search(__file__,get_included_files())===0){
dbclean_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}
?> ?>

View file

@ -96,17 +96,10 @@ class dbm {
public static function date($date = 'now') { public static function date($date = 'now') {
$timestamp = strtotime($date); $timestamp = strtotime($date);
// Workaround for 3.5.1
if ($timestamp < -62135596800) {
return '0000-00-00 00:00:00';
}
// The above will be removed in 3.5.2
// The following will then be enabled
// Don't allow lower date strings as '0001-01-01 00:00:00' // Don't allow lower date strings as '0001-01-01 00:00:00'
//if ($timestamp < -62135596800) { if ($timestamp < -62135596800) {
// $timestamp = -62135596800; $timestamp = -62135596800;
//} }
return date('Y-m-d H:i:s', $timestamp); return date('Y-m-d H:i:s', $timestamp);
} }

View file

@ -1,4 +1,7 @@
<?php <?php
use \Friendica\Core\Config;
require_once("boot.php"); require_once("boot.php");
require_once("include/text.php"); require_once("include/text.php");
@ -144,7 +147,8 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
global $a, $db; global $a, $db;
if ($action) { if ($action) {
set_config('system', 'maintenance', 1); Config::set('system', 'maintenance', 1);
Config::set('system', 'maintenance_reason', 'Database update');
} }
if (isset($a->config["system"]["db_charset"])) { if (isset($a->config["system"]["db_charset"])) {
@ -361,8 +365,10 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
} }
} }
if ($action) if ($action) {
set_config('system', 'maintenance', 0); Config::set('system', 'maintenance', 0);
Config::set('system', 'maintenance_reason', '');
}
return $errors; return $errors;
} }
@ -536,8 +542,8 @@ function db_definition($charset) {
"filetype" => array("type" => "varchar(64)", "not null" => "1", "default" => ""), "filetype" => array("type" => "varchar(64)", "not null" => "1", "default" => ""),
"filesize" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "filesize" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"data" => array("type" => "longblob", "not null" => "1"), "data" => array("type" => "longblob", "not null" => "1"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"edited" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "edited" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"allow_cid" => array("type" => "mediumtext"), "allow_cid" => array("type" => "mediumtext"),
"allow_gid" => array("type" => "mediumtext"), "allow_gid" => array("type" => "mediumtext"),
"deny_cid" => array("type" => "mediumtext"), "deny_cid" => array("type" => "mediumtext"),
@ -564,7 +570,7 @@ function db_definition($charset) {
"k" => array("type" => "varbinary(255)", "not null" => "1", "primary" => "1"), "k" => array("type" => "varbinary(255)", "not null" => "1", "primary" => "1"),
"v" => array("type" => "mediumtext"), "v" => array("type" => "mediumtext"),
"expire_mode" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "expire_mode" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"updated" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "updated" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("k"), "PRIMARY" => array("k"),
@ -613,7 +619,7 @@ function db_definition($charset) {
"fields" => array( "fields" => array(
"id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
"uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"self" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "self" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"remote_self" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "remote_self" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"rel" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "rel" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
@ -651,14 +657,14 @@ function db_definition($charset) {
"usehub" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "usehub" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"subhub" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "subhub" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"hub-verify" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "hub-verify" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"last-update" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "last-update" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"success_update" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "success_update" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"failure_update" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "failure_update" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"name-date" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "name-date" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"uri-date" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "uri-date" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"avatar-date" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "avatar-date" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"term-date" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "term-date" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"last-item" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "last-item" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"priority" => array("type" => "tinyint(3)", "not null" => "1", "default" => "0"), "priority" => array("type" => "tinyint(3)", "not null" => "1", "default" => "0"),
"blocked" => array("type" => "tinyint(1)", "not null" => "1", "default" => "1"), "blocked" => array("type" => "tinyint(1)", "not null" => "1", "default" => "1"),
"readonly" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "readonly" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
@ -703,8 +709,8 @@ function db_definition($charset) {
"recips" => array("type" => "text"), "recips" => array("type" => "text"),
"uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"creator" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "creator" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"updated" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "updated" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"subject" => array("type" => "text"), "subject" => array("type" => "text"),
), ),
"indexes" => array( "indexes" => array(
@ -712,18 +718,6 @@ function db_definition($charset) {
"uid" => array("uid"), "uid" => array("uid"),
) )
); );
$database["deliverq"] = array(
"fields" => array(
"id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
"cmd" => array("type" => "varbinary(32)", "not null" => "1", "default" => ""),
"item" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"contact" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
),
"indexes" => array(
"PRIMARY" => array("id"),
"cmd_item_contact" => array("UNIQUE", "cmd", "item", "contact"),
)
);
$database["event"] = array( $database["event"] = array(
"fields" => array( "fields" => array(
"id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
@ -731,10 +725,10 @@ function db_definition($charset) {
"uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"cid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "cid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"edited" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "edited" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"start" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "start" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"finish" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "finish" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"summary" => array("type" => "text"), "summary" => array("type" => "text"),
"desc" => array("type" => "text"), "desc" => array("type" => "text"),
"location" => array("type" => "text"), "location" => array("type" => "text"),
@ -770,7 +764,7 @@ function db_definition($charset) {
"network" => array("type" => "varchar(32)", "not null" => "1", "default" => ""), "network" => array("type" => "varchar(32)", "not null" => "1", "default" => ""),
"alias" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "alias" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"pubkey" => array("type" => "text"), "pubkey" => array("type" => "text"),
"updated" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "updated" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),
@ -811,7 +805,7 @@ function db_definition($charset) {
"request" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "request" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"note" => array("type" => "text"), "note" => array("type" => "text"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),
@ -838,10 +832,10 @@ function db_definition($charset) {
"nurl" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "nurl" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"connect" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "connect" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"updated" => array("type" => "datetime", "default" => "0000-00-00 00:00:00"), "updated" => array("type" => "datetime", "default" => NULL_DATE),
"last_contact" => array("type" => "datetime", "default" => "0000-00-00 00:00:00"), "last_contact" => array("type" => "datetime", "default" => NULL_DATE),
"last_failure" => array("type" => "datetime", "default" => "0000-00-00 00:00:00"), "last_failure" => array("type" => "datetime", "default" => NULL_DATE),
"location" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "location" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"about" => array("type" => "text"), "about" => array("type" => "text"),
"keywords" => array("type" => "text"), "keywords" => array("type" => "text"),
@ -875,7 +869,7 @@ function db_definition($charset) {
"uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"gcid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "gcid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"zcid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "zcid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"updated" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "updated" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),
@ -923,10 +917,10 @@ function db_definition($charset) {
"noscrape" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "noscrape" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"network" => array("type" => "varchar(32)", "not null" => "1", "default" => ""), "network" => array("type" => "varchar(32)", "not null" => "1", "default" => ""),
"platform" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "platform" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"last_poco_query" => array("type" => "datetime", "default" => "0000-00-00 00:00:00"), "last_poco_query" => array("type" => "datetime", "default" => NULL_DATE),
"last_contact" => array("type" => "datetime", "default" => "0000-00-00 00:00:00"), "last_contact" => array("type" => "datetime", "default" => NULL_DATE),
"last_failure" => array("type" => "datetime", "default" => "0000-00-00 00:00:00"), "last_failure" => array("type" => "datetime", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),
@ -956,7 +950,7 @@ function db_definition($charset) {
"duplex" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "duplex" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"note" => array("type" => "text"), "note" => array("type" => "text"),
"hash" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "hash" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"datetime" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "datetime" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"blocked" => array("type" => "tinyint(1)", "not null" => "1", "default" => "1"), "blocked" => array("type" => "tinyint(1)", "not null" => "1", "default" => "1"),
"ignore" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "ignore" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
), ),
@ -979,11 +973,11 @@ function db_definition($charset) {
"parent-uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "parent-uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"extid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "extid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"thr-parent" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "thr-parent" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"edited" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "edited" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"commented" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "commented" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"received" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "received" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"changed" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "changed" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"owner-id" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "owner-id" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"owner-name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "owner-name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"owner-link" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "owner-link" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
@ -1082,7 +1076,7 @@ function db_definition($charset) {
"id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
"name" => array("type" => "varchar(128)", "not null" => "1", "default" => ""), "name" => array("type" => "varchar(128)", "not null" => "1", "default" => ""),
"locked" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "locked" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"created" => array("type" => "datetime", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),
@ -1106,7 +1100,7 @@ function db_definition($charset) {
"unknown" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "unknown" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"parent-uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "parent-uri" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),
@ -1130,7 +1124,7 @@ function db_definition($charset) {
"action" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "action" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"movetofolder" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "movetofolder" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"pubmail" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "pubmail" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"last_check" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "last_check" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),
@ -1155,7 +1149,7 @@ function db_definition($charset) {
"name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"date" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "date" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"msg" => array("type" => "mediumtext"), "msg" => array("type" => "mediumtext"),
"uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "uid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"link" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "link" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
@ -1191,7 +1185,7 @@ function db_definition($charset) {
"fields" => array( "fields" => array(
"url" => array("type" => "varbinary(255)", "not null" => "1", "primary" => "1"), "url" => array("type" => "varbinary(255)", "not null" => "1", "primary" => "1"),
"content" => array("type" => "mediumtext"), "content" => array("type" => "mediumtext"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("url"), "PRIMARY" => array("url"),
@ -1204,7 +1198,7 @@ function db_definition($charset) {
"guessing" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0", "primary" => "1"), "guessing" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0", "primary" => "1"),
"oembed" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0", "primary" => "1"), "oembed" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0", "primary" => "1"),
"content" => array("type" => "mediumtext"), "content" => array("type" => "mediumtext"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("url", "guessing", "oembed"), "PRIMARY" => array("url", "guessing", "oembed"),
@ -1231,8 +1225,8 @@ function db_definition($charset) {
"contact-id" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), "contact-id" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"),
"guid" => array("type" => "varchar(64)", "not null" => "1", "default" => ""), "guid" => array("type" => "varchar(64)", "not null" => "1", "default" => ""),
"resource-id" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "resource-id" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"edited" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "edited" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"title" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "title" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"desc" => array("type" => "text"), "desc" => array("type" => "text"),
"album" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "album" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
@ -1294,7 +1288,7 @@ function db_definition($charset) {
"fields" => array( "fields" => array(
"pid" => array("type" => "int(10) unsigned", "not null" => "1", "primary" => "1"), "pid" => array("type" => "int(10) unsigned", "not null" => "1", "primary" => "1"),
"command" => array("type" => "varbinary(32)", "not null" => "1", "default" => ""), "command" => array("type" => "varbinary(32)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("pid"), "PRIMARY" => array("pid"),
@ -1320,7 +1314,7 @@ function db_definition($charset) {
"gender" => array("type" => "varchar(32)", "not null" => "1", "default" => ""), "gender" => array("type" => "varchar(32)", "not null" => "1", "default" => ""),
"marital" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "marital" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"with" => array("type" => "text"), "with" => array("type" => "text"),
"howlong" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "howlong" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"sexual" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "sexual" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"politic" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "politic" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"religion" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "religion" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
@ -1372,7 +1366,7 @@ function db_definition($charset) {
"topic" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "topic" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"nickname" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "nickname" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"push" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "push" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"last_update" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "last_update" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"secret" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "secret" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
), ),
"indexes" => array( "indexes" => array(
@ -1384,8 +1378,8 @@ function db_definition($charset) {
"id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
"cid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "cid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"network" => array("type" => "varchar(32)", "not null" => "1", "default" => ""), "network" => array("type" => "varchar(32)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"last" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "last" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"content" => array("type" => "mediumtext"), "content" => array("type" => "mediumtext"),
"batch" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "batch" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
), ),
@ -1402,7 +1396,7 @@ function db_definition($charset) {
"fields" => array( "fields" => array(
"id" => array("type" => "int(11) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), "id" => array("type" => "int(11) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
"hash" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "hash" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"uid" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), "uid" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"),
"password" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "password" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"language" => array("type" => "varchar(16)", "not null" => "1", "default" => ""), "language" => array("type" => "varchar(16)", "not null" => "1", "default" => ""),
@ -1456,7 +1450,7 @@ function db_definition($charset) {
"spam" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "spam" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"ham" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "ham" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"term" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "term" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"date" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "date" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),
@ -1475,8 +1469,8 @@ function db_definition($charset) {
"term" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "term" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"guid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "guid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"received" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "received" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"global" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "global" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"aid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), "aid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"),
"uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"), "uid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"),
@ -1497,11 +1491,11 @@ function db_definition($charset) {
"gcontact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), "gcontact-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"),
"owner-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), "owner-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"),
"author-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), "author-id" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"edited" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "edited" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"commented" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "commented" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"received" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "received" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"changed" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "changed" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"wall" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "wall" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"private" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "private" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"pubmail" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "pubmail" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
@ -1553,8 +1547,8 @@ function db_definition($charset) {
"openid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "openid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"timezone" => array("type" => "varchar(128)", "not null" => "1", "default" => ""), "timezone" => array("type" => "varchar(128)", "not null" => "1", "default" => ""),
"language" => array("type" => "varchar(32)", "not null" => "1", "default" => "en"), "language" => array("type" => "varchar(32)", "not null" => "1", "default" => "en"),
"register_date" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "register_date" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"login_date" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "login_date" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"default-location" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "default-location" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"allow_location" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "allow_location" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"theme" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "theme" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
@ -1578,8 +1572,8 @@ function db_definition($charset) {
"expire" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"), "expire" => array("type" => "int(11) unsigned", "not null" => "1", "default" => "0"),
"account_removed" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "account_removed" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"account_expired" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"), "account_expired" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
"account_expires_on" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "account_expires_on" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"expire_notification_sent" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "expire_notification_sent" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"service_class" => array("type" => "varchar(32)", "not null" => "1", "default" => ""), "service_class" => array("type" => "varchar(32)", "not null" => "1", "default" => ""),
"def_gid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "def_gid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"allow_cid" => array("type" => "mediumtext"), "allow_cid" => array("type" => "mediumtext"),
@ -1608,9 +1602,9 @@ function db_definition($charset) {
"id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), "id" => array("type" => "int(11)", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
"parameter" => array("type" => "text"), "parameter" => array("type" => "text"),
"priority" => array("type" => "tinyint(3) unsigned", "not null" => "1", "default" => "0"), "priority" => array("type" => "tinyint(3) unsigned", "not null" => "1", "default" => "0"),
"created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"pid" => array("type" => "int(11)", "not null" => "1", "default" => "0"), "pid" => array("type" => "int(11)", "not null" => "1", "default" => "0"),
"executed" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "executed" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),

View file

@ -2,32 +2,12 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
function dbupdate_run(&$argv, &$argc) { function dbupdate_run(&$argv, &$argc) {
global $a, $db; global $a;
if(is_null($a)){
$a = new App;
}
if(is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
}
Config::load();
// We are deleting the latest dbupdate entry. // We are deleting the latest dbupdate entry.
// This is done to avoid endless loops because the update was interupted. // This is done to avoid endless loops because the update was interupted.
Config::delete('database','dbupdate_'.DB_UPDATE_VERSION); Config::delete('database', 'dbupdate_'.DB_UPDATE_VERSION);
update_db($a); update_db($a);
} }
if (array_search(__file__,get_included_files())===0){
dbupdate_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -2,44 +2,25 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
require_once('include/queue_fn.php'); require_once('include/queue_fn.php');
require_once('include/html2plain.php'); require_once('include/html2plain.php');
require_once("include/Scrape.php"); require_once('include/Scrape.php');
require_once('include/diaspora.php'); require_once('include/diaspora.php');
require_once("include/ostatus.php"); require_once('include/ostatus.php');
require_once("include/dfrn.php"); require_once('include/dfrn.php');
function delivery_run(&$argv, &$argc){ function delivery_run(&$argv, &$argc){
global $a, $db; global $a;
if (is_null($a)) { require_once('include/datetime.php');
$a = new App;
}
if (is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
}
require_once("include/session.php");
require_once("include/datetime.php");
require_once('include/items.php'); require_once('include/items.php');
require_once('include/bbcode.php'); require_once('include/bbcode.php');
require_once('include/email.php'); require_once('include/email.php');
Config::load();
load_hooks();
if ($argc < 3) { if ($argc < 3) {
return; return;
} }
$a->set_baseurl(get_config('system','url'));
logger('delivery: invoked: '. print_r($argv,true), LOGGER_DEBUG); logger('delivery: invoked: '. print_r($argv,true), LOGGER_DEBUG);
$cmd = $argv[1]; $cmd = $argv[1];
@ -49,30 +30,6 @@ function delivery_run(&$argv, &$argc){
$contact_id = intval($argv[$x]); $contact_id = intval($argv[$x]);
/// @todo When switching completely to the worker we won't need this anymore
// Some other process may have delivered this item already.
$r = q("SELECT * FROM `deliverq` WHERE `cmd` = '%s' AND `item` = %d AND `contact` = %d LIMIT 1",
dbesc($cmd),
dbesc($item_id),
dbesc($contact_id)
);
if (!dbm::is_result($r)) {
continue;
}
if ($a->maxload_reached()) {
return;
}
// It's ours to deliver. Remove it from the queue.
q("DELETE FROM `deliverq` WHERE `cmd` = '%s' AND `item` = %d AND `contact` = %d",
dbesc($cmd),
dbesc($item_id),
dbesc($contact_id)
);
if (!$item_id || !$contact_id) { if (!$item_id || !$contact_id) {
continue; continue;
} }
@ -577,8 +534,3 @@ function delivery_run(&$argv, &$argc){
return; return;
} }
if (array_search(__file__,get_included_files())===0){
delivery_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -1094,7 +1094,7 @@ class dfrn {
return 3; return 3;
} }
if($contact['term-date'] != '0000-00-00 00:00:00') { if ($contact['term-date'] > NULL_DATE) {
logger("dfrn_deliver: $url back from the dead - removing mark for death"); logger("dfrn_deliver: $url back from the dead - removing mark for death");
require_once('include/Contact.php'); require_once('include/Contact.php');
unmark_for_death($contact); unmark_for_death($contact);

View file

@ -1,36 +1,16 @@
<?php <?php
require_once("boot.php");
use \Friendica\Core\Config; use \Friendica\Core\Config;
function directory_run(&$argv, &$argc){ function directory_run(&$argv, &$argc){
global $a, $db; if ($argc != 2) {
return;
if(is_null($a)) {
$a = new App;
} }
if(is_null($db)) { $dir = get_config('system', 'directory');
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
Config::load(); if (!strlen($dir)) {
if($argc != 2)
return;
load_hooks();
$a->set_baseurl(get_config('system','url'));
$dir = get_config('system','directory');
if(! strlen($dir))
return; return;
}
$dir .= "/submit"; $dir .= "/submit";
@ -39,13 +19,8 @@ function directory_run(&$argv, &$argc){
call_hooks('globaldir_update', $arr); call_hooks('globaldir_update', $arr);
logger('Updating directory: ' . $arr['url'], LOGGER_DEBUG); logger('Updating directory: ' . $arr['url'], LOGGER_DEBUG);
if(strlen($arr['url'])) if (strlen($arr['url'])) {
fetch_url($dir . '?url=' . bin2hex($arr['url'])); fetch_url($dir . '?url=' . bin2hex($arr['url']));
}
return; return;
} }
if (array_search(__file__,get_included_files())===0){
directory_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -2,62 +2,87 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php"); require_once('include/socgraph.php');
require_once("include/socgraph.php"); require_once('include/datetime.php');
function discover_poco_run(&$argv, &$argc){ function discover_poco_run(&$argv, &$argc) {
global $a, $db;
if(is_null($a)) { /*
$a = new App; This function can be called in these ways:
} - dirsearch <search pattern>: Searches for "search pattern" in the directory. "search pattern" is url encoded.
- checkcontact: Updates gcontact entries
- suggestions: Discover other servers for their contacts.
- server <poco url>: Searches for the poco server list. "poco url" is base64 encoded.
- update_server: Frequently check the first 250 servers for vitality.
- update_server_directory: Discover the given server id for their contacts
- poco_load: Load POCO data from a given POCO address
- check_profile: Update remote profile data
*/
if(is_null($db)) { if (($argc > 2) && ($argv[1] == "dirsearch")) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
require_once('include/session.php');
require_once('include/datetime.php');
Config::load();
// Don't check this stuff if the function is called by the poller
if (App::callstack() != "poller_run")
if ($a->maxload_reached())
return;
if(($argc > 2) && ($argv[1] == "dirsearch")) {
$search = urldecode($argv[2]); $search = urldecode($argv[2]);
$mode = 1; $mode = 1;
} elseif(($argc == 2) && ($argv[1] == "checkcontact")) { } elseif (($argc == 2) && ($argv[1] == "checkcontact")) {
$mode = 2; $mode = 2;
} elseif(($argc == 2) && ($argv[1] == "suggestions")) { } elseif (($argc == 2) && ($argv[1] == "suggestions")) {
$mode = 3; $mode = 3;
} elseif (($argc == 3) && ($argv[1] == "server")) {
$mode = 4;
} elseif (($argc == 2) && ($argv[1] == "update_server")) {
$mode = 5;
} elseif (($argc == 3) && ($argv[1] == "update_server_directory")) {
$mode = 6;
} elseif (($argc > 5) && ($argv[1] == "poco_load")) {
$mode = 7;
} elseif (($argc == 3) && ($argv[1] == "check_profile")) {
$mode = 8;
} elseif ($argc == 1) { } elseif ($argc == 1) {
$search = ""; $search = "";
$mode = 0; $mode = 0;
} else } else {
die("Unknown or missing parameter ".$argv[1]."\n"); die("Unknown or missing parameter ".$argv[1]."\n");
}
// Don't check this stuff if the function is called by the poller
if (App::callstack() != "poller_run")
if (App::is_already_running('discover_poco'.$mode.urlencode($search), 'include/discover_poco.php', 1140))
return;
$a->set_baseurl(get_config('system','url'));
load_hooks();
logger('start '.$search); logger('start '.$search);
if ($mode==3) if ($mode == 8) {
$profile_url = base64_decode($argv[2]);
if ($profile_url != "") {
poco_last_updated($profile_url, true);
}
} elseif ($mode == 7) {
if ($argc == 6) {
$url = base64_decode($argv[5]);
} else {
$url = '';
}
poco_load_worker(intval($argv[2]), intval($argv[3]), intval($argv[4]), $url);
} elseif ($mode == 6) {
poco_discover_single_server(intval($argv[2]));
} elseif ($mode == 5) {
update_server();
} elseif ($mode == 4) {
$server_url = base64_decode($argv[2]);
if ($server_url == "") {
return;
}
$server_url = filter_var($server_url, FILTER_SANITIZE_URL);
if (substr(normalise_link($server_url), 0, 7) != "http://") {
return;
}
$result = "Checking server ".$server_url." - ";
$ret = poco_check_server($server_url);
if ($ret) {
$result .= "success";
} else {
$result .= "failed";
}
logger($result, LOGGER_DEBUG);
} elseif ($mode == 3) {
update_suggestions(); update_suggestions();
elseif (($mode == 2) AND get_config('system','poco_completion')) } elseif (($mode == 2) AND get_config('system','poco_completion')) {
discover_users(); discover_users();
elseif (($mode == 1) AND ($search != "") and get_config('system','poco_local_search')) { } elseif (($mode == 1) AND ($search != "") and get_config('system','poco_local_search')) {
discover_directory($search); discover_directory($search);
gs_search_user($search); gs_search_user($search);
} elseif (($mode == 0) AND ($search == "") and (get_config('system','poco_discovery') > 0)) { } elseif (($mode == 0) AND ($search == "") and (get_config('system','poco_discovery') > 0)) {
@ -74,19 +99,48 @@ function discover_poco_run(&$argv, &$argc){
return; return;
} }
/**
* @brief Updates the first 250 servers
*
*/
function update_server() {
$r = q("SELECT `url`, `created`, `last_failure`, `last_contact` FROM `gserver` ORDER BY rand()");
if (!dbm::is_result($r)) {
return;
}
$updated = 0;
foreach ($r AS $server) {
if (!poco_do_update($server["created"], "", $server["last_failure"], $server["last_contact"])) {
continue;
}
logger('Update server status for server '.$server["url"], LOGGER_DEBUG);
proc_run(PRIORITY_LOW, "include/discover_poco.php", "server", base64_encode($server["url"]));
if (++$updated > 250) {
return;
}
}
}
function discover_users() { function discover_users() {
logger("Discover users", LOGGER_DEBUG); logger("Discover users", LOGGER_DEBUG);
$users = q("SELECT `url`, `created`, `updated`, `last_failure`, `last_contact`, `server_url` FROM `gcontact` $starttime = time();
$users = q("SELECT `url`, `created`, `updated`, `last_failure`, `last_contact`, `server_url`, `network` FROM `gcontact`
WHERE `last_contact` < UTC_TIMESTAMP - INTERVAL 1 MONTH AND WHERE `last_contact` < UTC_TIMESTAMP - INTERVAL 1 MONTH AND
`last_failure` < UTC_TIMESTAMP - INTERVAL 1 MONTH AND `last_failure` < UTC_TIMESTAMP - INTERVAL 1 MONTH AND
`network` IN ('%s', '%s', '%s', '%s', '') ORDER BY rand()", `network` IN ('%s', '%s', '%s', '%s', '') ORDER BY rand()",
dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA),
dbesc(NETWORK_OSTATUS), dbesc(NETWORK_FEED)); dbesc(NETWORK_OSTATUS), dbesc(NETWORK_FEED));
if (!$users) if (!$users) {
return; return;
}
$checked = 0; $checked = 0;
foreach ($users AS $user) { foreach ($users AS $user) {
@ -111,27 +165,34 @@ function discover_users() {
continue; continue;
} }
if ($user["server_url"] != "") if ($user["server_url"] != "") {
$server_url = $user["server_url"]; $server_url = $user["server_url"];
else } else {
$server_url = poco_detect_server($user["url"]); $server_url = poco_detect_server($user["url"]);
}
if ((($server_url == "") AND ($user["network"] == NETWORK_FEED)) OR poco_check_server($server_url, $user["network"])) {
logger('Check profile '.$user["url"]);
proc_run(PRIORITY_LOW, "include/discover_poco.php", "check_profile", base64_encode($user["url"]));
if (($server_url == "") OR poco_check_server($server_url, $gcontacts[0]["network"])) { if (++$checked > 100) {
logger('Check user '.$user["url"]);
poco_last_updated($user["url"], true);
if (++$checked > 100)
return; return;
} else }
} else {
q("UPDATE `gcontact` SET `last_failure` = '%s' WHERE `nurl` = '%s'", q("UPDATE `gcontact` SET `last_failure` = '%s' WHERE `nurl` = '%s'",
dbesc(datetime_convert()), dbesc(normalise_link($user["url"]))); dbesc(datetime_convert()), dbesc(normalise_link($user["url"])));
}
// Quit the loop after 3 minutes
if (time() > ($starttime + 180)) {
return;
}
} }
} }
function discover_directory($search) { function discover_directory($search) {
$data = Cache::get("dirsearch:".$search); $data = Cache::get("dirsearch:".$search);
if (!is_null($data)){ if (!is_null($data)) {
// Only search for the same item every 24 hours // Only search for the same item every 24 hours
if (time() < $data + (60 * 60 * 24)) { if (time() < $data + (60 * 60 * 24)) {
logger("Already searched for ".$search." in the last 24 hours", LOGGER_DEBUG); logger("Already searched for ".$search." in the last 24 hours", LOGGER_DEBUG);
@ -142,7 +203,7 @@ function discover_directory($search) {
$x = fetch_url(get_server()."/lsearch?p=1&n=500&search=".urlencode($search)); $x = fetch_url(get_server()."/lsearch?p=1&n=500&search=".urlencode($search));
$j = json_decode($x); $j = json_decode($x);
if(count($j->results)) if (count($j->results)) {
foreach($j->results as $jj) { foreach($j->results as $jj) {
// Check if the contact already exists // Check if the contact already exists
$exists = q("SELECT `id`, `last_contact`, `last_failure`, `updated` FROM `gcontact` WHERE `nurl` = '%s'", normalise_link($jj->url)); $exists = q("SELECT `id`, `last_contact`, `last_failure`, `updated` FROM `gcontact` WHERE `nurl` = '%s'", normalise_link($jj->url));
@ -150,32 +211,33 @@ function discover_directory($search) {
logger("Profile ".$jj->url." already exists (".$search.")", LOGGER_DEBUG); logger("Profile ".$jj->url." already exists (".$search.")", LOGGER_DEBUG);
if (($exists[0]["last_contact"] < $exists[0]["last_failure"]) AND if (($exists[0]["last_contact"] < $exists[0]["last_failure"]) AND
($exists[0]["updated"] < $exists[0]["last_failure"])) ($exists[0]["updated"] < $exists[0]["last_failure"])) {
continue; continue;
}
// Update the contact // Update the contact
poco_last_updated($jj->url); poco_last_updated($jj->url);
continue; continue;
} }
// Harcoded paths aren't so good. But in this case it is okay. $server_url = poco_detect_server($jj->url);
// First: We only will get Friendica contacts (which always are using this url schema) if ($server_url != '') {
// Second: There will be no further problems if we are doing a mistake
$server_url = preg_replace("=(https?://)(.*)/profile/(.*)=ism", "$1$2", $jj->url);
if ($server_url != $jj->url)
if (!poco_check_server($server_url)) { if (!poco_check_server($server_url)) {
logger("Friendica server ".$server_url." doesn't answer.", LOGGER_DEBUG); logger("Friendica server ".$server_url." doesn't answer.", LOGGER_DEBUG);
continue; continue;
} }
logger("Friendica server ".$server_url." seems to be okay.", LOGGER_DEBUG); logger("Friendica server ".$server_url." seems to be okay.", LOGGER_DEBUG);
}
logger("Check if profile ".$jj->url." is reachable (".$search.")", LOGGER_DEBUG);
$data = probe_url($jj->url); $data = probe_url($jj->url);
if ($data["network"] == NETWORK_DFRN) { if ($data["network"] == NETWORK_DFRN) {
logger("Profile ".$jj->url." is reachable (".$search.")", LOGGER_DEBUG);
logger("Add profile ".$jj->url." to local directory (".$search.")", LOGGER_DEBUG); logger("Add profile ".$jj->url." to local directory (".$search.")", LOGGER_DEBUG);
poco_check($data["url"], $data["name"], $data["network"], $data["photo"], "", "", "", $jj->tags, $data["addr"], "", 0); poco_check($data["url"], $data["name"], $data["network"], $data["photo"], "", "", "", $jj->tags, $data["addr"], "", 0);
} else {
logger("Profile ".$jj->url." is not responding or no Friendica contact - but network ".$data["network"], LOGGER_DEBUG);
} }
} }
}
Cache::set("dirsearch:".$search, time(), CACHE_DAY); Cache::set("dirsearch:".$search, time(), CACHE_DAY);
} }
@ -195,14 +257,14 @@ function gs_search_user($search) {
$url = "http://gstools.org/api/users_search/".urlencode($search); $url = "http://gstools.org/api/users_search/".urlencode($search);
$result = z_fetch_url($url); $result = z_fetch_url($url);
if (!$result["success"]) if (!$result["success"]) {
return false; return false;
}
$contacts = json_decode($result["body"]); $contacts = json_decode($result["body"]);
if ($contacts->status == 'ERROR') if ($contacts->status == 'ERROR') {
return false; return false;
}
foreach($contacts->data AS $user) { foreach($contacts->data AS $user) {
$contact = probe_url($user->site_address."/".$user->name); $contact = probe_url($user->site_address."/".$user->name);
if ($contact["network"] != NETWORK_PHANTOM) { if ($contact["network"] != NETWORK_PHANTOM) {
@ -211,9 +273,3 @@ function gs_search_user($search) {
} }
} }
} }
if (array_search(__file__,get_included_files())===0){
discover_poco_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -4,39 +4,42 @@
* @brief functions specific to event handling * @brief functions specific to event handling
*/ */
require_once('include/bbcode.php'); require_once 'include/bbcode.php';
require_once('include/map.php'); require_once 'include/map.php';
require_once('include/datetime.php'); require_once 'include/datetime.php';
function format_event_html($ev, $simple = false) { function format_event_html($ev, $simple = false) {
if(! ((is_array($ev)) && count($ev))) if(! ((is_array($ev)) && count($ev))) {
return ''; return '';
}
$bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8 AM $bd_format = t('l F d, Y \@ g:i A') ; // Friday January 18, 2011 @ 8 AM
$event_start = (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(), $event_start = (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(),
$ev['start'] , $bd_format )) $ev['start'] , $bd_format ))
: day_translate(datetime_convert('UTC', 'UTC', : day_translate(datetime_convert('UTC', 'UTC',
$ev['start'] , $bd_format))); $ev['start'] , $bd_format)));
$event_end = (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(), $event_end = (($ev['adjust']) ? day_translate(datetime_convert('UTC', date_default_timezone_get(),
$ev['finish'] , $bd_format )) $ev['finish'] , $bd_format ))
: day_translate(datetime_convert('UTC', 'UTC', : day_translate(datetime_convert('UTC', 'UTC',
$ev['finish'] , $bd_format ))); $ev['finish'] , $bd_format )));
if ($simple) { if ($simple) {
$o = "<h3>".bbcode($ev['summary'])."</h3>"; $o = "<h3>" . bbcode($ev['summary']) . "</h3>";
$o .= "<p>".bbcode($ev['desc'])."</p>"; $o .= "<p>" . bbcode($ev['desc']) . "</p>";
$o .= "<h4>".t('Starts:')."</h4><p>".$event_start."</p>"; $o .= "<h4>" . t('Starts:') . "</h4><p>" . $event_start . "</p>";
if(! $ev['nofinish']) if (! $ev['nofinish']) {
$o .= "<h4>".t('Finishes:')."</h4><p>".$event_end."</p>"; $o .= "<h4>" . t('Finishes:') . "</h4><p>" . $event_end ."</p>";
}
if(strlen($ev['location'])) if (strlen($ev['location'])) {
$o .= "<h4>".t('Location:')."</h4><p>".$ev['location']."</p>"; $o .= "<h4>" . t('Location:') . "</h4><p>" . $ev['location'] . "</p>";
}
return $o; return $o;
} }
@ -44,31 +47,34 @@ function format_event_html($ev, $simple = false) {
$o = '<div class="vevent">' . "\r\n"; $o = '<div class="vevent">' . "\r\n";
$o .= '<p class="summary event-summary">' . bbcode($ev['summary']) . '</p>' . "\r\n"; $o .= '<p class="summary event-summary">' . bbcode($ev['summary']) . '</p>' . "\r\n";
$o .= '<p class="description event-description">' . bbcode($ev['desc']) . '</p>' . "\r\n"; $o .= '<p class="description event-description">' . bbcode($ev['desc']) . '</p>' . "\r\n";
$o .= '<p class="event-start">' . t('Starts:') . ' <abbr class="dtstart" title="' $o .= '<p class="event-start">' . t('Starts:') . ' <abbr class="dtstart" title="'
. datetime_convert('UTC','UTC',$ev['start'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' )) . datetime_convert('UTC', 'UTC', $ev['start'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
. '" >'.$event_start . '" >'.$event_start
. '</abbr></p>' . "\r\n"; . '</abbr></p>' . "\r\n";
if(! $ev['nofinish']) if (! $ev['nofinish']) {
$o .= '<p class="event-end" >' . t('Finishes:') . ' <abbr class="dtend" title="' $o .= '<p class="event-end" >' . t('Finishes:') . ' <abbr class="dtend" title="'
. datetime_convert('UTC','UTC',$ev['finish'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' )) . datetime_convert('UTC', 'UTC', $ev['finish'], (($ev['adjust']) ? ATOM_TIME : 'Y-m-d\TH:i:s' ))
. '" >'.$event_end . '" >'.$event_end
. '</abbr></p>' . "\r\n"; . '</abbr></p>' . "\r\n";
}
if(strlen($ev['location'])){ if (strlen($ev['location'])) {
$o .= '<p class="event-location"> ' . t('Location:') . ' <span class="location">' $o .= '<p class="event-location"> ' . t('Location:') . ' <span class="location">'
. bbcode($ev['location']) . bbcode($ev['location'])
. '</span></p>' . "\r\n"; . '</span></p>' . "\r\n";
if (strpos($ev['location'], "[map") !== False) { // Include a map of the location if the [map] BBCode is used
if (strpos($ev['location'], "[map") !== false) {
$map = generate_named_map($ev['location']); $map = generate_named_map($ev['location']);
if ($map!==$ev['location']) $o.=$map; if ($map !== $ev['location']) {
$o.= $map;
}
} }
} }
$o .= '</div>' . "\r\n"; $o .= '</div>' . "\r\n";
@ -146,63 +152,81 @@ function format_event_bbcode($ev) {
$o = ''; $o = '';
if($ev['summary']) if ($ev['summary']) {
$o .= '[event-summary]' . $ev['summary'] . '[/event-summary]'; $o .= '[event-summary]' . $ev['summary'] . '[/event-summary]';
}
if($ev['desc']) if ($ev['desc']) {
$o .= '[event-description]' . $ev['desc'] . '[/event-description]'; $o .= '[event-description]' . $ev['desc'] . '[/event-description]';
}
if($ev['start']) if ($ev['start']) {
$o .= '[event-start]' . $ev['start'] . '[/event-start]'; $o .= '[event-start]' . $ev['start'] . '[/event-start]';
}
if(($ev['finish']) && (! $ev['nofinish'])) if (($ev['finish']) && (! $ev['nofinish'])) {
$o .= '[event-finish]' . $ev['finish'] . '[/event-finish]'; $o .= '[event-finish]' . $ev['finish'] . '[/event-finish]';
}
if($ev['location']) if ($ev['location']) {
$o .= '[event-location]' . $ev['location'] . '[/event-location]'; $o .= '[event-location]' . $ev['location'] . '[/event-location]';
}
if($ev['adjust']) if ($ev['adjust']) {
$o .= '[event-adjust]' . $ev['adjust'] . '[/event-adjust]'; $o .= '[event-adjust]' . $ev['adjust'] . '[/event-adjust]';
}
return $o; return $o;
} }
function bbtovcal($s) { function bbtovcal($s) {
$o = ''; $o = '';
$ev = bbtoevent($s); $ev = bbtoevent($s);
if($ev['desc'])
if ($ev['desc']) {
$o = format_event_html($ev); $o = format_event_html($ev);
}
return $o; return $o;
} }
function bbtoevent($s) { function bbtoevent($s) {
$ev = array(); $ev = array();
$match = ''; $match = '';
if(preg_match("/\[event\-summary\](.*?)\[\/event\-summary\]/is",$s,$match)) if (preg_match("/\[event\-summary\](.*?)\[\/event\-summary\]/is", $s, $match)) {
$ev['summary'] = $match[1]; $ev['summary'] = $match[1];
$match = ''; }
if(preg_match("/\[event\-description\](.*?)\[\/event\-description\]/is",$s,$match))
$ev['desc'] = $match[1];
$match = '';
if(preg_match("/\[event\-start\](.*?)\[\/event\-start\]/is",$s,$match))
$ev['start'] = $match[1];
$match = '';
if(preg_match("/\[event\-finish\](.*?)\[\/event\-finish\]/is",$s,$match))
$ev['finish'] = $match[1];
$match = '';
if(preg_match("/\[event\-location\](.*?)\[\/event\-location\]/is",$s,$match))
$ev['location'] = $match[1];
$match = '';
if(preg_match("/\[event\-adjust\](.*?)\[\/event\-adjust\]/is",$s,$match))
$ev['adjust'] = $match[1];
$ev['nofinish'] = (((x($ev, 'start') && $ev['start']) && (!x($ev, 'finish') || !$ev['finish'])) ? 1 : 0);
return $ev;
$match = '';
if (preg_match("/\[event\-description\](.*?)\[\/event\-description\]/is", $s, $match)) {
$ev['desc'] = $match[1];
}
$match = '';
if (preg_match("/\[event\-start\](.*?)\[\/event\-start\]/is", $s, $match)) {
$ev['start'] = $match[1];
}
$match = '';
if (preg_match("/\[event\-finish\](.*?)\[\/event\-finish\]/is", $s, $match)) {
$ev['finish'] = $match[1];
}
$match = '';
if (preg_match("/\[event\-location\](.*?)\[\/event\-location\]/is", $s, $match)) {
$ev['location'] = $match[1];
}
$match = '';
if (preg_match("/\[event\-adjust\](.*?)\[\/event\-adjust\]/is", $s, $match)) {
$ev['adjust'] = $match[1];
}
$ev['nofinish'] = (((x($ev, 'start') && $ev['start']) && (!x($ev, 'finish') || !$ev['finish'])) ? 1 : 0);
return $ev;
} }
@ -212,21 +236,22 @@ function sort_by_date($a) {
return $a; return $a;
} }
function ev_compare($a,$b) { function ev_compare($a,$b) {
$date_a = (($a['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$a['start']) : $a['start']); $date_a = (($a['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $a['start']) : $a['start']);
$date_b = (($b['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$b['start']) : $b['start']); $date_b = (($b['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $b['start']) : $b['start']);
if($date_a === $date_b) if ($date_a === $date_b) {
return strcasecmp($a['desc'],$b['desc']); return strcasecmp($a['desc'], $b['desc']);
}
return strcmp($date_a,$date_b); return strcmp($date_a, $date_b);
} }
function event_delete($event_id) { function event_delete($event_id) {
if ($event_id == 0) if ($event_id == 0) {
return; return;
}
q("DELETE FROM `event` WHERE `id` = %d", intval($event_id)); q("DELETE FROM `event` WHERE `id` = %d", intval($event_id));
logger("Deleted event ".$event_id, LOGGER_DEBUG); logger("Deleted event ".$event_id, LOGGER_DEBUG);
@ -234,37 +259,39 @@ function event_delete($event_id) {
function event_store($arr) { function event_store($arr) {
require_once('include/datetime.php'); require_once 'include/datetime.php';
require_once('include/items.php'); require_once 'include/items.php';
require_once('include/bbcode.php'); require_once 'include/bbcode.php';
$a = get_app(); $a = get_app();
$arr['created'] = (($arr['created']) ? $arr['created'] : datetime_convert()); $arr['created'] = (($arr['created']) ? $arr['created'] : datetime_convert());
$arr['edited'] = (($arr['edited']) ? $arr['edited'] : datetime_convert()); $arr['edited'] = (($arr['edited']) ? $arr['edited'] : datetime_convert());
$arr['type'] = (($arr['type']) ? $arr['type'] : 'event' ); $arr['type'] = (($arr['type']) ? $arr['type'] : 'event' );
$arr['cid'] = ((intval($arr['cid'])) ? intval($arr['cid']) : 0); $arr['cid'] = ((intval($arr['cid'])) ? intval($arr['cid']) : 0);
$arr['uri'] = (x($arr,'uri') ? $arr['uri'] : item_new_uri($a->get_hostname(),$arr['uid'])); $arr['uri'] = (x($arr, 'uri') ? $arr['uri'] : item_new_uri($a->get_hostname(), $arr['uid']));
$arr['private'] = ((x($arr,'private')) ? intval($arr['private']) : 0); $arr['private'] = ((x($arr, 'private')) ? intval($arr['private']) : 0);
$arr['guid'] = get_guid(32); $arr['guid'] = get_guid(32);
if($arr['cid']) if ($arr['cid']) {
$c = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", $c = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($arr['cid']), intval($arr['cid']),
intval($arr['uid']) intval($arr['uid'])
); );
else } else {
$c = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1", $c = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
intval($arr['uid']) intval($arr['uid'])
); );
}
if(count($c)) if (dbm::is_result($c)) {
$contact = $c[0]; $contact = $c[0];
}
// Existing event being modified // Existing event being modified
if($arr['id']) { if ($arr['id']) {
// has the event actually changed? // has the event actually changed?
@ -272,7 +299,7 @@ function event_store($arr) {
intval($arr['id']), intval($arr['id']),
intval($arr['uid']) intval($arr['uid'])
); );
if((! dbm::is_result($r)) || ($r[0]['edited'] === $arr['edited'])) { if ((! dbm::is_result($r)) || ($r[0]['edited'] === $arr['edited'])) {
// Nothing has changed. Grab the item id to return. // Nothing has changed. Grab the item id to return.
@ -280,7 +307,7 @@ function event_store($arr) {
intval($arr['id']), intval($arr['id']),
intval($arr['uid']) intval($arr['uid'])
); );
return((dbm::is_result($r)) ? $r[0]['id'] : 0); return ((dbm::is_result($r)) ? $r[0]['id'] : 0);
} }
// The event changed. Update it. // The event changed. Update it.
@ -318,7 +345,6 @@ function event_store($arr) {
$object .= '<content>' . xmlify(format_event_bbcode($arr)) . '</content>'; $object .= '<content>' . xmlify(format_event_bbcode($arr)) . '</content>';
$object .= '</object>' . "\n"; $object .= '</object>' . "\n";
q("UPDATE `item` SET `body` = '%s', `object` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d", q("UPDATE `item` SET `body` = '%s', `object` = '%s', `edited` = '%s' WHERE `id` = %d AND `uid` = %d",
dbesc(format_event_bbcode($arr)), dbesc(format_event_bbcode($arr)),
dbesc($object), dbesc($object),
@ -328,8 +354,9 @@ function event_store($arr) {
); );
$item_id = $r[0]['id']; $item_id = $r[0]['id'];
} else } else {
$item_id = 0; $item_id = 0;
}
call_hooks("event_updated", $arr['id']); call_hooks("event_updated", $arr['id']);
@ -366,8 +393,9 @@ function event_store($arr) {
dbesc($arr['uri']), dbesc($arr['uri']),
intval($arr['uid']) intval($arr['uid'])
); );
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$event = $r[0]; $event = $r[0];
}
$item_arr = array(); $item_arr = array();
@ -399,7 +427,7 @@ function event_store($arr) {
$item_arr['body'] = format_event_bbcode($event); $item_arr['body'] = format_event_bbcode($event);
$item_arr['object'] = '<object><type>' . xmlify(ACTIVITY_OBJ_EVENT) . '</type><title></title><id>' . xmlify($arr['uri']) . '</id>'; $item_arr['object'] = '<object><type>' . xmlify(ACTIVITY_OBJ_EVENT) . '</type><title></title><id>' . xmlify($arr['uri']) . '</id>';
$item_arr['object'] .= '<content>' . xmlify(format_event_bbcode($event)) . '</content>'; $item_arr['object'] .= '<content>' . xmlify(format_event_bbcode($event)) . '</content>';
$item_arr['object'] .= '</object>' . "\n"; $item_arr['object'] .= '</object>' . "\n";
@ -412,7 +440,7 @@ function event_store($arr) {
// $plink = App::get_baseurl() . '/display/' . $r[0]['nickname'] . '/' . $item_id; // $plink = App::get_baseurl() . '/display/' . $r[0]['nickname'] . '/' . $item_id;
if($item_id) { if ($item_id) {
//q("UPDATE `item` SET `plink` = '%s', `event-id` = %d WHERE `uid` = %d AND `id` = %d", //q("UPDATE `item` SET `plink` = '%s', `event-id` = %d WHERE `uid` = %d AND `id` = %d",
// dbesc($plink), // dbesc($plink),
// intval($event['id']), // intval($event['id']),
@ -433,12 +461,17 @@ function event_store($arr) {
} }
function get_event_strings() { function get_event_strings() {
// First day of the week (0 = Sunday) // First day of the week (0 = Sunday)
$firstDay = get_pconfig(local_user(),'system','first_day_of_week'); $firstDay = get_pconfig(local_user(), 'system', 'first_day_of_week');
if ($firstDay === false) $firstDay=0; if ($firstDay === false) {
$firstDay = 0;
}
$i18n = array( $i18n = array(
"firstDay" => $firstDay, "firstDay" => $firstDay,
"allday" => t("all-day"),
"Sun" => t("Sun"), "Sun" => t("Sun"),
"Mon" => t("Mon"), "Mon" => t("Mon"),
"Tue" => t("Tue"), "Tue" => t("Tue"),
@ -446,13 +479,15 @@ function get_event_strings() {
"Thu" => t("Thu"), "Thu" => t("Thu"),
"Fri" => t("Fri"), "Fri" => t("Fri"),
"Sat" => t("Sat"), "Sat" => t("Sat"),
"Sunday" => t("Sunday"),
"Monday" => t("Monday"), "Sunday" => t("Sunday"),
"Tuesday" => t("Tuesday"), "Monday" => t("Monday"),
"Tuesday" => t("Tuesday"),
"Wednesday" => t("Wednesday"), "Wednesday" => t("Wednesday"),
"Thursday" => t("Thursday"), "Thursday" => t("Thursday"),
"Friday" => t("Friday"), "Friday" => t("Friday"),
"Saturday" => t("Saturday"), "Saturday" => t("Saturday"),
"Jan" => t("Jan"), "Jan" => t("Jan"),
"Feb" => t("Feb"), "Feb" => t("Feb"),
"Mar" => t("Mar"), "Mar" => t("Mar"),
@ -465,47 +500,49 @@ function get_event_strings() {
"Oct" => t("Oct"), "Oct" => t("Oct"),
"Nov" => t("Nov"), "Nov" => t("Nov"),
"Dec" => t("Dec"), "Dec" => t("Dec"),
"January" => t("January"),
"February" => t("February"), "January" => t("January"),
"March" => t("March"), "February" => t("February"),
"April" => t("April"), "March" => t("March"),
"May" => t("May"), "April" => t("April"),
"June" => t("June"), "May" => t("May"),
"July" => t("July"), "June" => t("June"),
"August" => t("August"), "July" => t("July"),
"August" => t("August"),
"September" => t("September"), "September" => t("September"),
"October" => t("October"), "October" => t("October"),
"November" => t("November"), "November" => t("November"),
"December" => t("December"), "December" => t("December"),
"today" => t("today"), "today" => t("today"),
"month" => t("month"), "month" => t("month"),
"week" => t("week"), "week" => t("week"),
"day" => t("day"), "day" => t("day"),
"allday" => t("all-day"),
"noevent" => t("No events to display"), "noevent" => t("No events to display"),
"dtstart_label" => t("Starts:"), "dtstart_label" => t("Starts:"),
"dtend_label" => t("Finishes:"), "dtend_label" => t("Finishes:"),
"location_label" => t("Location:") "location_label" => t("Location:")
); );
return $i18n; return $i18n;
} }
/// @todo We should replace this with a separate update function if there is some time left
/** /**
* @brief Removes duplicated birthday events * @brief Removes duplicated birthday events
* *
* @param array $dates Array of possibly duplicated events * @param array $dates Array of possibly duplicated events
* @return array Cleaned events * @return array Cleaned events
*
* @todo We should replace this with a separate update function if there is some time left
*/ */
function event_remove_duplicates($dates) { function event_remove_duplicates($dates) {
$dates2 = array(); $dates2 = array();
foreach ($dates AS $date) { foreach ($dates AS $date) {
if ($date['type'] == 'birthday') { if ($date['type'] == 'birthday') {
$dates2[$date['uid']."-".$date['cid']."-".$date['start']] = $date; $dates2[$date['uid'] . "-" . $date['cid'] . "-" . $date['start']] = $date;
} else { } else {
$dates2[] = $date; $dates2[] = $date;
} }
@ -524,10 +561,11 @@ function event_remove_duplicates($dates) {
*/ */
function event_by_id($owner_uid = 0, $event_params, $sql_extra = '') { function event_by_id($owner_uid = 0, $event_params, $sql_extra = '') {
// ownly allow events if there is a valid owner_id // ownly allow events if there is a valid owner_id
if($owner_uid == 0) if ($owner_uid == 0) {
return; return;
}
// query for the event by event id // Query for the event by event id
$r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`, $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
`item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event`
LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid`
@ -556,11 +594,12 @@ function event_by_id($owner_uid = 0, $event_params, $sql_extra = '') {
* @return array Query results * @return array Query results
*/ */
function events_by_date($owner_uid = 0, $event_params, $sql_extra = '') { function events_by_date($owner_uid = 0, $event_params, $sql_extra = '') {
// ownly allow events if there is a valid owner_id // Only allow events if there is a valid owner_id
if($owner_uid == 0) if($owner_uid == 0) {
return; return;
}
// query for the event by date // Query for the event by date
$r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`, $r = q("SELECT `event`.*, `item`.`id` AS `itemid`,`item`.`plink`,
`item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event` `item`.`author-name`, `item`.`author-avatar`, `item`.`author-link` FROM `event`
LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid` LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid`
@ -595,46 +634,54 @@ function process_events($arr) {
$last_date = ''; $last_date = '';
$fmt = t('l, F j'); $fmt = t('l, F j');
if (count($arr)) { if (count($arr)) {
foreach($arr as $rr) { foreach ($arr as $rr) {
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j')); $j = (($rr['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $rr['start'], 'j') : datetime_convert('UTC', 'UTC', $rr['start'], 'j'));
$d = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], $fmt) : datetime_convert('UTC','UTC',$rr['start'],$fmt)); $d = (($rr['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $rr['start'], $fmt) : datetime_convert('UTC', 'UTC', $rr['start'], $fmt));
$d = day_translate($d); $d = day_translate($d);
$start = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'c') : datetime_convert('UTC','UTC',$rr['start'],'c')); $start = (($rr['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $rr['start'], 'c') : datetime_convert('UTC', 'UTC', $rr['start'], 'c'));
if ($rr['nofinish']){ if ($rr['nofinish']) {
$end = null; $end = null;
} else { } else {
$end = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['finish'], 'c') : datetime_convert('UTC','UTC',$rr['finish'],'c')); $end = (($rr['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $rr['finish'], 'c') : datetime_convert('UTC', 'UTC', $rr['finish'], 'c'));
} }
$is_first = ($d !== $last_date); $is_first = ($d !== $last_date);
$last_date = $d; $last_date = $d;
$edit = ((! $rr['cid']) ? array(App::get_baseurl().'/events/event/'.$rr['id'],t('Edit event'),'','') : null);
$title = strip_tags(html_entity_decode(bbcode($rr['summary']),ENT_QUOTES,'UTF-8')); // Show edit and drop actions only if the user is the owner of the event and the event
if(! $title) { // is a real event (no bithdays)
list($title, $_trash) = explode("<br",bbcode($rr['desc']),2); if (local_user() && local_user() == $rr['uid'] && $rr['type'] == 'event') {
$title = strip_tags(html_entity_decode($title,ENT_QUOTES,'UTF-8')); $edit = ((! $rr['cid']) ? array(App::get_baseurl() . '/events/event/' . $rr['id'], t('Edit event'), '', '') : null);
$drop = array(App::get_baseurl() . '/events/drop/' . $rr['id'], t('Delete event'), '', '');
}
$title = strip_tags(html_entity_decode(bbcode($rr['summary']), ENT_QUOTES, 'UTF-8'));
if (! $title) {
list($title, $_trash) = explode("<br", bbcode($rr['desc']), 2);
$title = strip_tags(html_entity_decode($title, ENT_QUOTES, 'UTF-8'));
} }
$html = format_event_html($rr); $html = format_event_html($rr);
$rr['desc'] = bbcode($rr['desc']); $rr['desc'] = bbcode($rr['desc']);
$rr['location'] = bbcode($rr['location']); $rr['location'] = bbcode($rr['location']);
$events[] = array( $events[] = array(
'id'=>$rr['id'], 'id' => $rr['id'],
'start'=> $start, 'start' => $start,
'end' => $end, 'end' => $end,
'allDay' => false, 'allDay' => false,
'title' => $title, 'title' => $title,
'j' => $j, 'j' => $j,
'd' => $d, 'd' => $d,
'is_first'=>$is_first, 'edit' => $edit,
'item'=>$rr, 'drop' => $drop,
'html'=>$html, 'is_first' => $is_first,
'plink' => array($rr['plink'],t('link to source'),'',''), 'item' => $rr,
'html' => $html,
'plink' => array($rr['plink'], t('link to source'), '', ''),
); );
} }
} }
@ -652,34 +699,36 @@ function process_events($arr) {
* @return string Content according to selected export format * @return string Content according to selected export format
*/ */
function event_format_export ($events, $format = 'ical', $timezone) { function event_format_export ($events, $format = 'ical', $timezone) {
if(! ((is_array($events)) && count($events))) if (! ((is_array($events)) && count($events))) {
return; return;
}
switch ($format) { switch ($format) {
// format the exported data as a CSV file // Format the exported data as a CSV file
case "csv": case "csv":
header("Content-type: text/csv"); header("Content-type: text/csv");
$o = '"Subject", "Start Date", "Start Time", "Description", "End Date", "End Time", "Location"' . PHP_EOL; $o = '"Subject", "Start Date", "Start Time", "Description", "End Date", "End Time", "Location"' . PHP_EOL;
foreach ($events as $event) { foreach ($events as $event) {
/// @todo the time / date entries don't include any information about the /// @todo The time / date entries don't include any information about the
// timezone the event is scheduled in :-/ /// timezone the event is scheduled in :-/
$tmp1 = strtotime($event['start']); $tmp1 = strtotime($event['start']);
$tmp2 = strtotime($event['finish']); $tmp2 = strtotime($event['finish']);
$time_format = "%H:%M:%S"; $time_format = "%H:%M:%S";
$date_format = "%Y-%m-%d"; $date_format = "%Y-%m-%d";
$o .= '"'.$event['summary'].'", "'.strftime($date_format, $tmp1) .
'", "'.strftime($time_format, $tmp1).'", "'.$event['desc'] . $o .= '"' . $event['summary'] . '", "' . strftime($date_format, $tmp1) .
'", "'.strftime($date_format, $tmp2) . '", "' . strftime($time_format, $tmp1) . '", "' . $event['desc'] .
'", "'.strftime($time_format, $tmp2) . '", "' . strftime($date_format, $tmp2) .
'", "'.$event['location'].'"' . PHP_EOL; '", "' . strftime($time_format, $tmp2) .
'", "' . $event['location'] . '"' . PHP_EOL;
} }
break; break;
// format the exported data as a ics file // Format the exported data as a ics file
case "ical": case "ical":
header("Content-type: text/ics"); header("Content-type: text/ics");
$o = 'BEGIN:VCALENDAR'. PHP_EOL $o = 'BEGIN:VCALENDAR' . PHP_EOL
. 'VERSION:2.0' . PHP_EOL . 'VERSION:2.0' . PHP_EOL
. 'PRODID:-//friendica calendar export//0.1//EN' . PHP_EOL; . 'PRODID:-//friendica calendar export//0.1//EN' . PHP_EOL;
/// @todo include timezone informations in cases were the time is not in UTC /// @todo include timezone informations in cases were the time is not in UTC
@ -691,35 +740,43 @@ function event_format_export ($events, $format = 'ical', $timezone) {
// but test your solution against http://icalvalid.cloudapp.net/ // but test your solution against http://icalvalid.cloudapp.net/
// also long lines SHOULD be split at 75 characters length // also long lines SHOULD be split at 75 characters length
foreach ($events as $event) { foreach ($events as $event) {
if ($event['adjust'] == 1) { if ($event['adjust'] == 1) {
$UTC = 'Z'; $UTC = 'Z';
} else { } else {
$UTC = ''; $UTC = '';
} }
$o .= 'BEGIN:VEVENT' . PHP_EOL; $o .= 'BEGIN:VEVENT' . PHP_EOL;
if ($event[start]) {
if ($event['start']) {
$tmp = strtotime($event['start']); $tmp = strtotime($event['start']);
$dtformat = "%Y%m%dT%H%M%S".$UTC; $dtformat = "%Y%m%dT%H%M%S" . $UTC;
$o .= 'DTSTART:'.strftime($dtformat, $tmp).PHP_EOL; $o .= 'DTSTART:' . strftime($dtformat, $tmp) . PHP_EOL;
} }
if (!$event['nofinish']) { if (!$event['nofinish']) {
$tmp = strtotime($event['finish']); $tmp = strtotime($event['finish']);
$dtformat = "%Y%m%dT%H%M%S".$UTC; $dtformat = "%Y%m%dT%H%M%S" . $UTC;
$o .= 'DTEND:'.strftime($dtformat, $tmp).PHP_EOL; $o .= 'DTEND:' . strftime($dtformat, $tmp) . PHP_EOL;
} }
if ($event['summary'])
if ($event['summary']) {
$tmp = $event['summary']; $tmp = $event['summary'];
$tmp = str_replace(PHP_EOL, PHP_EOL.' ',$tmp); $tmp = str_replace(PHP_EOL, PHP_EOL . ' ', $tmp);
$tmp = addcslashes($tmp, ',;'); $tmp = addcslashes($tmp, ',;');
$o .= 'SUMMARY:' . $tmp . PHP_EOL; $o .= 'SUMMARY:' . $tmp . PHP_EOL;
if ($event['desc']) }
if ($event['desc']) {
$tmp = $event['desc']; $tmp = $event['desc'];
$tmp = str_replace(PHP_EOL, PHP_EOL.' ',$tmp); $tmp = str_replace(PHP_EOL, PHP_EOL . ' ', $tmp);
$tmp = addcslashes($tmp, ',;'); $tmp = addcslashes($tmp, ',;');
$o .= 'DESCRIPTION:' . $tmp . PHP_EOL; $o .= 'DESCRIPTION:' . $tmp . PHP_EOL;
}
if ($event['location']) { if ($event['location']) {
$tmp = $event['location']; $tmp = $event['location'];
$tmp = str_replace(PHP_EOL, PHP_EOL.' ',$tmp); $tmp = str_replace(PHP_EOL, PHP_EOL . ' ', $tmp);
$tmp = addcslashes($tmp, ',;'); $tmp = addcslashes($tmp, ',;');
$o .= 'LOCATION:' . $tmp . PHP_EOL; $o .= 'LOCATION:' . $tmp . PHP_EOL;
} }
@ -750,16 +807,18 @@ function event_format_export ($events, $format = 'ical', $timezone) {
* @return array Query results * @return array Query results
*/ */
function events_by_uid($uid = 0, $sql_extra = '') { function events_by_uid($uid = 0, $sql_extra = '') {
if($uid == 0) if ($uid == 0) {
return; return;
}
// The permission condition if no condition was transmitted // The permission condition if no condition was transmitted
if($sql_extra == '') if ($sql_extra == '') {
$sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' "; $sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' ";
}
// does the user who requests happen to be the owner of the events // Does the user who requests happen to be the owner of the events
// requested? then show all of your events, otherwise only those that // requested? then show all of your events, otherwise only those that
// don't have limitations set in allow_cid and allow_gid // don't have limitations set in allow_cid and allow_gid
if (local_user() == $uid) { if (local_user() == $uid) {
$r = q("SELECT `start`, `finish`, `adjust`, `summary`, `desc`, `location`, `nofinish` $r = q("SELECT `start`, `finish`, `adjust`, `summary`, `desc`, `location`, `nofinish`
FROM `event` WHERE `uid`= %d AND `cid` = 0 ", FROM `event` WHERE `uid`= %d AND `cid` = 0 ",
@ -772,8 +831,9 @@ function events_by_uid($uid = 0, $sql_extra = '') {
); );
} }
if (dbm::is_result($r)) if (dbm::is_result($r)) {
return $r; return $r;
}
} }
/** /**
@ -792,25 +852,28 @@ function event_export($uid, $format = 'ical') {
$process = false; $process = false;
// we are allowed to show events // We are allowed to show events
// get the timezone the user is in // get the timezone the user is in
$r = q("SELECT `timezone` FROM `user` WHERE `uid` = %d LIMIT 1", intval($uid)); $r = q("SELECT `timezone` FROM `user` WHERE `uid` = %d LIMIT 1", intval($uid));
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$timezone = $r[0]['timezone']; $timezone = $r[0]['timezone'];
}
// get all events which are owned by a uid (respects permissions); // Get all events which are owned by a uid (respects permissions);
$events = events_by_uid($uid); $events = events_by_uid($uid);
// we have the events that are available for the requestor // We have the events that are available for the requestor
// now format the output according to the requested format // now format the output according to the requested format
if(count($events)) if (count($events)) {
$res = event_format_export($events, $format, $timezone); $res = event_format_export($events, $format, $timezone);
}
// If there are results the precess was successfull // If there are results the precess was successfull
if(x($res)) if (x($res)) {
$process = true; $process = true;
}
// get the file extension for the format // Get the file extension for the format
switch ($format) { switch ($format) {
case "ical": case "ical":
$file_ext = "ics"; $file_ext = "ics";
@ -825,10 +888,10 @@ function event_export($uid, $format = 'ical') {
} }
$arr = array( $arr = array(
'success' => $process, 'success' => $process,
'format' => $format, 'format' => $format,
'extension' => $file_ext, 'extension' => $file_ext,
'content' => $res, 'content' => $res,
); );
return $arr; return $arr;
@ -851,8 +914,9 @@ function widget_events() {
// The permission testing is a little bit tricky because we have to respect many cases // The permission testing is a little bit tricky because we have to respect many cases
// It's not the private events page (we don't get the $owner_uid for /events) // It's not the private events page (we don't get the $owner_uid for /events)
if(! local_user() && ! $owner_uid) if (! local_user() && ! $owner_uid) {
return; return;
}
// Cal logged in user (test permission at foreign profile page) // Cal logged in user (test permission at foreign profile page)
// If the $owner uid is available we know it is part of one of the profile pages (like /cal) // If the $owner uid is available we know it is part of one of the profile pages (like /cal)
@ -860,13 +924,15 @@ function widget_events() {
// or a foreign one. For foreign profile pages we need to check if the feature // or a foreign one. For foreign profile pages we need to check if the feature
// for exporting the cal is enabled (otherwise the widget would appear for logged in users // for exporting the cal is enabled (otherwise the widget would appear for logged in users
// on foreigen profile pages even if the widget is disabled) // on foreigen profile pages even if the widget is disabled)
if(intval($owner_uid) && local_user() !== $owner_uid && ! feature_enabled($owner_uid, "export_calendar")) if (intval($owner_uid) && local_user() !== $owner_uid && ! feature_enabled($owner_uid, "export_calendar")) {
return; return;
}
// If it's a kind of profile page (intval($owner_uid)) return if the user not logged in and // If it's a kind of profile page (intval($owner_uid)) return if the user not logged in and
// export feature isn't enabled // export feature isn't enabled
if(intval($owner_uid) && ! local_user() && ! feature_enabled($owner_uid, "export_calendar")) if (intval($owner_uid) && ! local_user() && ! feature_enabled($owner_uid, "export_calendar")) {
return; return;
}
return replace_macros(get_markup_template("events_aside.tpl"), array( return replace_macros(get_markup_template("events_aside.tpl"), array(
'$etitle' => t("Export"), '$etitle' => t("Export"),
@ -874,5 +940,4 @@ function widget_events() {
'$export_csv' => t("Export calendar as csv"), '$export_csv' => t("Export calendar as csv"),
'$user' => $user '$user' => $user
)); ));
} }

View file

@ -2,32 +2,13 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
function expire_run(&$argv, &$argc){ function expire_run(&$argv, &$argc){
global $a, $db; global $a;
if(is_null($a)) {
$a = new App;
}
if(is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
require_once('include/session.php');
require_once('include/datetime.php'); require_once('include/datetime.php');
require_once('include/items.php'); require_once('include/items.php');
require_once('include/Contact.php'); require_once('include/Contact.php');
Config::load();
$a->set_baseurl(get_config('system','url'));
// physically remove anything that has been deleted for more than two months // physically remove anything that has been deleted for more than two months
$r = q("delete from item where deleted = 1 and changed < UTC_TIMESTAMP() - INTERVAL 60 DAY"); $r = q("delete from item where deleted = 1 and changed < UTC_TIMESTAMP() - INTERVAL 60 DAY");
@ -53,8 +34,3 @@ function expire_run(&$argv, &$argc){
return; return;
} }
if (array_search(__file__,get_included_files())===0){
expire_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -2,36 +2,14 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
require_once('include/Scrape.php'); require_once('include/Scrape.php');
require_once('include/socgraph.php'); require_once('include/socgraph.php');
require_once('include/datetime.php');
function gprobe_run(&$argv, &$argc){ function gprobe_run(&$argv, &$argc){
global $a, $db; if ($argc != 2) {
if(is_null($a)) {
$a = new App;
}
if(is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
require_once('include/session.php');
require_once('include/datetime.php');
Config::load();
$a->set_baseurl(get_config('system','url'));
load_hooks();
if($argc != 2)
return; return;
}
$url = hex2bin($argv[1]); $url = hex2bin($argv[1]);
$r = q("SELECT `id`, `url`, `network` FROM `gcontact` WHERE `nurl` = '%s' ORDER BY `id` LIMIT 1", $r = q("SELECT `id`, `url`, `network` FROM `gcontact` WHERE `nurl` = '%s' ORDER BY `id` LIMIT 1",
@ -74,8 +52,3 @@ function gprobe_run(&$argv, &$argc){
logger("gprobe end for ".normalise_link($url), LOGGER_DEBUG); logger("gprobe end for ".normalise_link($url), LOGGER_DEBUG);
return; return;
} }
if (array_search(__file__,get_included_files())===0){
gprobe_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -652,7 +652,7 @@ function advanced_profile(App $a) {
$profile['marital']['with'] = $a->profile['with']; $profile['marital']['with'] = $a->profile['with'];
} }
if (strlen($a->profile['howlong']) && $a->profile['howlong'] !== '0000-00-00 00:00:00') { if (strlen($a->profile['howlong']) && $a->profile['howlong'] >= NULL_DATE) {
$profile['howlong'] = relative_date($a->profile['howlong'], t('for %1$d %2$s')); $profile['howlong'] = relative_date($a->profile['howlong'], t('for %1$d %2$s'));
} }

View file

@ -68,7 +68,8 @@ function block_on_function_lock($fn_name, $wait_sec = 2, $timeout = 30) {
if(! function_exists('unlock_function')) { if(! function_exists('unlock_function')) {
function unlock_function($fn_name) { function unlock_function($fn_name) {
$r = q("UPDATE `locks` SET `locked` = 0, `created` = '0000-00-00 00:00:00' WHERE `name` = '%s'", $r = q("UPDATE `locks` SET `locked` = 0, `created` = '%s' WHERE `name` = '%s'",
dbesc(NULL_DATE),
dbesc($fn_name) dbesc($fn_name)
); );

View file

@ -72,8 +72,9 @@ function z_fetch_url($url,$binary = false, &$redirects = 0, $opts=array()) {
$a = get_app(); $a = get_app();
$ch = @curl_init($url); $ch = @curl_init($url);
if(($redirects > 8) || (! $ch)) if(($redirects > 8) || (! $ch)) {
return false; return $ret;
}
@curl_setopt($ch, CURLOPT_HEADER, true); @curl_setopt($ch, CURLOPT_HEADER, true);

View file

@ -2,12 +2,11 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
require_once('include/queue_fn.php'); require_once('include/queue_fn.php');
require_once('include/html2plain.php'); require_once('include/html2plain.php');
require_once("include/Scrape.php"); require_once('include/Scrape.php');
require_once('include/diaspora.php'); require_once('include/diaspora.php');
require_once("include/ostatus.php"); require_once('include/ostatus.php');
require_once('include/salmon.php'); require_once('include/salmon.php');
/* /*
@ -44,35 +43,17 @@ require_once('include/salmon.php');
function notifier_run(&$argv, &$argc){ function notifier_run(&$argv, &$argc){
global $a, $db; global $a;
if (is_null($a)) { require_once('include/datetime.php');
$a = new App;
}
if (is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
}
require_once("include/session.php");
require_once("include/datetime.php");
require_once('include/items.php'); require_once('include/items.php');
require_once('include/bbcode.php'); require_once('include/bbcode.php');
require_once('include/email.php'); require_once('include/email.php');
Config::load();
load_hooks();
if ($argc < 3) { if ($argc < 3) {
return; return;
} }
$a->set_baseurl(get_config('system','url'));
logger('notifier: invoked: ' . print_r($argv,true), LOGGER_DEBUG); logger('notifier: invoked: ' . print_r($argv,true), LOGGER_DEBUG);
$cmd = $argv[1]; $cmd = $argv[1];
@ -490,79 +471,22 @@ function notifier_run(&$argv, &$argc){
if ($relocate) { if ($relocate) {
$r = $recipients_relocate; $r = $recipients_relocate;
} else { } else {
$r = q("SELECT * FROM `contact` WHERE `id` IN (%s) AND NOT `blocked` AND NOT `pending` AND NOT `archive`".$sql_extra, $r = q("SELECT `id`, `url`, `network`, `self` FROM `contact`
WHERE `id` IN (%s) AND NOT `blocked` AND NOT `pending` AND NOT `archive`".$sql_extra,
dbesc($recip_str) dbesc($recip_str)
); );
} }
$interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
// If we are using the worker we don't need a delivery interval
if (get_config("system", "worker")) {
$interval = false;
}
// delivery loop // delivery loop
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
foreach ($r as $contact) { foreach ($r as $contact) {
if (!$contact['self']) {
if (($contact['network'] === NETWORK_DIASPORA) && ($public_message)) {
continue;
}
q("INSERT INTO `deliverq` (`cmd`,`item`,`contact`) VALUES ('%s', %d, %d)",
dbesc($cmd),
intval($item_id),
intval($contact['id'])
);
}
}
// This controls the number of deliveries to execute with each separate delivery process.
// By default we'll perform one delivery per process. Assuming a hostile shared hosting
// provider, this provides the greatest chance of deliveries if processes start getting
// killed. We can also space them out with the delivery_interval to also help avoid them
// getting whacked.
// If $deliveries_per_process > 1, we will chain this number of multiple deliveries
// together into a single process. This will reduce the overall number of processes
// spawned for each delivery, but they will run longer.
// When using the workerqueue, we don't need this functionality.
$deliveries_per_process = intval(get_config('system','delivery_batch_count'));
if (($deliveries_per_process <= 0) OR get_config("system", "worker")) {
$deliveries_per_process = 1;
}
$this_batch = array();
for ($x = 0; $x < count($r); $x ++) {
$contact = $r[$x];
if ($contact['self']) { if ($contact['self']) {
continue; continue;
} }
logger("Deliver ".$target_item["guid"]." to ".$contact['url']." via network ".$contact['network'], LOGGER_DEBUG); logger("Deliver ".$target_item["guid"]." to ".$contact['url']." via network ".$contact['network'], LOGGER_DEBUG);
// potentially more than one recipient. Start a new process and space them out a bit. proc_run(PRIORITY_HIGH,'include/delivery.php', $cmd, $item_id, $contact['id']);
// we will deliver single recipient types of message and email recipients here.
$this_batch[] = $contact['id'];
if (count($this_batch) >= $deliveries_per_process) {
proc_run(PRIORITY_HIGH,'include/delivery.php',$cmd,$item_id,$this_batch);
$this_batch = array();
if ($interval) {
@time_sleep_until(microtime(true) + (float) $interval);
}
}
continue;
}
// be sure to pick up any stragglers
if (count($this_batch)) {
proc_run(PRIORITY_HIGH,'include/delivery.php',$cmd,$item_id,$this_batch);
} }
} }
@ -614,18 +538,6 @@ function notifier_run(&$argv, &$argc){
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
logger('pubdeliver '.$target_item["guid"].': '.print_r($r,true), LOGGER_DEBUG); logger('pubdeliver '.$target_item["guid"].': '.print_r($r,true), LOGGER_DEBUG);
// throw everything into the queue in case we get killed
foreach ($r as $rr) {
if ((! $mail) && (! $fsuggest) && (! $followup)) {
q("INSERT INTO `deliverq` (`cmd`,`item`,`contact`) VALUES ('%s', %d, %d)
ON DUPLICATE KEY UPDATE `cmd` = '%s', `item` = %d, `contact` = %d",
dbesc($cmd), intval($item_id), intval($rr['id']),
dbesc($cmd), intval($item_id), intval($rr['id'])
);
}
}
foreach ($r as $rr) { foreach ($r as $rr) {
// except for Diaspora batch jobs // except for Diaspora batch jobs
@ -639,9 +551,6 @@ function notifier_run(&$argv, &$argc){
if ((! $mail) && (! $fsuggest) && (! $followup)) { if ((! $mail) && (! $fsuggest) && (! $followup)) {
logger('notifier: delivery agent: '.$rr['name'].' '.$rr['id'].' '.$rr['network'].' '.$target_item["guid"]); logger('notifier: delivery agent: '.$rr['name'].' '.$rr['id'].' '.$rr['network'].' '.$target_item["guid"]);
proc_run(PRIORITY_HIGH,'include/delivery.php',$cmd,$item_id,$rr['id']); proc_run(PRIORITY_HIGH,'include/delivery.php',$cmd,$item_id,$rr['id']);
if ($interval) {
@time_sleep_until(microtime(true) + (float) $interval);
}
} }
} }
} }
@ -694,9 +603,3 @@ function notifier_run(&$argv, &$argc){
return; return;
} }
if (array_search(__file__,get_included_files())===0){
notifier_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -17,10 +17,10 @@ function oembed_replacecb($matches){
/** /**
* @brief Get data from an URL to embed its content. * @brief Get data from an URL to embed its content.
* *
* @param string $embedurl The URL from which the data should be fetched. * @param string $embedurl The URL from which the data should be fetched.
* @param bool $no_rich_type If set to true rich type content won't be fetched. * @param bool $no_rich_type If set to true rich type content won't be fetched.
* *
* @return bool|object Returns object with embed content or false if no embedable * @return bool|object Returns object with embed content or false if no embedable
* content exists * content exists
*/ */
@ -41,8 +41,8 @@ function oembed_fetch_url($embedurl, $no_rich_type = false){
// These media files should now be caught in bbcode.php // These media files should now be caught in bbcode.php
// left here as a fallback in case this is called from another source // left here as a fallback in case this is called from another source
$noexts = array("mp3","mp4","ogg","ogv","oga","ogm","webm"); $noexts = array("mp3", "mp4", "ogg", "ogv", "oga", "ogm", "webm");
$ext = pathinfo(strtolower($embedurl),PATHINFO_EXTENSION); $ext = pathinfo(strtolower($embedurl), PATHINFO_EXTENSION);
if (is_null($txt)) { if (is_null($txt)) {
@ -74,21 +74,10 @@ function oembed_fetch_url($embedurl, $no_rich_type = false){
} }
} }
if ($txt==false || $txt=="") { $txt = trim($txt);
$embedly = Config::get("system", "embedly");
if ($embedly != "") {
// try embedly service
$ourl = "https://api.embed.ly/1/oembed?key=".$embedly."&url=".urlencode($embedurl);
$txt = fetch_url($ourl);
logger("oembed_fetch_url: ".$txt, LOGGER_DEBUG); if ($txt[0] != "{") {
} $txt = '{"type":"error"}';
}
$txt=trim($txt);
if ($txt[0]!="{") {
$txt='{"type":"error"}';
} else { //save in cache } else { //save in cache
$j = json_decode($txt); $j = json_decode($txt);
if ($j->type != "error") { if ($j->type != "error") {

View file

@ -2,8 +2,7 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php"); require_once('include/follow.php');
require_once("include/follow.php");
function RemoveReply($subject) { function RemoveReply($subject) {
while (in_array(strtolower(substr($subject, 0, 3)), array("re:", "aw:"))) while (in_array(strtolower(substr($subject, 0, 3)), array("re:", "aw:")))
@ -13,20 +12,8 @@ function RemoveReply($subject) {
} }
function onepoll_run(&$argv, &$argc){ function onepoll_run(&$argv, &$argc){
global $a, $db; global $a;
if (is_null($a)) {
$a = new App;
}
if (is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
require_once('include/session.php');
require_once('include/datetime.php'); require_once('include/datetime.php');
require_once('include/items.php'); require_once('include/items.php');
require_once('include/Contact.php'); require_once('include/Contact.php');
@ -34,12 +21,6 @@ function onepoll_run(&$argv, &$argc){
require_once('include/socgraph.php'); require_once('include/socgraph.php');
require_once('include/queue_fn.php'); require_once('include/queue_fn.php');
Config::load();
$a->set_baseurl(get_config('system','url'));
load_hooks();
logger('onepoll: start'); logger('onepoll: start');
$manual_id = 0; $manual_id = 0;
@ -61,13 +42,6 @@ function onepoll_run(&$argv, &$argc){
return; return;
} }
// Don't check this stuff if the function is called by the poller
if (App::callstack() != "poller_run") {
if (App::is_already_running('onepoll'.$contact_id, '', 540)) {
return;
}
}
$d = datetime_convert(); $d = datetime_convert();
// Only poll from those with suitable relationships, // Only poll from those with suitable relationships,
@ -159,7 +133,7 @@ function onepoll_run(&$argv, &$argc){
logger("onepoll: poll: ({$contact['id']}) IMPORTER: {$importer['name']}, CONTACT: {$contact['name']}"); logger("onepoll: poll: ({$contact['id']}) IMPORTER: {$importer['name']}, CONTACT: {$contact['name']}");
$last_update = (($contact['last-update'] === '0000-00-00 00:00:00') $last_update = (($contact['last-update'] <= NULL_DATE)
? datetime_convert('UTC','UTC','now - 7 days', ATOM_TIME) ? datetime_convert('UTC','UTC','now - 7 days', ATOM_TIME)
: datetime_convert('UTC','UTC',$contact['last-update'], ATOM_TIME) : datetime_convert('UTC','UTC',$contact['last-update'], ATOM_TIME)
); );
@ -265,7 +239,7 @@ function onepoll_run(&$argv, &$argc){
intval($contact['id']) intval($contact['id'])
); );
mark_for_death($contact); mark_for_death($contact);
} elseif ($contact['term-date'] != '0000-00-00 00:00:00') { } elseif ($contact['term-date'] > NULL_DATE) {
logger("poller: $url back from the dead - removing mark for death"); logger("poller: $url back from the dead - removing mark for death");
unmark_for_death($contact); unmark_for_death($contact);
} }
@ -697,8 +671,3 @@ function onepoll_run(&$argv, &$argc){
return; return;
} }
if (array_search(__file__,get_included_files())===0) {
onepoll_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -35,6 +35,10 @@ function poller_run($argv, $argc){
return; return;
} }
$a->set_baseurl(Config::get('system', 'url'));
load_hooks();
$a->start_process(); $a->start_process();
if (poller_max_connections_reached()) { if (poller_max_connections_reached()) {
@ -353,18 +357,18 @@ function poller_max_connections_reached() {
* *
*/ */
function poller_kill_stale_workers() { function poller_kill_stale_workers() {
$r = q("SELECT `pid`, `executed`, `priority`, `parameter` FROM `workerqueue` WHERE `executed` != '0000-00-00 00:00:00'"); $r = q("SELECT `pid`, `executed`, `priority`, `parameter` FROM `workerqueue` WHERE `executed` > '%s'", dbesc(NULL_DATE));
if (!dbm::is_result($r)) { if (!dbm::is_result($r)) {
// No processing here needed // No processing here needed
return; return;
} }
foreach($r AS $pid) foreach ($r AS $pid) {
if (!posix_kill($pid["pid"], 0)) if (!posix_kill($pid["pid"], 0)) {
q("UPDATE `workerqueue` SET `executed` = '0000-00-00 00:00:00', `pid` = 0 WHERE `pid` = %d", q("UPDATE `workerqueue` SET `executed` = '%s', `pid` = 0 WHERE `pid` = %d",
intval($pid["pid"])); dbesc(NULL_DATE), intval($pid["pid"]));
else { } else {
// Kill long running processes // Kill long running processes
// Check if the priority is in a valid range // Check if the priority is in a valid range
@ -387,14 +391,17 @@ function poller_kill_stale_workers() {
// We killed the stale process. // We killed the stale process.
// To avoid a blocking situation we reschedule the process at the beginning of the queue. // To avoid a blocking situation we reschedule the process at the beginning of the queue.
// Additionally we are lowering the priority. // Additionally we are lowering the priority.
q("UPDATE `workerqueue` SET `executed` = '0000-00-00 00:00:00', `created` = '%s', q("UPDATE `workerqueue` SET `executed` = '%s', `created` = '%s',
`priority` = %d, `pid` = 0 WHERE `pid` = %d", `priority` = %d, `pid` = 0 WHERE `pid` = %d",
dbesc(NULL_DATE),
dbesc(datetime_convert()), dbesc(datetime_convert()),
intval(PRIORITY_NEGLIGIBLE), intval(PRIORITY_NEGLIGIBLE),
intval($pid["pid"])); intval($pid["pid"]));
} else } else {
logger("Worker process ".$pid["pid"]." (".implode(" ", $argv).") now runs for ".round($duration)." of ".$max_duration." allowed minutes. That's okay.", LOGGER_DEBUG); logger("Worker process ".$pid["pid"]." (".implode(" ", $argv).") now runs for ".round($duration)." of ".$max_duration." allowed minutes. That's okay.", LOGGER_DEBUG);
}
} }
}
} }
/** /**
@ -421,15 +428,15 @@ function poller_too_much_workers() {
$slope = $maxworkers / pow($maxsysload, $exponent); $slope = $maxworkers / pow($maxsysload, $exponent);
$queues = ceil($slope * pow(max(0, $maxsysload - $load), $exponent)); $queues = ceil($slope * pow(max(0, $maxsysload - $load), $exponent));
$s = q("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE `executed` = '0000-00-00 00:00:00'"); $s = q("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE `executed` <= '%s'", dbesc(NULL_DATE));
$entries = $s[0]["total"]; $entries = $s[0]["total"];
if (Config::get("system", "worker_fastlane", false) AND ($queues > 0) AND ($entries > 0) AND ($active >= $queues)) { if (Config::get("system", "worker_fastlane", false) AND ($queues > 0) AND ($entries > 0) AND ($active >= $queues)) {
$s = q("SELECT `priority` FROM `workerqueue` WHERE `executed` = '0000-00-00 00:00:00' ORDER BY `priority` LIMIT 1"); $s = q("SELECT `priority` FROM `workerqueue` WHERE `executed` <= '%s' ORDER BY `priority` LIMIT 1", dbesc(NULL_DATE));
$top_priority = $s[0]["priority"]; $top_priority = $s[0]["priority"];
$s = q("SELECT `id` FROM `workerqueue` WHERE `priority` <= %d AND `executed` != '0000-00-00 00:00:00' LIMIT 1", $s = q("SELECT `id` FROM `workerqueue` WHERE `priority` <= %d AND `executed` > '%s' LIMIT 1",
intval($top_priority)); intval($top_priority), dbesc(NULL_DATE));
$high_running = dbm::is_result($s); $high_running = dbm::is_result($s);
if (!$high_running AND ($top_priority > PRIORITY_UNDEFINED) AND ($top_priority < PRIORITY_NEGLIGIBLE)) { if (!$high_running AND ($top_priority > PRIORITY_UNDEFINED) AND ($top_priority < PRIORITY_NEGLIGIBLE)) {
@ -464,7 +471,7 @@ function poller_too_much_workers() {
// Are there fewer workers running as possible? Then fork a new one. // Are there fewer workers running as possible? Then fork a new one.
if (!Config::get("system", "worker_dont_fork") AND ($queues > ($active + 1)) AND ($entries > 1)) { if (!Config::get("system", "worker_dont_fork") AND ($queues > ($active + 1)) AND ($entries > 1)) {
logger("Active workers: ".$active."/".$queues." Fork a new worker.", LOGGER_DEBUG); logger("Active workers: ".$active."/".$queues." Fork a new worker.", LOGGER_DEBUG);
$args = array("php", "include/poller.php", "no_cron"); $args = array("include/poller.php", "no_cron");
$a = get_app(); $a = get_app();
$a->proc_run($args); $a->proc_run($args);
} }
@ -549,21 +556,25 @@ function poller_worker_process() {
if (poller_passing_slow($highest_priority)) { if (poller_passing_slow($highest_priority)) {
// Are there waiting processes with a higher priority than the currently highest? // Are there waiting processes with a higher priority than the currently highest?
$r = q("SELECT * FROM `workerqueue` $r = q("SELECT * FROM `workerqueue`
WHERE `executed` = '0000-00-00 00:00:00' AND `priority` < %d WHERE `executed` <= '%s' AND `priority` < %d
ORDER BY `priority`, `created` LIMIT 1", dbesc($highest_priority)); ORDER BY `priority`, `created` LIMIT 1",
if (dbm::is_result($r)) dbesc(NULL_DATE),
intval($highest_priority));
if (dbm::is_result($r)) {
return $r; return $r;
}
// Give slower processes some processing time // Give slower processes some processing time
$r = q("SELECT * FROM `workerqueue` $r = q("SELECT * FROM `workerqueue`
WHERE `executed` = '0000-00-00 00:00:00' AND `priority` > %d WHERE `executed` <= '%s' AND `priority` > %d
ORDER BY `priority`, `created` LIMIT 1", dbesc($highest_priority)); ORDER BY `priority`, `created` LIMIT 1",
dbesc(NULL_DATE),
intval($highest_priority));
} }
// If there is no result (or we shouldn't pass lower processes) we check without priority limit // If there is no result (or we shouldn't pass lower processes) we check without priority limit
if (($highest_priority == 0) OR !dbm::is_result($r)) if (($highest_priority == 0) OR !dbm::is_result($r)) {
$r = q("SELECT * FROM `workerqueue` WHERE `executed` = '0000-00-00 00:00:00' ORDER BY `priority`, `created` LIMIT 1"); $r = q("SELECT * FROM `workerqueue` WHERE `executed` <= '%s' ORDER BY `priority`, `created` LIMIT 1", dbesc(NULL_DATE));
}
return $r; return $r;
} }
@ -571,7 +582,7 @@ function poller_worker_process() {
* @brief Call the front end worker * @brief Call the front end worker
*/ */
function call_worker() { function call_worker() {
if (!Config::get("system", "frontend_worker") OR !Config::get("system", "worker")) { if (!Config::get("system", "frontend_worker")) {
return; return;
} }
@ -583,7 +594,7 @@ function call_worker() {
* @brief Call the front end worker if there aren't any active * @brief Call the front end worker if there aren't any active
*/ */
function call_worker_if_idle() { function call_worker_if_idle() {
if (!Config::get("system", "frontend_worker") OR !Config::get("system", "worker")) { if (!Config::get("system", "frontend_worker")) {
return; return;
} }
@ -610,7 +621,7 @@ function call_worker_if_idle() {
logger('Call poller', LOGGER_DEBUG); logger('Call poller', LOGGER_DEBUG);
$args = array("php", "include/poller.php", "no_cron"); $args = array("include/poller.php", "no_cron");
$a = get_app(); $a = get_app();
$a->proc_run($args); $a->proc_run($args);
return; return;

View file

@ -1,12 +1,31 @@
<?php <?php
require_once("boot.php");
require_once("include/ostatus.php");
use \Friendica\Core\Config; use \Friendica\Core\Config;
use \Friendica\Core\PConfig;
require_once('include/items.php');
require_once('include/ostatus.php');
function pubsubpublish_run(&$argv, &$argc){
if ($argc > 1) {
$pubsubpublish_id = intval($argv[1]);
} else {
// We'll push to each subscriber that has push > 0,
// i.e. there has been an update (set in notifier.php).
$r = q("SELECT `id`, `callback_url` FROM `push_subscriber` WHERE `push` > 0");
foreach ($r as $rr) {
logger("Publish feed to ".$rr["callback_url"], LOGGER_DEBUG);
proc_run(PRIORITY_HIGH, 'include/pubsubpublish.php', $rr["id"]);
}
}
handle_pubsubhubbub($pubsubpublish_id);
return;
}
function handle_pubsubhubbub($id) { function handle_pubsubhubbub($id) {
global $a, $db; global $a;
$r = q("SELECT * FROM `push_subscriber` WHERE `id` = %d", intval($id)); $r = q("SELECT * FROM `push_subscriber` WHERE `id` = %d", intval($id));
if (!$r) if (!$r)
@ -54,70 +73,3 @@ function handle_pubsubhubbub($id) {
intval($rr['id'])); intval($rr['id']));
} }
} }
function pubsubpublish_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)){
$a = new App;
}
if(is_null($db)){
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
require_once('include/items.php');
Config::load();
// Don't check this stuff if the function is called by the poller
if (App::callstack() != "poller_run") {
if (App::is_already_running("pubsubpublish", "include/pubsubpublish.php", 540)) {
return;
}
}
$a->set_baseurl(get_config('system','url'));
load_hooks();
if ($argc > 1) {
$pubsubpublish_id = intval($argv[1]);
}
else {
// We'll push to each subscriber that has push > 0,
// i.e. there has been an update (set in notifier.php).
$r = q("SELECT `id`, `callback_url` FROM `push_subscriber` WHERE `push` > 0");
// Use the delivery interval that is also used for the notifier
$interval = Config::get("system", "delivery_interval", 2);
// If we are using the worker we don't need a delivery interval
if (get_config("system", "worker")) {
$interval = false;
}
foreach ($r as $rr) {
logger("Publish feed to ".$rr["callback_url"], LOGGER_DEBUG);
proc_run(PRIORITY_HIGH, 'include/pubsubpublish.php', $rr["id"]);
if($interval)
@time_sleep_until(microtime(true) + (float) $interval);
}
}
handle_pubsubhubbub($pubsubpublish_id);
return;
}
if (array_search(__file__,get_included_files())===0){
pubsubpublish_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -2,41 +2,16 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
require_once('include/queue_fn.php'); require_once('include/queue_fn.php');
require_once('include/dfrn.php'); require_once('include/dfrn.php');
require_once("include/datetime.php");
require_once('include/items.php');
require_once('include/bbcode.php');
require_once('include/socgraph.php');
require_once('include/cache.php'); require_once('include/cache.php');
function queue_run(&$argv, &$argc){ function queue_run(&$argv, &$argc){
global $a, $db; global $a;
if (is_null($a)){
$a = new App;
}
if (is_null($db)){
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
require_once("include/session.php");
require_once("include/datetime.php");
require_once('include/items.php');
require_once('include/bbcode.php');
require_once('include/socgraph.php');
Config::load();
// Don't check this stuff if the function is called by the poller
if (App::callstack() != "poller_run")
if (App::is_already_running('queue', 'include/queue.php', 540))
return;
$a->set_baseurl(get_config('system','url'));
load_hooks();
if ($argc > 1) { if ($argc > 1) {
$queue_id = intval($argv[1]); $queue_id = intval($argv[1]);
@ -54,30 +29,13 @@ function queue_run(&$argv, &$argc){
// Handling the pubsubhubbub requests // Handling the pubsubhubbub requests
proc_run(PRIORITY_HIGH,'include/pubsubpublish.php'); proc_run(PRIORITY_HIGH,'include/pubsubpublish.php');
$interval = ((get_config('system','delivery_interval') === false) ? 2 : intval(get_config('system','delivery_interval')));
// If we are using the worker we don't need a delivery interval
if (get_config("system", "worker"))
$interval = false;
$r = q("select * from deliverq where 1");
if ($r) {
foreach ($r as $rr) {
logger('queue: deliverq');
proc_run(PRIORITY_HIGH,'include/delivery.php',$rr['cmd'],$rr['item'],$rr['contact']);
if ($interval) {
time_sleep_until(microtime(true) + (float) $interval);
}
}
}
$r = q("SELECT `queue`.*, `contact`.`name`, `contact`.`uid` FROM `queue` $r = q("SELECT `queue`.*, `contact`.`name`, `contact`.`uid` FROM `queue`
INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id` INNER JOIN `contact` ON `queue`.`cid` = `contact`.`id`
WHERE `queue`.`created` < UTC_TIMESTAMP() - INTERVAL 3 DAY"); WHERE `queue`.`created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
if ($r) { if ($r) {
foreach ($r as $rr) { foreach ($r as $rr) {
logger('Removing expired queue item for ' . $rr['name'] . ', uid=' . $rr['uid']); logger('Removing expired queue item for ' . $rr['name'] . ', uid=' . $rr['uid']);
logger('Expired queue data :' . $rr['content'], LOGGER_DATA); logger('Expired queue data: ' . $rr['content'], LOGGER_DATA);
} }
q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY"); q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
} }
@ -86,158 +44,137 @@ function queue_run(&$argv, &$argc){
// After that, we'll only attempt delivery once per hour. // After that, we'll only attempt delivery once per hour.
$r = q("SELECT `id` FROM `queue` WHERE ((`created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR && `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`"); $r = q("SELECT `id` FROM `queue` WHERE ((`created` > UTC_TIMESTAMP() - INTERVAL 12 HOUR && `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`");
} else {
logger('queue: start for id '.$queue_id);
$r = q("SELECT `id` FROM `queue` WHERE `id` = %d LIMIT 1", call_hooks('queue_predeliver', $a, $r);
intval($queue_id)
);
}
if (!$r){ if (dbm::is_result($r)) {
foreach ($r as $q_item) {
logger('Call queue for id '.$q_item['id']);
proc_run(PRIORITY_LOW, "include/queue.php", $q_item['id']);
}
}
return; return;
} }
if (!$queue_id)
call_hooks('queue_predeliver', $a, $r);
// delivering
// delivery loop
require_once('include/salmon.php'); require_once('include/salmon.php');
require_once('include/diaspora.php'); require_once('include/diaspora.php');
foreach($r as $q_item) { $r = q("SELECT * FROM `queue` WHERE `id` = %d LIMIT 1",
intval($queue_id));
// queue_predeliver hooks may have changed the queue db details, if (!dbm::is_result($r)) {
// so check again if this entry still needs processing return;
}
if ($queue_id) { $q_item = $r[0];
$qi = q("SELECT * FROM `queue` WHERE `id` = %d LIMIT 1",
intval($queue_id));
} elseif (get_config("system", "worker")) {
logger('Call queue for id '.$q_item['id']);
proc_run(PRIORITY_LOW, "include/queue.php", $q_item['id']);
continue;
} else
$qi = q("SELECT * FROM `queue` WHERE `id` = %d AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ",
intval($q_item['id']));
if (!dbm::is_result($qi)) { $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
continue; intval($q_item['cid'])
);
if (!dbm::is_result($c)) {
remove_queue_item($q_item['id']);
return;
}
$dead = Cache::get($cachekey_deadguy.$c[0]['notify']);
if (!is_null($dead) AND $dead) {
logger('queue: skipping known dead url: '.$c[0]['notify']);
update_queue_time($q_item['id']);
return;
}
$server = poco_detect_server($c[0]['url']);
if ($server != "") {
$vital = Cache::get($cachekey_server.$server);
if (is_null($vital)) {
logger("Check server ".$server." (".$c[0]["network"].")");
$vital = poco_check_server($server, $c[0]["network"], true);
Cache::set($cachekey_server.$server, $vital, CACHE_QUARTER_HOUR);
} }
if (!is_null($vital) AND !$vital) {
$c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", logger('queue: skipping dead server: '.$server);
intval($qi[0]['cid'])
);
if (! dbm::is_result($c)) {
remove_queue_item($q_item['id']);
continue;
}
$dead = Cache::get($cachekey_deadguy.$c[0]['notify']);
if (!is_null($dead) AND $dead) {
logger('queue: skipping known dead url: '.$c[0]['notify']);
update_queue_time($q_item['id']); update_queue_time($q_item['id']);
continue; return;
} }
}
$server = poco_detect_server($c[0]['url']); $u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`
FROM `user` WHERE `uid` = %d LIMIT 1",
intval($c[0]['uid'])
);
if (!dbm::is_result($u)) {
remove_queue_item($q_item['id']);
return;
}
if ($server != "") { $data = $q_item['content'];
$vital = Cache::get($cachekey_server.$server); $public = $q_item['batch'];
$contact = $c[0];
$owner = $u[0];
if (is_null($vital)) { $deliver_status = 0;
logger("Check server ".$server." (".$c[0]["network"].")");
$vital = poco_check_server($server, $c[0]["network"], true); switch ($contact['network']) {
Cache::set($cachekey_server.$server, $vital, CACHE_QUARTER_HOUR); case NETWORK_DFRN:
} logger('queue: dfrndelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
$deliver_status = dfrn::deliver($owner, $contact, $data);
if (!is_null($vital) AND !$vital) { if ($deliver_status == (-1)) {
logger('queue: skipping dead server: '.$server);
update_queue_time($q_item['id']); update_queue_time($q_item['id']);
continue; Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
} else {
remove_queue_item($q_item['id']);
} }
} break;
case NETWORK_OSTATUS:
if ($contact['notify']) {
logger('queue: slapdelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
$deliver_status = slapper($owner, $contact['notify'], $data);
$u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey` if ($deliver_status == (-1)) {
FROM `user` WHERE `uid` = %d LIMIT 1",
intval($c[0]['uid'])
);
if (! dbm::is_result($u)) {
remove_queue_item($q_item['id']);
continue;
}
$data = $qi[0]['content'];
$public = $qi[0]['batch'];
$contact = $c[0];
$owner = $u[0];
$deliver_status = 0;
switch($contact['network']) {
case NETWORK_DFRN:
logger('queue: dfrndelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
$deliver_status = dfrn::deliver($owner,$contact,$data);
if ($deliver_status < 0) {
update_queue_time($q_item['id']); update_queue_time($q_item['id']);
Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR); Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
} else { } else {
remove_queue_item($q_item['id']); remove_queue_item($q_item['id']);
} }
break; }
case NETWORK_OSTATUS: break;
if ($contact['notify']) { case NETWORK_DIASPORA:
logger('queue: slapdelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>'); if ($contact['notify']) {
$deliver_status = slapper($owner,$contact['notify'],$data); logger('queue: diaspora_delivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
$deliver_status = Diaspora::transmit($owner, $contact, $data, $public, true);
if ($deliver_status == (-1)) { if ($deliver_status == (-1)) {
update_queue_time($q_item['id']);
Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
} else {
remove_queue_item($q_item['id']);
}
}
break;
case NETWORK_DIASPORA:
if ($contact['notify']) {
logger('queue: diaspora_delivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
$deliver_status = Diaspora::transmit($owner,$contact,$data,$public,true);
if ($deliver_status == (-1)) {
update_queue_time($q_item['id']);
Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
} else {
remove_queue_item($q_item['id']);
}
}
break;
default:
$params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
call_hooks('queue_deliver', $a, $params);
if ($params['result']) {
remove_queue_item($q_item['id']);
} else {
update_queue_time($q_item['id']); update_queue_time($q_item['id']);
Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
} else {
remove_queue_item($q_item['id']);
} }
break; }
break;
default:
$params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
call_hooks('queue_deliver', $a, $params);
if ($params['result']) {
remove_queue_item($q_item['id']);
} else {
update_queue_time($q_item['id']);
}
break;
}
logger('Deliver status '.(int)$deliver_status.' for item '.$q_item['id'].' to '.$contact['name'].' <'.$contact['url'].'>');
} }
logger('Deliver status '.(int)$deliver_status.' for item '.$q_item['id'].' to '.$contact['name'].' <'.$contact['url'].'>');
return; return;
}
if (array_search(__file__,get_included_files())===0){
queue_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
} }

View file

@ -6,24 +6,7 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
function remove_contact_run($argv, $argc) { function remove_contact_run($argv, $argc) {
global $a, $db;
if (is_null($a)) {
$a = new App;
}
if (is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
}
Config::load();
if ($argc != 2) { if ($argc != 2) {
return; return;
} }
@ -46,9 +29,4 @@ function remove_contact_run($argv, $argc) {
q("DELETE FROM `queue` WHERE `cid` = %d", intval($id)); q("DELETE FROM `queue` WHERE `cid` = %d", intval($id));
} }
if (array_search(__file__, get_included_files()) === 0) {
remove_contact_run($_SERVER["argv"], $_SERVER["argc"]);
killme();
}
?> ?>

View file

@ -55,7 +55,7 @@ function authenticate_success($user_record, $login_initial = false, $interactive
$a->user = $user_record; $a->user = $user_record;
if($interactive) { if($interactive) {
if($a->user['login_date'] === '0000-00-00 00:00:00') { if ($a->user['login_date'] <= NULL_DATE) {
$_SESSION['return_url'] = 'profile_photo/new'; $_SESSION['return_url'] = 'profile_photo/new';
$a->module = 'profile_photo'; $a->module = 'profile_photo';
info( t("Welcome ") . $a->user['username'] . EOL); info( t("Welcome ") . $a->user['username'] . EOL);

View file

@ -5,20 +5,26 @@ use \Friendica\Core\Config;
require_once("boot.php"); require_once("boot.php");
require_once("include/threads.php"); require_once("include/threads.php");
global $a, $db; function shadowupdate_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)) if (is_null($a)) {
$a = new App; $a = new App;
}
if(is_null($db)) { if (is_null($db)) {
@include(".htconfig.php"); @include(".htconfig.php");
require_once("include/dba.php"); require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data); $db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data);
}
Config::load();
update_shadow_copy();
} }
Config::load(); if (array_search(__file__,get_included_files())===0){
shadowupdate_run($_SERVER["argv"],$_SERVER["argc"]);
update_shadow_copy(); killme();
killme(); }
?>

View file

@ -14,8 +14,13 @@ require_once("include/html2bbcode.php");
require_once("include/Contact.php"); require_once("include/Contact.php");
require_once("include/Photo.php"); require_once("include/Photo.php");
/* /**
* poco_load * @brief Fetch POCO data
*
* @param integer $cid Contact ID
* @param integer $uid User ID
* @param integer $zcid Global Contact ID
* @param integer $url POCO address that should be polled
* *
* Given a contact-id (minimum), load the PortableContacts friend list for that contact, * Given a contact-id (minimum), load the PortableContacts friend list for that contact,
* and add the entries to the gcontact (Global Contact) table, or update existing entries * and add the entries to the gcontact (Global Contact) table, or update existing entries
@ -27,12 +32,21 @@ require_once("include/Photo.php");
* pointing to the same global contact id. * pointing to the same global contact id.
* *
*/ */
function poco_load($cid, $uid = 0, $zcid = 0, $url = null) {
// Call the function "poco_load_worker" via the worker
proc_run(PRIORITY_LOW, "include/discover_poco.php", "poco_load", intval($cid), intval($uid), intval($zcid), base64_encode($url));
}
/**
* @brief Fetch POCO data from the worker
*
function poco_load($cid,$uid = 0,$zcid = 0,$url = null) { * @param integer $cid Contact ID
* @param integer $uid User ID
* @param integer $zcid Global Contact ID
* @param integer $url POCO address that should be polled
*
*/
function poco_load_worker($cid, $uid, $zcid, $url) {
$a = get_app(); $a = get_app();
if($cid) { if($cid) {
@ -81,7 +95,7 @@ function poco_load($cid,$uid = 0,$zcid = 0,$url = null) {
$connect_url = ''; $connect_url = '';
$name = ''; $name = '';
$network = ''; $network = '';
$updated = '0000-00-00 00:00:00'; $updated = NULL_DATE;
$location = ''; $location = '';
$about = ''; $about = '';
$keywords = ''; $keywords = '';
@ -239,12 +253,12 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
); );
if (count($x)) { if (count($x)) {
if (($network == "") AND ($x[0]["network"] != NETWORK_STATUSNET)) if (($network == "") AND ($x[0]["network"] != NETWORK_STATUSNET)) {
$network = $x[0]["network"]; $network = $x[0]["network"];
}
if ($updated == "0000-00-00 00:00:00") if ($updated <= NULL_DATE) {
$updated = $x[0]["updated"]; $updated = $x[0]["updated"];
}
$created = $x[0]["created"]; $created = $x[0]["created"];
$server_url = $x[0]["server_url"]; $server_url = $x[0]["server_url"];
$nick = $x[0]["nick"]; $nick = $x[0]["nick"];
@ -252,7 +266,7 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
$alias = $x[0]["alias"]; $alias = $x[0]["alias"];
$notify = $x[0]["notify"]; $notify = $x[0]["notify"];
} else { } else {
$created = "0000-00-00 00:00:00"; $created = NULL_DATE;
$server_url = ""; $server_url = "";
$urlparts = parse_url($profile_url); $urlparts = parse_url($profile_url);
@ -309,7 +323,18 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca
logger("profile-check generation: ".$generation." Network: ".$network." URL: ".$profile_url." name: ".$name." avatar: ".$profile_photo, LOGGER_DEBUG); logger("profile-check generation: ".$generation." Network: ".$network." URL: ".$profile_url." name: ".$name." avatar: ".$profile_photo, LOGGER_DEBUG);
poco_check_server($server_url, $network); // We check the server url to be sure that it is a real one
$server_url2 = poco_detect_server($profile_url);
// We are no sure that it is a correct URL. So we use it in the future
if ($server_url2 != "") {
$server_url = $server_url2;
}
// The server URL doesn't seem to be valid, so we don't store it.
if (!poco_check_server($server_url, $network)) {
$server_url = "";
}
$gcontact = array("url" => $profile_url, $gcontact = array("url" => $profile_url,
"addr" => $addr, "addr" => $addr,
@ -401,13 +426,47 @@ function poco_detect_server($profile) {
// Mastodon // Mastodon
if ($server_url == "") { if ($server_url == "") {
$red = preg_replace("=(https?://)(.*)/users/(.*)=ism", "$1$2", $profile); $mastodon = preg_replace("=(https?://)(.*)/users/(.*)=ism", "$1$2", $profile);
if ($red != $profile) { if ($mastodon != $profile) {
$server_url = $red; $server_url = $mastodon;
$network = NETWORK_OSTATUS; $network = NETWORK_OSTATUS;
} }
} }
// Numeric OStatus variant
if ($server_url == "") {
$ostatus = preg_replace("=(https?://)(.*)/user/(.*)=ism", "$1$2", $profile);
if ($ostatus != $profile) {
$server_url = $ostatus;
$network = NETWORK_OSTATUS;
}
}
// Wild guess
if ($server_url == "") {
$base = preg_replace("=(https?://)(.*?)/(.*)=ism", "$1$2", $profile);
if ($base != $profile) {
$server_url = $base;
$network = NETWORK_PHANTOM;
}
}
if ($server_url == "") {
return "";
}
$r = q("SELECT `id` FROM `gserver` WHERE `nurl` = '%s' AND `last_contact` > `last_failure`",
dbesc(normalise_link($server_url)));
if (dbm::is_result($r)) {
return $server_url;
}
// Fetch the host-meta to check if this really is a server
$serverret = z_fetch_url($server_url."/.well-known/host-meta");
if (!$serverret["success"]) {
return "";
}
return $server_url; return $server_url;
} }
@ -420,14 +479,16 @@ function poco_last_updated($profile, $force = false) {
$gcontacts = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s'", $gcontacts = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s'",
dbesc(normalise_link($profile))); dbesc(normalise_link($profile)));
if ($gcontacts[0]["created"] == "0000-00-00 00:00:00") if ($gcontacts[0]["created"] <= NULL_DATE) {
q("UPDATE `gcontact` SET `created` = '%s' WHERE `nurl` = '%s'", q("UPDATE `gcontact` SET `created` = '%s' WHERE `nurl` = '%s'",
dbesc(datetime_convert()), dbesc(normalise_link($profile))); dbesc(datetime_convert()), dbesc(normalise_link($profile)));
}
if ($gcontacts[0]["server_url"] != "") if ($gcontacts[0]["server_url"] != "") {
$server_url = $gcontacts[0]["server_url"]; $server_url = $gcontacts[0]["server_url"];
else }
if (($server_url == '') OR ($gcontacts[0]["server_url"] == $gcontacts[0]["nurl"])) {
$server_url = poco_detect_server($profile); $server_url = poco_detect_server($profile);
}
if (!in_array($gcontacts[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_FEED, NETWORK_OSTATUS, ""))) { if (!in_array($gcontacts[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_FEED, NETWORK_OSTATUS, ""))) {
logger("Profile ".$profile.": Network type ".$gcontacts[0]["network"]." can't be checked", LOGGER_DEBUG); logger("Profile ".$profile.": Network type ".$gcontacts[0]["network"]." can't be checked", LOGGER_DEBUG);
@ -617,10 +678,11 @@ function poco_last_updated($profile, $force = false) {
} }
// Maybe there aren't any entries. Then check if it is a valid feed // Maybe there aren't any entries. Then check if it is a valid feed
if ($last_updated == "") if ($last_updated == "") {
if ($xpath->query('/atom:feed')->length > 0) if ($xpath->query('/atom:feed')->length > 0) {
$last_updated = "0000-00-00 00:00:00"; $last_updated = NULL_DATE;
}
}
q("UPDATE `gcontact` SET `updated` = '%s', `last_contact` = '%s' WHERE `nurl` = '%s'", q("UPDATE `gcontact` SET `updated` = '%s', `last_contact` = '%s' WHERE `nurl` = '%s'",
dbesc(dbm::date($last_updated)), dbesc(dbm::date()), dbesc(normalise_link($profile))); dbesc(dbm::date($last_updated)), dbesc(dbm::date()), dbesc(normalise_link($profile)));
@ -680,6 +742,213 @@ function poco_to_boolean($val) {
return ($val); return ($val);
} }
/**
* @brief Detect server type (Hubzilla or Friendica) via the poco data
*
* @param object $data POCO data
* @return array Server data
*/
function poco_detect_poco_data($data) {
$server = false;
if (!isset($data->entry)) {
return false;
}
if (count($data->entry) == 0) {
return false;
}
if (!isset($data->entry[0]->urls)) {
return false;
}
if (count($data->entry[0]->urls) == 0) {
return false;
}
foreach ($data->entry[0]->urls AS $url) {
if ($url->type == 'zot') {
$server = array();
$server["platform"] = 'Hubzilla';
$server["network"] = NETWORK_DIASPORA;
return $server;
}
}
return false;
}
/**
* @brief Detect server type by using the nodeinfo data
*
* @param string $server_url address of the server
* @return array Server data
*/
function poco_fetch_nodeinfo($server_url) {
$serverret = z_fetch_url($server_url."/.well-known/nodeinfo");
if (!$serverret["success"]) {
return false;
}
$nodeinfo = json_decode($serverret['body']);
if (!is_object($nodeinfo)) {
return false;
}
if (!is_array($nodeinfo->links)) {
return false;
}
$nodeinfo_url = '';
foreach ($nodeinfo->links AS $link) {
if ($link->rel == 'http://nodeinfo.diaspora.software/ns/schema/1.0') {
$nodeinfo_url = $link->href;
}
}
if ($nodeinfo_url == '') {
return false;
}
$serverret = z_fetch_url($nodeinfo_url);
if (!$serverret["success"]) {
return false;
}
$nodeinfo = json_decode($serverret['body']);
if (!is_object($nodeinfo)) {
return false;
}
$server = array();
$server['register_policy'] = REGISTER_CLOSED;
if (is_bool($nodeinfo->openRegistrations) AND $nodeinfo->openRegistrations) {
$server['register_policy'] = REGISTER_OPEN;
}
if (is_object($nodeinfo->software)) {
if (isset($nodeinfo->software->name)) {
$server['platform'] = $nodeinfo->software->name;
}
if (isset($nodeinfo->software->version)) {
$server['version'] = $nodeinfo->software->version;
// Version numbers on Nodeinfo are presented with additional info, e.g.:
// 0.6.3.0-p1702cc1c, 0.6.99.0-p1b9ab160 or 3.4.3-2-1191.
$server['version'] = preg_replace("=(.+)-(.{4,})=ism", "$1", $server['version']);
}
}
if (is_object($nodeinfo->metadata)) {
if (isset($nodeinfo->metadata->nodeName)) {
$server['site_name'] = $nodeinfo->metadata->nodeName;
}
}
$diaspora = false;
$friendica = false;
$gnusocial = false;
if (is_array($nodeinfo->protocols->inbound)) {
foreach ($nodeinfo->protocols->inbound AS $inbound) {
if ($inbound == 'diaspora') {
$diaspora = true;
}
if ($inbound == 'friendica') {
$friendica = true;
}
if ($inbound == 'gnusocial') {
$gnusocial = true;
}
}
}
if ($gnusocial) {
$server['network'] = NETWORK_OSTATUS;
}
if ($diaspora) {
$server['network'] = NETWORK_DIASPORA;
}
if ($friendica) {
$server['network'] = NETWORK_DFRN;
}
if (!$server) {
return false;
}
return $server;
}
/**
* @brief Detect server type (Hubzilla or Friendica) via the front page body
*
* @param string $body Front page of the server
* @return array Server data
*/
function poco_detect_server_type($body) {
$server = false;
$doc = new \DOMDocument();
@$doc->loadHTML($body);
$xpath = new \DomXPath($doc);
$list = $xpath->query("//meta[@name]");
foreach ($list as $node) {
$attr = array();
if ($node->attributes->length) {
foreach ($node->attributes as $attribute) {
$attr[$attribute->name] = $attribute->value;
}
}
if ($attr['name'] == 'generator') {
$version_part = explode(" ", $attr['content']);
if (count($version_part) == 2) {
if (in_array($version_part[0], array("Friendika", "Friendica"))) {
$server = array();
$server["platform"] = $version_part[0];
$server["version"] = $version_part[1];
$server["network"] = NETWORK_DFRN;
}
}
}
}
if (!$server) {
$list = $xpath->query("//meta[@property]");
foreach ($list as $node) {
$attr = array();
if ($node->attributes->length) {
foreach ($node->attributes as $attribute) {
$attr[$attribute->name] = $attribute->value;
}
}
if ($attr['property'] == 'generator') {
if (in_array($attr['content'], array("hubzilla", "BlaBlaNet"))) {
$server = array();
$server["platform"] = $attr['content'];
$server["version"] = "";
$server["network"] = NETWORK_DIASPORA;
}
}
}
}
if (!$server) {
return false;
}
$server["site_name"] = $xpath->evaluate($element."//head/title/text()", $context)->item(0)->nodeValue;
return $server;
}
function poco_check_server($server_url, $network = "", $force = false) { function poco_check_server($server_url, $network = "", $force = false) {
// Unify the server address // Unify the server address
@ -692,10 +961,10 @@ function poco_check_server($server_url, $network = "", $force = false) {
$servers = q("SELECT * FROM `gserver` WHERE `nurl` = '%s'", dbesc(normalise_link($server_url))); $servers = q("SELECT * FROM `gserver` WHERE `nurl` = '%s'", dbesc(normalise_link($server_url)));
if (dbm::is_result($servers)) { if (dbm::is_result($servers)) {
if ($servers[0]["created"] == "0000-00-00 00:00:00") if ($servers[0]["created"] <= NULL_DATE) {
q("UPDATE `gserver` SET `created` = '%s' WHERE `nurl` = '%s'", q("UPDATE `gserver` SET `created` = '%s' WHERE `nurl` = '%s'",
dbesc(datetime_convert()), dbesc(normalise_link($server_url))); dbesc(datetime_convert()), dbesc(normalise_link($server_url)));
}
$poco = $servers[0]["poco"]; $poco = $servers[0]["poco"];
$noscrape = $servers[0]["noscrape"]; $noscrape = $servers[0]["noscrape"];
@ -723,13 +992,15 @@ function poco_check_server($server_url, $network = "", $force = false) {
$info = ""; $info = "";
$register_policy = -1; $register_policy = -1;
$last_contact = "0000-00-00 00:00:00"; $last_contact = NULL_DATE;
$last_failure = "0000-00-00 00:00:00"; $last_failure = NULL_DATE;
} }
logger("Server ".$server_url." is outdated or unknown. Start discovery. Force: ".$force." Created: ".$servers[0]["created"]." Failure: ".$last_failure." Contact: ".$last_contact, LOGGER_DEBUG); logger("Server ".$server_url." is outdated or unknown. Start discovery. Force: ".$force." Created: ".$servers[0]["created"]." Failure: ".$last_failure." Contact: ".$last_contact, LOGGER_DEBUG);
$failure = false; $failure = false;
$possible_failure = false;
$orig_last_failure = $last_failure; $orig_last_failure = $last_failure;
$orig_last_contact = $last_contact;
// Check if the page is accessible via SSL. // Check if the page is accessible via SSL.
$orig_server_url = $server_url; $orig_server_url = $server_url;
@ -769,18 +1040,58 @@ function poco_check_server($server_url, $network = "", $force = false) {
$last_failure = datetime_convert(); $last_failure = datetime_convert();
$failure = true; $failure = true;
} }
$possible_failure = true;
} elseif ($network == NETWORK_DIASPORA) } elseif ($network == NETWORK_DIASPORA)
$last_contact = datetime_convert(); $last_contact = datetime_convert();
// If the server has no possible failure we reset the cached data
if (!$possible_failure) {
$version = "";
$platform = "";
$site_name = "";
$info = "";
$register_policy = -1;
}
// Look for poco
if (!$failure) { if (!$failure) {
// Test for Diaspora $serverret = z_fetch_url($server_url."/poco");
if ($serverret["success"]) {
$data = json_decode($serverret["body"]);
if (isset($data->totalResults)) {
$poco = $server_url."/poco";
$last_contact = datetime_convert();
$server = poco_detect_poco_data($data);
if ($server) {
$platform = $server['platform'];
$network = $server['network'];
$version = '';
$site_name = '';
}
}
}
}
if (!$failure) {
// Test for Diaspora, Hubzilla, Mastodon or older Friendica servers
$serverret = z_fetch_url($server_url); $serverret = z_fetch_url($server_url);
if (!$serverret["success"] OR ($serverret["body"] == "")) if (!$serverret["success"] OR ($serverret["body"] == "")) {
$last_failure = datetime_convert();
$failure = true; $failure = true;
else { } else {
$server = poco_detect_server_type($serverret["body"]);
if ($server) {
$platform = $server['platform'];
$network = $server['network'];
$version = $server['version'];
$site_name = $server['site_name'];
$last_contact = datetime_convert();
}
$lines = explode("\n",$serverret["header"]); $lines = explode("\n",$serverret["header"]);
if(count($lines)) if(count($lines)) {
foreach($lines as $line) { foreach($lines as $line) {
$line = trim($line); $line = trim($line);
if(stristr($line,'X-Diaspora-Version:')) { if(stristr($line,'X-Diaspora-Version:')) {
@ -790,6 +1101,7 @@ function poco_check_server($server_url, $network = "", $force = false) {
$network = NETWORK_DIASPORA; $network = NETWORK_DIASPORA;
$versionparts = explode("-", $version); $versionparts = explode("-", $version);
$version = $versionparts[0]; $version = $versionparts[0];
$last_contact = datetime_convert();
} }
if(stristr($line,'Server: Mastodon')) { if(stristr($line,'Server: Mastodon')) {
@ -797,12 +1109,14 @@ function poco_check_server($server_url, $network = "", $force = false) {
$network = NETWORK_OSTATUS; $network = NETWORK_OSTATUS;
// Mastodon doesn't reveal version numbers // Mastodon doesn't reveal version numbers
$version = ""; $version = "";
$last_contact = datetime_convert();
} }
} }
}
} }
} }
if (!$failure) { if (!$failure AND ($poco == "")) {
// Test for Statusnet // Test for Statusnet
// Will also return data for Friendica and GNU Social - but it will be overwritten later // Will also return data for Friendica and GNU Social - but it will be overwritten later
// The "not implemented" is a special treatment for really, really old Friendica versions // The "not implemented" is a special treatment for really, really old Friendica versions
@ -810,8 +1124,11 @@ function poco_check_server($server_url, $network = "", $force = false) {
if ($serverret["success"] AND ($serverret["body"] != '{"error":"not implemented"}') AND if ($serverret["success"] AND ($serverret["body"] != '{"error":"not implemented"}') AND
($serverret["body"] != '') AND (strlen($serverret["body"]) < 30)) { ($serverret["body"] != '') AND (strlen($serverret["body"]) < 30)) {
$platform = "StatusNet"; $platform = "StatusNet";
$version = trim($serverret["body"], '"'); // Remove junk that some GNU Social servers return
$version = str_replace(chr(239).chr(187).chr(191), "", $serverret["body"]);
$version = trim($version, '"');
$network = NETWORK_OSTATUS; $network = NETWORK_OSTATUS;
$last_contact = datetime_convert();
} }
// Test for GNU Social // Test for GNU Social
@ -819,17 +1136,32 @@ function poco_check_server($server_url, $network = "", $force = false) {
if ($serverret["success"] AND ($serverret["body"] != '{"error":"not implemented"}') AND if ($serverret["success"] AND ($serverret["body"] != '{"error":"not implemented"}') AND
($serverret["body"] != '') AND (strlen($serverret["body"]) < 30)) { ($serverret["body"] != '') AND (strlen($serverret["body"]) < 30)) {
$platform = "GNU Social"; $platform = "GNU Social";
$version = trim($serverret["body"], '"'); // Remove junk that some GNU Social servers return
$version = str_replace(chr(239).chr(187).chr(191), "", $serverret["body"]);
$version = trim($version, '"');
$network = NETWORK_OSTATUS; $network = NETWORK_OSTATUS;
$last_contact = datetime_convert();
} }
}
if (!$failure) {
// Test for Hubzilla, Redmatrix or Friendica
$serverret = z_fetch_url($server_url."/api/statusnet/config.json"); $serverret = z_fetch_url($server_url."/api/statusnet/config.json");
if ($serverret["success"]) { if ($serverret["success"]) {
$data = json_decode($serverret["body"]); $data = json_decode($serverret["body"]);
if (isset($data->site->server)) { if (isset($data->site->server)) {
$last_contact = datetime_convert(); $last_contact = datetime_convert();
if (isset($data->site->platform)) {
$platform = $data->site->platform->PLATFORM_NAME;
$version = $data->site->platform->STD_VERSION;
$network = NETWORK_DIASPORA;
}
if (isset($data->site->BlaBlaNet)) {
$platform = $data->site->BlaBlaNet->PLATFORM_NAME;
$version = $data->site->BlaBlaNet->STD_VERSION;
$network = NETWORK_DIASPORA;
}
if (isset($data->site->hubzilla)) { if (isset($data->site->hubzilla)) {
$platform = $data->site->hubzilla->PLATFORM_NAME; $platform = $data->site->hubzilla->PLATFORM_NAME;
$version = $data->site->hubzilla->RED_VERSION; $version = $data->site->hubzilla->RED_VERSION;
@ -866,32 +1198,66 @@ function poco_check_server($server_url, $network = "", $force = false) {
} }
} }
// Query statistics.json. Optional package for Diaspora, Friendica and Redmatrix // Query statistics.json. Optional package for Diaspora, Friendica and Redmatrix
if (!$failure) { if (!$failure) {
$serverret = z_fetch_url($server_url."/statistics.json"); $serverret = z_fetch_url($server_url."/statistics.json");
if ($serverret["success"]) { if ($serverret["success"]) {
$data = json_decode($serverret["body"]); $data = json_decode($serverret["body"]);
if ($version == "") if (isset($data->version)) {
$version = $data->version; $version = $data->version;
// Version numbers on statistics.json are presented with additional info, e.g.:
// 0.6.3.0-p1702cc1c, 0.6.99.0-p1b9ab160 or 3.4.3-2-1191.
$version = preg_replace("=(.+)-(.{4,})=ism", "$1", $version);
}
$site_name = $data->name; $site_name = $data->name;
if (isset($data->network) AND ($platform == "")) if (isset($data->network)) {
$platform = $data->network; $platform = $data->network;
}
if ($platform == "Diaspora") if ($platform == "Diaspora") {
$network = NETWORK_DIASPORA; $network = NETWORK_DIASPORA;
}
if ($data->registrations_open) if ($data->registrations_open) {
$register_policy = REGISTER_OPEN; $register_policy = REGISTER_OPEN;
else } else {
$register_policy = REGISTER_CLOSED; $register_policy = REGISTER_CLOSED;
}
if (isset($data->version)) if (isset($data->version))
$last_contact = datetime_convert(); $last_contact = datetime_convert();
} }
} }
// Query nodeinfo. Working for (at least) Diaspora and Friendica.
if (!$failure) {
$server = poco_fetch_nodeinfo($server_url);
if ($server) {
$register_policy = $server['register_policy'];
if (isset($server['platform'])) {
$platform = $server['platform'];
}
if (isset($server['network'])) {
$network = $server['network'];
}
if (isset($server['version'])) {
$version = $server['version'];
}
if (isset($server['site_name'])) {
$site_name = $server['site_name'];
}
$last_contact = datetime_convert();
}
}
// Check for noscrape // Check for noscrape
// Friendica servers could be detected as OStatus servers // Friendica servers could be detected as OStatus servers
if (!$failure AND in_array($network, array(NETWORK_DFRN, NETWORK_OSTATUS))) { if (!$failure AND in_array($network, array(NETWORK_DFRN, NETWORK_OSTATUS))) {
@ -929,16 +1295,21 @@ function poco_check_server($server_url, $network = "", $force = false) {
} }
} }
// Look for poco if ($possible_failure AND !$failure) {
if (!$failure) { $last_failure = datetime_convert();
$serverret = z_fetch_url($server_url."/poco"); $failure = true;
if ($serverret["success"]) { }
$data = json_decode($serverret["body"]);
if (isset($data->totalResults)) { if ($failure) {
$poco = $server_url."/poco"; $last_contact = $orig_last_contact;
$last_contact = datetime_convert(); } else {
} $last_failure = $orig_last_failure;
} }
if (($last_contact <= $last_failure) AND !$failure) {
logger("Server ".$server_url." seems to be alive, but last contact wasn't set - could be a bug", LOGGER_DEBUG);
} else if (($last_contact >= $last_failure) AND $failure) {
logger("Server ".$server_url." seems to be dead, but last failure wasn't set - could be a bug", LOGGER_DEBUG);
} }
// Check again if the server exists // Check again if the server exists
@ -949,7 +1320,7 @@ function poco_check_server($server_url, $network = "", $force = false) {
$info = strip_tags($info); $info = strip_tags($info);
$platform = strip_tags($platform); $platform = strip_tags($platform);
if ($servers) if ($servers) {
q("UPDATE `gserver` SET `url` = '%s', `version` = '%s', `site_name` = '%s', `info` = '%s', `register_policy` = %d, `poco` = '%s', `noscrape` = '%s', q("UPDATE `gserver` SET `url` = '%s', `version` = '%s', `site_name` = '%s', `info` = '%s', `register_policy` = %d, `poco` = '%s', `noscrape` = '%s',
`network` = '%s', `platform` = '%s', `last_contact` = '%s', `last_failure` = '%s' WHERE `nurl` = '%s'", `network` = '%s', `platform` = '%s', `last_contact` = '%s', `last_failure` = '%s' WHERE `nurl` = '%s'",
dbesc($server_url), dbesc($server_url),
@ -965,7 +1336,7 @@ function poco_check_server($server_url, $network = "", $force = false) {
dbesc($last_failure), dbesc($last_failure),
dbesc(normalise_link($server_url)) dbesc(normalise_link($server_url))
); );
else } elseif (!$failure) {
q("INSERT INTO `gserver` (`url`, `nurl`, `version`, `site_name`, `info`, `register_policy`, `poco`, `noscrape`, `network`, `platform`, `created`, `last_contact`, `last_failure`) q("INSERT INTO `gserver` (`url`, `nurl`, `version`, `site_name`, `info`, `register_policy`, `poco`, `noscrape`, `network`, `platform`, `created`, `last_contact`, `last_failure`)
VALUES ('%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s')", VALUES ('%s', '%s', '%s', '%s', '%s', %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s')",
dbesc($server_url), dbesc($server_url),
@ -983,7 +1354,7 @@ function poco_check_server($server_url, $network = "", $force = false) {
dbesc($last_failure), dbesc($last_failure),
dbesc(datetime_convert()) dbesc(datetime_convert())
); );
}
logger("End discovery for server ".$server_url, LOGGER_DEBUG); logger("End discovery for server ".$server_url, LOGGER_DEBUG);
return !$failure; return !$failure;
@ -1147,7 +1518,7 @@ function suggestion_query($uid, $start = 0, $limit = 80) {
where uid = %d and not gcontact.nurl in ( select nurl from contact where uid = %d ) where uid = %d and not gcontact.nurl in ( select nurl from contact where uid = %d )
AND NOT `gcontact`.`name` IN (SELECT `name` FROM `contact` WHERE `uid` = %d) AND NOT `gcontact`.`name` IN (SELECT `name` FROM `contact` WHERE `uid` = %d)
AND NOT `gcontact`.`id` IN (SELECT `gcid` FROM `gcign` WHERE `uid` = %d) AND NOT `gcontact`.`id` IN (SELECT `gcid` FROM `gcign` WHERE `uid` = %d)
AND `gcontact`.`updated` != '0000-00-00 00:00:00' AND `gcontact`.`updated` >= '%s'
AND `gcontact`.`last_contact` >= `gcontact`.`last_failure` AND `gcontact`.`last_contact` >= `gcontact`.`last_failure`
AND `gcontact`.`network` IN (%s) AND `gcontact`.`network` IN (%s)
GROUP BY `glink`.`gcid` ORDER BY `gcontact`.`updated` DESC,`total` DESC LIMIT %d, %d", GROUP BY `glink`.`gcid` ORDER BY `gcontact`.`updated` DESC,`total` DESC LIMIT %d, %d",
@ -1155,6 +1526,7 @@ function suggestion_query($uid, $start = 0, $limit = 80) {
intval($uid), intval($uid),
intval($uid), intval($uid),
intval($uid), intval($uid),
dbesc(NULL_DATE),
$sql_network, $sql_network,
intval($start), intval($start),
intval($limit) intval($limit)
@ -1173,13 +1545,14 @@ function suggestion_query($uid, $start = 0, $limit = 80) {
WHERE `glink`.`uid` = 0 AND `glink`.`cid` = 0 AND `glink`.`zcid` = 0 AND NOT `gcontact`.`nurl` IN (SELECT `nurl` FROM `contact` WHERE `uid` = %d) WHERE `glink`.`uid` = 0 AND `glink`.`cid` = 0 AND `glink`.`zcid` = 0 AND NOT `gcontact`.`nurl` IN (SELECT `nurl` FROM `contact` WHERE `uid` = %d)
AND NOT `gcontact`.`name` IN (SELECT `name` FROM `contact` WHERE `uid` = %d) AND NOT `gcontact`.`name` IN (SELECT `name` FROM `contact` WHERE `uid` = %d)
AND NOT `gcontact`.`id` IN (SELECT `gcid` FROM `gcign` WHERE `uid` = %d) AND NOT `gcontact`.`id` IN (SELECT `gcid` FROM `gcign` WHERE `uid` = %d)
AND `gcontact`.`updated` != '0000-00-00 00:00:00' AND `gcontact`.`updated` >= '%s'
AND `gcontact`.`last_contact` >= `gcontact`.`last_failure` AND `gcontact`.`last_contact` >= `gcontact`.`last_failure`
AND `gcontact`.`network` IN (%s) AND `gcontact`.`network` IN (%s)
ORDER BY rand() LIMIT %d, %d", ORDER BY rand() LIMIT %d, %d",
intval($uid), intval($uid),
intval($uid), intval($uid),
intval($uid), intval($uid),
dbesc(NULL_DATE),
$sql_network, $sql_network,
intval($start), intval($start),
intval($limit) intval($limit)
@ -1244,6 +1617,33 @@ function update_suggestions() {
} }
} }
/**
* @brief Fetch server list from remote servers and adds them when they are new.
*
* @param string $poco URL to the POCO endpoint
*/
function poco_fetch_serverlist($poco) {
$serverret = z_fetch_url($poco."/@server");
if (!$serverret["success"]) {
return;
}
$serverlist = json_decode($serverret['body']);
if (!is_array($serverlist)) {
return;
}
foreach ($serverlist AS $server) {
$server_url = str_replace("/index.php", "", $server->url);
$r = q("SELECT `nurl` FROM `gserver` WHERE `nurl` = '%s'", dbesc(normalise_link($server_url)));
if (!dbm::is_result($r)) {
logger("Call server check for server ".$server_url, LOGGER_DEBUG);
proc_run(PRIORITY_LOW, "include/discover_poco.php", "server", base64_encode($server_url));
}
}
}
function poco_discover_federation() { function poco_discover_federation() {
$last = get_config('poco','last_federation_discovery'); $last = get_config('poco','last_federation_discovery');
@ -1259,8 +1659,9 @@ function poco_discover_federation() {
if ($serverdata) { if ($serverdata) {
$servers = json_decode($serverdata); $servers = json_decode($serverdata);
foreach($servers->pods AS $server) foreach ($servers->pods AS $server) {
poco_check_server("https://".$server->host); proc_run(PRIORITY_LOW, "include/discover_poco.php", "server", base64_encode("https://".$server->host));
}
} }
// Currently disabled, since the service isn't available anymore. // Currently disabled, since the service isn't available anymore.
@ -1281,6 +1682,68 @@ function poco_discover_federation() {
set_config('poco','last_federation_discovery', time()); set_config('poco','last_federation_discovery', time());
} }
function poco_discover_single_server($id) {
$r = q("SELECT `poco`, `nurl`, `url`, `network` FROM `gserver` WHERE `id` = %d", intval($id));
if (!dbm::is_result($r)) {
return false;
}
$server = $r[0];
// Discover new servers out there (Works from Friendica version 3.5.2)
poco_fetch_serverlist($server["poco"]);
// Fetch all users from the other server
$url = $server["poco"]."/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation";
logger("Fetch all users from the server ".$server["url"], LOGGER_DEBUG);
$retdata = z_fetch_url($url);
if ($retdata["success"]) {
$data = json_decode($retdata["body"]);
poco_discover_server($data, 2);
if (get_config('system','poco_discovery') > 1) {
$timeframe = get_config('system','poco_discovery_since');
if ($timeframe == 0) {
$timeframe = 30;
}
$updatedSince = date("Y-m-d H:i:s", time() - $timeframe * 86400);
// Fetch all global contacts from the other server (Not working with Redmatrix and Friendica versions before 3.3)
$url = $server["poco"]."/@global?updatedSince=".$updatedSince."&fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation";
$success = false;
$retdata = z_fetch_url($url);
if ($retdata["success"]) {
logger("Fetch all global contacts from the server ".$server["nurl"], LOGGER_DEBUG);
$success = poco_discover_server(json_decode($retdata["body"]));
}
if (!$success AND (get_config('system','poco_discovery') > 2)) {
logger("Fetch contacts from users of the server ".$server["nurl"], LOGGER_DEBUG);
poco_discover_server_users($data, $server);
}
}
q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
return true;
} else {
// If the server hadn't replied correctly, then force a sanity check
poco_check_server($server["url"], $server["network"], true);
// If we couldn't reach the server, we will try it some time later
q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
return false;
}
}
function poco_discover($complete = false) { function poco_discover($complete = false) {
// Update the server list // Update the server list
@ -1290,13 +1753,13 @@ function poco_discover($complete = false) {
$requery_days = intval(get_config("system", "poco_requery_days")); $requery_days = intval(get_config("system", "poco_requery_days"));
if ($requery_days == 0) if ($requery_days == 0) {
$requery_days = 7; $requery_days = 7;
}
$last_update = date("c", time() - (60 * 60 * 24 * $requery_days)); $last_update = date("c", time() - (60 * 60 * 24 * $requery_days));
$r = q("SELECT `poco`, `nurl`, `url`, `network` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `poco` != '' AND `last_poco_query` < '%s' ORDER BY RAND()", dbesc($last_update)); $r = q("SELECT `id`, `url`, `network` FROM `gserver` WHERE `last_contact` >= `last_failure` AND `poco` != '' AND `last_poco_query` < '%s' ORDER BY RAND()", dbesc($last_update));
if ($r) if (dbm::is_result($r)) {
foreach ($r AS $server) { foreach ($r AS $server) {
if (!poco_check_server($server["url"], $server["network"])) { if (!poco_check_server($server["url"], $server["network"])) {
@ -1305,53 +1768,14 @@ function poco_discover($complete = false) {
continue; continue;
} }
// Fetch all users from the other server logger('Update directory from server '.$server['url'].' with ID '.$server['id'], LOGGER_DEBUG);
$url = $server["poco"]."/?fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation"; proc_run(PRIORITY_LOW, "include/discover_poco.php", "update_server_directory", intval($server['id']));
logger("Fetch all users from the server ".$server["nurl"], LOGGER_DEBUG); if (!$complete AND (--$no_of_queries == 0)) {
break;
$retdata = z_fetch_url($url);
if ($retdata["success"]) {
$data = json_decode($retdata["body"]);
poco_discover_server($data, 2);
if (get_config('system','poco_discovery') > 1) {
$timeframe = get_config('system','poco_discovery_since');
if ($timeframe == 0)
$timeframe = 30;
$updatedSince = date("Y-m-d H:i:s", time() - $timeframe * 86400);
// Fetch all global contacts from the other server (Not working with Redmatrix and Friendica versions before 3.3)
$url = $server["poco"]."/@global?updatedSince=".$updatedSince."&fields=displayName,urls,photos,updated,network,aboutMe,currentLocation,tags,gender,contactType,generation";
$success = false;
$retdata = z_fetch_url($url);
if ($retdata["success"]) {
logger("Fetch all global contacts from the server ".$server["nurl"], LOGGER_DEBUG);
$success = poco_discover_server(json_decode($retdata["body"]));
}
if (!$success AND (get_config('system','poco_discovery') > 2)) {
logger("Fetch contacts from users of the server ".$server["nurl"], LOGGER_DEBUG);
poco_discover_server_users($data, $server);
}
}
q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
if (!$complete AND (--$no_of_queries == 0))
break;
} else {
// If the server hadn't replied correctly, then force a sanity check
poco_check_server($server["url"], $server["network"], true);
// If we couldn't reach the server, we will try it some time later
q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
} }
} }
}
} }
function poco_discover_server_users($data, $server) { function poco_discover_server_users($data, $server) {
@ -1395,7 +1819,7 @@ function poco_discover_server($data, $default_generation = 0) {
$connect_url = ''; $connect_url = '';
$name = ''; $name = '';
$network = ''; $network = '';
$updated = '0000-00-00 00:00:00'; $updated = NULL_DATE;
$location = ''; $location = '';
$about = ''; $about = '';
$keywords = ''; $keywords = '';
@ -1879,4 +2303,20 @@ function gs_discover() {
q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"])); q("UPDATE `gserver` SET `last_poco_query` = '%s' WHERE `nurl` = '%s'", dbesc(datetime_convert()), dbesc($server["nurl"]));
} }
} }
/**
* @brief Returns a list of all known servers
* @return array List of server urls
*/
function poco_serverlist() {
$r = q("SELECT `url`, `site_name` AS `displayName`, `network`, `platform`, `version` FROM `gserver`
WHERE `network` IN ('%s', '%s', '%s') AND `last_contact` > `last_failure`
ORDER BY `last_contact`
LIMIT 1000",
dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS));
if (!dbm::is_result($r)) {
return false;
}
return $r;
}
?> ?>

View file

@ -6,24 +6,10 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
require_once("include/items.php"); require_once("include/items.php");
function spool_post_run($argv, $argc) { function spool_post_run($argv, $argc) {
global $a, $db; global $a;
if (is_null($a)) {
$a = new App;
}
if (is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
}
Config::load();
$path = get_spoolpath(); $path = get_spoolpath();
@ -69,9 +55,4 @@ function spool_post_run($argv, $argc) {
} }
} }
} }
if (array_search(__file__, get_included_files()) === 0) {
spool_post_run($_SERVER["argv"], $_SERVER["argc"]);
killme();
}
?> ?>

View file

@ -1,24 +1,6 @@
<?php <?php
use \Friendica\Core\Config;
require_once("boot.php");
require_once("include/tags.php"); require_once("include/tags.php");
global $a, $db; function tagupdate_run(&$argv, &$argc){
update_items();
if(is_null($a))
$a = new App;
if(is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
} }
Config::load();
update_items();
killme();
?>

View file

@ -903,10 +903,10 @@ function contact_block() {
intval($shown) intval($shown)
); );
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
$contacts = ""; $contacts = array();
foreach ($r AS $contact) foreach ($r AS $contact) {
$contacts[] = $contact["id"]; $contacts[] = $contact["id"];
}
$r = q("SELECT `id`, `uid`, `addr`, `url`, `name`, `thumb`, `network` FROM `contact` WHERE `id` IN (%s)", $r = q("SELECT `id`, `uid`, `addr`, `url`, `name`, `thumb`, `network` FROM `contact` WHERE `id` IN (%s)",
dbesc(implode(",", $contacts))); dbesc(implode(",", $contacts)));

View file

@ -1,25 +1,7 @@
<?php <?php
use \Friendica\Core\Config;
require_once("boot.php");
require_once("include/threads.php"); require_once("include/threads.php");
global $a, $db; function threadupdate_run(&$argv, &$argc){
update_threads();
if(is_null($a)) update_threads_mention();
$a = new App;
if(is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
} }
Config::load();
update_threads();
update_threads_mention();
killme();
?>

View file

@ -11,14 +11,11 @@ define("IMPORT_DEBUG", False);
function last_insert_id() { function last_insert_id() {
global $db; global $db;
if (IMPORT_DEBUG) if (IMPORT_DEBUG)
return 1; return 1;
if ($db->mysqli) {
$thedb = $db->getdb(); return $db->insert_id();
return $thedb->insert_id;
} else {
return mysql_insert_id();
}
} }
function last_error() { function last_error() {
@ -186,8 +183,8 @@ function import_account(App $a, $file) {
} }
} }
if ($contact['uid'] == $olduid && $contact['self'] == '0') { if ($contact['uid'] == $olduid && $contact['self'] == '0') {
// set contacts 'avatar-date' to "0000-00-00 00:00:00" to let poller to update urls // set contacts 'avatar-date' to NULL_DATE to let poller to update urls
$contact["avatar-date"] = "0000-00-00 00:00:00" ; $contact["avatar-date"] = NULL_DATE;
switch ($contact['network']) { switch ($contact['network']) {

View file

@ -2,46 +2,23 @@
use \Friendica\Core\Config; use \Friendica\Core\Config;
require_once("boot.php");
function update_gcontact_run(&$argv, &$argc){ function update_gcontact_run(&$argv, &$argc){
global $a, $db; global $a;
if(is_null($a)) {
$a = new App;
}
if(is_null($db)) {
@include(".htconfig.php");
require_once("include/dba.php");
$db = new dba($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
};
require_once('include/Scrape.php'); require_once('include/Scrape.php');
require_once("include/socgraph.php"); require_once('include/socgraph.php');
Config::load();
$a->set_baseurl(get_config('system','url'));
load_hooks();
logger('update_gcontact: start'); logger('update_gcontact: start');
if(($argc > 1) && (intval($argv[1]))) if (($argc > 1) && (intval($argv[1]))) {
$contact_id = intval($argv[1]); $contact_id = intval($argv[1]);
}
if(!$contact_id) { if (!$contact_id) {
logger('update_gcontact: no contact'); logger('update_gcontact: no contact');
return; return;
} }
// Don't check this stuff if the function is called by the poller
if (App::callstack() != "poller_run")
if (App::is_already_running('update_gcontact'.$contact_id, '', 540))
return;
$r = q("SELECT * FROM `gcontact` WHERE `id` = %d", intval($contact_id)); $r = q("SELECT * FROM `gcontact` WHERE `id` = %d", intval($contact_id));
if (!$r) if (!$r)
@ -98,8 +75,3 @@ function update_gcontact_run(&$argv, &$argc){
dbesc(normalise_link($data["url"])) dbesc(normalise_link($data["url"]))
); );
} }
if (array_search(__file__,get_included_files())===0){
update_gcontact_run($_SERVER["argv"],$_SERVER["argc"]);
killme();
}

View file

@ -97,13 +97,6 @@ function create_user($arr) {
if(mb_strlen($username) < 3) if(mb_strlen($username) < 3)
$result['message'] .= t('Name too short.') . EOL; $result['message'] .= t('Name too short.') . EOL;
// I don't really like having this rule, but it cuts down
// on the number of auto-registrations by Russian spammers
// Using preg_match was completely unreliable, due to mixed UTF-8 regex support
// $no_utf = get_config('system','no_utf');
// $pat = (($no_utf) ? '/^[a-zA-Z]* [a-zA-Z]*$/' : '/^\p{L}* \p{L}*$/u' );
// So now we are just looking for a space in the full name. // So now we are just looking for a space in the full name.
$loose_reg = get_config('system','no_regfullname'); $loose_reg = get_config('system','no_regfullname');

View file

@ -36,7 +36,7 @@ function smarty_modifier_date_format($string, $format = null, $default_date = ''
* Include the {@link shared.make_timestamp.php} plugin * Include the {@link shared.make_timestamp.php} plugin
*/ */
require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php'); require_once(SMARTY_PLUGINS_DIR . 'shared.make_timestamp.php');
if ($string != '' && $string != '0000-00-00' && $string != '0000-00-00 00:00:00') { if ($string != '' && $string > '0001-01-01' && $string > NULL_DATE) {
$timestamp = smarty_make_timestamp($string); $timestamp = smarty_make_timestamp($string);
} elseif ($default_date != '') { } elseif ($default_date != '') {
$timestamp = smarty_make_timestamp($default_date); $timestamp = smarty_make_timestamp($default_date);

View file

@ -1,24 +1,17 @@
<?php <?php
//# Install PSR-0-compatible class autoloader require_once "library/php-markdown/Michelf/MarkdownExtra.inc.php";
//spl_autoload_register(function($class){
// require preg_replace('{\\\\|_(?!.*\\\\)}', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php';
//});
require_once("library/php-markdown/Michelf/MarkdownExtra.inc.php");
# Get Markdown class
use \Michelf\MarkdownExtra; use \Michelf\MarkdownExtra;
function Markdown($text) { function Markdown($text) {
$a = get_app(); $a = get_app();
$stamp1 = microtime(true); $stamp1 = microtime(true);
# Read file and pass content through the Markdown parser $MarkdownParser = new MarkdownExtra();
$html = MarkdownExtra::defaultTransform($text); $MarkdownParser->hard_wrap = true;
$html = $MarkdownParser->transform($text);
$a->save_timestamp($stamp1, "parser"); $a->save_timestamp($stamp1, "parser");
return $html; return $html;
} }
?>

View file

@ -1,11 +1,11 @@
PHP Markdown Lib PHP Markdown Lib
Copyright (c) 2004-2014 Michel Fortin Copyright (c) 2004-2016 Michel Fortin
<http://michelf.ca/> <https://michelf.ca/>
All rights reserved. All rights reserved.
Based on Markdown Based on Markdown
Copyright (c) 2003-2006 John Gruber Copyright (c) 2003-2006 John Gruber
<http://daringfireball.net/> <https://daringfireball.net/>
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

View file

@ -1,10 +1,10 @@
<?php <?php
# Use this file if you cannot use class autoloading. It will include all the // Use this file if you cannot use class autoloading. It will include all the
# files needed for the Markdown parser. // files needed for the Markdown parser.
# //
# Take a look at the PSR-0-compatible class autoloading implementation // Take a look at the PSR-0-compatible class autoloading implementation
# in the Readme.php file if you want a simple autoloader setup. // in the Readme.php file if you want a simple autoloader setup.
require_once dirname(__FILE__) . '/MarkdownInterface.php'; require_once dirname(__FILE__) . '/MarkdownInterface.php';
require_once dirname(__FILE__) . '/Markdown.php'; require_once dirname(__FILE__) . '/Markdown.php';

File diff suppressed because it is too large Load diff

View file

@ -1,10 +1,10 @@
<?php <?php
# Use this file if you cannot use class autoloading. It will include all the // Use this file if you cannot use class autoloading. It will include all the
# files needed for the MarkdownExtra parser. // files needed for the MarkdownExtra parser.
# //
# Take a look at the PSR-0-compatible class autoloading implementation // Take a look at the PSR-0-compatible class autoloading implementation
# in the Readme.php file if you want a simple autoloader setup. // in the Readme.php file if you want a simple autoloader setup.
require_once dirname(__FILE__) . '/MarkdownInterface.php'; require_once dirname(__FILE__) . '/MarkdownInterface.php';
require_once dirname(__FILE__) . '/Markdown.php'; require_once dirname(__FILE__) . '/Markdown.php';

File diff suppressed because it is too large Load diff

View file

@ -1,9 +1,9 @@
<?php <?php
# Use this file if you cannot use class autoloading. It will include all the // Use this file if you cannot use class autoloading. It will include all the
# files needed for the MarkdownInterface interface. // files needed for the MarkdownInterface interface.
# //
# Take a look at the PSR-0-compatible class autoloading implementation // Take a look at the PSR-0-compatible class autoloading implementation
# in the Readme.php file if you want a simple autoloader setup. // in the Readme.php file if you want a simple autoloader setup.
require_once dirname(__FILE__) . '/MarkdownInterface.php'; require_once dirname(__FILE__) . '/MarkdownInterface.php';

View file

@ -1,34 +1,38 @@
<?php <?php
# /**
# Markdown - A text-to-HTML conversion tool for web writers * Markdown - A text-to-HTML conversion tool for web writers
# *
# PHP Markdown * @package php-markdown
# Copyright (c) 2004-2014 Michel Fortin * @author Michel Fortin <michel.fortin@michelf.com>
# <http://michelf.com/projects/php-markdown/> * @copyright 2004-2016 Michel Fortin <https://michelf.com/projects/php-markdown/>
# * @copyright (Original Markdown) 2004-2006 John Gruber <https://daringfireball.net/projects/markdown/>
# Original Markdown */
# Copyright (c) 2004-2006 John Gruber
# <http://daringfireball.net/projects/markdown/>
#
namespace Michelf; namespace Michelf;
/**
# * Markdown Parser Interface
# Markdown Parser Interface */
#
interface MarkdownInterface { interface MarkdownInterface {
/**
* Initialize the parser and return the result of its transform method.
* This will work fine for derived classes too.
*
* @api
*
* @param string $text
* @return string
*/
public static function defaultTransform($text);
# /**
# Initialize the parser and return the result of its transform method. * Main function. Performs some preprocessing on the input text
# This will work fine for derived classes too. * and pass it through the document gamut.
# *
public static function defaultTransform($text); * @api
*
# * @param string $text
# Main function. Performs some preprocessing on the input text * @return string
# and pass it through the document gamut. */
# public function transform($text);
public function transform($text);
} }

View file

@ -1,13 +1,13 @@
PHP Markdown PHP Markdown
============ ============
PHP Markdown Lib 1.4.1 - 4 May 2013 PHP Markdown Lib 1.7.0 - 29 Oct 2016
by Michel Fortin by Michel Fortin
<http://michelf.ca/> <https://michelf.ca/>
based on Markdown by John Gruber based on Markdown by John Gruber
<http://daringfireball.net/> <https://daringfireball.net/>
Introduction Introduction
@ -25,10 +25,10 @@ software tool, originally written in Perl, that converts the plain text
markup to HTML. PHP Markdown is a port to PHP of the original Markdown markup to HTML. PHP Markdown is a port to PHP of the original Markdown
program by John Gruber. program by John Gruber.
* [Full documentation of the Markdown syntax](<http://daringfireball.net/projects/markdown/>) * [Full documentation of the Markdown syntax](<https://daringfireball.net/projects/markdown/>)
- Daring Fireball (John Gruber) Daring Fireball (John Gruber)
* [Markdown Extra syntax additions](<http://michelf.ca/projects/php-markdown/extra/>) * [Markdown Extra syntax additions](<https://michelf.ca/projects/php-markdown/extra/>)
- Michel Fortin Michel Fortin
Requirement Requirement
@ -83,7 +83,7 @@ configuration variables:
To learn more, see the full list of [configuration variables]. To learn more, see the full list of [configuration variables].
[configuration variables]: http://michelf.ca/projects/php-markdown/configuration/ [configuration variables]: https://michelf.ca/projects/php-markdown/configuration/
### Usage without an autoloader ### Usage without an autoloader
@ -149,7 +149,7 @@ Development and Testing
----------------------- -----------------------
Pull requests for fixing bugs are welcome. Proposed new features are Pull requests for fixing bugs are welcome. Proposed new features are
going meticulously reviewed -- taking into account backward compatibility, going to be meticulously reviewed -- taking into account backward compatibility,
potential side effects, and future extensibility -- before deciding on potential side effects, and future extensibility -- before deciding on
acceptance or rejection. acceptance or rejection.
@ -174,11 +174,80 @@ PHP Markdown, please visit [michelf.ca/donate] or send Bitcoin to
Version History Version History
--------------- ---------------
Unreleased PHP Markdown Lib 1.7.0 (29 Oct 2016)
* Added the ability to insert custom HTML attributes everywhere an extra * Added a `hard_wrap` configuration variable to make all newline characters
attribute block is allowed (links, images, headers). Credits to in the text become `<br>` tags in the HTML output. By default, according
Peter Droogmans for providing the implementation. to the standard Markdown syntax these newlines are ignored unless they a
preceded by two spaces. Thanks to Jonathan Cohlmeyer for the implementation.
* Improved the parsing of list items to fix problematic cases that came to
light with the addition of `hard_wrap`. This should have no effect on the
output except span-level list items that ended with two spaces (and thus
ended with a line break).
* Added a `code_span_content_func` configuration variable which takes a
function that will convert the content of the code span to HTML. This can
be useful to implement syntax highlighting. Although contrary to its
code block equivalent, there is no syntax for specifying a language.
Credits to styxit for the implementation.
* Fixed a Markdown Extra issue where two-space-at-end-of-line hard breaks
wouldn't work inside of HTML block elements such as `<p markdown="1">`
where the element expects only span-level content.
* In the parser code, switched to PHPDoc comment format. Thanks to
Robbie Averill for the help.
PHP Markdown Lib 1.6.0 (23 Dec 2015)
Note: this version was incorrectly released as 1.5.1 on Dec 22, a number
that contradicted the versioning policy.
* For fenced code blocks in Markdown Extra, can now set a class name for the
code block's language before the special attribute block. Previously, this
class name was only allowed in the absence of the special attribute block.
* Added a `code_block_content_func` configuration variable which takes a
function that will convert the content of the code block to HTML. This is
most useful for syntax highlighting. For fenced code blocks in Markdown
Extra, the function has access to the language class name (the one outside
of the special attribute block). Credits to Mario Konrad for providing the
implementation.
* The curled arrow character for the backlink in footnotes is now followed
by a Unicode variant selector to prevent it from being displayed in emoji
form on iOS.
Note that in older browsers the variant selector is often interpreted as a
separate character, making it visible after the arrow. So there is now a
also a `fn_backlink_html` configuration variable that can be used to set
the link text to something else. Credits to Dana for providing the
implementation.
* Fixed an issue in MarkdownExtra where long header lines followed by a
special attribute block would hit the backtrack limit an cause an empty
string to be returned.
PHP Markdown Lib 1.5.0 (1 Mar 2015)
* Added the ability start ordered lists with a number different from 1 and
and have that reflected in the HTML output. This can be enabled with
the `enhanced_ordered_lists` configuration variable for the Markdown
parser; it is enabled by default for Markdown Extra.
Credits to Matt Gorle for providing the implementation.
* Added the ability to insert custom HTML attributes with simple values
everywhere an extra attribute block is allowed (links, images, headers).
The value must be unquoted, cannot contains spaces and is limited to
alphanumeric ASCII characters.
Credits to Peter Droogmans for providing the implementation.
* Added a `header_id_func` configuration variable which takes a function
that can generate an `id` attribute value from the header text.
Credits to Evert Pot for providing the implementation.
* Added a `url_filter_func` configuration variable which takes a function * Added a `url_filter_func` configuration variable which takes a function
that can rewrite any link or image URL to something different. that can rewrite any link or image URL to something different.
@ -239,7 +308,7 @@ PHP Markdown Extra 1.2.6:
* Plugin interface for WordPress and other systems is no longer present in * Plugin interface for WordPress and other systems is no longer present in
the Lib package. The classic package is still available if you need it: the Lib package. The classic package is still available if you need it:
<http://michelf.ca/projects/php-markdown/classic/> <https://michelf.ca/projects/php-markdown/classic/>
* Added `public` and `protected` protection attributes, plus a section about * Added `public` and `protected` protection attributes, plus a section about
what is "public API" and what isn't in the Readme file. what is "public API" and what isn't in the Readme file.
@ -277,13 +346,13 @@ Copyright and License
--------------------- ---------------------
PHP Markdown Lib PHP Markdown Lib
Copyright (c) 2004-2014 Michel Fortin Copyright (c) 2004-2016 Michel Fortin
<http://michelf.ca/> <https://michelf.ca/>
All rights reserved. All rights reserved.
Based on Markdown Based on Markdown
Copyright (c) 2003-2005 John Gruber Copyright (c) 2003-2005 John Gruber
<http://daringfireball.net/> <https://daringfireball.net/>
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

View file

@ -1,18 +1,18 @@
<?php <?php
# This file passes the content of the Readme.md file in the same directory // This file passes the content of the Readme.md file in the same directory
# through the Markdown filter. You can adapt this sample code in any way // through the Markdown filter. You can adapt this sample code in any way
# you like. // you like.
# Install PSR-0-compatible class autoloader // Install PSR-0-compatible class autoloader
spl_autoload_register(function($class){ spl_autoload_register(function($class){
require preg_replace('{\\\\|_(?!.*\\\\)}', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php'; require preg_replace('{\\\\|_(?!.*\\\\)}', DIRECTORY_SEPARATOR, ltrim($class, '\\')).'.php';
}); });
# Get Markdown class // Get Markdown class
use \Michelf\Markdown; use \Michelf\Markdown;
# Read file and pass content through the Markdown parser // Read file and pass content through the Markdown parser
$text = file_get_contents('Readme.md'); $text = file_get_contents('Readme.md');
$html = Markdown::defaultTransform($text); $html = Markdown::defaultTransform($text);
@ -24,7 +24,7 @@ $html = Markdown::defaultTransform($text);
</head> </head>
<body> <body>
<?php <?php
# Put HTML content in the document // Put HTML content in the document
echo $html; echo $html;
?> ?>
</body> </body>

View file

@ -2,19 +2,19 @@
"name": "michelf/php-markdown", "name": "michelf/php-markdown",
"type": "library", "type": "library",
"description": "PHP Markdown", "description": "PHP Markdown",
"homepage": "http://michelf.ca/projects/php-markdown/", "homepage": "https://michelf.ca/projects/php-markdown/",
"keywords": ["markdown"], "keywords": ["markdown"],
"license": "BSD-3-Clause", "license": "BSD-3-Clause",
"authors": [ "authors": [
{ {
"name": "Michel Fortin", "name": "Michel Fortin",
"email": "michel.fortin@michelf.ca", "email": "michel.fortin@michelf.ca",
"homepage": "http://michelf.ca/", "homepage": "https://michelf.ca/",
"role": "Developer" "role": "Developer"
}, },
{ {
"name": "John Gruber", "name": "John Gruber",
"homepage": "http://daringfireball.net/" "homepage": "https://daringfireball.net/"
} }
], ],
"require": { "require": {
@ -22,10 +22,5 @@
}, },
"autoload": { "autoload": {
"psr-0": { "Michelf": "" } "psr-0": { "Michelf": "" }
},
"extra": {
"branch-alias": {
"dev-lib": "1.4.x-dev"
}
} }
} }

View file

@ -27,7 +27,7 @@ require_once("include/text.php");
function admin_post(App $a) { function admin_post(App $a) {
if(!is_site_admin()) { if (!is_site_admin()) {
return; return;
} }
@ -39,7 +39,7 @@ function admin_post(App $a) {
// urls // urls
if ($a->argc > 1) { if ($a->argc > 1) {
switch ($a->argv[1]){ switch ($a->argv[1]) {
case 'site': case 'site':
admin_page_site_post($a); admin_page_site_post($a);
break; break;
@ -47,10 +47,10 @@ function admin_post(App $a) {
admin_page_users_post($a); admin_page_users_post($a);
break; break;
case 'plugins': case 'plugins':
if($a->argc > 2 && if ($a->argc > 2 &&
is_file("addon/".$a->argv[2]."/".$a->argv[2].".php")) { is_file("addon/".$a->argv[2]."/".$a->argv[2].".php")) {
@include_once("addon/".$a->argv[2]."/".$a->argv[2].".php"); @include_once("addon/".$a->argv[2]."/".$a->argv[2].".php");
if(function_exists($a->argv[2].'_plugin_admin_post')) { if (function_exists($a->argv[2].'_plugin_admin_post')) {
$func = $a->argv[2].'_plugin_admin_post'; $func = $a->argv[2].'_plugin_admin_post';
$func($a); $func($a);
} }
@ -59,14 +59,16 @@ function admin_post(App $a) {
return; // NOTREACHED return; // NOTREACHED
break; break;
case 'themes': case 'themes':
if($a->argc < 2) { if ($a->argc < 2) {
if(is_ajax()) return; if (is_ajax()) {
return;
}
goaway('admin/'); goaway('admin/');
return; return;
} }
$theme = $a->argv[2]; $theme = $a->argv[2];
if(is_file("view/theme/$theme/config.php")){ if (is_file("view/theme/$theme/config.php")) {
function __call_theme_admin_post(App $a, $theme) { function __call_theme_admin_post(App $a, $theme) {
$orig_theme = $a->theme; $orig_theme = $a->theme;
$orig_page = $a->page; $orig_page = $a->page;
@ -77,8 +79,10 @@ function admin_post(App $a) {
$init = $theme."_init"; $init = $theme."_init";
if(function_exists($init)) $init($a); if (function_exists($init)) {
if(function_exists("theme_admin_post")) { $init($a);
}
if (function_exists("theme_admin_post")) {
$admin_form = theme_admin_post($a); $admin_form = theme_admin_post($a);
} }
@ -90,8 +94,9 @@ function admin_post(App $a) {
__call_theme_admin_post($a, $theme); __call_theme_admin_post($a, $theme);
} }
info(t('Theme settings updated.')); info(t('Theme settings updated.'));
if(is_ajax()) return; if (is_ajax()) {
return;
}
goaway('admin/themes/'.$theme); goaway('admin/themes/'.$theme);
return; return;
break; break;
@ -130,7 +135,7 @@ function admin_post(App $a) {
*/ */
function admin_content(App $a) { function admin_content(App $a) {
if(!is_site_admin()) { if (!is_site_admin()) {
return login(false); return login(false);
} }
@ -168,7 +173,7 @@ function admin_content(App $a) {
$r = q("SELECT `name` FROM `addon` WHERE `plugin_admin` = 1 ORDER BY `name`"); $r = q("SELECT `name` FROM `addon` WHERE `plugin_admin` = 1 ORDER BY `name`");
$aside_tools['plugins_admin']=array(); $aside_tools['plugins_admin']=array();
foreach ($r as $h){ foreach ($r as $h) {
$plugin =$h['name']; $plugin =$h['name'];
$aside_tools['plugins_admin'][] = array("admin/plugins/".$plugin, $plugin, "plugin"); $aside_tools['plugins_admin'][] = array("admin/plugins/".$plugin, $plugin, "plugin");
// temp plugins with admin // temp plugins with admin
@ -199,8 +204,8 @@ function admin_content(App $a) {
*/ */
$o = ''; $o = '';
// urls // urls
if($a->argc > 1) { if ($a->argc > 1) {
switch ($a->argv[1]){ switch ($a->argv[1]) {
case 'site': case 'site':
$o = admin_page_site($a); $o = admin_page_site($a);
break; break;
@ -238,7 +243,7 @@ function admin_content(App $a) {
$o = admin_page_summary($a); $o = admin_page_summary($a);
} }
if(is_ajax()) { if (is_ajax()) {
echo $o; echo $o;
killme(); killme();
return ''; return '';
@ -270,8 +275,8 @@ function admin_page_federation(App $a) {
// off one % two of them are needed in the query // off one % two of them are needed in the query
// Add more platforms if you like, when one returns 0 known nodes it is not // Add more platforms if you like, when one returns 0 known nodes it is not
// displayed on the stats page. // displayed on the stats page.
$platforms = array('Friendica', 'Diaspora', '%%red%%', 'Hubzilla', 'BlaBlaNet', 'GNU Social', 'StatusNet', 'Mastodon'); $platforms = array('Friendi%%a', 'Diaspora', '%%red%%', 'Hubzilla', 'BlaBlaNet', 'GNU Social', 'StatusNet', 'Mastodon');
$colors = array('Friendica' => '#ffc018', // orange from the logo $colors = array('Friendi%%a' => '#ffc018', // orange from the logo
'Diaspora' => '#a1a1a1', // logo is black and white, makes a gray 'Diaspora' => '#a1a1a1', // logo is black and white, makes a gray
'%%red%%' => '#c50001', // fire red from the logo '%%red%%' => '#c50001', // fire red from the logo
'Hubzilla' => '#43488a', // blue from the logo 'Hubzilla' => '#43488a', // blue from the logo
@ -310,19 +315,21 @@ function admin_page_federation(App $a) {
// in the DB the Diaspora versions have the format x.x.x.x-xx the last // in the DB the Diaspora versions have the format x.x.x.x-xx the last
// part (-xx) should be removed to clean up the versions from the "head // part (-xx) should be removed to clean up the versions from the "head
// commit" information and combined into a single entry for x.x.x.x // commit" information and combined into a single entry for x.x.x.x
if($p=='Diaspora') { if ($p == 'Diaspora') {
$newV = array(); $newV = array();
$newVv = array(); $newVv = array();
foreach($v as $vv) { foreach ($v as $vv) {
$newVC = $vv['total']; $newVC = $vv['total'];
$newVV = $vv['version']; $newVV = $vv['version'];
$posDash = strpos($newVV, '-'); $posDash = strpos($newVV, '-');
if($posDash) if ($posDash) {
$newVV = substr($newVV, 0, $posDash); $newVV = substr($newVV, 0, $posDash);
if(isset($newV[$newVV])) }
if (isset($newV[$newVV])) {
$newV[$newVV] += $newVC; $newV[$newVV] += $newVC;
else } else {
$newV[$newVV] = $newVC; $newV[$newVV] = $newVC;
}
} }
foreach ($newV as $key => $value) { foreach ($newV as $key => $value) {
array_push($newVv, array('total'=>$value, 'version'=>$key)); array_push($newVv, array('total'=>$value, 'version'=>$key));
@ -333,7 +340,7 @@ function admin_page_federation(App $a) {
// early friendica versions have the format x.x.xxxx where xxxx is the // early friendica versions have the format x.x.xxxx where xxxx is the
// DB version stamp; those should be operated out and versions be // DB version stamp; those should be operated out and versions be
// conbined // conbined
if($p=='Friendica') { if ($p == 'Friendi%%a') {
$newV = array(); $newV = array();
$newVv = array(); $newVv = array();
foreach ($v as $vv) { foreach ($v as $vv) {
@ -341,12 +348,14 @@ function admin_page_federation(App $a) {
$newVV = $vv['version']; $newVV = $vv['version'];
$lastDot = strrpos($newVV,'.'); $lastDot = strrpos($newVV,'.');
$len = strlen($newVV)-1; $len = strlen($newVV)-1;
if(($lastDot == $len-4) && (!strrpos($newVV,'-rc')==$len-3)) if (($lastDot == $len-4) && (!strrpos($newVV,'-rc') == $len-3)) {
$newVV = substr($newVV, 0, $lastDot); $newVV = substr($newVV, 0, $lastDot);
if(isset($newV[$newVV])) }
if (isset($newV[$newVV])) {
$newV[$newVV] += $newVC; $newV[$newVV] += $newVC;
else } else {
$newV[$newVV] = $newVC; $newV[$newVV] = $newVC;
}
} }
foreach ($newV as $key => $value) { foreach ($newV as $key => $value) {
array_push($newVv, array('total'=>$value, 'version'=>$key)); array_push($newVv, array('total'=>$value, 'version'=>$key));
@ -455,7 +464,10 @@ function admin_page_summary(App $a) {
); );
$users=0; $users=0;
foreach ($r as $u){ $accounts[$u['page-flags']][1] = $u['count']; $users+= $u['count']; } foreach ($r as $u) {
$accounts[$u['page-flags']][1] = $u['count'];
$users+= $u['count'];
}
logger('accounts: '.print_r($accounts,true),LOGGER_DATA); logger('accounts: '.print_r($accounts,true),LOGGER_DATA);
@ -468,12 +480,8 @@ function admin_page_summary(App $a) {
$r = qu("SELECT COUNT(*) AS `total` FROM `queue` WHERE 1"); $r = qu("SELECT COUNT(*) AS `total` FROM `queue` WHERE 1");
$queue = (($r) ? $r[0]['total'] : 0); $queue = (($r) ? $r[0]['total'] : 0);
if (get_config('system','worker')) { $r = qu("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE 1");
$r = qu("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE 1"); $workerqueue = (($r) ? $r[0]['total'] : 0);
$workerqueue = (($r) ? $r[0]['total'] : 0);
} else {
$workerqueue = 0;
}
// We can do better, but this is a quick queue status // We can do better, but this is a quick queue status
@ -485,7 +493,6 @@ function admin_page_summary(App $a) {
'$title' => t('Administration'), '$title' => t('Administration'),
'$page' => t('Summary'), '$page' => t('Summary'),
'$queues' => $queues, '$queues' => $queues,
'$workeractive' => get_config('system','worker'),
'$users' => array(t('Registered users'), $users), '$users' => array(t('Registered users'), $users),
'$accounts' => $accounts, '$accounts' => $accounts,
'$pending' => array(t('Pending registrations'), $pending), '$pending' => array(t('Pending registrations'), $pending),
@ -506,19 +513,19 @@ function admin_page_summary(App $a) {
* @param App $a * @param App $a
*/ */
function admin_page_site_post(App $a) { function admin_page_site_post(App $a) {
if(!x($_POST,"page_site")) { if (!x($_POST,"page_site")) {
return; return;
} }
check_form_security_token_redirectOnErr('/admin/site', 'admin_site'); check_form_security_token_redirectOnErr('/admin/site', 'admin_site');
// relocate // relocate
if(x($_POST,'relocate') && x($_POST,'relocate_url') && $_POST['relocate_url']!="") { if (x($_POST,'relocate') && x($_POST,'relocate_url') && $_POST['relocate_url'] != "") {
$new_url = $_POST['relocate_url']; $new_url = $_POST['relocate_url'];
$new_url = rtrim($new_url,"/"); $new_url = rtrim($new_url,"/");
$parsed = @parse_url($new_url); $parsed = @parse_url($new_url);
if(!$parsed || (!x($parsed,'host') || !x($parsed,'scheme'))) { if (!$parsed || (!x($parsed,'host') || !x($parsed,'scheme'))) {
notice(t("Can not parse base url. Must have at least <scheme>://<domain>")); notice(t("Can not parse base url. Must have at least <scheme>://<domain>"));
goaway('admin/site'); goaway('admin/site');
} }
@ -551,7 +558,7 @@ function admin_page_site_post(App $a) {
$q = sprintf("UPDATE %s SET %s;", $table_name, $upds); $q = sprintf("UPDATE %s SET %s;", $table_name, $upds);
$r = q($q); $r = q($q);
if(!$r) { if (!$r) {
notice("Failed updating '$table_name': ".$db->error); notice("Failed updating '$table_name': ".$db->error);
goaway('admin/site'); goaway('admin/site');
} }
@ -622,7 +629,6 @@ function admin_page_site_post(App $a) {
$no_multi_reg = ((x($_POST,'no_multi_reg')) ? True : False); $no_multi_reg = ((x($_POST,'no_multi_reg')) ? True : False);
$no_openid = !((x($_POST,'no_openid')) ? True : False); $no_openid = !((x($_POST,'no_openid')) ? True : False);
$no_regfullname = !((x($_POST,'no_regfullname')) ? True : False); $no_regfullname = !((x($_POST,'no_regfullname')) ? True : False);
$no_utf = !((x($_POST,'no_utf')) ? True : False);
$community_page_style = ((x($_POST,'community_page_style')) ? intval(trim($_POST['community_page_style'])) : 0); $community_page_style = ((x($_POST,'community_page_style')) ? intval(trim($_POST['community_page_style'])) : 0);
$max_author_posts_community_page = ((x($_POST,'max_author_posts_community_page')) ? intval(trim($_POST['max_author_posts_community_page'])) : 0); $max_author_posts_community_page = ((x($_POST,'max_author_posts_community_page')) ? intval(trim($_POST['max_author_posts_community_page'])) : 0);
@ -630,8 +636,6 @@ function admin_page_site_post(App $a) {
$proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['proxyuser'])) : ''); $proxyuser = ((x($_POST,'proxyuser')) ? notags(trim($_POST['proxyuser'])) : '');
$proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : ''); $proxy = ((x($_POST,'proxy')) ? notags(trim($_POST['proxy'])) : '');
$timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60); $timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60);
$delivery_interval = ((x($_POST,'delivery_interval')) ? intval(trim($_POST['delivery_interval'])) : 0);
$poll_interval = ((x($_POST,'poll_interval')) ? intval(trim($_POST['poll_interval'])) : 0);
$maxloadavg = ((x($_POST,'maxloadavg')) ? intval(trim($_POST['maxloadavg'])) : 50); $maxloadavg = ((x($_POST,'maxloadavg')) ? intval(trim($_POST['maxloadavg'])) : 50);
$maxloadavg_frontend = ((x($_POST,'maxloadavg_frontend')) ? intval(trim($_POST['maxloadavg_frontend'])) : 50); $maxloadavg_frontend = ((x($_POST,'maxloadavg_frontend')) ? intval(trim($_POST['maxloadavg_frontend'])) : 50);
$optimize_max_tablesize = ((x($_POST,'optimize_max_tablesize')) ? intval(trim($_POST['optimize_max_tablesize'])): 100); $optimize_max_tablesize = ((x($_POST,'optimize_max_tablesize')) ? intval(trim($_POST['optimize_max_tablesize'])): 100);
@ -655,28 +659,25 @@ function admin_page_site_post(App $a) {
$itemcache = ((x($_POST,'itemcache')) ? notags(trim($_POST['itemcache'])) : ''); $itemcache = ((x($_POST,'itemcache')) ? notags(trim($_POST['itemcache'])) : '');
$itemcache_duration = ((x($_POST,'itemcache_duration')) ? intval($_POST['itemcache_duration']) : 0); $itemcache_duration = ((x($_POST,'itemcache_duration')) ? intval($_POST['itemcache_duration']) : 0);
$max_comments = ((x($_POST,'max_comments')) ? intval($_POST['max_comments']) : 0); $max_comments = ((x($_POST,'max_comments')) ? intval($_POST['max_comments']) : 0);
$lockpath = ((x($_POST,'lockpath')) ? notags(trim($_POST['lockpath'])) : '');
$temppath = ((x($_POST,'temppath')) ? notags(trim($_POST['temppath'])) : ''); $temppath = ((x($_POST,'temppath')) ? notags(trim($_POST['temppath'])) : '');
$basepath = ((x($_POST,'basepath')) ? notags(trim($_POST['basepath'])) : ''); $basepath = ((x($_POST,'basepath')) ? notags(trim($_POST['basepath'])) : '');
$singleuser = ((x($_POST,'singleuser')) ? notags(trim($_POST['singleuser'])) : ''); $singleuser = ((x($_POST,'singleuser')) ? notags(trim($_POST['singleuser'])) : '');
$proxy_disabled = ((x($_POST,'proxy_disabled')) ? True : False); $proxy_disabled = ((x($_POST,'proxy_disabled')) ? True : False);
$only_tag_search = ((x($_POST,'only_tag_search')) ? True : False); $only_tag_search = ((x($_POST,'only_tag_search')) ? True : False);
$rino = ((x($_POST,'rino')) ? intval($_POST['rino']) : 0); $rino = ((x($_POST,'rino')) ? intval($_POST['rino']) : 0);
$embedly = ((x($_POST,'embedly')) ? notags(trim($_POST['embedly'])) : '');
$worker = ((x($_POST,'worker')) ? True : False);
$worker_queues = ((x($_POST,'worker_queues')) ? intval($_POST['worker_queues']) : 4); $worker_queues = ((x($_POST,'worker_queues')) ? intval($_POST['worker_queues']) : 4);
$worker_dont_fork = ((x($_POST,'worker_dont_fork')) ? True : False); $worker_dont_fork = ((x($_POST,'worker_dont_fork')) ? True : False);
$worker_fastlane = ((x($_POST,'worker_fastlane')) ? True : False); $worker_fastlane = ((x($_POST,'worker_fastlane')) ? True : False);
$worker_frontend = ((x($_POST,'worker_frontend')) ? True : False); $worker_frontend = ((x($_POST,'worker_frontend')) ? True : False);
if($a->get_path() != "") if ($a->get_path() != "") {
$diaspora_enabled = false; $diaspora_enabled = false;
}
if(!$thread_allow) if (!$thread_allow) {
$ostatus_disabled = true; $ostatus_disabled = true;
}
if($ssl_policy != intval(get_config('system','ssl_policy'))) { if ($ssl_policy != intval(get_config('system','ssl_policy'))) {
if($ssl_policy == SSL_POLICY_FULL) { if ($ssl_policy == SSL_POLICY_FULL) {
q("UPDATE `contact` SET q("UPDATE `contact` SET
`url` = REPLACE(`url` , 'http:' , 'https:'), `url` = REPLACE(`url` , 'http:' , 'https:'),
`photo` = REPLACE(`photo` , 'http:' , 'https:'), `photo` = REPLACE(`photo` , 'http:' , 'https:'),
@ -694,8 +695,7 @@ function admin_page_site_post(App $a) {
`thumb` = REPLACE(`thumb` , 'http:' , 'https:') `thumb` = REPLACE(`thumb` , 'http:' , 'https:')
WHERE 1 " WHERE 1 "
); );
} } elseif ($ssl_policy == SSL_POLICY_SELFSIGN) {
elseif($ssl_policy == SSL_POLICY_SELFSIGN) {
q("UPDATE `contact` SET q("UPDATE `contact` SET
`url` = REPLACE(`url` , 'https:' , 'http:'), `url` = REPLACE(`url` , 'https:' , 'http:'),
`photo` = REPLACE(`photo` , 'https:' , 'http:'), `photo` = REPLACE(`photo` , 'https:' , 'http:'),
@ -716,8 +716,6 @@ function admin_page_site_post(App $a) {
} }
} }
set_config('system','ssl_policy',$ssl_policy); set_config('system','ssl_policy',$ssl_policy);
set_config('system','delivery_interval',$delivery_interval);
set_config('system','poll_interval',$poll_interval);
set_config('system','maxloadavg',$maxloadavg); set_config('system','maxloadavg',$maxloadavg);
set_config('system','maxloadavg_frontend',$maxloadavg_frontend); set_config('system','maxloadavg_frontend',$maxloadavg_frontend);
set_config('system','optimize_max_tablesize',$optimize_max_tablesize); set_config('system','optimize_max_tablesize',$optimize_max_tablesize);
@ -735,7 +733,7 @@ function admin_page_site_post(App $a) {
set_config('system','shortcut_icon',$shortcut_icon); set_config('system','shortcut_icon',$shortcut_icon);
set_config('system','touch_icon',$touch_icon); set_config('system','touch_icon',$touch_icon);
if($banner=="") { if ($banner == "") {
// don't know why, but del_config doesn't work... // don't know why, but del_config doesn't work...
q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1", q("DELETE FROM `config` WHERE `cat` = '%s' AND `k` = '%s' LIMIT 1",
dbesc("system"), dbesc("system"),
@ -745,7 +743,7 @@ function admin_page_site_post(App $a) {
set_config('system','banner', $banner); set_config('system','banner', $banner);
} }
if($info=="") { if ($info == "") {
del_config('config','info'); del_config('config','info');
} else { } else {
set_config('config','info',$info); set_config('config','info',$info);
@ -753,12 +751,12 @@ function admin_page_site_post(App $a) {
set_config('system','language', $language); set_config('system','language', $language);
set_config('system','theme', $theme); set_config('system','theme', $theme);
if($theme_mobile === '---') { if ($theme_mobile === '---') {
del_config('system','mobile-theme'); del_config('system','mobile-theme');
} else { } else {
set_config('system','mobile-theme', $theme_mobile); set_config('system','mobile-theme', $theme_mobile);
} }
if($singleuser === '---') { if ($singleuser === '---') {
del_config('system','singleuser'); del_config('system','singleuser');
} else { } else {
set_config('system','singleuser', $singleuser); set_config('system','singleuser', $singleuser);
@ -787,7 +785,6 @@ function admin_page_site_post(App $a) {
set_config('system','no_regfullname', $no_regfullname); set_config('system','no_regfullname', $no_regfullname);
set_config('system','community_page_style', $community_page_style); set_config('system','community_page_style', $community_page_style);
set_config('system','max_author_posts_community_page', $max_author_posts_community_page); set_config('system','max_author_posts_community_page', $max_author_posts_community_page);
set_config('system','no_utf', $no_utf);
set_config('system','verifyssl', $verifyssl); set_config('system','verifyssl', $verifyssl);
set_config('system','proxyuser', $proxyuser); set_config('system','proxyuser', $proxyuser);
set_config('system','proxy', $proxy); set_config('system','proxy', $proxy);
@ -806,26 +803,21 @@ function admin_page_site_post(App $a) {
set_config('system','itemcache', $itemcache); set_config('system','itemcache', $itemcache);
set_config('system','itemcache_duration', $itemcache_duration); set_config('system','itemcache_duration', $itemcache_duration);
set_config('system','max_comments', $max_comments); set_config('system','max_comments', $max_comments);
set_config('system','lockpath', $lockpath);
set_config('system','temppath', $temppath); set_config('system','temppath', $temppath);
set_config('system','basepath', $basepath); set_config('system','basepath', $basepath);
set_config('system','proxy_disabled', $proxy_disabled); set_config('system','proxy_disabled', $proxy_disabled);
set_config('system','only_tag_search', $only_tag_search); set_config('system','only_tag_search', $only_tag_search);
set_config('system','worker', $worker);
set_config('system','worker_queues', $worker_queues); set_config('system','worker_queues', $worker_queues);
set_config('system','worker_dont_fork', $worker_dont_fork); set_config('system','worker_dont_fork', $worker_dont_fork);
set_config('system','worker_fastlane', $worker_fastlane); set_config('system','worker_fastlane', $worker_fastlane);
set_config('system','frontend_worker', $worker_frontend); set_config('system','frontend_worker', $worker_frontend);
if($rino==2 and !function_exists('mcrypt_create_iv')) { if (($rino == 2) and !function_exists('mcrypt_create_iv')) {
notice(t("RINO2 needs mcrypt php extension to work.")); notice(t("RINO2 needs mcrypt php extension to work."));
} else { } else {
set_config('system','rino_encrypt', $rino); set_config('system','rino_encrypt', $rino);
} }
set_config('system','embedly', $embedly);
info(t('Site settings updated.').EOL); info(t('Site settings updated.').EOL);
goaway('admin/site'); goaway('admin/site');
return; // NOTREACHED return; // NOTREACHED
@ -845,7 +837,7 @@ function admin_page_site(App $a) {
/* Installed langs */ /* Installed langs */
$lang_choices = get_available_languages(); $lang_choices = get_available_languages();
if(strlen(get_config('system','directory_submit_url')) AND if (strlen(get_config('system','directory_submit_url')) AND
!strlen(get_config('system','directory'))) { !strlen(get_config('system','directory'))) {
set_config('system','directory', dirname(get_config('system','directory_submit_url'))); set_config('system','directory', dirname(get_config('system','directory_submit_url')));
del_config('system','directory_submit_url'); del_config('system','directory_submit_url');
@ -856,12 +848,12 @@ function admin_page_site(App $a) {
$theme_choices_mobile = array(); $theme_choices_mobile = array();
$theme_choices_mobile["---"] = t("No special theme for mobile devices"); $theme_choices_mobile["---"] = t("No special theme for mobile devices");
$files = glob('view/theme/*'); $files = glob('view/theme/*');
if($files) { if ($files) {
$allowed_theme_list = Config::get('system', 'allowed_themes'); $allowed_theme_list = Config::get('system', 'allowed_themes');
foreach($files as $file) { foreach ($files as $file) {
if(intval(file_exists($file.'/unsupported'))) if (intval(file_exists($file.'/unsupported')))
continue; continue;
$f = basename($file); $f = basename($file);
@ -873,7 +865,7 @@ function admin_page_site(App $a) {
$theme_name = ((file_exists($file.'/experimental')) ? sprintf("%s - \x28Experimental\x29", $f) : $f); $theme_name = ((file_exists($file.'/experimental')) ? sprintf("%s - \x28Experimental\x29", $f) : $f);
if(file_exists($file.'/mobile')) { if (file_exists($file.'/mobile')) {
$theme_choices_mobile[$f] = $theme_name; $theme_choices_mobile[$f] = $theme_name;
} else { } else {
$theme_choices[$f] = $theme_name; $theme_choices[$f] = $theme_name;
@ -922,15 +914,15 @@ function admin_page_site(App $a) {
/* Banner */ /* Banner */
$banner = get_config('system','banner'); $banner = get_config('system','banner');
if($banner == false) if ($banner == false) {
$banner = '<a href="http://friendica.com"><img id="logo-img" src="images/friendica-32.png" alt="logo" /></a><span id="logo-text"><a href="http://friendica.com">Friendica</a></span>'; $banner = '<a href="http://friendica.com"><img id="logo-img" src="images/friendica-32.png" alt="logo" /></a><span id="logo-text"><a href="http://friendica.com">Friendica</a></span>';
}
$banner = htmlspecialchars($banner); $banner = htmlspecialchars($banner);
$info = get_config('config','info'); $info = get_config('config','info');
$info = htmlspecialchars($info); $info = htmlspecialchars($info);
// Automatically create temporary paths // Automatically create temporary paths
get_temppath(); get_temppath();
get_lockpath();
get_itemcachepath(); get_itemcachepath();
//echo "<pre>"; var_dump($lang_choices); die("</pre>"); //echo "<pre>"; var_dump($lang_choices); die("</pre>");
@ -948,9 +940,9 @@ function admin_page_site(App $a) {
SSL_POLICY_SELFSIGN => t("Self-signed certificate, use SSL for local links only (discouraged)") SSL_POLICY_SELFSIGN => t("Self-signed certificate, use SSL for local links only (discouraged)")
); );
if($a->config['hostname'] == "") if ($a->config['hostname'] == "") {
$a->config['hostname'] = $a->get_hostname(); $a->config['hostname'] = $a->get_hostname();
}
$diaspora_able = ($a->get_path() == ""); $diaspora_able = ($a->get_path() == "");
$optimize_max_tablesize = Config::get('system','optimize_max_tablesize', 100); $optimize_max_tablesize = Config::get('system','optimize_max_tablesize', 100);
@ -1014,7 +1006,6 @@ function admin_page_site(App $a) {
'$no_multi_reg' => array('no_multi_reg', t("Block multiple registrations"), get_config('system','block_extended_register'), t("Disallow users to register additional accounts for use as pages.")), '$no_multi_reg' => array('no_multi_reg', t("Block multiple registrations"), get_config('system','block_extended_register'), t("Disallow users to register additional accounts for use as pages.")),
'$no_openid' => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), t("OpenID support for registration and logins.")), '$no_openid' => array('no_openid', t("OpenID support"), !get_config('system','no_openid'), t("OpenID support for registration and logins.")),
'$no_regfullname' => array('no_regfullname', t("Fullname check"), !get_config('system','no_regfullname'), t("Force users to register with a space between firstname and lastname in Full name, as an antispam measure")), '$no_regfullname' => array('no_regfullname', t("Fullname check"), !get_config('system','no_regfullname'), t("Force users to register with a space between firstname and lastname in Full name, as an antispam measure")),
'$no_utf' => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), t("Use PHP UTF8 regular expressions")),
'$community_page_style' => array('community_page_style', t("Community Page Style"), get_config('system','community_page_style'), t("Type of community page to show. 'Global community' shows every public posting from an open distributed network that arrived on this server."), $community_page_style_choices), '$community_page_style' => array('community_page_style', t("Community Page Style"), get_config('system','community_page_style'), t("Type of community page to show. 'Global community' shows every public posting from an open distributed network that arrived on this server."), $community_page_style_choices),
'$max_author_posts_community_page' => array('max_author_posts_community_page', t("Posts per user on community page"), get_config('system','max_author_posts_community_page'), t("The maximum number of posts per user on the community page. (Not valid for 'Global Community')")), '$max_author_posts_community_page' => array('max_author_posts_community_page', t("Posts per user on community page"), get_config('system','max_author_posts_community_page'), t("The maximum number of posts per user on the community page. (Not valid for 'Global Community')")),
'$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disabled'), t("Provide built-in OStatus \x28StatusNet, GNU Social etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")), '$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disabled'), t("Provide built-in OStatus \x28StatusNet, GNU Social etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")),
@ -1029,8 +1020,6 @@ function admin_page_site(App $a) {
'$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""), '$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),
'$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""), '$proxy' => array('proxy', t("Proxy URL"), get_config('system','proxy'), ""),
'$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")), '$timeout' => array('timeout', t("Network timeout"), (x(get_config('system','curl_timeout'))?get_config('system','curl_timeout'):60), t("Value is in seconds. Set to 0 for unlimited (not recommended).")),
'$delivery_interval' => array('delivery_interval', t("Delivery interval"), (x(get_config('system','delivery_interval'))?get_config('system','delivery_interval'):2), t("Delay background delivery processes by this many seconds to reduce system load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 for large dedicated servers.")),
'$poll_interval' => array('poll_interval', t("Poll interval"), (x(get_config('system','poll_interval'))?get_config('system','poll_interval'):2), t("Delay background polling processes by this many seconds to reduce system load. If 0, use delivery interval.")),
'$maxloadavg' => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")), '$maxloadavg' => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")),
'$maxloadavg_frontend' => array('maxloadavg_frontend', t("Maximum Load Average (Frontend)"), ((intval(get_config('system','maxloadavg_frontend')) > 0)?get_config('system','maxloadavg_frontend'):50), t("Maximum system load before the frontend quits service - default 50.")), '$maxloadavg_frontend' => array('maxloadavg_frontend', t("Maximum Load Average (Frontend)"), ((intval(get_config('system','maxloadavg_frontend')) > 0)?get_config('system','maxloadavg_frontend'):50), t("Maximum system load before the frontend quits service - default 50.")),
'$optimize_max_tablesize'=> array('optimize_max_tablesize', t("Maximum table size for optimization"), $optimize_max_tablesize, t("Maximum table size (in MB) for the automatic optimization - default 100 MB. Enter -1 to disable it.")), '$optimize_max_tablesize'=> array('optimize_max_tablesize', t("Maximum table size for optimization"), $optimize_max_tablesize, t("Maximum table size (in MB) for the automatic optimization - default 100 MB. Enter -1 to disable it.")),
@ -1049,7 +1038,6 @@ function admin_page_site(App $a) {
'$itemcache' => array('itemcache', t("Path to item cache"), get_config('system','itemcache'), t("The item caches buffers generated bbcode and external images.")), '$itemcache' => array('itemcache', t("Path to item cache"), get_config('system','itemcache'), t("The item caches buffers generated bbcode and external images.")),
'$itemcache_duration' => array('itemcache_duration', t("Cache duration in seconds"), get_config('system','itemcache_duration'), t("How long should the cache files be hold? Default value is 86400 seconds (One day). To disable the item cache, set the value to -1.")), '$itemcache_duration' => array('itemcache_duration', t("Cache duration in seconds"), get_config('system','itemcache_duration'), t("How long should the cache files be hold? Default value is 86400 seconds (One day). To disable the item cache, set the value to -1.")),
'$max_comments' => array('max_comments', t("Maximum numbers of comments per post"), get_config('system','max_comments'), t("How much comments should be shown for each post? Default value is 100.")), '$max_comments' => array('max_comments', t("Maximum numbers of comments per post"), get_config('system','max_comments'), t("How much comments should be shown for each post? Default value is 100.")),
'$lockpath' => array('lockpath', t("Path for lock file"), get_config('system','lockpath'), t("The lock file is used to avoid multiple pollers at one time. Only define a folder here.")),
'$temppath' => array('temppath', t("Temp path"), get_config('system','temppath'), t("If you have a restricted system where the webserver can't access the system temp path, enter another path here.")), '$temppath' => array('temppath', t("Temp path"), get_config('system','temppath'), t("If you have a restricted system where the webserver can't access the system temp path, enter another path here.")),
'$basepath' => array('basepath', t("Base path to installation"), get_config('system','basepath'), t("If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot.")), '$basepath' => array('basepath', t("Base path to installation"), get_config('system','basepath'), t("If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot.")),
'$proxy_disabled' => array('proxy_disabled', t("Disable picture proxy"), get_config('system','proxy_disabled'), t("The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwith.")), '$proxy_disabled' => array('proxy_disabled', t("Disable picture proxy"), get_config('system','proxy_disabled'), t("The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwith.")),
@ -1058,9 +1046,7 @@ function admin_page_site(App $a) {
'$relocate_url' => array('relocate_url', t("New base url"), App::get_baseurl(), t("Change base url for this server. Sends relocate message to all DFRN contacts of all users.")), '$relocate_url' => array('relocate_url', t("New base url"), App::get_baseurl(), t("Change base url for this server. Sends relocate message to all DFRN contacts of all users.")),
'$rino' => array('rino', t("RINO Encryption"), intval(get_config('system','rino_encrypt')), t("Encryption layer between nodes."), array("Disabled", "RINO1 (deprecated)", "RINO2")), '$rino' => array('rino', t("RINO Encryption"), intval(get_config('system','rino_encrypt')), t("Encryption layer between nodes."), array("Disabled", "RINO1 (deprecated)", "RINO2")),
'$embedly' => array('embedly', t("Embedly API key"), get_config('system','embedly'), t("<a href='http://embed.ly'>Embedly</a> is used to fetch additional data for web pages. This is an optional parameter.")),
'$worker' => array('worker', t("Enable 'worker' background processing"), get_config('system','worker'), t("The worker background processing limits the number of parallel background jobs to a maximum number and respects the system load.")),
'$worker_queues' => array('worker_queues', t("Maximum number of parallel workers"), get_config('system','worker_queues'), t("On shared hosters set this to 2. On larger systems, values of 10 are great. Default value is 4.")), '$worker_queues' => array('worker_queues', t("Maximum number of parallel workers"), get_config('system','worker_queues'), t("On shared hosters set this to 2. On larger systems, values of 10 are great. Default value is 4.")),
'$worker_dont_fork' => array('worker_dont_fork', t("Don't use 'proc_open' with the worker"), get_config('system','worker_dont_fork'), t("Enable this if your system doesn't allow the use of 'proc_open'. This can happen on shared hosters. If this is enabled you should increase the frequency of poller calls in your crontab.")), '$worker_dont_fork' => array('worker_dont_fork', t("Don't use 'proc_open' with the worker"), get_config('system','worker_dont_fork'), t("Enable this if your system doesn't allow the use of 'proc_open'. This can happen on shared hosters. If this is enabled you should increase the frequency of poller calls in your crontab.")),
'$worker_fastlane' => array('worker_fastlane', t("Enable fastlane"), get_config('system','worker_fastlane'), t("When enabed, the fastlane mechanism starts an additional worker if processes with higher priority are blocked by processes of lower priority.")), '$worker_fastlane' => array('worker_fastlane', t("Enable fastlane"), get_config('system','worker_fastlane'), t("When enabed, the fastlane mechanism starts an additional worker if processes with higher priority are blocked by processes of lower priority.")),
@ -1088,42 +1074,45 @@ function admin_page_dbsync(App $a) {
$o = ''; $o = '';
if($a->argc > 3 && intval($a->argv[3]) && $a->argv[2] === 'mark') { if ($a->argc > 3 && intval($a->argv[3]) && $a->argv[2] === 'mark') {
set_config('database', 'update_'.intval($a->argv[3]), 'success'); set_config('database', 'update_'.intval($a->argv[3]), 'success');
$curr = get_config('system','build'); $curr = get_config('system','build');
if(intval($curr) == intval($a->argv[3])) if (intval($curr) == intval($a->argv[3])) {
set_config('system','build',intval($curr) + 1); set_config('system','build',intval($curr) + 1);
}
info(t('Update has been marked successful').EOL); info(t('Update has been marked successful').EOL);
goaway('admin/dbsync'); goaway('admin/dbsync');
} }
if(($a->argc > 2) AND (intval($a->argv[2]) OR ($a->argv[2] === 'check'))) { if (($a->argc > 2) AND (intval($a->argv[2]) OR ($a->argv[2] === 'check'))) {
require_once("include/dbstructure.php"); require_once("include/dbstructure.php");
$retval = update_structure(false, true); $retval = update_structure(false, true);
if(!$retval) { if (!$retval) {
$o .= sprintf(t("Database structure update %s was successfully applied."), DB_UPDATE_VERSION)."<br />"; $o .= sprintf(t("Database structure update %s was successfully applied."), DB_UPDATE_VERSION)."<br />";
set_config('database', 'dbupdate_'.DB_UPDATE_VERSION, 'success'); set_config('database', 'dbupdate_'.DB_UPDATE_VERSION, 'success');
} else } else {
$o .= sprintf(t("Executing of database structure update %s failed with error: %s"), $o .= sprintf(t("Executing of database structure update %s failed with error: %s"),
DB_UPDATE_VERSION, $retval)."<br />"; DB_UPDATE_VERSION, $retval)."<br />";
if($a->argv[2] === 'check') }
if ($a->argv[2] === 'check') {
return $o; return $o;
}
} }
if($a->argc > 2 && intval($a->argv[2])) { if ($a->argc > 2 && intval($a->argv[2])) {
require_once('update.php'); require_once('update.php');
$func = 'update_'.intval($a->argv[2]); $func = 'update_'.intval($a->argv[2]);
if(function_exists($func)) { if (function_exists($func)) {
$retval = $func(); $retval = $func();
if($retval === UPDATE_FAILED) { if ($retval === UPDATE_FAILED) {
$o .= sprintf(t("Executing %s failed with error: %s"), $func, $retval); $o .= sprintf(t("Executing %s failed with error: %s"), $func, $retval);
} }
elseif($retval === UPDATE_SUCCESS) { elseif ($retval === UPDATE_SUCCESS) {
$o .= sprintf(t('Update %s was successfully applied.', $func)); $o .= sprintf(t('Update %s was successfully applied.', $func));
set_config('database',$func, 'success'); set_config('database',$func, 'success');
} } else {
else
$o .= sprintf(t('Update %s did not return a status. Unknown if it succeeded.'), $func); $o .= sprintf(t('Update %s did not return a status. Unknown if it succeeded.'), $func);
}
} else { } else {
$o .= sprintf(t('There was no additional update function %s that needed to be called.'), $func)."<br />"; $o .= sprintf(t('There was no additional update function %s that needed to be called.'), $func)."<br />";
set_config('database',$func, 'success'); set_config('database',$func, 'success');
@ -1136,8 +1125,9 @@ function admin_page_dbsync(App $a) {
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
foreach ($r as $rr) { foreach ($r as $rr) {
$upd = intval(substr($rr['k'],7)); $upd = intval(substr($rr['k'],7));
if($upd < 1139 || $rr['v'] === 'success') if ($upd < 1139 || $rr['v'] === 'success') {
continue; continue;
}
$failed[] = $upd; $failed[] = $upd;
} }
} }
@ -1177,7 +1167,7 @@ function admin_page_users_post(App $a) {
check_form_security_token_redirectOnErr('/admin/users', 'admin_users'); check_form_security_token_redirectOnErr('/admin/users', 'admin_users');
if (!($nu_name==="") && !($nu_email==="") && !($nu_nickname==="")) { if (!($nu_name === "") && !($nu_email === "") && !($nu_nickname === "")) {
require_once('include/user.php'); require_once('include/user.php');
$result = create_user(array('username'=>$nu_name, 'email'=>$nu_email, $result = create_user(array('username'=>$nu_name, 'email'=>$nu_email,
@ -1228,31 +1218,31 @@ function admin_page_users_post(App $a) {
} }
if(x($_POST,'page_users_block')) { if (x($_POST,'page_users_block')) {
foreach($users as $uid){ foreach ($users as $uid) {
q("UPDATE `user` SET `blocked` = 1-`blocked` WHERE `uid` = %s", q("UPDATE `user` SET `blocked` = 1-`blocked` WHERE `uid` = %s",
intval($uid) intval($uid)
); );
} }
notice(sprintf(tt("%s user blocked/unblocked", "%s users blocked/unblocked", count($users)), count($users))); notice(sprintf(tt("%s user blocked/unblocked", "%s users blocked/unblocked", count($users)), count($users)));
} }
if(x($_POST,'page_users_delete')) { if (x($_POST,'page_users_delete')) {
require_once("include/Contact.php"); require_once("include/Contact.php");
foreach($users as $uid){ foreach ($users as $uid) {
user_remove($uid); user_remove($uid);
} }
notice(sprintf(tt("%s user deleted", "%s users deleted", count($users)), count($users))); notice(sprintf(tt("%s user deleted", "%s users deleted", count($users)), count($users)));
} }
if(x($_POST,'page_users_approve')) { if (x($_POST,'page_users_approve')) {
require_once("mod/regmod.php"); require_once("mod/regmod.php");
foreach($pending as $hash){ foreach ($pending as $hash) {
user_allow($hash); user_allow($hash);
} }
} }
if(x($_POST,'page_users_deny')) { if (x($_POST,'page_users_deny')) {
require_once("mod/regmod.php"); require_once("mod/regmod.php");
foreach($pending as $hash){ foreach ($pending as $hash) {
user_deny($hash); user_deny($hash);
} }
} }
@ -1273,31 +1263,31 @@ function admin_page_users_post(App $a) {
* @return string * @return string
*/ */
function admin_page_users(App $a) { function admin_page_users(App $a) {
if($a->argc>2) { if ($a->argc>2) {
$uid = $a->argv[3]; $uid = $a->argv[3];
$user = q("SELECT `username`, `blocked` FROM `user` WHERE `uid` = %d", intval($uid)); $user = q("SELECT `username`, `blocked` FROM `user` WHERE `uid` = %d", intval($uid));
if(count($user)==0) { if (count($user) == 0) {
notice('User not found'.EOL); notice('User not found'.EOL);
goaway('admin/users'); goaway('admin/users');
return ''; // NOTREACHED return ''; // NOTREACHED
} }
switch($a->argv[2]){ switch($a->argv[2]) {
case "delete":{ case "delete":
check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't'); check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
// delete user // delete user
require_once("include/Contact.php"); require_once("include/Contact.php");
user_remove($uid); user_remove($uid);
notice(sprintf(t("User '%s' deleted"), $user[0]['username']).EOL); notice(sprintf(t("User '%s' deleted"), $user[0]['username']).EOL);
}; break; break;
case "block":{ case "block":
check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't'); check_form_security_token_redirectOnErr('/admin/users', 'admin_users', 't');
q("UPDATE `user` SET `blocked` = %d WHERE `uid` = %s", q("UPDATE `user` SET `blocked` = %d WHERE `uid` = %s",
intval(1-$user[0]['blocked']), intval(1-$user[0]['blocked']),
intval($uid) intval($uid)
); );
notice(sprintf(($user[0]['blocked']?t("User '%s' unblocked"):t("User '%s' blocked")) , $user[0]['username']).EOL); notice(sprintf(($user[0]['blocked']?t("User '%s' unblocked"):t("User '%s' blocked")) , $user[0]['username']).EOL);
}; break; break;
} }
goaway('admin/users'); goaway('admin/users');
return ''; // NOTREACHED return ''; // NOTREACHED
@ -1313,7 +1303,7 @@ function admin_page_users(App $a) {
/* get users */ /* get users */
$total = qu("SELECT COUNT(*) AS `total` FROM `user` WHERE 1"); $total = qu("SELECT COUNT(*) AS `total` FROM `user` WHERE 1");
if(count($total)) { if (count($total)) {
$a->set_pager_total($total[0]['total']); $a->set_pager_total($total[0]['total']);
$a->set_pager_itemspage(100); $a->set_pager_itemspage(100);
} }
@ -1330,22 +1320,22 @@ function admin_page_users(App $a) {
$order = "contact.name"; $order = "contact.name";
$order_direction = "+"; $order_direction = "+";
if (x($_GET,'o')){ if (x($_GET,'o')) {
$new_order = $_GET['o']; $new_order = $_GET['o'];
if ($new_order[0]==="-") { if ($new_order[0] === "-") {
$order_direction = "-"; $order_direction = "-";
$new_order = substr($new_order,1); $new_order = substr($new_order,1);
} }
if (in_array($new_order, $valid_orders)){ if (in_array($new_order, $valid_orders)) {
$order = $new_order; $order = $new_order;
} }
if (x($_GET,'d')){ if (x($_GET,'d')) {
$new_direction = $_GET['d']; $new_direction = $_GET['d'];
} }
} }
$sql_order = "`".str_replace('.','`.`',$order)."`"; $sql_order = "`".str_replace('.','`.`',$order)."`";
$sql_order_direction = ($order_direction==="+")?"ASC":"DESC"; $sql_order_direction = ($order_direction === "+")?"ASC":"DESC";
$users = qu("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date` $users = qu("SELECT `user`.*, `contact`.`name`, `contact`.`url`, `contact`.`micro`, `user`.`account_expired`, `contact`.`last-item` AS `lastitem_date`
FROM `user` FROM `user`
@ -1359,7 +1349,7 @@ function admin_page_users(App $a) {
//echo "<pre>$users"; killme(); //echo "<pre>$users"; killme();
$adminlist = explode(",", str_replace(" ", "", $a->config['admin_email'])); $adminlist = explode(",", str_replace(" ", "", $a->config['admin_email']));
$_setup_users = function ($e) use ($adminlist){ $_setup_users = function ($e) use ($adminlist) {
$accounts = array( $accounts = array(
t('Normal Account'), t('Normal Account'),
t('Soapbox Account'), t('Soapbox Account'),
@ -1385,22 +1375,21 @@ function admin_page_users(App $a) {
$tmp_users = array(); $tmp_users = array();
$deleted = array(); $deleted = array();
while(count($users)) { while (count($users)) {
$new_user = array(); $new_user = array();
foreach(array_pop($users) as $k => $v) { foreach (array_pop($users) as $k => $v) {
$k = str_replace('-','_',$k); $k = str_replace('-','_',$k);
$new_user[$k] = $v; $new_user[$k] = $v;
} }
if($new_user['deleted']) { if ($new_user['deleted']) {
array_push($deleted, $new_user); array_push($deleted, $new_user);
} } else {
else {
array_push($tmp_users, $new_user); array_push($tmp_users, $new_user);
} }
} }
//Reversing the two array, and moving $tmp_users to $users //Reversing the two array, and moving $tmp_users to $users
array_reverse($deleted); array_reverse($deleted);
while(count($tmp_users)) { while (count($tmp_users)) {
array_push($users, array_pop($tmp_users)); array_push($users, array_pop($tmp_users));
} }
@ -1477,19 +1466,19 @@ function admin_page_plugins(App $a) {
/* /*
* Single plugin * Single plugin
*/ */
if($a->argc == 3) { if ($a->argc == 3) {
$plugin = $a->argv[2]; $plugin = $a->argv[2];
if(!is_file("addon/$plugin/$plugin.php")) { if (!is_file("addon/$plugin/$plugin.php")) {
notice(t("Item not found.")); notice(t("Item not found."));
return ''; return '';
} }
if(x($_GET,"a") && $_GET['a']=="t") { if (x($_GET,"a") && $_GET['a']=="t") {
check_form_security_token_redirectOnErr('/admin/plugins', 'admin_themes', 't'); check_form_security_token_redirectOnErr('/admin/plugins', 'admin_themes', 't');
// Toggle plugin status // Toggle plugin status
$idx = array_search($plugin, $a->plugins); $idx = array_search($plugin, $a->plugins);
if($idx !== false) { if ($idx !== false) {
unset($a->plugins[$idx]); unset($a->plugins[$idx]);
uninstall_plugin($plugin); uninstall_plugin($plugin);
info(sprintf(t("Plugin %s disabled."), $plugin)); info(sprintf(t("Plugin %s disabled."), $plugin));
@ -1506,22 +1495,22 @@ function admin_page_plugins(App $a) {
// display plugin details // display plugin details
require_once('library/markdown.php'); require_once('library/markdown.php');
if(in_array($plugin, $a->plugins)) { if (in_array($plugin, $a->plugins)) {
$status="on"; $action= t("Disable"); $status="on"; $action= t("Disable");
} else { } else {
$status="off"; $action= t("Enable"); $status="off"; $action= t("Enable");
} }
$readme=Null; $readme=Null;
if(is_file("addon/$plugin/README.md")) { if (is_file("addon/$plugin/README.md")) {
$readme = file_get_contents("addon/$plugin/README.md"); $readme = file_get_contents("addon/$plugin/README.md");
$readme = Markdown($readme); $readme = Markdown($readme);
} elseif(is_file("addon/$plugin/README")) { } elseif (is_file("addon/$plugin/README")) {
$readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>"; $readme = "<pre>". file_get_contents("addon/$plugin/README") ."</pre>";
} }
$admin_form=""; $admin_form="";
if(is_array($a->plugins_admin) && in_array($plugin, $a->plugins_admin)) { if (is_array($a->plugins_admin) && in_array($plugin, $a->plugins_admin)) {
@require_once("addon/$plugin/$plugin.php"); @require_once("addon/$plugin/$plugin.php");
$func = $plugin.'_plugin_admin'; $func = $plugin.'_plugin_admin';
$func($a, $admin_form); $func($a, $admin_form);
@ -1613,8 +1602,8 @@ function admin_page_plugins(App $a) {
*/ */
function toggle_theme(&$themes,$th,&$result) { function toggle_theme(&$themes,$th,&$result) {
for($x = 0; $x < count($themes); $x ++) { for($x = 0; $x < count($themes); $x ++) {
if($themes[$x]['name'] === $th) { if ($themes[$x]['name'] === $th) {
if($themes[$x]['allowed']) { if ($themes[$x]['allowed']) {
$themes[$x]['allowed'] = 0; $themes[$x]['allowed'] = 0;
$result = 0; $result = 0;
} }
@ -1633,8 +1622,8 @@ function toggle_theme(&$themes,$th,&$result) {
*/ */
function theme_status($themes,$th) { function theme_status($themes,$th) {
for($x = 0; $x < count($themes); $x ++) { for($x = 0; $x < count($themes); $x ++) {
if($themes[$x]['name'] === $th) { if ($themes[$x]['name'] === $th) {
if($themes[$x]['allowed']) { if ($themes[$x]['allowed']) {
return 1; return 1;
} }
else { else {
@ -1652,11 +1641,12 @@ function theme_status($themes,$th) {
*/ */
function rebuild_theme_table($themes) { function rebuild_theme_table($themes) {
$o = ''; $o = '';
if(count($themes)) { if (count($themes)) {
foreach($themes as $th) { foreach ($themes as $th) {
if($th['allowed']) { if ($th['allowed']) {
if(strlen($o)) if (strlen($o)) {
$o .= ','; $o .= ',';
}
$o .= $th['name']; $o .= $th['name'];
} }
} }
@ -1686,15 +1676,18 @@ function admin_page_themes(App $a) {
$allowed_themes_str = get_config('system','allowed_themes'); $allowed_themes_str = get_config('system','allowed_themes');
$allowed_themes_raw = explode(',',$allowed_themes_str); $allowed_themes_raw = explode(',',$allowed_themes_str);
$allowed_themes = array(); $allowed_themes = array();
if(count($allowed_themes_raw)) if (count($allowed_themes_raw)) {
foreach($allowed_themes_raw as $x) foreach ($allowed_themes_raw as $x) {
if(strlen(trim($x))) if (strlen(trim($x))) {
$allowed_themes[] = trim($x); $allowed_themes[] = trim($x);
}
}
}
$themes = array(); $themes = array();
$files = glob('view/theme/*'); $files = glob('view/theme/*');
if($files) { if ($files) {
foreach($files as $file) { foreach ($files as $file) {
$f = basename($file); $f = basename($file);
// Is there a style file? // Is there a style file?
@ -1709,12 +1702,13 @@ function admin_page_themes(App $a) {
$is_supported = 1-(intval(file_exists($file.'/unsupported'))); $is_supported = 1-(intval(file_exists($file.'/unsupported')));
$is_allowed = intval(in_array($f,$allowed_themes)); $is_allowed = intval(in_array($f,$allowed_themes));
if($is_allowed OR $is_supported OR get_config("system", "show_unsupported_themes")) if ($is_allowed OR $is_supported OR get_config("system", "show_unsupported_themes")) {
$themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed); $themes[] = array('name' => $f, 'experimental' => $is_experimental, 'supported' => $is_supported, 'allowed' => $is_allowed);
}
} }
} }
if(! count($themes)) { if (! count($themes)) {
notice(t('No themes found.')); notice(t('No themes found.'));
return ''; return '';
} }
@ -1723,25 +1717,24 @@ function admin_page_themes(App $a) {
* Single theme * Single theme
*/ */
if($a->argc == 3) { if ($a->argc == 3) {
$theme = $a->argv[2]; $theme = $a->argv[2];
if(! is_dir("view/theme/$theme")) { if (! is_dir("view/theme/$theme")) {
notice(t("Item not found.")); notice(t("Item not found."));
return ''; return '';
} }
if(x($_GET,"a") && $_GET['a']=="t") { if (x($_GET,"a") && $_GET['a']=="t") {
check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't'); check_form_security_token_redirectOnErr('/admin/themes', 'admin_themes', 't');
// Toggle theme status // Toggle theme status
toggle_theme($themes,$theme,$result); toggle_theme($themes,$theme,$result);
$s = rebuild_theme_table($themes); $s = rebuild_theme_table($themes);
if($result) { if ($result) {
install_theme($theme); install_theme($theme);
info(sprintf('Theme %s enabled.',$theme)); info(sprintf('Theme %s enabled.',$theme));
} } else {
else {
uninstall_theme($theme); uninstall_theme($theme);
info(sprintf('Theme %s disabled.',$theme)); info(sprintf('Theme %s disabled.',$theme));
} }
@ -1754,22 +1747,22 @@ function admin_page_themes(App $a) {
// display theme details // display theme details
require_once('library/markdown.php'); require_once('library/markdown.php');
if(theme_status($themes,$theme)) { if (theme_status($themes,$theme)) {
$status="on"; $action= t("Disable"); $status="on"; $action= t("Disable");
} else { } else {
$status="off"; $action= t("Enable"); $status="off"; $action= t("Enable");
} }
$readme=Null; $readme = Null;
if(is_file("view/theme/$theme/README.md")) { if (is_file("view/theme/$theme/README.md")) {
$readme = file_get_contents("view/theme/$theme/README.md"); $readme = file_get_contents("view/theme/$theme/README.md");
$readme = Markdown($readme); $readme = Markdown($readme);
} elseif(is_file("view/theme/$theme/README")) { } elseif (is_file("view/theme/$theme/README")) {
$readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>"; $readme = "<pre>". file_get_contents("view/theme/$theme/README") ."</pre>";
} }
$admin_form=""; $admin_form = "";
if(is_file("view/theme/$theme/config.php")) { if (is_file("view/theme/$theme/config.php")) {
function __get_theme_admin_form(App $a, $theme) { function __get_theme_admin_form(App $a, $theme) {
$orig_theme = $a->theme; $orig_theme = $a->theme;
$orig_page = $a->page; $orig_page = $a->page;
@ -1780,8 +1773,10 @@ function admin_page_themes(App $a) {
$init = $theme."_init"; $init = $theme."_init";
if(function_exists($init)) $init($a); if (function_exists($init)) {
if(function_exists("theme_admin")) { $init($a);
}
if (function_exists("theme_admin")) {
$admin_form = theme_admin($a); $admin_form = theme_admin($a);
} }
@ -1794,9 +1789,9 @@ function admin_page_themes(App $a) {
} }
$screenshot = array(get_theme_screenshot($theme), t('Screenshot')); $screenshot = array(get_theme_screenshot($theme), t('Screenshot'));
if(! stristr($screenshot[0],$theme)) if (! stristr($screenshot[0],$theme)) {
$screenshot = null; $screenshot = null;
}
$t = get_markup_template("admin_plugins_details.tpl"); $t = get_markup_template("admin_plugins_details.tpl");
return replace_macros($t, array( return replace_macros($t, array(
@ -1842,7 +1837,7 @@ function admin_page_themes(App $a) {
$xthemes = array(); $xthemes = array();
if ($themes) { if ($themes) {
foreach($themes as $th) { foreach ($themes as $th) {
$xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name'])); $xthemes[] = array($th['name'],(($th['allowed']) ? "on" : "off"), get_theme_info($th['name']));
} }
} }
@ -1967,25 +1962,25 @@ function admin_page_viewlogs(App $a) {
$f = get_config('system','logfile'); $f = get_config('system','logfile');
$data = ''; $data = '';
if(!file_exists($f)) { if (!file_exists($f)) {
$data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is readable."); $data = t("Error trying to open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f exist and is readable.");
} } else {
else {
$fp = fopen($f, 'r'); $fp = fopen($f, 'r');
if(!$fp) { if (!$fp) {
$data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable."); $data = t("Couldn't open <strong>$f</strong> log file.\r\n<br/>Check to see if file $f is readable.");
} } else {
else {
$fstat = fstat($fp); $fstat = fstat($fp);
$size = $fstat['size']; $size = $fstat['size'];
if($size != 0) { if ($size != 0) {
if($size > 5000000 || $size < 0) if ($size > 5000000 || $size < 0) {
$size = 5000000; $size = 5000000;
}
$seek = fseek($fp,0-$size,SEEK_END); $seek = fseek($fp,0-$size,SEEK_END);
if($seek === 0) { if ($seek === 0) {
$data = escape_tags(fread($fp,$size)); $data = escape_tags(fread($fp,$size));
while(! feof($fp)) while (! feof($fp)) {
$data .= escape_tags(fread($fp,4096)); $data .= escape_tags(fread($fp,4096));
}
} }
} }
fclose($fp); fclose($fp);
@ -2013,22 +2008,24 @@ function admin_page_features_post(App $a) {
$arr = array(); $arr = array();
$features = get_features(false); $features = get_features(false);
foreach($features as $fname => $fdata) { foreach ($features as $fname => $fdata) {
foreach(array_slice($fdata,1) as $f) { foreach (array_slice($fdata,1) as $f) {
$feature = $f[0]; $feature = $f[0];
$feature_state = 'feature_'.$feature; $feature_state = 'feature_'.$feature;
$featurelock = 'featurelock_'.$feature; $featurelock = 'featurelock_'.$feature;
if(x($_POST[$feature_state])) if (x($_POST[$feature_state])) {
$val = intval($_POST['feature_'.$feature]); $val = intval($_POST['feature_'.$feature]);
else } else {
$val = 0; $val = 0;
}
set_config('feature',$feature,$val); set_config('feature',$feature,$val);
if(x($_POST[$featurelock])) if (x($_POST[$featurelock])) {
set_config('feature_lock',$feature,$val); set_config('feature_lock',$feature,$val);
else } else {
del_config('feature_lock',$feature); del_config('feature_lock',$feature);
}
} }
} }
@ -2052,18 +2049,19 @@ function admin_page_features_post(App $a) {
*/ */
function admin_page_features(App $a) { function admin_page_features(App $a) {
if((argc() > 1) && (argv(1) === 'features')) { if ((argc() > 1) && (argv(1) === 'features')) {
$arr = array(); $arr = array();
$features = get_features(false); $features = get_features(false);
foreach($features as $fname => $fdata) { foreach ($features as $fname => $fdata) {
$arr[$fname] = array(); $arr[$fname] = array();
$arr[$fname][0] = $fdata[0]; $arr[$fname][0] = $fdata[0];
foreach(array_slice($fdata,1) as $f) { foreach (array_slice($fdata,1) as $f) {
$set = get_config('feature',$f[0]); $set = get_config('feature',$f[0]);
if($set === false) if ($set === false) {
$set = $f[3]; $set = $f[3];
}
$arr[$fname][1][] = array( $arr[$fname][1][] = array(
array('feature_' .$f[0],$f[1],$set,$f[2],array(t('Off'),t('On'))), array('feature_' .$f[0],$f[1],$set,$f[2],array(t('Off'),t('On'))),
array('featurelock_' .$f[0],sprintf(t('Lock feature %s'),$f[1]),(($f[4] !== false) ? "1" : ''),'',array(t('Off'),t('On'))) array('featurelock_' .$f[0],sprintf(t('Lock feature %s'),$f[1]),(($f[4] !== false) ? "1" : ''),'',array(t('Off'),t('On')))

View file

@ -534,13 +534,13 @@ function contacts_content(App $a) {
$insecure = t('Private communications are not available for this contact.'); $insecure = t('Private communications are not available for this contact.');
$last_update = (($contact['last-update'] == '0000-00-00 00:00:00') $last_update = (($contact['last-update'] <= NULL_DATE)
? t('Never') ? t('Never')
: datetime_convert('UTC',date_default_timezone_get(),$contact['last-update'],'D, j M Y, g:i A')); : datetime_convert('UTC',date_default_timezone_get(),$contact['last-update'],'D, j M Y, g:i A'));
if($contact['last-update'] !== '0000-00-00 00:00:00') if ($contact['last-update'] > NULL_DATE) {
$last_update .= ' ' . (($contact['last-update'] <= $contact['success_update']) ? t("\x28Update was successful\x29") : t("\x28Update was not successful\x29")); $last_update .= ' ' . (($contact['last-update'] <= $contact['success_update']) ? t("\x28Update was successful\x29") : t("\x28Update was not successful\x29"));
}
$lblsuggest = (($contact['network'] === NETWORK_DFRN) ? t('Suggest friends') : ''); $lblsuggest = (($contact['network'] === NETWORK_DFRN) ? t('Suggest friends') : '');
$poll_enabled = in_array($contact['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_FEED, NETWORK_MAIL, NETWORK_MAIL2)); $poll_enabled = in_array($contact['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_FEED, NETWORK_MAIL, NETWORK_MAIL2));
@ -558,12 +558,12 @@ function contacts_content(App $a) {
// tabs // tabs
$tab_str = contacts_tab($a, $contact_id, 2); $tab_str = contacts_tab($a, $contact_id, 2);
$lost_contact = (($contact['archive'] && $contact['term-date'] != '0000-00-00 00:00:00' && $contact['term-date'] < datetime_convert('','','now')) ? t('Communications lost with this contact!') : ''); $lost_contact = (($contact['archive'] && $contact['term-date'] > NULL_DATE && $contact['term-date'] < datetime_convert('','','now')) ? t('Communications lost with this contact!') : '');
if ($contact['network'] == NETWORK_FEED) if ($contact['network'] == NETWORK_FEED) {
$fetch_further_information = array('fetch_further_information', t('Fetch further information for feeds'), $contact['fetch_further_information'], t('Fetch further information for feeds'), $fetch_further_information = array('fetch_further_information', t('Fetch further information for feeds'), $contact['fetch_further_information'], t('Fetch further information for feeds'),
array('0'=>t('Disabled'), '1'=>t('Fetch information'), '2'=>t('Fetch information and keywords'))); array('0'=>t('Disabled'), '1'=>t('Fetch information'), '2'=>t('Fetch information and keywords')));
}
if (in_array($contact['network'], array(NETWORK_FEED, NETWORK_MAIL, NETWORK_MAIL2))) if (in_array($contact['network'], array(NETWORK_FEED, NETWORK_MAIL, NETWORK_MAIL2)))
$poll_interval = contact_poll_interval($contact['priority'],(! $poll_enabled)); $poll_interval = contact_poll_interval($contact['priority'],(! $poll_enabled));

View file

@ -1,12 +1,12 @@
<?php <?php
/** /**
* @fiel mod/events.php * @file mod/events.php
* @brief The events module * @brief The events module
*/ */
require_once('include/bbcode.php'); require_once 'include/bbcode.php';
require_once('include/datetime.php'); require_once 'include/datetime.php';
require_once('include/event.php'); require_once 'include/event.php';
require_once('include/items.php'); require_once 'include/items.php';
function events_init(App $a) { function events_init(App $a) {
if (! local_user()) { if (! local_user()) {
@ -14,10 +14,11 @@ function events_init(App $a) {
} }
if ($a->argc == 1) { if ($a->argc == 1) {
// if it's a json request abort here becaus we don't // If it's a json request abort here because we don't
// need the widget data // need the widget data
if ($a->argv[1] === 'json') if ($a->argv[1] === 'json') {
return; return;
}
$cal_widget = widget_events(); $cal_widget = widget_events();
@ -33,17 +34,17 @@ function events_init(App $a) {
function events_post(App $a) { function events_post(App $a) {
logger('post: ' . print_r($_REQUEST,true)); logger('post: ' . print_r($_REQUEST, true), LOGGER_DATA);
if (! local_user()) { if (! local_user()) {
return; return;
} }
$event_id = ((x($_POST,'event_id')) ? intval($_POST['event_id']) : 0); $event_id = ((x($_POST, 'event_id')) ? intval($_POST['event_id']) : 0);
$cid = ((x($_POST,'cid')) ? intval($_POST['cid']) : 0); $cid = ((x($_POST, 'cid')) ? intval($_POST['cid']) : 0);
$uid = local_user(); $uid = local_user();
$start_text = escape_tags($_REQUEST['start_text']); $start_text = escape_tags($_REQUEST['start_text']);
$finish_text = escape_tags($_REQUEST['finish_text']); $finish_text = escape_tags($_REQUEST['finish_text']);
$adjust = intval($_POST['adjust']); $adjust = intval($_POST['adjust']);
@ -52,34 +53,26 @@ function events_post(App $a) {
// The default setting for the `private` field in event_store() is false, so mirror that // The default setting for the `private` field in event_store() is false, so mirror that
$private_event = false; $private_event = false;
$start = NULL_DATE;
$finish = NULL_DATE;
if ($start_text) { if ($start_text) {
$start = $start_text; $start = $start_text;
} }
else {
$start = sprintf('%d-%d-%d %d:%d:0',$startyear,$startmonth,$startday,$starthour,$startminute);
}
if ($nofinish) {
$finish = '0000-00-00 00:00:00';
}
if ($finish_text) { if ($finish_text) {
$finish = $finish_text; $finish = $finish_text;
} }
else {
$finish = sprintf('%d-%d-%d %d:%d:0',$finishyear,$finishmonth,$finishday,$finishhour,$finishminute);
}
if ($adjust) { if ($adjust) {
$start = datetime_convert(date_default_timezone_get(),'UTC',$start); $start = datetime_convert(date_default_timezone_get(), 'UTC', $start);
if (! $nofinish) { if (! $nofinish) {
$finish = datetime_convert(date_default_timezone_get(),'UTC',$finish); $finish = datetime_convert(date_default_timezone_get(), 'UTC', $finish);
} }
} } else {
else { $start = datetime_convert('UTC', 'UTC', $start);
$start = datetime_convert('UTC','UTC',$start);
if (! $nofinish) { if (! $nofinish) {
$finish = datetime_convert('UTC','UTC',$finish); $finish = datetime_convert('UTC', 'UTC', $finish);
} }
} }
@ -96,19 +89,19 @@ function events_post(App $a) {
$action = ($event_id == '') ? 'new' : "event/" . $event_id; $action = ($event_id == '') ? 'new' : "event/" . $event_id;
$onerror_url = App::get_baseurl() . "/events/" . $action . "?summary=$summary&description=$desc&location=$location&start=$start_text&finish=$finish_text&adjust=$adjust&nofinish=$nofinish"; $onerror_url = App::get_baseurl() . "/events/" . $action . "?summary=$summary&description=$desc&location=$location&start=$start_text&finish=$finish_text&adjust=$adjust&nofinish=$nofinish";
if (strcmp($finish,$start) < 0 && !$nofinish) { if (strcmp($finish, $start) < 0 && !$nofinish) {
notice( t('Event can not end before it has started.') . EOL); notice(t('Event can not end before it has started.') . EOL);
if (intval($_REQUEST['preview'])) { if (intval($_REQUEST['preview'])) {
echo( t('Event can not end before it has started.')); echo t('Event can not end before it has started.');
killme(); killme();
} }
goaway($onerror_url); goaway($onerror_url);
} }
if((! $summary) || (! $start)) { if ((! $summary) || ($start === NULL_DATE)) {
notice( t('Event title and start time are required.') . EOL); notice(t('Event title and start time are required.') . EOL);
if(intval($_REQUEST['preview'])) { if (intval($_REQUEST['preview'])) {
echo( t('Event title and start time are required.')); echo t('Event title and start time are required.');
killme(); killme();
} }
goaway($onerror_url); goaway($onerror_url);
@ -116,35 +109,33 @@ function events_post(App $a) {
$share = ((intval($_POST['share'])) ? intval($_POST['share']) : 0); $share = ((intval($_POST['share'])) ? intval($_POST['share']) : 0);
$c = q("select id from contact where uid = %d and self = 1 limit 1", $c = q("SELECT `id` FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1",
intval(local_user()) intval(local_user())
); );
if(count($c)) if (count($c)) {
$self = $c[0]['id']; $self = $c[0]['id'];
else } else {
$self = 0; $self = 0;
}
if($share) { if ($share) {
$str_group_allow = perms2str($_POST['group_allow']); $str_group_allow = perms2str($_POST['group_allow']);
$str_contact_allow = perms2str($_POST['contact_allow']); $str_contact_allow = perms2str($_POST['contact_allow']);
$str_group_deny = perms2str($_POST['group_deny']); $str_group_deny = perms2str($_POST['group_deny']);
$str_contact_deny = perms2str($_POST['contact_deny']); $str_contact_deny = perms2str($_POST['contact_deny']);
// Undo the pseudo-contact of self, since there are real contacts now // Undo the pseudo-contact of self, since there are real contacts now
if( strpos($str_contact_allow, '<' . $self . '>') !== false ) if (strpos($str_contact_allow, '<' . $self . '>') !== false ) {
{
$str_contact_allow = str_replace('<' . $self . '>', '', $str_contact_allow); $str_contact_allow = str_replace('<' . $self . '>', '', $str_contact_allow);
} }
// Make sure to set the `private` field as true. This is necessary to // Make sure to set the `private` field as true. This is necessary to
// have the posts show up correctly in Diaspora if an event is created // have the posts show up correctly in Diaspora if an event is created
// as visible only to self at first, but then edited to display to others. // as visible only to self at first, but then edited to display to others.
if( strlen($str_group_allow) or strlen($str_contact_allow) or strlen($str_group_deny) or strlen($str_contact_deny) ) if (strlen($str_group_allow) || strlen($str_contact_allow) || strlen($str_group_deny) || strlen($str_contact_deny)) {
{
$private_event = true; $private_event = true;
} }
} } else {
else {
// Note: do not set `private` field for self-only events. It will // Note: do not set `private` field for self-only events. It will
// keep even you from seeing them! // keep even you from seeing them!
$str_contact_allow = '<' . $self . '>'; $str_contact_allow = '<' . $self . '>';
@ -153,46 +144,45 @@ function events_post(App $a) {
$datarray = array(); $datarray = array();
$datarray['guid'] = get_guid(32); $datarray['guid'] = get_guid(32);
$datarray['start'] = $start; $datarray['start'] = $start;
$datarray['finish'] = $finish; $datarray['finish'] = $finish;
$datarray['summary'] = $summary; $datarray['summary'] = $summary;
$datarray['desc'] = $desc; $datarray['desc'] = $desc;
$datarray['location'] = $location; $datarray['location'] = $location;
$datarray['type'] = $type; $datarray['type'] = $type;
$datarray['adjust'] = $adjust; $datarray['adjust'] = $adjust;
$datarray['nofinish'] = $nofinish; $datarray['nofinish'] = $nofinish;
$datarray['uid'] = $uid; $datarray['uid'] = $uid;
$datarray['cid'] = $cid; $datarray['cid'] = $cid;
$datarray['allow_cid'] = $str_contact_allow; $datarray['allow_cid'] = $str_contact_allow;
$datarray['allow_gid'] = $str_group_allow; $datarray['allow_gid'] = $str_group_allow;
$datarray['deny_cid'] = $str_contact_deny; $datarray['deny_cid'] = $str_contact_deny;
$datarray['deny_gid'] = $str_group_deny; $datarray['deny_gid'] = $str_group_deny;
$datarray['private'] = (($private_event) ? 1 : 0); $datarray['private'] = (($private_event) ? 1 : 0);
$datarray['id'] = $event_id; $datarray['id'] = $event_id;
$datarray['created'] = $created; $datarray['created'] = $created;
$datarray['edited'] = $edited; $datarray['edited'] = $edited;
if(intval($_REQUEST['preview'])) { if (intval($_REQUEST['preview'])) {
$html = format_event_html($datarray); $html = format_event_html($datarray);
echo $html; echo $html;
killme(); killme();
} }
$item_id = event_store($datarray); $item_id = event_store($datarray);
if(! $cid) if (! $cid) {
proc_run(PRIORITY_HIGH, "include/notifier.php", "event", $item_id); proc_run(PRIORITY_HIGH, "include/notifier.php", "event", $item_id);
}
goaway($_SESSION['return_url']); goaway($_SESSION['return_url']);
} }
function events_content(App $a) { function events_content(App $a) {
if (! local_user()) { if (! local_user()) {
notice( t('Permission denied.') . EOL); notice(t('Permission denied.') . EOL);
return; return;
} }
@ -201,14 +191,14 @@ function events_content(App $a) {
} }
if (($a->argc > 2) && ($a->argv[1] === 'ignore') && intval($a->argv[2])) { if (($a->argc > 2) && ($a->argv[1] === 'ignore') && intval($a->argv[2])) {
$r = q("update event set ignore = 1 where id = %d and uid = %d", $r = q("UPDATE `event` SET `ignore` = 1 WHERE `id` = %d AND `uid` = %d",
intval($a->argv[2]), intval($a->argv[2]),
intval(local_user()) intval(local_user())
); );
} }
if (($a->argc > 2) && ($a->argv[1] === 'unignore') && intval($a->argv[2])) { if (($a->argc > 2) && ($a->argv[1] === 'unignore') && intval($a->argv[2])) {
$r = q("update event set ignore = 0 where id = %d and uid = %d", $r = q("UPDATE `event` SET `ignore` = 0 WHERE `id` = %d AND `uid` = %d",
intval($a->argv[2]), intval($a->argv[2]),
intval(local_user()) intval(local_user())
); );
@ -224,7 +214,7 @@ function events_content(App $a) {
$i18n = get_event_strings(); $i18n = get_event_strings();
$htpl = get_markup_template('event_head.tpl'); $htpl = get_markup_template('event_head.tpl');
$a->page['htmlhead'] .= replace_macros($htpl,array( $a->page['htmlhead'] .= replace_macros($htpl, array(
'$baseurl' => App::get_baseurl(), '$baseurl' => App::get_baseurl(),
'$module_url' => '/events', '$module_url' => '/events',
'$modparams' => 1, '$modparams' => 1,
@ -232,27 +222,30 @@ function events_content(App $a) {
)); ));
$etpl = get_markup_template('event_end.tpl'); $etpl = get_markup_template('event_end.tpl');
$a->page['end'] .= replace_macros($etpl,array( $a->page['end'] .= replace_macros($etpl, array(
'$baseurl' => App::get_baseurl(), '$baseurl' => App::get_baseurl(),
)); ));
$o =""; $o = '';
// tabs // tabs
if ($a->theme_events_in_profile) if ($a->theme_events_in_profile) {
$tabs = profile_tabs($a, True); $tabs = profile_tabs($a, true);
}
$mode = 'view'; $mode = 'view';
$y = 0; $y = 0;
$m = 0; $m = 0;
$ignored = ((x($_REQUEST,'ignored')) ? intval($_REQUEST['ignored']) : 0); $ignored = ((x($_REQUEST, 'ignored')) ? intval($_REQUEST['ignored']) : 0);
if($a->argc > 1) { if ($a->argc > 1) {
if ($a->argc > 2 && $a->argv[1] == 'event') { if ($a->argc > 2 && $a->argv[1] == 'event') {
$mode = 'edit'; $mode = 'edit';
$event_id = intval($a->argv[2]); $event_id = intval($a->argv[2]);
} }
if ($a->argc > 2 && $a->argv[1] == 'drop') {
$mode = 'drop';
$event_id = intval($a->argv[2]);
}
if ($a->argv[1] === 'new') { if ($a->argv[1] === 'new') {
$mode = 'new'; $mode = 'new';
$event_id = 0; $event_id = 0;
@ -267,9 +260,8 @@ function events_content(App $a) {
// The view mode part is similiar to /mod/cal.php // The view mode part is similiar to /mod/cal.php
if ($mode == 'view') { if ($mode == 'view') {
$thisyear = datetime_convert('UTC', date_default_timezone_get(), 'now', 'Y');
$thisyear = datetime_convert('UTC',date_default_timezone_get(),'now','Y'); $thismonth = datetime_convert('UTC', date_default_timezone_get(), 'now', 'm');
$thismonth = datetime_convert('UTC',date_default_timezone_get(),'now','m');
if (! $y) { if (! $y) {
$y = intval($thisyear); $y = intval($thisyear);
} }
@ -289,47 +281,47 @@ function events_content(App $a) {
$nextyear = $y; $nextyear = $y;
$nextmonth = $m + 1; $nextmonth = $m + 1;
if($nextmonth > 12) { if ($nextmonth > 12) {
$nextmonth = 1; $nextmonth = 1;
$nextyear ++; $nextyear ++;
} }
$prevyear = $y; $prevyear = $y;
if($m > 1) if ($m > 1) {
$prevmonth = $m - 1; $prevmonth = $m - 1;
else { } else {
$prevmonth = 12; $prevmonth = 12;
$prevyear --; $prevyear --;
} }
$dim = get_dim($y,$m); $dim = get_dim($y, $m);
$start = sprintf('%d-%d-%d %d:%d:%d',$y,$m,1,0,0,0); $start = sprintf('%d-%d-%d %d:%d:%d', $y, $m, 1, 0, 0, 0);
$finish = sprintf('%d-%d-%d %d:%d:%d',$y,$m,$dim,23,59,59); $finish = sprintf('%d-%d-%d %d:%d:%d', $y, $m, $dim, 23, 59, 59);
if ($a->argv[1] === 'json'){ if ($a->argv[1] === 'json') {
if (x($_GET,'start')) $start = $_GET['start']; if (x($_GET, 'start')) {$start = $_GET['start'];}
if (x($_GET,'end')) $finish = $_GET['end']; if (x($_GET, 'end')) {$finish = $_GET['end'];}
} }
$start = datetime_convert('UTC','UTC',$start); $start = datetime_convert('UTC', 'UTC', $start);
$finish = datetime_convert('UTC','UTC',$finish); $finish = datetime_convert('UTC', 'UTC', $finish);
$adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start); $adjust_start = datetime_convert('UTC', date_default_timezone_get(), $start);
$adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish); $adjust_finish = datetime_convert('UTC', date_default_timezone_get(), $finish);
// put the event parametes in an array so we can better transmit them // put the event parametes in an array so we can better transmit them
$event_params = array( $event_params = array(
'event_id' => (x($_GET,'id') ? $_GET["id"] : 0), 'event_id' => (x($_GET, 'id') ? $_GET['id'] : 0),
'start' => $start, 'start' => $start,
'finish' => $finish, 'finish' => $finish,
'adjust_start' => $adjust_start, 'adjust_start' => $adjust_start,
'adjust_finish' => $adjust_finish, 'adjust_finish' => $adjust_finish,
'ignored' => $ignored, 'ignored' => $ignored,
); );
// get events by id or by date // get events by id or by date
if (x($_GET,'id')){ if (x($_GET, 'id')) {
$r = event_by_id(local_user(), $event_params); $r = event_by_id(local_user(), $event_params);
} else { } else {
$r = events_by_date(local_user(), $event_params); $r = events_by_date(local_user(), $event_params);
@ -340,7 +332,7 @@ function events_content(App $a) {
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
$r = sort_by_date($r); $r = sort_by_date($r);
foreach ($r as $rr) { foreach ($r as $rr) {
$j = (($rr['adjust']) ? datetime_convert('UTC',date_default_timezone_get(),$rr['start'], 'j') : datetime_convert('UTC','UTC',$rr['start'],'j')); $j = (($rr['adjust']) ? datetime_convert('UTC', date_default_timezone_get(), $rr['start'], 'j') : datetime_convert('UTC', 'UTC', $rr['start'], 'j'));
if (! x($links,$j)) { if (! x($links,$j)) {
$links[$j] = App::get_baseurl() . '/' . $a->cmd . '#link-' . $j; $links[$j] = App::get_baseurl() . '/' . $a->cmd . '#link-' . $j;
} }
@ -356,127 +348,127 @@ function events_content(App $a) {
} }
if ($a->argv[1] === 'json'){ if ($a->argv[1] === 'json'){
echo json_encode($events); killme(); echo json_encode($events);
killme();
} }
// links: array('href', 'text', 'extra css classes', 'title') if (x($_GET, 'id')) {
if (x($_GET,'id')){
$tpl = get_markup_template("event.tpl"); $tpl = get_markup_template("event.tpl");
} else { } else {
// if (get_config('experimentals','new_calendar')==1){ $tpl = get_markup_template("events_js.tpl");
$tpl = get_markup_template("events_js.tpl");
// } else {
// $tpl = get_markup_template("events.tpl");
// }
} }
// Get rid of dashes in key names, Smarty3 can't handle them // Get rid of dashes in key names, Smarty3 can't handle them
foreach($events as $key => $event) { foreach ($events as $key => $event) {
$event_item = array(); $event_item = array();
foreach($event['item'] as $k => $v) { foreach ($event['item'] as $k => $v) {
$k = str_replace('-','_',$k); $k = str_replace('-' ,'_', $k);
$event_item[$k] = $v; $event_item[$k] = $v;
} }
$events[$key]['item'] = $event_item; $events[$key]['item'] = $event_item;
} }
$o = replace_macros($tpl, array( $o = replace_macros($tpl, array(
'$baseurl' => App::get_baseurl(), '$baseurl' => App::get_baseurl(),
'$tabs' => $tabs, '$tabs' => $tabs,
'$title' => t('Events'), '$title' => t('Events'),
'$view' => t('View'), '$view' => t('View'),
'$new_event' => array(App::get_baseurl().'/events/new',t('Create New Event'),'',''), '$new_event' => array(App::get_baseurl() . '/events/new', t('Create New Event'), '', ''),
'$previous' => array(App::get_baseurl()."/events/$prevyear/$prevmonth",t('Previous'),'',''), '$previous' => array(App::get_baseurl() . '/events/$prevyear/$prevmonth', t('Previous'), '', ''),
'$next' => array(App::get_baseurl()."/events/$nextyear/$nextmonth",t('Next'),'',''), '$next' => array(App::get_baseurl() . '/events/$nextyear/$nextmonth', t('Next'), '', ''),
'$calendar' => cal($y,$m,$links, ' eventcal'), '$calendar' => cal($y, $m, $links, ' eventcal'),
'$events' => $events, '$events' => $events,
"today" => t("today"), '$today' => t('today'),
"month" => t("month"), '$month' => t('month'),
"week" => t("week"), '$week' => t('week'),
"day" => t("day"), '$day' => t('day'),
"list" => t("list"), '$list' => t('list'),
)); ));
if (x($_GET,'id')){ echo $o; killme(); } if (x($_GET, 'id')) {
echo $o;
killme();
}
return $o; return $o;
} }
if($mode === 'edit' && $event_id) { if ($mode === 'edit' && $event_id) {
$r = q("SELECT * FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1", $r = q("SELECT * FROM `event` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($event_id), intval($event_id),
intval(local_user()) intval(local_user())
); );
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$orig_event = $r[0]; $orig_event = $r[0];
}
} }
// Passed parameters overrides anything found in the DB // Passed parameters overrides anything found in the DB
if($mode === 'edit' || $mode === 'new') { if ($mode === 'edit' || $mode === 'new') {
if(!x($orig_event)) $orig_event = array(); if (!x($orig_event)) {$orig_event = array();}
// In case of an error the browser is redirected back here, with these parameters filled in with the previous values // In case of an error the browser is redirected back here, with these parameters filled in with the previous values
if(x($_REQUEST,'nofinish')) $orig_event['nofinish'] = $_REQUEST['nofinish']; if (x($_REQUEST, 'nofinish')) {$orig_event['nofinish'] = $_REQUEST['nofinish'];}
if(x($_REQUEST,'adjust')) $orig_event['adjust'] = $_REQUEST['adjust']; if (x($_REQUEST, 'adjust')) {$orig_event['adjust'] = $_REQUEST['adjust'];}
if(x($_REQUEST,'summary')) $orig_event['summary'] = $_REQUEST['summary']; if (x($_REQUEST, 'summary')) {$orig_event['summary'] = $_REQUEST['summary'];}
if(x($_REQUEST,'description')) $orig_event['description'] = $_REQUEST['description']; if (x($_REQUEST, 'description')) {$orig_event['description'] = $_REQUEST['description'];}
if(x($_REQUEST,'location')) $orig_event['location'] = $_REQUEST['location']; if (x($_REQUEST, 'location')) {$orig_event['location'] = $_REQUEST['location'];}
if(x($_REQUEST,'start')) $orig_event['start'] = $_REQUEST['start']; if (x($_REQUEST, 'start')) {$orig_event['start'] = $_REQUEST['start'];}
if(x($_REQUEST,'finish')) $orig_event['finish'] = $_REQUEST['finish']; if (x($_REQUEST, 'finish')) {$orig_event['finish'] = $_REQUEST['finish'];}
}
if($mode === 'edit' || $mode === 'new') {
$n_checked = ((x($orig_event) && $orig_event['nofinish']) ? ' checked="checked" ' : ''); $n_checked = ((x($orig_event) && $orig_event['nofinish']) ? ' checked="checked" ' : '');
$a_checked = ((x($orig_event) && $orig_event['adjust']) ? ' checked="checked" ' : ''); $a_checked = ((x($orig_event) && $orig_event['adjust']) ? ' checked="checked" ' : '');
$t_orig = ((x($orig_event)) ? $orig_event['summary'] : '');
$d_orig = ((x($orig_event)) ? $orig_event['desc'] : ''); $t_orig = ((x($orig_event)) ? $orig_event['summary'] : '');
$d_orig = ((x($orig_event)) ? $orig_event['desc'] : '');
$l_orig = ((x($orig_event)) ? $orig_event['location'] : ''); $l_orig = ((x($orig_event)) ? $orig_event['location'] : '');
$eid = ((x($orig_event)) ? $orig_event['id'] : 0); $eid = ((x($orig_event)) ? $orig_event['id'] : 0);
$cid = ((x($orig_event)) ? $orig_event['cid'] : 0); $cid = ((x($orig_event)) ? $orig_event['cid'] : 0);
$uri = ((x($orig_event)) ? $orig_event['uri'] : ''); $uri = ((x($orig_event)) ? $orig_event['uri'] : '');
if (! x($orig_event)) {
if(! x($orig_event))
$sh_checked = ''; $sh_checked = '';
else } else {
$sh_checked = (($orig_event['allow_cid'] === '<' . local_user() . '>' && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ' ); $sh_checked = (($orig_event['allow_cid'] === '<' . local_user() . '>' && (! $orig_event['allow_gid']) && (! $orig_event['deny_cid']) && (! $orig_event['deny_gid'])) ? '' : ' checked="checked" ');
}
if($cid OR ($mode !== 'new')) if ($cid OR ($mode !== 'new')) {
$sh_checked .= ' disabled="disabled" '; $sh_checked .= ' disabled="disabled" ';
}
$sdt = ((x($orig_event)) ? $orig_event['start'] : 'now'); $sdt = ((x($orig_event)) ? $orig_event['start'] : 'now');
$fdt = ((x($orig_event)) ? $orig_event['finish'] : 'now'); $fdt = ((x($orig_event)) ? $orig_event['finish'] : 'now');
$tz = date_default_timezone_get(); $tz = date_default_timezone_get();
if(x($orig_event)) if (x($orig_event)) {
$tz = (($orig_event['adjust']) ? date_default_timezone_get() : 'UTC'); $tz = (($orig_event['adjust']) ? date_default_timezone_get() : 'UTC');
}
$syear = datetime_convert('UTC', $tz, $sdt, 'Y'); $syear = datetime_convert('UTC', $tz, $sdt, 'Y');
$smonth = datetime_convert('UTC', $tz, $sdt, 'm'); $smonth = datetime_convert('UTC', $tz, $sdt, 'm');
$sday = datetime_convert('UTC', $tz, $sdt, 'd'); $sday = datetime_convert('UTC', $tz, $sdt, 'd');
$shour = ((x($orig_event)) ? datetime_convert('UTC', $tz, $sdt, 'H') : 0); $shour = ((x($orig_event)) ? datetime_convert('UTC', $tz, $sdt, 'H') : 0);
$sminute = ((x($orig_event)) ? datetime_convert('UTC', $tz, $sdt, 'i') : 0); $sminute = ((x($orig_event)) ? datetime_convert('UTC', $tz, $sdt, 'i') : 0);
$fyear = datetime_convert('UTC', $tz, $fdt, 'Y'); $fyear = datetime_convert('UTC', $tz, $fdt, 'Y');
$fmonth = datetime_convert('UTC', $tz, $fdt, 'm'); $fmonth = datetime_convert('UTC', $tz, $fdt, 'm');
$fday = datetime_convert('UTC', $tz, $fdt, 'd'); $fday = datetime_convert('UTC', $tz, $fdt, 'd');
$fhour = ((x($orig_event)) ? datetime_convert('UTC', $tz, $fdt, 'H') : 0); $fhour = ((x($orig_event)) ? datetime_convert('UTC', $tz, $fdt, 'H') : 0);
$fminute = ((x($orig_event)) ? datetime_convert('UTC', $tz, $fdt, 'i') : 0); $fminute = ((x($orig_event)) ? datetime_convert('UTC', $tz, $fdt, 'i') : 0);
$f = get_config('system','event_input_format'); $f = get_config('system','event_input_format');
if(! $f) if (! $f) {
$f = 'ymd'; $f = 'ymd';
}
require_once('include/acl_selectors.php'); require_once 'include/acl_selectors.php' ;
if ($mode === 'new') if ($mode === 'new') {
$acl = (($cid) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $a->user))); $acl = (($cid) ? '' : populate_acl(((x($orig_event)) ? $orig_event : $a->user)));
}
$tpl = get_markup_template('event_form.tpl'); $tpl = get_markup_template('event_form.tpl');
@ -489,11 +481,11 @@ function events_content(App $a) {
'$title' => t('Event details'), '$title' => t('Event details'),
'$desc' => t('Starting date and Title are required.'), '$desc' => t('Starting date and Title are required.'),
'$s_text' => t('Event Starts:') . ' <span class="required" title="' . t('Required') . '">*</span>', '$s_text' => t('Event Starts:') . ' <span class="required" title="' . t('Required') . '">*</span>',
'$s_dsel' => datetimesel($f,new DateTime(),DateTime::createFromFormat('Y',$syear+5),DateTime::createFromFormat('Y-m-d H:i',"$syear-$smonth-$sday $shour:$sminute"),t('Event Starts:'),'start_text',true,true,'','',true), '$s_dsel' => datetimesel($f, new DateTime(), DateTime::createFromFormat('Y', $syear+5), DateTime::createFromFormat('Y-m-d H:i', "$syear-$smonth-$sday $shour:$sminute"), t('Event Starts:'), 'start_text', true, true, '', '', true),
'$n_text' => t('Finish date/time is not known or not relevant'), '$n_text' => t('Finish date/time is not known or not relevant'),
'$n_checked' => $n_checked, '$n_checked' => $n_checked,
'$f_text' => t('Event Finishes:'), '$f_text' => t('Event Finishes:'),
'$f_dsel' => datetimesel($f,new DateTime(),DateTime::createFromFormat('Y',$fyear+5),DateTime::createFromFormat('Y-m-d H:i',"$fyear-$fmonth-$fday $fhour:$fminute"),t('Event Finishes:'),'finish_text',true,true,'start_text'), '$f_dsel' => datetimesel($f, new DateTime(), DateTime::createFromFormat('Y', $fyear+5), DateTime::createFromFormat('Y-m-d H:i', "$fyear-$fmonth-$fday $fhour:$fminute"), t('Event Finishes:'), 'finish_text', true, true, 'start_text'),
'$a_text' => t('Adjust for viewer timezone'), '$a_text' => t('Adjust for viewer timezone'),
'$a_checked' => $a_checked, '$a_checked' => $a_checked,
'$d_text' => t('Description:'), '$d_text' => t('Description:'),
@ -511,12 +503,33 @@ function events_content(App $a) {
'$preview' => t('Preview'), '$preview' => t('Preview'),
'$acl' => $acl, '$acl' => $acl,
'$submit' => t('Submit'), '$submit' => t('Submit'),
'$basic' => t("Basic"), '$basic' => t('Basic'),
'$advanced' => t("Advanced"), '$advanced' => t('Advanced'),
'$permissions' => t('Permissions'), '$permissions' => t('Permissions'),
)); ));
return $o; return $o;
} }
// Remove an event from the calendar and its related items
if ($mode === 'drop' && $event_id) {
$del = 0;
$params = array('event_id' => ($event_id));
$ev = event_by_id(local_user(), $params);
// Delete only real events (no birthdays)
if (dbm::is_result($ev) && $ev[0]['type'] == 'event') {
$del = drop_item($ev[0]['itemid'], false);
}
if ($del == 0) {
notice(t('Failed to remove event' ) . EOL);
} else {
info(t('Event removed') . EOL);
}
goaway(App::get_baseurl() . '/events');
}
} }

View file

@ -1,11 +1,23 @@
<?php <?php
use \Friendica\Core\Config;
function maintenance_content(App $a) { function maintenance_content(App $a) {
$reason = Config::get('system', 'maintenance_reason');
if (substr(normalise_link($reason), 0, 7) == 'http://') {
header("HTTP/1.1 307 Temporary Redirect");
header("Location:".$reason);
return;
}
header('HTTP/1.1 503 Service Temporarily Unavailable'); header('HTTP/1.1 503 Service Temporarily Unavailable');
header('Status: 503 Service Temporarily Unavailable'); header('Status: 503 Service Temporarily Unavailable');
header('Retry-After: 600'); header('Retry-After: 600');
return replace_macros(get_markup_template('maintenance.tpl'), array( return replace_macros(get_markup_template('maintenance.tpl'), array(
'$sysdown' => t('System down for maintenance') '$sysdown' => t('System down for maintenance'),
'$reason' => $reason
)); ));
} }

View file

@ -7,14 +7,14 @@ function poco_init(App $a) {
$system_mode = false; $system_mode = false;
if(intval(get_config('system','block_public')) || (get_config('system','block_local_dir'))) if (intval(get_config('system','block_public')) || (get_config('system','block_local_dir'))) {
http_status_exit(401); http_status_exit(401);
}
if ($a->argc > 1) {
if($a->argc > 1) {
$user = notags(trim($a->argv[1])); $user = notags(trim($a->argv[1]));
} }
if(! x($user)) { if (! x($user)) {
$c = q("SELECT * FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1"); $c = q("SELECT * FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1");
if (! dbm::is_result($c)) { if (! dbm::is_result($c)) {
http_status_exit(401); http_status_exit(401);
@ -27,42 +27,55 @@ function poco_init(App $a) {
$justme = false; $justme = false;
$global = false; $global = false;
if($a->argc > 1 && $a->argv[1] === '@global') { if ($a->argc > 1 && $a->argv[1] === '@server') {
// List of all servers that this server knows
$ret = poco_serverlist();
header('Content-type: application/json');
echo json_encode($ret);
killme();
}
if ($a->argc > 1 && $a->argv[1] === '@global') {
// List of all profiles that this server recently had data from
$global = true; $global = true;
$update_limit = date("Y-m-d H:i:s", time() - 30 * 86400); $update_limit = date("Y-m-d H:i:s", time() - 30 * 86400);
} }
if($a->argc > 2 && $a->argv[2] === '@me') if ($a->argc > 2 && $a->argv[2] === '@me') {
$justme = true; $justme = true;
if($a->argc > 3 && $a->argv[3] === '@all') }
if ($a->argc > 3 && $a->argv[3] === '@all') {
$justme = false; $justme = false;
if($a->argc > 3 && $a->argv[3] === '@self') }
if ($a->argc > 3 && $a->argv[3] === '@self') {
$justme = true; $justme = true;
if($a->argc > 4 && intval($a->argv[4]) && $justme == false) }
if ($a->argc > 4 && intval($a->argv[4]) && $justme == false) {
$cid = intval($a->argv[4]); $cid = intval($a->argv[4]);
}
if (!$system_mode AND !$global) {
if(!$system_mode AND !$global) {
$r = q("SELECT `user`.*,`profile`.`hide-friends` from user left join profile on `user`.`uid` = `profile`.`uid` $r = q("SELECT `user`.*,`profile`.`hide-friends` from user left join profile on `user`.`uid` = `profile`.`uid`
where `user`.`nickname` = '%s' and `profile`.`is-default` = 1 limit 1", where `user`.`nickname` = '%s' and `profile`.`is-default` = 1 limit 1",
dbesc($user) dbesc($user)
); );
if(! dbm::is_result($r) || $r[0]['hidewall'] || $r[0]['hide-friends']) if (! dbm::is_result($r) || $r[0]['hidewall'] || $r[0]['hide-friends']) {
http_status_exit(404); http_status_exit(404);
}
$user = $r[0]; $user = $r[0];
} }
if($justme) if ($justme) {
$sql_extra = " AND `contact`.`self` = 1 "; $sql_extra = " AND `contact`.`self` = 1 ";
}
// else // else
// $sql_extra = " AND `contact`.`self` = 0 "; // $sql_extra = " AND `contact`.`self` = 0 ";
if($cid) if ($cid) {
$sql_extra = sprintf(" AND `contact`.`id` = %d ",intval($cid)); $sql_extra = sprintf(" AND `contact`.`id` = %d ",intval($cid));
}
if(x($_GET,'updatedSince')) if (x($_GET,'updatedSince')) {
$update_limit = date("Y-m-d H:i:s",strtotime($_GET['updatedSince'])); $update_limit = date("Y-m-d H:i:s",strtotime($_GET['updatedSince']));
}
if ($global) { if ($global) {
$r = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `updated` >= '%s' AND `updated` >= `last_failure` AND NOT `hide` AND `network` IN ('%s', '%s', '%s')", $r = q("SELECT count(*) AS `total` FROM `gcontact` WHERE `updated` >= '%s' AND `updated` >= `last_failure` AND NOT `hide` AND `network` IN ('%s', '%s', '%s')",
dbesc($update_limit), dbesc($update_limit),
@ -70,7 +83,7 @@ function poco_init(App $a) {
dbesc(NETWORK_DIASPORA), dbesc(NETWORK_DIASPORA),
dbesc(NETWORK_OSTATUS) dbesc(NETWORK_OSTATUS)
); );
} elseif($system_mode) { } elseif ($system_mode) {
$r = q("SELECT count(*) AS `total` FROM `contact` WHERE `self` = 1 $r = q("SELECT count(*) AS `total` FROM `contact` WHERE `self` = 1
AND `uid` IN (SELECT `uid` FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1) "); AND `uid` IN (SELECT `uid` FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1) ");
} else { } else {
@ -84,14 +97,15 @@ function poco_init(App $a) {
dbesc(NETWORK_STATUSNET) dbesc(NETWORK_STATUSNET)
); );
} }
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$totalResults = intval($r[0]['total']); $totalResults = intval($r[0]['total']);
else } else {
$totalResults = 0; $totalResults = 0;
}
$startIndex = intval($_GET['startIndex']); $startIndex = intval($_GET['startIndex']);
if(! $startIndex) if (! $startIndex) {
$startIndex = 0; $startIndex = 0;
}
$itemsPerPage = ((x($_GET,'count') && intval($_GET['count'])) ? intval($_GET['count']) : $totalResults); $itemsPerPage = ((x($_GET,'count') && intval($_GET['count'])) ? intval($_GET['count']) : $totalResults);
if ($global) { if ($global) {
@ -105,7 +119,7 @@ function poco_init(App $a) {
intval($startIndex), intval($startIndex),
intval($itemsPerPage) intval($itemsPerPage)
); );
} elseif($system_mode) { } elseif ($system_mode) {
logger("Start system mode query", LOGGER_DEBUG); logger("Start system mode query", LOGGER_DEBUG);
$r = q("SELECT `contact`.*, `profile`.`about` AS `pabout`, `profile`.`locality` AS `plocation`, `profile`.`pub_keywords`, $r = q("SELECT `contact`.*, `profile`.`about` AS `pabout`, `profile`.`locality` AS `plocation`, `profile`.`pub_keywords`,
`profile`.`gender` AS `pgender`, `profile`.`address` AS `paddress`, `profile`.`region` AS `pregion`, `profile`.`gender` AS `pgender`, `profile`.`address` AS `paddress`, `profile`.`region` AS `pregion`,
@ -134,13 +148,15 @@ function poco_init(App $a) {
logger("Query done", LOGGER_DEBUG); logger("Query done", LOGGER_DEBUG);
$ret = array(); $ret = array();
if(x($_GET,'sorted')) if (x($_GET,'sorted')) {
$ret['sorted'] = false; $ret['sorted'] = false;
if(x($_GET,'filtered')) }
if (x($_GET,'filtered')) {
$ret['filtered'] = false; $ret['filtered'] = false;
if(x($_GET,'updatedSince') AND !$global) }
if (x($_GET,'updatedSince') AND !$global) {
$ret['updatedSince'] = false; $ret['updatedSince'] = false;
}
$ret['startIndex'] = (int) $startIndex; $ret['startIndex'] = (int) $startIndex;
$ret['itemsPerPage'] = (int) $itemsPerPage; $ret['itemsPerPage'] = (int) $itemsPerPage;
$ret['totalResults'] = (int) $totalResults; $ret['totalResults'] = (int) $totalResults;
@ -164,58 +180,61 @@ function poco_init(App $a) {
'generation' => false 'generation' => false
); );
if((! x($_GET,'fields')) || ($_GET['fields'] === '@all')) if ((! x($_GET,'fields')) || ($_GET['fields'] === '@all')) {
foreach($fields_ret as $k => $v) foreach ($fields_ret as $k => $v) {
$fields_ret[$k] = true; $fields_ret[$k] = true;
else { }
} else {
$fields_req = explode(',',$_GET['fields']); $fields_req = explode(',',$_GET['fields']);
foreach($fields_req as $f) foreach ($fields_req as $f) {
$fields_ret[trim($f)] = true; $fields_ret[trim($f)] = true;
}
} }
if(is_array($r)) { if (is_array($r)) {
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
foreach ($r as $rr) { foreach ($r as $rr) {
if (!isset($rr['generation'])) { if (!isset($rr['generation'])) {
if ($global) if ($global) {
$rr['generation'] = 3; $rr['generation'] = 3;
elseif ($system_mode) } elseif ($system_mode) {
$rr['generation'] = 1; $rr['generation'] = 1;
else } else {
$rr['generation'] = 2; $rr['generation'] = 2;
}
} }
if (($rr['about'] == "") AND isset($rr['pabout'])) if (($rr['about'] == "") AND isset($rr['pabout'])) {
$rr['about'] = $rr['pabout']; $rr['about'] = $rr['pabout'];
}
if ($rr['location'] == "") { if ($rr['location'] == "") {
if (isset($rr['plocation'])) if (isset($rr['plocation'])) {
$rr['location'] = $rr['plocation']; $rr['location'] = $rr['plocation'];
}
if (isset($rr['pregion']) AND ($rr['pregion'] != "")) { if (isset($rr['pregion']) AND ($rr['pregion'] != "")) {
if ($rr['location'] != "") if ($rr['location'] != "") {
$rr['location'] .= ", "; $rr['location'] .= ", ";
}
$rr['location'] .= $rr['pregion']; $rr['location'] .= $rr['pregion'];
} }
if (isset($rr['pcountry']) AND ($rr['pcountry'] != "")) { if (isset($rr['pcountry']) AND ($rr['pcountry'] != "")) {
if ($rr['location'] != "") if ($rr['location'] != "") {
$rr['location'] .= ", "; $rr['location'] .= ", ";
}
$rr['location'] .= $rr['pcountry']; $rr['location'] .= $rr['pcountry'];
} }
} }
if (($rr['gender'] == "") AND isset($rr['pgender'])) if (($rr['gender'] == "") AND isset($rr['pgender'])) {
$rr['gender'] = $rr['pgender']; $rr['gender'] = $rr['pgender'];
}
if (($rr['keywords'] == "") AND isset($rr['pub_keywords'])) if (($rr['keywords'] == "") AND isset($rr['pub_keywords'])) {
$rr['keywords'] = $rr['pub_keywords']; $rr['keywords'] = $rr['pub_keywords'];
}
if (isset($rr['account-type'])) if (isset($rr['account-type'])) {
$rr['contact-type'] = $rr['account-type']; $rr['contact-type'] = $rr['account-type'];
}
$about = Cache::get("about:".$rr['updated'].":".$rr['nurl']); $about = Cache::get("about:".$rr['updated'].":".$rr['nurl']);
if (is_null($about)) { if (is_null($about)) {
$about = bbcode($rr['about'], false, false); $about = bbcode($rr['about'], false, false);
@ -230,111 +249,122 @@ function poco_init(App $a) {
} }
$entry = array(); $entry = array();
if($fields_ret['id']) if ($fields_ret['id']) {
$entry['id'] = (int)$rr['id']; $entry['id'] = (int)$rr['id'];
if($fields_ret['displayName'])
$entry['displayName'] = $rr['name'];
if($fields_ret['aboutMe'])
$entry['aboutMe'] = $about;
if($fields_ret['currentLocation'])
$entry['currentLocation'] = $rr['location'];
if($fields_ret['gender'])
$entry['gender'] = $rr['gender'];
if($fields_ret['generation'])
$entry['generation'] = (int)$rr['generation'];
if($fields_ret['urls']) {
$entry['urls'] = array(array('value' => $rr['url'], 'type' => 'profile'));
if($rr['addr'] && ($rr['network'] !== NETWORK_MAIL))
$entry['urls'][] = array('value' => 'acct:' . $rr['addr'], 'type' => 'webfinger');
} }
if($fields_ret['preferredUsername']) if ($fields_ret['displayName']) {
$entry['displayName'] = $rr['name'];
}
if ($fields_ret['aboutMe']) {
$entry['aboutMe'] = $about;
}
if ($fields_ret['currentLocation']) {
$entry['currentLocation'] = $rr['location'];
}
if ($fields_ret['gender']) {
$entry['gender'] = $rr['gender'];
}
if ($fields_ret['generation']) {
$entry['generation'] = (int)$rr['generation'];
}
if ($fields_ret['urls']) {
$entry['urls'] = array(array('value' => $rr['url'], 'type' => 'profile'));
if ($rr['addr'] && ($rr['network'] !== NETWORK_MAIL)) {
$entry['urls'][] = array('value' => 'acct:' . $rr['addr'], 'type' => 'webfinger');
}
}
if ($fields_ret['preferredUsername']) {
$entry['preferredUsername'] = $rr['nick']; $entry['preferredUsername'] = $rr['nick'];
if($fields_ret['updated']) { }
if ($fields_ret['updated']) {
if (!$global) { if (!$global) {
$entry['updated'] = $rr['success_update']; $entry['updated'] = $rr['success_update'];
if ($rr['name-date'] > $entry['updated']) if ($rr['name-date'] > $entry['updated']) {
$entry['updated'] = $rr['name-date']; $entry['updated'] = $rr['name-date'];
}
if ($rr['uri-date'] > $entry['updated']) if ($rr['uri-date'] > $entry['updated']) {
$entry['updated'] = $rr['uri-date']; $entry['updated'] = $rr['uri-date'];
}
if ($rr['avatar-date'] > $entry['updated']) if ($rr['avatar-date'] > $entry['updated']) {
$entry['updated'] = $rr['avatar-date']; $entry['updated'] = $rr['avatar-date'];
} else }
} else {
$entry['updated'] = $rr['updated']; $entry['updated'] = $rr['updated'];
}
$entry['updated'] = date("c", strtotime($entry['updated'])); $entry['updated'] = date("c", strtotime($entry['updated']));
} }
if($fields_ret['photos']) if ($fields_ret['photos']) {
$entry['photos'] = array(array('value' => $rr['photo'], 'type' => 'profile')); $entry['photos'] = array(array('value' => $rr['photo'], 'type' => 'profile'));
if($fields_ret['network']) {
$entry['network'] = $rr['network'];
if ($entry['network'] == NETWORK_STATUSNET)
$entry['network'] = NETWORK_OSTATUS;
if (($entry['network'] == "") AND ($rr['self']))
$entry['network'] = NETWORK_DFRN;
} }
if($fields_ret['tags']) { if ($fields_ret['network']) {
$entry['network'] = $rr['network'];
if ($entry['network'] == NETWORK_STATUSNET) {
$entry['network'] = NETWORK_OSTATUS;
}
if (($entry['network'] == "") AND ($rr['self'])) {
$entry['network'] = NETWORK_DFRN;
}
}
if ($fields_ret['tags']) {
$tags = str_replace(","," ",$rr['keywords']); $tags = str_replace(","," ",$rr['keywords']);
$tags = explode(" ", $tags); $tags = explode(" ", $tags);
$cleaned = array(); $cleaned = array();
foreach ($tags as $tag) { foreach ($tags as $tag) {
$tag = trim(strtolower($tag)); $tag = trim(strtolower($tag));
if ($tag != "") if ($tag != "") {
$cleaned[] = $tag; $cleaned[] = $tag;
}
} }
$entry['tags'] = array($cleaned); $entry['tags'] = array($cleaned);
} }
if($fields_ret['address']) { if ($fields_ret['address']) {
$entry['address'] = array(); $entry['address'] = array();
// Deactivated. It just reveals too much data. (Although its from the default profile) // Deactivated. It just reveals too much data. (Although its from the default profile)
//if (isset($rr['paddress'])) //if (isset($rr['paddress']))
// $entry['address']['streetAddress'] = $rr['paddress']; // $entry['address']['streetAddress'] = $rr['paddress'];
if (isset($rr['plocation'])) if (isset($rr['plocation'])) {
$entry['address']['locality'] = $rr['plocation']; $entry['address']['locality'] = $rr['plocation'];
}
if (isset($rr['pregion'])) if (isset($rr['pregion'])) {
$entry['address']['region'] = $rr['pregion']; $entry['address']['region'] = $rr['pregion'];
}
// See above // See above
//if (isset($rr['ppostalcode'])) //if (isset($rr['ppostalcode']))
// $entry['address']['postalCode'] = $rr['ppostalcode']; // $entry['address']['postalCode'] = $rr['ppostalcode'];
if (isset($rr['pcountry'])) if (isset($rr['pcountry'])) {
$entry['address']['country'] = $rr['pcountry']; $entry['address']['country'] = $rr['pcountry'];
}
} }
if($fields_ret['contactType']) if ($fields_ret['contactType']) {
$entry['contactType'] = intval($rr['contact-type']); $entry['contactType'] = intval($rr['contact-type']);
}
$ret['entry'][] = $entry; $ret['entry'][] = $entry;
} }
} } else {
else
$ret['entry'][] = array(); $ret['entry'][] = array();
} }
else } else {
http_status_exit(500); http_status_exit(500);
}
logger("End of poco", LOGGER_DEBUG); logger("End of poco", LOGGER_DEBUG);
if($format === 'xml') { if ($format === 'xml') {
header('Content-type: text/xml'); header('Content-type: text/xml');
echo replace_macros(get_markup_template('poco_xml.tpl'),array_xmlify(array('$response' => $ret))); echo replace_macros(get_markup_template('poco_xml.tpl'),array_xmlify(array('$response' => $ret)));
killme(); killme();
} }
if($format === 'json') { if ($format === 'json') {
header('Content-type: application/json'); header('Content-type: application/json');
echo json_encode($ret); echo json_encode($ret);
killme(); killme();
} } else {
else
http_status_exit(500); http_status_exit(500);
}
} }

View file

@ -233,11 +233,11 @@ function profiles_post(App $a) {
$with = ((x($_POST,'with')) ? notags(trim($_POST['with'])) : ''); $with = ((x($_POST,'with')) ? notags(trim($_POST['with'])) : '');
if(! strlen($howlong)) if(! strlen($howlong)) {
$howlong = '0000-00-00 00:00:00'; $howlong = NULL_DATE;
else } else {
$howlong = datetime_convert(date_default_timezone_get(),'UTC',$howlong); $howlong = datetime_convert(date_default_timezone_get(),'UTC',$howlong);
}
// linkify the relationship target if applicable // linkify the relationship target if applicable
$withchanged = false; $withchanged = false;
@ -721,7 +721,7 @@ function profiles_content(App $a) {
'$gender' => gender_selector($r[0]['gender']), '$gender' => gender_selector($r[0]['gender']),
'$marital' => marital_selector($r[0]['marital']), '$marital' => marital_selector($r[0]['marital']),
'$with' => array('with', t("Who: \x28if applicable\x29"), strip_tags($r[0]['with']), t('Examples: cathy123, Cathy Williams, cathy@example.com')), '$with' => array('with', t("Who: \x28if applicable\x29"), strip_tags($r[0]['with']), t('Examples: cathy123, Cathy Williams, cathy@example.com')),
'$howlong' => array('howlong', t('Since [date]:'), ($r[0]['howlong'] === '0000-00-00 00:00:00' ? '' : datetime_convert('UTC',date_default_timezone_get(),$r[0]['howlong']))), '$howlong' => array('howlong', t('Since [date]:'), ($r[0]['howlong'] <= NULL_DATE ? '' : datetime_convert('UTC',date_default_timezone_get(),$r[0]['howlong']))),
'$sexual' => sexpref_selector($r[0]['sexual']), '$sexual' => sexpref_selector($r[0]['sexual']),
'$about' => array('about', t('Tell us about yourself...'), $r[0]['about']), '$about' => array('about', t('Tell us about yourself...'), $r[0]['about']),
'$xmpp' => array('xmpp', t('XMPP (Jabber) address:'), $r[0]['xmpp'], t("The XMPP address will be propagated to your contacts so that they can follow you.")), '$xmpp' => array('xmpp', t('XMPP (Jabber) address:'), $r[0]['xmpp'], t("The XMPP address will be propagated to your contacts so that they can follow you.")),

View file

@ -872,7 +872,7 @@ function settings_content(App $a) {
$mail_pubmail = ((dbm::is_result($r)) ? $r[0]['pubmail'] : 0); $mail_pubmail = ((dbm::is_result($r)) ? $r[0]['pubmail'] : 0);
$mail_action = ((dbm::is_result($r)) ? $r[0]['action'] : 0); $mail_action = ((dbm::is_result($r)) ? $r[0]['action'] : 0);
$mail_movetofolder = ((dbm::is_result($r)) ? $r[0]['movetofolder'] : ''); $mail_movetofolder = ((dbm::is_result($r)) ? $r[0]['movetofolder'] : '');
$mail_chk = ((dbm::is_result($r)) ? $r[0]['last_check'] : '0000-00-00 00:00:00'); $mail_chk = ((dbm::is_result($r)) ? $r[0]['last_check'] : NULL_DATE);
$tpl = get_markup_template("settings_connectors.tpl"); $tpl = get_markup_template("settings_connectors.tpl");

View file

@ -10,7 +10,7 @@ use \Friendica\Core\PConfig;
function worker_init($a){ function worker_init($a){
if (!Config::get("system", "frontend_worker") OR !Config::get("system", "worker")) { if (!Config::get("system", "frontend_worker")) {
return; return;
} }

View file

@ -1,6 +1,6 @@
<?php <?php
define('UPDATE_VERSION' , 1215); define('UPDATE_VERSION' , 1216);
/** /**
* *
@ -48,8 +48,8 @@ function update_1000() {
q("ALTER TABLE `intro` ADD `duplex` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `knowyou` "); q("ALTER TABLE `intro` ADD `duplex` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `knowyou` ");
q("ALTER TABLE `contact` ADD `duplex` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `rel` "); q("ALTER TABLE `contact` ADD `duplex` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `rel` ");
q("ALTER TABLE `contact` CHANGE `issued-pubkey` `issued-pubkey` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL"); q("ALTER TABLE `contact` CHANGE `issued-pubkey` `issued-pubkey` TEXTCHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL");
q("ALTER TABLE `contact` ADD `term-date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `avatar-date`"); q("ALTER TABLE `contact` ADD `term-date` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `avatar-date`");
} }
function update_1001() { function update_1001() {
@ -242,8 +242,8 @@ function update_1022() {
} }
function update_1023() { function update_1023() {
q("ALTER TABLE `user` ADD `register_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `timezone` , q("ALTER TABLE `user` ADD `register_date` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `timezone` ,
ADD `login_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `register_date` "); ADD `login_date` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `register_date` ");
} }
function update_1024() { function update_1024() {
@ -349,7 +349,7 @@ function update_1034() {
function update_1035() { function update_1035() {
q("ALTER TABLE `contact` ADD `success_update` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `last-update` "); q("ALTER TABLE `contact` ADD `success_update` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `last-update` ");
} }
@ -443,7 +443,7 @@ function update_1049() {
`user` CHAR( 255 ) NOT NULL , `user` CHAR( 255 ) NOT NULL ,
`pass` CHAR( 255 ) NOT NULL , `pass` CHAR( 255 ) NOT NULL ,
`reply_to` CHAR( 255 ) NOT NULL , `reply_to` CHAR( 255 ) NOT NULL ,
`last_check` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' `last_check` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00'
) ENGINE = MYISAM "); ) ENGINE = MYISAM ");
} }
@ -454,8 +454,8 @@ function update_1050() {
`filetype` CHAR( 64 ) NOT NULL , `filetype` CHAR( 64 ) NOT NULL ,
`filesize` INT NOT NULL , `filesize` INT NOT NULL ,
`data` LONGBLOB NOT NULL , `data` LONGBLOB NOT NULL ,
`created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', `created` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00',
`edited` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', `edited` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00',
`allow_cid` MEDIUMTEXT NOT NULL , `allow_cid` MEDIUMTEXT NOT NULL ,
`allow_gid` MEDIUMTEXT NOT NULL , `allow_gid` MEDIUMTEXT NOT NULL ,
`deny_cid` MEDIUMTEXT NOT NULL , `deny_cid` MEDIUMTEXT NOT NULL ,
@ -531,7 +531,7 @@ function update_1065() {
} }
function update_1066() { function update_1066() {
$r = q("ALTER TABLE `item` ADD `received` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `edited` "); $r = q("ALTER TABLE `item` ADD `received` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `edited` ");
if($r) if($r)
q("ALTER TABLE `item` ADD INDEX ( `received` ) "); q("ALTER TABLE `item` ADD INDEX ( `received` ) ");
@ -673,7 +673,7 @@ function update_1079() {
} }
function update_1080() { function update_1080() {
q("ALTER TABLE `fcontact` ADD `updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); q("ALTER TABLE `fcontact` ADD `updated` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00'");
} }
function update_1081() { function update_1081() {
@ -728,7 +728,7 @@ function update_1086() {
} }
function update_1087() { function update_1087() {
q("ALTER TABLE `item` ADD `commented` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `edited` "); q("ALTER TABLE `item` ADD `commented` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `edited` ");
$r = q("SELECT `id` FROM `item` WHERE `parent` = `id` "); $r = q("SELECT `id` FROM `item` WHERE `parent` = `id` ");
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
@ -747,8 +747,8 @@ function update_1087() {
function update_1088() { function update_1088() {
q("ALTER TABLE `user` ADD `account_expired` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `expire` , q("ALTER TABLE `user` ADD `account_expired` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `expire` ,
ADD `account_expires_on` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `account_expired` , ADD `account_expires_on` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `account_expired` ,
ADD `expire_notification_sent` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `account_expires_on` "); ADD `expire_notification_sent` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `account_expires_on` ");
} }
function update_1089() { function update_1089() {
@ -932,8 +932,8 @@ ADD INDEX ( `hidden` ) ");
function update_1109() { function update_1109() {
q("ALTER TABLE `conv` ADD `creator` CHAR( 255 ) NOT NULL , q("ALTER TABLE `conv` ADD `creator` CHAR( 255 ) NOT NULL ,
ADD `created` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', ADD `created` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00',
ADD `updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', ADD `updated` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00',
ADD `subject` MEDIUMTEXT NOT NULL, ADD `subject` MEDIUMTEXT NOT NULL,
ADD INDEX ( `created` ), ADD INDEX ( `updated` ) "); ADD INDEX ( `created` ), ADD INDEX ( `updated` ) ");
} }
@ -1112,7 +1112,7 @@ function update_1127() {
function update_1128() { function update_1128() {
q("alter table spam add `date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00' AFTER `term` "); q("alter table spam add `date` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `term` ");
} }
function update_1129() { function update_1129() {
@ -1262,7 +1262,7 @@ function update_1144() {
} }
function update_1145() { function update_1145() {
$r = q("alter table profile add howlong datetime not null default '0000-00-00 00:00:00' after `with`"); $r = q("alter table profile add howlong datetime not null default '0001-01-01 00:00:00' after `with`");
if(! $r) if(! $r)
return UPDATE_FAILED ; return UPDATE_FAILED ;
return UPDATE_SUCCESS ; return UPDATE_SUCCESS ;
@ -1562,11 +1562,11 @@ function update_1169() {
`iid` int(10) unsigned NOT NULL DEFAULT '0', `iid` int(10) unsigned NOT NULL DEFAULT '0',
`uid` int(10) unsigned NOT NULL DEFAULT '0', `uid` int(10) unsigned NOT NULL DEFAULT '0',
`contact-id` int(11) unsigned NOT NULL DEFAULT '0', `contact-id` int(11) unsigned NOT NULL DEFAULT '0',
`created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`edited` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`commented` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `commented` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`received` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`changed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `changed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`wall` tinyint(1) NOT NULL DEFAULT '0', `wall` tinyint(1) NOT NULL DEFAULT '0',
`private` tinyint(1) NOT NULL DEFAULT '0', `private` tinyint(1) NOT NULL DEFAULT '0',
`pubmail` tinyint(1) NOT NULL DEFAULT '0', `pubmail` tinyint(1) NOT NULL DEFAULT '0',

View file

@ -17,17 +17,46 @@ unset($db_host, $db_user, $db_pass, $db_data);
Config::load(); Config::load();
$maint_mode = 1; $maint_mode = 1;
if($argc > 1) if ($argc > 1) {
$maint_mode = intval($argv[1]); $maint_mode = intval($argv[1]);
set_config('system', 'maintenance', $maint_mode); }
if($maint_mode) Config::set('system', 'maintenance', $maint_mode);
if ($maint_mode AND ($argc > 2)) {
$reason_arr = $argv;
array_shift($reason_arr);
array_shift($reason_arr);
$reason = implode(' ', $reason_arr);
Config::set('system', 'maintenance_reason', $reason);
} else {
Config::set('system', 'maintenance_reason', '');
}
if ($maint_mode) {
$mode_str = "maintenance mode"; $mode_str = "maintenance mode";
else } else {
$mode_str = "normal mode"; $mode_str = "normal mode";
}
echo "\n\tSystem set in $mode_str\n";
if ($reason != '') {
echo "\tMaintenance reason: $reason\n\n";
} else {
echo "\n";
}
echo "\n\tSystem set in $mode_str\n\n";
echo "Usage:\n\n"; echo "Usage:\n\n";
echo "\tphp {$argv[0]} [1]\tSet the system in maintenance mode\n"; echo "\tphp {$argv[0]} [1] [Maintenance reason|redirection url]\n";
echo "\tphp {$argv[0]} 0 \tSet the system in normal mode\n\n"; echo "\t\tSet the system in maintenance mode\n\n";
echo "\t\tIf the optionally entered maintenance reason is an url\n";
echo "\t\tthe visitor is redirected to that page.\n";
echo "\n";
echo "\t\tExamples:\n";
echo "\t\t\tphp {$argv[0]} 1 System upgrade\n";
echo "\t\t\tphp {$argv[0]} 1 http://domain.tld/downtime\n";
echo "\n";
echo "\tphp {$argv[0]} 0\n";
echo "\t\tSet the system in normal mode\n\n";

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
<script> <script>
$(function(){ $(function(){
$("#cnftheme").click(function(){ $("#cnftheme").click(function(){
$.colorbox({ $.colorbox({
width: 800, width: 800,
@ -22,16 +22,16 @@
data[$(this).attr('name')] = $(this).children(":selected").val(); data[$(this).attr('name')] = $(this).children(":selected").val();
}); });
console.log(":)", url, data); console.log(":)", url, data);
$.post(url, data, function(data) { $.post(url, data, function(data) {
if(timer) clearTimeout(timer); if(timer) clearTimeout(timer);
NavUpdate(); NavUpdate();
$.colorbox.close(); $.colorbox.close();
}) })
return false; return false;
}); });
} }
}); });
return false; return false;
@ -40,7 +40,7 @@
</script> </script>
<div id='adminpage'> <div id='adminpage'>
<h1>{{$title}} - {{$page}}</h1> <h1>{{$title}} - {{$page}}</h1>
<form action="{{$baseurl}}/admin/site" method="post"> <form action="{{$baseurl}}/admin/site" method="post">
<input type='hidden' name='form_security_token' value='{{$form_security_token}}'> <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
@ -59,7 +59,7 @@
{{include file="field_checkbox.tpl" field=$hide_help}} {{include file="field_checkbox.tpl" field=$hide_help}}
{{include file="field_select.tpl" field=$singleuser}} {{include file="field_select.tpl" field=$singleuser}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
<h3>{{$registration}}</h3> <h3>{{$registration}}</h3>
{{include file="field_input.tpl" field=$register_text}} {{include file="field_input.tpl" field=$register_text}}
{{include file="field_select.tpl" field=$register_policy}} {{include file="field_select.tpl" field=$register_policy}}
@ -74,7 +74,7 @@
{{include file="field_input.tpl" field=$maximagelength}} {{include file="field_input.tpl" field=$maximagelength}}
{{include file="field_input.tpl" field=$jpegimagequality}} {{include file="field_input.tpl" field=$jpegimagequality}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
<h3>{{$corporate}}</h3> <h3>{{$corporate}}</h3>
{{include file="field_input.tpl" field=$allowed_sites}} {{include file="field_input.tpl" field=$allowed_sites}}
{{include file="field_input.tpl" field=$allowed_email}} {{include file="field_input.tpl" field=$allowed_email}}
@ -107,33 +107,26 @@
{{include file="field_checkbox.tpl" field=$thread_allow}} {{include file="field_checkbox.tpl" field=$thread_allow}}
{{include file="field_checkbox.tpl" field=$newuser_private}} {{include file="field_checkbox.tpl" field=$newuser_private}}
{{include file="field_checkbox.tpl" field=$enotify_no_content}} {{include file="field_checkbox.tpl" field=$enotify_no_content}}
{{include file="field_checkbox.tpl" field=$private_addons}} {{include file="field_checkbox.tpl" field=$private_addons}}
{{include file="field_checkbox.tpl" field=$disable_embedded}} {{include file="field_checkbox.tpl" field=$disable_embedded}}
{{include file="field_checkbox.tpl" field=$allow_users_remote_self}} {{include file="field_checkbox.tpl" field=$allow_users_remote_self}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
<h3>{{$advanced}}</h3> <h3>{{$advanced}}</h3>
{{include file="field_select.tpl" field=$rino}} {{include file="field_select.tpl" field=$rino}}
{{include file="field_checkbox.tpl" field=$no_utf}}
{{include file="field_checkbox.tpl" field=$verifyssl}} {{include file="field_checkbox.tpl" field=$verifyssl}}
{{include file="field_input.tpl" field=$proxy}} {{include file="field_input.tpl" field=$proxy}}
{{include file="field_input.tpl" field=$proxyuser}} {{include file="field_input.tpl" field=$proxyuser}}
{{include file="field_input.tpl" field=$timeout}} {{include file="field_input.tpl" field=$timeout}}
{{if NOT $worker.2}}
{{include file="field_input.tpl" field=$delivery_interval}}
{{include file="field_input.tpl" field=$poll_interval}}
{{/if}}
{{include file="field_input.tpl" field=$maxloadavg}} {{include file="field_input.tpl" field=$maxloadavg}}
{{include file="field_input.tpl" field=$maxloadavg_frontend}} {{include file="field_input.tpl" field=$maxloadavg_frontend}}
{{include file="field_input.tpl" field=$optimize_max_tablesize}} {{include file="field_input.tpl" field=$optimize_max_tablesize}}
{{include file="field_input.tpl" field=$optimize_fragmentation}} {{include file="field_input.tpl" field=$optimize_fragmentation}}
{{include file="field_input.tpl" field=$abandon_days}} {{include file="field_input.tpl" field=$abandon_days}}
{{include file="field_input.tpl" field=$lockpath}}
{{include file="field_input.tpl" field=$temppath}} {{include file="field_input.tpl" field=$temppath}}
{{include file="field_input.tpl" field=$basepath}} {{include file="field_input.tpl" field=$basepath}}
{{include file="field_checkbox.tpl" field=$suppress_tags}} {{include file="field_checkbox.tpl" field=$suppress_tags}}
{{include file="field_checkbox.tpl" field=$nodeinfo}} {{include file="field_checkbox.tpl" field=$nodeinfo}}
{{include file="field_input.tpl" field=$embedly}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
<h3>{{$portable_contacts}}</h3> <h3>{{$portable_contacts}}</h3>
@ -154,17 +147,14 @@
<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
<h3>{{$worker_title}}</h3> <h3>{{$worker_title}}</h3>
{{include file="field_checkbox.tpl" field=$worker}} {{include file="field_input.tpl" field=$worker_queues}}
{{if $worker.2}} {{include file="field_checkbox.tpl" field=$worker_dont_fork}}
{{include file="field_input.tpl" field=$worker_queues}} {{include file="field_checkbox.tpl" field=$worker_fastlane}}
{{include file="field_checkbox.tpl" field=$worker_dont_fork}} {{include file="field_checkbox.tpl" field=$worker_frontend}}
{{include file="field_checkbox.tpl" field=$worker_fastlane}}
{{include file="field_checkbox.tpl" field=$worker_frontend}}
{{/if}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
</form> </form>
{{* separate form for relocate... *}} {{* separate form for relocate... *}}
<form action="{{$baseurl}}/admin/site" method="post"> <form action="{{$baseurl}}/admin/site" method="post">
<input type='hidden' name='form_security_token' value='{{$form_security_token}}'> <input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
@ -173,5 +163,5 @@
<input type="hidden" name="page_site" value="{{$submit|escape:'html'}}"> <input type="hidden" name="page_site" value="{{$submit|escape:'html'}}">
<div class="submit"><input type="submit" name="relocate" value="{{$submit|escape:'html'}}" /></div> <div class="submit"><input type="submit" name="relocate" value="{{$submit|escape:'html'}}" /></div>
</form> </form>
</div> </div>

View file

@ -11,7 +11,7 @@
<dl> <dl>
<dt>{{$queues.label}}</dt> <dt>{{$queues.label}}</dt>
<dd>{{$queues.deliverq}} - <a href="{{$baseurl}}/admin/queue">{{$queues.queue}}</a>{{if $workeractive}} - {{$queues.workerq}}{{/if}}</dd> <dd>{{$queues.deliverq}} - <a href="{{$baseurl}}/admin/queue">{{$queues.queue}}</a> - {{$queues.workerq}}</dd>
</dl> </dl>
<dl> <dl>
<dt>{{$pending.0}}</dt> <dt>{{$pending.0}}</dt>

View file

@ -6,6 +6,7 @@
{{$event.html}} {{$event.html}}
{{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" target="_blank" class="plink-event-link icon s22 remote-link"></a>{{/if}} {{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" target="_blank" class="plink-event-link icon s22 remote-link"></a>{{/if}}
{{if $event.edit}}<a href="{{$event.edit.0}}" title="{{$event.edit.1}}" class="edit-event-link icon s22 pencil"></a>{{/if}} {{if $event.edit}}<a href="{{$event.edit.0}}" title="{{$event.edit.1}}" class="edit-event-link icon s22 pencil"></a>{{/if}}
{{if $event.drop}}<a href="{{$event.drop.0}}" onclick="return confirmDelete();" title="{{$event.drop.1}}" class="drop-event-link icon s22 delete"></a>{{/if}}
</div> </div>
<div class="clear"></div> <div class="clear"></div>
{{/foreach}} {{/foreach}}

View file

@ -1,2 +1,3 @@
<div id="maintenance-message">{{$sysdown}}</div> <h1 id="maintenance-message">{{$sysdown}}</h1>
<div id="maintenance-reason">{{$reason}}</div>

View file

@ -2193,6 +2193,9 @@ ul li:hover .contact-wrapper a.contact-action-link:hover {
#event-edit-form-wrapper #event-edit-time { #event-edit-form-wrapper #event-edit-time {
padding: 10px 0; padding: 10px 0;
} }
.event-buttons .plink-event-link {
margin-left: 20px;
}
/* Profiles Page */ /* Profiles Page */
.profile-listing-table { .profile-listing-table {
display: table; display: table;

View file

@ -181,7 +181,7 @@ function dropItem(url, elementId) {
$el.fadeTo('fast', 0.33, function () { $el.fadeTo('fast', 0.33, function () {
$.get(url).then(function() { $.get(url).then(function() {
$el.remove(); $el.remove();
}).error(function() { }).fail(function() {
// @todo Show related error message // @todo Show related error message
$el.show(); $el.show();
}).always(function() { }).always(function() {

View file

@ -17,8 +17,9 @@
</div> </div>
<div class="event-buttons pull-right"> <div class="event-buttons pull-right">
{{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="btn "><i class="fa fa-external-link" aria-hidden="true"></i></a>{{/if}} {{if $event.edit}}<a onclick="eventEdit('{{$event.edit.0}}')" title="{{$event.edit.1}}" class="edit-event-link btn"><i class="fa fa-pencil" aria-hidden="true"></i></a>{{/if}}
{{if $event.edit}}<a onclick="eventEdit('{{$event.edit.0}}')" title="{{$event.edit.1}}" class="btn"><i class="fa fa-pencil" aria-hidden="true"></i></a>{{/if}} {{if $event.drop}}<a href="{{$event.drop.0}}" onclick="return confirmDelete();" title="{{$event.drop.1}}" class="drop-event-link btn"><i class="fa fa-trash-o" aria-hidden="true"></i></a>{{/if}}
{{if $event.item.plink}}<a href="{{$event.plink.0}}" title="{{$event.plink.1}}" class="plink-event-link btn "><i class="fa fa-external-link" aria-hidden="true"></i></a>{{/if}}
</div> </div>
<div class="clear"></div> <div class="clear"></div>
</div> </div>

View file

@ -52,7 +52,6 @@
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
<h3>{{$advanced}}</h3> <h3>{{$advanced}}</h3>
{{include file="field_checkbox.tpl" field=$no_utf}}
{{include file="field_checkbox.tpl" field=$verifyssl}} {{include file="field_checkbox.tpl" field=$verifyssl}}
{{include file="field_input.tpl" field=$proxy}} {{include file="field_input.tpl" field=$proxy}}
{{include file="field_input.tpl" field=$proxyuser}} {{include file="field_input.tpl" field=$proxyuser}}

View file

@ -52,7 +52,6 @@
<div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit}}" /></div>
<h3>{{$advanced}}</h3> <h3>{{$advanced}}</h3>
{{include file="field_checkbox.tpl" field=$no_utf}}
{{include file="field_checkbox.tpl" field=$verifyssl}} {{include file="field_checkbox.tpl" field=$verifyssl}}
{{include file="field_input.tpl" field=$proxy}} {{include file="field_input.tpl" field=$proxy}}
{{include file="field_input.tpl" field=$proxyuser}} {{include file="field_input.tpl" field=$proxyuser}}