1
1
Fork 0

Merge remote-tracking branch 'upstream/develop' into 1706-ostatus-attach

Conflicts:
	include/text.php
This commit is contained in:
Michael 2017-07-13 20:38:18 +00:00
commit 181947f774
132 changed files with 18999 additions and 18076 deletions

3
.gitignore vendored
View file

@ -54,3 +54,6 @@ venv/
#ignore git projects in vendor #ignore git projects in vendor
vendor/**/.git vendor/**/.git
#ignore config files from JetBrains
/.idea

View file

@ -71,9 +71,14 @@ write or create files in your web directory, create an empty file called
.htconfig.php and make it writable by the web server. .htconfig.php and make it writable by the web server.
5. Visit your website with a web browser and follow the instructions. Please 5. Visit your website with a web browser and follow the instructions. Please
note any error messages and correct these before continuing. If you are using note any error messages and correct these before continuing.
SSL with a known signature authority (recommended), use the https: link to your
website. If you are using a self-signed cert or no cert, use the http: link. If you are using SSL with a known signature authority (recommended), use the
https: link to your website. If you are using a self-signed cert or no cert,
use the http: link.
If you need to specify a port for the connection to the database, you can do
so in the host name setting for the database.
6. *If* the automated installation fails for any reason, check the following: 6. *If* the automated installation fails for any reason, check the following:
@ -135,7 +140,17 @@ $a->config['system']['addon'] = 'js_upload,poormancron';
and save your changes. and save your changes.
9. (Optional) Reverse-proxying and HTTPS 9. (Recommended) Set up a backup plan
Bad things will happen. Let there be a hardware failure, a corrupted
database or whatever you can think of. So once the installation of your
Friendica node is done, you should make yoursef a backup plan.
The most important file is the `.htconfig.php` file in the base directory.
As it stores all your data, you should also have a recent dump of your
Friendica database at hand, should you have to recover your node.
10. (Optional) Reverse-proxying and HTTPS
Friendica looks for some well-known HTTP headers indicating a reverse-proxy Friendica looks for some well-known HTTP headers indicating a reverse-proxy
terminating an HTTPS connection. While the standard from RFC 7239 specifies terminating an HTTPS connection. While the standard from RFC 7239 specifies

View file

@ -1 +1 @@
3.5.3dev 3.5.3-dev

2
Vagrantfile vendored
View file

@ -47,7 +47,7 @@ Vagrant.configure(2) do |config|
###################################################################### ######################################################################
# Share a folder between host and guest # Share a folder between host and guest
config.vm.synced_folder "./", "/vagrant/", owner: "www-data", group: "vagrant" config.vm.synced_folder ".", "/vagrant", id: "vagrant-root", owner: "www-data", group: "vagrant"
# Provider-specific configuration so you can fine-tune various # Provider-specific configuration so you can fine-tune various

124
boot.php
View file

@ -22,6 +22,7 @@ require_once(__DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'a
use Friendica\App; use Friendica\App;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Util\Lock;
require_once 'include/config.php'; require_once 'include/config.php';
require_once 'include/network.php'; require_once 'include/network.php';
@ -35,12 +36,13 @@ require_once 'include/features.php';
require_once 'include/identity.php'; require_once 'include/identity.php';
require_once 'update.php'; require_once 'update.php';
require_once 'include/dbstructure.php'; require_once 'include/dbstructure.php';
require_once 'include/poller.php';
define ( 'FRIENDICA_PLATFORM', 'Friendica'); define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_CODENAME', 'Asparagus'); define ( 'FRIENDICA_CODENAME', 'Asparagus');
define ( 'FRIENDICA_VERSION', '3.5.3dev' ); define ( 'FRIENDICA_VERSION', '3.5.3-dev' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1227 ); define ( 'DB_UPDATE_VERSION', 1232 );
/** /**
* @brief Constant with a HTML line break. * @brief Constant with a HTML line break.
@ -992,7 +994,7 @@ function notice($s) {
function info($s) { function info($s) {
$a = get_app(); $a = get_app();
if (local_user() AND get_pconfig(local_user(), 'system', 'ignore_info')) { if (local_user() && get_pconfig(local_user(), 'system', 'ignore_info')) {
return; return;
} }
@ -1062,12 +1064,13 @@ function proc_run($cmd) {
$arr = array('args' => $args, 'run_cmd' => true); $arr = array('args' => $args, 'run_cmd' => true);
call_hooks("proc_run", $arr); call_hooks("proc_run", $arr);
if (!$arr['run_cmd'] OR ! count($args)) { if (!$arr['run_cmd'] || ! count($args)) {
return; return;
} }
$priority = PRIORITY_MEDIUM; $priority = PRIORITY_MEDIUM;
$dont_fork = get_config("system", "worker_dont_fork"); $dont_fork = get_config("system", "worker_dont_fork");
$created = datetime_convert();
if (is_int($run_parameter)) { if (is_int($run_parameter)) {
$priority = $run_parameter; $priority = $run_parameter;
@ -1075,6 +1078,9 @@ function proc_run($cmd) {
if (isset($run_parameter['priority'])) { if (isset($run_parameter['priority'])) {
$priority = $run_parameter['priority']; $priority = $run_parameter['priority'];
} }
if (isset($run_parameter['created'])) {
$created = $run_parameter['created'];
}
if (isset($run_parameter['dont_fork'])) { if (isset($run_parameter['dont_fork'])) {
$dont_fork = $run_parameter['dont_fork']; $dont_fork = $run_parameter['dont_fork'];
} }
@ -1084,10 +1090,10 @@ function proc_run($cmd) {
array_shift($argv); array_shift($argv);
$parameters = json_encode($argv); $parameters = json_encode($argv);
$found = dba::select('workerqueue', array('id'), array('parameter' => $parameters), array('limit' => 1)); $found = dba::select('workerqueue', array('id'), array('parameter' => $parameters, 'done' => false), array('limit' => 1));
if (!dbm::is_result($found)) { if (!dbm::is_result($found)) {
dba::insert('workerqueue', array('parameter' => $parameters, 'created' => datetime_convert(), 'priority' => $priority)); dba::insert('workerqueue', array('parameter' => $parameters, 'created' => $created, 'priority' => $priority));
} }
// Should we quit and wait for the poller to be called as a cronjob? // Should we quit and wait for the poller to be called as a cronjob?
@ -1095,18 +1101,16 @@ function proc_run($cmd) {
return; return;
} }
// Checking number of workers // If there is a lock then we don't have to check for too much worker
$workers = q("SELECT COUNT(*) AS `workers` FROM `workerqueue` WHERE `executed` > '%s'", dbesc(NULL_DATE)); if (!Lock::set('poller_worker', 0)) {
return;
// Get number of allowed number of worker threads
$queues = intval(get_config("system", "worker_queues"));
if ($queues == 0) {
$queues = 4;
} }
// If there are already enough workers running, don't fork another one // If there are already enough workers running, don't fork another one
if ($workers[0]["workers"] >= $queues) { $quit = poller_too_much_workers();
Lock::remove('poller_worker');
if ($quit) {
return; return;
} }
@ -1388,6 +1392,43 @@ function get_server() {
return($server); return($server);
} }
function get_temppath() {
$a = get_app();
$temppath = get_config("system", "temppath");
if (($temppath != "") && App::directory_usable($temppath)) {
// We have a temp path and it is usable
return $temppath;
}
// We don't have a working preconfigured temp path, so we take the system path.
$temppath = sys_get_temp_dir();
// Check if it is usable
if (($temppath != "") && App::directory_usable($temppath)) {
// To avoid any interferences with other systems we create our own directory
$new_temppath = $temppath . "/" . $a->get_hostname();
if (!is_dir($new_temppath)) {
/// @TODO There is a mkdir()+chmod() upwards, maybe generalize this (+ configurable) into a function/method?
mkdir($new_temppath);
}
if (App::directory_usable($new_temppath)) {
// The new path is usable, we are happy
set_config("system", "temppath", $new_temppath);
return $new_temppath;
} else {
// We can't create a subdirectory, strange.
// But the directory seems to work, so we use it but don't store it.
return $temppath;
}
}
// Reaching this point means that the operating system is configured badly.
return '';
}
function get_cachefile($file, $writemode = true) { function get_cachefile($file, $writemode = true) {
$cache = get_itemcachepath(); $cache = get_itemcachepath();
@ -1416,7 +1457,7 @@ function clear_cache($basepath = "", $path = "") {
$path = $basepath; $path = $basepath;
} }
if (($path == "") OR (!is_dir($path))) { if (($path == "") || (!is_dir($path))) {
return; return;
} }
@ -1433,10 +1474,10 @@ function clear_cache($basepath = "", $path = "") {
if ($dh = opendir($path)) { if ($dh = opendir($path)) {
while (($file = readdir($dh)) !== false) { while (($file = readdir($dh)) !== false) {
$fullpath = $path . "/" . $file; $fullpath = $path . "/" . $file;
if ((filetype($fullpath) == "dir") and ($file != ".") and ($file != "..")) { if ((filetype($fullpath) == "dir") && ($file != ".") && ($file != "..")) {
clear_cache($basepath, $fullpath); clear_cache($basepath, $fullpath);
} }
if ((filetype($fullpath) == "file") and (filectime($fullpath) < (time() - $cachetime))) { if ((filetype($fullpath) == "file") && (filectime($fullpath) < (time() - $cachetime))) {
unlink($fullpath); unlink($fullpath);
} }
} }
@ -1453,7 +1494,7 @@ function get_itemcachepath() {
} }
$itemcache = get_config('system', 'itemcache'); $itemcache = get_config('system', 'itemcache');
if (($itemcache != "") AND App::directory_usable($itemcache)) { if (($itemcache != "") && App::directory_usable($itemcache)) {
return $itemcache; return $itemcache;
} }
@ -1480,7 +1521,7 @@ function get_itemcachepath() {
*/ */
function get_spoolpath() { function get_spoolpath() {
$spoolpath = get_config('system', 'spoolpath'); $spoolpath = get_config('system', 'spoolpath');
if (($spoolpath != "") AND App::directory_usable($spoolpath)) { if (($spoolpath != "") && App::directory_usable($spoolpath)) {
// We have a spool path and it is usable // We have a spool path and it is usable
return $spoolpath; return $spoolpath;
} }
@ -1510,43 +1551,6 @@ function get_spoolpath() {
return ""; return "";
} }
function get_temppath() {
$a = get_app();
$temppath = get_config("system", "temppath");
if (($temppath != "") AND App::directory_usable($temppath)) {
// We have a temp path and it is usable
return $temppath;
}
// We don't have a working preconfigured temp path, so we take the system path.
$temppath = sys_get_temp_dir();
// Check if it is usable
if (($temppath != "") AND App::directory_usable($temppath)) {
// To avoid any interferences with other systems we create our own directory
$new_temppath = $temppath . "/" . $a->get_hostname();
if (!is_dir($new_temppath)) {
/// @TODO There is a mkdir()+chmod() upwards, maybe generalize this (+ configurable) into a function/method?
mkdir($new_temppath);
}
if (App::directory_usable($new_temppath)) {
// The new path is usable, we are happy
set_config("system", "temppath", $new_temppath);
return $new_temppath;
} else {
// We can't create a subdirectory, strange.
// But the directory seems to work, so we use it but don't store it.
return $temppath;
}
}
// Reaching this point means that the operating system is configured badly.
return '';
}
/// @deprecated /// @deprecated
function set_template_engine(App $a, $engine = 'internal') { function set_template_engine(App $a, $engine = 'internal') {
/// @note This function is no longer necessary, but keep it as a wrapper to the class method /// @note This function is no longer necessary, but keep it as a wrapper to the class method
@ -1647,7 +1651,7 @@ function argv($x) {
function infinite_scroll_data($module) { function infinite_scroll_data($module) {
if (get_pconfig(local_user(), 'system', 'infinite_scroll') if (get_pconfig(local_user(), 'system', 'infinite_scroll')
AND ($module == "network") AND ($_GET["mode"] != "minimal")) { && ($module == "network") && ($_GET["mode"] != "minimal")) {
// get the page number // get the page number
if (is_string($_GET["page"])) { if (is_string($_GET["page"])) {
@ -1660,12 +1664,12 @@ function infinite_scroll_data($module) {
// try to get the uri from which we load the content // try to get the uri from which we load the content
foreach ($_GET AS $param => $value) { foreach ($_GET AS $param => $value) {
if (($param != "page") AND ($param != "q")) { if (($param != "page") && ($param != "q")) {
$reload_uri .= "&" . $param . "=" . urlencode($value); $reload_uri .= "&" . $param . "=" . urlencode($value);
} }
} }
if (($a->page_offset != "") AND ! strstr($reload_uri, "&offset=")) { if (($a->page_offset != "") && ! strstr($reload_uri, "&offset=")) {
$reload_uri .= "&offset=" . urlencode($a->page_offset); $reload_uri .= "&offset=" . urlencode($a->page_offset);
} }

View file

@ -1,6 +1,6 @@
-- ------------------------------------------ -- ------------------------------------------
-- Friendica 3.5.2-rc (Asparagus) -- Friendica 3.5.3-dev (Asparagus)
-- DB_UPDATE_VERSION 1227 -- DB_UPDATE_VERSION 1231
-- ------------------------------------------ -- ------------------------------------------
@ -580,7 +580,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 '0001-01-01 00:00:00', `pid` int(10) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY(`id`) PRIMARY KEY(`id`)
) DEFAULT COLLATE utf8mb4_general_ci; ) DEFAULT COLLATE utf8mb4_general_ci;
@ -1114,8 +1114,11 @@ CREATE TABLE IF NOT EXISTS `workerqueue` (
`created` datetime NOT NULL DEFAULT '0001-01-01 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 '0001-01-01 00:00:00', `executed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00',
`done` tinyint(1) NOT NULL DEFAULT 0,
PRIMARY KEY(`id`), PRIMARY KEY(`id`),
INDEX `pid` (`pid`), INDEX `pid` (`pid`),
INDEX `priority_created` (`priority`,`created`) INDEX `parameter` (`parameter`(64)),
INDEX `priority_created` (`priority`,`created`),
INDEX `executed` (`executed`)
) DEFAULT COLLATE utf8mb4_general_ci; ) DEFAULT COLLATE utf8mb4_general_ci;

View file

@ -89,7 +89,10 @@ A ['Tips for New Members'](newmember) link will show up on your network and home
Retrieving Personal Data Retrieving Personal Data
--- ---
You can export a copy of your personal data in XML format from the "Export personal data" link at the top of your settings page. You can export a copy of your personal data in JSON format from the "Export personal data" link at the top of your settings page.
You need this file to relocate your Friendica account to another node.
This might be necessary, e.g. if your node suffers a severe hardware problem and is not recoverable.
See Also See Also
--- ---

View file

@ -64,6 +64,7 @@ Here's a few primers if you are new to Friendica or to the PSR-2 coding standard
* By default, strings are enclosed in single quotes, but feel free to use double quotes if it makes more sense (SQL queries, adding tabs and line feeds). * By default, strings are enclosed in single quotes, but feel free to use double quotes if it makes more sense (SQL queries, adding tabs and line feeds).
* Operators are wrapped by spaces, e.g. `$var === true`, `$var = 1 + 2` and `'string' . $concat . 'enation'` * Operators are wrapped by spaces, e.g. `$var === true`, `$var = 1 + 2` and `'string' . $concat . 'enation'`
* Braces are mandatory in conditions * Braces are mandatory in conditions
* Boolean operators are `&&` and `||` for PHP conditions, `AND` and `OR` for SQL queries
* No closing PHP tag * No closing PHP tag
* No trailing spaces * No trailing spaces

View file

@ -82,6 +82,8 @@ Restart mysql and you should be fine.
Point your web browser to the new site and follow the instructions. Point your web browser to the new site and follow the instructions.
Please note any error messages and correct these before continuing. Please note any error messages and correct these before continuing.
If you need to specify a port for the connection to the database, you can do so in the host name setting for the database.
*If* the automated installation fails for any reason, check the following: *If* the automated installation fails for any reason, check the following:
* Does ".htconfig.php" exist? If not, edit htconfig.php and change the system settings. Rename to .htconfig.php * Does ".htconfig.php" exist? If not, edit htconfig.php and change the system settings. Rename to .htconfig.php
@ -142,3 +144,11 @@ The addon tree has to be updated separately like so:
cd mywebsite/addon cd mywebsite/addon
git pull git pull
###Set up a backup plan
Bad things will happen.
Let there be a hardware failure, a corrupted database or whatever you can think of.
So once the installation of your Friendica node is done, you should make yoursef a backup plan.
The most important file is the `.htconfig.php` file in the base directory.
As it stores all your data, you should also have a recent dump of your Friendica database at hand, should you have to recover your node.

View file

@ -2,10 +2,10 @@ Table locks
=========== ===========
| Field | Description | Type | Null | Key | Default | Extra | | Field | Description | Type | Null | Key | Default | Extra |
|---------|------------------|--------------|------|-----|---------------------|----------------| |---------|------------------|------------------|------|-----|---------------------|----------------|
| id | sequential ID | int(11) | NO | PRI | NULL | auto_increment | | id | sequential ID | int(11) | NO | PRI | NULL | auto_increment |
| name | | varchar(128) | NO | | | | | name | | varchar(128) | NO | | | |
| locked | | tinyint(1) | NO | | 0 | | | locked | | tinyint(1) | NO | | 0 | |
| created | | datetime | YES | | 0001-01-01 00:00:00 | | | pid | Process ID | int(10) unsigned | NO | | 0 | |
Return to [database documentation](help/database) Return to [database documentation](help/database)

View file

@ -9,5 +9,6 @@ Table workerqueue
| created | | datetime | NO | MUL | 0001-01-01 00:00:00 | | | created | | datetime | NO | MUL | 0001-01-01 00:00:00 | |
| pid | | int(11) | NO | | 0 | | | pid | | int(11) | NO | | 0 | |
| executed | | datetime | NO | | 0001-01-01 00:00:00 | | | executed | | datetime | NO | | 0001-01-01 00:00:00 | |
| done | set to 1 if done | tinyint(1) | NO | | 0 | |
Return to [database documentation](help/database) Return to [database documentation](help/database)

View file

@ -95,9 +95,11 @@ Ein ['Tipp für neue Mitglieder'](newmember)-Link zeigt sich in den ersten beide
**Persönliche Daten exportieren** **Persönliche Daten exportieren**
Du kannst eine Kopie Deiner persönlichen Daten in einer XML-Datei exportieren. Du kannst eine Kopie Deiner persönlichen Daten in einer JSON-Datei exportieren.
Gehe hierzu in Deinen Einstellungen auf "Persönliche Daten exportieren". Gehe hierzu in Deinen Einstellungen auf "Persönliche Daten exportieren".
Dies ist z.B. dann nützlich wenn du mit deinem Account auf einen anderen Friendica Knoten umziehen möchstest.
Ein Grund hierfür könnte sein, dass der Server auf dem dieser Friendica Knoten läuft dauerhaft wegen eines Hardware Problems ausfällt.
**Schau Dir ebenfalls folgende Seiten an** **Schau Dir ebenfalls folgende Seiten an**

View file

@ -108,3 +108,11 @@ Du kannst auch weitere Addons/Plugins ergänzen. Ändere den Eintrag folgenderma
`$a->config['system']['addon'] = 'js_upload,poormancron';` `$a->config['system']['addon'] = 'js_upload,poormancron';`
und speichere deine Änderungen. und speichere deine Änderungen.
###Erstelle einen Backup Plan
Es werden schlimme Dinge geschehen.
Sei es nun ein Hardwareversage oder eine korrumpierte Datenbank.
Deshalb solltest du dir nachdem die Installation deines Friendica Knotens abgeschlossen ist einen Backup Plan erstellen.
Die wichtigste Datei ist die `.htconfig.php` im Stammverzeichnis deiner Friendica Installation.
Und da alle Daten in der Datenbank gespeichert werden, solltest du einen nicht all zu alten Dump der Friendica Datenbank zur Hand haben, solltest du deinen Knoten wieder herstellen müssen.

View file

@ -35,8 +35,8 @@ Example: To set the directory value please add this line to your .htconfig.php:
* **db_loglimit_index_high** - Number of index rows to be logged anyway (for any index) * **db_loglimit_index_high** - Number of index rows to be logged anyway (for any index)
* **db_log_index_blacklist** - Blacklist of indexes that shouldn't be watched * **db_log_index_blacklist** - Blacklist of indexes that shouldn't be watched
* **dbclean** (Boolean) - Enable the automatic database cleanup process * **dbclean** (Boolean) - Enable the automatic database cleanup process
* **dbclean-expire-days** (Integer) - Days after which remote items will be deleted. Own items, and marked or filed items are kept.
* **default_service_class** - * **default_service_class** -
* **delivery_batch_count** - Number of deliveries per process. Default value is 1. (Disabled when using the worker)
* **diaspora_test** (Boolean) - For development only. Disables the message transfer. * **diaspora_test** (Boolean) - For development only. Disables the message transfer.
* **directory** - The path to global directory. If not set then "http://dir.friendica.social" is used. * **directory** - The path to global directory. If not set then "http://dir.friendica.social" is used.
* **disable_email_validation** (Boolean) - Disables the check if a mail address is in a valid format and can be resolved via DNS. * **disable_email_validation** (Boolean) - Disables the check if a mail address is in a valid format and can be resolved via DNS.
@ -67,6 +67,8 @@ Example: To set the directory value please add this line to your .htconfig.php:
* **ostatus_poll_timeframe** - Defines how old an item can be to try to complete the conversation with it. * **ostatus_poll_timeframe** - Defines how old an item can be to try to complete the conversation with it.
* **paranoia** (Boolean) - Log out users if their IP address changed. * **paranoia** (Boolean) - Log out users if their IP address changed.
* **permit_crawling** (Boolean) - Restricts the search for not logged in users to one search per minute. * **permit_crawling** (Boolean) - Restricts the search for not logged in users to one search per minute.
* **worker_debug** (Boolean) - If enabled, it prints out the number of running processes split by priority.
* **worker_fetch_limit** - Number of worker tasks that are fetched in a single query. Default is 5.
* **profiler** (Boolean) - Enable internal timings to help optimize code. Needed for "rendertime" addon. Default is false. * **profiler** (Boolean) - Enable internal timings to help optimize code. Needed for "rendertime" addon. Default is false.
* **free_crawls** - Number of "free" searches when "permit_crawling" is activated (Default value is 10) * **free_crawls** - Number of "free" searches when "permit_crawling" is activated (Default value is 10)
* **crawl_permit_period** - Period in seconds between allowed searches when the number of free searches is reached and "permit_crawling" is activated (Default value is 60) * **crawl_permit_period** - Period in seconds between allowed searches when the number of free searches is reached and "permit_crawling" is activated (Default value is 60)
@ -116,3 +118,10 @@ If more then one account should be able to access the admin panel, seperate the
If you want to have a more personalized closing line for the notification emails you can set a variable for the admin_name. If you want to have a more personalized closing line for the notification emails you can set a variable for the admin_name.
$a->config['admin_name'] = "Marvin"; $a->config['admin_name'] = "Marvin";
## Database Settings
The configuration variables db_host, db_user, db_pass and db_data are holding your credentials for the database connection.
If you need to specify a port to access the database, you can do so by appending ":portnumber" to the db_host variable.
$db_host = 'your.mysqlhost.com:123456';

View file

@ -262,33 +262,33 @@ function get_contact_details_by_url($url, $uid = -1, $default = array()) {
$profile = $default; $profile = $default;
} }
if (($profile["photo"] == "") AND isset($default["photo"])) { if (($profile["photo"] == "") && isset($default["photo"])) {
$profile["photo"] = $default["photo"]; $profile["photo"] = $default["photo"];
} }
if (($profile["name"] == "") AND isset($default["name"])) { if (($profile["name"] == "") && isset($default["name"])) {
$profile["name"] = $default["name"]; $profile["name"] = $default["name"];
} }
if (($profile["network"] == "") AND isset($default["network"])) { if (($profile["network"] == "") && isset($default["network"])) {
$profile["network"] = $default["network"]; $profile["network"] = $default["network"];
} }
if (($profile["thumb"] == "") AND isset($profile["photo"])) { if (($profile["thumb"] == "") && isset($profile["photo"])) {
$profile["thumb"] = $profile["photo"]; $profile["thumb"] = $profile["photo"];
} }
if (($profile["micro"] == "") AND isset($profile["thumb"])) { if (($profile["micro"] == "") && isset($profile["thumb"])) {
$profile["micro"] = $profile["thumb"]; $profile["micro"] = $profile["thumb"];
} }
if ((($profile["addr"] == "") OR ($profile["name"] == "")) AND ($profile["gid"] != 0) AND if ((($profile["addr"] == "") || ($profile["name"] == "")) && ($profile["gid"] != 0) &&
in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) { in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) {
proc_run(PRIORITY_LOW, "include/update_gcontact.php", $profile["gid"]); proc_run(PRIORITY_LOW, "include/update_gcontact.php", $profile["gid"]);
} }
// Show contact details of Diaspora contacts only if connected // Show contact details of Diaspora contacts only if connected
if (($profile["cid"] == 0) AND ($profile["network"] == NETWORK_DIASPORA)) { if (($profile["cid"] == 0) && ($profile["network"] == NETWORK_DIASPORA)) {
$profile["location"] = ""; $profile["location"] = "";
$profile["about"] = ""; $profile["about"] = "";
$profile["gender"] = ""; $profile["gender"] = "";
@ -517,7 +517,7 @@ function contacts_not_grouped($uid,$start = 0,$count = 0) {
* @return integer Contact ID * @return integer Contact ID
*/ */
function get_contact($url, $uid = 0, $no_update = false) { function get_contact($url, $uid = 0, $no_update = false) {
logger("Get contact data for url ".$url." and user ".$uid." - ".App::callstack(), LOGGER_DEBUG);; logger("Get contact data for url ".$url." and user ".$uid." - ".App::callstack(), LOGGER_DEBUG);
$data = array(); $data = array();
$contact_id = 0; $contact_id = 0;
@ -527,39 +527,28 @@ function get_contact($url, $uid = 0, $no_update = false) {
} }
// We first try the nurl (http://server.tld/nick), most common case // We first try the nurl (http://server.tld/nick), most common case
$contacts = q("SELECT `id`, `avatar-date` FROM `contact` $contact = dba::select('contact', array('id', 'avatar-date'), array('nurl' => normalise_link($url), 'uid' => $uid), array('limit' => 1));
WHERE `nurl` = '%s'
AND `uid` = %d",
dbesc(normalise_link($url)),
intval($uid));
// Then the addr (nick@server.tld) // Then the addr (nick@server.tld)
if (! dbm::is_result($contacts)) { if (!dbm::is_result($contact)) {
$contacts = q("SELECT `id`, `avatar-date` FROM `contact` $contact = dba::select('contact', array('id', 'avatar-date'), array('addr' => $url, 'uid' => $uid), array('limit' => 1));
WHERE `addr` = '%s'
AND `uid` = %d",
dbesc($url),
intval($uid));
} }
// Then the alias (which could be anything) // Then the alias (which could be anything)
if (! dbm::is_result($contacts)) { if (!dbm::is_result($contact)) {
$contacts = q("SELECT `id`, `avatar-date` FROM `contact` $r = dba::p("SELECT `id`, `avatar-date` FROM `contact` WHERE `alias` IN (?, ?) AND `uid` = ? LIMIT 1",
WHERE `alias` IN ('%s', '%s') $url, normalise_link($url), $uid);
AND `uid` = %d", $contact = dba::fetch($r);
dbesc($url), dba::close($r);
dbesc(normalise_link($url)),
intval($uid));
} }
if (dbm::is_result($contacts)) { if (dbm::is_result($contact)) {
$contact_id = $contacts[0]["id"]; $contact_id = $contact["id"];
// Update the contact every 7 days // Update the contact every 7 days
$update_photo = ($contacts[0]['avatar-date'] < datetime_convert('','','now -7 days')); $update_contact = ($contact['avatar-date'] < datetime_convert('','','now -7 days'));
if (!$update_photo OR $no_update) { if (!$update_contact || $no_update) {
return $contact_id; return $contact_id;
} }
} elseif ($uid != 0) { } elseif ($uid != 0) {
@ -576,45 +565,29 @@ function get_contact($url, $uid = 0, $no_update = false) {
} }
// Get data from the gcontact table // Get data from the gcontact table
$gcontacts = q("SELECT `name`, `nick`, `url`, `photo`, `addr`, `alias`, `network` FROM `gcontact` WHERE `nurl` = '%s'", $gcontacts = dba::select('gcontact', array('name', 'nick', 'url', 'photo', 'addr', 'alias', 'network'),
dbesc(normalise_link($url))); array('nurl' => normalise_link($url)), array('limit' => 1));
if (!$gcontacts) { if (!dbm::is_result($gcontacts)) {
return 0; return 0;
} }
$data = $gcontacts[0]; $data = array_merge($data, $gcontacts);
} }
$url = $data["url"]; $url = $data["url"];
if (!$contact_id) { if (!$contact_id) {
q("INSERT INTO `contact` (`uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`, dba::insert('contact', array('uid' => $uid, 'created' => datetime_convert(), 'url' => $data["url"],
`name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`, 'nurl' => normalise_link($data["url"]), 'addr' => $data["addr"],
`batch`, `request`, `confirm`, `poco`, `name-date`, `uri-date`, 'alias' => $data["alias"], 'notify' => $data["notify"], 'poll' => $data["poll"],
`writable`, `blocked`, `readonly`, `pending`) 'name' => $data["name"], 'nick' => $data["nick"], 'photo' => $data["photo"],
VALUES (%d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', 1, 0, 0, 0)", 'keywords' => $data["keywords"], 'location' => $data["location"], 'about' => $data["about"],
intval($uid), 'network' => $data["network"], 'pubkey' => $data["pubkey"],
dbesc(datetime_convert()), 'rel' => CONTACT_IS_SHARING, 'priority' => $data["priority"],
dbesc($data["url"]), 'batch' => $data["batch"], 'request' => $data["request"],
dbesc(normalise_link($data["url"])), 'confirm' => $data["confirm"], 'poco' => $data["poco"],
dbesc($data["addr"]), 'name-date' => datetime_convert(), 'uri-date' => datetime_convert(),
dbesc($data["alias"]), 'avatar-date' => datetime_convert(), 'writable' => 1, 'blocked' => 0,
dbesc($data["notify"]), 'readonly' => 0, 'pending' => 0));
dbesc($data["poll"]),
dbesc($data["name"]),
dbesc($data["nick"]),
dbesc($data["photo"]),
dbesc($data["network"]),
dbesc($data["pubkey"]),
intval(CONTACT_IS_SHARING),
intval($data["priority"]),
dbesc($data["batch"]),
dbesc($data["request"]),
dbesc($data["confirm"]),
dbesc($data["poco"]),
dbesc(datetime_convert()),
dbesc(datetime_convert())
);
$contacts = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2", $contacts = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2",
dbesc(normalise_link($data["url"])), dbesc(normalise_link($data["url"])),
@ -626,49 +599,65 @@ function get_contact($url, $uid = 0, $no_update = false) {
$contact_id = $contacts[0]["id"]; $contact_id = $contacts[0]["id"];
// Update the newly created contact from data in the gcontact table // Update the newly created contact from data in the gcontact table
$gcontacts = q("SELECT `location`, `about`, `keywords`, `gender` FROM `gcontact` WHERE `nurl` = '%s'", $gcontact = dba::select('gcontact', array('location', 'about', 'keywords', 'gender'),
dbesc(normalise_link($data["url"]))); array('nurl' => normalise_link($data["url"])), array('limit' => 1));
if (dbm::is_result($gcontacts)) { if (dbm::is_result($gcontact)) {
logger("Update contact " . $data["url"] . ' from gcontact'); // Only use the information when the probing hadn't fetched these values
q("UPDATE `contact` SET `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `id` = %d", if ($data['keywords'] != '') {
dbesc($gcontacts[0]["location"]), dbesc($gcontacts[0]["about"]), dbesc($gcontacts[0]["keywords"]), unset($gcontact['keywords']);
dbesc($gcontacts[0]["gender"]), intval($contact_id));
} }
if ($data['location'] != '') {
unset($gcontact['location']);
}
if ($data['about'] != '') {
unset($gcontact['about']);
}
dba::update('contact', $gcontact, array('id' => $contact_id));
} }
if (count($contacts) > 1 AND $uid == 0 AND $contact_id != 0 AND $url != "") { if (count($contacts) > 1 && $uid == 0 && $contact_id != 0 && $data["url"] != "") {
q("DELETE FROM `contact` WHERE `nurl` = '%s' AND `id` != %d AND NOT `self`", dba::e("DELETE FROM `contact` WHERE `nurl` = ? AND `uid` = 0 AND `id` != ? AND NOT `self`",
dbesc(normalise_link($url)), normalise_link($data["url"]), $contact_id);
intval($contact_id)); }
} }
require_once "Photo.php"; require_once "Photo.php";
update_contact_avatar($data["photo"], $uid, $contact_id); update_contact_avatar($data["photo"], $uid, $contact_id);
$contacts = q("SELECT `addr`, `alias`, `name`, `nick` FROM `contact` WHERE `id` = %d", intval($contact_id)); $contact = dba::select('contact', array('addr', 'alias', 'name', 'nick', 'keywords', 'location', 'about', 'avatar-date'),
array('id' => $contact_id), array('limit' => 1));
// This condition should always be true // This condition should always be true
if (!dbm::is_result($contacts)) { if (!dbm::is_result($contact)) {
return $contact_id; return $contact_id;
} }
// Only update if there had something been changed $updated = array('addr' => $data['addr'],
if ($data["addr"] != $contacts[0]["addr"] OR 'alias' => $data['alias'],
$data["alias"] != $contacts[0]["alias"] OR 'name' => $data['name'],
$data["name"] != $contacts[0]["name"] OR 'nick' => $data['nick']);
$data["nick"] != $contacts[0]["nick"]) {
q("UPDATE `contact` SET `addr` = '%s', `alias` = '%s', `name` = '%s', `nick` = '%s', if ($data['keywords'] != '') {
`name-date` = '%s', `uri-date` = '%s' WHERE `id` = %d", $updated['keywords'] = $data['keywords'];
dbesc($data["addr"]),
dbesc($data["alias"]),
dbesc($data["name"]),
dbesc($data["nick"]),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
intval($contact_id)
);
} }
if ($data['location'] != '') {
$updated['location'] = $data['location'];
}
if ($data['about'] != '') {
$updated['about'] = $data['about'];
}
if (($data["addr"] != $contact["addr"]) || ($data["alias"] != $contact["alias"])) {
$updated['uri-date'] = datetime_convert();
}
if (($data["name"] != $contact["name"]) || ($data["nick"] != $contact["nick"])) {
$updated['name-date'] = datetime_convert();
}
$updated['avatar-date'] = datetime_convert();
dba::update('contact', $updated, array('id' => $contact_id), $contact);
return $contact_id; return $contact_id;
} }
@ -769,7 +758,7 @@ function formatted_location($profile) {
if($profile['locality']) if($profile['locality'])
$location .= $profile['locality']; $location .= $profile['locality'];
if($profile['region'] AND ($profile['locality'] != $profile['region'])) { if($profile['region'] && ($profile['locality'] != $profile['region'])) {
if($location) if($location)
$location .= ', '; $location .= ', ';

View file

@ -512,7 +512,7 @@ class NotificationsManager {
$myurl = substr($myurl,strpos($myurl,'://')+3); $myurl = substr($myurl,strpos($myurl,'://')+3);
$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl); $myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
$diasp_url = str_replace('/profile/','/u/',$myurl); $diasp_url = str_replace('/profile/','/u/',$myurl);
$sql_extra = sprintf(" AND ( `item`.`author-link` regexp '%s' or `item`.`tag` regexp '%s' or `item`.`tag` regexp '%s' ) ", $sql_extra = sprintf(" AND ( `item`.`author-link` regexp '%s' OR `item`.`tag` regexp '%s' OR `item`.`tag` regexp '%s' ) ",
dbesc($myurl . '$'), dbesc($myurl . '$'),
dbesc($myurl . '\\]'), dbesc($myurl . '\\]'),
dbesc($diasp_url . '\\]') dbesc($diasp_url . '\\]')

View file

@ -785,7 +785,7 @@ function update_contact_avatar($avatar, $uid, $cid, $force = false) {
$data = array($r[0]["photo"], $r[0]["thumb"], $r[0]["micro"]); $data = array($r[0]["photo"], $r[0]["thumb"], $r[0]["micro"]);
} }
if (($r[0]["avatar"] != $avatar) OR $force) { if (($r[0]["avatar"] != $avatar) || $force) {
$photos = import_profile_photo($avatar, $uid, $cid, true); $photos = import_profile_photo($avatar, $uid, $cid, true);
if ($photos) { if ($photos) {
@ -825,7 +825,7 @@ function import_profile_photo($photo, $uid, $cid, $quit_on_error = false) {
$filename = basename($photo); $filename = basename($photo);
$img_str = fetch_url($photo, true); $img_str = fetch_url($photo, true);
if ($quit_on_error AND ($img_str == "")) { if ($quit_on_error && ($img_str == "")) {
return false; return false;
} }
@ -883,7 +883,7 @@ function import_profile_photo($photo, $uid, $cid, $quit_on_error = false) {
$photo_failure = true; $photo_failure = true;
} }
if ($photo_failure AND $quit_on_error) { if ($photo_failure && $quit_on_error) {
return false; return false;
} }
@ -902,7 +902,7 @@ function get_photo_info($url) {
$data = Cache::get($url); $data = Cache::get($url);
if (is_null($data) OR !$data OR !is_array($data)) { if (is_null($data) || !$data || !is_array($data)) {
$img_str = fetch_url($url, true, $redirects, 4); $img_str = fetch_url($url, true, $redirects, 4);
$filesize = strlen($img_str); $filesize = strlen($img_str);
@ -996,7 +996,7 @@ function store_photo(App $a, $uid, $imagedata = "", $url = "") {
/// $default_cid = $r[0]['id']; /// $default_cid = $r[0]['id'];
/// $community_page = (($r[0]['page-flags'] == PAGE_COMMUNITY) ? true : false); /// $community_page = (($r[0]['page-flags'] == PAGE_COMMUNITY) ? true : false);
if ((strlen($imagedata) == 0) AND ($url == "")) { if ((strlen($imagedata) == 0) && ($url == "")) {
logger("No image data and no url provided", LOGGER_DEBUG); logger("No image data and no url provided", LOGGER_DEBUG);
return(array()); return(array());
} elseif (strlen($imagedata) == 0) { } elseif (strlen($imagedata) == 0) {
@ -1102,7 +1102,7 @@ function store_photo(App $a, $uid, $imagedata = "", $url = "") {
} }
} }
if ($width > 160 AND $height > 160) { if ($width > 160 && $height > 160) {
$x = 0; $x = 0;
$y = 0; $y = 0;

View file

@ -209,7 +209,7 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
$tabindex = ($tabindex > 0 ? "tabindex=\"$tabindex\"" : ""); $tabindex = ($tabindex > 0 ? "tabindex=\"$tabindex\"" : "");
if ($privmail AND $preselected) { if ($privmail && $preselected) {
$sql_extra .= " AND `id` IN (".implode(",", $preselected).")"; $sql_extra .= " AND `id` IN (".implode(",", $preselected).")";
$hidepreselected = ' style="display: none;"'; $hidepreselected = ' style="display: none;"';
} else { } else {
@ -261,7 +261,7 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
$o .= "</select>\r\n"; $o .= "</select>\r\n";
if ($privmail AND $preselected) { if ($privmail && $preselected) {
$o .= implode(", ", $receiverlist); $o .= implode(", ", $receiverlist);
} }
@ -388,6 +388,9 @@ function populate_acl($user = null, $show_jotnets = false) {
} }
function construct_acl_data(App $a, $user) { function construct_acl_data(App $a, $user) {
// This function is now deactivated. It seems as if the generated data isn't used anywhere.
/// @todo Remove this function and all function calls before releasing Friendica 3.5.3
return;
// Get group and contact information for html ACL selector // Get group and contact information for html ACL selector
$acl_data = acl_lookup($a, 'html'); $acl_data = acl_lookup($a, 'html');

View file

@ -483,7 +483,7 @@ $called_api = null;
logger("api_get_user: Fetching user data for user ".$contact_id, LOGGER_DEBUG); logger("api_get_user: Fetching user data for user ".$contact_id, LOGGER_DEBUG);
// Searching for contact URL // Searching for contact URL
if (!is_null($contact_id) AND (intval($contact_id) == 0)) { if (!is_null($contact_id) && (intval($contact_id) == 0)) {
$user = dbesc(normalise_link($contact_id)); $user = dbesc(normalise_link($contact_id));
$url = $user; $url = $user;
$extra_query = "AND `contact`.`nurl` = '%s' "; $extra_query = "AND `contact`.`nurl` = '%s' ";
@ -493,7 +493,7 @@ $called_api = null;
} }
// Searching for contact id with uid = 0 // Searching for contact id with uid = 0
if (!is_null($contact_id) AND (intval($contact_id) != 0)) { if (!is_null($contact_id) && (intval($contact_id) != 0)) {
$user = dbesc(api_unique_id_to_url($contact_id)); $user = dbesc(api_unique_id_to_url($contact_id));
if ($user == "") { if ($user == "") {
@ -538,7 +538,7 @@ $called_api = null;
} }
} }
if (is_null($user) AND ($a->argc > (count($called_api) - 1)) AND (count($called_api) > 0)) { if (is_null($user) && ($a->argc > (count($called_api) - 1)) && (count($called_api) > 0)) {
$argid = count($called_api); $argid = count($called_api);
list($user, $null) = explode(".", $a->argv[$argid]); list($user, $null) = explode(".", $a->argv[$argid]);
if (is_numeric($user)) { if (is_numeric($user)) {
@ -600,7 +600,7 @@ $called_api = null;
$network_name = network_to_name($r[0]['network'], $r[0]['url']); $network_name = network_to_name($r[0]['network'], $r[0]['url']);
// If no nick where given, extract it from the address // If no nick where given, extract it from the address
if (($r[0]['nick'] == "") OR ($r[0]['name'] == $r[0]['nick'])) { if (($r[0]['nick'] == "") || ($r[0]['name'] == $r[0]['nick'])) {
$r[0]['nick'] = api_get_nick($r[0]["url"]); $r[0]['nick'] = api_get_nick($r[0]["url"]);
} }
@ -716,7 +716,7 @@ $called_api = null;
$starred = 0; $starred = 0;
// Add a nick if it isn't present there // Add a nick if it isn't present there
if (($uinfo[0]['nick'] == "") OR ($uinfo[0]['name'] == $uinfo[0]['nick'])) { if (($uinfo[0]['nick'] == "") || ($uinfo[0]['name'] == $uinfo[0]['nick'])) {
$uinfo[0]['nick'] = api_get_nick($uinfo[0]["url"]); $uinfo[0]['nick'] = api_get_nick($uinfo[0]["url"]);
} }
@ -749,7 +749,7 @@ $called_api = null;
'contributors_enabled' => false, 'contributors_enabled' => false,
'is_translator' => false, 'is_translator' => false,
'is_translation_enabled' => false, 'is_translation_enabled' => false,
'following' => (($uinfo[0]['rel'] == CONTACT_IS_FOLLOWER) OR ($uinfo[0]['rel'] == CONTACT_IS_FRIEND)), 'following' => (($uinfo[0]['rel'] == CONTACT_IS_FOLLOWER) || ($uinfo[0]['rel'] == CONTACT_IS_FRIEND)),
'follow_request_sent' => false, 'follow_request_sent' => false,
'statusnet_blocking' => false, 'statusnet_blocking' => false,
'notifications' => false, 'notifications' => false,
@ -777,10 +777,10 @@ $called_api = null;
$status_user = api_get_user($a, $item["author-link"]); $status_user = api_get_user($a, $item["author-link"]);
$status_user["protected"] = (($item["allow_cid"] != "") OR $status_user["protected"] = (($item["allow_cid"] != "") ||
($item["allow_gid"] != "") OR ($item["allow_gid"] != "") ||
($item["deny_cid"] != "") OR ($item["deny_cid"] != "") ||
($item["deny_gid"] != "") OR ($item["deny_gid"] != "") ||
$item["private"]); $item["private"]);
if ($item['thr-parent'] == $item['uri']) { if ($item['thr-parent'] == $item['uri']) {
@ -1305,9 +1305,9 @@ $called_api = null;
$status_info["entities"] = $converted["entities"]; $status_info["entities"] = $converted["entities"];
} }
if (($lastwall['item_network'] != "") AND ($status["source"] == 'web')) { if (($lastwall['item_network'] != "") && ($status["source"] == 'web')) {
$status_info["source"] = network_to_name($lastwall['item_network'], $user_info['url']); $status_info["source"] = network_to_name($lastwall['item_network'], $user_info['url']);
} elseif (($lastwall['item_network'] != "") AND (network_to_name($lastwall['item_network'], $user_info['url']) != $status_info["source"])) { } elseif (($lastwall['item_network'] != "") && (network_to_name($lastwall['item_network'], $user_info['url']) != $status_info["source"])) {
$status_info["source"] = trim($status_info["source"].' ('.network_to_name($lastwall['item_network'], $user_info['url']).')'); $status_info["source"] = trim($status_info["source"].' ('.network_to_name($lastwall['item_network'], $user_info['url']).')');
} }
@ -1393,11 +1393,11 @@ $called_api = null;
$user_info["status"]["entities"] = $converted["entities"]; $user_info["status"]["entities"] = $converted["entities"];
} }
if (($lastwall['item_network'] != "") AND ($user_info["status"]["source"] == 'web')) { if (($lastwall['item_network'] != "") && ($user_info["status"]["source"] == 'web')) {
$user_info["status"]["source"] = network_to_name($lastwall['item_network'], $user_info['url']); $user_info["status"]["source"] = network_to_name($lastwall['item_network'], $user_info['url']);
} }
if (($lastwall['item_network'] != "") AND (network_to_name($lastwall['item_network'], $user_info['url']) != $user_info["status"]["source"])) { if (($lastwall['item_network'] != "") && (network_to_name($lastwall['item_network'], $user_info['url']) != $user_info["status"]["source"])) {
$user_info["status"]["source"] = trim($user_info["status"]["source"] . ' (' . network_to_name($lastwall['item_network'], $user_info['url']) . ')'); $user_info["status"]["source"] = trim($user_info["status"]["source"] . ' (' . network_to_name($lastwall['item_network'], $user_info['url']) . ')');
} }
@ -2178,7 +2178,7 @@ $called_api = null;
`contact`.`id` AS `cid` `contact`.`id` AS `cid`
FROM `item`, `contact` FROM `item`, `contact`
WHERE `item`.`uid` = %d WHERE `item`.`uid` = %d
AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0 AND `item`.`visible` = 1 AND `item`.`moderated` = 0 AND `item`.`deleted` = 0
AND `item`.`starred` = 1 AND `item`.`starred` = 1
AND `contact`.`id` = `item`.`contact-id` AND `contact`.`id` = `item`.`contact-id`
AND (NOT `contact`.`blocked` OR `contact`.`pending`) AND (NOT `contact`.`blocked` OR `contact`.`pending`)
@ -2263,13 +2263,13 @@ $called_api = null;
$statustitle = trim($item['title']); $statustitle = trim($item['title']);
if (($statustitle != '') and (strpos($statusbody, $statustitle) !== false)) { if (($statustitle != '') && (strpos($statusbody, $statustitle) !== false)) {
$statustext = trim($statusbody); $statustext = trim($statusbody);
} else { } else {
$statustext = trim($statustitle."\n\n".$statusbody); $statustext = trim($statustitle."\n\n".$statusbody);
} }
if (($item["network"] == NETWORK_FEED) and (strlen($statustext)> 1000)) { if (($item["network"] == NETWORK_FEED) && (strlen($statustext)> 1000)) {
$statustext = substr($statustext, 0, 1000)."... \n".$item["plink"]; $statustext = substr($statustext, 0, 1000)."... \n".$item["plink"];
} }
@ -2402,8 +2402,8 @@ $called_api = null;
$offset = 0; $offset = 0;
//foreach ($urls[1] AS $id=>$url) { //foreach ($urls[1] AS $id=>$url) {
foreach ($ordered_urls AS $url) { foreach ($ordered_urls AS $url) {
if ((substr($url["title"], 0, 7) != "http://") AND (substr($url["title"], 0, 8) != "https://") AND if ((substr($url["title"], 0, 7) != "http://") && (substr($url["title"], 0, 8) != "https://") &&
!strpos($url["title"], "http://") AND !strpos($url["title"], "https://")) !strpos($url["title"], "http://") && !strpos($url["title"], "https://"))
$display_url = $url["title"]; $display_url = $url["title"];
else { else {
$display_url = str_replace(array("http://www.", "https://www."), array("", ""), $url["url"]); $display_url = str_replace(array("http://www.", "https://www."), array("", ""), $url["url"]);
@ -2455,7 +2455,7 @@ $called_api = null;
$scale = scale_image($image[0], $image[1], 150); $scale = scale_image($image[0], $image[1], 150);
$sizes["thumb"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"); $sizes["thumb"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit");
if (($image[0] > 150) OR ($image[1] > 150)) { if (($image[0] > 150) || ($image[1] > 150)) {
$scale = scale_image($image[0], $image[1], 340); $scale = scale_image($image[0], $image[1], 340);
$sizes["small"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"); $sizes["small"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit");
} }
@ -2463,7 +2463,7 @@ $called_api = null;
$scale = scale_image($image[0], $image[1], 600); $scale = scale_image($image[0], $image[1], 600);
$sizes["medium"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"); $sizes["medium"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit");
if (($image[0] > 600) OR ($image[1] > 600)) { if (($image[0] > 600) || ($image[1] > 600)) {
$scale = scale_image($image[0], $image[1], 1024); $scale = scale_image($image[0], $image[1], 1024);
$sizes["large"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit"); $sizes["large"] = array("w" => $scale["width"], "h" => $scale["height"], "resize" => "fit");
} }
@ -2668,7 +2668,7 @@ $called_api = null;
list($status_user, $owner_user) = api_item_get_user($a, $item); list($status_user, $owner_user) = api_item_get_user($a, $item);
// Look if the posts are matching if they should be filtered by user id // Look if the posts are matching if they should be filtered by user id
if ($filter_user AND ($status_user["id"] != $user_info["id"])) { if ($filter_user && ($status_user["id"] != $user_info["id"])) {
continue; continue;
} }
@ -2712,9 +2712,9 @@ $called_api = null;
$status["entities"] = $converted["entities"]; $status["entities"] = $converted["entities"];
} }
if (($item['item_network'] != "") AND ($status["source"] == 'web')) { if (($item['item_network'] != "") && ($status["source"] == 'web')) {
$status["source"] = network_to_name($item['item_network'], $user_info['url']); $status["source"] = network_to_name($item['item_network'], $user_info['url']);
} elseif (($item['item_network'] != "") AND (network_to_name($item['item_network'], $user_info['url']) != $status["source"])) { } elseif (($item['item_network'] != "") && (network_to_name($item['item_network'], $user_info['url']) != $status["source"])) {
$status["source"] = trim($status["source"].' ('.network_to_name($item['item_network'], $user_info['url']).')'); $status["source"] = trim($status["source"].' ('.network_to_name($item['item_network'], $user_info['url']).')');
} }
@ -2723,7 +2723,7 @@ $called_api = null;
// It doesn't work reliable with the link if its a feed // It doesn't work reliable with the link if its a feed
//$IsRetweet = ($item['owner-link'] != $item['author-link']); //$IsRetweet = ($item['owner-link'] != $item['author-link']);
//if ($IsRetweet) //if ($IsRetweet)
// $IsRetweet = (($item['owner-name'] != $item['author-name']) OR ($item['owner-avatar'] != $item['author-avatar'])); // $IsRetweet = (($item['owner-name'] != $item['author-name']) || ($item['owner-avatar'] != $item['author-avatar']));
if ($item["id"] == $item["parent"]) { if ($item["id"] == $item["parent"]) {
@ -3022,7 +3022,7 @@ $called_api = null;
if (api_user() === false) throw new ForbiddenException(); if (api_user() === false) throw new ForbiddenException();
if (!x($_POST, "text") OR (!x($_POST,"screen_name") AND !x($_POST,"user_id"))) return; if (!x($_POST, "text") || (!x($_POST,"screen_name") && !x($_POST,"user_id"))) return;
$sender = api_get_user($a); $sender = api_get_user($a);
@ -3982,7 +3982,7 @@ $called_api = null;
} }
function prepare_photo_data($type, $scale, $photo_id) { function prepare_photo_data($type, $scale, $photo_id) {
$scale_sql = ($scale === false ? "" : sprintf("and scale=%d", intval($scale))); $scale_sql = ($scale === false ? "" : sprintf("AND scale=%d", intval($scale)));
$data_sql = ($scale === false ? "" : "data, "); $data_sql = ($scale === false ? "" : "data, ");
// added allow_cid, allow_gid, deny_cid, deny_gid to output as string like stored in database // added allow_cid, allow_gid, deny_cid, deny_gid to output as string like stored in database
@ -4334,7 +4334,7 @@ $called_api = null;
$in_reply_to['user_id_str'] = NULL; $in_reply_to['user_id_str'] = NULL;
$in_reply_to['screen_name'] = NULL; $in_reply_to['screen_name'] = NULL;
if (($item['thr-parent'] != $item['uri']) AND (intval($item['parent']) != intval($item['id']))) { if (($item['thr-parent'] != $item['uri']) && (intval($item['parent']) != intval($item['id']))) {
$r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1", $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1",
intval($item['uid']), intval($item['uid']),
dbesc($item['thr-parent'])); dbesc($item['thr-parent']));
@ -4415,7 +4415,7 @@ $called_api = null;
if (isset($data["text"])) if (isset($data["text"]))
$body = $data["text"]; $body = $data["text"];
if (($body == "") AND (isset($data["title"]))) if (($body == "") && (isset($data["title"])))
$body = $data["title"]; $body = $data["title"];
if (isset($data["url"])) if (isset($data["url"]))

View file

@ -29,7 +29,7 @@ if (isset($_COOKIE["Friendica"])) {
new_cookie($authcookiedays*24*60*60, $r[0]); new_cookie($authcookiedays*24*60*60, $r[0]);
// Do the authentification if not done by now // Do the authentification if not done by now
if (!isset($_SESSION) OR !isset($_SESSION['authenticated'])) { if (!isset($_SESSION) || !isset($_SESSION['authenticated'])) {
authenticate_success($r[0]); authenticate_success($r[0]);
if (get_config('system','paranoia')) if (get_config('system','paranoia'))

View file

@ -89,7 +89,7 @@ class exAuth {
// Open the logfile if the logfile name is defined // Open the logfile if the logfile name is defined
if ($this->sLogFile != '') if ($this->sLogFile != '')
$this->rLogFile = fopen($this->sLogFile, "a") or die("Error opening log file: ". $this->sLogFile); $this->rLogFile = fopen($this->sLogFile, "a") || die("Error opening log file: ". $this->sLogFile);
$this->writeLog("[exAuth] start"); $this->writeLog("[exAuth] start");

View file

@ -188,7 +188,7 @@ function bb2diaspora($Text, $preserve_nl = false, $fordiaspora = true) {
$Text = $converter->convert($Text); $Text = $converter->convert($Text);
// unmask the special chars back to HTML // unmask the special chars back to HTML
$Text = str_replace(array('&_lt_;', '&_gt_;', '&_amp_;'), array('&lt;', '&gt;', '&amp;'), $Text); $Text = str_replace(array('&\_lt\_;', '&\_gt\_;', '&\_amp\_;'), array('&lt;', '&gt;', '&amp;'), $Text);
$a->save_timestamp($stamp1, "parser"); $a->save_timestamp($stamp1, "parser");

View file

@ -49,14 +49,14 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
$data["title"] = str_replace(array("http://", "https://"), "", $data["title"]); $data["title"] = str_replace(array("http://", "https://"), "", $data["title"]);
} }
if (((strpos($data["text"], "[img=") !== false) OR (strpos($data["text"], "[img]") !== false)) AND ($data["image"] != "")) { if (((strpos($data["text"], "[img=") !== false) || (strpos($data["text"], "[img]") !== false)) && ($data["image"] != "")) {
$data["preview"] = $data["image"]; $data["preview"] = $data["image"];
$data["image"] = ""; $data["image"] = "";
} }
if ($simplehtml == 7) { if ($simplehtml == 7) {
$text = style_url_for_mastodon($data["url"]); $text = style_url_for_mastodon($data["url"]);
} elseif (($simplehtml != 4) AND ($simplehtml != 0)) { } elseif (($simplehtml != 4) && ($simplehtml != 0)) {
$text = sprintf('<a href="%s" target="_blank">%s</a><br>', $data["url"], $data["title"]); $text = sprintf('<a href="%s" target="_blank">%s</a><br>', $data["url"], $data["title"]);
} else { } else {
$text = sprintf('<span class="type-%s">', $data["type"]); $text = sprintf('<span class="type-%s">', $data["type"]);
@ -71,13 +71,13 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) {
if (strstr(strtolower($oembed), "<iframe ")) { if (strstr(strtolower($oembed), "<iframe ")) {
$text = $oembed; $text = $oembed;
} else { } else {
if (($data["image"] != "") AND !strstr(strtolower($oembed), "<img ")) { if (($data["image"] != "") && !strstr(strtolower($oembed), "<img ")) {
$text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br />', $data["url"], proxy_url($data["image"]), $data["title"]); $text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a><br />', $data["url"], proxy_url($data["image"]), $data["title"]);
} elseif (($data["preview"] != "") AND !strstr(strtolower($oembed), "<img ")) { } elseif (($data["preview"] != "") && !strstr(strtolower($oembed), "<img ")) {
$text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br />', $data["url"], proxy_url($data["preview"]), $data["title"]); $text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-preview" /></a><br />', $data["url"], proxy_url($data["preview"]), $data["title"]);
} }
if (($data["type"] == "photo") AND ($data["url"] != "") AND ($data["image"] != "")) { if (($data["type"] == "photo") && ($data["url"] != "") && ($data["image"] != "")) {
$text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a>', $data["url"], proxy_url($data["image"]), $data["title"]); $text .= sprintf('<a href="%s" target="_blank"><img src="%s" alt="" title="%s" class="attachment-image" /></a>', $data["url"], proxy_url($data["image"]), $data["title"]);
} else { } else {
$text .= $oembed; $text .= $oembed;
@ -103,25 +103,25 @@ function bb_remove_share_information($Text, $plaintext = false, $nolink = false)
$title = htmlentities($data["title"], ENT_QUOTES, 'UTF-8', false); $title = htmlentities($data["title"], ENT_QUOTES, 'UTF-8', false);
$text = htmlentities($data["text"], ENT_QUOTES, 'UTF-8', false); $text = htmlentities($data["text"], ENT_QUOTES, 'UTF-8', false);
if ($plaintext OR (($title != "") AND strstr($text, $title))) { if ($plaintext || (($title != "") && strstr($text, $title))) {
$data["title"] = $data["url"]; $data["title"] = $data["url"];
} elseif (($text != "") AND strstr($title, $text)) { } elseif (($text != "") && strstr($title, $text)) {
$data["text"] = $data["title"]; $data["text"] = $data["title"];
$data["title"] = $data["url"]; $data["title"] = $data["url"];
} }
if (($data["text"] == "") AND ($data["title"] != "") AND ($data["url"] == "")) { if (($data["text"] == "") && ($data["title"] != "") && ($data["url"] == "")) {
return $data["title"] . $data["after"]; return $data["title"] . $data["after"];
} }
// If the link already is included in the post, don't add it again // If the link already is included in the post, don't add it again
if (($data["url"] != "") AND strpos($data["text"], $data["url"])) { if (($data["url"] != "") && strpos($data["text"], $data["url"])) {
return $data["text"] . $data["after"]; return $data["text"] . $data["after"];
} }
$text = $data["text"]; $text = $data["text"];
if (($data["url"] != "") AND ($data["title"] != "")) { if (($data["url"] != "") && ($data["title"] != "")) {
$text .= "\n[url=" . $data["url"] . "]" . $data["title"] . "[/url]"; $text .= "\n[url=" . $data["url"] . "]" . $data["title"] . "[/url]";
} elseif (($data["url"] != "")) { } elseif (($data["url"] != "")) {
$text .= "\n" . $data["url"]; $text .= "\n" . $data["url"];
@ -147,7 +147,7 @@ function cleancss($input) {
for ($i = 0; $i < strlen($input); $i++) { for ($i = 0; $i < strlen($input); $i++) {
$char = substr($input, $i, 1); $char = substr($input, $i, 1);
if (($char >= "a") and ($char <= "z")) { if (($char >= "a") && ($char <= "z")) {
$cleaned .= $char; $cleaned .= $char;
} }
@ -167,7 +167,7 @@ function cleancss($input) {
function bb_style_url($match) { function bb_style_url($match) {
$url = $match[1]; $url = $match[1];
if (isset($match[2]) AND ($match[1] != $match[2])) { if (isset($match[2]) && ($match[1] != $match[2])) {
return $match[0]; return $match[0];
} }
@ -485,20 +485,20 @@ function bb_ShareAttributes($share, $simplehtml) {
$data = get_contact_details_by_url($profile); $data = get_contact_details_by_url($profile);
if (isset($data["name"]) AND ($data["name"] != "") AND isset($data["addr"]) AND ($data["addr"] != "")) if (isset($data["name"]) && ($data["name"] != "") && isset($data["addr"]) && ($data["addr"] != ""))
$userid_compact = $data["name"]." (".$data["addr"].")"; $userid_compact = $data["name"]." (".$data["addr"].")";
else else
$userid_compact = GetProfileUsername($profile,$author, true); $userid_compact = GetProfileUsername($profile,$author, true);
if (isset($data["addr"]) AND ($data["addr"] != "")) if (isset($data["addr"]) && ($data["addr"] != ""))
$userid = $data["addr"]; $userid = $data["addr"];
else else
$userid = GetProfileUsername($profile,$author, false); $userid = GetProfileUsername($profile,$author, false);
if (isset($data["name"]) AND ($data["name"] != "")) if (isset($data["name"]) && ($data["name"] != ""))
$author = $data["name"]; $author = $data["name"];
if (isset($data["micro"]) AND ($data["micro"] != "")) if (isset($data["micro"]) && ($data["micro"] != ""))
$avatar = $data["micro"]; $avatar = $data["micro"];
$preshare = trim($share[1]); $preshare = trim($share[1]);
@ -744,7 +744,7 @@ function bb_RemovePictureLinks($match) {
} }
function bb_expand_links($match) { function bb_expand_links($match) {
if (($match[3] == "") OR ($match[2] == $match[3]) OR stristr($match[2], $match[3])) { if (($match[3] == "") || ($match[2] == $match[3]) || stristr($match[2], $match[3])) {
return ($match[1] . "[url]" . $match[2] . "[/url]"); return ($match[1] . "[url]" . $match[2] . "[/url]");
} else { } else {
return ($match[1] . $match[3] . " [url]" . $match[2] . "[/url]"); return ($match[1] . $match[3] . " [url]" . $match[2] . "[/url]");
@ -930,7 +930,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
$MAILSearchString = $URLSearchString; $MAILSearchString = $URLSearchString;
// Remove all hashtag addresses // Remove all hashtag addresses
if ((!$tryoembed OR $simplehtml) AND !in_array($simplehtml, array(3, 7))) { if ((!$tryoembed || $simplehtml) && !in_array($simplehtml, array(3, 7))) {
$Text = preg_replace("/([#@])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$1$3', $Text); $Text = preg_replace("/([#@])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", '$1$3', $Text);
} elseif ($simplehtml == 3) { } elseif ($simplehtml == 3) {
$Text = preg_replace("/([@])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", $Text = preg_replace("/([@])\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism",
@ -1126,7 +1126,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
// Check for [spoiler] text // Check for [spoiler] text
// handle nested quotes // handle nested quotes
$endlessloop = 0; $endlessloop = 0;
while ((strpos($Text, "[/spoiler]") !== false) and (strpos($Text, "[spoiler]") !== false) and (++$endlessloop < 20)) { while ((strpos($Text, "[/spoiler]") !== false) && (strpos($Text, "[spoiler]") !== false) && (++$endlessloop < 20)) {
$Text = preg_replace("/\[spoiler\](.*?)\[\/spoiler\]/ism", "$SpoilerLayout", $Text); $Text = preg_replace("/\[spoiler\](.*?)\[\/spoiler\]/ism", "$SpoilerLayout", $Text);
} }
@ -1136,7 +1136,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
// handle nested quotes // handle nested quotes
$endlessloop = 0; $endlessloop = 0;
while ((strpos($Text, "[/spoiler]")!== false) and (strpos($Text, "[spoiler=") !== false) and (++$endlessloop < 20)) { while ((strpos($Text, "[/spoiler]")!== false) && (strpos($Text, "[spoiler=") !== false) && (++$endlessloop < 20)) {
$Text = preg_replace("/\[spoiler=[\"\']*(.*?)[\"\']*\](.*?)\[\/spoiler\]/ism", $Text = preg_replace("/\[spoiler=[\"\']*(.*?)[\"\']*\](.*?)\[\/spoiler\]/ism",
"<br /><strong class=".'"spoiler"'.">" . $t_wrote . "</strong><blockquote class=".'"spoiler"'.">$2</blockquote>", "<br /><strong class=".'"spoiler"'.">" . $t_wrote . "</strong><blockquote class=".'"spoiler"'.">$2</blockquote>",
$Text); $Text);
@ -1148,7 +1148,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
// Check for [quote] text // Check for [quote] text
// handle nested quotes // handle nested quotes
$endlessloop = 0; $endlessloop = 0;
while ((strpos($Text, "[/quote]") !== false) and (strpos($Text, "[quote]") !== false) and (++$endlessloop < 20)) { while ((strpos($Text, "[/quote]") !== false) && (strpos($Text, "[quote]") !== false) && (++$endlessloop < 20)) {
$Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism", "$QuoteLayout", $Text); $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/ism", "$QuoteLayout", $Text);
} }
@ -1158,7 +1158,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
// handle nested quotes // handle nested quotes
$endlessloop = 0; $endlessloop = 0;
while ((strpos($Text, "[/quote]")!== false) and (strpos($Text, "[quote=") !== false) and (++$endlessloop < 20)) { while ((strpos($Text, "[/quote]")!== false) && (strpos($Text, "[quote=") !== false) && (++$endlessloop < 20)) {
$Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism", $Text = preg_replace("/\[quote=[\"\']*(.*?)[\"\']*\](.*?)\[\/quote\]/ism",
"<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>", "<br /><strong class=".'"author"'.">" . $t_wrote . "</strong><blockquote>$2</blockquote>",
$Text); $Text);
@ -1319,7 +1319,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa
// Clean up the HTML by loading and saving the HTML with the DOM. // Clean up the HTML by loading and saving the HTML with the DOM.
// Bad structured html can break a whole page. // Bad structured html can break a whole page.
// For performance reasons do it only with ativated item cache or at export. // For performance reasons do it only with ativated item cache or at export.
if (!$tryoembed OR (get_itemcachepath() != "")) { if (!$tryoembed || (get_itemcachepath() != "")) {
$doc = new DOMDocument(); $doc = new DOMDocument();
$doc->preserveWhiteSpace = false; $doc->preserveWhiteSpace = false;

View file

@ -172,35 +172,35 @@ class Cache {
set_config("system", "cache_cleared_day", time()); set_config("system", "cache_cleared_day", time());
} }
if (($max_level <= CACHE_HOUR) AND (get_config("system", "cache_cleared_hour")) < time() - self::duration(CACHE_HOUR)) { if (($max_level <= CACHE_HOUR) && (get_config("system", "cache_cleared_hour")) < time() - self::duration(CACHE_HOUR)) {
q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d",
dbesc(datetime_convert('UTC','UTC',"now - 1 hours")), intval(CACHE_HOUR)); dbesc(datetime_convert('UTC','UTC',"now - 1 hours")), intval(CACHE_HOUR));
set_config("system", "cache_cleared_hour", time()); set_config("system", "cache_cleared_hour", time());
} }
if (($max_level <= CACHE_HALF_HOUR) AND (get_config("system", "cache_cleared_half_hour")) < time() - self::duration(CACHE_HALF_HOUR)) { if (($max_level <= CACHE_HALF_HOUR) && (get_config("system", "cache_cleared_half_hour")) < time() - self::duration(CACHE_HALF_HOUR)) {
q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d",
dbesc(datetime_convert('UTC','UTC',"now - 30 minutes")), intval(CACHE_HALF_HOUR)); dbesc(datetime_convert('UTC','UTC',"now - 30 minutes")), intval(CACHE_HALF_HOUR));
set_config("system", "cache_cleared_half_hour", time()); set_config("system", "cache_cleared_half_hour", time());
} }
if (($max_level <= CACHE_QUARTER_HOUR) AND (get_config("system", "cache_cleared_quarter_hour")) < time() - self::duration(CACHE_QUARTER_HOUR)) { if (($max_level <= CACHE_QUARTER_HOUR) && (get_config("system", "cache_cleared_quarter_hour")) < time() - self::duration(CACHE_QUARTER_HOUR)) {
q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d",
dbesc(datetime_convert('UTC','UTC',"now - 15 minutes")), intval(CACHE_QUARTER_HOUR)); dbesc(datetime_convert('UTC','UTC',"now - 15 minutes")), intval(CACHE_QUARTER_HOUR));
set_config("system", "cache_cleared_quarter_hour", time()); set_config("system", "cache_cleared_quarter_hour", time());
} }
if (($max_level <= CACHE_FIVE_MINUTES) AND (get_config("system", "cache_cleared_five_minute")) < time() - self::duration(CACHE_FIVE_MINUTES)) { if (($max_level <= CACHE_FIVE_MINUTES) && (get_config("system", "cache_cleared_five_minute")) < time() - self::duration(CACHE_FIVE_MINUTES)) {
q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d",
dbesc(datetime_convert('UTC','UTC',"now - 5 minutes")), intval(CACHE_FIVE_MINUTES)); dbesc(datetime_convert('UTC','UTC',"now - 5 minutes")), intval(CACHE_FIVE_MINUTES));
set_config("system", "cache_cleared_five_minute", time()); set_config("system", "cache_cleared_five_minute", time());
} }
if (($max_level <= CACHE_MINUTE) AND (get_config("system", "cache_cleared_minute")) < time() - self::duration(CACHE_MINUTE)) { if (($max_level <= CACHE_MINUTE) && (get_config("system", "cache_cleared_minute")) < time() - self::duration(CACHE_MINUTE)) {
q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d", q("DELETE FROM `cache` WHERE `updated` < '%s' AND `expire_mode` = %d",
dbesc(datetime_convert('UTC','UTC',"now - 1 minutes")), intval(CACHE_MINUTE)); dbesc(datetime_convert('UTC','UTC',"now - 1 minutes")), intval(CACHE_MINUTE));

View file

@ -100,7 +100,7 @@ function network_to_name($s, $profile = "") {
$networkname = str_replace($search, $replace, $s); $networkname = str_replace($search, $replace, $s);
if ((in_array($s, array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) AND ($profile != "")) { if ((in_array($s, array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) && ($profile != "")) {
$r = q("SELECT `gserver`.`platform` FROM `gcontact` $r = q("SELECT `gserver`.`platform` FROM `gcontact`
INNER JOIN `gserver` ON `gserver`.`nurl` = `gcontact`.`server_url` INNER JOIN `gserver` ON `gserver`.`nurl` = `gcontact`.`server_url`
WHERE `gcontact`.`nurl` = '%s' AND `platform` != ''", WHERE `gcontact`.`nurl` = '%s' AND `platform` != ''",

View file

@ -1,6 +1,7 @@
<?php <?php
use Friendica\App; use Friendica\App;
use Friendica\Core\Config;
function follow_widget($value = "") { function follow_widget($value = "") {
@ -18,6 +19,7 @@ function findpeople_widget() {
require_once 'include/Contact.php'; require_once 'include/Contact.php';
$a = get_app(); $a = get_app();
$global_dir = Config::get('system', 'directory');
if (get_config('system', 'invitation_only')) { if (get_config('system', 'invitation_only')) {
$x = get_pconfig(local_user(), 'system', 'invites_remaining'); $x = get_pconfig(local_user(), 'system', 'invites_remaining');
@ -37,7 +39,9 @@ function findpeople_widget() {
'$suggest' => t('Friend Suggestions'), '$suggest' => t('Friend Suggestions'),
'$similar' => t('Similar Interests'), '$similar' => t('Similar Interests'),
'$random' => t('Random Profile'), '$random' => t('Random Profile'),
'$inv' => t('Invite Friends') '$inv' => t('Invite Friends'),
'$directory' => t('View Global Directory'),
'$global_dir' => $global_dir
)); ));
} }
@ -51,7 +55,7 @@ function unavailable_networks() {
$networks[] = NETWORK_APPNET; $networks[] = NETWORK_APPNET;
} }
if (!plugin_enabled("fbpost") AND !plugin_enabled("facebook")) { if (!plugin_enabled("fbpost") && !plugin_enabled("facebook")) {
$networks[] = NETWORK_FACEBOOK; $networks[] = NETWORK_FACEBOOK;
} }

View file

@ -712,7 +712,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
$profile_link = zrl($profile_link); $profile_link = zrl($profile_link);
} }
if (!x($item, 'author-thumb') OR ($item['author-thumb'] == "")) { if (!x($item, 'author-thumb') || ($item['author-thumb'] == "")) {
$author_contact = get_contact_details_by_url($item['author-link'], $profile_owner); $author_contact = get_contact_details_by_url($item['author-link'], $profile_owner);
if ($author_contact["thumb"]) { if ($author_contact["thumb"]) {
$item['author-thumb'] = $author_contact["thumb"]; $item['author-thumb'] = $author_contact["thumb"];
@ -721,7 +721,7 @@ function conversation(App $a, $items, $mode, $update, $preview = false) {
} }
} }
if (!isset($item['owner-thumb']) OR ($item['owner-thumb'] == "")) { if (!isset($item['owner-thumb']) || ($item['owner-thumb'] == "")) {
$owner_contact = get_contact_details_by_url($item['owner-link'], $profile_owner); $owner_contact = get_contact_details_by_url($item['owner-link'], $profile_owner);
if ($owner_contact["thumb"]) { if ($owner_contact["thumb"]) {
$item['owner-thumb'] = $owner_contact["thumb"]; $item['owner-thumb'] = $owner_contact["thumb"];
@ -1013,7 +1013,7 @@ function item_photo_menu($item) {
$menu[t("Poke")] = $poke_link; $menu[t("Poke")] = $poke_link;
} }
if ((($cid == 0) OR ($rel == CONTACT_IS_FOLLOWER)) AND if ((($cid == 0) || ($rel == CONTACT_IS_FOLLOWER)) &&
in_array($item['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA))) { in_array($item['network'], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA))) {
$menu[t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']); $menu[t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']);
} }

View file

@ -82,6 +82,9 @@ function cron_run(&$argv, &$argc){
proc_run(PRIORITY_MEDIUM, 'include/dbclean.php'); proc_run(PRIORITY_MEDIUM, 'include/dbclean.php');
proc_run(PRIORITY_LOW, "include/cronjobs.php", "update_photo_albums"); proc_run(PRIORITY_LOW, "include/cronjobs.php", "update_photo_albums");
// Delete all done workerqueue entries
dba::e('DELETE FROM `workerqueue` WHERE `done` AND `executed` < UTC_TIMESTAMP() - INTERVAL 12 HOUR');
} }
// Poll contacts // Poll contacts
@ -186,7 +189,7 @@ function cron_poll_contacts($argc, $argv) {
$contact['priority'] = 2; $contact['priority'] = 2;
} }
if ($contact['subhub'] AND in_array($contact['network'], array(NETWORK_DFRN, NETWORK_ZOT, NETWORK_OSTATUS))) { if ($contact['subhub'] && 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)
@ -197,7 +200,7 @@ function cron_poll_contacts($argc, $argv) {
$contact['priority'] = (($poll_interval !== false) ? intval($poll_interval) : 3); $contact['priority'] = (($poll_interval !== false) ? intval($poll_interval) : 3);
} }
if (($contact['priority'] >= 0) AND !$force) { if (($contact['priority'] >= 0) && !$force) {
$update = false; $update = false;
$t = $contact['last-update']; $t = $contact['last-update'];
@ -245,11 +248,12 @@ function cron_poll_contacts($argc, $argv) {
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) && ($contact['priority'] <= 3)) {
proc_run(PRIORITY_MEDIUM, 'include/onepoll.php', intval($contact['id'])); $priority = PRIORITY_MEDIUM;
} else { } else {
proc_run(PRIORITY_LOW, 'include/onepoll.php', intval($contact['id'])); $priority = PRIORITY_LOW;
} }
proc_run(array('priority' => $priority, 'dont_fork' => true), 'include/onepoll.php', (int)$contact['id']);
} }
} }
} }

View file

@ -7,7 +7,7 @@ function cronhooks_run(&$argv, &$argc) {
require_once 'include/datetime.php'; require_once 'include/datetime.php';
if (($argc == 2) AND is_array($a->hooks) AND array_key_exists("cron", $a->hooks)) { if (($argc == 2) && is_array($a->hooks) && 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]) {
logger("Calling cron hook '" . $hook[1] . "'", LOGGER_DEBUG); logger("Calling cron hook '" . $hook[1] . "'", LOGGER_DEBUG);
@ -38,7 +38,7 @@ function cronhooks_run(&$argv, &$argc) {
$d = datetime_convert(); $d = datetime_convert();
if (is_array($a->hooks) AND array_key_exists("cron", $a->hooks)) { if (is_array($a->hooks) && 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]);

View file

@ -21,6 +21,8 @@ class dba {
private $driver; private $driver;
public $connected = false; public $connected = false;
public $error = false; public $error = false;
public $errorno = 0;
public $affected_rows = 0;
private $_server_info = ''; private $_server_info = '';
private static $in_transaction = false; private static $in_transaction = false;
private static $dbo; private static $dbo;
@ -183,17 +185,17 @@ class dba {
foreach ($r AS $row) { foreach ($r AS $row) {
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) &&
($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) && ($row['rows'] >= intval($a->config["system"]["db_loglimit_index_high"]))) {
$log = true; $log = true;
} }
if (in_array($row['key'], $blacklist) OR ($row['key'] == "")) { if (in_array($row['key'], $blacklist) || ($row['key'] == "")) {
$log = false; $log = false;
} }
@ -363,7 +365,7 @@ class dba {
// PDO doesn't return "true" on successful operations - like mysqli does // PDO doesn't return "true" on successful operations - like mysqli does
// Emulate this behaviour by checking if the query returned data and had columns // Emulate this behaviour by checking if the query returned data and had columns
// This should be reliable enough // This should be reliable enough
if (($this->driver == 'pdo') AND (count($r) == 0) AND ($columns == 0)) { if (($this->driver == 'pdo') && (count($r) == 0) && ($columns == 0)) {
return true; return true;
} }
@ -490,7 +492,7 @@ class dba {
static private function replace_parameters($sql, $args) { static private function replace_parameters($sql, $args) {
$offset = 0; $offset = 0;
foreach ($args AS $param => $value) { foreach ($args AS $param => $value) {
if (is_int($args[$param]) OR is_float($args[$param])) { if (is_int($args[$param]) || is_float($args[$param])) {
$replace = intval($args[$param]); $replace = intval($args[$param]);
} else { } else {
$replace = "'".self::$dbo->escape($args[$param])."'"; $replace = "'".self::$dbo->escape($args[$param])."'";
@ -520,7 +522,7 @@ class dba {
unset($args[0]); unset($args[0]);
// When the second function parameter is an array then use this as the parameter array // When the second function parameter is an array then use this as the parameter array
if ((count($args) > 0) AND (is_array($args[1]))) { if ((count($args) > 0) && (is_array($args[1]))) {
$params = $args[1]; $params = $args[1];
} else { } else {
$params = $args; $params = $args;
@ -533,7 +535,7 @@ class dba {
$args[++$i] = $param; $args[++$i] = $param;
} }
if (!self::$dbo OR !self::$dbo->connected) { if (!self::$dbo || !self::$dbo->connected) {
return false; return false;
} }
@ -551,6 +553,7 @@ class dba {
self::$dbo->error = ''; self::$dbo->error = '';
self::$dbo->errorno = 0; self::$dbo->errorno = 0;
self::$dbo->affected_rows = 0;
switch (self::$dbo->driver) { switch (self::$dbo->driver) {
case 'pdo': case 'pdo':
@ -573,6 +576,7 @@ class dba {
$retval = false; $retval = false;
} else { } else {
$retval = $stmt; $retval = $stmt;
self::$dbo->affected_rows = $retval->rowCount();
} }
break; break;
case 'mysqli': case 'mysqli':
@ -612,6 +616,7 @@ class dba {
} else { } else {
$stmt->store_result(); $stmt->store_result();
$retval = $stmt; $retval = $stmt;
self::$dbo->affected_rows = $retval->affected_rows;
} }
break; break;
case 'mysql': case 'mysql':
@ -620,13 +625,39 @@ class dba {
if (mysql_errno(self::$dbo->db)) { if (mysql_errno(self::$dbo->db)) {
self::$dbo->error = mysql_error(self::$dbo->db); self::$dbo->error = mysql_error(self::$dbo->db);
self::$dbo->errorno = mysql_errno(self::$dbo->db); self::$dbo->errorno = mysql_errno(self::$dbo->db);
} else {
self::$dbo->affected_rows = mysql_affected_rows($retval);
// Due to missing mysql_* support this here wasn't tested at all
// See here: http://php.net/manual/en/function.mysql-num-rows.php
if (self::$dbo->affected_rows <= 0) {
self::$dbo->affected_rows = mysql_num_rows($retval);
}
} }
break; break;
} }
if (self::$dbo->errorno != 0) { if (self::$dbo->errorno != 0) {
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3);
if (isset($trace[2])) {
$called_from = $trace[2];
} else {
// We use just something that is defined to avoid warnings
$called_from = $trace[0];
}
// We are having an own error logging in the function "e"
if ($called_from['function'] != 'e') {
// We have to preserve the error code, somewhere in the logging it get lost
$error = self::$dbo->error;
$errorno = self::$dbo->errorno;
logger('DB Error '.self::$dbo->errorno.': '.self::$dbo->error."\n". logger('DB Error '.self::$dbo->errorno.': '.self::$dbo->error."\n".
$a->callstack(8))."\n".self::replace_parameters($sql, $args); $a->callstack(8)."\n".self::replace_parameters($sql, $params));
self::$dbo->error = $error;
self::$dbo->errorno = $errorno;
}
} }
$a->save_timestamp($stamp1, 'database'); $a->save_timestamp($stamp1, 'database');
@ -662,6 +693,10 @@ class dba {
$args = func_get_args(); $args = func_get_args();
// In a case of a deadlock we are repeating the query 20 times
$timeout = 20;
do {
$stmt = call_user_func_array('self::p', $args); $stmt = call_user_func_array('self::p', $args);
if (is_bool($stmt)) { if (is_bool($stmt)) {
@ -674,6 +709,29 @@ class dba {
self::close($stmt); self::close($stmt);
} while ((self::$dbo->errorno == 1213) && (--$timeout > 0));
if (self::$dbo->errorno != 0) {
// We have to preserve the error code, somewhere in the logging it get lost
$error = self::$dbo->error;
$errorno = self::$dbo->errorno;
array_shift($args);
// When the second function parameter is an array then use this as the parameter array
if ((count($args) > 0) && (is_array($args[0]))) {
$params = $args[0];
} else {
$params = $args;
}
logger('DB Error '.self::$dbo->errorno.': '.self::$dbo->error."\n".
$a->callstack(8)."\n".self::replace_parameters($sql, $params));
self::$dbo->error = $error;
self::$dbo->errorno = $errorno;
}
$a->save_timestamp($stamp, "database_write"); $a->save_timestamp($stamp, "database_write");
return $retval; return $retval;
@ -723,6 +781,15 @@ class dba {
return $retval; return $retval;
} }
/**
* @brief Returns the number of affected rows of the last statement
*
* @return int Number of rows
*/
static public function affected_rows() {
return self::$dbo->affected_rows;
}
/** /**
* @brief Returns the number of rows of a statement * @brief Returns the number of rows of a statement
* *
@ -806,6 +873,41 @@ class dba {
return self::e($sql, $param); return self::e($sql, $param);
} }
/**
* @brief Locks a table for exclusive write access
*
* This function can be extended in the future to accept a table array as well.
*
* @param string $table Table name
*
* @return boolean was the lock successful?
*/
static public function lock($table) {
// See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
self::e("SET autocommit=0");
$success = self::e("LOCK TABLES `".self::$dbo->escape($table)."` WRITE");
if (!$success) {
self::e("SET autocommit=1");
} else {
self::$in_transaction = true;
}
return $success;
}
/**
* @brief Unlocks all locked tables
*
* @return boolean was the unlock successful?
*/
static public function unlock() {
// See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
self::e("COMMIT");
$success = self::e("UNLOCK TABLES");
self::e("SET autocommit=1");
self::$in_transaction = false;
return $success;
}
/** /**
* @brief Starts a transaction * @brief Starts a transaction
* *
@ -913,7 +1015,7 @@ class dba {
// When the search field is the relation field, we don't need to fetch the rows // When the search field is the relation field, we don't need to fetch the rows
// This is useful when the leading record is already deleted in the frontend but the rest is done in the backend // This is useful when the leading record is already deleted in the frontend but the rest is done in the backend
if ((count($param) == 1) AND ($field == array_keys($param)[0])) { if ((count($param) == 1) && ($field == array_keys($param)[0])) {
foreach ($rel_def AS $rel_table => $rel_fields) { foreach ($rel_def AS $rel_table => $rel_fields) {
foreach ($rel_fields AS $rel_field) { foreach ($rel_fields AS $rel_field) {
$retval = self::delete($rel_table, array($rel_field => array_values($param)[0]), true, $callstack); $retval = self::delete($rel_table, array($rel_field => array_values($param)[0]), true, $callstack);
@ -956,7 +1058,7 @@ class dba {
$sql = "DELETE FROM `".$command['table']."` WHERE `". $sql = "DELETE FROM `".$command['table']."` WHERE `".
implode("` = ? AND `", array_keys($command['param']))."` = ?"; implode("` = ? AND `", array_keys($command['param']))."` = ?";
logger(dba::replace_parameters($sql, $command['param']), LOGGER_DATA); logger(self::replace_parameters($sql, $command['param']), LOGGER_DATA);
if (!self::e($sql, $command['param'])) { if (!self::e($sql, $command['param'])) {
if ($do_transaction) { if ($do_transaction) {
@ -986,7 +1088,7 @@ class dba {
$sql = "DELETE FROM `".$table."` WHERE `".$field."` IN (". $sql = "DELETE FROM `".$table."` WHERE `".$field."` IN (".
substr(str_repeat("?, ", count($field_values)), 0, -2).");"; substr(str_repeat("?, ", count($field_values)), 0, -2).");";
logger(dba::replace_parameters($sql, $field_values), LOGGER_DATA); logger(self::replace_parameters($sql, $field_values), LOGGER_DATA);
if (!self::e($sql, $field_values)) { if (!self::e($sql, $field_values)) {
if ($do_transaction) { if ($do_transaction) {
@ -1075,7 +1177,7 @@ class dba {
} }
} }
if (!$do_update OR (count($fields) == 0)) { if (!$do_update || (count($fields) == 0)) {
return true; return true;
} }
@ -1155,7 +1257,7 @@ class dba {
$result = self::p($sql, $condition); $result = self::p($sql, $condition);
if (is_bool($result) OR !$single_row) { if (is_bool($result) || !$single_row) {
return $result; return $result;
} else { } else {
$row = self::fetch($result); $row = self::fetch($result);

View file

@ -14,18 +14,19 @@ $objDDDBLResultHandler = new DataObjectPool('Result-Handler');
* *
**/ **/
$cloPDOStatementResultHandler = function(Queue $objQueue) { $cloPDOStatementResultHandler = function(Queue $objQueue) {
$objPDO = $objQueue->getState()->get('PDOStatement'); $objPDO = $objQueue->getState()->get('PDOStatement');
$objQueue->getState()->update(array('result' => $objPDO)); $objQueue->getState()->update(array('result' => $objPDO));
# delete handler which closes the PDOStatement-cursor /*
# this will be done manual if using this handler * delete handler which closes the PDOStatement-cursor
* this will be done manual if using this handler
*/
$objQueue->deleteHandler(QUEUE_CLOSE_CURSOR_POSITION); $objQueue->deleteHandler(QUEUE_CLOSE_CURSOR_POSITION);
}; };
$objDDDBLResultHandler->add('PDOStatement', array('HANDLER' => $cloPDOStatementResultHandler)); $objDDDBLResultHandler->add('PDOStatement', array('HANDLER' => $cloPDOStatementResultHandler));
if (! class_exists('dba')) {
/** /**
* *
* MySQL database class * MySQL database class
@ -36,8 +37,6 @@ $objDDDBLResultHandler->add('PDOStatement', array('HANDLER' => $cloPDOStatementR
* the debugging stream is safe to view within both terminals and web pages. * the debugging stream is safe to view within both terminals and web pages.
* *
*/ */
if (! class_exists('dba')) {
class dba { class dba {
private $debug = 0; private $debug = 0;
@ -146,9 +145,11 @@ class dba {
$a->save_timestamp($stamp1, "database"); $a->save_timestamp($stamp1, "database");
/// @TODO really check $a->config for 'system'? it is very generic and should be there /*
if (x($a->config, 'system') && x($a->config['system'], 'db_log')) { * Check if the configuration group 'system' and db_log is there. The
if (($duration > $a->config["system"]["db_loglimit"])) { * extra first check needs to be done to avoid endless loop.
*/
if (x($a->config, 'system') && x($a->config['system'], 'db_log') && ($duration > $a->config["system"]["db_loglimit"])) {
$duration = round($duration, 3); $duration = round($duration, 3);
$backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
@file_put_contents($a->config["system"]["db_log"], datetime_convert()."\t".$duration."\t". @file_put_contents($a->config["system"]["db_log"], datetime_convert()."\t".$duration."\t".
@ -156,7 +157,6 @@ class dba {
$backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t". $backtrace[1]["line"]."\t".$backtrace[2]["function"]."\t".
substr($sql, 0, 2000)."\n", FILE_APPEND); substr($sql, 0, 2000)."\n", FILE_APPEND);
} }
}
if ($intErrorCode) { if ($intErrorCode) {
$this->error = $intErrorCode; $this->error = $intErrorCode;
@ -190,20 +190,23 @@ class dba {
* regardless of any logging that may or may nor be in effect. * regardless of any logging that may or may nor be in effect.
* These usually indicate SQL syntax errors that need to be resolved. * These usually indicate SQL syntax errors that need to be resolved.
*/ */
if (isset($result) AND ($result === false)) { if (isset($result) && ($result === false)) {
logger('dba: ' . printable($sql) . ' returned false.' . "\n" . $this->error); logger('dba: ' . printable($sql) . ' returned false.' . "\n" . $this->error);
if (file_exists('dbfail.out')) { if (file_exists('dbfail.out')) {
file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . ' returned false' . "\n" . $this->error . "\n", FILE_APPEND); file_put_contents('dbfail.out', datetime_convert() . "\n" . printable($sql) . ' returned false' . "\n" . $this->error . "\n", FILE_APPEND);
} }
} }
if (isset($result) AND (($result === true) || ($result === false))) { if (isset($result) && (($result === true) || ($result === false))) {
return $result; return $result;
} }
if ($onlyquery) { if ($onlyquery) {
$this->result = $r; # this will store an PDOStatement Object in result // this will store an PDOStatement Object in result
$this->result->execute(); # execute the Statement, to get its result $this->result = $r;
// execute the Statement, to get its result
$this->result->execute();
return true; return true;
} }
@ -262,7 +265,8 @@ function printable($s) {
return $s; return $s;
}} }}
// Procedural functions // --- Procedural functions ---
if (! function_exists('dbg')) { if (! function_exists('dbg')) {
function dbg($state) { function dbg($state) {
global $db; global $db;
@ -273,14 +277,16 @@ function dbg($state) {
if (! function_exists('dbesc')) { if (! function_exists('dbesc')) {
function dbesc($str) { function dbesc($str) {
global $db; global $db;
if ($db && $db->connected)
return($db->escape($str)); if ($db && $db->connected) {
else return $db->escape($str);
return(str_replace("'","\\'",$str)); } else {
return str_replace("'","\\'",$str);
}
}} }}
if (! function_exists('q')) { if (! function_exists('q')) {
/** /*
* 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",
@ -301,23 +307,19 @@ function q($sql) {
return $db->q($stmt); return $db->q($stmt);
} }
/** /*
*
* This will happen occasionally trying to store the * This will happen occasionally trying to store the
* session data after abnormal program termination * session data after abnormal program termination
*
*/ */
logger('dba: no database: ' . print_r($args,true)); logger('dba: no database: ' . print_r($args,true));
return false; return false;
}} }}
if (! function_exists('dbq')) { if (! function_exists('dbq')) {
/** /*
* Raw db query, no arguments * Raw db query, no arguments
*/ */
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);
@ -327,15 +329,14 @@ function dbq($sql) {
return $ret; return $ret;
}} }}
if (! function_exists('dbesc_array_cb')) {
function dbesc_array_cb(&$item, $key) {
/* /*
* 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) {
if (is_string($item)) { if (is_string($item)) {
$item = dbesc($item); $item = dbesc($item);
} }

View file

@ -17,9 +17,14 @@ function dbclean_run(&$argv, &$argc) {
$stage = 0; $stage = 0;
} }
// Get the expire days for step 8 and 9
$days = Config::get('system', 'dbclean-expire-days', 0);
if ($stage == 0) { if ($stage == 0) {
for ($i = 1; $i <= 7; $i++) { for ($i = 1; $i <= 9; $i++) {
if (!Config::get('system', 'finished-dbclean-'.$i, false)) { // Execute the background script for a step when it isn't finished.
// Execute step 8 and 9 only when $days is defined.
if (!Config::get('system', 'finished-dbclean-'.$i, false) && (($i < 8) || ($days > 0))) {
proc_run(PRIORITY_LOW, 'include/dbclean.php', $i); proc_run(PRIORITY_LOW, 'include/dbclean.php', $i);
} }
} }
@ -30,6 +35,19 @@ function dbclean_run(&$argv, &$argc) {
/** /**
* @brief Remove orphaned database entries * @brief Remove orphaned database entries
* @param integer $stage What should be deleted?
*
* Values for $stage:
* ------------------
* 1: Old global item entries from item table without user copy.
* 2: Items without parents.
* 3: Orphaned data from thread table.
* 4: Orphaned data from notify table.
* 5: Orphaned data from notify-threads table.
* 6: Orphaned data from sign table.
* 7: Orphaned data from term table.
* 8: Expired threads.
* 9: Old global item entries from expired threads
*/ */
function remove_orphans($stage = 0) { function remove_orphans($stage = 0) {
global $db; global $db;
@ -39,6 +57,9 @@ function remove_orphans($stage = 0) {
// We split the deletion in many small tasks // We split the deletion in many small tasks
$limit = 1000; $limit = 1000;
// Get the expire days for step 8 and 9
$days = Config::get('system', 'dbclean-expire-days', 0);
if ($stage == 1) { if ($stage == 1) {
$last_id = Config::get('system', 'dbclean-last-id-1', 0); $last_id = Config::get('system', 'dbclean-last-id-1', 0);
@ -61,11 +82,6 @@ function remove_orphans($stage = 0) {
logger("Done deleting ".$count." old global item entries from item table without user copy. Last ID: ".$last_id); logger("Done deleting ".$count." old global item entries from item table without user copy. Last ID: ".$last_id);
Config::set('system', 'dbclean-last-id-1', $last_id); Config::set('system', 'dbclean-last-id-1', $last_id);
// We will eventually set this value when we found a good way to delete these items in another way.
// if ($count < $limit) {
// Config::set('system', 'finished-dbclean-1', true);
// }
} elseif ($stage == 2) { } elseif ($stage == 2) {
$last_id = Config::get('system', 'dbclean-last-id-2', 0); $last_id = Config::get('system', 'dbclean-last-id-2', 0);
@ -216,11 +232,71 @@ function remove_orphans($stage = 0) {
if ($count < $limit) { if ($count < $limit) {
Config::set('system', 'finished-dbclean-7', true); Config::set('system', 'finished-dbclean-7', true);
} }
} elseif ($stage == 8) {
if ($days <= 0) {
return;
}
$last_id = Config::get('system', 'dbclean-last-id-8', 0);
logger("Deleting expired threads. Last ID: ".$last_id);
$r = dba::p("SELECT `thread`.`iid` FROM `thread`
INNER JOIN `contact` ON `thread`.`contact-id` = `contact`.`id` AND NOT `notify_new_posts`
WHERE `thread`.`received` < UTC_TIMESTAMP() - INTERVAL ? DAY
AND NOT `thread`.`mention` AND NOT `thread`.`starred`
AND NOT `thread`.`wall` AND NOT `thread`.`origin`
AND `thread`.`uid` != 0 AND `thread`.`iid` >= ?
AND NOT `thread`.`iid` IN (SELECT `parent` FROM `item`
WHERE (`item`.`starred` OR (`item`.`resource-id` != '')
OR (`item`.`file` != '') OR (`item`.`event-id` != '')
OR (`item`.`attach` != '') OR `item`.`wall` OR `item`.`origin`)
AND `item`.`parent` = `thread`.`iid`)
ORDER BY `thread`.`iid` LIMIT 1000", $days, $last_id);
$count = dba::num_rows($r);
if ($count > 0) {
logger("found expired threads: ".$count);
while ($thread = dba::fetch($r)) {
$last_id = $thread["iid"];
dba::delete('thread', array('iid' => $thread["iid"]));
}
} else {
logger("No expired threads found");
}
dba::close($r);
logger("Done deleting ".$count." expired threads. Last ID: ".$last_id);
Config::set('system', 'dbclean-last-id-8', $last_id);
} elseif ($stage == 9) {
if ($days <= 0) {
return;
}
$last_id = Config::get('system', 'dbclean-last-id-9', 0);
$till_id = Config::get('system', 'dbclean-last-id-8', 0);
logger("Deleting old global item entries from expired threads from ID ".$last_id." to ID ".$till_id);
$r = dba::p("SELECT `id` FROM `item` WHERE `uid` = 0 AND
NOT EXISTS (SELECT `guid` FROM `item` AS `i` WHERE `item`.`guid` = `i`.`guid` AND `i`.`uid` != 0) AND
`received` < UTC_TIMESTAMP() - INTERVAL 90 DAY AND `id` >= ? AND `id` <= ?
ORDER BY `id` LIMIT ".intval($limit), $last_id, $till_id);
$count = dba::num_rows($r);
if ($count > 0) {
logger("found global item entries from expired threads: ".$count);
while ($orphan = dba::fetch($r)) {
$last_id = $orphan["id"];
dba::delete('item', array('id' => $orphan["id"]));
}
} else {
logger("No global item entries from expired threads");
}
dba::close($r);
logger("Done deleting ".$count." old global item entries from expired threads. Last ID: ".$last_id);
Config::set('system', 'dbclean-last-id-9', $last_id);
} }
// Call it again if not all entries were purged // Call it again if not all entries were purged
if (($stage != 0) AND ($count > 0)) { if (($stage != 0) && ($count > 0)) {
proc_run(PRIORITY_MEDIUM, 'include/dbclean.php'); proc_run(PRIORITY_MEDIUM, 'include/dbclean.php');
} }
} }

View file

@ -76,7 +76,7 @@ class dbm {
if (is_bool($value)) { if (is_bool($value)) {
$value = ($value ? 'true' : 'false'); $value = ($value ? 'true' : 'false');
} elseif (is_float($value) OR is_integer($value)) { } elseif (is_float($value) || is_integer($value)) {
$value = (string)$value; $value = (string)$value;
} else { } else {
$value = "'".dbesc($value)."'"; $value = "'".dbesc($value)."'";

View file

@ -30,7 +30,7 @@ function convert_to_innodb() {
$sql = sprintf("ALTER TABLE `%s` engine=InnoDB;", dbesc($table['TABLE_NAME'])); $sql = sprintf("ALTER TABLE `%s` engine=InnoDB;", dbesc($table['TABLE_NAME']));
echo $sql."\n"; echo $sql."\n";
$result = @$db->q($sql); $result = $db->q($sql);
if (!dbm::is_result($result)) { if (!dbm::is_result($result)) {
print_update_error($db, $sql); print_update_error($db, $sql);
} }
@ -85,6 +85,7 @@ function update_fail($update_id, $error_message) {
/* /*
@TODO deprecated code?
$email_tpl = get_intltext_template("update_fail_eml.tpl"); $email_tpl = get_intltext_template("update_fail_eml.tpl");
$email_msg = replace_macros($email_tpl, array( $email_msg = replace_macros($email_tpl, array(
'$sitename' => $a->config['sitename'], '$sitename' => $a->config['sitename'],
@ -133,7 +134,7 @@ function table_structure($table) {
// On utf8mb4 a varchar index can only have a length of 191 // On utf8mb4 a varchar index can only have a length of 191
// The "show index" command sometimes returns this value although this value wasn't added manually. // The "show index" command sometimes returns this value although this value wasn't added manually.
// Because we don't want to add this number to every index, we ignore bigger numbers // Because we don't want to add this number to every index, we ignore bigger numbers
if (($index["Sub_part"] != "") AND (($index["Sub_part"] < 191) OR ($index["Key_name"] == "PRIMARY"))) { if (($index["Sub_part"] != "") && (($index["Sub_part"] < 191) || ($index["Key_name"] == "PRIMARY"))) {
$column .= "(".$index["Sub_part"].")"; $column .= "(".$index["Sub_part"].")";
} }
@ -232,7 +233,7 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
} }
// MySQL >= 5.7.4 doesn't support the IGNORE keyword in ALTER TABLE statements // MySQL >= 5.7.4 doesn't support the IGNORE keyword in ALTER TABLE statements
if ((version_compare($db->server_info(), '5.7.4') >= 0) AND if ((version_compare($db->server_info(), '5.7.4') >= 0) &&
!(strpos($db->server_info(), 'MariaDB') !== false)) { !(strpos($db->server_info(), 'MariaDB') !== false)) {
$ignore = ''; $ignore = '';
} else { } else {
@ -381,7 +382,7 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
$field_definition = $database[$name]["fields"][$fieldname]; $field_definition = $database[$name]["fields"][$fieldname];
// Define the default collation if not given // Define the default collation if not given
if (!isset($parameters['Collation']) AND !is_null($field_definition['Collation'])) { if (!isset($parameters['Collation']) && !is_null($field_definition['Collation'])) {
$parameters['Collation'] = 'utf8mb4_general_ci'; $parameters['Collation'] = 'utf8mb4_general_ci';
} else { } else {
$parameters['Collation'] = null; $parameters['Collation'] = null;
@ -389,7 +390,7 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
if ($field_definition['Collation'] != $parameters['Collation']) { if ($field_definition['Collation'] != $parameters['Collation']) {
$sql2 = db_modify_table_field($fieldname, $parameters); $sql2 = db_modify_table_field($fieldname, $parameters);
if (($sql3 == "") OR (substr($sql3, -2, 2) == "; ")) { if (($sql3 == "") || (substr($sql3, -2, 2) == "; ")) {
$sql3 .= "ALTER" . $ignore . " TABLE `".$temp_name."` ".$sql2; $sql3 .= "ALTER" . $ignore . " TABLE `".$temp_name."` ".$sql2;
} else { } else {
$sql3 .= ", ".$sql2; $sql3 .= ", ".$sql2;
@ -513,7 +514,7 @@ function db_field_command($parameters, $create = true) {
if ($parameters["extra"] != "") if ($parameters["extra"] != "")
$fieldstruct .= " ".$parameters["extra"]; $fieldstruct .= " ".$parameters["extra"];
/*if (($parameters["primary"] != "") AND $create) /*if (($parameters["primary"] != "") && $create)
$fieldstruct .= " PRIMARY KEY";*/ $fieldstruct .= " PRIMARY KEY";*/
return($fieldstruct); return($fieldstruct);
@ -530,7 +531,7 @@ function db_create_table($name, $fields, $verbose, $action, $indexes=null) {
$primary_keys = array(); $primary_keys = array();
foreach ($fields AS $fieldname => $field) { foreach ($fields AS $fieldname => $field) {
$sql_rows[] = "`".dbesc($fieldname)."` ".db_field_command($field); $sql_rows[] = "`".dbesc($fieldname)."` ".db_field_command($field);
if (x($field,'primary') and $field['primary']!='') { if (x($field,'primary') && $field['primary']!='') {
$primary_keys[] = $fieldname; $primary_keys[] = $fieldname;
} }
} }
@ -1205,7 +1206,7 @@ function db_definition() {
"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" => NULL_DATE), "pid" => array("type" => "int(10) unsigned", "not null" => "1", "default" => "0"),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),
@ -1739,11 +1740,14 @@ function db_definition() {
"created" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE), "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" => NULL_DATE), "executed" => array("type" => "datetime", "not null" => "1", "default" => NULL_DATE),
"done" => array("type" => "tinyint(1)", "not null" => "1", "default" => "0"),
), ),
"indexes" => array( "indexes" => array(
"PRIMARY" => array("id"), "PRIMARY" => array("id"),
"pid" => array("pid"), "pid" => array("pid"),
"parameter" => array("parameter(64)"),
"priority_created" => array("priority", "created"), "priority_created" => array("priority", "created"),
"executed" => array("executed"),
) )
); );
@ -1762,8 +1766,8 @@ function dbstructure_run(&$argv, &$argc) {
} }
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);
} }

View file

@ -91,7 +91,7 @@ function delivery_run(&$argv, &$argc){
$uid = $item_id; $uid = $item_id;
} else { } else {
// find ancestors // find ancestors
$r = q("SELECT * FROM `item` WHERE `id` = %d and visible = 1 and moderated = 0 LIMIT 1", $r = q("SELECT * FROM `item` WHERE `id` = %d AND visible = 1 AND moderated = 0 LIMIT 1",
intval($item_id) intval($item_id)
); );
@ -105,7 +105,7 @@ function delivery_run(&$argv, &$argc){
$updated = $r[0]['edited']; $updated = $r[0]['edited'];
$items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer` $items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer`
FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d and visible = 1 and moderated = 0 ORDER BY `id` ASC", FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d AND visible = 1 AND moderated = 0 ORDER BY `id` ASC",
intval($parent_id) intval($parent_id)
); );
@ -339,7 +339,7 @@ function delivery_run(&$argv, &$argc){
// If we are setup as a soapbox we aren't accepting top level posts from this person // If we are setup as a soapbox we aren't accepting top level posts from this person
if (($x[0]['page-flags'] == PAGE_SOAPBOX) AND $top_level) { if (($x[0]['page-flags'] == PAGE_SOAPBOX) && $top_level) {
break; break;
} }
logger('mod-delivery: local delivery'); logger('mod-delivery: local delivery');
@ -453,7 +453,7 @@ function delivery_run(&$argv, &$argc){
$headers .= "References: <".iri2msgid($it["parent-uri"]).">"; $headers .= "References: <".iri2msgid($it["parent-uri"]).">";
// If Threading is enabled, write down the correct parent // If Threading is enabled, write down the correct parent
if (($it["thr-parent"] != "") and ($it["thr-parent"] != $it["parent-uri"])) if (($it["thr-parent"] != "") && ($it["thr-parent"] != $it["parent-uri"]))
$headers .= " <".iri2msgid($it["thr-parent"]).">"; $headers .= " <".iri2msgid($it["thr-parent"]).">";
$headers .= "\n"; $headers .= "\n";
@ -462,14 +462,14 @@ function delivery_run(&$argv, &$argc){
dbesc($it['parent-uri']), dbesc($it['parent-uri']),
intval($uid)); intval($uid));
if (dbm::is_result($r) AND ($r[0]['title'] != '')) { if (dbm::is_result($r) && ($r[0]['title'] != '')) {
$subject = $r[0]['title']; $subject = $r[0]['title'];
} else { } else {
$r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d LIMIT 1", $r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($it['parent-uri']), dbesc($it['parent-uri']),
intval($uid)); intval($uid));
if (dbm::is_result($r) AND ($r[0]['title'] != '')) if (dbm::is_result($r) && ($r[0]['title'] != ''))
$subject = $r[0]['title']; $subject = $r[0]['title'];
} }
} }

View file

@ -245,7 +245,7 @@ class dfrn {
/// @TODO This hook can't work anymore /// @TODO This hook can't work anymore
// call_hooks('atom_feed', $atom); // call_hooks('atom_feed', $atom);
if (!dbm::is_result($items) OR $onlyheader) { if (!dbm::is_result($items) || $onlyheader) {
$atom = trim($doc->saveXML()); $atom = trim($doc->saveXML());
call_hooks('atom_feed_end', $atom); call_hooks('atom_feed_end', $atom);
@ -284,6 +284,62 @@ class dfrn {
return $atom; return $atom;
} }
/**
* @brief Generate an atom entry for a given item id
*
* @param int $item_id The item id
*
* @return string DFRN feed entry
*/
public static function itemFeed($item_id) {
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
`contact`.`name`, `contact`.`network`, `contact`.`photo`, `contact`.`url`,
`contact`.`name-date`, `contact`.`uri-date`, `contact`.`avatar-date`,
`contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
`sign`.`signed_text`, `sign`.`signature`, `sign`.`signer`
FROM `item`
STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
AND (NOT `contact`.`blocked` OR `contact`.`pending`)
LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id`
WHERE `item`.`id` = %d AND `item`.`visible` AND NOT `item`.`moderated` AND `item`.`parent` != 0
AND `item`.`wall` AND NOT `item`.`private`",
intval($item_id)
);
if (!dbm::is_result($r)) {
killme();
}
$item = $r[0];
$r = q("SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags`, `user`.`account-type`
FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`
WHERE `contact`.`self` AND `user`.`uid` = %d LIMIT 1",
intval($item['uid'])
);
if (!dbm::is_result($r)) {
killme();
}
$owner = $r[0];
$doc = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true;
$alternatelink = $owner['url'];
$root = self::add_header($doc, $owner, 'dfrn:owner', $alternatelink, true);
$type = 'html';
$entry = self::entry($doc, $type, $item, $owner, true);
$root->appendChild($entry);
$atom = trim($doc->saveXML());
return $atom;
}
/** /**
* @brief Create XML text for DFRN mails * @brief Create XML text for DFRN mails
* *
@ -508,7 +564,7 @@ class dfrn {
$attributes = array(); $attributes = array();
if (!$public OR !$hidewall) { if (!$public || !$hidewall) {
$attributes = array("dfrn:updated" => $namdate); $attributes = array("dfrn:updated" => $namdate);
} }
@ -519,7 +575,7 @@ class dfrn {
$attributes = array("rel" => "photo", "type" => "image/jpeg", $attributes = array("rel" => "photo", "type" => "image/jpeg",
"media:width" => 175, "media:height" => 175, "href" => $owner['photo']); "media:width" => 175, "media:height" => 175, "href" => $owner['photo']);
if (!$public OR !$hidewall) { if (!$public || !$hidewall) {
$attributes["dfrn:updated"] = $picdate; $attributes["dfrn:updated"] = $picdate;
} }
@ -921,7 +977,7 @@ class dfrn {
if (count($tags)) { if (count($tags)) {
foreach ($tags as $t) { foreach ($tags as $t) {
if (($type != 'html') OR ($t[0] != "@")) { if (($type != 'html') || ($t[0] != "@")) {
xml::add_element($doc, $entry, "category", "", array("scheme" => "X-DFRN:".$t[0].":".$t[1], "term" => $t[2])); xml::add_element($doc, $entry, "category", "", array("scheme" => "X-DFRN:".$t[0].":".$t[1], "term" => $t[2]));
} }
} }
@ -940,7 +996,7 @@ class dfrn {
intval($owner["uid"]), intval($owner["uid"]),
dbesc(normalise_link($mention))); dbesc(normalise_link($mention)));
if (dbm::is_result($r) AND ($r[0]["forum"] OR $r[0]["prv"])) { if (dbm::is_result($r) && ($r[0]["forum"] || $r[0]["prv"])) {
xml::add_element($doc, $entry, "link", "", array("rel" => "mentioned", xml::add_element($doc, $entry, "link", "", array("rel" => "mentioned",
"ostatus:object-type" => ACTIVITY_OBJ_GROUP, "ostatus:object-type" => ACTIVITY_OBJ_GROUP,
"href" => $mention)); "href" => $mention));
@ -1323,7 +1379,7 @@ class dfrn {
$contact["avatar-date"] = $attributes->textContent; $contact["avatar-date"] = $attributes->textContent;
} }
} }
if (($width > 0) AND ($href != "")) { if (($width > 0) && ($href != "")) {
$avatarlist[$width] = $href; $avatarlist[$width] = $href;
} }
} }
@ -1332,7 +1388,7 @@ class dfrn {
$author["avatar"] = current($avatarlist); $author["avatar"] = current($avatarlist);
} }
if (dbm::is_result($r) AND !$onlyfetch) { if (dbm::is_result($r) && !$onlyfetch) {
logger("Check if contact details for contact " . $r[0]["id"] . " (" . $r[0]["nick"] . ") have to be updated.", LOGGER_DEBUG); logger("Check if contact details for contact " . $r[0]["id"] . " (" . $r[0]["nick"] . ") have to be updated.", LOGGER_DEBUG);
$poco = array("url" => $contact["url"]); $poco = array("url" => $contact["url"]);
@ -1774,7 +1830,7 @@ class dfrn {
$relocate["poll"] = $xpath->query("dfrn:poll/text()", $relocation)->item(0)->nodeValue; $relocate["poll"] = $xpath->query("dfrn:poll/text()", $relocation)->item(0)->nodeValue;
$relocate["sitepubkey"] = $xpath->query("dfrn:sitepubkey/text()", $relocation)->item(0)->nodeValue; $relocate["sitepubkey"] = $xpath->query("dfrn:sitepubkey/text()", $relocation)->item(0)->nodeValue;
if (($relocate["avatar"] == "") AND ($relocate["photo"] != "")) { if (($relocate["avatar"] == "") && ($relocate["photo"] != "")) {
$relocate["avatar"] = $relocate["photo"]; $relocate["avatar"] = $relocate["photo"];
} }
@ -1902,7 +1958,7 @@ class dfrn {
return false; return false;
} }
$r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s', `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d", $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s', `changed` = '%s' WHERE `uri` = '%s' AND `uid` IN (0, %d)",
dbesc($item["title"]), dbesc($item["title"]),
dbesc($item["body"]), dbesc($item["body"]),
dbesc($item["tag"]), dbesc($item["tag"]),
@ -1922,13 +1978,13 @@ class dfrn {
} }
// update last-child if it changes // update last-child if it changes
if ($item["last-child"] AND ($item["last-child"] != $current["last-child"])) { if ($item["last-child"] && ($item["last-child"] != $current["last-child"])) {
$r = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d", $r = q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` IN (0, %d)",
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc($item["parent-uri"]), dbesc($item["parent-uri"]),
intval($importer["importer_uid"]) intval($importer["importer_uid"])
); );
$r = q("UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` = %d", $r = q("UPDATE `item` SET `last-child` = %d , `changed` = '%s' WHERE `uri` = '%s' AND `uid` IN (0, %d)",
intval($item["last-child"]), intval($item["last-child"]),
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc($item["uri"]), dbesc($item["uri"]),
@ -2206,7 +2262,7 @@ class dfrn {
$title = $attributes->textContent; $title = $attributes->textContent;
} }
} }
if (($rel != "") AND ($href != "")) { if (($rel != "") && ($href != "")) {
switch ($rel) { switch ($rel) {
case "alternate": case "alternate":
$item["plink"] = $href; $item["plink"] = $href;
@ -2254,7 +2310,7 @@ class dfrn {
); );
// Is there an existing item? // Is there an existing item?
if (dbm::is_result($current) AND edited_timestamp_is_newer($current[0], $item) AND if (dbm::is_result($current) && edited_timestamp_is_newer($current[0], $item) &&
(datetime_convert("UTC","UTC",$item["edited"]) < $current[0]["edited"])) { (datetime_convert("UTC","UTC",$item["edited"]) < $current[0]["edited"])) {
logger("Item ".$item["uri"]." already existed.", LOGGER_DEBUG); logger("Item ".$item["uri"]." already existed.", LOGGER_DEBUG);
return; return;
@ -2328,7 +2384,7 @@ class dfrn {
} }
$notice_info = $xpath->query("statusnet:notice_info", $entry); $notice_info = $xpath->query("statusnet:notice_info", $entry);
if ($notice_info AND ($notice_info->length > 0)) { if ($notice_info && ($notice_info->length > 0)) {
foreach ($notice_info->item(0)->attributes AS $attributes) { foreach ($notice_info->item(0)->attributes AS $attributes) {
if ($attributes->name == "source") { if ($attributes->name == "source") {
$item["app"] = strip_tags($attributes->textContent); $item["app"] = strip_tags($attributes->textContent);
@ -2378,9 +2434,9 @@ class dfrn {
} }
} }
if (($term != "") AND ($scheme != "")) { if (($term != "") && ($scheme != "")) {
$parts = explode(":", $scheme); $parts = explode(":", $scheme);
if ((count($parts) >= 4) AND (array_shift($parts) == "X-DFRN")) { if ((count($parts) >= 4) && (array_shift($parts) == "X-DFRN")) {
$termhash = array_shift($parts); $termhash = array_shift($parts);
$termurl = implode(":", $parts); $termurl = implode(":", $parts);
@ -2440,7 +2496,7 @@ class dfrn {
$item["contact-id"] = $owner["contact-id"]; $item["contact-id"] = $owner["contact-id"];
} }
if (($item["network"] != $owner["network"]) AND ($owner["network"] != "")) { if (($item["network"] != $owner["network"]) && ($owner["network"] != "")) {
$item["network"] = $owner["network"]; $item["network"] = $owner["network"];
} }
@ -2448,7 +2504,7 @@ class dfrn {
$item["contact-id"] = $author["contact-id"]; $item["contact-id"] = $author["contact-id"];
} }
if (($item["network"] != $author["network"]) AND ($author["network"] != "")) { if (($item["network"] != $author["network"]) && ($author["network"] != "")) {
$item["network"] = $author["network"]; $item["network"] = $author["network"];
} }
@ -2548,7 +2604,7 @@ class dfrn {
); );
} }
if ($posted_id AND $parent AND ($entrytype == DFRN_REPLY_RC)) { if ($posted_id && $parent && ($entrytype == DFRN_REPLY_RC)) {
logger("Notifying followers about comment ".$posted_id, LOGGER_DEBUG); logger("Notifying followers about comment ".$posted_id, LOGGER_DEBUG);
proc_run(PRIORITY_HIGH, "include/notifier.php", "comment-import", $posted_id); proc_run(PRIORITY_HIGH, "include/notifier.php", "comment-import", $posted_id);
} }
@ -2613,7 +2669,7 @@ class dfrn {
$when = datetime_convert("UTC", "UTC", "now", "Y-m-d H:i:s"); $when = datetime_convert("UTC", "UTC", "now", "Y-m-d H:i:s");
} }
if (!$uri OR !$importer["id"]) { if (!$uri || !$importer["id"]) {
return false; return false;
} }
@ -2688,7 +2744,7 @@ class dfrn {
if ($entrytype == DFRN_TOP_LEVEL) { if ($entrytype == DFRN_TOP_LEVEL) {
$r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
`body` = '', `title` = '' `body` = '', `title` = ''
WHERE `parent-uri` = '%s' AND `uid` = %d", WHERE `parent-uri` = '%s' AND `uid` IN (0, %d)",
dbesc($when), dbesc($when),
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc($uri), dbesc($uri),
@ -2700,7 +2756,7 @@ class dfrn {
} else { } else {
$r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s', $r = q("UPDATE `item` SET `deleted` = 1, `edited` = '%s', `changed` = '%s',
`body` = '', `title` = '' `body` = '', `title` = ''
WHERE `uri` = '%s' AND `uid` = %d", WHERE `uri` = '%s' AND `uid` IN (0, %d)",
dbesc($when), dbesc($when),
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc($uri), dbesc($uri),
@ -2711,7 +2767,7 @@ class dfrn {
update_thread_uri($uri, $importer["importer_uid"]); update_thread_uri($uri, $importer["importer_uid"]);
if ($item["last-child"]) { if ($item["last-child"]) {
// ensure that last-child is set in case the comment that had it just got wiped. // ensure that last-child is set in case the comment that had it just got wiped.
q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` = %d ", q("UPDATE `item` SET `last-child` = 0, `changed` = '%s' WHERE `parent-uri` = '%s' AND `uid` IN (0, %d)",
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc($item["parent-uri"]), dbesc($item["parent-uri"]),
intval($item["uid"]) intval($item["uid"])

View file

@ -4,8 +4,8 @@
* @brief The implementation of the diaspora protocol * @brief The implementation of the diaspora protocol
* *
* The new protocol is described here: http://diaspora.github.io/diaspora_federation/index.html * The new protocol is described here: http://diaspora.github.io/diaspora_federation/index.html
* Currently this implementation here interprets the old and the new protocol and sends the old one. * This implementation here interprets the old and the new protocol and sends the new one.
* This will change in the future. * In the future we will remove most stuff from "valid_posting" and interpret only the new protocol.
*/ */
use Friendica\App; use Friendica\App;
@ -416,7 +416,7 @@ class Diaspora {
$fields = $postdata['fields']; $fields = $postdata['fields'];
// Is it a an action (comment, like, ...) for our own post? // Is it a an action (comment, like, ...) for our own post?
if (isset($fields->parent_guid) AND !$postdata["relayed"]) { if (isset($fields->parent_guid) && !$postdata["relayed"]) {
$guid = notags(unxmlify($fields->parent_guid)); $guid = notags(unxmlify($fields->parent_guid));
$importer = self::importer_for_guid($guid); $importer = self::importer_for_guid($guid);
if (is_array($importer)) { if (is_array($importer)) {
@ -612,9 +612,9 @@ class Diaspora {
} }
} }
if (($fieldname == "author_signature") AND ($entry != "")) if (($fieldname == "author_signature") && ($entry != ""))
$author_signature = base64_decode($entry); $author_signature = base64_decode($entry);
elseif (($fieldname == "parent_author_signature") AND ($entry != "")) elseif (($fieldname == "parent_author_signature") && ($entry != ""))
$parent_author_signature = base64_decode($entry); $parent_author_signature = base64_decode($entry);
elseif (!in_array($fieldname, array("author_signature", "parent_author_signature", "target_author_signature"))) { elseif (!in_array($fieldname, array("author_signature", "parent_author_signature", "target_author_signature"))) {
if ($signed_data != "") { if ($signed_data != "") {
@ -624,7 +624,7 @@ class Diaspora {
$signed_data .= $entry; $signed_data .= $entry;
} }
if (!in_array($fieldname, array("parent_author_signature", "target_author_signature")) OR if (!in_array($fieldname, array("parent_author_signature", "target_author_signature")) ||
($orig_type == "relayable_retraction")) ($orig_type == "relayable_retraction"))
xml::copy($entry, $fields, $fieldname); xml::copy($entry, $fields, $fieldname);
} }
@ -714,13 +714,13 @@ class Diaspora {
$update = true; $update = true;
} }
if (!$person OR $update) { if (!$person || $update) {
logger("create or refresh", LOGGER_DEBUG); logger("create or refresh", LOGGER_DEBUG);
$r = probe_url($handle, PROBE_DIASPORA); $r = probe_url($handle, PROBE_DIASPORA);
// Note that Friendica contacts will return a "Diaspora person" // Note that Friendica contacts will return a "Diaspora person"
// if Diaspora connectivity is enabled on their server // if Diaspora connectivity is enabled on their server
if ($r AND ($r["network"] === NETWORK_DIASPORA)) { if ($r && ($r["network"] === NETWORK_DIASPORA)) {
self::add_fcontact($r, $update); self::add_fcontact($r, $update);
$person = $r; $person = $r;
} }
@ -880,11 +880,14 @@ class Diaspora {
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
return $r[0]; return $r[0];
} else { } else {
// We haven't found it? /*
// We use another function for it that will possibly create a contact entry * We haven't found it?
* We use another function for it that will possibly create a contact entry.
*/
$cid = get_contact($handle, $uid); $cid = get_contact($handle, $uid);
if ($cid > 0) { if ($cid > 0) {
/// @TODO Contact retrieval should be encapsulated into an "entity" class like `Contact`
$r = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($cid)); $r = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($cid));
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
@ -919,9 +922,11 @@ class Diaspora {
*/ */
private static function post_allow($importer, $contact, $is_comment = false) { private static function post_allow($importer, $contact, $is_comment = false) {
// perhaps we were already sharing with this person. Now they're sharing with us. /*
// That makes us friends. * Perhaps we were already sharing with this person. Now they're sharing with us.
// Normally this should have handled by getting a request - but this could get lost * That makes us friends.
* Normally this should have handled by getting a request - but this could get lost
*/
if ($contact["rel"] == CONTACT_IS_FOLLOWER && in_array($importer["page-flags"], array(PAGE_FREELOVE))) { if ($contact["rel"] == CONTACT_IS_FOLLOWER && in_array($importer["page-flags"], array(PAGE_FREELOVE))) {
q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d", q("UPDATE `contact` SET `rel` = %d, `writable` = 1 WHERE `id` = %d AND `uid` = %d",
intval(CONTACT_IS_FRIEND), intval(CONTACT_IS_FRIEND),
@ -934,16 +939,19 @@ class Diaspora {
// We don't seem to like that person // We don't seem to like that person
if ($contact["blocked"] || $contact["readonly"] || $contact["archive"]) { if ($contact["blocked"] || $contact["readonly"] || $contact["archive"]) {
// Maybe blocked, don't accept.
return false; return false;
// We are following this person? Then it is okay // We are following this person?
} elseif (($contact["rel"] == CONTACT_IS_SHARING) || ($contact["rel"] == CONTACT_IS_FRIEND)) { } elseif (($contact["rel"] == CONTACT_IS_SHARING) || ($contact["rel"] == CONTACT_IS_FRIEND)) {
// Yes, then it is fine.
return true; return true;
// Is it a post to a community? That's good // Is it a post to a community?
} elseif (($contact["rel"] == CONTACT_IS_FOLLOWER) && ($importer["page-flags"] == PAGE_COMMUNITY)) { } elseif (($contact["rel"] == CONTACT_IS_FOLLOWER) && ($importer["page-flags"] == PAGE_COMMUNITY)) {
// That's good
return true; return true;
} // Is the message a global user or a comment?
} elseif (($importer["uid"] == 0) || $is_comment) {
// Messages for the global users and comments are always accepted // Messages for the global users and comments are always accepted
if (($importer["uid"] == 0) || $is_comment) {
return true; return true;
} }
@ -1143,7 +1151,7 @@ class Diaspora {
// Fetch the author - for the old and the new Diaspora version // Fetch the author - for the old and the new Diaspora version
if ($source_xml->post->status_message->diaspora_handle) if ($source_xml->post->status_message->diaspora_handle)
$author = (string)$source_xml->post->status_message->diaspora_handle; $author = (string)$source_xml->post->status_message->diaspora_handle;
elseif ($source_xml->author AND ($source_xml->getName() == "status_message")) elseif ($source_xml->author && ($source_xml->getName() == "status_message"))
$author = (string)$source_xml->author; $author = (string)$source_xml->author;
// If this isn't a "status_message" then quit // If this isn't a "status_message" then quit
@ -1463,7 +1471,7 @@ class Diaspora {
} }
// If we are the origin of the parent we store the original data and notify our followers // If we are the origin of the parent we store the original data and notify our followers
if ($message_id AND $parent_item["origin"]) { if ($message_id && $parent_item["origin"]) {
// Formerly we stored the signed text, the signature and the author in different fields. // Formerly we stored the signed text, the signature and the author in different fields.
// We now store the raw data so that we are more flexible. // We now store the raw data so that we are more flexible.
@ -1521,6 +1529,8 @@ class Diaspora {
$person = self::person_by_handle($msg_author); $person = self::person_by_handle($msg_author);
dba::lock('mail');
$r = q("SELECT `id` FROM `mail` WHERE `guid` = '%s' AND `uid` = %d LIMIT 1", $r = q("SELECT `id` FROM `mail` WHERE `guid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($msg_guid), dbesc($msg_guid),
intval($importer["uid"]) intval($importer["uid"])
@ -1548,6 +1558,8 @@ class Diaspora {
dbesc($msg_created_at) dbesc($msg_created_at)
); );
dba::unlock();
q("UPDATE `conv` SET `updated` = '%s' WHERE `id` = %d", q("UPDATE `conv` SET `updated` = '%s' WHERE `id` = %d",
dbesc(datetime_convert()), dbesc(datetime_convert()),
intval($conversation["id"]) intval($conversation["id"])
@ -1767,7 +1779,7 @@ class Diaspora {
} }
// If we are the origin of the parent we store the original data and notify our followers // If we are the origin of the parent we store the original data and notify our followers
if ($message_id AND $parent_item["origin"]) { if ($message_id && $parent_item["origin"]) {
// Formerly we stored the signed text, the signature and the author in different fields. // Formerly we stored the signed text, the signature and the author in different fields.
// We now store the raw data so that we are more flexible. // We now store the raw data so that we are more flexible.
@ -1824,6 +1836,12 @@ class Diaspora {
return false; return false;
} }
$body = diaspora2bb($text);
$body = self::replace_people_guid($body, $person["url"]);
dba::lock('mail');
$r = q("SELECT `id` FROM `mail` WHERE `guid` = '%s' AND `uid` = %d LIMIT 1", $r = q("SELECT `id` FROM `mail` WHERE `guid` = '%s' AND `uid` = %d LIMIT 1",
dbesc($guid), dbesc($guid),
intval($importer["uid"]) intval($importer["uid"])
@ -1833,10 +1851,6 @@ class Diaspora {
return false; return false;
} }
$body = diaspora2bb($text);
$body = self::replace_people_guid($body, $person["url"]);
q("INSERT INTO `mail` (`uid`, `guid`, `convid`, `from-name`,`from-photo`,`from-url`,`contact-id`,`title`,`body`,`seen`,`reply`,`uri`,`parent-uri`,`created`) q("INSERT INTO `mail` (`uid`, `guid`, `convid`, `from-name`,`from-photo`,`from-url`,`contact-id`,`title`,`body`,`seen`,`reply`,`uri`,`parent-uri`,`created`)
VALUES ( %d, '%s', %d, '%s', '%s', '%s', %d, '%s', '%s', %d, %d, '%s','%s','%s')", VALUES ( %d, '%s', %d, '%s', '%s', '%s', %d, '%s', '%s', %d, %d, '%s','%s','%s')",
intval($importer["uid"]), intval($importer["uid"]),
@ -1855,6 +1869,8 @@ class Diaspora {
dbesc($created_at) dbesc($created_at)
); );
dba::unlock();
q("UPDATE `conv` SET `updated` = '%s' WHERE `id` = %d", q("UPDATE `conv` SET `updated` = '%s' WHERE `id` = %d",
dbesc(datetime_convert()), dbesc(datetime_convert()),
intval($conversation["id"]) intval($conversation["id"])
@ -2116,7 +2132,7 @@ class Diaspora {
// perhaps we were already sharing with this person. Now they're sharing with us. // perhaps we were already sharing with this person. Now they're sharing with us.
// That makes us friends. // That makes us friends.
if ($contact) { if ($contact) {
if ($following AND $sharing) { if ($following && $sharing) {
logger("Author ".$author." (Contact ".$contact["id"].") wants to have a bidirectional conection.", LOGGER_DEBUG); logger("Author ".$author." (Contact ".$contact["id"].") wants to have a bidirectional conection.", LOGGER_DEBUG);
self::receive_request_make_friend($importer, $contact); self::receive_request_make_friend($importer, $contact);
@ -2139,17 +2155,17 @@ class Diaspora {
} }
} }
if (!$following AND $sharing AND in_array($importer["page-flags"], array(PAGE_SOAPBOX, PAGE_NORMAL))) { if (!$following && $sharing && in_array($importer["page-flags"], array(PAGE_SOAPBOX, PAGE_NORMAL))) {
logger("Author ".$author." wants to share with us - but doesn't want to listen. Request is ignored.", LOGGER_DEBUG); logger("Author ".$author." wants to share with us - but doesn't want to listen. Request is ignored.", LOGGER_DEBUG);
return false; return false;
} elseif (!$following AND !$sharing) { } elseif (!$following && !$sharing) {
logger("Author ".$author." doesn't want anything - and we don't know the author. Request is ignored.", LOGGER_DEBUG); logger("Author ".$author." doesn't want anything - and we don't know the author. Request is ignored.", LOGGER_DEBUG);
return false; return false;
} elseif (!$following AND $sharing) { } elseif (!$following && $sharing) {
logger("Author ".$author." wants to share with us.", LOGGER_DEBUG); logger("Author ".$author." wants to share with us.", LOGGER_DEBUG);
} elseif ($following AND $sharing) { } elseif ($following && $sharing) {
logger("Author ".$author." wants to have a bidirectional conection.", LOGGER_DEBUG); logger("Author ".$author." wants to have a bidirectional conection.", LOGGER_DEBUG);
} elseif ($following AND !$sharing) { } elseif ($following && !$sharing) {
logger("Author ".$author." wants to listen to us.", LOGGER_DEBUG); logger("Author ".$author." wants to listen to us.", LOGGER_DEBUG);
} }
@ -2227,9 +2243,9 @@ class Diaspora {
// but if our page-type is PAGE_COMMUNITY or PAGE_SOAPBOX // but if our page-type is PAGE_COMMUNITY or PAGE_SOAPBOX
// we are going to change the relationship and make them a follower. // we are going to change the relationship and make them a follower.
if (($importer["page-flags"] == PAGE_FREELOVE) AND $sharing AND $following) if (($importer["page-flags"] == PAGE_FREELOVE) && $sharing && $following)
$new_relation = CONTACT_IS_FRIEND; $new_relation = CONTACT_IS_FRIEND;
elseif (($importer["page-flags"] == PAGE_FREELOVE) AND $sharing) elseif (($importer["page-flags"] == PAGE_FREELOVE) && $sharing)
$new_relation = CONTACT_IS_SHARING; $new_relation = CONTACT_IS_SHARING;
else else
$new_relation = CONTACT_IS_FOLLOWER; $new_relation = CONTACT_IS_FOLLOWER;
@ -2452,7 +2468,7 @@ class Diaspora {
intval($r[0]["parent"])); intval($r[0]["parent"]));
// Only delete it if the parent author really fits // Only delete it if the parent author really fits
if (!link_compare($p[0]["author-link"], $contact["url"]) AND !link_compare($r[0]["author-link"], $contact["url"])) { if (!link_compare($p[0]["author-link"], $contact["url"]) && !link_compare($r[0]["author-link"], $contact["url"])) {
logger("Thread author ".$p[0]["author-link"]." and item author ".$r[0]["author-link"]." don't fit to expected contact ".$contact["url"], LOGGER_DEBUG); logger("Thread author ".$p[0]["author-link"]." and item author ".$r[0]["author-link"]." don't fit to expected contact ".$contact["url"], LOGGER_DEBUG);
return false; return false;
} }
@ -2489,7 +2505,7 @@ class Diaspora {
$target_type = notags(unxmlify($data->target_type)); $target_type = notags(unxmlify($data->target_type));
$contact = self::contact_by_handle($importer["uid"], $sender); $contact = self::contact_by_handle($importer["uid"], $sender);
if (!$contact AND (in_array($target_type, array("Contact", "Person")))) { if (!$contact && (in_array($target_type, array("Contact", "Person")))) {
logger("cannot find contact for sender: ".$sender." and user ".$importer["uid"]); logger("cannot find contact for sender: ".$sender." and user ".$importer["uid"]);
return false; return false;
} }
@ -2499,7 +2515,7 @@ class Diaspora {
switch ($target_type) { switch ($target_type) {
case "Comment": case "Comment":
case "Like": case "Like":
case "Post": // "Post" will be supported in a future version case "Post":
case "Reshare": case "Reshare":
case "StatusMessage": case "StatusMessage":
return self::item_retraction($importer, $contact, $data); return self::item_retraction($importer, $contact, $data);
@ -2617,7 +2633,7 @@ class Diaspora {
$datarray["location"] = $address["address"]; $datarray["location"] = $address["address"];
} }
if (isset($address["lat"]) AND isset($address["lng"])) { if (isset($address["lat"]) && isset($address["lng"])) {
$datarray["coord"] = $address["lat"]." ".$address["lng"]; $datarray["coord"] = $address["lat"]." ".$address["lng"];
} }
@ -2659,15 +2675,54 @@ class Diaspora {
return $nick."@".substr(App::get_baseurl(), strpos(App::get_baseurl(),"://") + 3); return $nick."@".substr(App::get_baseurl(), strpos(App::get_baseurl(),"://") + 3);
} }
/** /**
* @brief Creates the envelope for the "fetch" endpoint * @brief Creates the data for a private message in the new format
*
* @param string $msg The message that is to be transmitted
* @param array $user The record of the sender
* @param array $contact Target of the communication
* @param string $prvkey The private key of the sender
* @param string $pubkey The public key of the receiver
*
* @return string The encrypted data
*/
public static function encode_private_data($msg, $user, $contact, $prvkey, $pubkey) {
logger("Message: ".$msg, LOGGER_DATA);
// without a public key nothing will work
if (!$pubkey) {
logger("pubkey missing: contact id: ".$contact["id"]);
return false;
}
$aes_key = openssl_random_pseudo_bytes(32);
$b_aes_key = base64_encode($aes_key);
$iv = openssl_random_pseudo_bytes(16);
$b_iv = base64_encode($iv);
$ciphertext = self::aes_encrypt($aes_key, $iv, $msg);
$json = json_encode(array("iv" => $b_iv, "key" => $b_aes_key));
$encrypted_key_bundle = "";
openssl_public_encrypt($json, $encrypted_key_bundle, $pubkey);
$json_object = json_encode(array("aes_key" => base64_encode($encrypted_key_bundle),
"encrypted_magic_envelope" => base64_encode($ciphertext)));
return $json_object;
}
/**
* @brief Creates the envelope for the "fetch" endpoint and for the new format
* *
* @param string $msg The message that is to be transmitted * @param string $msg The message that is to be transmitted
* @param array $user The record of the sender * @param array $user The record of the sender
* *
* @return string The envelope * @return string The envelope
*/ */
public static function build_magic_envelope($msg, $user) { public static function build_magic_envelope($msg, $user) {
$b64url_data = base64url_encode($msg); $b64url_data = base64url_encode($msg);
@ -2678,7 +2733,12 @@ class Diaspora {
$encoding = "base64url"; $encoding = "base64url";
$alg = "RSA-SHA256"; $alg = "RSA-SHA256";
$signable_data = $data.".".base64url_encode($type).".".base64url_encode($encoding).".".base64url_encode($alg); $signable_data = $data.".".base64url_encode($type).".".base64url_encode($encoding).".".base64url_encode($alg);
$signature = rsa_sign($signable_data, $user["prvkey"]);
// Fallback if the private key wasn't transmitted in the expected field
if ($user['uprvkey'] == "")
$user['uprvkey'] = $user['prvkey'];
$signature = rsa_sign($signable_data, $user["uprvkey"]);
$sig = base64url_encode($signature); $sig = base64url_encode($signature);
$xmldata = array("me:env" => array("me:data" => $data, $xmldata = array("me:env" => array("me:data" => $data,
@ -2693,140 +2753,6 @@ class Diaspora {
return xml::from_array($xmldata, $xml, false, $namespaces); return xml::from_array($xmldata, $xml, false, $namespaces);
} }
/**
* @brief Creates the envelope for a public message
*
* @param string $msg The message that is to be transmitted
* @param array $user The record of the sender
* @param array $contact Target of the communication
* @param string $prvkey The private key of the sender
* @param string $pubkey The public key of the receiver
*
* @return string The envelope
*/
private static function build_public_message($msg, $user, $contact, $prvkey, $pubkey) {
logger("Message: ".$msg, LOGGER_DATA);
$handle = self::my_handle($user);
$b64url_data = base64url_encode($msg);
$data = str_replace(array("\n", "\r", " ", "\t"), array("", "", "", ""), $b64url_data);
$type = "application/xml";
$encoding = "base64url";
$alg = "RSA-SHA256";
$signable_data = $data.".".base64url_encode($type).".".base64url_encode($encoding).".".base64url_encode($alg);
$signature = rsa_sign($signable_data,$prvkey);
$sig = base64url_encode($signature);
$xmldata = array("diaspora" => array("header" => array("author_id" => $handle),
"me:env" => array("me:encoding" => $encoding,
"me:alg" => $alg,
"me:data" => $data,
"@attributes" => array("type" => $type),
"me:sig" => $sig)));
$namespaces = array("" => "https://joindiaspora.com/protocol",
"me" => "http://salmon-protocol.org/ns/magic-env");
$magic_env = xml::from_array($xmldata, $xml, false, $namespaces);
logger("magic_env: ".$magic_env, LOGGER_DATA);
return $magic_env;
}
/**
* @brief Creates the envelope for a private message
*
* @param string $msg The message that is to be transmitted
* @param array $user The record of the sender
* @param array $contact Target of the communication
* @param string $prvkey The private key of the sender
* @param string $pubkey The public key of the receiver
*
* @return string The envelope
*/
private static function build_private_message($msg, $user, $contact, $prvkey, $pubkey) {
logger("Message: ".$msg, LOGGER_DATA);
// without a public key nothing will work
if (!$pubkey) {
logger("pubkey missing: contact id: ".$contact["id"]);
return false;
}
$inner_aes_key = openssl_random_pseudo_bytes(32);
$b_inner_aes_key = base64_encode($inner_aes_key);
$inner_iv = openssl_random_pseudo_bytes(16);
$b_inner_iv = base64_encode($inner_iv);
$outer_aes_key = openssl_random_pseudo_bytes(32);
$b_outer_aes_key = base64_encode($outer_aes_key);
$outer_iv = openssl_random_pseudo_bytes(16);
$b_outer_iv = base64_encode($outer_iv);
$handle = self::my_handle($user);
$inner_encrypted = self::aes_encrypt($inner_aes_key, $inner_iv, $msg);
$b64_data = base64_encode($inner_encrypted);
$b64url_data = base64url_encode($b64_data);
$data = str_replace(array("\n", "\r", " ", "\t"), array("", "", "", ""), $b64url_data);
$type = "application/xml";
$encoding = "base64url";
$alg = "RSA-SHA256";
$signable_data = $data.".".base64url_encode($type).".".base64url_encode($encoding).".".base64url_encode($alg);
$signature = rsa_sign($signable_data,$prvkey);
$sig = base64url_encode($signature);
$xmldata = array("decrypted_header" => array("iv" => $b_inner_iv,
"aes_key" => $b_inner_aes_key,
"author_id" => $handle));
$decrypted_header = xml::from_array($xmldata, $xml, true);
$ciphertext = self::aes_encrypt($outer_aes_key, $outer_iv, $decrypted_header);
$outer_json = json_encode(array("iv" => $b_outer_iv, "key" => $b_outer_aes_key));
$encrypted_outer_key_bundle = "";
openssl_public_encrypt($outer_json, $encrypted_outer_key_bundle, $pubkey);
$b64_encrypted_outer_key_bundle = base64_encode($encrypted_outer_key_bundle);
logger("outer_bundle: ".$b64_encrypted_outer_key_bundle." key: ".$pubkey, LOGGER_DATA);
$encrypted_header_json_object = json_encode(array("aes_key" => base64_encode($encrypted_outer_key_bundle),
"ciphertext" => base64_encode($ciphertext)));
$cipher_json = base64_encode($encrypted_header_json_object);
$xmldata = array("diaspora" => array("encrypted_header" => $cipher_json,
"me:env" => array("me:encoding" => $encoding,
"me:alg" => $alg,
"me:data" => $data,
"@attributes" => array("type" => $type),
"me:sig" => $sig)));
$namespaces = array("" => "https://joindiaspora.com/protocol",
"me" => "http://salmon-protocol.org/ns/magic-env");
$magic_env = xml::from_array($xmldata, $xml, false, $namespaces);
logger("magic_env: ".$magic_env, LOGGER_DATA);
return $magic_env;
}
/** /**
* @brief Create the envelope for a message * @brief Create the envelope for a message
* *
@ -2841,14 +2767,15 @@ class Diaspora {
*/ */
private static function build_message($msg, $user, $contact, $prvkey, $pubkey, $public = false) { private static function build_message($msg, $user, $contact, $prvkey, $pubkey, $public = false) {
if ($public) // The message is put into an envelope with the sender's signature
$magic_env = self::build_public_message($msg,$user,$contact,$prvkey,$pubkey); $envelope = self::build_magic_envelope($msg, $user);
else
$magic_env = self::build_private_message($msg,$user,$contact,$prvkey,$pubkey);
// The data that will be transmitted is double encoded via "urlencode", strange ... // Private messages are put into a second envelope, encrypted with the receivers public key
$slap = "xml=".urlencode(urlencode($magic_env)); if (!$public) {
return $slap; $envelope = self::encode_private_data($envelope, $user, $contact, $prvkey, $pubkey);
}
return $envelope;
} }
/** /**
@ -2874,14 +2801,14 @@ class Diaspora {
* *
* @param array $owner the array of the item owner * @param array $owner the array of the item owner
* @param array $contact Target of the communication * @param array $contact Target of the communication
* @param string $slap The message that is to be transmitted * @param string $envelope The message that is to be transmitted
* @param bool $public_batch Is it a public post? * @param bool $public_batch Is it a public post?
* @param bool $queue_run Is the transmission called from the queue? * @param bool $queue_run Is the transmission called from the queue?
* @param string $guid message guid * @param string $guid message guid
* *
* @return int Result of the transmission * @return int Result of the transmission
*/ */
public static function transmit($owner, $contact, $slap, $public_batch, $queue_run=false, $guid = "") { public static function transmit($owner, $contact, $envelope, $public_batch, $queue_run=false, $guid = "") {
$a = get_app(); $a = get_app();
@ -2902,7 +2829,9 @@ class Diaspora {
$return_code = 0; $return_code = 0;
} else { } else {
if (!intval(get_config("system", "diaspora_test"))) { if (!intval(get_config("system", "diaspora_test"))) {
post_url($dest_url."/", $slap); $content_type = (($public_batch) ? "application/magic-envelope+xml" : "application/json");
post_url($dest_url."/", $envelope, array("Content-Type: ".$content_type));
$return_code = $a->get_curl_code(); $return_code = $a->get_curl_code();
} else { } else {
logger("test_mode"); logger("test_mode");
@ -2918,19 +2847,19 @@ class Diaspora {
$r = q("SELECT `id` FROM `queue` WHERE `cid` = %d AND `network` = '%s' AND `content` = '%s' AND `batch` = %d LIMIT 1", $r = q("SELECT `id` FROM `queue` WHERE `cid` = %d AND `network` = '%s' AND `content` = '%s' AND `batch` = %d LIMIT 1",
intval($contact["id"]), intval($contact["id"]),
dbesc(NETWORK_DIASPORA), dbesc(NETWORK_DIASPORA),
dbesc($slap), dbesc($envelope),
intval($public_batch) intval($public_batch)
); );
if ($r) { if ($r) {
logger("add_to_queue ignored - identical item already in queue"); logger("add_to_queue ignored - identical item already in queue");
} else { } else {
// queue message for redelivery // queue message for redelivery
add_to_queue($contact["id"], NETWORK_DIASPORA, $slap, $public_batch); add_to_queue($contact["id"], NETWORK_DIASPORA, $envelope, $public_batch);
// The message could not be delivered. We mark the contact as "dead" // The message could not be delivered. We mark the contact as "dead"
mark_for_death($contact); mark_for_death($contact);
} }
} elseif (($return_code >= 200) AND ($return_code <= 299)) { } elseif (($return_code >= 200) && ($return_code <= 299)) {
// We successfully delivered a message, the contact is alive // We successfully delivered a message, the contact is alive
unmark_for_death($contact); unmark_for_death($contact);
} }
@ -2949,7 +2878,8 @@ class Diaspora {
*/ */
public static function build_post_xml($type, $message) { public static function build_post_xml($type, $message) {
$data = array("XML" => array("post" => array($type => $message))); $data = array($type => $message);
return xml::from_array($data, $xml); return xml::from_array($data, $xml);
} }
@ -2977,13 +2907,13 @@ class Diaspora {
if ($owner['uprvkey'] == "") if ($owner['uprvkey'] == "")
$owner['uprvkey'] = $owner['prvkey']; $owner['uprvkey'] = $owner['prvkey'];
$slap = self::build_message($msg, $owner, $contact, $owner['uprvkey'], $contact['pubkey'], $public_batch); $envelope = self::build_message($msg, $owner, $contact, $owner['uprvkey'], $contact['pubkey'], $public_batch);
if ($spool) { if ($spool) {
add_to_queue($contact['id'], NETWORK_DIASPORA, $slap, $public_batch); add_to_queue($contact['id'], NETWORK_DIASPORA, $envelope, $public_batch);
return true; return true;
} else } else
$return_code = self::transmit($owner, $contact, $slap, $public_batch, false, $guid); $return_code = self::transmit($owner, $contact, $envelope, $public_batch, false, $guid);
logger("guid: ".$item["guid"]." result ".$return_code, LOGGER_DEBUG); logger("guid: ".$item["guid"]." result ".$return_code, LOGGER_DEBUG);
@ -3000,12 +2930,35 @@ class Diaspora {
*/ */
public static function send_share($owner, $contact) { public static function send_share($owner, $contact) {
$message = array("sender_handle" => self::my_handle($owner), /**
"recipient_handle" => $contact["addr"]); * @todo support the different possible combinations of "following" and "sharing"
* Currently, Diaspora only interprets the "sharing" field
*
* Before switching this code productive, we have to check all "send_share" calls if "rel" is set correctly
*/
/*
switch ($contact["rel"]) {
case CONTACT_IS_FRIEND:
$following = true;
$sharing = true;
case CONTACT_IS_SHARING:
$following = false;
$sharing = true;
case CONTACT_IS_FOLLOWER:
$following = true;
$sharing = false;
}
*/
$message = array("author" => self::my_handle($owner),
"recipient" => $contact["addr"],
"following" => "true",
"sharing" => "true");
logger("Send share ".print_r($message, true), LOGGER_DEBUG); logger("Send share ".print_r($message, true), LOGGER_DEBUG);
return self::build_and_transmit($owner, $contact, "request", $message); return self::build_and_transmit($owner, $contact, "contact", $message);
} }
/** /**
@ -3018,13 +2971,14 @@ class Diaspora {
*/ */
public static function send_unshare($owner, $contact) { public static function send_unshare($owner, $contact) {
$message = array("post_guid" => $owner["guid"], $message = array("author" => self::my_handle($owner),
"diaspora_handle" => self::my_handle($owner), "recipient" => $contact["addr"],
"type" => "Person"); "following" => "false",
"sharing" => "false");
logger("Send unshare ".print_r($message, true), LOGGER_DEBUG); logger("Send unshare ".print_r($message, true), LOGGER_DEBUG);
return self::build_and_transmit($owner, $contact, "retraction", $message); return self::build_and_transmit($owner, $contact, "contact", $message);
} }
/** /**
@ -3040,7 +2994,7 @@ class Diaspora {
// Skip if it isn't a pure repeated messages // Skip if it isn't a pure repeated messages
// Does it start with a share? // Does it start with a share?
if ((strpos($body, "[share") > 0) AND $complete) if ((strpos($body, "[share") > 0) && $complete)
return(false); return(false);
// Does it end with a share? // Does it end with a share?
@ -3088,7 +3042,7 @@ class Diaspora {
$ret= array(); $ret= array();
$ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile); $ret["root_handle"] = preg_replace("=https?://(.*)/u/(.*)=ism", "$2@$1", $profile);
if (($ret["root_handle"] == $profile) OR ($ret["root_handle"] == "")) if (($ret["root_handle"] == $profile) || ($ret["root_handle"] == ""))
return(false); return(false);
$link = ""; $link = "";
@ -3101,7 +3055,7 @@ class Diaspora {
$link = $matches[1]; $link = $matches[1];
$ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link); $ret["root_guid"] = preg_replace("=https?://(.*)/posts/(.*)=ism", "$2", $link);
if (($ret["root_guid"] == $link) OR (trim($ret["root_guid"]) == "")) if (($ret["root_guid"] == $link) || (trim($ret["root_guid"]) == ""))
return(false); return(false);
return($ret); return($ret);
@ -3161,7 +3115,7 @@ class Diaspora {
if ($event['start']) { if ($event['start']) {
$eventdata['start'] = datetime_convert($eventdata['timezone'], "UTC", $event['start'], $mask); $eventdata['start'] = datetime_convert($eventdata['timezone'], "UTC", $event['start'], $mask);
} }
if ($event['finish'] AND !$event['nofinish']) { if ($event['finish'] && !$event['nofinish']) {
$eventdata['end'] = datetime_convert($eventdata['timezone'], "UTC", $event['finish'], $mask); $eventdata['end'] = datetime_convert($eventdata['timezone'], "UTC", $event['finish'], $mask);
} }
if ($event['summary']) { if ($event['summary']) {
@ -3207,14 +3161,14 @@ class Diaspora {
$created = datetime_convert("UTC", "UTC", $item["created"], 'Y-m-d\TH:i:s\Z'); $created = datetime_convert("UTC", "UTC", $item["created"], 'Y-m-d\TH:i:s\Z');
// Detect a share element and do a reshare // Detect a share element and do a reshare
if (!$item['private'] AND ($ret = self::is_reshare($item["body"]))) { if (!$item['private'] && ($ret = self::is_reshare($item["body"]))) {
$message = array("root_diaspora_id" => $ret["root_handle"], $message = array("author" => $myaddr,
"root_guid" => $ret["root_guid"],
"guid" => $item["guid"], "guid" => $item["guid"],
"diaspora_handle" => $myaddr,
"public" => $public,
"created_at" => $created, "created_at" => $created,
"provider_display_name" => $item["app"]); "root_author" => $ret["root_handle"],
"root_guid" => $ret["root_guid"],
"provider_display_name" => $item["app"],
"public" => $public);
$type = "reshare"; $type = "reshare";
} else { } else {
@ -3248,16 +3202,16 @@ class Diaspora {
$location["lng"] = $coord[1]; $location["lng"] = $coord[1];
} }
$message = array("raw_message" => $body, $message = array("author" => $myaddr,
"location" => $location,
"guid" => $item["guid"], "guid" => $item["guid"],
"diaspora_handle" => $myaddr,
"public" => $public,
"created_at" => $created, "created_at" => $created,
"provider_display_name" => $item["app"]); "public" => $public,
"text" => $body,
"provider_display_name" => $item["app"],
"location" => $location);
// Diaspora rejects messages when they contain a location without "lat" or "lng" // Diaspora rejects messages when they contain a location without "lat" or "lng"
if (!isset($location["lat"]) OR !isset($location["lng"])) { if (!isset($location["lat"]) || !isset($location["lng"])) {
unset($message["location"]); unset($message["location"]);
} }
@ -3267,7 +3221,7 @@ class Diaspora {
$message['event'] = $event; $message['event'] = $event;
/// @todo Once Diaspora supports it, we will remove the body /// @todo Once Diaspora supports it, we will remove the body
// $message['raw_message'] = ''; // $message['text'] = '';
} }
} }
@ -3322,12 +3276,12 @@ class Diaspora {
$positive = "false"; $positive = "false";
} }
return(array("positive" => $positive, return(array("author" => self::my_handle($owner),
"guid" => $item["guid"], "guid" => $item["guid"],
"target_type" => $target_type,
"parent_guid" => $parent["guid"], "parent_guid" => $parent["guid"],
"author_signature" => "", "parent_type" => $target_type,
"diaspora_handle" => self::my_handle($owner))); "positive" => $positive,
"author_signature" => ""));
} }
/** /**
@ -3399,12 +3353,12 @@ class Diaspora {
$text = html_entity_decode(bb2diaspora($item["body"])); $text = html_entity_decode(bb2diaspora($item["body"]));
$created = datetime_convert("UTC", "UTC", $item["created"], 'Y-m-d\TH:i:s\Z'); $created = datetime_convert("UTC", "UTC", $item["created"], 'Y-m-d\TH:i:s\Z');
$comment = array("guid" => $item["guid"], $comment = array("author" => self::my_handle($owner),
"guid" => $item["guid"],
"created_at" => $created,
"parent_guid" => $parent["guid"], "parent_guid" => $parent["guid"],
"author_signature" => "",
"text" => $text, "text" => $text,
/// @todo Currently disabled until Diaspora supports it: "created_at" => $created, "author_signature" => "");
"diaspora_handle" => self::my_handle($owner));
// Send the thread parent guid only if it is a threaded comment // Send the thread parent guid only if it is a threaded comment
if ($item['thr-parent'] != $item['parent-uri']) { if ($item['thr-parent'] != $item['parent-uri']) {
@ -3461,19 +3415,17 @@ class Diaspora {
$signed_parts = explode(";", $signature['signed_text']); $signed_parts = explode(";", $signature['signed_text']);
if ($item["deleted"]) if ($item["deleted"])
$message = array("parent_author_signature" => "", $message = array("author" => $signature['signer'],
"target_guid" => $signed_parts[0], "target_guid" => $signed_parts[0],
"target_type" => $signed_parts[1], "target_type" => $signed_parts[1]);
"sender_handle" => $signature['signer'],
"target_author_signature" => $signature['signature']);
elseif ($item['verb'] === ACTIVITY_LIKE) elseif ($item['verb'] === ACTIVITY_LIKE)
$message = array("positive" => $signed_parts[0], $message = array("author" => $signed_parts[4],
"guid" => $signed_parts[1], "guid" => $signed_parts[1],
"target_type" => $signed_parts[2],
"parent_guid" => $signed_parts[3], "parent_guid" => $signed_parts[3],
"parent_author_signature" => "", "parent_type" => $signed_parts[2],
"positive" => $signed_parts[0],
"author_signature" => $signature['signature'], "author_signature" => $signature['signature'],
"diaspora_handle" => $signed_parts[4]); "parent_author_signature" => "");
else { else {
// Remove the comment guid // Remove the comment guid
$guid = array_shift($signed_parts); $guid = array_shift($signed_parts);
@ -3487,12 +3439,12 @@ class Diaspora {
// Glue the parts together // Glue the parts together
$text = implode(";", $signed_parts); $text = implode(";", $signed_parts);
$message = array("guid" => $guid, $message = array("author" => $handle,
"guid" => $guid,
"parent_guid" => $parent_guid, "parent_guid" => $parent_guid,
"parent_author_signature" => "",
"author_signature" => $signature['signature'],
"text" => implode(";", $signed_parts), "text" => implode(";", $signed_parts),
"diaspora_handle" => $handle); "author_signature" => $signature['signature'],
"parent_author_signature" => "");
} }
return $message; return $message;
} }
@ -3532,7 +3484,7 @@ class Diaspora {
// Old way - is used by the internal Friendica functions // Old way - is used by the internal Friendica functions
/// @todo Change all signatur storing functions to the new format /// @todo Change all signatur storing functions to the new format
if ($signature['signed_text'] AND $signature['signature'] AND $signature['signer']) if ($signature['signed_text'] && $signature['signature'] && $signature['signer'])
$message = self::message_from_signature($item, $signature); $message = self::message_from_signature($item, $signature);
else {// New way else {// New way
$msg = json_decode($signature['signed_text'], true); $msg = json_decode($signature['signed_text'], true);
@ -3541,10 +3493,12 @@ class Diaspora {
if (is_array($msg)) { if (is_array($msg)) {
foreach ($msg AS $field => $data) { foreach ($msg AS $field => $data) {
if (!$item["deleted"]) { if (!$item["deleted"]) {
if ($field == "author") if ($field == "diaspora_handle") {
$field = "diaspora_handle"; $field = "author";
if ($field == "parent_type") }
$field = "target_type"; if ($field == "target_type") {
$field = "parent_type";
}
} }
$message[$field] = $data; $message[$field] = $data;
@ -3575,26 +3529,12 @@ class Diaspora {
$itemaddr = self::handle_from_contact($item["contact-id"], $item["gcontact-id"]); $itemaddr = self::handle_from_contact($item["contact-id"], $item["gcontact-id"]);
// Check whether the retraction is for a top-level post or whether it's a relayable $msg_type = "retraction";
if ($item["uri"] !== $item["parent-uri"]) { $target_type = "Post";
$msg_type = "relayable_retraction";
$target_type = (($item["verb"] === ACTIVITY_LIKE) ? "Like" : "Comment");
} else {
$msg_type = "signed_retraction";
$target_type = "StatusMessage";
}
if ($relay AND ($item["uri"] !== $item["parent-uri"])) $message = array("author" => $itemaddr,
$signature = "parent_author_signature"; "target_guid" => $item['guid'],
else "target_type" => $target_type);
$signature = "target_author_signature";
$signed_text = $item["guid"].";".$target_type;
$message = array("target_guid" => $item['guid'],
"target_type" => $target_type,
"sender_handle" => $itemaddr,
$signature => base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256')));
logger("Got message ".print_r($message, true), LOGGER_DEBUG); logger("Got message ".print_r($message, true), LOGGER_DEBUG);
@ -3626,40 +3566,35 @@ class Diaspora {
$cnv = $r[0]; $cnv = $r[0];
$conv = array( $conv = array(
"author" => $cnv["creator"],
"guid" => $cnv["guid"], "guid" => $cnv["guid"],
"subject" => $cnv["subject"], "subject" => $cnv["subject"],
"created_at" => datetime_convert("UTC", "UTC", $cnv['created'], 'Y-m-d\TH:i:s\Z'), "created_at" => datetime_convert("UTC", "UTC", $cnv['created'], 'Y-m-d\TH:i:s\Z'),
"diaspora_handle" => $cnv["creator"], "participants" => $cnv["recips"]
"participant_handles" => $cnv["recips"]
); );
$body = bb2diaspora($item["body"]); $body = bb2diaspora($item["body"]);
$created = datetime_convert("UTC", "UTC", $item["created"], 'Y-m-d\TH:i:s\Z'); $created = datetime_convert("UTC", "UTC", $item["created"], 'Y-m-d\TH:i:s\Z');
$signed_text = $item["guid"].";".$cnv["guid"].";".$body.";".$created.";".$myaddr.";".$cnv['guid'];
$sig = base64_encode(rsa_sign($signed_text, $owner["uprvkey"], "sha256"));
$msg = array( $msg = array(
"author" => $myaddr,
"guid" => $item["guid"], "guid" => $item["guid"],
"parent_guid" => $cnv["guid"], "conversation_guid" => $cnv["guid"],
"parent_author_signature" => $sig,
"author_signature" => $sig,
"text" => $body, "text" => $body,
"created_at" => $created, "created_at" => $created,
"diaspora_handle" => $myaddr,
"conversation_guid" => $cnv["guid"]
); );
if ($item["reply"]) { if ($item["reply"]) {
$message = $msg; $message = $msg;
$type = "message"; $type = "message";
} else { } else {
$message = array("guid" => $cnv["guid"], $message = array(
"author" => $cnv["creator"],
"guid" => $cnv["guid"],
"subject" => $cnv["subject"], "subject" => $cnv["subject"],
"created_at" => datetime_convert("UTC", "UTC", $cnv['created'], 'Y-m-d\TH:i:s\Z'), "created_at" => datetime_convert("UTC", "UTC", $cnv['created'], 'Y-m-d\TH:i:s\Z'),
"message" => $msg, "participants" => $cnv["recips"],
"diaspora_handle" => $cnv["creator"], "message" => $msg);
"participant_handles" => $cnv["recips"]);
$type = "conversation"; $type = "conversation";
} }
@ -3734,7 +3669,7 @@ class Diaspora {
$tags = trim($tags); $tags = trim($tags);
} }
$message = array("diaspora_handle" => $handle, $message = array("author" => $handle,
"first_name" => $first, "first_name" => $first,
"last_name" => $last, "last_name" => $last,
"image_url" => $large, "image_url" => $large,
@ -3745,6 +3680,7 @@ class Diaspora {
"bio" => $about, "bio" => $about,
"location" => $location, "location" => $location,
"searchable" => $searchable, "searchable" => $searchable,
"nsfw" => "false",
"tag_string" => $tags); "tag_string" => $tags);
foreach ($recips as $recip) { foreach ($recips as $recip) {
@ -3764,7 +3700,7 @@ class Diaspora {
public static function store_like_signature($contact, $post_id) { public static function store_like_signature($contact, $post_id) {
// Is the contact the owner? Then fetch the private key // Is the contact the owner? Then fetch the private key
if (!$contact['self'] OR ($contact['uid'] == 0)) { if (!$contact['self'] || ($contact['uid'] == 0)) {
logger("No owner post, so not storing signature", LOGGER_DEBUG); logger("No owner post, so not storing signature", LOGGER_DEBUG);
return false; return false;
} }

View file

@ -47,13 +47,12 @@ function discover_poco_run(&$argv, &$argc) {
logger('start '.$search); logger('start '.$search);
if ($mode == 8) { if ($mode == 8) {
$profile_url = base64_decode($argv[2]); if ($argv[2] != "") {
if ($profile_url != "") { poco_last_updated($argv[2], true);
poco_last_updated($profile_url, true);
} }
} elseif ($mode == 7) { } elseif ($mode == 7) {
if ($argc == 6) { if ($argc == 6) {
$url = base64_decode($argv[5]); $url = $argv[5];
} else { } else {
$url = ''; $url = '';
} }
@ -63,7 +62,7 @@ function discover_poco_run(&$argv, &$argc) {
} elseif ($mode == 5) { } elseif ($mode == 5) {
update_server(); update_server();
} elseif ($mode == 4) { } elseif ($mode == 4) {
$server_url = base64_decode($argv[2]); $server_url = $argv[2];
if ($server_url == "") { if ($server_url == "") {
return; return;
} }
@ -81,12 +80,12 @@ function discover_poco_run(&$argv, &$argc) {
logger($result, LOGGER_DEBUG); logger($result, LOGGER_DEBUG);
} elseif ($mode == 3) { } elseif ($mode == 3) {
update_suggestions(); update_suggestions();
} elseif (($mode == 2) AND get_config('system','poco_completion')) { } elseif (($mode == 2) && get_config('system','poco_completion')) {
discover_users(); discover_users();
} elseif (($mode == 1) AND ($search != "") and get_config('system','poco_local_search')) { } elseif (($mode == 1) && ($search != "") && 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) && ($search == "") && (get_config('system','poco_discovery') > 0)) {
// Query Friendica and Hubzilla servers for their users // Query Friendica and Hubzilla servers for their users
poco_discover(); poco_discover();
@ -119,7 +118,7 @@ function update_server() {
} }
logger('Update server status for server '.$server["url"], LOGGER_DEBUG); logger('Update server status for server '.$server["url"], LOGGER_DEBUG);
proc_run(PRIORITY_LOW, "include/discover_poco.php", "server", base64_encode($server["url"])); proc_run(PRIORITY_LOW, "include/discover_poco.php", "server", $server["url"]);
if (++$updated > 250) { if (++$updated > 250) {
return; return;
@ -176,9 +175,9 @@ function discover_users() {
$server_url = $user["server_url"]; $server_url = $user["server_url"];
} }
if ((($server_url == "") AND ($user["network"] == NETWORK_FEED)) OR $force_update OR poco_check_server($server_url, $user["network"])) { if ((($server_url == "") && ($user["network"] == NETWORK_FEED)) || $force_update || poco_check_server($server_url, $user["network"])) {
logger('Check profile '.$user["url"]); logger('Check profile '.$user["url"]);
proc_run(PRIORITY_LOW, "include/discover_poco.php", "check_profile", base64_encode($user["url"])); proc_run(PRIORITY_LOW, "include/discover_poco.php", "check_profile", $user["url"]);
if (++$checked > 100) { if (++$checked > 100) {
return; return;
@ -216,7 +215,7 @@ function discover_directory($search) {
if (dbm::is_result($exists)) { if (dbm::is_result($exists)) {
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"]) &&
($exists[0]["updated"] < $exists[0]["last_failure"])) { ($exists[0]["updated"] < $exists[0]["last_failure"])) {
continue; continue;
} }

View file

@ -152,7 +152,7 @@ function email_get_part($mbox,$uid,$p,$partno, $subtype) {
if ($p->parameters) if ($p->parameters)
foreach ($p->parameters as $x) foreach ($p->parameters as $x)
$params[strtolower($x->attribute)] = $x->value; $params[strtolower($x->attribute)] = $x->value;
if (isset($p->dparameters) and $p->dparameters) if (isset($p->dparameters) && $p->dparameters)
foreach ($p->dparameters as $x) foreach ($p->dparameters as $x)
$params[strtolower($x->attribute)] = $x->value; $params[strtolower($x->attribute)] = $x->value;
@ -160,7 +160,7 @@ function email_get_part($mbox,$uid,$p,$partno, $subtype) {
// Any part with a filename is an attachment, // Any part with a filename is an attachment,
// so an attached text file (type 0) is not mistaken as the message. // so an attached text file (type 0) is not mistaken as the message.
if ((isset($params['filename']) and $params['filename']) || (isset($params['name']) and $params['name'])) { if ((isset($params['filename']) && $params['filename']) || (isset($params['name']) && $params['name'])) {
// filename may be given as 'Filename' or 'Name' or both // filename may be given as 'Filename' or 'Name' or both
$filename = ($params['filename'])? $params['filename'] : $params['name']; $filename = ($params['filename'])? $params['filename'] : $params['name'];
// filename may be encoded, so see imap_mime_header_decode() // filename may be encoded, so see imap_mime_header_decode()
@ -191,7 +191,7 @@ function email_get_part($mbox,$uid,$p,$partno, $subtype) {
// } // }
// SUBPART RECURSION // SUBPART RECURSION
if (isset($p->parts) and $p->parts) { if (isset($p->parts) && $p->parts) {
$x = ""; $x = "";
foreach ($p->parts as $partno0=>$p2) { foreach ($p->parts as $partno0=>$p2) {
$x .= email_get_part($mbox,$uid,$p2,$partno . '.' . ($partno0+1), $subtype); // 1.2, 1.2.1, etc. $x .= email_get_part($mbox,$uid,$p2,$partno . '.' . ($partno0+1), $subtype); // 1.2, 1.2.1, etc.

View file

@ -99,7 +99,7 @@ function notification($params) {
intval($parent_id), intval($parent_id),
intval($params['uid']) intval($params['uid'])
); );
if ($p AND count($p) AND ($p[0]["ignored"])) { if ($p && count($p) && ($p[0]["ignored"])) {
logger("Thread ".$parent_id." will be ignored", LOGGER_DEBUG); logger("Thread ".$parent_id." will be ignored", LOGGER_DEBUG);
return; return;
} }
@ -115,7 +115,7 @@ function notification($params) {
dbesc($params['link']), dbesc($params['link']),
intval($params['uid']) intval($params['uid'])
); );
if ($p and count($p)) { if ($p && count($p)) {
pop_lang(); pop_lang();
return; return;
} }
@ -515,7 +515,7 @@ function notification($params) {
logger('sending notification email'); logger('sending notification email');
if (isset($params['parent']) AND (intval($params['parent']) != 0)) { if (isset($params['parent']) && (intval($params['parent']) != 0)) {
$id_for_parent = $params['parent']."@".$hostname; $id_for_parent = $params['parent']."@".$hostname;
// Is this the first email notification for this parent item and user? // Is this the first email notification for this parent item and user?
@ -676,7 +676,7 @@ function check_item_notification($itemid, $uid, $defaulttype = "") {
// Check for invalid profile urls. 13 should be the shortest possible profile length: // Check for invalid profile urls. 13 should be the shortest possible profile length:
// http://a.bc/d // http://a.bc/d
// Additionally check for invalid urls that would return the normalised value "http:" // Additionally check for invalid urls that would return the normalised value "http:"
if ((strlen($profile) >= 13) AND (normalise_link($profile) != "http:")) { if ((strlen($profile) >= 13) && (normalise_link($profile) != "http:")) {
if (!in_array($profile, $profiles2)) if (!in_array($profile, $profiles2))
$profiles2[] = $profile; $profiles2[] = $profile;
@ -760,11 +760,11 @@ function check_item_notification($itemid, $uid, $defaulttype = "") {
$tagged = false; $tagged = false;
foreach ($profiles AS $profile) { foreach ($profiles AS $profile) {
if (strpos($item[0]["tag"], "=".$profile."]") OR strpos($item[0]["body"], "=".$profile."]")) if (strpos($item[0]["tag"], "=".$profile."]") || strpos($item[0]["body"], "=".$profile."]"))
$tagged = true; $tagged = true;
} }
if ($item[0]["mention"] OR $tagged OR ($defaulttype == NOTIFY_TAGSELF)) { if ($item[0]["mention"] || $tagged || ($defaulttype == NOTIFY_TAGSELF)) {
$params["type"] = NOTIFY_TAGSELF; $params["type"] = NOTIFY_TAGSELF;
$params["verb"] = ACTIVITY_TAG; $params["verb"] = ACTIVITY_TAG;
} }
@ -776,7 +776,7 @@ function check_item_notification($itemid, $uid, $defaulttype = "") {
LIMIT 1", LIMIT 1",
intval($item[0]["parent"]), intval($uid)); intval($item[0]["parent"]), intval($uid));
if ($parent AND !isset($params["type"])) { if ($parent && !isset($params["type"])) {
$params["type"] = NOTIFY_COMMENT; $params["type"] = NOTIFY_COMMENT;
$params["verb"] = ACTIVITY_POST; $params["verb"] = ACTIVITY_POST;
} }

View file

@ -853,18 +853,22 @@ function widget_events() {
return; return;
} }
// 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) * Cal logged in user (test permission at foreign profile page)
// So we have to test if if it's the own profile page of the logged in user * If the $owner uid is available we know it is part of one of the profile pages (like /cal)
// or a foreign one. For foreign profile pages we need to check if the feature * So we have to test if if it's the own profile page of the logged in user
// for exporting the cal is enabled (otherwise the widget would appear for logged in users * or a foreign one. For foreign profile pages we need to check if the feature
// on foreigen profile pages even if the widget is disabled) * 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)
*/
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 /*
// export feature isn't enabled * If it's a kind of profile page (intval($owner_uid)) return if the user not logged in and
* 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;
} }

View file

@ -9,33 +9,66 @@ function expire_run(&$argv, &$argc){
require_once('include/items.php'); require_once('include/items.php');
require_once('include/Contact.php'); require_once('include/Contact.php');
load_hooks();
if (($argc == 2) && ($argv[1] == 'delete')) {
logger('Delete expired items', LOGGER_DEBUG);
// 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 = dba::p("SELECT `id` FROM `item` WHERE `deleted` AND `changed` < UTC_TIMESTAMP() - INTERVAL 60 DAY"); $r = dba::p("SELECT `id` FROM `item` WHERE `deleted` AND `changed` < UTC_TIMESTAMP() - INTERVAL 60 DAY");
if (dbm::is_result($r)) {
while ($row = dba::fetch($r)) { while ($row = dba::fetch($r)) {
dba::delete('item', array('id' => $row['id'])); dba::delete('item', array('id' => $row['id']));
} }
dba::close($r); dba::close($r);
}
logger('Delete expired items - done', LOGGER_DEBUG);
// make this optional as it could have a performance impact on large sites // make this optional as it could have a performance impact on large sites
if (intval(get_config('system', 'optimize_items'))) { if (intval(get_config('system', 'optimize_items'))) {
q("OPTIMIZE TABLE `item`"); q("OPTIMIZE TABLE `item`");
} }
return;
} elseif (($argc == 2) && (intval($argv[1]) > 0)) {
$user = dba::select('user', array('uid', 'username', 'expire'), array('uid' => $argv[1]), array('limit' => 1));
if (dbm::is_result($user)) {
logger('Expire items for user '.$user['uid'].' ('.$user['username'].') - interval: '.$user['expire'], LOGGER_DEBUG);
item_expire($user['uid'], $user['expire']);
logger('Expire items for user '.$user['uid'].' ('.$user['username'].') - done ', LOGGER_DEBUG);
}
return;
} elseif (($argc == 3) && ($argv[1] == 'hook') && is_array($a->hooks) && array_key_exists("expire", $a->hooks)) {
foreach ($a->hooks["expire"] as $hook) {
if ($hook[1] == $argv[2]) {
logger("Calling expire hook '" . $hook[1] . "'", LOGGER_DEBUG);
call_single_hook($a, $name, $hook, $data);
}
}
return;
}
logger('expire: start'); logger('expire: start');
$r = q("SELECT `uid`, `username`, `expire` FROM `user` WHERE `expire` != 0"); proc_run(array('priority' => $a->queue['priority'], 'created' => $a->queue['created'], 'dont_fork' => true),
if (dbm::is_result($r)) { 'include/expire.php', 'delete');
foreach ($r as $rr) {
logger('Expire: ' . $rr['username'] . ' interval: ' . $rr['expire'], LOGGER_DEBUG); $r = dba::p("SELECT `uid`, `username` FROM `user` WHERE `expire` != 0");
item_expire($rr['uid'], $rr['expire']); while ($row = dba::fetch($r)) {
logger('Calling expiry for user '.$row['uid'].' ('.$row['username'].')', LOGGER_DEBUG);
proc_run(array('priority' => $a->queue['priority'], 'created' => $a->queue['created'], 'dont_fork' => true),
'include/expire.php', (int)$row['uid']);
}
dba::close($r);
logger('expire: calling hooks');
if (is_array($a->hooks) && array_key_exists('expire', $a->hooks)) {
foreach ($a->hooks['expire'] as $hook) {
logger("Calling expire hook for '" . $hook[1] . "'", LOGGER_DEBUG);
proc_run(array('priority' => $a->queue['priority'], 'created' => $a->queue['created'], 'dont_fork' => true),
'include/expire.php', 'hook', $hook[1]);
} }
} }
load_hooks(); logger('expire: end');
call_hooks('expire');
return; return;
} }

View file

@ -30,10 +30,10 @@ function update_contact($id) {
// make sure to not overwrite existing values with blank entries // make sure to not overwrite existing values with blank entries
foreach ($ret AS $key => $val) { foreach ($ret AS $key => $val) {
if (isset($r[0][$key]) AND ($r[0][$key] != "") AND ($val == "")) if (isset($r[0][$key]) && ($r[0][$key] != "") && ($val == ""))
$ret[$key] = $r[0][$key]; $ret[$key] = $r[0][$key];
if (isset($r[0][$key]) AND ($ret[$key] != $r[0][$key])) if (isset($r[0][$key]) && ($ret[$key] != $r[0][$key]))
$update = true; $update = true;
} }

View file

@ -10,7 +10,7 @@ function gprobe_run(&$argv, &$argc){
if ($argc != 2) { if ($argc != 2) {
return; return;
} }
$url = hex2bin($argv[1]); $url = $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",
dbesc(normalise_link($url)) dbesc(normalise_link($url))
@ -47,7 +47,7 @@ function gprobe_run(&$argv, &$argc){
} }
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
// Check for accessibility and do a poco discovery // Check for accessibility and do a poco discovery
if (poco_last_updated($r[0]['url'], true) AND ($r[0]["network"] == NETWORK_DFRN)) if (poco_last_updated($r[0]['url'], true) && ($r[0]["network"] == NETWORK_DFRN))
poco_load(0,0,$r[0]['id'], str_replace('/profile/','/poco/',$r[0]['url'])); poco_load(0,0,$r[0]['id'], str_replace('/profile/','/poco/',$r[0]['url']));
} }

View file

@ -320,7 +320,7 @@ function expand_groups($a,$check_dead = false, $use_gcontact = false) {
if (dbm::is_result($r)) if (dbm::is_result($r))
foreach ($r as $rr) foreach ($r as $rr)
$ret[] = $rr['contact-id']; $ret[] = $rr['contact-id'];
if ($check_dead AND !$use_gcontact) { if ($check_dead && !$use_gcontact) {
require_once('include/acl_selectors.php'); require_once('include/acl_selectors.php');
$ret = prune_deadguys($ret); $ret = prune_deadguys($ret);
} }

View file

@ -44,7 +44,7 @@ function node2bbcodesub(&$doc, $oldnode, $attributes, $startbb, $endbb)
if (strpos('*'.$startbb, '$1') > 0) { if (strpos('*'.$startbb, '$1') > 0) {
if ($replace and (@$attr[$attribute] != '')) { if ($replace && (@$attr[$attribute] != '')) {
$startbb = preg_replace($value, $startbb, $attr[$attribute], -1, $count); $startbb = preg_replace($value, $startbb, $attr[$attribute], -1, $count);

View file

@ -23,7 +23,7 @@ function breaklines($line, $level, $wraplength = 75)
if ($pos == 0) if ($pos == 0)
$pos = strpos($line, ' '); $pos = strpos($line, ' ');
if (($pos > 0) and strlen($line) > $wraplen) { if (($pos > 0) && strlen($line) > $wraplen) {
$newline = trim(substr($line, 0, $pos)); $newline = trim(substr($line, 0, $pos));
if ($level > 0) if ($level > 0)
$newline = str_repeat(">", $level).' '.$newline; $newline = str_repeat(">", $level).' '.$newline;
@ -32,7 +32,7 @@ function breaklines($line, $level, $wraplength = 75)
$line = substr($line, $pos+1); $line = substr($line, $pos+1);
} }
} while ((strlen($line) > $wraplen) and !($oldline == $line)); } while ((strlen($line) > $wraplen) && !($oldline == $line));
if ($level > 0) if ($level > 0)
$line = str_repeat(">", $level).' '.$line; $line = str_repeat(">", $level).' '.$line;
@ -70,7 +70,7 @@ function quotelevel($message, $wraplength = 75)
$line = substr($line, 0, $pos).substr($line, $pos+8); $line = substr($line, 0, $pos).substr($line, $pos+8);
} }
if (!$startquote or ($line != '')) if (!$startquote || ($line != ''))
$newlines[] = breaklines($line, $currlevel, $wraplength); $newlines[] = breaklines($line, $currlevel, $wraplength);
} }
return(implode($newlines, "\n")); return(implode($newlines, "\n"));
@ -92,13 +92,13 @@ function collecturls($message) {
if (strpos($treffer[1], $listitem) !== false) if (strpos($treffer[1], $listitem) !== false)
$ignore = true; $ignore = true;
if ((strpos($treffer[1], "//twitter.com/") !== false) and (strpos($treffer[1], "/status/") !== false)) if ((strpos($treffer[1], "//twitter.com/") !== false) && (strpos($treffer[1], "/status/") !== false))
$ignore = false; $ignore = false;
if ((strpos($treffer[1], "//plus.google.com/") !== false) and (strpos($treffer[1], "/posts") !== false)) if ((strpos($treffer[1], "//plus.google.com/") !== false) && (strpos($treffer[1], "/posts") !== false))
$ignore = false; $ignore = false;
if ((strpos($treffer[1], "//plus.google.com/") !== false) and (strpos($treffer[1], "/photos") !== false)) if ((strpos($treffer[1], "//plus.google.com/") !== false) && (strpos($treffer[1], "/photos") !== false))
$ignore = false; $ignore = false;
if (!$ignore) if (!$ignore)
@ -212,7 +212,7 @@ function html2plain($html, $wraplength = 75, $compact = false)
$message = html_entity_decode($message, ENT_QUOTES, 'UTF-8'); $message = html_entity_decode($message, ENT_QUOTES, 'UTF-8');
if (!$compact AND ($message != "")) { if (!$compact && ($message != "")) {
$counter = 1; $counter = 1;
foreach ($urls as $id=>$url) foreach ($urls as $id=>$url)
if ($url != "") if ($url != "")

View file

@ -217,7 +217,7 @@ function profile_sidebar($profile, $block = 0) {
$profile['picdate'] = urlencode($profile['picdate']); $profile['picdate'] = urlencode($profile['picdate']);
if (($profile['network'] != "") AND ($profile['network'] != NETWORK_DFRN)) { if (($profile['network'] != "") && ($profile['network'] != NETWORK_DFRN)) {
$profile['network_name'] = format_network_name($profile['network'], $profile['url']); $profile['network_name'] = format_network_name($profile['network'], $profile['url']);
} else { } else {
$profile['network_name'] = ""; $profile['network_name'] = "";
@ -240,7 +240,7 @@ function profile_sidebar($profile, $block = 0) {
} }
// Is the local user already connected to that user? // Is the local user already connected to that user?
if ($connect AND local_user()) { if ($connect && local_user()) {
if (isset($profile["url"])) { if (isset($profile["url"])) {
$profile_url = normalise_link($profile["url"]); $profile_url = normalise_link($profile["url"]);
} else { } else {
@ -254,19 +254,19 @@ function profile_sidebar($profile, $block = 0) {
$connect = false; $connect = false;
} }
if ($connect AND ($profile['network'] != NETWORK_DFRN) AND !isset($profile['remoteconnect'])) if ($connect && ($profile['network'] != NETWORK_DFRN) && !isset($profile['remoteconnect']))
$connect = false; $connect = false;
$remoteconnect = NULL; $remoteconnect = NULL;
if (isset($profile['remoteconnect'])) if (isset($profile['remoteconnect']))
$remoteconnect = $profile['remoteconnect']; $remoteconnect = $profile['remoteconnect'];
if ($connect AND ($profile['network'] == NETWORK_DFRN) AND !isset($remoteconnect)) if ($connect && ($profile['network'] == NETWORK_DFRN) && !isset($remoteconnect))
$subscribe_feed = t("Atom feed"); $subscribe_feed = t("Atom feed");
else else
$subscribe_feed = false; $subscribe_feed = false;
if (remote_user() OR (get_my_url() && $profile['unkmail'] && ($profile['uid'] != local_user()))) { if (remote_user() || (get_my_url() && $profile['unkmail'] && ($profile['uid'] != local_user()))) {
$wallmessage = t('Message'); $wallmessage = t('Message');
$wallmessage_link = "wallmessage/".$profile["nickname"]; $wallmessage_link = "wallmessage/".$profile["nickname"];
@ -379,7 +379,7 @@ function profile_sidebar($profile, $block = 0) {
if (!$block) { if (!$block) {
$contact_block = contact_block(); $contact_block = contact_block();
if (is_array($a->profile) AND !$a->profile['hide-friends']) { if (is_array($a->profile) && !$a->profile['hide-friends']) {
$r = q("SELECT `gcontact`.`updated` FROM `contact` INNER JOIN `gcontact` WHERE `gcontact`.`nurl` = `contact`.`nurl` AND `self` AND `uid` = %d LIMIT 1", $r = q("SELECT `gcontact`.`updated` FROM `contact` INNER JOIN `gcontact` WHERE `gcontact`.`nurl` = `contact`.`nurl` AND `self` AND `uid` = %d LIMIT 1",
intval($a->profile['uid'])); intval($a->profile['uid']));
if (dbm::is_result($r)) if (dbm::is_result($r))
@ -656,8 +656,10 @@ function advanced_profile(App $a) {
$profile['birthday'] = array( t('Birthday:'), $val); $profile['birthday'] = array( t('Birthday:'), $val);
} }
if (!empty($a->profile['dob'])
if ($age = age($a->profile['dob'],$a->profile['timezone'],'')) { && $a->profile['dob'] > '0001-01-01'
&& $age = age($a->profile['dob'], $a->profile['timezone'], '')
) {
$profile['age'] = array( t('Age:'), $age ); $profile['age'] = array( t('Age:'), $age );
} }
@ -888,7 +890,7 @@ function zrl_init(App $a) {
return; return;
} }
proc_run(PRIORITY_LOW, 'include/gprobe.php', bin2hex($tmp_str)); proc_run(PRIORITY_LOW, 'include/gprobe.php', $tmp_str);
$arr = array('zrl' => $tmp_str, 'url' => $a->cmd); $arr = array('zrl' => $tmp_str, 'url' => $a->cmd);
call_hooks('zrl_init', $arr); call_hooks('zrl_init', $arr);
} }

View file

@ -6,6 +6,7 @@
use Friendica\App; use Friendica\App;
use Friendica\ParseUrl; use Friendica\ParseUrl;
use Friendica\Util\Lock;
require_once 'include/bbcode.php'; require_once 'include/bbcode.php';
require_once 'include/oembed.php'; require_once 'include/oembed.php';
@ -143,7 +144,7 @@ function title_is_body($title, $body) {
$body = substr($body, 0, strlen($title)); $body = substr($body, 0, strlen($title));
} }
if (($title != $body) and (substr($title, -3) == "...")) { if (($title != $body) && (substr($title, -3) == "...")) {
$pos = strrpos($title, "..."); $pos = strrpos($title, "...");
if ($pos > 0) { if ($pos > 0) {
$title = substr($title, 0, $pos); $title = substr($title, 0, $pos);
@ -159,16 +160,16 @@ function add_page_info_data($data) {
// It maybe is a rich content, but if it does have everything that a link has, // It maybe is a rich content, but if it does have everything that a link has,
// then treat it that way // then treat it that way
if (($data["type"] == "rich") AND is_string($data["title"]) AND if (($data["type"] == "rich") && is_string($data["title"]) &&
is_string($data["text"]) AND (sizeof($data["images"]) > 0)) { is_string($data["text"]) && (sizeof($data["images"]) > 0)) {
$data["type"] = "link"; $data["type"] = "link";
} }
if ((($data["type"] != "link") AND ($data["type"] != "video") AND ($data["type"] != "photo")) OR ($data["title"] == $data["url"])) { if ((($data["type"] != "link") && ($data["type"] != "video") && ($data["type"] != "photo")) || ($data["title"] == $data["url"])) {
return ""; return "";
} }
if ($no_photos AND ($data["type"] == "photo")) { if ($no_photos && ($data["type"] == "photo")) {
return ""; return "";
} }
@ -204,7 +205,7 @@ function add_page_info_data($data) {
$preview = str_replace(array("[", "]"), array("&#91;", "&#93;"), htmlentities($data["images"][0]["src"], ENT_QUOTES, 'UTF-8', false)); $preview = str_replace(array("[", "]"), array("&#91;", "&#93;"), htmlentities($data["images"][0]["src"], ENT_QUOTES, 'UTF-8', false));
// if the preview picture is larger than 500 pixels then show it in a larger mode // if the preview picture is larger than 500 pixels then show it in a larger mode
// But only, if the picture isn't higher than large (To prevent huge posts) // But only, if the picture isn't higher than large (To prevent huge posts)
if (($data["images"][0]["width"] >= 500) AND ($data["images"][0]["width"] >= $data["images"][0]["height"])) { if (($data["images"][0]["width"] >= 500) && ($data["images"][0]["width"] >= $data["images"][0]["height"])) {
$text .= " image='".$preview."'"; $text .= " image='".$preview."'";
} else { } else {
$text .= " preview='".$preview."'"; $text .= " preview='".$preview."'";
@ -214,7 +215,7 @@ function add_page_info_data($data) {
$text .= "]".$data["text"]."[/attachment]"; $text .= "]".$data["text"]."[/attachment]";
$hashtags = ""; $hashtags = "";
if (isset($data["keywords"]) AND count($data["keywords"])) { if (isset($data["keywords"]) && count($data["keywords"])) {
$hashtags = "\n"; $hashtags = "\n";
foreach ($data["keywords"] AS $keyword) { foreach ($data["keywords"] AS $keyword) {
/// @todo make a positive list of allowed characters /// @todo make a positive list of allowed characters
@ -237,11 +238,11 @@ function query_page_info($url, $no_photos = false, $photo = "", $keywords = fals
logger('fetch page info for ' . $url . ' ' . print_r($data, true), LOGGER_DEBUG); logger('fetch page info for ' . $url . ' ' . print_r($data, true), LOGGER_DEBUG);
if (!$keywords AND isset($data["keywords"])) { if (!$keywords && isset($data["keywords"])) {
unset($data["keywords"]); unset($data["keywords"]);
} }
if (($keyword_blacklist != "") AND isset($data["keywords"])) { if (($keyword_blacklist != "") && isset($data["keywords"])) {
$list = explode(", ", $keyword_blacklist); $list = explode(", ", $keyword_blacklist);
foreach ($list AS $keyword) { foreach ($list AS $keyword) {
$keyword = trim($keyword); $keyword = trim($keyword);
@ -259,7 +260,7 @@ function add_page_keywords($url, $no_photos = false, $photo = "", $keywords = fa
$data = query_page_info($url, $no_photos, $photo, $keywords, $keyword_blacklist); $data = query_page_info($url, $no_photos, $photo, $keywords, $keyword_blacklist);
$tags = ""; $tags = "";
if (isset($data["keywords"]) AND count($data["keywords"])) { if (isset($data["keywords"]) && count($data["keywords"])) {
foreach ($data["keywords"] AS $keyword) { foreach ($data["keywords"] AS $keyword) {
$hashtag = str_replace(array(" ", "+", "/", ".", "#", "'"), $hashtag = str_replace(array(" ", "+", "/", ".", "#", "'"),
array("", "", "", "", "", ""), $keyword); array("", "", "", "", "", ""), $keyword);
@ -301,7 +302,7 @@ function add_page_info_to_body($body, $texturl = false, $no_photos = false) {
} }
// Convert urls without bbcode elements // Convert urls without bbcode elements
if (!$matches AND $texturl) { if (!$matches && $texturl) {
preg_match("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", " ".$body, $matches); preg_match("/([^\]\='".'"'."]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/ism", " ".$body, $matches);
// Yeah, a hack. I really hate regular expressions :) // Yeah, a hack. I really hate regular expressions :)
@ -315,21 +316,21 @@ function add_page_info_to_body($body, $texturl = false, $no_photos = false) {
} }
// Remove the link from the body if the link is attached at the end of the post // Remove the link from the body if the link is attached at the end of the post
if (isset($footer) AND (trim($footer) != "") AND (strpos($footer, $matches[1]))) { if (isset($footer) && (trim($footer) != "") && (strpos($footer, $matches[1]))) {
$removedlink = trim(str_replace($matches[1], "", $body)); $removedlink = trim(str_replace($matches[1], "", $body));
if (($removedlink == "") OR strstr($body, $removedlink)) { if (($removedlink == "") || strstr($body, $removedlink)) {
$body = $removedlink; $body = $removedlink;
} }
$url = str_replace(array('/', '.'), array('\/', '\.'), $matches[1]); $url = str_replace(array('/', '.'), array('\/', '\.'), $matches[1]);
$removedlink = preg_replace("/\[url\=" . $url . "\](.*?)\[\/url\]/ism", '', $body); $removedlink = preg_replace("/\[url\=" . $url . "\](.*?)\[\/url\]/ism", '', $body);
if (($removedlink == "") OR strstr($body, $removedlink)) { if (($removedlink == "") || strstr($body, $removedlink)) {
$body = $removedlink; $body = $removedlink;
} }
} }
// Add the page information to the bottom // Add the page information to the bottom
if (isset($footer) AND (trim($footer) != "")) { if (isset($footer) && (trim($footer) != "")) {
$body .= $footer; $body .= $footer;
} }
@ -421,10 +422,10 @@ function store_conversation($arr) {
if (in_array($arr['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) { if (in_array($arr['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) {
$conversation = array('item-uri' => $arr['uri'], 'received' => dbm::date()); $conversation = array('item-uri' => $arr['uri'], 'received' => dbm::date());
if (isset($arr['parent-uri']) AND ($arr['parent-uri'] != $arr['uri'])) { if (isset($arr['parent-uri']) && ($arr['parent-uri'] != $arr['uri'])) {
$conversation['reply-to-uri'] = $arr['parent-uri']; $conversation['reply-to-uri'] = $arr['parent-uri'];
} }
if (isset($arr['thr-parent']) AND ($arr['thr-parent'] != $arr['uri'])) { if (isset($arr['thr-parent']) && ($arr['thr-parent'] != $arr['uri'])) {
$conversation['reply-to-uri'] = $arr['thr-parent']; $conversation['reply-to-uri'] = $arr['thr-parent'];
} }
@ -444,6 +445,15 @@ function store_conversation($arr) {
$conversation['source'] = $arr['source']; $conversation['source'] = $arr['source'];
} }
if (!Lock::set('store_conversation')) {
// When using semaphores, this case never can't happen
unset($arr['conversation-uri']);
unset($arr['conversation-href']);
unset($arr['protocol']);
unset($arr['source']);
return $arr;
}
$old_conv = dba::fetch_first("SELECT `item-uri`, `reply-to-uri`, `conversation-uri`, `conversation-href`, `protocol`, `source` $old_conv = dba::fetch_first("SELECT `item-uri`, `reply-to-uri`, `conversation-uri`, `conversation-href`, `protocol`, `source`
FROM `conversation` WHERE `item-uri` = ?", $conversation['item-uri']); FROM `conversation` WHERE `item-uri` = ?", $conversation['item-uri']);
if (dbm::is_result($old_conv)) { if (dbm::is_result($old_conv)) {
@ -453,7 +463,7 @@ function store_conversation($arr) {
unset($old_conv['source']); unset($old_conv['source']);
} }
// Update structure data all the time but the source only when its from a better protocol. // Update structure data all the time but the source only when its from a better protocol.
if (($old_conv['protocol'] < $conversation['protocol']) AND ($old_conv['protocol'] != 0)) { if (($old_conv['protocol'] < $conversation['protocol']) && ($old_conv['protocol'] != 0)) {
unset($conversation['protocol']); unset($conversation['protocol']);
unset($conversation['source']); unset($conversation['source']);
} }
@ -465,6 +475,7 @@ function store_conversation($arr) {
logger('Conversation: insert for '.$conversation['item-uri'].' (protocol '.$conversation['protocol'].') failed', LOGGER_DEBUG); logger('Conversation: insert for '.$conversation['item-uri'].' (protocol '.$conversation['protocol'].') failed', LOGGER_DEBUG);
} }
} }
Lock::remove('store_conversation');
} }
unset($arr['conversation-uri']); unset($arr['conversation-uri']);
@ -503,9 +514,9 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
if ($notify) { if ($notify) {
$guid_prefix = ""; $guid_prefix = "";
} elseif ((trim($arr['guid']) == "") AND (trim($arr['plink']) != "")) { } elseif ((trim($arr['guid']) == "") && (trim($arr['plink']) != "")) {
$arr['guid'] = uri_to_guid($arr['plink']); $arr['guid'] = uri_to_guid($arr['plink']);
} elseif ((trim($arr['guid']) == "") AND (trim($arr['uri']) != "")) { } elseif ((trim($arr['guid']) == "") && (trim($arr['uri']) != "")) {
$arr['guid'] = uri_to_guid($arr['uri']); $arr['guid'] = uri_to_guid($arr['uri']);
} else { } else {
$parsed = parse_url($arr["author-link"]); $parsed = parse_url($arr["author-link"]);
@ -653,7 +664,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
$arr['edited'] = datetime_convert(); $arr['edited'] = datetime_convert();
} }
if (($arr['author-link'] == "") AND ($arr['owner-link'] == "")) { if (($arr['author-link'] == "") && ($arr['owner-link'] == "")) {
logger("Both author-link and owner-link are empty. Called by: " . App::callstack(), LOGGER_DEBUG); logger("Both author-link and owner-link are empty. Called by: " . App::callstack(), LOGGER_DEBUG);
} }
@ -832,7 +843,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
$a = get_app(); $a = get_app();
$self = normalise_link(App::get_baseurl() . '/profile/' . $u[0]['nickname']); $self = normalise_link(App::get_baseurl() . '/profile/' . $u[0]['nickname']);
logger("item_store: 'myself' is ".$self." for parent ".$parent_id." checking against ".$arr['author-link']." and ".$arr['owner-link'], LOGGER_DEBUG); logger("item_store: 'myself' is ".$self." for parent ".$parent_id." checking against ".$arr['author-link']." and ".$arr['owner-link'], LOGGER_DEBUG);
if ((normalise_link($arr['author-link']) == $self) OR (normalise_link($arr['owner-link']) == $self)) { if ((normalise_link($arr['author-link']) == $self) || (normalise_link($arr['owner-link']) == $self)) {
q("UPDATE `thread` SET `mention` = 1 WHERE `iid` = %d", intval($parent_id)); q("UPDATE `thread` SET `mention` = 1 WHERE `iid` = %d", intval($parent_id));
logger("item_store: tagged thread ".$parent_id." as mention for user ".$self, LOGGER_DEBUG); logger("item_store: tagged thread ".$parent_id." as mention for user ".$self, LOGGER_DEBUG);
} }
@ -1051,7 +1062,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
// update the commented timestamp on the parent // update the commented timestamp on the parent
// Only update "commented" if it is really a comment // Only update "commented" if it is really a comment
if (($arr['verb'] == ACTIVITY_POST) OR !get_config("system", "like_no_comment")) { if (($arr['verb'] == ACTIVITY_POST) || !get_config("system", "like_no_comment")) {
q("UPDATE `item` SET `commented` = '%s', `changed` = '%s' WHERE `id` = %d", q("UPDATE `item` SET `commented` = '%s', `changed` = '%s' WHERE `id` = %d",
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc(datetime_convert()), dbesc(datetime_convert()),
@ -1089,7 +1100,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
* current post can be deleted if is for a community page and no mention are * current post can be deleted if is for a community page and no mention are
* in it. * in it.
*/ */
if (!$deleted AND !$dontcache) { if (!$deleted && !$dontcache) {
$r = q('SELECT * FROM `item` WHERE `id` = %d', intval($current_post)); $r = q('SELECT * FROM `item` WHERE `id` = %d', intval($current_post));
if ((dbm::is_result($r)) && (count($r) == 1)) { if ((dbm::is_result($r)) && (count($r) == 1)) {
@ -1139,7 +1150,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
check_item_notification($current_post, $uid); check_item_notification($current_post, $uid);
if ($notify) { if ($notify) {
proc_run(PRIORITY_HIGH, "include/notifier.php", $notify_type, $current_post); proc_run(array('priority' => PRIORITY_HIGH, 'dont_fork' => true), "include/notifier.php", $notify_type, $current_post);
} }
return $current_post; return $current_post;
@ -1156,10 +1167,10 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
*/ */
function item_set_last_item($arr) { function item_set_last_item($arr) {
$update = (!$arr['private'] AND (($arr["author-link"] === $arr["owner-link"]) OR ($arr["parent-uri"] === $arr["uri"]))); $update = (!$arr['private'] && (($arr["author-link"] === $arr["owner-link"]) || ($arr["parent-uri"] === $arr["uri"])));
// Is it a forum? Then we don't care about the rules from above // Is it a forum? Then we don't care about the rules from above
if (!$update AND ($arr["network"] == NETWORK_DFRN) AND ($arr["parent-uri"] === $arr["uri"])) { if (!$update && ($arr["network"] == NETWORK_DFRN) && ($arr["parent-uri"] === $arr["uri"])) {
$isforum = q("SELECT `forum` FROM `contact` WHERE `id` = %d AND `forum`", $isforum = q("SELECT `forum` FROM `contact` WHERE `id` = %d AND `forum`",
intval($arr['contact-id'])); intval($arr['contact-id']));
if (dbm::is_result($isforum)) { if (dbm::is_result($isforum)) {
@ -1282,7 +1293,7 @@ function get_item_id($guid, $uid = 0) {
// Does the given user have this item? // Does the given user have this item?
if ($uid) { if ($uid) {
$r = q("SELECT `item`.`id`, `user`.`nickname` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid` $r = q("SELECT `item`.`id`, `user`.`nickname` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid`
WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 and `item`.`moderated` = 0 WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 AND `item`.`moderated` = 0
AND `item`.`guid` = '%s' AND `item`.`uid` = %d", dbesc($guid), intval($uid)); AND `item`.`guid` = '%s' AND `item`.`uid` = %d", dbesc($guid), intval($uid));
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
$id = $r[0]["id"]; $id = $r[0]["id"];
@ -1293,7 +1304,7 @@ function get_item_id($guid, $uid = 0) {
// Or is it anywhere on the server? // Or is it anywhere on the server?
if ($nick == "") { if ($nick == "") {
$r = q("SELECT `item`.`id`, `user`.`nickname` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid` $r = q("SELECT `item`.`id`, `user`.`nickname` FROM `item` INNER JOIN `user` ON `user`.`uid` = `item`.`uid`
WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 and `item`.`moderated` = 0 WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 AND `item`.`moderated` = 0
AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = '' AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = '' AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = ''
AND `item`.`private` = 0 AND `item`.`wall` = 1 AND `item`.`private` = 0 AND `item`.`wall` = 1
@ -1430,7 +1441,7 @@ function tag_deliver($uid, $item_id) {
); );
update_thread($item_id); update_thread($item_id);
proc_run(PRIORITY_HIGH,'include/notifier.php', 'tgroup', $item_id); proc_run(array('priority' => PRIORITY_HIGH, 'dont_fork' => true), 'include/notifier.php', 'tgroup', $item_id);
} }
@ -1600,7 +1611,7 @@ function item_is_remote_self($contact, &$datarray) {
return false; return false;
} }
if (($contact['network'] != NETWORK_FEED) AND $datarray['private']) { if (($contact['network'] != NETWORK_FEED) && $datarray['private']) {
return false; return false;
} }
@ -1701,7 +1712,7 @@ function new_follower($importer, $contact, $datarray, $item, $sharing = false) {
intval($importer['uid']) intval($importer['uid'])
); );
if (dbm::is_result($r) AND !in_array($r[0]['page-flags'], array(PAGE_SOAPBOX, PAGE_FREELOVE))) { if (dbm::is_result($r) && !in_array($r[0]['page-flags'], array(PAGE_SOAPBOX, PAGE_FREELOVE))) {
// create notification // create notification
$hash = random_string(); $hash = random_string();
@ -1741,7 +1752,7 @@ function new_follower($importer, $contact, $datarray, $item, $sharing = false) {
)); ));
} }
} elseif (dbm::is_result($r) AND in_array($r[0]['page-flags'], array(PAGE_SOAPBOX, PAGE_FREELOVE))) { } elseif (dbm::is_result($r) && in_array($r[0]['page-flags'], array(PAGE_SOAPBOX, PAGE_FREELOVE))) {
$r = q("UPDATE `contact` SET `pending` = 0 WHERE `uid` = %d AND `url` = '%s' AND `pending` LIMIT 1", $r = q("UPDATE `contact` SET `pending` = 0 WHERE `uid` = %d AND `url` = '%s' AND `pending` LIMIT 1",
intval($importer['uid']), intval($importer['uid']),
dbesc($url) dbesc($url)
@ -1803,7 +1814,7 @@ function subscribe_to_hub($url, $importer, $contact, $hubmode = 'subscribe') {
logger('subscribe_to_hub: ' . $hubmode . ' ' . $contact['name'] . ' to hub ' . $url . ' endpoint: ' . $push_url . ' with verifier ' . $verify_token); logger('subscribe_to_hub: ' . $hubmode . ' ' . $contact['name'] . ' to hub ' . $url . ' endpoint: ' . $push_url . ' with verifier ' . $verify_token);
if (!strlen($contact['hub-verify']) OR ($contact['hub-verify'] != $verify_token)) { if (!strlen($contact['hub-verify']) || ($contact['hub-verify'] != $verify_token)) {
$r = q("UPDATE `contact` SET `hub-verify` = '%s' WHERE `id` = %d", $r = q("UPDATE `contact` SET `hub-verify` = '%s' WHERE `id` = %d",
dbesc($verify_token), dbesc($verify_token),
intval($contact['id']) intval($contact['id'])
@ -2051,7 +2062,7 @@ function item_expire($uid, $days, $network = "", $force = false) {
$expire_photos = get_pconfig($uid, 'expire', 'photos'); $expire_photos = get_pconfig($uid, 'expire', 'photos');
$expire_photos = (($expire_photos === false) ? 0 : intval($expire_photos)); // default if not set: 0 $expire_photos = (($expire_photos === false) ? 0 : intval($expire_photos)); // default if not set: 0
logger('expire: # items=' . count($r). "; expire items: $expire_items, expire notes: $expire_notes, expire starred: $expire_starred, expire photos: $expire_photos"); logger('User '.$uid.': expire: # items=' . count($r). "; expire items: $expire_items, expire notes: $expire_notes, expire starred: $expire_starred, expire photos: $expire_photos");
foreach ($r as $item) { foreach ($r as $item) {
@ -2076,7 +2087,7 @@ function item_expire($uid, $days, $network = "", $force = false) {
drop_item($item['id'], false); drop_item($item['id'], false);
} }
proc_run(PRIORITY_LOW, "include/notifier.php", "expire", $uid); proc_run(array('priority' => PRIORITY_LOW, 'dont_fork' => true), "include/notifier.php", "expire", $uid);
} }
@ -2099,7 +2110,7 @@ function drop_items($items) {
// multiple threads may have been deleted, send an expire notification // multiple threads may have been deleted, send an expire notification
if ($uid) { if ($uid) {
proc_run(PRIORITY_LOW, "include/notifier.php", "expire", $uid); proc_run(array('priority' => PRIORITY_LOW, 'dont_fork' => true), "include/notifier.php", "expire", $uid);
} }
} }
@ -2124,6 +2135,10 @@ function drop_item($id, $interactive = true) {
$item = $r[0]; $item = $r[0];
if ($item['deleted']) {
return 0;
}
$owner = $item['uid']; $owner = $item['uid'];
$contact_id = 0; $contact_id = 0;
@ -2295,7 +2310,7 @@ function drop_item($id, $interactive = true) {
$drop_id = intval($item['id']); $drop_id = intval($item['id']);
$priority = ($interactive ? PRIORITY_HIGH : PRIORITY_LOW); $priority = ($interactive ? PRIORITY_HIGH : PRIORITY_LOW);
proc_run($priority, "include/notifier.php", "drop", $drop_id); proc_run(array('priority' => $priority, 'dont_fork' => true), "include/notifier.php", "drop", $drop_id);
if (! $interactive) { if (! $interactive) {
return $owner; return $owner;
@ -2313,7 +2328,7 @@ function drop_item($id, $interactive = true) {
} }
/// @todo: This query seems to be really slow
function first_post_date($uid, $wall = false) { function first_post_date($uid, $wall = false) {
$r = q("SELECT `id`, `created` FROM `item` $r = q("SELECT `id`, `created` FROM `item`
WHERE `uid` = %d AND `wall` = %d AND `deleted` = 0 AND `visible` = 1 AND `moderated` = 0 WHERE `uid` = %d AND `wall` = %d AND `deleted` = 0 AND `visible` = 1 AND `moderated` = 0

View file

@ -1,80 +0,0 @@
<?php
// Provide some ability to lock a PHP function so that multiple processes
// can't run the function concurrently
if (! function_exists('lock_function')) {
function lock_function($fn_name, $block = true, $wait_sec = 2, $timeout = 30) {
if ( $wait_sec == 0 )
$wait_sec = 2; // don't let the user pick a value that's likely to crash the system
$got_lock = false;
$start = time();
do {
q("LOCK TABLE `locks` WRITE");
$r = q("SELECT `locked`, `created` FROM `locks` WHERE `name` = '%s' LIMIT 1",
dbesc($fn_name)
);
if ((dbm::is_result($r)) AND (!$r[0]['locked'] OR (strtotime($r[0]['created']) < time() - 3600))) {
q("UPDATE `locks` SET `locked` = 1, `created` = '%s' WHERE `name` = '%s'",
dbesc(datetime_convert()),
dbesc($fn_name)
);
$got_lock = true;
}
elseif (! dbm::is_result($r)) {
/// @TODO the Boolean value for count($r) should be equivalent to the Boolean value of $r
q("INSERT INTO `locks` (`name`, `created`, `locked`) VALUES ('%s', '%s', 1)",
dbesc($fn_name),
dbesc(datetime_convert())
);
$got_lock = true;
}
q("UNLOCK TABLES");
if (($block) && (! $got_lock))
sleep($wait_sec);
} while (($block) && (! $got_lock) && ((time() - $start) < $timeout));
logger('lock_function: function ' . $fn_name . ' with blocking = ' . $block . ' got_lock = ' . $got_lock . ' time = ' . (time() - $start), LOGGER_DEBUG);
return $got_lock;
}}
if (! function_exists('block_on_function_lock')) {
function block_on_function_lock($fn_name, $wait_sec = 2, $timeout = 30) {
if ( $wait_sec == 0 )
$wait_sec = 2; // don't let the user pick a value that's likely to crash the system
$start = time();
do {
$r = q("SELECT locked FROM locks WHERE name = '%s' LIMIT 1",
dbesc($fn_name)
);
if (dbm::is_result($r) && $r[0]['locked']) {
sleep($wait_sec);
}
} while (dbm::is_result($r) && $r[0]['locked'] && ((time() - $start) < $timeout));
return;
}}
if (! function_exists('unlock_function')) {
function unlock_function($fn_name) {
$r = q("UPDATE `locks` SET `locked` = 0, `created` = '%s' WHERE `name` = '%s'",
dbesc(NULL_DATE),
dbesc($fn_name)
);
logger('unlock_function: released lock for function ' . $fn_name, LOGGER_DEBUG);
return;
}}

View file

@ -108,7 +108,7 @@ function send_message($recipient=0, $body='', $subject='', $replyto=''){
); );
$r = q("SELECT * FROM `mail` WHERE `uri` = '%s' and `uid` = %d LIMIT 1", $r = q("SELECT * FROM `mail` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($uri), dbesc($uri),
intval(local_user()) intval(local_user())
); );

View file

@ -124,7 +124,7 @@ function removesig($message)
// Sollte sich der Signaturtrenner innerhalb eines Quotes befinden // Sollte sich der Signaturtrenner innerhalb eines Quotes befinden
// wird keine Signaturtrennung ausgefuehrt // wird keine Signaturtrennung ausgefuehrt
if (($sigpos < $quotepos) and ($sigpos != 0)) if (($sigpos < $quotepos) && ($sigpos != 0))
return(array('body' => $message, 'sig' => '')); return(array('body' => $message, 'sig' => ''));
/// @TODO Regexp umstellen, so dass auf 1 oder kein Leerzeichen /// @TODO Regexp umstellen, so dass auf 1 oder kein Leerzeichen
@ -135,7 +135,7 @@ function removesig($message)
preg_match($pattern, $message, $result); preg_match($pattern, $message, $result);
if (($result[1] != '') and ($result[2] != '')) { if (($result[1] != '') && ($result[2] != '')) {
$cleaned = trim($result[1])."\n"; $cleaned = trim($result[1])."\n";
$sig = trim($result[2]); $sig = trim($result[2]);
// '[hr][size=x-small][color=darkblue]'.trim($result[2]).'[/color][/size]'; // '[hr][size=x-small][color=darkblue]'.trim($result[2]).'[/color][/size]';
@ -157,8 +157,8 @@ function removelinebreak($message)
foreach ($arrbody as $i => $line) { foreach ($arrbody as $i => $line) {
$currquotelevel = 0; $currquotelevel = 0;
$currline = $line; $currline = $line;
while ((strlen($currline)>0) and ((substr($currline, 0, 1) == '>') while ((strlen($currline)>0) && ((substr($currline, 0, 1) == '>')
or (substr($currline, 0, 1) == ' '))) { || (substr($currline, 0, 1) == ' '))) {
if (substr($currline, 0, 1) == '>') if (substr($currline, 0, 1) == '>')
$currquotelevel++; $currquotelevel++;
@ -167,8 +167,8 @@ function removelinebreak($message)
$quotelevel = 0; $quotelevel = 0;
$nextline = trim($arrbody[$i+1]); $nextline = trim($arrbody[$i+1]);
while ((strlen($nextline)>0) and ((substr($nextline, 0, 1) == '>') while ((strlen($nextline)>0) && ((substr($nextline, 0, 1) == '>')
or (substr($nextline, 0, 1) == ' '))) { || (substr($nextline, 0, 1) == ' '))) {
if (substr($nextline, 0, 1) == '>') if (substr($nextline, 0, 1) == '>')
$quotelevel++; $quotelevel++;
@ -178,21 +178,21 @@ function removelinebreak($message)
$len = strlen($line); $len = strlen($line);
$firstword = strpos($nextline.' ', ' '); $firstword = strpos($nextline.' ', ' ');
$specialchars = ((substr(trim($nextline), 0, 1) == '-') or $specialchars = ((substr(trim($nextline), 0, 1) == '-') ||
(substr(trim($nextline), 0, 1) == '=') or (substr(trim($nextline), 0, 1) == '=') ||
(substr(trim($nextline), 0, 1) == '*') or (substr(trim($nextline), 0, 1) == '*') ||
(substr(trim($nextline), 0, 1) == '·') or (substr(trim($nextline), 0, 1) == '·') ||
(substr(trim($nextline), 0, 4) == '[url') or (substr(trim($nextline), 0, 4) == '[url') ||
(substr(trim($nextline), 0, 5) == '[size') or (substr(trim($nextline), 0, 5) == '[size') ||
(substr(trim($nextline), 0, 7) == 'http://') or (substr(trim($nextline), 0, 7) == 'http://') ||
(substr(trim($nextline), 0, 8) == 'https://')); (substr(trim($nextline), 0, 8) == 'https://'));
if (!$specialchars) if (!$specialchars)
$specialchars = ((substr(rtrim($line), -1) == '-') or $specialchars = ((substr(rtrim($line), -1) == '-') ||
(substr(rtrim($line), -1) == '=') or (substr(rtrim($line), -1) == '=') ||
(substr(rtrim($line), -1) == '*') or (substr(rtrim($line), -1) == '*') ||
(substr(rtrim($line), -1) == '·') or (substr(rtrim($line), -1) == '·') ||
(substr(rtrim($line), -6) == '[/url]') or (substr(rtrim($line), -6) == '[/url]') ||
(substr(rtrim($line), -7) == '[/size]')); (substr(rtrim($line), -7) == '[/size]'));
//if ($specialchars) //if ($specialchars)
@ -202,8 +202,8 @@ function removelinebreak($message)
if (substr($lines[$lineno], -1) != ' ') if (substr($lines[$lineno], -1) != ' ')
$lines[$lineno] .= ' '; $lines[$lineno] .= ' ';
while ((strlen($line)>0) and ((substr($line, 0, 1) == '>') while ((strlen($line)>0) && ((substr($line, 0, 1) == '>')
or (substr($line, 0, 1) == ' '))) { || (substr($line, 0, 1) == ' '))) {
$line = ltrim(substr($line, 1)); $line = ltrim(substr($line, 1));
} }
@ -213,10 +213,10 @@ function removelinebreak($message)
// $lines[$lineno] = $quotelevel.'-'.$len.'-'.$firstword.'-'; // $lines[$lineno] = $quotelevel.'-'.$len.'-'.$firstword.'-';
$lines[$lineno] .= $line; $lines[$lineno] .= $line;
//if ((($len + $firstword < 68) and (substr($line, -1, 1) != ' ')) //if ((($len + $firstword < 68) && (substr($line, -1, 1) != ' '))
// or ($quotelevel != $currquotelevel) or $specialchars) // || ($quotelevel != $currquotelevel) || $specialchars)
if (((substr($line, -1, 1) != ' ')) if (((substr($line, -1, 1) != ' '))
or ($quotelevel != $currquotelevel)) || ($quotelevel != $currquotelevel))
$lineno++; $lineno++;
} }
return(implode("\n", $lines)); return(implode("\n", $lines));

View file

@ -121,7 +121,7 @@ function nav_info(App $a)
$nav['apps'] = array('apps', t('Apps'), '', t('Addon applications, utilities, games')); $nav['apps'] = array('apps', t('Apps'), '', t('Addon applications, utilities, games'));
} }
if (local_user() OR !get_config('system', 'local_search')) { if (local_user() || !get_config('system', 'local_search')) {
$nav['search'] = array('search', t('Search'), '', t('Search site content')); $nav['search'] = array('search', t('Search'), '', t('Search site content'));
$nav['searchoption'] = array( $nav['searchoption'] = array(

View file

@ -187,7 +187,7 @@ function z_fetch_url($url, $binary = false, &$redirects = 0, $opts = array()) {
$newurl = $curl_info['redirect_url']; $newurl = $curl_info['redirect_url'];
if (($new_location_info['path'] == '') AND ( $new_location_info['host'] != '')) { if (($new_location_info['path'] == '') && ( $new_location_info['host'] != '')) {
$newurl = $new_location_info['scheme'] . '://' . $new_location_info['host'] . $old_location_info['path']; $newurl = $new_location_info['scheme'] . '://' . $new_location_info['host'] . $old_location_info['path'];
} }
@ -818,8 +818,8 @@ function original_url($url, $depth = 1, $fetchbody = false) {
if ($http_code == 0) if ($http_code == 0)
return($url); return($url);
if ((($curl_info['http_code'] == "301") OR ($curl_info['http_code'] == "302")) if ((($curl_info['http_code'] == "301") || ($curl_info['http_code'] == "302"))
AND (($curl_info['redirect_url'] != "") OR ($curl_info['location'] != ""))) { && (($curl_info['redirect_url'] != "") || ($curl_info['location'] != ""))) {
if ($curl_info['redirect_url'] != "") if ($curl_info['redirect_url'] != "")
return(original_url($curl_info['redirect_url'], ++$depth, $fetchbody)); return(original_url($curl_info['redirect_url'], ++$depth, $fetchbody));
else else
@ -835,7 +835,7 @@ function original_url($url, $depth = 1, $fetchbody = false) {
return($url); return($url);
// if it isn't a HTML file then exit // if it isn't a HTML file then exit
if (($curl_info["content_type"] != "") AND !strstr(strtolower($curl_info["content_type"]),"html")) if (($curl_info["content_type"] != "") && !strstr(strtolower($curl_info["content_type"]),"html"))
return($url); return($url);
$stamp1 = microtime(true); $stamp1 = microtime(true);
@ -929,7 +929,7 @@ function json_return_and_die($x) {
*/ */
function matching_url($url1, $url2) { function matching_url($url1, $url2) {
if (($url1 == "") OR ($url2 == "")) if (($url1 == "") || ($url2 == ""))
return ""; return "";
$url1 = normalise_link($url1); $url1 = normalise_link($url1);
@ -938,7 +938,7 @@ function matching_url($url1, $url2) {
$parts1 = parse_url($url1); $parts1 = parse_url($url1);
$parts2 = parse_url($url2); $parts2 = parse_url($url2);
if (!isset($parts1["host"]) OR !isset($parts2["host"])) if (!isset($parts1["host"]) || !isset($parts2["host"]))
return ""; return "";
if ($parts1["scheme"] != $parts2["scheme"]) if ($parts1["scheme"] != $parts2["scheme"])
@ -967,7 +967,7 @@ function matching_url($url1, $url2) {
if ($path1 == $path2) if ($path1 == $path2)
$path .= $path1."/"; $path .= $path1."/";
} while (($path1 == $path2) AND ($i++ <= count($pathparts1))); } while (($path1 == $path2) && ($i++ <= count($pathparts1)));
$match .= $path; $match .= $path;

View file

@ -55,17 +55,6 @@ function notifier_run(&$argv, &$argc){
return; return;
} }
// Inherit the priority
$queue = dba::select('workerqueue', array('priority'), array('pid' => getmypid()), array('limit' => 1));
if (dbm::is_result($queue)) {
$priority = (int)$queue['priority'];
logger('inherited priority: '.$priority);
} else {
// Normally this shouldn't happen.
$priority = PRIORITY_HIGH;
logger('no inherited priority! Something is wrong.');
}
logger('notifier: invoked: ' . print_r($argv,true), LOGGER_DEBUG); logger('notifier: invoked: ' . print_r($argv,true), LOGGER_DEBUG);
$cmd = $argv[1]; $cmd = $argv[1];
@ -163,7 +152,7 @@ function notifier_run(&$argv, &$argc){
$recipients_relocate = q("SELECT * FROM contact WHERE uid = %d AND self = 0 AND network = '%s'" , intval($uid), NETWORK_DFRN); $recipients_relocate = q("SELECT * FROM contact WHERE uid = %d AND self = 0 AND network = '%s'" , intval($uid), NETWORK_DFRN);
} else { } else {
// find ancestors // find ancestors
$r = q("SELECT * FROM `item` WHERE `id` = %d and visible = 1 and moderated = 0 LIMIT 1", $r = q("SELECT * FROM `item` WHERE `id` = %d AND visible = 1 AND moderated = 0 LIMIT 1",
intval($item_id) intval($item_id)
); );
@ -177,7 +166,7 @@ function notifier_run(&$argv, &$argc){
$updated = $r[0]['edited']; $updated = $r[0]['edited'];
$items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer` $items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer`
FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d and visible = 1 and moderated = 0 ORDER BY `id` ASC", FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d AND visible = 1 AND moderated = 0 ORDER BY `id` ASC",
intval($parent_id) intval($parent_id)
); );
@ -306,13 +295,13 @@ function notifier_run(&$argv, &$argc){
$recipients = array($parent['contact-id']); $recipients = array($parent['contact-id']);
$recipients_followup = array($parent['contact-id']); $recipients_followup = array($parent['contact-id']);
//if (!$target_item['private'] AND $target_item['wall'] AND //if (!$target_item['private'] && $target_item['wall'] &&
if (!$target_item['private'] AND if (!$target_item['private'] &&
(strlen($target_item['allow_cid'].$target_item['allow_gid']. (strlen($target_item['allow_cid'].$target_item['allow_gid'].
$target_item['deny_cid'].$target_item['deny_gid']) == 0)) $target_item['deny_cid'].$target_item['deny_gid']) == 0))
$push_notify = true; $push_notify = true;
if (($thr_parent AND ($thr_parent[0]['network'] == NETWORK_OSTATUS)) OR ($parent['network'] == NETWORK_OSTATUS)) { if (($thr_parent && ($thr_parent[0]['network'] == NETWORK_OSTATUS)) || ($parent['network'] == NETWORK_OSTATUS)) {
$push_notify = true; $push_notify = true;
@ -359,7 +348,7 @@ function notifier_run(&$argv, &$argc){
// a delivery fork. private groups (forum_mode == 2) do not uplink // a delivery fork. private groups (forum_mode == 2) do not uplink
if ((intval($parent['forum_mode']) == 1) && (! $top_level) && ($cmd !== 'uplink')) { if ((intval($parent['forum_mode']) == 1) && (! $top_level) && ($cmd !== 'uplink')) {
proc_run($priority, 'include/notifier.php', 'uplink', $item_id); proc_run($a->queue['priority'], 'include/notifier.php', 'uplink', $item_id);
} }
$conversants = array(); $conversants = array();
@ -396,7 +385,7 @@ function notifier_run(&$argv, &$argc){
// If the thread parent is OStatus then do some magic to distribute the messages. // If the thread parent is OStatus then do some magic to distribute the messages.
// We have not only to look at the parent, since it could be a Friendica thread. // We have not only to look at the parent, since it could be a Friendica thread.
if (($thr_parent AND ($thr_parent[0]['network'] == NETWORK_OSTATUS)) OR ($parent['network'] == NETWORK_OSTATUS)) { if (($thr_parent && ($thr_parent[0]['network'] == NETWORK_OSTATUS)) || ($parent['network'] == NETWORK_OSTATUS)) {
$diaspora_delivery = false; $diaspora_delivery = false;
@ -498,7 +487,8 @@ function notifier_run(&$argv, &$argc){
} }
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);
proc_run($priority, 'include/delivery.php', $cmd, $item_id, $contact['id']); proc_run(array('priority' => $a->queue['priority'], 'created' => $a->queue['created'], 'dont_fork' => true),
'include/delivery.php', $cmd, $item_id, (int)$contact['id']);
} }
} }
@ -529,8 +519,8 @@ function notifier_run(&$argv, &$argc){
} }
$r1 = q("SELECT `batch`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`name`) AS `name`, ANY_VALUE(`network`) AS `network` $r1 = q("SELECT `batch`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`name`) AS `name`, ANY_VALUE(`network`) AS `network`
FROM `contact` WHERE `network` = '%s' FROM `contact` WHERE `network` = '%s' AND `batch` != ''
AND `uid` = %d AND `rel` != %d AND NOT `blocked` AND NOT `pending` AND NOT `archive` GROUP BY `batch` ORDER BY rand()", AND `uid` = %d AND `rel` != %d AND NOT `blocked` AND NOT `pending` AND NOT `archive` GROUP BY `batch`",
dbesc(NETWORK_DIASPORA), dbesc(NETWORK_DIASPORA),
intval($owner['uid']), intval($owner['uid']),
intval(CONTACT_IS_SHARING) intval(CONTACT_IS_SHARING)
@ -538,8 +528,7 @@ function notifier_run(&$argv, &$argc){
} }
$r2 = q("SELECT `id`, `name`,`network` FROM `contact` $r2 = q("SELECT `id`, `name`,`network` FROM `contact`
WHERE `network` in ( '%s', '%s') AND `uid` = %d AND NOT `blocked` AND NOT `pending` AND NOT `archive` WHERE `network` in ('%s', '%s') AND `uid` = %d AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND `rel` != %d",
AND `rel` != %d order by rand() ",
dbesc(NETWORK_DFRN), dbesc(NETWORK_DFRN),
dbesc(NETWORK_MAIL2), dbesc(NETWORK_MAIL2),
intval($owner['uid']), intval($owner['uid']),
@ -563,7 +552,8 @@ 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, 'include/delivery.php', $cmd, $item_id, $rr['id']); proc_run(array('priority' => $a->queue['priority'], 'created' => $a->queue['created'], 'dont_fork' => true),
'include/delivery.php', $cmd, $item_id, (int)$rr['id']);
} }
} }
} }
@ -573,7 +563,7 @@ function notifier_run(&$argv, &$argc){
} }
// Notify PuSH subscribers (Used for OStatus distribution of regular posts) // Notify PuSH subscribers (Used for OStatus distribution of regular posts)
if ($push_notify AND strlen($hub)) { if ($push_notify && strlen($hub)) {
$hubs = explode(',', $hub); $hubs = explode(',', $hub);
if (count($hubs)) { if (count($hubs)) {
foreach ($hubs as $h) { foreach ($hubs as $h) {
@ -603,7 +593,8 @@ function notifier_run(&$argv, &$argc){
} }
// Handling the pubsubhubbub requests // Handling the pubsubhubbub requests
proc_run(PRIORITY_HIGH, 'include/pubsubpublish.php'); proc_run(array('priority' => PRIORITY_HIGH, 'created' => $a->queue['created'], 'dont_fork' => true),
'include/pubsubpublish.php');
} }
logger('notifier: calling hooks', LOGGER_DEBUG); logger('notifier: calling hooks', LOGGER_DEBUG);

View file

@ -108,7 +108,7 @@ function oembed_fetch_url($embedurl, $no_rich_type = false){
$j->embedurl = $embedurl; $j->embedurl = $embedurl;
// If fetching information doesn't work, then improve via internal functions // If fetching information doesn't work, then improve via internal functions
if (($j->type == "error") OR ($no_rich_type AND ($j->type == "rich"))) { if (($j->type == "error") || ($no_rich_type && ($j->type == "rich"))) {
$data = ParseUrl::getSiteinfoCached($embedurl, true, false); $data = ParseUrl::getSiteinfoCached($embedurl, true, false);
$j->type = $data["type"]; $j->type = $data["type"];
@ -194,7 +194,7 @@ function oembed_format_object($j){
if (isset($j->author_name)) { if (isset($j->author_name)) {
$ret.=" (".$j->author_name.")"; $ret.=" (".$j->author_name.")";
} }
} elseif (isset($j->provider_name) OR isset($j->author_name)) { } elseif (isset($j->provider_name) || isset($j->author_name)) {
$embedlink = ""; $embedlink = "";
if (isset($j->provider_name)) { if (isset($j->provider_name)) {
$embedlink .= $j->provider_name; $embedlink .= $j->provider_name;

View file

@ -68,9 +68,9 @@ function onepoll_run(&$argv, &$argc){
$contact = $contacts[0]; $contact = $contacts[0];
// load current friends if possible. // load current friends if possible.
if (($contact['poco'] != "") AND ($contact['success_update'] > $contact['failure_update'])) { if (($contact['poco'] != "") && ($contact['success_update'] > $contact['failure_update'])) {
$r = q("SELECT count(*) as total from glink $r = q("SELECT count(*) AS total FROM glink
where `cid` = %d and updated > UTC_TIMESTAMP() - INTERVAL 1 DAY", WHERE `cid` = %d AND updated > UTC_TIMESTAMP() - INTERVAL 1 DAY",
intval($contact['id']) intval($contact['id'])
); );
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
@ -395,7 +395,7 @@ function onepoll_run(&$argv, &$argc){
logger("Mail: Seen before ".$msg_uid." for ".$mailconf[0]['user']." UID: ".$importer_uid." URI: ".$datarray['uri'],LOGGER_DEBUG); logger("Mail: Seen before ".$msg_uid." for ".$mailconf[0]['user']." UID: ".$importer_uid." URI: ".$datarray['uri'],LOGGER_DEBUG);
// Only delete when mails aren't automatically moved or deleted // Only delete when mails aren't automatically moved or deleted
if (($mailconf[0]['action'] != 1) AND ($mailconf[0]['action'] != 3)) if (($mailconf[0]['action'] != 1) && ($mailconf[0]['action'] != 3))
if ($meta->deleted && ! $r[0]['deleted']) { if ($meta->deleted && ! $r[0]['deleted']) {
q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d", q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d",
dbesc(datetime_convert()), dbesc(datetime_convert()),
@ -467,15 +467,15 @@ function onepoll_run(&$argv, &$argc){
$datarray['created'] = datetime_convert('UTC','UTC',$meta->date); $datarray['created'] = datetime_convert('UTC','UTC',$meta->date);
// Is it a reply? // Is it a reply?
$reply = ((substr(strtolower($datarray['title']), 0, 3) == "re:") or $reply = ((substr(strtolower($datarray['title']), 0, 3) == "re:") ||
(substr(strtolower($datarray['title']), 0, 3) == "re-") or (substr(strtolower($datarray['title']), 0, 3) == "re-") ||
($raw_refs != "")); ($raw_refs != ""));
// Remove Reply-signs in the subject // Remove Reply-signs in the subject
$datarray['title'] = RemoveReply($datarray['title']); $datarray['title'] = RemoveReply($datarray['title']);
// If it seems to be a reply but a header couldn't be found take the last message with matching subject // If it seems to be a reply but a header couldn't be found take the last message with matching subject
if (!x($datarray,'parent-uri') and $reply) { if (!x($datarray,'parent-uri') && $reply) {
$r = q("SELECT `uri` , `parent-uri` FROM `item` WHERE `title` = \"%s\" AND `uid` = %d AND `network` = '%s' ORDER BY `created` DESC LIMIT 1", $r = q("SELECT `uri` , `parent-uri` FROM `item` WHERE `title` = \"%s\" AND `uid` = %d AND `network` = '%s' ORDER BY `created` DESC LIMIT 1",
dbesc(protect_sprintf($datarray['title'])), dbesc(protect_sprintf($datarray['title'])),
intval($importer_uid), intval($importer_uid),

View file

@ -54,7 +54,7 @@ class ostatus {
$alternate = $xpath->query("atom:author/atom:link[@rel='alternate']", $context)->item(0)->attributes; $alternate = $xpath->query("atom:author/atom:link[@rel='alternate']", $context)->item(0)->attributes;
if (is_object($alternate)) { if (is_object($alternate)) {
foreach ($alternate AS $attributes) { foreach ($alternate AS $attributes) {
if (($attributes->name == "href") AND ($attributes->textContent != "")) { if (($attributes->name == "href") && ($attributes->textContent != "")) {
$author["author-link"] = $attributes->textContent; $author["author-link"] = $attributes->textContent;
} }
} }
@ -100,7 +100,7 @@ class ostatus {
$width = $attributes->textContent; $width = $attributes->textContent;
} }
} }
if (($width > 0) AND ($href != "")) { if (($width > 0) && ($href != "")) {
$avatarlist[$width] = $href; $avatarlist[$width] = $href;
} }
} }
@ -119,7 +119,7 @@ class ostatus {
$author["owner-avatar"] = $author["author-avatar"]; $author["owner-avatar"] = $author["author-avatar"];
// Only update the contacts if it is an OStatus contact // Only update the contacts if it is an OStatus contact
if ($r AND !$onlyfetch AND ($contact["network"] == NETWORK_OSTATUS)) { if ($r && !$onlyfetch && ($contact["network"] == NETWORK_OSTATUS)) {
// Update contact data // Update contact data
@ -153,8 +153,8 @@ class ostatus {
if ($value != "") if ($value != "")
$contact["location"] = $value; $contact["location"] = $value;
if (($contact["name"] != $r[0]["name"]) OR ($contact["nick"] != $r[0]["nick"]) OR ($contact["about"] != $r[0]["about"]) OR if (($contact["name"] != $r[0]["name"]) || ($contact["nick"] != $r[0]["nick"]) || ($contact["about"] != $r[0]["about"]) ||
($contact["alias"] != $r[0]["alias"]) OR ($contact["location"] != $r[0]["location"])) { ($contact["alias"] != $r[0]["alias"]) || ($contact["location"] != $r[0]["location"])) {
logger("Update contact data for contact ".$contact["id"], LOGGER_DEBUG); logger("Update contact data for contact ".$contact["id"], LOGGER_DEBUG);
@ -164,7 +164,7 @@ class ostatus {
dbesc(datetime_convert()), intval($contact["id"])); dbesc(datetime_convert()), intval($contact["id"]));
} }
if (isset($author["author-avatar"]) AND ($author["author-avatar"] != $r[0]['avatar'])) { if (isset($author["author-avatar"]) && ($author["author-avatar"] != $r[0]['avatar'])) {
logger("Update profile picture for contact ".$contact["id"], LOGGER_DEBUG); logger("Update profile picture for contact ".$contact["id"], LOGGER_DEBUG);
update_contact_avatar($author["author-avatar"], $importer["uid"], $contact["id"]); update_contact_avatar($author["author-avatar"], $importer["uid"], $contact["id"]);
@ -354,13 +354,13 @@ class ostatus {
$item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue; $item["verb"] = $xpath->query('activity:verb/text()', $entry)->item(0)->nodeValue;
// Mastodon Content Warning // Mastodon Content Warning
if (($item["verb"] == ACTIVITY_POST) AND $xpath->evaluate('boolean(atom:summary)', $entry)) { if (($item["verb"] == ACTIVITY_POST) && $xpath->evaluate('boolean(atom:summary)', $entry)) {
$clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; $clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue;
$item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]'; $item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]';
} }
if (($item["object-type"] == ACTIVITY_OBJ_BOOKMARK) OR ($item["object-type"] == ACTIVITY_OBJ_EVENT)) { if (($item["object-type"] == ACTIVITY_OBJ_BOOKMARK) || ($item["object-type"] == ACTIVITY_OBJ_EVENT)) {
$item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue; $item["title"] = $xpath->query('atom:title/text()', $entry)->item(0)->nodeValue;
$item["body"] = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue; $item["body"] = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue;
} elseif ($item["object-type"] == ACTIVITY_OBJ_QUESTION) { } elseif ($item["object-type"] == ACTIVITY_OBJ_QUESTION) {
@ -469,11 +469,11 @@ class ostatus {
foreach ($links AS $link) { foreach ($links AS $link) {
$attribute = self::read_attributes($link); $attribute = self::read_attributes($link);
if (($attribute['rel'] != "") AND ($attribute['href'] != "")) { if (($attribute['rel'] != "") && ($attribute['href'] != "")) {
switch ($attribute['rel']) { switch ($attribute['rel']) {
case "alternate": case "alternate":
$item["plink"] = $attribute['href']; $item["plink"] = $attribute['href'];
if (($item["object-type"] == ACTIVITY_OBJ_QUESTION) OR if (($item["object-type"] == ACTIVITY_OBJ_QUESTION) ||
($item["object-type"] == ACTIVITY_OBJ_EVENT)) { ($item["object-type"] == ACTIVITY_OBJ_EVENT)) {
$item["body"] .= add_page_info($attribute['href']); $item["body"] .= add_page_info($attribute['href']);
} }
@ -525,7 +525,7 @@ class ostatus {
$repeat_of = ""; $repeat_of = "";
$notice_info = $xpath->query('statusnet:notice_info', $entry); $notice_info = $xpath->query('statusnet:notice_info', $entry);
if ($notice_info AND ($notice_info->length > 0)) { if ($notice_info && ($notice_info->length > 0)) {
foreach ($notice_info->item(0)->attributes AS $attributes) { foreach ($notice_info->item(0)->attributes AS $attributes) {
if ($attributes->name == "source") { if ($attributes->name == "source") {
$item["app"] = strip_tags($attributes->textContent); $item["app"] = strip_tags($attributes->textContent);
@ -540,7 +540,7 @@ class ostatus {
} }
// Is it a repeated post? // Is it a repeated post?
if (($repeat_of != "") OR ($item["verb"] == ACTIVITY_SHARE)) { if (($repeat_of != "") || ($item["verb"] == ACTIVITY_SHARE)) {
$activityobjects = $xpath->query('activity:object', $entry)->item(0); $activityobjects = $xpath->query('activity:object', $entry)->item(0);
if (is_object($activityobjects)) { if (is_object($activityobjects)) {
@ -550,7 +550,7 @@ class ostatus {
$orig_uri = $xpath->query('atom:id/text()', $activityobjects)->item(0)->nodeValue; $orig_uri = $xpath->query('atom:id/text()', $activityobjects)->item(0)->nodeValue;
} }
$orig_links = $xpath->query("activity:object/atom:link[@rel='alternate']", $activityobjects); $orig_links = $xpath->query("activity:object/atom:link[@rel='alternate']", $activityobjects);
if ($orig_links AND ($orig_links->length > 0)) { if ($orig_links && ($orig_links->length > 0)) {
foreach ($orig_links->item(0)->attributes AS $attributes) { foreach ($orig_links->item(0)->attributes AS $attributes) {
if ($attributes->name == "href") { if ($attributes->name == "href") {
$orig_link = $attributes->textContent; $orig_link = $attributes->textContent;
@ -621,8 +621,8 @@ class ostatus {
intval($importer["uid"]), dbesc($item["parent-uri"])); intval($importer["uid"]), dbesc($item["parent-uri"]));
// Only fetch missing stuff if it is a comment or reshare. // Only fetch missing stuff if it is a comment or reshare.
if (in_array($item["verb"], array(ACTIVITY_POST, ACTIVITY_SHARE)) AND if (in_array($item["verb"], array(ACTIVITY_POST, ACTIVITY_SHARE)) &&
!dbm::is_result($r) AND ($related != "")) { !dbm::is_result($r) && ($related != "")) {
$reply_path = str_replace("/notice/", "/api/statuses/show/", $related).".atom"; $reply_path = str_replace("/notice/", "/api/statuses/show/", $related).".atom";
if ($reply_path != $related) { if ($reply_path != $related) {
@ -668,16 +668,16 @@ class ostatus {
public static function convert_href($href) { public static function convert_href($href) {
$elements = explode(":",$href); $elements = explode(":",$href);
if ((count($elements) <= 2) OR ($elements[0] != "tag")) if ((count($elements) <= 2) || ($elements[0] != "tag"))
return $href; return $href;
$server = explode(",", $elements[1]); $server = explode(",", $elements[1]);
$conversation = explode("=", $elements[2]); $conversation = explode("=", $elements[2]);
if ((count($elements) == 4) AND ($elements[2] == "post")) if ((count($elements) == 4) && ($elements[2] == "post"))
return "http://".$server[0]."/notice/".$elements[3]; return "http://".$server[0]."/notice/".$elements[3];
if ((count($conversation) != 2) OR ($conversation[1] =="")) if ((count($conversation) != 2) || ($conversation[1] ==""))
return $href; return $href;
if ($elements[3] == "objectType=thread") if ($elements[3] == "objectType=thread")
@ -703,7 +703,7 @@ class ostatus {
} }
// Don't poll if the interval is set negative // Don't poll if the interval is set negative
if (($poll_interval < 0) AND !$override) { if (($poll_interval < 0) && !$override) {
return; return;
} }
@ -720,7 +720,7 @@ class ostatus {
} }
if ($last AND !$override) { if ($last && !$override) {
$next = $last + ($poll_interval * 60); $next = $last + ($poll_interval * 60);
if ($next > time()) { if ($next > time()) {
logger('poll interval not reached'); logger('poll interval not reached');
@ -818,7 +818,7 @@ class ostatus {
if ($conversation_id != "") { if ($conversation_id != "") {
$elements = explode(":", $conversation_id); $elements = explode(":", $conversation_id);
if ((count($elements) <= 2) OR ($elements[0] != "tag")) if ((count($elements) <= 2) || ($elements[0] != "tag"))
return $conversation_id; return $conversation_id;
} }
@ -933,8 +933,8 @@ class ostatus {
// If the thread shouldn't be completed then store the item and go away // If the thread shouldn't be completed then store the item and go away
// Don't do a completion on liked content // Don't do a completion on liked content
if (((intval(get_config('system','ostatus_poll_interval')) == -2) AND (count($item) > 0)) OR if (((intval(get_config('system','ostatus_poll_interval')) == -2) && (count($item) > 0)) ||
($item["verb"] == ACTIVITY_LIKE) OR ($conversation_url == "")) { ($item["verb"] == ACTIVITY_LIKE) || ($conversation_url == "")) {
$item_stored = item_store($item, $all_threads); $item_stored = item_store($item, $all_threads);
return $item_stored; return $item_stored;
} }
@ -979,10 +979,10 @@ class ostatus {
$conv_arr = z_fetch_url($conv."?page=".$pageno); $conv_arr = z_fetch_url($conv."?page=".$pageno);
// If it is a non-ssl site and there is an error, then try ssl or vice versa // If it is a non-ssl site and there is an error, then try ssl or vice versa
if (!$conv_arr["success"] AND (substr($conv, 0, 7) == "http://")) { if (!$conv_arr["success"] && (substr($conv, 0, 7) == "http://")) {
$conv = str_replace("http://", "https://", $conv); $conv = str_replace("http://", "https://", $conv);
$conv_as = fetch_url($conv."?page=".$pageno); $conv_as = fetch_url($conv."?page=".$pageno);
} elseif (!$conv_arr["success"] AND (substr($conv, 0, 8) == "https://")) { } elseif (!$conv_arr["success"] && (substr($conv, 0, 8) == "https://")) {
$conv = str_replace("https://", "http://", $conv); $conv = str_replace("https://", "http://", $conv);
$conv_as = fetch_url($conv."?page=".$pageno); $conv_as = fetch_url($conv."?page=".$pageno);
} else } else
@ -1057,7 +1057,7 @@ class ostatus {
// 1. Our conversation hasn't the "real" thread starter // 1. Our conversation hasn't the "real" thread starter
// 2. This first post is a post inside our thread // 2. This first post is a post inside our thread
// 3. This first post is a post inside another thread // 3. This first post is a post inside another thread
if (($first_id != $parent["uri"]) AND ($parent["uri"] != "")) { if (($first_id != $parent["uri"]) && ($parent["uri"] != "")) {
$new_parent = true; $new_parent = true;
@ -1144,7 +1144,7 @@ class ostatus {
} }
// The item we are having on the system is the one that we wanted to store via the item array // The item we are having on the system is the one that we wanted to store via the item array
if (isset($item["uri"]) AND ($item["uri"] == $existing_message["uri"])) { if (isset($item["uri"]) && ($item["uri"] == $existing_message["uri"])) {
$item = array(); $item = array();
$item_stored = 0; $item_stored = 0;
} }
@ -1164,7 +1164,7 @@ class ostatus {
$details = self::get_actor_details($actor, $uid, $parent["contact-id"]); $details = self::get_actor_details($actor, $uid, $parent["contact-id"]);
// Do we only want to import threads that were started by our contacts? // Do we only want to import threads that were started by our contacts?
if ($details["not_following"] AND $new_parent AND get_config('system','ostatus_full_threads')) { if ($details["not_following"] && $new_parent && get_config('system','ostatus_full_threads')) {
logger("Don't import uri ".$first_id." because user ".$uid." doesn't follow the person ".$actor, LOGGER_DEBUG); logger("Don't import uri ".$first_id." because user ".$uid." doesn't follow the person ".$actor, LOGGER_DEBUG);
continue; continue;
} }
@ -1218,7 +1218,7 @@ class ostatus {
$arr["coord"] = trim($single_conv->location->lat." ".$single_conv->location->lon); $arr["coord"] = trim($single_conv->location->lat." ".$single_conv->location->lon);
// Is it a reshared item? // Is it a reshared item?
if (isset($single_conv->verb) AND ($single_conv->verb == "share") AND isset($single_conv->object)) { if (isset($single_conv->verb) && ($single_conv->verb == "share") && isset($single_conv->object)) {
if (is_array($single_conv->object)) if (is_array($single_conv->object))
$single_conv->object = $single_conv->object[0]; $single_conv->object = $single_conv->object[0];
@ -1277,7 +1277,7 @@ class ostatus {
unset($arr["coord"]); unset($arr["coord"]);
// Copy fields from given item array // Copy fields from given item array
if (isset($item["uri"]) AND (($item["uri"] == $arr["uri"]) OR ($item["uri"] == $single_conv->id))) { if (isset($item["uri"]) && (($item["uri"] == $arr["uri"]) || ($item["uri"] == $single_conv->id))) {
logger('Use stored item array for item with URI '.$item["uri"], LOGGER_DEBUG); logger('Use stored item array for item with URI '.$item["uri"], LOGGER_DEBUG);
$newitem = item_store($item); $newitem = item_store($item);
$item = array(); $item = array();
@ -1307,7 +1307,7 @@ class ostatus {
} }
} }
if (($item_stored < 0) AND (count($item) > 0)) { if (($item_stored < 0) && (count($item) > 0)) {
if (get_config('system','ostatus_full_threads')) { if (get_config('system','ostatus_full_threads')) {
$details = self::get_actor_details($item["owner-link"], $uid, $item["contact-id"]); $details = self::get_actor_details($item["owner-link"], $uid, $item["contact-id"]);
@ -1543,7 +1543,7 @@ class ostatus {
break; break;
} }
if (($siteinfo["type"] != "photo") AND isset($siteinfo["image"])) { if (($siteinfo["type"] != "photo") && isset($siteinfo["image"])) {
$imgdata = get_photo_info($siteinfo["image"]); $imgdata = get_photo_info($siteinfo["image"]);
$attributes = array("rel" => "enclosure", $attributes = array("rel" => "enclosure",
"href" => $siteinfo["image"], "href" => $siteinfo["image"],
@ -1788,7 +1788,7 @@ class ostatus {
*/ */
private function reshare_entry($doc, $item, $owner, $repeated_guid, $toplevel) { private function reshare_entry($doc, $item, $owner, $repeated_guid, $toplevel) {
if (($item["id"] != $item["parent"]) AND (normalise_link($item["author-link"]) != normalise_link($owner["url"]))) { if (($item["id"] != $item["parent"]) && (normalise_link($item["author-link"]) != normalise_link($owner["url"]))) {
logger("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", LOGGER_DEBUG); logger("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", LOGGER_DEBUG);
} }
@ -1854,7 +1854,7 @@ class ostatus {
*/ */
private function like_entry($doc, $item, $owner, $toplevel) { private function like_entry($doc, $item, $owner, $toplevel) {
if (($item["id"] != $item["parent"]) AND (normalise_link($item["author-link"]) != normalise_link($owner["url"]))) { if (($item["id"] != $item["parent"]) && (normalise_link($item["author-link"]) != normalise_link($owner["url"]))) {
logger("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", LOGGER_DEBUG); logger("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", LOGGER_DEBUG);
} }
@ -1999,7 +1999,7 @@ class ostatus {
*/ */
private function note_entry($doc, $item, $owner, $toplevel) { private function note_entry($doc, $item, $owner, $toplevel) {
if (($item["id"] != $item["parent"]) AND (normalise_link($item["author-link"]) != normalise_link($owner["url"]))) { if (($item["id"] != $item["parent"]) && (normalise_link($item["author-link"]) != normalise_link($owner["url"]))) {
logger("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", LOGGER_DEBUG); logger("OStatus entry is from author ".$owner["url"]." - not from ".$item["author-link"].". Quitting.", LOGGER_DEBUG);
} }
@ -2080,7 +2080,7 @@ class ostatus {
xml::add_element($doc, $entry, "link", "", array("rel" => "alternate", "type" => "text/html", xml::add_element($doc, $entry, "link", "", array("rel" => "alternate", "type" => "text/html",
"href" => App::get_baseurl()."/display/".$item["guid"])); "href" => App::get_baseurl()."/display/".$item["guid"]));
if ($complete AND ($item["id"] > 0)) if ($complete && ($item["id"] > 0))
xml::add_element($doc, $entry, "status_net", "", array("notice_id" => $item["id"])); xml::add_element($doc, $entry, "status_net", "", array("notice_id" => $item["id"]));
xml::add_element($doc, $entry, "activity:verb", $verb); xml::add_element($doc, $entry, "activity:verb", $verb);
@ -2102,7 +2102,7 @@ class ostatus {
$mentioned = array(); $mentioned = array();
if (($item['parent'] != $item['id']) OR ($item['parent-uri'] !== $item['uri']) OR (($item['thr-parent'] !== '') AND ($item['thr-parent'] !== $item['uri']))) { if (($item['parent'] != $item['id']) || ($item['parent-uri'] !== $item['uri']) || (($item['thr-parent'] !== '') && ($item['thr-parent'] !== $item['uri']))) {
$parent = q("SELECT `guid`, `author-link`, `owner-link` FROM `item` WHERE `id` = %d", intval($item["parent"])); $parent = q("SELECT `guid`, `author-link`, `owner-link` FROM `item` WHERE `id` = %d", intval($item["parent"]));
$parent_item = (($item['thr-parent']) ? $item['thr-parent'] : $item['parent-uri']); $parent_item = (($item['thr-parent']) ? $item['thr-parent'] : $item['parent-uri']);
@ -2175,7 +2175,7 @@ class ostatus {
$r = q("SELECT `forum`, `prv` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s'", $r = q("SELECT `forum`, `prv` FROM `contact` WHERE `uid` = %d AND `nurl` = '%s'",
intval($owner["uid"]), intval($owner["uid"]),
dbesc(normalise_link($mention))); dbesc(normalise_link($mention)));
if ($r[0]["forum"] OR $r[0]["prv"]) if ($r[0]["forum"] || $r[0]["prv"])
xml::add_element($doc, $entry, "link", "", array("rel" => "mentioned", xml::add_element($doc, $entry, "link", "", array("rel" => "mentioned",
"ostatus:object-type" => ACTIVITY_OBJ_GROUP, "ostatus:object-type" => ACTIVITY_OBJ_GROUP,
"href" => $mention)); "href" => $mention));
@ -2201,7 +2201,7 @@ class ostatus {
self::get_attachment($doc, $entry, $item); self::get_attachment($doc, $entry, $item);
if ($complete AND ($item["id"] > 0)) { if ($complete && ($item["id"] > 0)) {
$app = $item["app"]; $app = $item["app"];
if ($app == "") if ($app == "")
$app = "web"; $app = "web";

View file

@ -91,7 +91,6 @@ function pop_lang() {
$lang = $a->langsave; $lang = $a->langsave;
} }
// l // l
if (! function_exists('load_translation_table')) { if (! function_exists('load_translation_table')) {

View file

@ -12,7 +12,7 @@ function getGps($exifCoord, $hemi) {
$minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0; $minutes = count($exifCoord) > 1 ? gps2Num($exifCoord[1]) : 0;
$seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0; $seconds = count($exifCoord) > 2 ? gps2Num($exifCoord[2]) : 0;
$flip = ($hemi == 'W' or $hemi == 'S') ? -1 : 1; $flip = ($hemi == 'W' || $hemi == 'S') ? -1 : 1;
return floatval($flip * ($degrees + ($minutes / 60) + ($seconds / 3600))); return floatval($flip * ($degrees + ($minutes / 60) + ($seconds / 3600)));
} }
@ -44,7 +44,7 @@ function photo_albums($uid, $update = false) {
$key = "photo_albums:".$uid.":".local_user().":".remote_user(); $key = "photo_albums:".$uid.":".local_user().":".remote_user();
$albums = Cache::get($key); $albums = Cache::get($key);
if (is_null($albums) OR $update) { if (is_null($albums) || $update) {
if (!Config::get('system', 'no_count', false)) { if (!Config::get('system', 'no_count', false)) {
/// @todo This query needs to be renewed. It is really slow /// @todo This query needs to be renewed. It is really slow
// At this time we just store the data in the cache // At this time we just store the data in the cache

View file

@ -8,7 +8,7 @@ class pidfile {
if (file_exists($this->_file)) { if (file_exists($this->_file)) {
$pid = trim(@file_get_contents($this->_file)); $pid = trim(@file_get_contents($this->_file));
if (($pid != "") AND posix_kill($pid, 0)) { if (($pid != "") && posix_kill($pid, 0)) {
$this->_running = true; $this->_running = true;
} }
} }

View file

@ -54,7 +54,7 @@ function get_old_attachment_data($body) {
$picturedata = get_photo_info($matches[1]); $picturedata = get_photo_info($matches[1]);
if (($picturedata[0] >= 500) AND ($picturedata[0] >= $picturedata[1])) if (($picturedata[0] >= 500) && ($picturedata[0] >= $picturedata[1]))
$post["image"] = $matches[1]; $post["image"] = $matches[1];
else else
$post["preview"] = $matches[1]; $post["preview"] = $matches[1];
@ -64,8 +64,8 @@ function get_old_attachment_data($body) {
$post["url"] = $matches[1]; $post["url"] = $matches[1];
$post["title"] = $matches[2]; $post["title"] = $matches[2];
} }
if (($post["url"] == "") AND (in_array($post["type"], array("link", "video"))) if (($post["url"] == "") && (in_array($post["type"], array("link", "video")))
AND preg_match("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", $attacheddata, $matches)) { && preg_match("/\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", $attacheddata, $matches)) {
$post["url"] = $matches[1]; $post["url"] = $matches[1];
} }
@ -204,7 +204,7 @@ function get_attached_data($body) {
// Workaround: // Workaround:
// Sometimes photo posts to the own album are not detected at the start. // Sometimes photo posts to the own album are not detected at the start.
// So we seem to cannot use the cache for these cases. That's strange. // So we seem to cannot use the cache for these cases. That's strange.
if (($data["type"] != "photo") AND strstr($pictures[0][1], "/photos/")) if (($data["type"] != "photo") && strstr($pictures[0][1], "/photos/"))
$data = ParseUrl::getSiteinfo($pictures[0][1], true); $data = ParseUrl::getSiteinfo($pictures[0][1], true);
if ($data["type"] == "photo") { if ($data["type"] == "photo") {
@ -256,7 +256,7 @@ function get_attached_data($body) {
$post["type"] = "text"; $post["type"] = "text";
$post["text"] = trim($body); $post["text"] = trim($body);
} }
} elseif (isset($post["url"]) AND ($post["type"] == "video")) { } elseif (isset($post["url"]) && ($post["type"] == "video")) {
$data = ParseUrl::getSiteinfoCached($post["url"], true); $data = ParseUrl::getSiteinfoCached($post["url"], true);
if (isset($data["images"][0])) if (isset($data["images"][0]))
@ -278,7 +278,7 @@ function shortenmsg($msg, $limit, $twitter = false) {
if (iconv_strlen(trim($msg."\n".$line), "UTF-8") <= $limit) if (iconv_strlen(trim($msg."\n".$line), "UTF-8") <= $limit)
$msg = trim($msg."\n".$line); $msg = trim($msg."\n".$line);
// Is the new message empty by now or is it a reshared message? // Is the new message empty by now or is it a reshared message?
elseif (($msg == "") OR (($row == 1) AND (substr($msg, 0, 4) == $recycle))) elseif (($msg == "") || (($row == 1) && (substr($msg, 0, 4) == $recycle)))
$msg = iconv_substr(iconv_substr(trim($msg."\n".$line), 0, $limit, "UTF-8"), 0, -3, "UTF-8").$ellipsis; $msg = iconv_substr(iconv_substr(trim($msg."\n".$line), 0, $limit, "UTF-8"), 0, -3, "UTF-8").$ellipsis;
else else
break; break;
@ -315,7 +315,7 @@ function plaintext(App $a, $b, $limit = 0, $includedlinks = false, $htmlmode = 2
//$post = get_attached_data($b["body"]); //$post = get_attached_data($b["body"]);
$post = get_attached_data($body); $post = get_attached_data($body);
if (($b["title"] != "") AND ($post["text"] != "")) if (($b["title"] != "") && ($post["text"] != ""))
$post["text"] = trim($b["title"]."\n\n".$post["text"]); $post["text"] = trim($b["title"]."\n\n".$post["text"]);
elseif ($b["title"] != "") elseif ($b["title"] != "")
$post["text"] = trim($b["title"]); $post["text"] = trim($b["title"]);
@ -329,7 +329,7 @@ function plaintext(App $a, $b, $limit = 0, $includedlinks = false, $htmlmode = 2
// If we post to a network with no limit we only fetch // If we post to a network with no limit we only fetch
// an abstract exactly for this network // an abstract exactly for this network
if (($limit == 0) AND ($abstract == $default_abstract)) if (($limit == 0) && ($abstract == $default_abstract))
$abstract = ""; $abstract = "";
} else // Try to guess the correct target network } else // Try to guess the correct target network
@ -373,25 +373,25 @@ function plaintext(App $a, $b, $limit = 0, $includedlinks = false, $htmlmode = 2
elseif ($post["type"] == "photo") elseif ($post["type"] == "photo")
$link = $post["image"]; $link = $post["image"];
if (($msg == "") AND isset($post["title"])) if (($msg == "") && isset($post["title"]))
$msg = trim($post["title"]); $msg = trim($post["title"]);
if (($msg == "") AND isset($post["description"])) if (($msg == "") && isset($post["description"]))
$msg = trim($post["description"]); $msg = trim($post["description"]);
// If the link is already contained in the post, then it neeedn't to be added again // If the link is already contained in the post, then it neeedn't to be added again
// But: if the link is beyond the limit, then it has to be added. // But: if the link is beyond the limit, then it has to be added.
if (($link != "") AND strstr($msg, $link)) { if (($link != "") && strstr($msg, $link)) {
$pos = strpos($msg, $link); $pos = strpos($msg, $link);
// Will the text be shortened in the link? // Will the text be shortened in the link?
// Or is the link the last item in the post? // Or is the link the last item in the post?
if (($limit > 0) AND ($pos < $limit) AND (($pos + 23 > $limit) OR ($pos + strlen($link) == strlen($msg)))) if (($limit > 0) && ($pos < $limit) && (($pos + 23 > $limit) || ($pos + strlen($link) == strlen($msg))))
$msg = trim(str_replace($link, "", $msg)); $msg = trim(str_replace($link, "", $msg));
elseif (($limit == 0) OR ($pos < $limit)) { elseif (($limit == 0) || ($pos < $limit)) {
// The limit has to be increased since it will be shortened - but not now // The limit has to be increased since it will be shortened - but not now
// Only do it with Twitter (htmlmode = 8) // Only do it with Twitter (htmlmode = 8)
if (($limit > 0) AND (strlen($link) > 23) AND ($htmlmode == 8)) if (($limit > 0) && (strlen($link) > 23) && ($htmlmode == 8))
$limit = $limit - 23 + strlen($link); $limit = $limit - 23 + strlen($link);
$link = ""; $link = "";
@ -414,7 +414,7 @@ function plaintext(App $a, $b, $limit = 0, $includedlinks = false, $htmlmode = 2
if (iconv_strlen($msg, "UTF-8") > $limit) { if (iconv_strlen($msg, "UTF-8") > $limit) {
if (($post["type"] == "text") AND isset($post["url"])) if (($post["type"] == "text") && isset($post["url"]))
$post["url"] = $b["plink"]; $post["url"] = $b["plink"];
elseif (!isset($post["url"])) { elseif (!isset($post["url"])) {
$limit = $limit - 23; $limit = $limit - 23;

View file

@ -563,7 +563,7 @@ function theme_include($file, $root = '') {
$root = $root . '/'; $root = $root . '/';
} }
$theme_info = $a->theme_info; $theme_info = $a->theme_info;
if (is_array($theme_info) AND array_key_exists('extends',$theme_info)) { if (is_array($theme_info) && array_key_exists('extends',$theme_info)) {
$parent = $theme_info['extends']; $parent = $theme_info['extends'];
} else { } else {
$parent = 'NOPATH'; $parent = 'NOPATH';

View file

@ -2,13 +2,14 @@
use Friendica\App; use Friendica\App;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Util\Lock;
if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) { if (!file_exists("boot.php") && (sizeof($_SERVER["argv"]) != 0)) {
$directory = dirname($_SERVER["argv"][0]); $directory = dirname($_SERVER["argv"][0]);
if (substr($directory, 0, 1) != "/") if (substr($directory, 0, 1) != "/") {
$directory = $_SERVER["PWD"]."/".$directory; $directory = $_SERVER["PWD"]."/".$directory;
}
$directory = realpath($directory."/.."); $directory = realpath($directory."/..");
chdir($directory); chdir($directory);
@ -17,18 +18,16 @@ if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) {
require_once("boot.php"); require_once("boot.php");
function poller_run($argv, $argc){ function poller_run($argv, $argc){
global $a, $db; global $a, $db, $poller_up_start, $poller_db_duration;
$poller_up_start = microtime(true);
if (is_null($a)) {
$a = new App(dirname(__DIR__)); $a = new App(dirname(__DIR__));
}
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(); Config::load();
@ -41,40 +40,86 @@ function poller_run($argv, $argc){
load_hooks(); load_hooks();
// At first check the maximum load. We shouldn't continue with a high load
if ($a->maxload_reached()) {
logger('Pre check: maximum load reached, quitting.', LOGGER_DEBUG);
return;
}
// We now start the process. This is done after the load check since this could increase the load.
$a->start_process(); $a->start_process();
if ($a->min_memory_reached()) { // Kill stale processes every 5 minutes
return; $last_cleanup = Config::get('system', 'poller_last_cleaned', 0);
} if (time() > ($last_cleanup + 300)) {
Config::set('system', 'poller_last_cleaned', time());
if (poller_max_connections_reached()) {
return;
}
if ($a->maxload_reached()) {
return;
}
if (($argc <= 1) OR ($argv[1] != "no_cron")) {
poller_run_cron();
}
if ($a->max_processes_reached()) {
return;
}
// Checking the number of workers
if (poller_too_much_workers()) {
poller_kill_stale_workers(); poller_kill_stale_workers();
}
// Count active workers and compare them with a maximum value that depends on the load
if (poller_too_much_workers()) {
logger('Pre check: Active worker limit reached, quitting.', LOGGER_DEBUG);
return; return;
} }
// Do we have too few memory?
if ($a->min_memory_reached()) {
logger('Pre check: Memory limit reached, quitting.', LOGGER_DEBUG);
return;
}
// Possibly there are too much database connections
if (poller_max_connections_reached()) {
logger('Pre check: maximum connections reached, quitting.', LOGGER_DEBUG);
return;
}
// Possibly there are too much database processes that block the system
if ($a->max_processes_reached()) {
logger('Pre check: maximum processes reached, quitting.', LOGGER_DEBUG);
return;
}
// Now we start additional cron processes if we should do so
if (($argc <= 1) || ($argv[1] != "no_cron")) {
poller_run_cron();
}
$starttime = time(); $starttime = time();
while ($r = poller_worker_process()) { // We fetch the next queue entry that is about to be executed
while ($r = poller_worker_process($passing_slow)) {
if (!poller_claim_process($r[0])) { // When we are processing jobs with a lower priority, we don't refetch new jobs
continue; // Otherwise fast jobs could wait behind slow ones and could be blocked.
$refetched = $passing_slow;
foreach ($r AS $entry) {
// Assure that the priority is an integer value
$entry['priority'] = (int)$entry['priority'];
// The work will be done
if (!poller_execute($entry)) {
logger('Process execution failed, quitting.', LOGGER_DEBUG);
return;
}
// If possible we will fetch new jobs for this worker
if (!$refetched && Lock::set('poller_worker_process', 0)) {
$stamp = (float)microtime(true);
$refetched = find_worker_processes($passing_slow);
$poller_db_duration += (microtime(true) - $stamp);
Lock::remove('poller_worker_process');
}
}
// To avoid the quitting of multiple pollers only one poller at a time will execute the check
if (Lock::set('poller_worker', 0)) {
$stamp = (float)microtime(true);
// Count active workers and compare them with a maximum value that depends on the load
if (poller_too_much_workers()) {
logger('Active worker limit reached, quitting.', LOGGER_DEBUG);
return;
} }
// Check free memory // Check free memory
@ -82,27 +127,60 @@ function poller_run($argv, $argc){
logger('Memory limit reached, quitting.', LOGGER_DEBUG); logger('Memory limit reached, quitting.', LOGGER_DEBUG);
return; return;
} }
Lock::remove('poller_worker');
// Count active workers and compare them with a maximum value that depends on the load $poller_db_duration += (microtime(true) - $stamp);
if (poller_too_much_workers()) {
logger('Active worker limit reached, quitting.', LOGGER_DEBUG);
return;
} }
if (!poller_execute($r[0])) { // Quit the poller once every 5 minutes
logger('Process execution failed, quitting.', LOGGER_DEBUG); if (time() > ($starttime + 300)) {
return; logger('Process lifetime reached, quitting.', LOGGER_DEBUG);
}
// Quit the poller once every hour
if (time() > ($starttime + 3600)) {
logger('Process lifetime reachted, quitting.', LOGGER_DEBUG);
return; return;
} }
} }
logger("Couldn't select a workerqueue entry, quitting.", LOGGER_DEBUG); logger("Couldn't select a workerqueue entry, quitting.", LOGGER_DEBUG);
} }
/**
* @brief Returns the number of non executed entries in the worker queue
*
* @return integer Number of non executed entries in the worker queue
*/
function poller_total_entries() {
$s = q("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE `executed` <= '%s' AND NOT `done`", dbesc(NULL_DATE));
if (dbm::is_result($s)) {
return $s[0]["total"];
} else {
return 0;
}
}
/**
* @brief Returns the highest priority in the worker queue that isn't executed
*
* @return integer Number of active poller processes
*/
function poller_highest_priority() {
$s = q("SELECT `priority` FROM `workerqueue` WHERE `executed` <= '%s' AND NOT `done` ORDER BY `priority` LIMIT 1", dbesc(NULL_DATE));
if (dbm::is_result($s)) {
return $s[0]["priority"];
} else {
return 0;
}
}
/**
* @brief Returns if a process with the given priority is running
*
* @param integer $priority The priority that should be checked
*
* @return integer Is there a process running with that priority?
*/
function poller_process_with_priority_active($priority) {
$s = q("SELECT `id` FROM `workerqueue` WHERE `priority` <= %d AND `executed` > '%s' AND NOT `done` LIMIT 1",
intval($priority), dbesc(NULL_DATE));
return dbm::is_result($s);
}
/** /**
* @brief Execute a worker entry * @brief Execute a worker entry
* *
@ -111,6 +189,7 @@ function poller_run($argv, $argc){
* @return boolean "true" if further processing should be stopped * @return boolean "true" if further processing should be stopped
*/ */
function poller_execute($queue) { function poller_execute($queue) {
global $poller_db_duration, $poller_last_update;
$a = get_app(); $a = get_app();
@ -151,10 +230,28 @@ function poller_execute($queue) {
if (function_exists($funcname)) { if (function_exists($funcname)) {
// We constantly update the "executed" date every minute to avoid being killed too soon
if (!isset($poller_last_update)) {
$poller_last_update = strtotime($queue["executed"]);
}
$age = (time() - $poller_last_update) / 60;
$poller_last_update = time();
if ($age > 1) {
$stamp = (float)microtime(true);
dba::update('workerqueue', array('executed' => datetime_convert()), array('pid' => $mypid, 'done' => false));
$poller_db_duration += (microtime(true) - $stamp);
}
poller_exec_function($queue, $funcname, $argv); poller_exec_function($queue, $funcname, $argv);
dba::delete('workerqueue', array('id' => $queue["id"]));
$stamp = (float)microtime(true);
dba::update('workerqueue', array('done' => true), array('id' => $queue["id"]));
$poller_db_duration = (microtime(true) - $stamp);
} else { } else {
logger("Function ".$funcname." does not exist"); logger("Function ".$funcname." does not exist");
dba::delete('workerqueue', array('id' => $queue["id"]));
} }
return true; return true;
@ -168,6 +265,7 @@ function poller_execute($queue) {
* @param array $argv Array of values to be passed to the function * @param array $argv Array of values to be passed to the function
*/ */
function poller_exec_function($queue, $funcname, $argv) { function poller_exec_function($queue, $funcname, $argv) {
global $poller_up_start, $poller_db_duration, $poller_lock_duration;
$a = get_app(); $a = get_app();
@ -198,13 +296,30 @@ function poller_exec_function($queue, $funcname, $argv) {
// But preserve the old one for the worker // But preserve the old one for the worker
$old_process_id = $a->process_id; $old_process_id = $a->process_id;
$a->process_id = uniqid("wrk", true); $a->process_id = uniqid("wrk", true);
$a->queue = $queue;
$up_duration = number_format(microtime(true) - $poller_up_start, 3);
$funcname($argv, $argc); $funcname($argv, $argc);
$a->process_id = $old_process_id; $a->process_id = $old_process_id;
unset($a->queue);
$duration = number_format(microtime(true) - $stamp, 3); $duration = number_format(microtime(true) - $stamp, 3);
$poller_up_start = microtime(true);
/* With these values we can analyze how effective the worker is.
* The database and rest time should be low since this is the unproductive time.
* The execution time is the productive time.
* By changing parameters like the maximum number of workers we can check the effectivness.
*/
logger('DB: '.number_format($poller_db_duration, 2).
' - Lock: '.number_format($poller_lock_duration, 2).
' - Rest: '.number_format($up_duration - $poller_db_duration - $poller_lock_duration, 2).
' - Execution: '.number_format($duration, 2), LOGGER_DEBUG);
$poller_lock_duration = 0;
if ($duration > 3600) { if ($duration > 3600) {
logger("Prio ".$queue["priority"].": ".$queue["parameter"]." - longer than 1 hour (".round($duration/60, 3).")", LOGGER_DEBUG); logger("Prio ".$queue["priority"].": ".$queue["parameter"]." - longer than 1 hour (".round($duration/60, 3).")", LOGGER_DEBUG);
} elseif ($duration > 600) { } elseif ($duration > 600) {
@ -226,26 +341,29 @@ function poller_exec_function($queue, $funcname, $argv) {
$o = "\nDatabase Read:\n"; $o = "\nDatabase Read:\n";
foreach ($a->callstack["database"] AS $func => $time) { foreach ($a->callstack["database"] AS $func => $time) {
$time = round($time, 3); $time = round($time, 3);
if ($time > 0) if ($time > 0) {
$o .= $func.": ".$time."\n"; $o .= $func.": ".$time."\n";
} }
} }
}
if (isset($a->callstack["database_write"])) { if (isset($a->callstack["database_write"])) {
$o .= "\nDatabase Write:\n"; $o .= "\nDatabase Write:\n";
foreach ($a->callstack["database_write"] AS $func => $time) { foreach ($a->callstack["database_write"] AS $func => $time) {
$time = round($time, 3); $time = round($time, 3);
if ($time > 0) if ($time > 0) {
$o .= $func.": ".$time."\n"; $o .= $func.": ".$time."\n";
} }
} }
}
if (isset($a->callstack["network"])) { if (isset($a->callstack["network"])) {
$o .= "\nNetwork:\n"; $o .= "\nNetwork:\n";
foreach ($a->callstack["network"] AS $func => $time) { foreach ($a->callstack["network"] AS $func => $time) {
$time = round($time, 3); $time = round($time, 3);
if ($time > 0) if ($time > 0) {
$o .= $func.": ".$time."\n"; $o .= $func.": ".$time."\n";
} }
} }
}
} else { } else {
$o = ''; $o = '';
} }
@ -284,27 +402,30 @@ function poller_max_connections_reached() {
if ($max == 0) { if ($max == 0) {
// the maximum number of possible user connections can be a system variable // the maximum number of possible user connections can be a system variable
$r = q("SHOW VARIABLES WHERE `variable_name` = 'max_user_connections'"); $r = q("SHOW VARIABLES WHERE `variable_name` = 'max_user_connections'");
if ($r) if (dbm::is_result($r)) {
$max = $r[0]["Value"]; $max = $r[0]["Value"];
}
// Or it can be granted. This overrides the system variable // Or it can be granted. This overrides the system variable
$r = q("SHOW GRANTS"); $r = q("SHOW GRANTS");
if ($r) if (dbm::is_result($r)) {
foreach ($r AS $grants) { foreach ($r AS $grants) {
$grant = array_pop($grants); $grant = array_pop($grants);
if (stristr($grant, "GRANT USAGE ON")) if (stristr($grant, "GRANT USAGE ON")) {
if (preg_match("/WITH MAX_USER_CONNECTIONS (\d*)/", $grant, $match)) if (preg_match("/WITH MAX_USER_CONNECTIONS (\d*)/", $grant, $match)) {
$max = $match[1]; $max = $match[1];
} }
} }
}
}
}
// If $max is set we will use the processlist to determine the current number of connections // If $max is set we will use the processlist to determine the current number of connections
// The processlist only shows entries of the current user // The processlist only shows entries of the current user
if ($max != 0) { if ($max != 0) {
$r = q("SHOW PROCESSLIST"); $r = q("SHOW PROCESSLIST");
if (!dbm::is_result($r)) if (!dbm::is_result($r)) {
return false; return false;
}
$used = count($r); $used = count($r);
logger("Connection usage (user values): ".$used."/".$max, LOGGER_DEBUG); logger("Connection usage (user values): ".$used."/".$max, LOGGER_DEBUG);
@ -320,28 +441,28 @@ function poller_max_connections_reached() {
// We will now check for the system values. // We will now check for the system values.
// This limit could be reached although the user limits are fine. // This limit could be reached although the user limits are fine.
$r = q("SHOW VARIABLES WHERE `variable_name` = 'max_connections'"); $r = q("SHOW VARIABLES WHERE `variable_name` = 'max_connections'");
if (!$r) if (!dbm::is_result($r)) {
return false; return false;
}
$max = intval($r[0]["Value"]); $max = intval($r[0]["Value"]);
if ($max == 0) if ($max == 0) {
return false; return false;
}
$r = q("SHOW STATUS WHERE `variable_name` = 'Threads_connected'"); $r = q("SHOW STATUS WHERE `variable_name` = 'Threads_connected'");
if (!$r) if (!dbm::is_result($r)) {
return false; return false;
}
$used = intval($r[0]["Value"]); $used = intval($r[0]["Value"]);
if ($used == 0) if ($used == 0) {
return false; return false;
}
logger("Connection usage (system values): ".$used."/".$max, LOGGER_DEBUG); logger("Connection usage (system values): ".$used."/".$max, LOGGER_DEBUG);
$level = $used / $max * 100; $level = $used / $max * 100;
if ($level < $maxlevel) if ($level < $maxlevel) {
return false; return false;
}
logger("Maximum level (".$level."%) of system connections reached: ".$used."/".$max); logger("Maximum level (".$level."%) of system connections reached: ".$used."/".$max);
return true; return true;
} }
@ -351,46 +472,47 @@ 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` > '%s'", dbesc(NULL_DATE)); $entries = dba::p("SELECT `id`, `pid`, `executed`, `priority`, `parameter` FROM `workerqueue` WHERE `executed` > ? AND NOT `done` AND `pid` != 0 ORDER BY `priority`, `created`", NULL_DATE);
if (!dbm::is_result($r)) { while ($entry = dba::fetch($entries)) {
// No processing here needed if (!posix_kill($entry["pid"], 0)) {
return;
}
foreach ($r AS $pid) {
if (!posix_kill($pid["pid"], 0)) {
dba::update('workerqueue', array('executed' => NULL_DATE, 'pid' => 0), dba::update('workerqueue', array('executed' => NULL_DATE, 'pid' => 0),
array('pid' => $pid["pid"])); array('id' => $entry["id"]));
} 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
if (!in_array($pid["priority"], array(PRIORITY_CRITICAL, PRIORITY_HIGH, PRIORITY_MEDIUM, PRIORITY_LOW, PRIORITY_NEGLIGIBLE))) { if (!in_array($entry["priority"], array(PRIORITY_CRITICAL, PRIORITY_HIGH, PRIORITY_MEDIUM, PRIORITY_LOW, PRIORITY_NEGLIGIBLE))) {
$pid["priority"] = PRIORITY_MEDIUM; $entry["priority"] = PRIORITY_MEDIUM;
} }
// Define the maximum durations // Define the maximum durations
$max_duration_defaults = array(PRIORITY_CRITICAL => 360, PRIORITY_HIGH => 10, PRIORITY_MEDIUM => 60, PRIORITY_LOW => 180, PRIORITY_NEGLIGIBLE => 360); $max_duration_defaults = array(PRIORITY_CRITICAL => 720, PRIORITY_HIGH => 10, PRIORITY_MEDIUM => 60, PRIORITY_LOW => 180, PRIORITY_NEGLIGIBLE => 720);
$max_duration = $max_duration_defaults[$pid["priority"]]; $max_duration = $max_duration_defaults[$entry["priority"]];
$argv = json_decode($pid["parameter"]); $argv = json_decode($entry["parameter"]);
$argv[0] = basename($argv[0]); $argv[0] = basename($argv[0]);
// How long is the process already running? // How long is the process already running?
$duration = (time() - strtotime($pid["executed"])) / 60; $duration = (time() - strtotime($entry["executed"])) / 60;
if ($duration > $max_duration) { if ($duration > $max_duration) {
logger("Worker process ".$pid["pid"]." (".implode(" ", $argv).") took more than ".$max_duration." minutes. It will be killed now."); logger("Worker process ".$entry["pid"]." (".implode(" ", $argv).") took more than ".$max_duration." minutes. It will be killed now.");
posix_kill($pid["pid"], SIGTERM); posix_kill($entry["pid"], SIGTERM);
// 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. (But not PRIORITY_CRITICAL)
if ($entry["priority"] == PRIORITY_HIGH) {
$new_priority = PRIORITY_MEDIUM;
} elseif ($entry["priority"] == PRIORITY_MEDIUM) {
$new_priority = PRIORITY_LOW;
} elseif ($entry["priority"] != PRIORITY_CRITICAL) {
$new_priority = PRIORITY_NEGLIGIBLE;
}
dba::update('workerqueue', dba::update('workerqueue',
array('executed' => NULL_DATE, 'created' => datetime_convert(), 'priority' => PRIORITY_NEGLIGIBLE, 'pid' => 0), array('executed' => NULL_DATE, 'created' => datetime_convert(), 'priority' => $new_priority, 'pid' => 0),
array('pid' => $pid["pid"])); array('id' => $entry["id"]));
} 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 ".$entry["pid"]." (".implode(" ", $argv).") now runs for ".round($duration)." of ".$max_duration." allowed minutes. That's okay.", LOGGER_DEBUG);
} }
} }
} }
@ -420,20 +542,23 @@ 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));
if (Config::get('system', 'worker_debug')) {
// Create a list of queue entries grouped by their priority // Create a list of queue entries grouped by their priority
$listitem = array(); $listitem = array();
// Adding all processes with no workerqueue entry // Adding all processes with no workerqueue entry
$processes = dba::p("SELECT COUNT(*) AS `running` FROM `process` WHERE NOT EXISTS (SELECT id FROM `workerqueue` WHERE `workerqueue`.`pid` = `process`.`pid`)"); $processes = dba::p("SELECT COUNT(*) AS `running` FROM `process` WHERE NOT EXISTS
(SELECT id FROM `workerqueue`
WHERE `workerqueue`.`pid` = `process`.`pid` AND NOT `done` AND `pid` != ?)", getmypid());
if ($process = dba::fetch($processes)) { if ($process = dba::fetch($processes)) {
$listitem[0] = "0:".$process["running"]; $listitem[0] = "0:".$process["running"];
} }
dba::close($processes); dba::close($processes);
// Now adding all processes with workerqueue entries // Now adding all processes with workerqueue entries
$entries = dba::p("SELECT COUNT(*) AS `entries`, `priority` FROM `workerqueue` GROUP BY `priority`"); $entries = dba::p("SELECT COUNT(*) AS `entries`, `priority` FROM `workerqueue` WHERE NOT `done` GROUP BY `priority`");
while ($entry = dba::fetch($entries)) { while ($entry = dba::fetch($entries)) {
$processes = dba::p("SELECT COUNT(*) AS `running` FROM `process` INNER JOIN `workerqueue` ON `workerqueue`.`pid` = `process`.`pid` WHERE `priority` = ?", $entry["priority"]); $processes = dba::p("SELECT COUNT(*) AS `running` FROM `process` INNER JOIN `workerqueue` ON `workerqueue`.`pid` = `process`.`pid` AND NOT `done` WHERE `priority` = ?", $entry["priority"]);
if ($process = dba::fetch($processes)) { if ($process = dba::fetch($processes)) {
$listitem[$entry["priority"]] = $entry["priority"].":".$process["running"]."/".$entry["entries"]; $listitem[$entry["priority"]] = $entry["priority"].":".$process["running"]."/".$entry["entries"];
} }
@ -441,37 +566,41 @@ function poller_too_much_workers() {
} }
dba::close($entries); dba::close($entries);
$processlist = implode(', ', $listitem); $intervals = array(1, 10, 60);
$jobs_per_minute = array();
foreach ($intervals AS $interval) {
$jobs = dba::p("SELECT COUNT(*) AS `jobs` FROM `workerqueue` WHERE `done` AND `executed` > UTC_TIMESTAMP() - INTERVAL ".intval($interval)." MINUTE");
if ($job = dba::fetch($jobs)) {
$jobs_per_minute[$interval] = number_format($job['jobs'] / $interval, 0);
}
dba::close($jobs);
}
$processlist = ' - jpm: '.implode('/', $jobs_per_minute).' ('.implode(', ', $listitem).')';
}
$s = q("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE `executed` <= '%s'", dbesc(NULL_DATE)); $entries = poller_total_entries();
$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) && ($queues > 0) && ($entries > 0) && ($active >= $queues)) {
$s = q("SELECT `priority` FROM `workerqueue` WHERE `executed` <= '%s' ORDER BY `priority` LIMIT 1", dbesc(NULL_DATE)); $top_priority = poller_highest_priority();
$top_priority = $s[0]["priority"]; $high_running = poller_process_with_priority_active($top_priority);
$s = q("SELECT `id` FROM `workerqueue` WHERE `priority` <= %d AND `executed` > '%s' LIMIT 1", if (!$high_running && ($top_priority > PRIORITY_UNDEFINED) && ($top_priority < PRIORITY_NEGLIGIBLE)) {
intval($top_priority), dbesc(NULL_DATE));
$high_running = dbm::is_result($s);
if (!$high_running AND ($top_priority > PRIORITY_UNDEFINED) AND ($top_priority < PRIORITY_NEGLIGIBLE)) {
logger("There are jobs with priority ".$top_priority." waiting but none is executed. Open a fastlane.", LOGGER_DEBUG); logger("There are jobs with priority ".$top_priority." waiting but none is executed. Open a fastlane.", LOGGER_DEBUG);
$queues = $active + 1; $queues = $active + 1;
} }
} }
logger("Load: ".$load."/".$maxsysload." - processes: ".$active."/".$entries." (".$processlist.") - maximum: ".$queues."/".$maxqueues, LOGGER_DEBUG); logger("Load: ".$load."/".$maxsysload." - processes: ".$active."/".$entries.$processlist." - maximum: ".$queues."/".$maxqueues, LOGGER_DEBUG);
// 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") && ($queues > ($active + 1)) && ($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("include/poller.php", "no_cron"); $args = array("include/poller.php", "no_cron");
$a = get_app(); get_app()->proc_run($args);
$a->proc_run($args);
} }
} }
return($active >= $queues); return $active >= $queues;
} }
/** /**
@ -482,7 +611,7 @@ function poller_too_much_workers() {
function poller_active_workers() { function poller_active_workers() {
$workers = q("SELECT COUNT(*) AS `processes` FROM `process` WHERE `command` = 'poller.php'"); $workers = q("SELECT COUNT(*) AS `processes` FROM `process` WHERE `command` = 'poller.php'");
return($workers[0]["processes"]); return $workers[0]["processes"];
} }
/** /**
@ -500,124 +629,157 @@ function poller_passing_slow(&$highest_priority) {
$r = q("SELECT `priority` $r = q("SELECT `priority`
FROM `process` FROM `process`
INNER JOIN `workerqueue` ON `workerqueue`.`pid` = `process`.`pid`"); INNER JOIN `workerqueue` ON `workerqueue`.`pid` = `process`.`pid` AND NOT `done`");
// No active processes at all? Fine // No active processes at all? Fine
if (!dbm::is_result($r)) if (!dbm::is_result($r)) {
return(false); return false;
}
$priorities = array(); $priorities = array();
foreach ($r AS $line) foreach ($r AS $line) {
$priorities[] = $line["priority"]; $priorities[] = $line["priority"];
}
// Should not happen // Should not happen
if (count($priorities) == 0) if (count($priorities) == 0) {
return(false); return false;
}
$highest_priority = min($priorities); $highest_priority = min($priorities);
// The highest process is already the slowest one? // The highest process is already the slowest one?
// Then we quit // Then we quit
if ($highest_priority == PRIORITY_NEGLIGIBLE) if ($highest_priority == PRIORITY_NEGLIGIBLE) {
return(false); return false;
}
$high = 0; $high = 0;
foreach ($priorities AS $priority) foreach ($priorities AS $priority) {
if ($priority == $highest_priority) if ($priority == $highest_priority) {
++$high; ++$high;
}
}
logger("Highest priority: ".$highest_priority." Total processes: ".count($priorities)." Count high priority processes: ".$high, LOGGER_DEBUG); logger("Highest priority: ".$highest_priority." Total processes: ".count($priorities)." Count high priority processes: ".$high, LOGGER_DEBUG);
$passing_slow = (($high/count($priorities)) > (2/3)); $passing_slow = (($high/count($priorities)) > (2/3));
if ($passing_slow) if ($passing_slow) {
logger("Passing slower processes than priority ".$highest_priority, LOGGER_DEBUG); logger("Passing slower processes than priority ".$highest_priority, LOGGER_DEBUG);
}
return $passing_slow;
}
return($passing_slow); /**
* @brief Find and claim the next worker process for us
*
* @param boolean $passing_slow Returns if we had passed low priority processes
* @return boolean Have we found something?
*/
function find_worker_processes(&$passing_slow) {
$mypid = getmypid();
// Check if we should pass some low priority process
$highest_priority = 0;
$found = false;
$passing_slow = false;
// The higher the number of parallel workers, the more we prefetch to prevent concurring access
// We decrease the limit with the number of entries left in the queue
$worker_queues = Config::get("system", "worker_queues", 4);
$queue_length = Config::get('system', 'worker_fetch_limit', $worker_queues);
$lower_job_limit = $worker_queues * $queue_length * 2;
$jobs = poller_total_entries();
// Now do some magic
$exponent = 2;
$slope = $queue_length / pow($lower_job_limit, $exponent);
$limit = min($queue_length, ceil($slope * pow($jobs, $exponent)));
logger('Total: '.$jobs.' - Maximum: '.$queue_length.' - jobs per queue: '.$limit, LOGGER_DEBUG);
if (poller_passing_slow($highest_priority)) {
// Are there waiting processes with a higher priority than the currently highest?
$result = dba::p("SELECT `id` FROM `workerqueue`
WHERE `executed` <= ? AND `priority` < ? AND NOT `done`
ORDER BY `priority`, `created` LIMIT ".intval($limit),
NULL_DATE, $highest_priority);
while ($id = dba::fetch($result)) {
$ids[] = $id["id"];
}
dba::close($result);
$found = (count($ids) > 0);
if (!$found) {
// Give slower processes some processing time
$result = dba::p("SELECT `id` FROM `workerqueue`
WHERE `executed` <= ? AND `priority` > ? AND NOT `done`
ORDER BY `priority`, `created` LIMIT ".intval($limit),
NULL_DATE, $highest_priority);
while ($id = dba::fetch($result)) {
$ids[] = $id["id"];
}
dba::close($result);
$found = (count($ids) > 0);
$passing_slow = $found;
}
}
// If there is no result (or we shouldn't pass lower processes) we check without priority limit
if (!$found) {
$result = dba::p("SELECT `id` FROM `workerqueue` WHERE `executed` <= ? AND NOT `done` ORDER BY `priority`, `created` LIMIT ".intval($limit), NULL_DATE);
while ($id = dba::fetch($result)) {
$ids[] = $id["id"];
}
dba::close($result);
$found = (count($ids) > 0);
}
if ($found) {
$sql = "UPDATE `workerqueue` SET `executed` = ?, `pid` = ? WHERE `id` IN (".substr(str_repeat("?, ", count($ids)), 0, -2).") AND `pid` = 0 AND NOT `done`;";
array_unshift($ids, datetime_convert(), $mypid);
dba::e($sql, $ids);
}
return $found;
} }
/** /**
* @brief Returns the next worker process * @brief Returns the next worker process
* *
* @param boolean $passing_slow Returns if we had passed low priority processes
* @return string SQL statement * @return string SQL statement
*/ */
function poller_worker_process() { function poller_worker_process(&$passing_slow) {
global $poller_db_duration, $poller_lock_duration;
// Check if we should pass some low priority process $stamp = (float)microtime(true);
$highest_priority = 0;
if (poller_passing_slow($highest_priority)) { // There can already be jobs for us in the queue.
dba::e('LOCK TABLES `workerqueue` WRITE'); $r = q("SELECT * FROM `workerqueue` WHERE `pid` = %d AND NOT `done`", intval(getmypid()));
// Are there waiting processes with a higher priority than the currently highest?
$r = q("SELECT * FROM `workerqueue`
WHERE `executed` <= '%s' AND `priority` < %d
ORDER BY `priority`, `created` LIMIT 1",
dbesc(NULL_DATE),
intval($highest_priority));
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
return $r; $poller_db_duration += (microtime(true) - $stamp);
}
// Give slower processes some processing time
$r = q("SELECT * FROM `workerqueue`
WHERE `executed` <= '%s' AND `priority` > %d
ORDER BY `priority`, `created` LIMIT 1",
dbesc(NULL_DATE),
intval($highest_priority));
if (dbm::is_result($r)) {
return $r;
}
} else {
dba::e('LOCK TABLES `workerqueue` WRITE');
}
// If there is no result (or we shouldn't pass lower processes) we check without priority limit
if (!dbm::is_result($r)) {
$r = q("SELECT * FROM `workerqueue` WHERE `executed` <= '%s' ORDER BY `priority`, `created` LIMIT 1", dbesc(NULL_DATE));
}
// We only unlock the tables here, when we got no data
if (!dbm::is_result($r)) {
dba::e('UNLOCK TABLES');
}
return $r; return $r;
} }
/** $stamp = (float)microtime(true);
* @brief Assigns a workerqueue entry to the current process if (!Lock::set('poller_worker_process')) {
*
* When we are sure that the table locks are working correctly, we can remove the checks from here
*
* @param array $queue Workerqueue entry
*
* @return boolean "true" if the claiming was successful
*/
function poller_claim_process($queue) {
$mypid = getmypid();
$success = dba::update('workerqueue', array('executed' => datetime_convert(), 'pid' => $mypid),
array('id' => $queue["id"], 'pid' => 0));
dba::e('UNLOCK TABLES');
if (!$success) {
logger("Couldn't update queue entry ".$queue["id"]." - skip this execution", LOGGER_DEBUG);
return false; return false;
} }
$poller_lock_duration = (microtime(true) - $stamp);
// Assure that there are no tasks executed twice $stamp = (float)microtime(true);
$id = q("SELECT `pid`, `executed` FROM `workerqueue` WHERE `id` = %d", intval($queue["id"])); $found = find_worker_processes($passing_slow);
if (!$id) { $poller_db_duration += (microtime(true) - $stamp);
logger("Queue item ".$queue["id"]." vanished - skip this execution", LOGGER_DEBUG);
return false; Lock::remove('poller_worker_process');
} elseif ((strtotime($id[0]["executed"]) <= 0) OR ($id[0]["pid"] == 0)) {
logger("Entry for queue item ".$queue["id"]." wasn't stored - skip this execution", LOGGER_DEBUG); if ($found) {
return false; $r = q("SELECT * FROM `workerqueue` WHERE `pid` = %d AND NOT `done`", intval(getmypid()));
} elseif ($id[0]["pid"] != $mypid) {
logger("Queue item ".$queue["id"]." is to be executed by process ".$id[0]["pid"]." and not by me (".$mypid.") - skip this execution", LOGGER_DEBUG);
return false;
} }
return true; return $r;
} }
/** /**
@ -626,7 +788,7 @@ function poller_claim_process($queue) {
function poller_unclaim_process() { function poller_unclaim_process() {
$mypid = getmypid(); $mypid = getmypid();
dba::update('workerqueue', array('executed' => NULL_DATE, 'pid' => 0), array('pid' => $mypid)); dba::update('workerqueue', array('executed' => NULL_DATE, 'pid' => 0), array('pid' => $mypid, 'done' => false));
} }
/** /**
@ -673,8 +835,7 @@ function call_worker_if_idle() {
logger('Call poller', LOGGER_DEBUG); logger('Call poller', LOGGER_DEBUG);
$args = array("include/poller.php", "no_cron"); $args = array("include/poller.php", "no_cron");
$a = get_app(); get_app()->proc_run($args);
$a->proc_run($args);
return; return;
} }

View file

@ -45,7 +45,7 @@ function post_update_1192() {
WHERE `thread`.`gcontact-id` = 0 AND WHERE `thread`.`gcontact-id` = 0 AND
(`thread`.`uid` IN (SELECT `uid` from `user`) OR `thread`.`uid` = 0)"); (`thread`.`uid` IN (SELECT `uid` from `user`) OR `thread`.`uid` = 0)");
if ($r AND ($r[0]["total"] == 0)) { if ($r && ($r[0]["total"] == 0)) {
set_config("system", "post_update_version", 1192); set_config("system", "post_update_version", 1192);
return true; return true;
} }
@ -171,7 +171,7 @@ function post_update_1198() {
WHERE `thread`.`author-id` = 0 AND `thread`.`owner-id` = 0 AND WHERE `thread`.`author-id` = 0 AND `thread`.`owner-id` = 0 AND
(`thread`.`uid` IN (SELECT `uid` from `user`) OR `thread`.`uid` = 0)"); (`thread`.`uid` IN (SELECT `uid` from `user`) OR `thread`.`uid` = 0)");
if ($r AND ($r[0]["total"] == 0)) { if ($r && ($r[0]["total"] == 0)) {
set_config("system", "post_update_version", 1198); set_config("system", "post_update_version", 1198);
logger("Done", LOGGER_DEBUG); logger("Done", LOGGER_DEBUG);
return true; return true;
@ -247,7 +247,7 @@ function post_update_1206() {
return false; return false;
} }
foreach ($r AS $user) { foreach ($r AS $user) {
if (!empty($user["lastitem_date"]) AND ($user["lastitem_date"] > $user["last-item"])) { if (!empty($user["lastitem_date"]) && ($user["lastitem_date"] > $user["last-item"])) {
q("UPDATE `contact` SET `last-item` = '%s' WHERE `id` = %d", q("UPDATE `contact` SET `last-item` = '%s' WHERE `id` = %d",
dbesc($user["lastitem_date"]), dbesc($user["lastitem_date"]),
intval($user["id"])); intval($user["id"]));

View file

@ -7,6 +7,7 @@ require_once('include/items.php');
require_once('include/ostatus.php'); require_once('include/ostatus.php');
function pubsubpublish_run(&$argv, &$argc){ function pubsubpublish_run(&$argv, &$argc){
global $a;
if ($argc > 1) { if ($argc > 1) {
$pubsubpublish_id = intval($argv[1]); $pubsubpublish_id = intval($argv[1]);
@ -17,7 +18,8 @@ function pubsubpublish_run(&$argv, &$argc){
foreach ($r as $rr) { foreach ($r as $rr) {
logger("Publish feed to ".$rr["callback_url"], LOGGER_DEBUG); logger("Publish feed to ".$rr["callback_url"], LOGGER_DEBUG);
proc_run(PRIORITY_HIGH, 'include/pubsubpublish.php', $rr["id"]); proc_run(array('priority' => PRIORITY_HIGH, 'created' => $a->queue['created'], 'dont_fork' => true),
'include/pubsubpublish.php', (int)$rr["id"]);
} }
} }

View file

@ -2,13 +2,13 @@
use Friendica\Core\Config; use Friendica\Core\Config;
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/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/socgraph.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; global $a;
@ -27,7 +27,7 @@ function queue_run(&$argv, &$argc){
logger('queue: start'); logger('queue: start');
// Handling the pubsubhubbub requests // Handling the pubsubhubbub requests
proc_run(PRIORITY_HIGH,'include/pubsubpublish.php'); proc_run(array('priority' => PRIORITY_HIGH, 'dont_fork' => true), 'include/pubsubpublish.php');
$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`
@ -41,17 +41,18 @@ function queue_run(&$argv, &$argc){
q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY"); q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
} }
// For the first 12 hours we'll try to deliver every 15 minutes /*
// After that, we'll only attempt delivery once per hour. * For the first 12 hours we'll try to deliver every 15 minutes
* 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 AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE) OR (`last` < UTC_TIMESTAMP() - INTERVAL 1 HOUR)) ORDER BY `cid`, `created`");
call_hooks('queue_predeliver', $a, $r); call_hooks('queue_predeliver', $a, $r);
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
foreach ($r as $q_item) { foreach ($r as $q_item) {
logger('Call queue for id '.$q_item['id']); logger('Call queue for id '.$q_item['id']);
proc_run(PRIORITY_LOW, "include/queue.php", $q_item['id']); proc_run(array('priority' => PRIORITY_LOW, 'dont_fork' => true), "include/queue.php", (int)$q_item['id']);
} }
} }
return; return;
@ -60,8 +61,8 @@ function queue_run(&$argv, &$argc){
// delivering // delivering
require_once('include/salmon.php'); require_once 'include/salmon.php';
require_once('include/diaspora.php'); require_once 'include/diaspora.php';
$r = q("SELECT * FROM `queue` WHERE `id` = %d LIMIT 1", $r = q("SELECT * FROM `queue` WHERE `id` = %d LIMIT 1",
intval($queue_id)); intval($queue_id));
@ -83,7 +84,7 @@ function queue_run(&$argv, &$argc){
$dead = Cache::get($cachekey_deadguy.$c[0]['notify']); $dead = Cache::get($cachekey_deadguy.$c[0]['notify']);
if (!is_null($dead) AND $dead) { if (!is_null($dead) && $dead) {
logger('queue: skipping known dead url: '.$c[0]['notify']); logger('queue: skipping known dead url: '.$c[0]['notify']);
update_queue_time($q_item['id']); update_queue_time($q_item['id']);
return; return;
@ -101,7 +102,7 @@ function queue_run(&$argv, &$argc){
Cache::set($cachekey_server.$server, $vital, CACHE_QUARTER_HOUR); Cache::set($cachekey_server.$server, $vital, CACHE_QUARTER_HOUR);
} }
if (!is_null($vital) AND !$vital) { if (!is_null($vital) && !$vital) {
logger('queue: skipping dead server: '.$server); logger('queue: skipping dead server: '.$server);
update_queue_time($q_item['id']); update_queue_time($q_item['id']);
return; return;

View file

@ -10,7 +10,7 @@ function convertquote($body, $reply)
$quoteline = $arrbody[$i]; $quoteline = $arrbody[$i];
while ((strlen($quoteline)>0) and ((substr($quoteline, 0, 1) == '>') while ((strlen($quoteline)>0) and ((substr($quoteline, 0, 1) == '>')
or (substr($quoteline, 0, 1) == ' '))) { || (substr($quoteline, 0, 1) == ' '))) {
if (substr($quoteline, 0, 1) == '>') if (substr($quoteline, 0, 1) == '>')
$quotelevel++; $quotelevel++;

View file

@ -170,11 +170,14 @@ function slapper($owner, $url, $slap) {
} }
logger('slapper for '.$url.' returned ' . $return_code); logger('slapper for '.$url.' returned ' . $return_code);
if (! $return_code) { if (! $return_code) {
return(-1); return -1;
} }
if (($return_code == 503) && (stristr($a->get_curl_headers(), 'retry-after'))) { if (($return_code == 503) && (stristr($a->get_curl_headers(), 'retry-after'))) {
return(-1); return -1;
} }
return ((($return_code >= 200) && ($return_code < 300)) ? 0 : 1); return ((($return_code >= 200) && ($return_code < 300)) ? 0 : 1);
} }

View file

@ -62,16 +62,17 @@ function authenticate_success($user_record, $login_initial = false, $interactive
$a->module = 'profile_photo'; $a->module = 'profile_photo';
info( t("Welcome ") . $a->user['username'] . EOL); info( t("Welcome ") . $a->user['username'] . EOL);
info( t('Please upload a profile photo.') . EOL); info( t('Please upload a profile photo.') . EOL);
} } else {
else
info( t("Welcome back ") . $a->user['username'] . EOL); info( t("Welcome back ") . $a->user['username'] . EOL);
} }
}
$member_since = strtotime($a->user['register_date']); $member_since = strtotime($a->user['register_date']);
if(time() < ($member_since + ( 60 * 60 * 24 * 14))) if (time() < ($member_since + ( 60 * 60 * 24 * 14))) {
$_SESSION['new_member'] = true; $_SESSION['new_member'] = true;
else } else {
$_SESSION['new_member'] = false; $_SESSION['new_member'] = false;
}
if (strlen($a->user['timezone'])) { if (strlen($a->user['timezone'])) {
date_default_timezone_set($a->user['timezone']); date_default_timezone_set($a->user['timezone']);
$a->timezone = $a->user['timezone']; $a->timezone = $a->user['timezone'];
@ -80,34 +81,40 @@ function authenticate_success($user_record, $login_initial = false, $interactive
$master_record = $a->user; $master_record = $a->user;
if ((x($_SESSION,'submanage')) && intval($_SESSION['submanage'])) { if ((x($_SESSION,'submanage')) && intval($_SESSION['submanage'])) {
$r = q("select * from user where uid = %d limit 1", $r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
intval($_SESSION['submanage']) intval($_SESSION['submanage'])
); );
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$master_record = $r[0]; $master_record = $r[0];
} }
}
$r = q("SELECT `uid`,`username`,`nickname` FROM `user` WHERE `password` = '%s' AND `email` = '%s' AND `account_removed` = 0 ", $r = q("SELECT `uid`,`username`,`nickname` FROM `user` WHERE `password` = '%s' AND `email` = '%s' AND `account_removed` = 0 ",
dbesc($master_record['password']), dbesc($master_record['password']),
dbesc($master_record['email']) dbesc($master_record['email'])
); );
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$a->identities = $r; $a->identities = $r;
else } else {
$a->identities = array(); $a->identities = array();
}
$r = q("select `user`.`uid`, `user`.`username`, `user`.`nickname` $r = q("SELECT `user`.`uid`, `user`.`username`, `user`.`nickname`
from manage INNER JOIN user on manage.mid = user.uid where `user`.`account_removed` = 0 FROM `manage`
and `manage`.`uid` = %d", INNER JOIN `user` ON `manage`.`mid` = `user`.`uid`
WHERE `user`.`account_removed` = 0 AND `manage`.`uid` = %d",
intval($master_record['uid']) intval($master_record['uid'])
); );
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$a->identities = array_merge($a->identities,$r); $a->identities = array_merge($a->identities,$r);
}
if($login_initial) if ($login_initial) {
logger('auth_identities: ' . print_r($a->identities,true), LOGGER_DEBUG); logger('auth_identities: ' . print_r($a->identities,true), LOGGER_DEBUG);
if($login_refresh) }
if ($login_refresh) {
logger('auth_identities refresh: ' . print_r($a->identities,true), LOGGER_DEBUG); logger('auth_identities refresh: ' . print_r($a->identities,true), LOGGER_DEBUG);
}
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1", $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",
intval($_SESSION['uid'])); intval($_SESSION['uid']));
@ -238,7 +245,6 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
* *
* default permissions - anonymous user * default permissions - anonymous user
*/ */
$sql = " AND allow_cid = '' $sql = " AND allow_cid = ''
AND allow_gid = '' AND allow_gid = ''
AND deny_cid = '' AND deny_cid = ''
@ -251,9 +257,8 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
if (($local_user) && ($local_user == $owner_id)) { if (($local_user) && ($local_user == $owner_id)) {
$sql = ''; $sql = '';
} } elseif ($remote_user) {
/*
/**
* Authenticated visitor. Unless pre-verified, * Authenticated visitor. Unless pre-verified,
* check that the contact belongs to this $owner_id * check that the contact belongs to this $owner_id
* and load the groups the visitor belongs to. * and load the groups the visitor belongs to.
@ -261,8 +266,6 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
* done this and passed the groups into this function. * done this and passed the groups into this function.
*/ */
elseif($remote_user) {
if (! $remote_verified) { if (! $remote_verified) {
$r = q("SELECT id FROM contact WHERE id = %d AND uid = %d AND blocked = 0 LIMIT 1", $r = q("SELECT id FROM contact WHERE id = %d AND uid = %d AND blocked = 0 LIMIT 1",
intval($remote_user), intval($remote_user),
@ -282,7 +285,9 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
$gs .= '|<' . intval($g) . '>'; $gs .= '|<' . intval($g) . '>';
} }
/*$sql = sprintf( /*
* @TODO old-lost code found?
$sql = sprintf(
" AND ( allow_cid = '' OR allow_cid REGEXP '<%d>' ) " AND ( allow_cid = '' OR allow_cid REGEXP '<%d>' )
AND ( deny_cid = '' OR NOT deny_cid REGEXP '<%d>' ) AND ( deny_cid = '' OR NOT deny_cid REGEXP '<%d>' )
AND ( allow_gid = '' OR allow_gid REGEXP '%s' ) AND ( allow_gid = '' OR allow_gid REGEXP '%s' )
@ -292,7 +297,8 @@ function permissions_sql($owner_id,$remote_verified = false,$groups = null) {
intval($remote_user), intval($remote_user),
dbesc($gs), dbesc($gs),
dbesc($gs) dbesc($gs)
);*/ );
*/
$sql = sprintf( $sql = sprintf(
" AND ( NOT (deny_cid REGEXP '<%d>' OR deny_gid REGEXP '%s') " AND ( NOT (deny_cid REGEXP '<%d>' OR deny_gid REGEXP '%s')
AND ( allow_cid REGEXP '<%d>' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') ) AND ( allow_cid REGEXP '<%d>' OR allow_gid REGEXP '%s' OR ( allow_cid = '' AND allow_gid = '') )
@ -319,7 +325,6 @@ function item_permissions_sql($owner_id,$remote_verified = false,$groups = null)
* *
* default permissions - anonymous user * default permissions - anonymous user
*/ */
$sql = " AND `item`.allow_cid = '' $sql = " AND `item`.allow_cid = ''
AND `item`.allow_gid = '' AND `item`.allow_gid = ''
AND `item`.deny_cid = '' AND `item`.deny_cid = ''
@ -330,21 +335,16 @@ function item_permissions_sql($owner_id,$remote_verified = false,$groups = null)
/** /**
* Profile owner - everything is visible * Profile owner - everything is visible
*/ */
if ($local_user && ($local_user == $owner_id)) { if ($local_user && ($local_user == $owner_id)) {
$sql = ''; $sql = '';
} } elseif ($remote_user) {
/*
/**
* Authenticated visitor. Unless pre-verified, * Authenticated visitor. Unless pre-verified,
* check that the contact belongs to this $owner_id * check that the contact belongs to this $owner_id
* and load the groups the visitor belongs to. * and load the groups the visitor belongs to.
* If pre-verified, the caller is expected to have already * If pre-verified, the caller is expected to have already
* done this and passed the groups into this function. * done this and passed the groups into this function.
*/ */
elseif($remote_user) {
if (! $remote_verified) { if (! $remote_verified) {
$r = q("SELECT id FROM contact WHERE id = %d AND uid = %d AND blocked = 0 LIMIT 1", $r = q("SELECT id FROM contact WHERE id = %d AND uid = %d AND blocked = 0 LIMIT 1",
intval($remote_user), intval($remote_user),
@ -360,9 +360,10 @@ function item_permissions_sql($owner_id,$remote_verified = false,$groups = null)
$gs = '<<>>'; // should be impossible to match $gs = '<<>>'; // should be impossible to match
if (is_array($groups) && count($groups)) { if (is_array($groups) && count($groups)) {
foreach($groups as $g) foreach ($groups as $g) {
$gs .= '|<' . intval($g) . '>'; $gs .= '|<' . intval($g) . '>';
} }
}
$sql = sprintf( $sql = sprintf(
/*" AND ( private = 0 OR ( private in (1,2) AND wall = 1 AND ( allow_cid = '' OR allow_cid REGEXP '<%d>' ) /*" AND ( private = 0 OR ( private in (1,2) AND wall = 1 AND ( allow_cid = '' OR allow_cid REGEXP '<%d>' )
@ -412,7 +413,11 @@ function get_form_security_token($typename = '') {
} }
function check_form_security_token($typename = '', $formname = 'form_security_token') { function check_form_security_token($typename = '', $formname = 'form_security_token') {
if (!x($_REQUEST, $formname)) return false; if (!x($_REQUEST, $formname)) {
return false;
}
/// @TODO Careful, not secured!
$hash = $_REQUEST[$formname]; $hash = $_REQUEST[$formname];
$max_livetime = 10800; // 3 hours $max_livetime = 10800; // 3 hours
@ -420,7 +425,9 @@ function check_form_security_token($typename = '', $formname = 'form_security_to
$a = get_app(); $a = get_app();
$x = explode('.', $hash); $x = explode('.', $hash);
if (time() > (IntVal($x[0]) + $max_livetime)) return false; if (time() > (IntVal($x[0]) + $max_livetime)) {
return false;
}
$sec_hash = hash('whirlpool', $a->user['guid'] . $a->user['prvkey'] . session_id() . $x[0] . $typename); $sec_hash = hash('whirlpool', $a->user['guid'] . $a->user['prvkey'] . session_id() . $x[0] . $typename);
@ -467,4 +474,3 @@ function init_groups_visitor($contact_id) {
} }
return $groups; return $groups;
}} }}

View file

@ -65,7 +65,7 @@ function ref_session_write($id, $data) {
$memcache = cache::memcache(); $memcache = cache::memcache();
$a = get_app(); $a = get_app();
if (is_object($memcache) AND is_object($a)) { if (is_object($memcache) && is_object($a)) {
$memcache->set($a->get_hostname().":session:".$id, $data, MEMCACHE_COMPRESSED, $expire); $memcache->set($a->get_hostname().":session:".$id, $data, MEMCACHE_COMPRESSED, $expire);
return true; return true;
} }

File diff suppressed because it is too large Load diff

View file

@ -13,7 +13,7 @@ function spool_post_run($argv, $argc) {
$path = get_spoolpath(); $path = get_spoolpath();
if (($path != '') AND is_writable($path)){ if (($path != '') && is_writable($path)){
if ($dh = opendir($path)) { if ($dh = opendir($path)) {
while (($file = readdir($dh)) !== false) { while (($file = readdir($dh)) !== false) {
@ -30,7 +30,7 @@ function spool_post_run($argv, $argc) {
} }
// We can't read or write the file? So we don't care about it. // We can't read or write the file? So we don't care about it.
if (!is_writable($fullfile) OR !is_readable($fullfile)) { if (!is_writable($fullfile) || !is_readable($fullfile)) {
continue; continue;
} }
@ -42,7 +42,7 @@ function spool_post_run($argv, $argc) {
} }
// Skip if it doesn't seem to be an item array // Skip if it doesn't seem to be an item array
if (!isset($arr['uid']) AND !isset($arr['uri']) AND !isset($arr['network'])) { if (!isset($arr['uid']) && !isset($arr['uri']) && !isset($arr['network'])) {
continue; continue;
} }

View file

@ -31,7 +31,7 @@ function create_tags_from_item($itemid) {
$tags = ""; $tags = "";
foreach ($taglist as $tag) foreach ($taglist as $tag)
if ((substr(trim($tag), 0, 1) == "#") OR (substr(trim($tag), 0, 1) == "@")) if ((substr(trim($tag), 0, 1) == "#") || (substr(trim($tag), 0, 1) == "@"))
$tags .= " ".trim($tag); $tags .= " ".trim($tag);
else else
$tags .= " #".trim($tag); $tags .= " #".trim($tag);
@ -91,7 +91,7 @@ function create_tags_from_item($itemid) {
dbesc($link), dbesc($message["guid"]), dbesc($message["created"]), dbesc($message["received"]), intval($global)); dbesc($link), dbesc($message["guid"]), dbesc($message["created"]), dbesc($message["received"]), intval($global));
// Search for mentions // Search for mentions
if ((substr($tag, 0, 1) == '@') AND (strpos($link, $profile_base_friendica) OR strpos($link, $profile_base_diaspora))) { if ((substr($tag, 0, 1) == '@') && (strpos($link, $profile_base_friendica) || strpos($link, $profile_base_diaspora))) {
$users = q("SELECT `uid` FROM `contact` WHERE self AND (`url` = '%s' OR `nurl` = '%s')", $link, $link); $users = q("SELECT `uid` FROM `contact` WHERE self AND (`url` = '%s' OR `nurl` = '%s')", $link, $link);
foreach ($users AS $user) { foreach ($users AS $user) {
if ($user["uid"] == $message["uid"]) { if ($user["uid"] == $message["uid"]) {
@ -108,10 +108,11 @@ function create_tags_from_itemuri($itemuri, $uid) {
$messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid)); $messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid));
if (count($messages)) { if (count($messages)) {
foreach ($messages as $message) foreach ($messages as $message) {
create_tags_from_item($message["id"]); create_tags_from_item($message["id"]);
} }
} }
}
function update_items() { function update_items() {

View file

@ -109,14 +109,16 @@ class Template implements ITemplateEngine {
//$vals = $this->r[$m[0]]; //$vals = $this->r[$m[0]];
$vals = $this->_get_var($m[0]); $vals = $this->_get_var($m[0]);
$ret = ""; $ret = "";
if (!is_array($vals)) if (!is_array($vals)) {
return $ret; return $ret;
}
foreach ($vals as $k => $v) { foreach ($vals as $k => $v) {
$this->_push_stack(); $this->_push_stack();
$r = $this->r; $r = $this->r;
$r[$varname] = $v; $r[$varname] = $v;
if ($keyname != '') if ($keyname != '') {
$r[$keyname] = (($k === 0) ? '0' : $k); $r[$keyname] = (($k === 0) ? '0' : $k);
}
$ret .= $this->replace($args[3], $r); $ret .= $this->replace($args[3], $r);
$this->_pop_stack(); $this->_pop_stack();
} }

View file

@ -2,11 +2,11 @@
use Friendica\App; use Friendica\App;
require_once("include/template_processor.php"); require_once "include/template_processor.php";
require_once("include/friendica_smarty.php"); require_once "include/friendica_smarty.php";
require_once("include/Smilies.php"); require_once "include/Smilies.php";
require_once("include/map.php"); require_once "include/map.php";
require_once("mod/proxy.php"); require_once "mod/proxy.php";
if (! function_exists('replace_macros')) { if (! function_exists('replace_macros')) {
/** /**
@ -26,12 +26,12 @@ function replace_macros($s,$r) {
// pass $baseurl to all templates // pass $baseurl to all templates
$r['$baseurl'] = App::get_baseurl(); $r['$baseurl'] = App::get_baseurl();
$t = $a->template_engine(); $t = $a->template_engine();
try { try {
$output = $t->replace_macros($s, $r); $output = $t->replace_macros($s, $r);
} catch (Exception $e) { } catch (Exception $e) {
echo "<pre><b>".__function__."</b>: ".$e->getMessage()."</pre>"; killme(); echo "<pre><b>" . __FUNCTION__ . "</b>: " . $e->getMessage() . "</pre>";
killme();
} }
$a->save_timestamp($stamp1, "rendering"); $a->save_timestamp($stamp1, "rendering");
@ -73,8 +73,7 @@ if(! function_exists('notags')) {
* @return string Filtered string * @return string Filtered string
*/ */
function notags($string) { function notags($string) {
return str_replace(array("<", ">"), array('[', ']'), $string);
return(str_replace(array("<",">"), array('[',']'), $string));
// High-bit filter no longer used // High-bit filter no longer used
// return(str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string)); // return(str_replace(array("<",">","\xBA","\xBC","\xBE"), array('[',']','','',''), $string));
@ -90,8 +89,7 @@ if(! function_exists('escape_tags')) {
* @return string * @return string
*/ */
function escape_tags($string) { function escape_tags($string) {
return htmlspecialchars($string, ENT_COMPAT, 'UTF-8', false);
return(htmlspecialchars($string, ENT_COMPAT, 'UTF-8', false));
}} }}
@ -107,12 +105,14 @@ if(! function_exists('autoname')) {
*/ */
function autoname($len) { function autoname($len) {
if($len <= 0) if ($len <= 0) {
return ''; return '';
}
$vowels = array('a','a','ai','au','e','e','e','ee','ea','i','ie','o','ou','u'); $vowels = array('a','a','ai','au','e','e','e','ee','ea','i','ie','o','ou','u');
if(mt_rand(0,5) == 4) if (mt_rand(0, 5) == 4) {
$vowels[] = 'y'; $vowels[] = 'y';
}
$cons = array( $cons = array(
'b','bl','br', 'b','bl','br',
@ -144,10 +144,11 @@ function autoname($len) {
'kh', 'kl','kr','mn','pl','pr','rh','tr','qu','wh'); 'kh', 'kl','kr','mn','pl','pr','rh','tr','qu','wh');
$start = mt_rand(0,2); $start = mt_rand(0,2);
if($start == 0) if ($start == 0) {
$table = $vowels; $table = $vowels;
else } else {
$table = $cons; $table = $cons;
}
$word = ''; $word = '';
@ -155,10 +156,11 @@ function autoname($len) {
$r = mt_rand(0,count($table) - 1); $r = mt_rand(0,count($table) - 1);
$word .= $table[$r]; $word .= $table[$r];
if($table == $vowels) if ($table == $vowels) {
$table = array_merge($cons,$midcons); $table = array_merge($cons,$midcons);
else } else {
$table = $vowels; $table = $vowels;
}
} }
@ -170,8 +172,9 @@ function autoname($len) {
break; break;
} }
} }
if(substr($word,-1) == 'q') if (substr($word, -1) == 'q') {
$word = substr($word, 0, -1); $word = substr($word, 0, -1);
}
return $word; return $word;
}} }}
@ -186,6 +189,7 @@ if(! function_exists('xmlify')) {
* @return string Escaped text. * @return string Escaped text.
*/ */
function xmlify($str) { function xmlify($str) {
/// @TODO deprecated code found?
/* $buffer = ''; /* $buffer = '';
$len = mb_strlen($str); $len = mb_strlen($str);
@ -239,6 +243,7 @@ if(! function_exists('unxmlify')) {
* @return string unescaped text * @return string unescaped text
*/ */
function unxmlify($s) { function unxmlify($s) {
/// @TODO deprecated code found?
// $ret = str_replace('&amp;','&', $s); // $ret = str_replace('&amp;','&', $s);
// $ret = str_replace(array('&lt;','&gt;','&quot;','&apos;'),array('<','>','"',"'"),$ret); // $ret = str_replace(array('&lt;','&gt;','&quot;','&apos;'),array('<','>','"',"'"),$ret);
/*$ret = mb_ereg_replace('&amp;', '&', $s); /*$ret = mb_ereg_replace('&amp;', '&', $s);
@ -258,14 +263,15 @@ if(! function_exists('hex2bin')) {
* @return number * @return number
*/ */
function hex2bin($s) { function hex2bin($s) {
if(! (is_string($s) && strlen($s))) if (! (is_string($s) && strlen($s))) {
return ''; return '';
if(! ctype_xdigit($s)) {
return($s);
} }
return(pack("H*",$s)); if (! ctype_xdigit($s)) {
return $s;
}
return pack("H*",$s);
}} }}
@ -287,7 +293,7 @@ function paginate_data(App $a, $count = null) {
$stripped = trim($stripped, '/'); $stripped = trim($stripped, '/');
$pagenum = $a->pager['page']; $pagenum = $a->pager['page'];
if (($a->page_offset != '') AND !preg_match('/[?&].offset=/', $stripped)) { if (($a->page_offset != '') && !preg_match('/[?&].offset=/', $stripped)) {
$stripped .= '&offset=' . urlencode($a->page_offset); $stripped .= '&offset=' . urlencode($a->page_offset);
} }
@ -422,10 +428,11 @@ function expand_acl($s) {
$t = str_replace('<', '', $s); $t = str_replace('<', '', $s);
$a = explode('>', $t); $a = explode('>', $t);
foreach ($a as $aa) { foreach ($a as $aa) {
if(intval($aa)) if (intval($aa)) {
$ret[] = intval($aa); $ret[] = intval($aa);
} }
} }
}
return $ret; return $ret;
}} }}
@ -435,10 +442,11 @@ if(! function_exists('sanitise_acl')) {
* @param string $item * @param string $item
*/ */
function sanitise_acl(&$item) { function sanitise_acl(&$item) {
if(intval($item)) if (intval($item)) {
$item = '<' . intval(notags(trim($item))) . '>'; $item = '<' . intval(notags(trim($item))) . '>';
else } else {
unset($item); unset($item);
}
}} }}
@ -454,10 +462,11 @@ if(! function_exists('perms2str')) {
*/ */
function perms2str($p) { function perms2str($p) {
$ret = ''; $ret = '';
if(is_array($p)) if (is_array($p)) {
$tmp = $p; $tmp = $p;
else } else {
$tmp = explode(',',$p); $tmp = explode(',',$p);
}
if (is_array($tmp)) { if (is_array($tmp)) {
array_walk($tmp, 'sanitise_acl'); array_walk($tmp, 'sanitise_acl');
@ -481,9 +490,9 @@ function item_new_uri($hostname,$uid, $guid = "") {
do { do {
$dups = false; $dups = false;
if ($guid == "") if ($guid == "") {
$hash = get_guid(32); $hash = get_guid(32);
else { } else {
$hash = $guid; $hash = $guid;
$guid = ""; $guid = "";
} }
@ -492,9 +501,11 @@ function item_new_uri($hostname,$uid, $guid = "") {
$r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1", $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1",
dbesc($uri)); dbesc($uri));
if (dbm::is_result($r)) if (dbm::is_result($r)) {
$dups = true; $dups = true;
}
} while ($dups == true); } while ($dups == true);
return $uri; return $uri;
}} }}
@ -516,9 +527,12 @@ function photo_new_resource() {
$r = q("SELECT `id` FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", $r = q("SELECT `id` FROM `photo` WHERE `resource-id` = '%s' LIMIT 1",
dbesc($resource) dbesc($resource)
); );
if (dbm::is_result($r))
if (dbm::is_result($r)) {
$found = true; $found = true;
}
} while ($found == true); } while ($found == true);
return $resource; return $resource;
}} }}
@ -536,8 +550,9 @@ if(! function_exists('load_view_file')) {
*/ */
function load_view_file($s) { function load_view_file($s) {
global $lang, $a; global $lang, $a;
if(! isset($lang)) if (! isset($lang)) {
$lang = 'en'; $lang = 'en';
}
$b = basename($s); $b = basename($s);
$d = dirname($s); $d = dirname($s);
if (file_exists("$d/$lang/$b")) { if (file_exists("$d/$lang/$b")) {
@ -576,11 +591,13 @@ function get_intltext_template($s) {
$a = get_app(); $a = get_app();
$engine = ''; $engine = '';
if($a->theme['template_engine'] === 'smarty3') if ($a->theme['template_engine'] === 'smarty3') {
$engine = "/smarty3"; $engine = "/smarty3";
}
if(! isset($lang)) if (! isset($lang)) {
$lang = 'en'; $lang = 'en';
}
if (file_exists("view/lang/$lang$engine/$s")) { if (file_exists("view/lang/$lang$engine/$s")) {
$stamp1 = microtime(true); $stamp1 = microtime(true);
@ -616,7 +633,8 @@ function get_markup_template($s, $root = '') {
try { try {
$template = $t->get_template_file($s, $root); $template = $t->get_template_file($s, $root);
} catch (Exception $e) { } catch (Exception $e) {
echo "<pre><b>".__function__."</b>: ".$e->getMessage()."</pre>"; killme(); echo "<pre><b>" . __FUNCTION__ . "</b>: " . $e->getMessage() . "</pre>";
killme();
} }
$a->save_timestamp($stamp1, "file"); $a->save_timestamp($stamp1, "file");
@ -636,27 +654,24 @@ function get_template_file($a, $filename, $root = '') {
$theme = current_theme(); $theme = current_theme();
// Make sure $root ends with a slash / // Make sure $root ends with a slash /
if($root !== '' && $root[strlen($root)-1] !== '/') if ($root !== '' && substr($root, -1, 1) !== '/') {
$root = $root . '/'; $root = $root . '/';
}
if(file_exists("{$root}view/theme/$theme/$filename")) if (file_exists("{$root}view/theme/$theme/$filename")) {
$template_file = "{$root}view/theme/$theme/$filename"; $template_file = "{$root}view/theme/$theme/$filename";
elseif (x($a->theme_info,"extends") && file_exists("{$root}view/theme/{$a->theme_info["extends"]}/$filename")) } elseif (x($a->theme_info, "extends") && file_exists(sprintf('%sview/theme/%s}/%s', $root, $a->theme_info["extends"], $filename))) {
$template_file = "{$root}view/theme/{$a->theme_info["extends"]}/$filename"; $template_file = sprintf('%sview/theme/%s}/%s', $root, $a->theme_info["extends"], $filename);
elseif (file_exists("{$root}/$filename")) } elseif (file_exists("{$root}/$filename")) {
$template_file = "{$root}/$filename"; $template_file = "{$root}/$filename";
else } else {
$template_file = "{$root}view/$filename"; $template_file = "{$root}view/$filename";
}
return $template_file; return $template_file;
}} }}
if (! function_exists('attribute_contains')) { if (! function_exists('attribute_contains')) {
/** /**
* for html,xml parsing - let's say you've got * for html,xml parsing - let's say you've got
@ -674,9 +689,7 @@ if(! function_exists('attribute_contains')) {
*/ */
function attribute_contains($attr, $s) { function attribute_contains($attr, $s) {
$a = explode(' ', $attr); $a = explode(' ', $attr);
if(count($a) && in_array($s,$a)) return (count($a) && in_array($s,$a));
return true;
return false;
}} }}
if (! function_exists('logger')) { if (! function_exists('logger')) {
@ -830,9 +843,7 @@ if(! function_exists('activity_match')) {
* @return boolean * @return boolean
*/ */
function activity_match($haystack,$needle) { function activity_match($haystack,$needle) {
if(($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle,NAMESPACE_ACTIVITY_SCHEMA))) return (($haystack === $needle) || ((basename($needle) === $haystack) && strstr($needle, NAMESPACE_ACTIVITY_SCHEMA)));
return true;
return false;
}} }}
@ -933,13 +944,16 @@ function contact_block() {
$a = get_app(); $a = get_app();
$shown = get_pconfig($a->profile['uid'],'system','display_friend_count'); $shown = get_pconfig($a->profile['uid'],'system','display_friend_count');
if($shown === false) if ($shown === false) {
$shown = 24; $shown = 24;
if($shown == 0) }
if ($shown == 0) {
return; return;
}
if((! is_array($a->profile)) || ($a->profile['hide-friends'])) if ((! is_array($a->profile)) || ($a->profile['hide-friends'])) {
return $o; return $o;
}
$r = q("SELECT COUNT(*) AS `total` FROM `contact` $r = q("SELECT COUNT(*) AS `total` FROM `contact`
WHERE `uid` = %d AND NOT `self` AND NOT `blocked` WHERE `uid` = %d AND NOT `self` AND NOT `blocked`
AND NOT `pending` AND NOT `hidden` AND NOT `archive` AND NOT `pending` AND NOT `hidden` AND NOT `archive`
@ -954,8 +968,7 @@ function contact_block() {
} }
if (! $total) { if (! $total) {
$contacts = t('No contacts'); $contacts = t('No contacts');
$micropro = Null; $micropro = null;
} else { } else {
// Splitting the query in two parts makes it much faster // Splitting the query in two parts makes it much faster
$r = q("SELECT `id` FROM `contact` $r = q("SELECT `id` FROM `contact`
@ -1024,8 +1037,9 @@ function contact_block() {
function micropro($contact, $redirect = false, $class = '', $textmode = false) { function micropro($contact, $redirect = false, $class = '', $textmode = false) {
// Use the contact URL if no address is available // Use the contact URL if no address is available
if ($contact["addr"] == "") if ($contact["addr"] == "") {
$contact["addr"] = $contact["url"]; $contact["addr"] = $contact["url"];
}
$url = $contact['url']; $url = $contact['url'];
$sparkle = ''; $sparkle = '';
@ -1038,14 +1052,15 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
$redir = true; $redir = true;
$url = $redirect_url; $url = $redirect_url;
$sparkle = ' sparkle'; $sparkle = ' sparkle';
} } else {
else
$url = zrl($url); $url = zrl($url);
} }
}
// If there is some js available we don't need the url // If there is some js available we don't need the url
if(x($contact,'click')) if (x($contact, 'click')) {
$url = ''; $url = '';
}
return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),array( return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),array(
'$click' => (($contact['click']) ? $contact['click'] : ''), '$click' => (($contact['click']) ? $contact['click'] : ''),
@ -1090,9 +1105,10 @@ function search($s,$id='search-box',$url='search',$save = false, $aside = true)
t("Tags"), t("Tags"),
t("Contacts")); t("Contacts"));
if (get_config('system','poco_local_search')) if (get_config('system','poco_local_search')) {
$values['$searchoption'][] = t("Forums"); $values['$searchoption'][] = t("Forums");
} }
}
return replace_macros(get_markup_template('searchbox.tpl'), $values); return replace_macros(get_markup_template('searchbox.tpl'), $values);
}} }}
@ -1106,13 +1122,10 @@ if(! function_exists('valid_email')) {
*/ */
function valid_email($x){ function valid_email($x){
// Removed because Fabio told me so. /// @TODO Removed because Fabio told me so.
//if (get_config('system','disable_email_validation')) //if (get_config('system','disable_email_validation'))
// return true; // return true;
return preg_match('/^[_a-zA-Z0-9\-\+]+(\.[_a-zA-Z0-9\-\+]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/', $x);
if(preg_match('/^[_a-zA-Z0-9\-\+]+(\.[_a-zA-Z0-9\-\+]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)+$/',$x))
return true;
return false;
}} }}
@ -1125,7 +1138,7 @@ if(! function_exists('linkify')) {
function linkify($s) { function linkify($s) {
$s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" target="_blank">$1</a>', $s); $s = preg_replace("/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\'\%\$\!\+]*)/", ' <a href="$1" target="_blank">$1</a>', $s);
$s = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$s); $s = preg_replace("/\<(.*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism",'<$1$2=$3&$4>',$s);
return($s); return $s;
}} }}
@ -1216,7 +1229,7 @@ if(! function_exists('normalise_link')) {
*/ */
function normalise_link($url) { function normalise_link($url) {
$ret = str_replace(array('https:', '//www.'), array('http:', '//'), $url); $ret = str_replace(array('https:', '//www.'), array('http:', '//'), $url);
return(rtrim($ret,'/')); return rtrim($ret,'/');
}} }}
@ -1234,9 +1247,7 @@ if(! function_exists('link_compare')) {
* *
*/ */
function link_compare($a, $b) { function link_compare($a, $b) {
if(strcasecmp(normalise_link($a),normalise_link($b)) === 0) return (strcasecmp(normalise_link($a), normalise_link($b)) === 0);
return true;
return false;
}} }}
/** /**
@ -1265,8 +1276,8 @@ function redir_private_images($a, &$item)
function put_item_in_cache(&$item, $update = false) { function put_item_in_cache(&$item, $update = false) {
if (($item["rendered-hash"] != hash("md5", $item["body"])) OR ($item["rendered-hash"] == "") OR if (($item["rendered-hash"] != hash("md5", $item["body"])) || ($item["rendered-hash"] == "") ||
($item["rendered-html"] == "") OR get_config("system", "ignore_cache")) { ($item["rendered-html"] == "") || get_config("system", "ignore_cache")) {
// The function "redir_private_images" changes the body. // The function "redir_private_images" changes the body.
// I'm not sure if we should store it permanently, so we save the old value. // I'm not sure if we should store it permanently, so we save the old value.
@ -1279,7 +1290,7 @@ function put_item_in_cache(&$item, $update = false) {
$item["rendered-hash"] = hash("md5", $item["body"]); $item["rendered-hash"] = hash("md5", $item["body"]);
$item["body"] = $body; $item["body"] = $body;
if ($update AND ($item["id"] != 0)) { if ($update && ($item["id"] != 0)) {
q("UPDATE `item` SET `rendered-html` = '%s', `rendered-hash` = '%s' WHERE `id` = %d", q("UPDATE `item` SET `rendered-html` = '%s', `rendered-hash` = '%s' WHERE `id` = %d",
dbesc($item["rendered-html"]), dbesc($item["rendered-hash"]), intval($item["id"])); dbesc($item["rendered-html"]), dbesc($item["rendered-hash"]), intval($item["id"]));
} }
@ -1318,8 +1329,9 @@ function prepare_body(&$item,$attach = false, $preview = false) {
foreach ($taglist as $tag) { foreach ($taglist as $tag) {
if ($tag["url"] == "") if ($tag["url"] == "") {
$tag["url"] = $searchpath.strtolower($tag["term"]); $tag["url"] = $searchpath.strtolower($tag["term"]);
}
if ($tag["type"] == TERM_HASHTAG) { if ($tag["type"] == TERM_HASHTAG) {
$hashtags[] = "#<a href=\"".$tag["url"]."\" target=\"_blank\">".$tag["term"]."</a>"; $hashtags[] = "#<a href=\"".$tag["url"]."\" target=\"_blank\">".$tag["term"]."</a>";
@ -1340,8 +1352,9 @@ function prepare_body(&$item,$attach = false, $preview = false) {
$update = (!local_user() and !remote_user() and ($item["uid"] == 0)); $update = (!local_user() and !remote_user() and ($item["uid"] == 0));
// Or update it if the current viewer is the intented viewer // Or update it if the current viewer is the intented viewer
if (($item["uid"] == local_user()) AND ($item["uid"] != 0)) if (($item["uid"] == local_user()) && ($item["uid"] != 0)) {
$update = true; $update = true;
}
put_item_in_cache($item, $update); put_item_in_cache($item, $update);
$s = $item["rendered-html"]; $s = $item["rendered-html"];
@ -1370,10 +1383,11 @@ function prepare_body(&$item,$attach = false, $preview = false) {
foreach ($matches as $mtch) { foreach ($matches as $mtch) {
$mime = $mtch[3]; $mime = $mtch[3];
if((local_user() == $item['uid']) && ($item['contact-id'] != $a->contact['id']) && ($item['network'] == NETWORK_DFRN)) if ((local_user() == $item['uid']) && ($item['contact-id'] != $a->contact['id']) && ($item['network'] == NETWORK_DFRN)) {
$the_url = 'redir/' . $item['contact-id'] . '?f=1&url=' . $mtch[1]; $the_url = 'redir/' . $item['contact-id'] . '?f=1&url=' . $mtch[1];
else } else {
$the_url = $mtch[1]; $the_url = $mtch[1];
}
if (strpos($mime, 'video') !== false) { if (strpos($mime, 'video') !== false) {
if (!$vhead) { if (!$vhead) {
@ -1401,8 +1415,7 @@ function prepare_body(&$item,$attach = false, $preview = false) {
if ($filetype) { if ($filetype) {
$filesubtype = strtolower(substr($mime, strpos($mime,'/') + 1)); $filesubtype = strtolower(substr($mime, strpos($mime,'/') + 1));
$filesubtype = str_replace('.', '-', $filesubtype); $filesubtype = str_replace('.', '-', $filesubtype);
} } else {
else {
$filetype = 'unkn'; $filetype = 'unkn';
$filesubtype = 'unkn'; $filesubtype = 'unkn';
} }
@ -1425,7 +1438,7 @@ function prepare_body(&$item,$attach = false, $preview = false) {
$s = $s . $as; $s = $s . $as;
// map // map
if(strpos($s,'<div class="map">') !== false && $item['coord']) { if (strpos($s, '<div class="map">') !== false && x($item, 'coord')) {
$x = generate_map(trim($item['coord'])); $x = generate_map(trim($item['coord']));
if ($x) { if ($x) {
$s = preg_replace('/\<div class\=\"map\"\>/','$0' . $x,$s); $s = preg_replace('/\<div class\=\"map\"\>/','$0' . $x,$s);
@ -1437,13 +1450,14 @@ function prepare_body(&$item,$attach = false, $preview = false) {
$spoilersearch = '<blockquote class="spoiler">'; $spoilersearch = '<blockquote class="spoiler">';
// Remove line breaks before the spoiler // Remove line breaks before the spoiler
while ((strpos($s, "\n".$spoilersearch) !== false)) while ((strpos($s, "\n" . $spoilersearch) !== false)) {
$s = str_replace("\n" . $spoilersearch, $spoilersearch, $s); $s = str_replace("\n" . $spoilersearch, $spoilersearch, $s);
while ((strpos($s, "<br />".$spoilersearch) !== false)) }
while ((strpos($s, "<br />" . $spoilersearch) !== false)) {
$s = str_replace("<br />" . $spoilersearch, $spoilersearch, $s); $s = str_replace("<br />" . $spoilersearch, $spoilersearch, $s);
}
while ((strpos($s, $spoilersearch) !== false)) { while ((strpos($s, $spoilersearch) !== false)) {
$pos = strpos($s, $spoilersearch); $pos = strpos($s, $spoilersearch);
$rnd = random_string(8); $rnd = random_string(8);
$spoilerreplace = '<br /> <span id="spoiler-wrap-' . $rnd . '" class="spoiler-wrap fakelink" onclick="openClose(\'spoiler-' . $rnd . '\');">' . sprintf(t('Click to open/close')) . '</span>'. $spoilerreplace = '<br /> <span id="spoiler-wrap-' . $rnd . '" class="spoiler-wrap fakelink" onclick="openClose(\'spoiler-' . $rnd . '\');">' . sprintf(t('Click to open/close')) . '</span>'.
@ -1455,7 +1469,6 @@ function prepare_body(&$item,$attach = false, $preview = false) {
$authorsearch = '<blockquote class="author">'; $authorsearch = '<blockquote class="author">';
while ((strpos($s, $authorsearch) !== false)) { while ((strpos($s, $authorsearch) !== false)) {
$pos = strpos($s, $authorsearch); $pos = strpos($s, $authorsearch);
$rnd = random_string(8); $rnd = random_string(8);
$authorreplace = '<br /> <span id="author-wrap-' . $rnd . '" class="author-wrap fakelink" onclick="openClose(\'author-' . $rnd . '\');">' . sprintf(t('Click to open/close')) . '</span>'. $authorreplace = '<br /> <span id="author-wrap-' . $rnd . '" class="author-wrap fakelink" onclick="openClose(\'author-' . $rnd . '\');">' . sprintf(t('Click to open/close')) . '</span>'.
@ -1466,7 +1479,6 @@ function prepare_body(&$item,$attach = false, $preview = false) {
// replace friendica image url size with theme preference // replace friendica image url size with theme preference
if (x($a->theme_info, 'item_image_size')){ if (x($a->theme_info, 'item_image_size')){
$ps = $a->theme_info['item_image_size']; $ps = $a->theme_info['item_image_size'];
$s = preg_replace('|(<img[^>]+src="[^"]+/photo/[0-9a-f]+)-[0-9]|', "$1-" . $ps, $s); $s = preg_replace('|(<img[^>]+src="[^"]+/photo/[0-9a-f]+)-[0-9]|', "$1-" . $ps, $s);
} }
@ -1486,12 +1498,13 @@ if(! function_exists('prepare_text')) {
*/ */
function prepare_text($text) { function prepare_text($text) {
require_once('include/bbcode.php'); require_once 'include/bbcode.php';
if(stristr($text,'[nosmile]')) if (stristr($text, '[nosmile]')) {
$s = bbcode($text); $s = bbcode($text);
else } else {
$s = Smilies::replace(bbcode($text)); $s = Smilies::replace(bbcode($text));
}
return trim($s); return trim($s);
}} }}
@ -1531,7 +1544,8 @@ function get_cats_and_terms($item) {
$categories = array(); $categories = array();
$folders = array(); $folders = array();
$matches = false; $first = true; $matches = false;
$first = true;
$cnt = preg_match_all('/<(.*?)>/', $item['file'], $matches, PREG_SET_ORDER); $cnt = preg_match_all('/<(.*?)>/', $item['file'], $matches, PREG_SET_ORDER);
if ($cnt) { if ($cnt) {
foreach ($matches as $mtch) { foreach ($matches as $mtch) {
@ -1545,11 +1559,14 @@ function get_cats_and_terms($item) {
$first = false; $first = false;
} }
} }
if (count($categories)) $categories[count($categories)-1]['last'] = true;
if (count($categories)) {
$categories[count($categories) - 1]['last'] = true;
}
if (local_user() == $item['uid']) { if (local_user() == $item['uid']) {
$matches = false; $first = true; $matches = false;
$first = true;
$cnt = preg_match_all('/\[(.*?)\]/', $item['file'], $matches, PREG_SET_ORDER); $cnt = preg_match_all('/\[(.*?)\]/', $item['file'], $matches, PREG_SET_ORDER);
if ($cnt) { if ($cnt) {
foreach ($matches as $mtch) { foreach ($matches as $mtch) {
@ -1565,7 +1582,9 @@ function get_cats_and_terms($item) {
} }
} }
if (count($folders)) $folders[count($folders)-1]['last'] = true; if (count($folders)) {
$folders[count($folders) - 1]['last'] = true;
}
return array($categories, $folders); return array($categories, $folders);
} }
@ -1593,18 +1612,17 @@ function get_plink($item) {
$ret["title"] = t('link to source'); $ret["title"] = t('link to source');
} }
} elseif (x($item,'plink') && ($item['private'] != 1)) } elseif (x($item, 'plink') && ($item['private'] != 1)) {
$ret = array( $ret = array(
'href' => $item['plink'], 'href' => $item['plink'],
'orig' => $item['plink'], 'orig' => $item['plink'],
'title' => t('link to source'), 'title' => t('link to source'),
); );
else } else {
$ret = array(); $ret = array();
}
//if (x($item,'plink') && ($item['private'] != 1)) return $ret;
return($ret);
}} }}
if (! function_exists('unamp')) { if (! function_exists('unamp')) {
@ -1643,9 +1661,11 @@ function generate_user_guid() {
$x = q("SELECT `uid` FROM `user` WHERE `guid` = '%s' LIMIT 1", $x = q("SELECT `uid` FROM `user` WHERE `guid` = '%s' LIMIT 1",
dbesc($guid) dbesc($guid)
); );
if(! count($x)) if (! dbm::is_result($x)) {
$found = false; $found = false;
}
} while ($found == true ); } while ($found == true );
return $guid; return $guid;
} }
@ -1659,8 +1679,9 @@ function base64url_encode($s, $strip_padding = false) {
$s = strtr(base64_encode($s), '+/', '-_'); $s = strtr(base64_encode($s), '+/', '-_');
if($strip_padding) if ($strip_padding) {
$s = str_replace('=','',$s); $s = str_replace('=','',$s);
}
return $s; return $s;
} }
@ -1808,8 +1829,11 @@ function html2bb_video($s) {
* @return array * @return array
*/ */
function array_xmlify($val){ function array_xmlify($val){
if (is_bool($val)) return $val?"true":"false"; if (is_bool($val)) {
if (is_array($val)) return array_map('array_xmlify', $val); return $val?"true":"false";
} elseif (is_array($val)) {
return array_map('array_xmlify', $val);
}
return xmlify((string) $val); return xmlify((string) $val);
} }
@ -1822,8 +1846,9 @@ function array_xmlify($val){
* @return string * @return string
*/ */
function reltoabs($text, $base) { function reltoabs($text, $base) {
if (empty($base)) if (empty($base)) {
return $text; return $text;
}
$base = rtrim($base,'/'); $base = rtrim($base,'/');
@ -1859,14 +1884,16 @@ function reltoabs($text, $base) {
* @return string * @return string
*/ */
function item_post_type($item) { function item_post_type($item) {
if(intval($item['event-id'])) if (intval($item['event-id'])) {
return t('event'); return t('event');
if(strlen($item['resource-id'])) } elseif (strlen($item['resource-id'])) {
return t('photo'); return t('photo');
if(strlen($item['verb']) && $item['verb'] !== ACTIVITY_POST) } elseif (strlen($item['verb']) && $item['verb'] !== ACTIVITY_POST) {
return t('activity'); return t('activity');
if($item['id'] != $item['parent']) } elseif ($item['id'] != $item['parent']) {
return t('comment'); return t('comment');
}
return t('post'); return t('post');
} }
@ -1885,10 +1912,11 @@ function file_tag_decode($s) {
function file_tag_file_query($table,$s,$type = 'file') { function file_tag_file_query($table,$s,$type = 'file') {
if($type == 'file') if ($type == 'file') {
$str = preg_quote( '[' . str_replace('%', '%%', file_tag_encode($s)) . ']' ); $str = preg_quote( '[' . str_replace('%', '%%', file_tag_encode($s)) . ']' );
else } else {
$str = preg_quote( '<' . str_replace('%', '%%', file_tag_encode($s)) . '>' ); $str = preg_quote( '<' . str_replace('%', '%%', file_tag_encode($s)) . '>' );
}
return " AND " . (($table) ? dbesc($table) . '.' : '') . "file regexp '" . dbesc($str) . "' "; return " AND " . (($table) ? dbesc($table) . '.' : '') . "file regexp '" . dbesc($str) . "' ";
} }
@ -1900,8 +1928,7 @@ function file_tag_list_to_file($list,$type = 'file') {
if ($type == 'file') { if ($type == 'file') {
$lbracket = '['; $lbracket = '[';
$rbracket = ']'; $rbracket = ']';
} } else {
else {
$lbracket = '<'; $lbracket = '<';
$rbracket = '>'; $rbracket = '>';
} }
@ -1921,14 +1948,14 @@ function file_tag_file_to_list($file,$type = 'file') {
$list = ''; $list = '';
if ($type == 'file') { if ($type == 'file') {
$cnt = preg_match_all('/\[(.*?)\]/', $file, $matches, PREG_SET_ORDER); $cnt = preg_match_all('/\[(.*?)\]/', $file, $matches, PREG_SET_ORDER);
} } else {
else {
$cnt = preg_match_all('/<(.*?)>/', $file, $matches, PREG_SET_ORDER); $cnt = preg_match_all('/<(.*?)>/', $file, $matches, PREG_SET_ORDER);
} }
if ($cnt) { if ($cnt) {
foreach ($matches as $mtch) { foreach ($matches as $mtch) {
if(strlen($list)) if (strlen($list)) {
$list .= ','; $list .= ',';
}
$list .= file_tag_decode($mtch[1]); $list .= file_tag_decode($mtch[1]);
} }
} }
@ -1988,10 +2015,6 @@ function file_tag_update_pconfig($uid,$file_old,$file_new,$type = 'file') {
intval($termtype), intval($termtype),
intval($uid)); intval($uid));
//$r = q("select file from item where uid = %d " . file_tag_file_query('item',$tag,$type),
// intval($uid)
//);
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
unset($deleted_tags[$key]); unset($deleted_tags[$key]);
} }
@ -2013,7 +2036,7 @@ function file_tag_update_pconfig($uid,$file_old,$file_new,$type = 'file') {
} }
function file_tag_save_file($uid, $item, $file) { function file_tag_save_file($uid, $item, $file) {
require_once("include/files.php"); require_once "include/files.php";
$result = false; $result = false;
if (! intval($uid)) if (! intval($uid))
@ -2023,25 +2046,27 @@ function file_tag_save_file($uid,$item,$file) {
intval($uid) intval($uid)
); );
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
if(! stristr($r[0]['file'],'[' . file_tag_encode($file) . ']')) if (! stristr($r[0]['file'],'[' . file_tag_encode($file) . ']')) {
q("UPDATE `item` SET `file` = '%s' WHERE `id` = %d AND `uid` = %d", q("UPDATE `item` SET `file` = '%s' WHERE `id` = %d AND `uid` = %d",
dbesc($r[0]['file'] . '[' . file_tag_encode($file) . ']'), dbesc($r[0]['file'] . '[' . file_tag_encode($file) . ']'),
intval($item), intval($item),
intval($uid) intval($uid)
); );
}
create_files_from_item($item); create_files_from_item($item);
$saved = get_pconfig($uid,'system','filetags'); $saved = get_pconfig($uid,'system','filetags');
if((! strlen($saved)) || (! stristr($saved,'[' . file_tag_encode($file) . ']'))) if ((! strlen($saved)) || (! stristr($saved, '[' . file_tag_encode($file) . ']'))) {
set_pconfig($uid, 'system', 'filetags', $saved . '[' . file_tag_encode($file) . ']'); set_pconfig($uid, 'system', 'filetags', $saved . '[' . file_tag_encode($file) . ']');
}
info( t('Item filed') ); info( t('Item filed') );
} }
return true; return true;
} }
function file_tag_unsave_file($uid, $item, $file, $cat = false) { function file_tag_unsave_file($uid, $item, $file, $cat = false) {
require_once("include/files.php"); require_once "include/files.php";
$result = false; $result = false;
if (! intval($uid)) if (! intval($uid))
@ -2078,9 +2103,6 @@ function file_tag_unsave_file($uid,$item,$file,$cat = false) {
intval($termtype), intval($termtype),
intval($uid)); intval($uid));
//$r = q("select file from item where uid = %d and deleted = 0 " . file_tag_file_query('item',$file,(($cat) ? 'category' : 'file')),
//);
if (! dbm::is_result($r)) { if (! dbm::is_result($r)) {
$saved = get_pconfig($uid,'system','filetags'); $saved = get_pconfig($uid,'system','filetags');
set_pconfig($uid, 'system', 'filetags', str_replace($pattern, '', $saved)); set_pconfig($uid, 'system', 'filetags', str_replace($pattern, '', $saved));
@ -2106,7 +2128,7 @@ function undo_post_tagging($s) {
} }
function protect_sprintf($s) { function protect_sprintf($s) {
return(str_replace('%','%%',$s)); return str_replace('%', '%%', $s);
} }
@ -2167,11 +2189,12 @@ function formatBytes($bytes, $precision = 2) {
*/ */
function format_network_name($network, $url = 0) { function format_network_name($network, $url = 0) {
if ($network != "") { if ($network != "") {
require_once('include/contact_selectors.php'); require_once 'include/contact_selectors.php';
if ($url != "") if ($url != "") {
$network_name = '<a href="'.$url.'">'.network_to_name($network, $url)."</a>"; $network_name = '<a href="'.$url.'">'.network_to_name($network, $url)."</a>";
else } else {
$network_name = network_to_name($network); $network_name = network_to_name($network);
}
return $network_name; return $network_name;
} }
@ -2203,16 +2226,15 @@ function text_highlight($s, $lang) {
$s = trim(html_entity_decode($s, ENT_COMPAT)); $s = trim(html_entity_decode($s, ENT_COMPAT));
$s = str_replace(' ', "\t", $s); $s = str_replace(' ', "\t", $s);
// The highlighter library insists on an opening php tag for php code blocks. If /*
// it isn't present, nothing is highlighted. So we're going to see if it's present. * The highlighter library insists on an opening php tag for php code blocks. If
// If not, we'll add it, and then quietly remove it after we get the processed output back. * it isn't present, nothing is highlighted. So we're going to see if it's present.
* If not, we'll add it, and then quietly remove it after we get the processed output back.
if ($lang === 'php') { */
if (strpos($s, '<?php') !== 0) { if ($lang === 'php' && strpos($s, '<?php') !== 0) {
$s = '<?php' . "\n" . $s; $s = '<?php' . "\n" . $s;
$tag_added = true; $tag_added = true;
} }
}
$renderer = new Text_Highlighter_Renderer_Html($options); $renderer = new Text_Highlighter_Renderer_Html($options);
$hl = Text_Highlighter::factory($lang); $hl = Text_Highlighter::factory($lang);
@ -2220,7 +2242,6 @@ function text_highlight($s, $lang) {
$o = $hl->highlight($s); $o = $hl->highlight($s);
$o = str_replace("\n", '', $o); $o = str_replace("\n", '', $o);
if ($tag_added) { if ($tag_added) {
$b = substr($o, 0, strpos($o, '<li>')); $b = substr($o, 0, strpos($o, '<li>'));
$e = substr($o, strpos($o, '</li>')); $e = substr($o, strpos($o, '</li>'));

View file

@ -45,12 +45,12 @@ function add_shadow_thread($itemid) {
$item = $items[0]; $item = $items[0];
// is it already a copy? // is it already a copy?
if (($itemid == 0) OR ($item['uid'] == 0)) { if (($itemid == 0) || ($item['uid'] == 0)) {
return; return;
} }
// Is it a visible public post? // Is it a visible public post?
if (!$item["visible"] OR $item["deleted"] OR $item["moderated"] OR $item["private"]) { if (!$item["visible"] || $item["deleted"] || $item["moderated"] || $item["private"]) {
return; return;
} }
@ -86,8 +86,8 @@ function add_shadow_thread($itemid) {
$item = q("SELECT * FROM `item` WHERE `id` = %d", intval($itemid)); $item = q("SELECT * FROM `item` WHERE `id` = %d", intval($itemid));
if (count($item) AND ($item[0]["allow_cid"] == '') AND ($item[0]["allow_gid"] == '') AND if (count($item) && ($item[0]["allow_cid"] == '') && ($item[0]["allow_gid"] == '') &&
($item[0]["deny_cid"] == '') AND ($item[0]["deny_gid"] == '')) { ($item[0]["deny_cid"] == '') && ($item[0]["deny_gid"] == '')) {
$r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = 0 LIMIT 1", $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = 0 LIMIT 1",
dbesc($item['uri'])); dbesc($item['uri']));
@ -177,29 +177,34 @@ function add_shadow_entry($itemid) {
function update_thread_uri($itemuri, $uid) { function update_thread_uri($itemuri, $uid) {
$messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid)); $messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid));
if (dbm::is_result($messages)) if (dbm::is_result($messages)) {
foreach ($messages as $message) foreach ($messages as $message) {
update_thread($message["id"]); update_thread($message["id"]);
} }
}
}
function update_thread($itemid, $setmention = false) { function update_thread($itemid, $setmention = false) {
$items = q("SELECT `uid`, `guid`, `title`, `body`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`, `moderated`, `visible`, `spam`, `starred`, `bookmark`, `contact-id`, `gcontact-id`, $items = q("SELECT `uid`, `guid`, `title`, `body`, `created`, `edited`, `commented`, `received`, `changed`, `wall`, `private`, `pubmail`, `moderated`, `visible`, `spam`, `starred`, `bookmark`, `contact-id`, `gcontact-id`,
`deleted`, `origin`, `forum_mode`, `network`, `rendered-html`, `rendered-hash` FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid)); `deleted`, `origin`, `forum_mode`, `network`, `rendered-html`, `rendered-hash` FROM `item` WHERE `id` = %d AND (`parent` = %d OR `parent` = 0) LIMIT 1", intval($itemid), intval($itemid));
if (!dbm::is_result($items)) if (!dbm::is_result($items)) {
return; return;
}
$item = $items[0]; $item = $items[0];
if ($setmention) if ($setmention) {
$item["mention"] = 1; $item["mention"] = 1;
}
$sql = ""; $sql = "";
foreach ($item AS $field => $data) foreach ($item AS $field => $data)
if (!in_array($field, array("guid", "title", "body", "rendered-html", "rendered-hash"))) { if (!in_array($field, array("guid", "title", "body", "rendered-html", "rendered-hash"))) {
if ($sql != "") if ($sql != "") {
$sql .= ", "; $sql .= ", ";
}
$sql .= "`".$field."` = '".dbesc($data)."'"; $sql .= "`".$field."` = '".dbesc($data)."'";
} }
@ -211,8 +216,9 @@ function update_thread($itemid, $setmention = false) {
// Updating a shadow item entry // Updating a shadow item entry
$items = q("SELECT `id` FROM `item` WHERE `guid` = '%s' AND `uid` = 0 LIMIT 1", dbesc($item["guid"])); $items = q("SELECT `id` FROM `item` WHERE `guid` = '%s' AND `uid` = 0 LIMIT 1", dbesc($item["guid"]));
if (!$items) if (!dbm::is_result($items)) {
return; return;
}
$result = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `rendered-html` = '%s', `rendered-hash` = '%s' WHERE `id` = %d", $result = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `rendered-html` = '%s', `rendered-hash` = '%s' WHERE `id` = %d",
dbesc($item["title"]), dbesc($item["title"]),
@ -227,10 +233,12 @@ function update_thread($itemid, $setmention = false) {
function delete_thread_uri($itemuri, $uid) { function delete_thread_uri($itemuri, $uid) {
$messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid)); $messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid));
if(count($messages)) if (dbm::is_result($messages)) {
foreach ($messages as $message) foreach ($messages as $message) {
delete_thread($message["id"], $itemuri); delete_thread($message["id"], $itemuri);
} }
}
}
function delete_thread($itemid, $itemuri = "") { function delete_thread($itemid, $itemuri = "") {
$item = q("SELECT `uid` FROM `thread` WHERE `iid` = %d", intval($itemid)); $item = q("SELECT `uid` FROM `thread` WHERE `iid` = %d", intval($itemid));

View file

@ -40,16 +40,16 @@ function update_gcontact_run(&$argv, &$argc) {
return; return;
} }
if (($data["name"] == "") AND ($r[0]['name'] != "")) if (($data["name"] == "") && ($r[0]['name'] != ""))
$data["name"] = $r[0]['name']; $data["name"] = $r[0]['name'];
if (($data["nick"] == "") AND ($r[0]['nick'] != "")) if (($data["nick"] == "") && ($r[0]['nick'] != ""))
$data["nick"] = $r[0]['nick']; $data["nick"] = $r[0]['nick'];
if (($data["addr"] == "") AND ($r[0]['addr'] != "")) if (($data["addr"] == "") && ($r[0]['addr'] != ""))
$data["addr"] = $r[0]['addr']; $data["addr"] = $r[0]['addr'];
if (($data["photo"] == "") AND ($r[0]['photo'] != "")) if (($data["photo"] == "") && ($r[0]['photo'] != ""))
$data["photo"] = $r[0]['photo']; $data["photo"] = $r[0]['photo'];

View file

@ -51,7 +51,7 @@ class xml {
} }
foreach($array as $key => $value) { foreach($array as $key => $value) {
if (!isset($element) AND isset($xml)) { if (!isset($element) && isset($xml)) {
$element = $xml; $element = $xml;
} }
@ -67,7 +67,7 @@ class xml {
} }
$element_parts = explode(":", $key); $element_parts = explode(":", $key);
if ((count($element_parts) > 1) AND isset($namespaces[$element_parts[0]])) { if ((count($element_parts) > 1) && isset($namespaces[$element_parts[0]])) {
$namespace = $namespaces[$element_parts[0]]; $namespace = $namespaces[$element_parts[0]];
} elseif (isset($namespaces[""])) { } elseif (isset($namespaces[""])) {
$namespace = $namespaces[""]; $namespace = $namespaces[""];
@ -76,18 +76,18 @@ class xml {
} }
// Remove undefined namespaces from the key // Remove undefined namespaces from the key
if ((count($element_parts) > 1) AND is_null($namespace)) { if ((count($element_parts) > 1) && is_null($namespace)) {
$key = $element_parts[1]; $key = $element_parts[1];
} }
if (substr($key, 0, 11) == "@attributes") { if (substr($key, 0, 11) == "@attributes") {
if (!isset($element) OR !is_array($value)) { if (!isset($element) || !is_array($value)) {
continue; continue;
} }
foreach ($value as $attr_key => $attr_value) { foreach ($value as $attr_key => $attr_value) {
$element_parts = explode(":", $attr_key); $element_parts = explode(":", $attr_key);
if ((count($element_parts) > 1) AND isset($namespaces[$element_parts[0]])) { if ((count($element_parts) > 1) && isset($namespaces[$element_parts[0]])) {
$namespace = $namespaces[$element_parts[0]]; $namespace = $namespaces[$element_parts[0]];
} else { } else {
$namespace = NULL; $namespace = NULL;
@ -323,7 +323,7 @@ class xml {
if ($type == "open") { // The starting of the tag '<tag>' if ($type == "open") { // The starting of the tag '<tag>'
$parent[$level-1] = &$current; $parent[$level-1] = &$current;
if (!is_array($current) or (!in_array($tag, array_keys($current)))) { // Insert New tag if (!is_array($current) || (!in_array($tag, array_keys($current)))) { // Insert New tag
$current[$tag] = $result; $current[$tag] = $result;
if ($attributes_data) { if ($attributes_data) {
$current[$tag. '_attr'] = $attributes_data; $current[$tag. '_attr'] = $attributes_data;

View file

@ -59,15 +59,15 @@ if (!$install) {
Config::load(); Config::load();
if ($a->max_processes_reached() OR $a->maxload_reached()) { if ($a->max_processes_reached() || $a->maxload_reached()) {
header($_SERVER["SERVER_PROTOCOL"] . ' 503 Service Temporarily Unavailable'); header($_SERVER["SERVER_PROTOCOL"] . ' 503 Service Temporarily Unavailable');
header('Retry-After: 120'); header('Retry-After: 120');
header('Refresh: 120; url=' . App::get_baseurl() . "/" . $a->query_string); header('Refresh: 120; url=' . App::get_baseurl() . "/" . $a->query_string);
die("System is currently unavailable. Please try again later"); die("System is currently unavailable. Please try again later");
} }
if (get_config('system', 'force_ssl') AND ($a->get_scheme() == "http") AND if (get_config('system', 'force_ssl') && ($a->get_scheme() == "http") &&
(intval(get_config('system', 'ssl_policy')) == SSL_POLICY_FULL) AND (intval(get_config('system', 'ssl_policy')) == SSL_POLICY_FULL) &&
(substr(App::get_baseurl(), 0, 8) == "https://")) { (substr(App::get_baseurl(), 0, 8) == "https://")) {
header("HTTP/1.1 302 Moved Temporarily"); header("HTTP/1.1 302 Moved Temporarily");
header("Location: " . App::get_baseurl() . "/" . $a->query_string); header("Location: " . App::get_baseurl() . "/" . $a->query_string);
@ -128,7 +128,7 @@ if ((x($_SESSION,'language')) && ($_SESSION['language'] !== $lang)) {
if ((x($_GET,'zrl')) && (!$install && !$maintenance)) { if ((x($_GET,'zrl')) && (!$install && !$maintenance)) {
// Only continue when the given profile link seems valid // Only continue when the given profile link seems valid
// Valid profile links contain a path with "/profile/" and no query parameters // Valid profile links contain a path with "/profile/" and no query parameters
if ((parse_url($_GET['zrl'], PHP_URL_QUERY) == "") AND if ((parse_url($_GET['zrl'], PHP_URL_QUERY) == "") &&
strstr(parse_url($_GET['zrl'], PHP_URL_PATH), "/profile/")) { strstr(parse_url($_GET['zrl'], PHP_URL_PATH), "/profile/")) {
$_SESSION['my_url'] = $_GET['zrl']; $_SESSION['my_url'] = $_GET['zrl'];
$a->query_string = preg_replace('/[\?&]zrl=(.*?)([\?&]|$)/is','',$a->query_string); $a->query_string = preg_replace('/[\?&]zrl=(.*?)([\?&]|$)/is','',$a->query_string);
@ -245,7 +245,7 @@ if (strlen($a->module)) {
} }
// Compatibility with the Firefox App // Compatibility with the Firefox App
if (($a->module == "users") AND ($a->cmd == "users/sign_in")) { if (($a->module == "users") && ($a->cmd == "users/sign_in")) {
$a->module = "login"; $a->module = "login";
} }
@ -450,7 +450,7 @@ if (!$a->theme['stylesheet']) {
$a->page['htmlhead'] = str_replace('{{$stylesheet}}',$stylesheet,$a->page['htmlhead']); $a->page['htmlhead'] = str_replace('{{$stylesheet}}',$stylesheet,$a->page['htmlhead']);
//$a->page['htmlhead'] = replace_macros($a->page['htmlhead'], array('$stylesheet' => $stylesheet)); //$a->page['htmlhead'] = replace_macros($a->page['htmlhead'], array('$stylesheet' => $stylesheet));
if (isset($_GET["mode"]) AND (($_GET["mode"] == "raw") OR ($_GET["mode"] == "minimal"))) { if (isset($_GET["mode"]) && (($_GET["mode"] == "raw") || ($_GET["mode"] == "minimal"))) {
$doc = new DOMDocument(); $doc = new DOMDocument();
$target = new DOMDocument(); $target = new DOMDocument();
@ -473,7 +473,7 @@ if (isset($_GET["mode"]) AND (($_GET["mode"] == "raw") OR ($_GET["mode"] == "min
} }
} }
if (isset($_GET["mode"]) AND ($_GET["mode"] == "raw")) { if (isset($_GET["mode"]) && ($_GET["mode"] == "raw")) {
header("Content-type: text/html; charset=utf-8"); header("Content-type: text/html; charset=utf-8");

View file

@ -11,6 +11,7 @@ use Friendica\Core\Config;
require_once("include/enotify.php"); require_once("include/enotify.php");
require_once("include/text.php"); require_once("include/text.php");
require_once('include/items.php');
/** /**
* @brief Process send data from the admin panels subpages * @brief Process send data from the admin panels subpages
@ -113,6 +114,9 @@ function admin_post(App $a) {
case 'blocklist': case 'blocklist':
admin_page_blocklist_post($a); admin_page_blocklist_post($a);
break; break;
case 'deleteitem':
admin_page_deleteitem_post($a);
break;
} }
} }
@ -172,6 +176,7 @@ function admin_content(App $a) {
'queue' => array("admin/queue/", t('Inspect Queue'), "queue"), 'queue' => array("admin/queue/", t('Inspect Queue'), "queue"),
'blocklist' => array("admin/blocklist/", t('Server Blocklist'), "blocklist"), 'blocklist' => array("admin/blocklist/", t('Server Blocklist'), "blocklist"),
'federation' => array("admin/federation/", t('Federation Statistics'), "federation"), 'federation' => array("admin/federation/", t('Federation Statistics'), "federation"),
'deleteitem' => array("admin/deleteitem/", t('Delete Item'), 'deleteitem'),
); );
/* get plugins admin page */ /* get plugins admin page */
@ -244,6 +249,9 @@ function admin_content(App $a) {
case 'blocklist': case 'blocklist':
$o = admin_page_blocklist($a); $o = admin_page_blocklist($a);
break; break;
case 'deleteitem':
$o = admin_page_deleteitem($a);
break;
default: default:
notice(t("Item not found.")); notice(t("Item not found."));
} }
@ -348,6 +356,67 @@ function admin_page_blocklist_post(App $a) {
return; // NOTREACHED return; // NOTREACHED
} }
/**
* @brief Subpage where the admin can delete an item from their node given the GUID
*
* This subpage of the admin panel offers the nodes admin to delete an item from
* the node, given the GUID or the display URL such as http://example.com/display/123456.
* The item will then be marked as deleted in the database and processed accordingly.
*
* @param App $a
* @return string
*/
function admin_page_deleteitem(App $a) {
$t = get_markup_template("admin_deleteitem.tpl");
return replace_macros($t, array(
'$title' => t('Administration'),
'$page' => t('Delete Item'),
'$submit' => t('Delete this Item'),
'$intro1' => t('On this page you can delete an item from your node. If the item is a top level posting, the entire thread will be deleted.'),
'$intro2' => t('You need to know the GUID of the item. You can find it e.g. by looking at the display URL. The last part of http://example.com/display/123456 is the GUID, here 123456.'),
'$deleteitemguid' => array('deleteitemguid', t("GUID"), '', t("The GUID of the item you want to delete."), 'required', 'autofocus'),
'$baseurl' => App::get_baseurl(),
'$form_security_token' => get_form_security_token("admin_deleteitem")
));
}
/**
* @brief Process send data from Admin Delete Item Page
*
* The GUID passed through the form should be only the GUID. But we also parse
* URLs like the full /display URL to make the process more easy for the admin.
*
* @param App $a
*/
function admin_page_deleteitem_post(App $a) {
if (!x($_POST['page_deleteitem_submit'])) {
return;
}
check_form_security_token_redirectOnErr('/admin/deleteitem/', 'admin_deleteitem');
if (x($_POST['page_deleteitem_submit'])) {
$guid = trim(notags($_POST['deleteitemguid']));
// The GUID should not include a "/", so if there is one, we got an URL
// and the last part of it is most likely the GUID.
if (strpos($guid, '/')) {
$guid = substr($guid, strrpos($guid, '/')+1);
}
// Now that we have the GUID get all IDs of the associated entries in the
// item table of the DB and drop those items, which will also delete the
// associated threads.
$r = dba::select('item', array('id'), array('guid'=>$guid));
while ($row = dba::fetch($r)) {
drop_item($row['id'], false);
}
dba::close($r);
}
info(t('Item marked for deletion.').EOL);
goaway('admin/deleteitem');
return; // NOTREACHED
}
/** /**
* @brief Subpage with some stats about "the federation" network * @brief Subpage with some stats about "the federation" network
* *
@ -558,11 +627,11 @@ function admin_page_summary(App $a) {
$r = q("SELECT `page-flags`, COUNT(`uid`) AS `count` FROM `user` GROUP BY `page-flags`"); $r = q("SELECT `page-flags`, COUNT(`uid`) AS `count` FROM `user` GROUP BY `page-flags`");
$accounts = array( $accounts = array(
array(t('Normal Account'), 0), array(t('Normal Account'), 0),
array(t('Soapbox Account'), 0), array(t('Automatic Follower Account'), 0),
array(t('Community/Celebrity Account'), 0), array(t('Public Forum Account'), 0),
array(t('Automatic Friend Account'), 0), array(t('Automatic Friend Account'), 0),
array(t('Blog Account'), 0), array(t('Blog Account'), 0),
array(t('Private Forum'), 0) array(t('Private Forum Account'), 0)
); );
$users=0; $users=0;
@ -579,7 +648,7 @@ 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);
$r = qu("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE 1"); $r = qu("SELECT COUNT(*) AS `total` FROM `workerqueue` WHERE NOT `done`");
$workerqueue = (($r) ? $r[0]['total'] : 0); $workerqueue = (($r) ? $r[0]['total'] : 0);
// We can do better, but this is a quick queue status // We can do better, but this is a quick queue status
@ -770,7 +839,7 @@ function admin_page_site_post(App $a) {
$worker_frontend = ((x($_POST,'worker_frontend')) ? True : False); $worker_frontend = ((x($_POST,'worker_frontend')) ? True : False);
// Has the directory url changed? If yes, then resubmit the existing profiles there // Has the directory url changed? If yes, then resubmit the existing profiles there
if ($global_directory != Config::get('system', 'directory') AND ($global_directory != '')) { if ($global_directory != Config::get('system', 'directory') && ($global_directory != '')) {
Config::set('system', 'directory', $global_directory); Config::set('system', 'directory', $global_directory);
proc_run(PRIORITY_LOW, 'include/directory.php'); proc_run(PRIORITY_LOW, 'include/directory.php');
} }
@ -936,7 +1005,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')) &&
!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');
@ -958,7 +1027,7 @@ function admin_page_site(App $a) {
$f = basename($file); $f = basename($file);
// Only show allowed themes here // Only show allowed themes here
if (($allowed_theme_list != '') AND !strstr($allowed_theme_list, $f)) { if (($allowed_theme_list != '') && !strstr($allowed_theme_list, $f)) {
continue; continue;
} }
@ -1183,7 +1252,7 @@ function admin_page_dbsync(App $a) {
goaway('admin/dbsync'); goaway('admin/dbsync');
} }
if (($a->argc > 2) AND (intval($a->argv[2]) OR ($a->argv[2] === 'check'))) { if (($a->argc > 2) && (intval($a->argv[2]) || ($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) {
@ -1451,8 +1520,8 @@ function admin_page_users(App $a) {
$_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('Automatic Follower Account'),
t('Community/Celebrity Account'), t('Public Forum Account'),
t('Automatic Friend Account') t('Automatic Friend Account')
); );
$e['page-flags'] = $accounts[$e['page-flags']]; $e['page-flags'] = $accounts[$e['page-flags']];
@ -1663,7 +1732,7 @@ function admin_page_plugins(App $a) {
$show_plugin = true; $show_plugin = true;
// If the addon is unsupported, then only show it, when it is enabled // If the addon is unsupported, then only show it, when it is enabled
if ((strtolower($info["status"]) == "unsupported") AND !in_array($id, $a->plugins)) { if ((strtolower($info["status"]) == "unsupported") && !in_array($id, $a->plugins)) {
$show_plugin = false; $show_plugin = false;
} }
@ -1801,7 +1870,7 @@ 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 || $is_supported || 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);
} }
} }

View file

@ -68,14 +68,14 @@ function community_content(App $a, $update = 0) {
} }
$previousauthor = $item["author-link"]; $previousauthor = $item["author-link"];
if (($numposts < $maxpostperauthor) AND (sizeof($s) < $a->pager['itemspage'])) { if (($numposts < $maxpostperauthor) && (sizeof($s) < $a->pager['itemspage'])) {
$s[] = $item; $s[] = $item;
} }
} }
if ((sizeof($s) < $a->pager['itemspage'])) { if ((sizeof($s) < $a->pager['itemspage'])) {
$r = community_getitems($a->pager['start'] + ($count * $a->pager['itemspage']), $a->pager['itemspage']); $r = community_getitems($a->pager['start'] + ($count * $a->pager['itemspage']), $a->pager['itemspage']);
} }
} while ((sizeof($s) < $a->pager['itemspage']) AND (++$count < 50) AND (sizeof($r) > 0)); } while ((sizeof($s) < $a->pager['itemspage']) && (++$count < 50) && (sizeof($r) > 0));
} else { } else {
$s = $r; $s = $r;
} }

View file

@ -17,7 +17,7 @@ function contacts_init(App $a) {
$contact_id = 0; $contact_id = 0;
if((($a->argc == 2) && intval($a->argv[1])) OR (($a->argc == 3) && intval($a->argv[1]) && ($a->argv[2] == "posts"))) { if((($a->argc == 2) && intval($a->argv[1])) || (($a->argc == 3) && intval($a->argv[1]) && ($a->argv[2] == "posts"))) {
$contact_id = intval($a->argv[1]); $contact_id = intval($a->argv[1]);
$r = q("SELECT * FROM `contact` WHERE `uid` = %d and `id` = %d LIMIT 1", $r = q("SELECT * FROM `contact` WHERE `uid` = %d and `id` = %d LIMIT 1",
intval(local_user()), intval(local_user()),
@ -42,7 +42,7 @@ function contacts_init(App $a) {
if ($contact_id) { if ($contact_id) {
$a->data['contact'] = $r[0]; $a->data['contact'] = $r[0];
if (($a->data['contact']['network'] != "") AND ($a->data['contact']['network'] != NETWORK_DFRN)) { if (($a->data['contact']['network'] != "") && ($a->data['contact']['network'] != NETWORK_DFRN)) {
$networkname = format_network_name($a->data['contact']['network'],$a->data['contact']['url']); $networkname = format_network_name($a->data['contact']['network'],$a->data['contact']['url']);
} else { } else {
$networkname = ''; $networkname = '';
@ -266,7 +266,7 @@ function _contact_update_profile($contact_id) {
$data = Probe::uri($r[0]["url"], "", 0, false); $data = Probe::uri($r[0]["url"], "", 0, false);
// "Feed" or "Unknown" is mostly a sign of communication problems // "Feed" or "Unknown" is mostly a sign of communication problems
if ((in_array($data["network"], array(NETWORK_FEED, NETWORK_PHANTOM))) AND ($data["network"] != $r[0]["network"])) if ((in_array($data["network"], array(NETWORK_FEED, NETWORK_PHANTOM))) && ($data["network"] != $r[0]["network"]))
return; return;
$updatefields = array("name", "nick", "url", "addr", "batch", "notify", "poll", "request", "confirm", $updatefields = array("name", "nick", "url", "addr", "batch", "notify", "poll", "request", "confirm",
@ -281,14 +281,14 @@ function _contact_update_profile($contact_id) {
} }
foreach($updatefields AS $field) foreach($updatefields AS $field)
if (isset($data[$field]) AND ($data[$field] != "")) if (isset($data[$field]) && ($data[$field] != ""))
$update[$field] = $data[$field]; $update[$field] = $data[$field];
$update["nurl"] = normalise_link($data["url"]); $update["nurl"] = normalise_link($data["url"]);
$query = ""; $query = "";
if (isset($data["priority"]) AND ($data["priority"] != 0)) if (isset($data["priority"]) && ($data["priority"] != 0))
$query = "`priority` = ".intval($data["priority"]); $query = "`priority` = ".intval($data["priority"]);
foreach($update AS $key => $value) { foreach($update AS $key => $value) {
@ -573,7 +573,7 @@ function contacts_content(App $a) {
if ($contact['network'] == NETWORK_DFRN) if ($contact['network'] == NETWORK_DFRN)
$profile_select = contact_profile_assign($contact['profile-id'],(($contact['network'] !== NETWORK_DFRN) ? true : false)); $profile_select = contact_profile_assign($contact['profile-id'],(($contact['network'] !== NETWORK_DFRN) ? true : false));
if (in_array($contact['network'], array(NETWORK_DIASPORA, NETWORK_OSTATUS)) AND if (in_array($contact['network'], array(NETWORK_DIASPORA, NETWORK_OSTATUS)) &&
($contact['rel'] == CONTACT_IS_FOLLOWER)) ($contact['rel'] == CONTACT_IS_FOLLOWER))
$follow = App::get_baseurl(true)."/follow?url=".urlencode($contact["url"]); $follow = App::get_baseurl(true)."/follow?url=".urlencode($contact["url"]);

View file

@ -626,7 +626,7 @@ function dfrn_request_post(App $a) {
); );
// NOTREACHED // NOTREACHED
// END $network === NETWORK_DFRN // END $network === NETWORK_DFRN
} elseif (($network != NETWORK_PHANTOM) AND ($url != "")) { } elseif (($network != NETWORK_PHANTOM) && ($url != "")) {
/* /*
* *
@ -693,7 +693,7 @@ function dfrn_request_content(App $a) {
$confirm_key = (x($_GET,'confirm_key') ? $_GET['confirm_key'] : ""); $confirm_key = (x($_GET,'confirm_key') ? $_GET['confirm_key'] : "");
// Checking fastlane for validity // Checking fastlane for validity
if (x($_SESSION, "fastlane") AND (normalise_link($_SESSION["fastlane"]) == normalise_link($dfrn_url))) { if (x($_SESSION, "fastlane") && (normalise_link($_SESSION["fastlane"]) == normalise_link($dfrn_url))) {
$_POST["dfrn_url"] = $dfrn_url; $_POST["dfrn_url"] = $dfrn_url;
$_POST["confirm_key"] = $confirm_key; $_POST["confirm_key"] = $confirm_key;
$_POST["localconfirm"] = 1; $_POST["localconfirm"] = 1;
@ -813,9 +813,9 @@ function dfrn_request_content(App $a) {
// At first look if an address was provided // At first look if an address was provided
// Otherwise take the local address // Otherwise take the local address
if (x($_GET,'addr') AND ($_GET['addr'] != "")) { if (x($_GET,'addr') && ($_GET['addr'] != "")) {
$myaddr = hex2bin($_GET['addr']); $myaddr = hex2bin($_GET['addr']);
} elseif (x($_GET,'address') AND ($_GET['address'] != "")) { } elseif (x($_GET,'address') && ($_GET['address'] != "")) {
$myaddr = $_GET['address']; $myaddr = $_GET['address'];
} elseif (local_user()) { } elseif (local_user()) {
if (strlen($a->path)) { if (strlen($a->path)) {

View file

@ -37,7 +37,7 @@ function dirfind_content(App $a, $prefix = "") {
if (strpos($search,'@') === 0) { if (strpos($search,'@') === 0) {
$search = substr($search,1); $search = substr($search,1);
$header = sprintf( t('People Search - %s'), $search); $header = sprintf( t('People Search - %s'), $search);
if ((valid_email($search) AND validate_email($search)) OR if ((valid_email($search) && validate_email($search)) ||
(substr(normalise_link($search), 0, 7) == "http://")) { (substr(normalise_link($search), 0, 7) == "http://")) {
$user_data = probe_url($search); $user_data = probe_url($search);
$discover_user = (in_array($user_data["network"], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA))); $discover_user = (in_array($user_data["network"], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA)));
@ -75,7 +75,7 @@ function dirfind_content(App $a, $prefix = "") {
$j->results[] = $objresult; $j->results[] = $objresult;
// Add the contact to the global contacts if it isn't already in our system // Add the contact to the global contacts if it isn't already in our system
if (($contact["cid"] == 0) AND ($contact["zid"] == 0) AND ($contact["gid"] == 0)) { if (($contact["cid"] == 0) && ($contact["zid"] == 0) && ($contact["gid"] == 0)) {
update_gcontact($user_data); update_gcontact($user_data);
} }
} elseif ($local) { } elseif ($local) {

View file

@ -2,6 +2,8 @@
use Friendica\App; use Friendica\App;
require_once('include/dfrn.php');
function display_init(App $a) { function display_init(App $a) {
if ((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { if ((get_config('system','block_public')) && (! local_user()) && (! remote_user())) {
@ -11,6 +13,19 @@ function display_init(App $a) {
$nick = (($a->argc > 1) ? $a->argv[1] : ''); $nick = (($a->argc > 1) ? $a->argv[1] : '');
$profiledata = array(); $profiledata = array();
if ($a->argc == 3) {
if (substr($a->argv[2], -5) == '.atom') {
$item_id = substr($a->argv[2], 0, -5);
$xml = dfrn::itemFeed($item_id);
if ($xml == '') {
http_status_exit(500);
}
header("Content-type: application/atom+xml");
echo $xml;
killme();
}
}
// If there is only one parameter, then check if this parameter could be a guid // If there is only one parameter, then check if this parameter could be a guid
if ($a->argc == 2) { if ($a->argc == 2) {
$nick = ""; $nick = "";
@ -59,7 +74,7 @@ function display_init(App $a) {
WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated` WHERE `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated`
AND `id` = %d", $r[0]["parent"]); AND `id` = %d", $r[0]["parent"]);
} }
if (($itemuid != local_user()) AND local_user()) { if (($itemuid != local_user()) && local_user()) {
// Do we know this contact but we haven't got this item? // Do we know this contact but we haven't got this item?
// Copy the wohle thread to our local storage so that we can interact. // Copy the wohle thread to our local storage so that we can interact.
// We really should change this need for the future since it scales very bad. // We really should change this need for the future since it scales very bad.
@ -129,11 +144,11 @@ function display_fetchauthor($a, $item) {
// Skip if it isn't a pure repeated messages // Skip if it isn't a pure repeated messages
// Does it start with a share? // Does it start with a share?
if (!$skip AND strpos($body, "[share") > 0) { if (!$skip && strpos($body, "[share") > 0) {
$skip = true; $skip = true;
} }
// Does it end with a share? // Does it end with a share?
if (!$skip AND (strlen($body) > (strrpos($body, "[/share]") + 8))) { if (!$skip && (strlen($body) > (strrpos($body, "[/share]") + 8))) {
$skip = true; $skip = true;
} }
if (!$skip) { if (!$skip) {
@ -209,9 +224,6 @@ function display_content(App $a, $update = 0) {
$o = ''; $o = '';
$a->page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'), array());
if ($update) { if ($update) {
$nick = $_REQUEST['nick']; $nick = $_REQUEST['nick'];
} else { } else {
@ -265,7 +277,7 @@ function display_content(App $a, $update = 0) {
} }
} }
if ($item_id AND !is_numeric($item_id)) { if ($item_id && !is_numeric($item_id)) {
$r = qu("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", $r = qu("SELECT `id` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item_id), intval($a->profile['uid'])); dbesc($item_id), intval($a->profile['uid']));
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
@ -281,6 +293,16 @@ function display_content(App $a, $update = 0) {
return; return;
} }
// We are displaying an "alternate" link if that post was public. See issue 2864
$items = q("SELECT `id` FROM `item` WHERE `id` = %d AND NOT `private` AND `wall`", intval($item_id));
if (dbm::is_result($items)) {
$alternate = App::get_baseurl().'/display/'.$nick.'/'.$item_id.'.atom';
} else {
$alternate = '';
}
$a->page['htmlhead'] .= replace_macros(get_markup_template('display-head.tpl'),
array('$alternate' => $alternate));
$groups = array(); $groups = array();

View file

@ -436,7 +436,7 @@ function events_content(App $a) {
$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 || ($mode !== 'new')) {
$sh_checked .= ' disabled="disabled" '; $sh_checked .= ' disabled="disabled" ';
} }

View file

@ -11,7 +11,7 @@ require_once("include/xml.php");
function fetch_init(App $a) { function fetch_init(App $a) {
if (($a->argc != 3) OR (!in_array($a->argv[1], array("post", "status_message", "reshare")))) { if (($a->argc != 3) || (!in_array($a->argv[1], array("post", "status_message", "reshare")))) {
header($_SERVER["SERVER_PROTOCOL"].' 404 '.t('Not Found')); header($_SERVER["SERVER_PROTOCOL"].' 404 '.t('Not Found'));
killme(); killme();
} }

View file

@ -37,14 +37,14 @@ function follow_content(App $a) {
$ret = probe_url($url); $ret = probe_url($url);
if (($ret["network"] == NETWORK_DIASPORA) AND !get_config('system','diaspora_enabled')) { if (($ret["network"] == NETWORK_DIASPORA) && !get_config('system','diaspora_enabled')) {
notice( t("Diaspora support isn't enabled. Contact can't be added.") . EOL); notice( t("Diaspora support isn't enabled. Contact can't be added.") . EOL);
$submit = ""; $submit = "";
//goaway($_SESSION['return_url']); //goaway($_SESSION['return_url']);
// NOTREACHED // NOTREACHED
} }
if (($ret["network"] == NETWORK_OSTATUS) AND get_config('system','ostatus_disabled')) { if (($ret["network"] == NETWORK_OSTATUS) && get_config('system','ostatus_disabled')) {
notice( t("OStatus support is disabled. Contact can't be added.") . EOL); notice( t("OStatus support is disabled. Contact can't be added.") . EOL);
$submit = ""; $submit = "";
//goaway($_SESSION['return_url']); //goaway($_SESSION['return_url']);

View file

@ -139,8 +139,8 @@ function item_post(App $a) {
// If the contact id doesn't fit with the contact, then set the contact to null // If the contact id doesn't fit with the contact, then set the contact to null
$thrparent = q("SELECT `author-link`, `network` FROM `item` WHERE `uri` = '%s' LIMIT 1", dbesc($thr_parent)); $thrparent = q("SELECT `author-link`, `network` FROM `item` WHERE `uri` = '%s' LIMIT 1", dbesc($thr_parent));
if (dbm::is_result($thrparent) AND ($thrparent[0]["network"] === NETWORK_OSTATUS) if (dbm::is_result($thrparent) && ($thrparent[0]["network"] === NETWORK_OSTATUS)
AND (normalise_link($parent_contact["url"]) != normalise_link($thrparent[0]["author-link"]))) { && (normalise_link($parent_contact["url"]) != normalise_link($thrparent[0]["author-link"]))) {
$parent_contact = get_contact_details_by_url($thrparent[0]["author-link"]); $parent_contact = get_contact_details_by_url($thrparent[0]["author-link"]);
if (!isset($parent_contact["nick"])) { if (!isset($parent_contact["nick"])) {
@ -175,7 +175,7 @@ function item_post(App $a) {
$object = ((x($_REQUEST, 'object')) ? $_REQUEST['object'] : ''); $object = ((x($_REQUEST, 'object')) ? $_REQUEST['object'] : '');
// Check for multiple posts with the same message id (when the post was created via API) // Check for multiple posts with the same message id (when the post was created via API)
if (($message_id != '') AND ($profile_uid != 0)) { if (($message_id != '') && ($profile_uid != 0)) {
$r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($message_id), dbesc($message_id),
intval($profile_uid) intval($profile_uid)
@ -309,8 +309,8 @@ function item_post(App $a) {
// for non native networks use the network of the original post as network of the item // for non native networks use the network of the original post as network of the item
if (($parent_item['network'] != NETWORK_DIASPORA) if (($parent_item['network'] != NETWORK_DIASPORA)
AND ($parent_item['network'] != NETWORK_OSTATUS) && ($parent_item['network'] != NETWORK_OSTATUS)
AND ($network == "")) { && ($network == "")) {
$network = $parent_item['network']; $network = $parent_item['network'];
} }
@ -504,7 +504,7 @@ function item_post(App $a) {
$bookmark = 0; $bookmark = 0;
$data = get_attachment_data($body); $data = get_attachment_data($body);
if (preg_match_all("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism", $body, $match, PREG_SET_ORDER) OR isset($data["type"])) { if (preg_match_all("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism", $body, $match, PREG_SET_ORDER) || isset($data["type"])) {
$objecttype = ACTIVITY_OBJ_BOOKMARK; $objecttype = ACTIVITY_OBJ_BOOKMARK;
$bookmark = 1; $bookmark = 1;
} }
@ -543,7 +543,7 @@ function item_post(App $a) {
* add a statusnet style reply tag if the original post was from there * add a statusnet style reply tag if the original post was from there
* and we are replying, and there isn't one already * and we are replying, and there isn't one already
*/ */
if ($parent AND ($parent_contact['network'] == NETWORK_OSTATUS)) { if ($parent && ($parent_contact['network'] == NETWORK_OSTATUS)) {
$contact = '@[url=' . $parent_contact['url'] . ']' . $parent_contact['nick'] . '[/url]'; $contact = '@[url=' . $parent_contact['url'] . ']' . $parent_contact['nick'] . '[/url]';
if (!in_array($contact, $tags)) { if (!in_array($contact, $tags)) {
@ -1226,7 +1226,7 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n
} }
// select someone by attag or nick and the name passed in the current network // select someone by attag or nick and the name passed in the current network
if(!dbm::is_result($r) AND ($network != "")) if(!dbm::is_result($r) && ($network != ""))
$r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `network` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1", $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `network` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1",
dbesc($name), dbesc($name),
dbesc($name), dbesc($name),
@ -1235,7 +1235,7 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n
); );
//select someone from this user's contacts by name in the current network //select someone from this user's contacts by name in the current network
if (!dbm::is_result($r) AND ($network != "")) { if (!dbm::is_result($r) && ($network != "")) {
$r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `name` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1", $r = q("SELECT `id`, `url`, `nick`, `name`, `alias`, `network` FROM `contact` WHERE `name` = '%s' AND `network` = '%s' AND `uid` = %d LIMIT 1",
dbesc($name), dbesc($name),
dbesc($network), dbesc($network),
@ -1262,7 +1262,7 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n
} }
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
if (strlen($inform) AND (isset($r[0]["notify"]) OR isset($r[0]["id"]))) { if (strlen($inform) && (isset($r[0]["notify"]) || isset($r[0]["id"]))) {
$inform .= ','; $inform .= ',';
} }
@ -1275,14 +1275,14 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n
$profile = $r[0]["url"]; $profile = $r[0]["url"];
$alias = $r[0]["alias"]; $alias = $r[0]["alias"];
$newname = $r[0]["nick"]; $newname = $r[0]["nick"];
if (($newname == "") OR (($r[0]["network"] != NETWORK_OSTATUS) AND ($r[0]["network"] != NETWORK_TWITTER) if (($newname == "") || (($r[0]["network"] != NETWORK_OSTATUS) && ($r[0]["network"] != NETWORK_TWITTER)
AND ($r[0]["network"] != NETWORK_STATUSNET) AND ($r[0]["network"] != NETWORK_APPNET))) { && ($r[0]["network"] != NETWORK_STATUSNET) && ($r[0]["network"] != NETWORK_APPNET))) {
$newname = $r[0]["name"]; $newname = $r[0]["name"];
} }
} }
//if there is an url for this persons profile //if there is an url for this persons profile
if (isset($profile) AND ($newname != "")) { if (isset($profile) && ($newname != "")) {
$replaced = true; $replaced = true;
// create profile link // create profile link

View file

@ -398,7 +398,7 @@ function network_content(App $a, $update = 0) {
} }
set_pconfig(local_user(), 'network.view', 'net.selected', ($nets ? $nets : 'all')); set_pconfig(local_user(), 'network.view', 'net.selected', ($nets ? $nets : 'all'));
if(!$update AND !$rawmode) { if(!$update && !$rawmode) {
$tabs = network_tabs($a); $tabs = network_tabs($a);
$o .= $tabs; $o .= $tabs;
@ -459,7 +459,7 @@ function network_content(App $a, $update = 0) {
$sql_table = "`thread`"; $sql_table = "`thread`";
$sql_parent = "`iid`"; $sql_parent = "`iid`";
if ($nouveau OR strlen($file) OR $update) { if ($nouveau || strlen($file) || $update) {
$sql_table = "`item`"; $sql_table = "`item`";
$sql_parent = "`parent`"; $sql_parent = "`parent`";
$sql_post_table = " INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`"; $sql_post_table = " INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`";

View file

@ -25,12 +25,12 @@ function nodeinfo_init(App $a) {
killme(); killme();
} }
if (($a->argc != 2) OR ($a->argv[1] != '1.0')) { if (($a->argc != 2) || ($a->argv[1] != '1.0')) {
http_status_exit(404); http_status_exit(404);
killme(); killme();
} }
$smtp = (function_exists('imap_open') AND !Config::get('system', 'imap_disabled') AND !Config::get('system', 'dfrn_only')); $smtp = (function_exists('imap_open') && !Config::get('system', 'imap_disabled') && !Config::get('system', 'dfrn_only'));
$nodeinfo = array(); $nodeinfo = array();
$nodeinfo['version'] = '1.0'; $nodeinfo['version'] = '1.0';
@ -74,7 +74,7 @@ function nodeinfo_init(App $a) {
if (plugin_enabled('appnet')) { if (plugin_enabled('appnet')) {
$nodeinfo['services']['inbound'][] = 'appnet'; $nodeinfo['services']['inbound'][] = 'appnet';
} }
if (plugin_enabled('appnet') OR plugin_enabled('buffer')) { if (plugin_enabled('appnet') || plugin_enabled('buffer')) {
$nodeinfo['services']['outbound'][] = 'appnet'; $nodeinfo['services']['outbound'][] = 'appnet';
} }
if (plugin_enabled('blogger')) { if (plugin_enabled('blogger')) {
@ -83,7 +83,7 @@ function nodeinfo_init(App $a) {
if (plugin_enabled('dwpost')) { if (plugin_enabled('dwpost')) {
$nodeinfo['services']['outbound'][] = 'dreamwidth'; $nodeinfo['services']['outbound'][] = 'dreamwidth';
} }
if (plugin_enabled('fbpost') OR plugin_enabled('buffer')) { if (plugin_enabled('fbpost') || plugin_enabled('buffer')) {
$nodeinfo['services']['outbound'][] = 'facebook'; $nodeinfo['services']['outbound'][] = 'facebook';
} }
if (plugin_enabled('statusnet')) { if (plugin_enabled('statusnet')) {
@ -91,7 +91,7 @@ function nodeinfo_init(App $a) {
$nodeinfo['services']['outbound'][] = 'gnusocial'; $nodeinfo['services']['outbound'][] = 'gnusocial';
} }
if (plugin_enabled('gpluspost') OR plugin_enabled('buffer')) { if (plugin_enabled('gpluspost') || plugin_enabled('buffer')) {
$nodeinfo['services']['outbound'][] = 'google'; $nodeinfo['services']['outbound'][] = 'google';
} }
if (plugin_enabled('ijpost')) { if (plugin_enabled('ijpost')) {
@ -123,7 +123,7 @@ function nodeinfo_init(App $a) {
if (plugin_enabled('tumblr')) { if (plugin_enabled('tumblr')) {
$nodeinfo['services']['outbound'][] = 'tumblr'; $nodeinfo['services']['outbound'][] = 'tumblr';
} }
if (plugin_enabled('twitter') OR plugin_enabled('buffer')) { if (plugin_enabled('twitter') || plugin_enabled('buffer')) {
$nodeinfo['services']['outbound'][] = 'twitter'; $nodeinfo['services']['outbound'][] = 'twitter';
} }
if (plugin_enabled('wppost')) { if (plugin_enabled('wppost')) {
@ -203,11 +203,11 @@ function nodeinfo_cron() {
$month = time() - (30 * 24 * 60 * 60); $month = time() - (30 * 24 * 60 * 60);
foreach ($users AS $user) { foreach ($users AS $user) {
if ((strtotime($user['login_date']) > $halfyear) OR if ((strtotime($user['login_date']) > $halfyear) ||
(strtotime($user['last-item']) > $halfyear)) { (strtotime($user['last-item']) > $halfyear)) {
++$active_users_halfyear; ++$active_users_halfyear;
} }
if ((strtotime($user['login_date']) > $month) OR if ((strtotime($user['login_date']) > $month) ||
(strtotime($user['last-item']) > $month)) { (strtotime($user['last-item']) > $month)) {
++$active_users_monthly; ++$active_users_monthly;
} }

View file

@ -17,7 +17,7 @@ function noscrape_init(App $a) {
profile_load($a,$which,$profile); profile_load($a,$which,$profile);
if (!$a->profile['net-publish'] OR $a->profile['hidewall']) { if (!$a->profile['net-publish'] || $a->profile['hidewall']) {
header('Content-type: application/json; charset=utf-8'); header('Content-type: application/json; charset=utf-8');
$json_info = array("hide" => true); $json_info = array("hide" => true);
echo json_encode($json_info); echo json_encode($json_info);
@ -42,7 +42,7 @@ function noscrape_init(App $a) {
'tags' => $keywords 'tags' => $keywords
); );
if (is_array($a->profile) AND !$a->profile['hide-friends']) { if (is_array($a->profile) && !$a->profile['hide-friends']) {
$r = q("SELECT `gcontact`.`updated` FROM `contact` INNER JOIN `gcontact` WHERE `gcontact`.`nurl` = `contact`.`nurl` AND `self` AND `uid` = %d LIMIT 1", $r = q("SELECT `gcontact`.`updated` FROM `contact` INNER JOIN `gcontact` WHERE `gcontact`.`nurl` = `contact`.`nurl` AND `self` AND `uid` = %d LIMIT 1",
intval($a->profile['uid'])); intval($a->profile['uid']));
if (dbm::is_result($r)) { if (dbm::is_result($r)) {

View file

@ -119,7 +119,7 @@ function photo_init(App $a) {
intval($resolution) intval($resolution)
); );
$public = (dbm::is_result($r)) AND ($r[0]['allow_cid'] == '') AND ($r[0]['allow_gid'] == '') AND ($r[0]['deny_cid'] == '') AND ($r[0]['deny_gid'] == ''); $public = (dbm::is_result($r)) && ($r[0]['allow_cid'] == '') && ($r[0]['allow_gid'] == '') && ($r[0]['deny_cid'] == '') && ($r[0]['deny_gid'] == '');
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
$resolution = $r[0]['scale']; $resolution = $r[0]['scale'];

View file

@ -330,10 +330,10 @@ function ping_init(App $a)
if (dbm::is_result($notifs)) { if (dbm::is_result($notifs)) {
// Are the nofications called from the regular process or via the friendica app? // Are the nofications called from the regular process or via the friendica app?
$regularnotifications = (intval($_GET['uid']) AND intval($_GET['_'])); $regularnotifications = (intval($_GET['uid']) && intval($_GET['_']));
foreach ($notifs as $notif) { foreach ($notifs as $notif) {
if ($a->is_friendica_app() OR !$regularnotifications) { if ($a->is_friendica_app() || !$regularnotifications) {
$notif['message'] = str_replace("{0}", $notif['name'], $notif['message']); $notif['message'] = str_replace("{0}", $notif['name'], $notif['message']);
} }
@ -434,7 +434,7 @@ function ping_get_notifications($uid)
intval($offset) intval($offset)
); );
if (!$r AND !$seen) { if (!$r && !$seen) {
$seen = true; $seen = true;
$seensql = ""; $seensql = "";
$order = "DESC"; $order = "DESC";
@ -474,12 +474,12 @@ function ping_get_notifications($uid)
$notification["href"] = App::get_baseurl() . "/notify/view/" . $notification["id"]; $notification["href"] = App::get_baseurl() . "/notify/view/" . $notification["id"];
if ($notification["visible"] AND !$notification["spam"] AND if ($notification["visible"] && !$notification["spam"] &&
!$notification["deleted"] AND !is_array($result[$notification["parent"]])) { !$notification["deleted"] && !is_array($result[$notification["parent"]])) {
$result[$notification["parent"]] = $notification; $result[$notification["parent"]] = $notification;
} }
} }
} while ((count($result) < 50) AND !$quit); } while ((count($result) < 50) && !$quit);
return($result); return($result);
} }

View file

@ -55,7 +55,7 @@ function poco_init(App $a) {
$cid = intval($a->argv[4]); $cid = intval($a->argv[4]);
} }
if (! $system_mode AND ! $global) { if (! $system_mode && ! $global) {
$users = q("SELECT `user`.*,`profile`.`hide-friends` from user left join profile on `user`.`uid` = `profile`.`uid` $users = 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)
@ -157,7 +157,7 @@ function poco_init(App $a) {
if (x($_GET, 'filtered')) { if (x($_GET, 'filtered')) {
$ret['filtered'] = false; $ret['filtered'] = false;
} }
if (x($_GET, 'updatedSince') AND ! $global) { if (x($_GET, 'updatedSince') && ! $global) {
$ret['updatedSince'] = false; $ret['updatedSince'] = false;
} }
$ret['startIndex'] = (int) $startIndex; $ret['startIndex'] = (int) $startIndex;
@ -207,21 +207,21 @@ function poco_init(App $a) {
} }
} }
if (($contact['about'] == "") AND isset($contact['pabout'])) { if (($contact['about'] == "") && isset($contact['pabout'])) {
$contact['about'] = $contact['pabout']; $contact['about'] = $contact['pabout'];
} }
if ($contact['location'] == "") { if ($contact['location'] == "") {
if (isset($contact['plocation'])) { if (isset($contact['plocation'])) {
$contact['location'] = $contact['plocation']; $contact['location'] = $contact['plocation'];
} }
if (isset($contact['pregion']) AND ( $contact['pregion'] != "")) { if (isset($contact['pregion']) && ( $contact['pregion'] != "")) {
if ($contact['location'] != "") { if ($contact['location'] != "") {
$contact['location'] .= ", "; $contact['location'] .= ", ";
} }
$contact['location'] .= $contact['pregion']; $contact['location'] .= $contact['pregion'];
} }
if (isset($contact['pcountry']) AND ( $contact['pcountry'] != "")) { if (isset($contact['pcountry']) && ( $contact['pcountry'] != "")) {
if ($contact['location'] != "") { if ($contact['location'] != "") {
$contact['location'] .= ", "; $contact['location'] .= ", ";
} }
@ -229,10 +229,10 @@ function poco_init(App $a) {
} }
} }
if (($contact['gender'] == "") AND isset($contact['pgender'])) { if (($contact['gender'] == "") && isset($contact['pgender'])) {
$contact['gender'] = $contact['pgender']; $contact['gender'] = $contact['pgender'];
} }
if (($contact['keywords'] == "") AND isset($contact['pub_keywords'])) { if (($contact['keywords'] == "") && isset($contact['pub_keywords'])) {
$contact['keywords'] = $contact['pub_keywords']; $contact['keywords'] = $contact['pub_keywords'];
} }
if (isset($contact['account-type'])) { if (isset($contact['account-type'])) {
@ -306,7 +306,7 @@ function poco_init(App $a) {
if ($entry['network'] == NETWORK_STATUSNET) { if ($entry['network'] == NETWORK_STATUSNET) {
$entry['network'] = NETWORK_OSTATUS; $entry['network'] = NETWORK_OSTATUS;
} }
if (($entry['network'] == "") AND ($contact['self'])) { if (($entry['network'] == "") && ($contact['self'])) {
$entry['network'] = NETWORK_DFRN; $entry['network'] = NETWORK_DFRN;
} }
} }

View file

@ -48,15 +48,15 @@ function proxy_init(App $a) {
$basepath = $a->get_basepath(); $basepath = $a->get_basepath();
// If the cache path isn't there, try to create it // If the cache path isn't there, try to create it
if (!is_dir($basepath . '/proxy') AND is_writable($basepath)) { if (!is_dir($basepath . '/proxy') && is_writable($basepath)) {
mkdir($basepath . '/proxy'); mkdir($basepath . '/proxy');
} }
// Checking if caching into a folder in the webroot is activated and working // Checking if caching into a folder in the webroot is activated and working
$direct_cache = (is_dir($basepath . '/proxy') AND is_writable($basepath . '/proxy')); $direct_cache = (is_dir($basepath . '/proxy') && is_writable($basepath . '/proxy'));
// Look for filename in the arguments // Look for filename in the arguments
if ((isset($a->argv[1]) OR isset($a->argv[2]) OR isset($a->argv[3])) AND !isset($_REQUEST['url'])) { if ((isset($a->argv[1]) || isset($a->argv[2]) || isset($a->argv[3])) && !isset($_REQUEST['url'])) {
if (isset($a->argv[3])) { if (isset($a->argv[3])) {
$url = $a->argv[3]; $url = $a->argv[3];
} elseif (isset($a->argv[2])) { } elseif (isset($a->argv[2])) {
@ -65,7 +65,7 @@ function proxy_init(App $a) {
$url = $a->argv[1]; $url = $a->argv[1];
} }
if (isset($a->argv[3]) AND ($a->argv[3] == 'thumb')) { if (isset($a->argv[3]) && ($a->argv[3] == 'thumb')) {
$size = 200; $size = 200;
} }
@ -112,7 +112,7 @@ function proxy_init(App $a) {
$urlhash = 'pic:' . sha1($_REQUEST['url']); $urlhash = 'pic:' . sha1($_REQUEST['url']);
$cachefile = get_cachefile(hash('md5', $_REQUEST['url'])); $cachefile = get_cachefile(hash('md5', $_REQUEST['url']));
if ($cachefile != '' AND file_exists($cachefile)) { if ($cachefile != '' && file_exists($cachefile)) {
$img_str = file_get_contents($cachefile); $img_str = file_get_contents($cachefile);
$mime = image_type_to_mime_type(exif_imagetype($cachefile)); $mime = image_type_to_mime_type(exif_imagetype($cachefile));
@ -140,7 +140,7 @@ function proxy_init(App $a) {
$valid = true; $valid = true;
$r = array(); $r = array();
if (!$direct_cache AND ($cachefile == '')) { if (!$direct_cache && ($cachefile == '')) {
$r = qu("SELECT * FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", $urlhash); $r = qu("SELECT * FROM `photo` WHERE `resource-id` = '%s' LIMIT 1", $urlhash);
if (dbm::is_result($r)) { if (dbm::is_result($r)) {
$img_str = $r[0]['data']; $img_str = $r[0]['data'];
@ -163,7 +163,7 @@ function proxy_init(App $a) {
unlink($tempfile); unlink($tempfile);
// If there is an error then return a blank image // If there is an error then return a blank image
if ((substr($a->get_curl_code(), 0, 1) == '4') OR (!$img_str)) { if ((substr($a->get_curl_code(), 0, 1) == '4') || (!$img_str)) {
$img_str = file_get_contents('images/blank.png'); $img_str = file_get_contents('images/blank.png');
$mime = 'image/png'; $mime = 'image/png';
$cachefile = ''; // Clear the cachefile so that the dummy isn't stored $cachefile = ''; // Clear the cachefile so that the dummy isn't stored
@ -173,7 +173,7 @@ function proxy_init(App $a) {
$img->scaleImage(10); $img->scaleImage(10);
$img_str = $img->imageString(); $img_str = $img->imageString();
} }
} elseif ($mime != 'image/jpeg' AND !$direct_cache AND $cachefile == '') { } elseif ($mime != 'image/jpeg' && !$direct_cache && $cachefile == '') {
$image = @imagecreatefromstring($img_str); $image = @imagecreatefromstring($img_str);
if ($image === FALSE) { if ($image === FALSE) {
@ -199,7 +199,7 @@ function proxy_init(App $a) {
} else { } else {
$img = new Photo($img_str, $mime); $img = new Photo($img_str, $mime);
if ($img->is_valid() AND !$direct_cache AND ($cachefile == '')) { if ($img->is_valid() && !$direct_cache && ($cachefile == '')) {
$img->store(0, 0, $urlhash, $_REQUEST['url'], '', 100); $img->store(0, 0, $urlhash, $_REQUEST['url'], '', 100);
} }
} }
@ -219,7 +219,7 @@ function proxy_init(App $a) {
// If there is a real existing directory then put the cache file there // If there is a real existing directory then put the cache file there
// advantage: real file access is really fast // advantage: real file access is really fast
// Otherwise write in cachefile // Otherwise write in cachefile
if ($valid AND $direct_cache) { if ($valid && $direct_cache) {
file_put_contents($basepath . '/proxy/' . proxy_url($_REQUEST['url'], true), $img_str_orig); file_put_contents($basepath . '/proxy/' . proxy_url($_REQUEST['url'], true), $img_str_orig);
if ($sizetype != '') { if ($sizetype != '') {
file_put_contents($basepath . '/proxy/' . proxy_url($_REQUEST['url'], true) . $sizetype, $img_str); file_put_contents($basepath . '/proxy/' . proxy_url($_REQUEST['url'], true) . $sizetype, $img_str);
@ -282,7 +282,7 @@ function proxy_url($url, $writemode = false, $size = '') {
$shortpath = hash('md5', $url); $shortpath = hash('md5', $url);
$longpath = substr($shortpath, 0, 2); $longpath = substr($shortpath, 0, 2);
if (is_dir($basepath) AND $writemode AND !is_dir($basepath . '/' . $longpath)) { if (is_dir($basepath) && $writemode && !is_dir($basepath . '/' . $longpath)) {
mkdir($basepath . '/' . $longpath); mkdir($basepath . '/' . $longpath);
chmod($basepath . '/' . $longpath, 0777); chmod($basepath . '/' . $longpath, 0777);
} }
@ -306,7 +306,7 @@ function proxy_url($url, $writemode = false, $size = '') {
// Too long files aren't supported by Apache // Too long files aren't supported by Apache
// Writemode in combination with long files shouldn't be possible // Writemode in combination with long files shouldn't be possible
if ((strlen($proxypath) > 250) AND $writemode) { if ((strlen($proxypath) > 250) && $writemode) {
return $shortpath; return $shortpath;
} elseif (strlen($proxypath) > 250) { } elseif (strlen($proxypath) > 250) {
return App::get_baseurl() . '/proxy/' . $shortpath . '?url=' . urlencode($url); return App::get_baseurl() . '/proxy/' . $shortpath . '?url=' . urlencode($url);
@ -360,7 +360,7 @@ function proxy_parse_query($url) {
function proxy_img_cb($matches) { function proxy_img_cb($matches) {
// if the picture seems to be from another picture cache then take the original source // if the picture seems to be from another picture cache then take the original source
$queryvar = proxy_parse_query($matches[2]); $queryvar = proxy_parse_query($matches[2]);
if (($queryvar['url'] != '') AND (substr($queryvar['url'], 0, 4) == 'http')) { if (($queryvar['url'] != '') && (substr($queryvar['url'], 0, 4) == 'http')) {
$matches[2] = urldecode($queryvar['url']); $matches[2] = urldecode($queryvar['url']);
} }

View file

@ -8,6 +8,7 @@ require_once('include/user.php');
if(! function_exists('register_post')) { if(! function_exists('register_post')) {
function register_post(App $a) { function register_post(App $a) {
check_form_security_token_redirectOnErr('/register', 'register');
global $lang; global $lang;
@ -83,7 +84,7 @@ function register_post(App $a) {
} }
// Only send a password mail when the password wasn't manually provided // Only send a password mail when the password wasn't manually provided
if (!x($_POST,'password1') OR !x($_POST,'confirm')) { if (!x($_POST,'password1') || !x($_POST,'confirm')) {
$res = send_register_open_eml( $res = send_register_open_eml(
$user['email'], $user['email'],
$a->config['sitename'], $a->config['sitename'],
@ -296,7 +297,7 @@ function register_content(App $a) {
'$sitename' => $a->get_hostname(), '$sitename' => $a->get_hostname(),
'$importh' => t('Import'), '$importh' => t('Import'),
'$importt' => t('Import your profile to this friendica instance'), '$importt' => t('Import your profile to this friendica instance'),
'$form_security_token' => get_form_security_token("register")
)); ));
return $o; return $o;

View file

@ -92,12 +92,12 @@ function search_post(App $a) {
function search_content(App $a) { function search_content(App $a) {
if((get_config('system','block_public')) && (! local_user()) && (! remote_user())) { if (get_config('system','block_public') && !local_user() && !remote_user()) {
notice(t('Public access denied.') . EOL); notice(t('Public access denied.') . EOL);
return; return;
} }
if(get_config('system','local_search') AND !local_user()) { if (get_config('system','local_search') && !local_user() && !remote_user()) {
http_status_exit(403, http_status_exit(403,
array("title" => t("Public access denied."), array("title" => t("Public access denied."),
"description" => t("Only logged in users are permitted to perform a search."))); "description" => t("Only logged in users are permitted to perform a search.")));
@ -106,7 +106,7 @@ function search_content(App $a) {
//return; //return;
} }
if (get_config('system','permit_crawling') AND !local_user()) { if (get_config('system','permit_crawling') && !local_user() && !remote_user()) {
// Default values: // Default values:
// 10 requests are "free", after the 11th only a call per minute is allowed // 10 requests are "free", after the 11th only a call per minute is allowed
@ -122,7 +122,7 @@ function search_content(App $a) {
$result = Cache::get("remote_search:".$remote); $result = Cache::get("remote_search:".$remote);
if (!is_null($result)) { if (!is_null($result)) {
$resultdata = json_decode($result); $resultdata = json_decode($result);
if (($resultdata->time > (time() - $crawl_permit_period)) AND ($resultdata->accesses > $free_crawls)) { if (($resultdata->time > (time() - $crawl_permit_period)) && ($resultdata->accesses > $free_crawls)) {
http_status_exit(429, http_status_exit(429,
array("title" => t("Too Many Requests"), array("title" => t("Too Many Requests"),
"description" => t("Only one search per minute is permitted for not logged in users."))); "description" => t("Only one search per minute is permitted for not logged in users.")));

View file

@ -462,13 +462,13 @@ function settings_post(App $a) {
$notify += intval($_POST['notify8']); $notify += intval($_POST['notify8']);
// Adjust the page flag if the account type doesn't fit to the page flag. // Adjust the page flag if the account type doesn't fit to the page flag.
if (($account_type == ACCOUNT_TYPE_PERSON) AND !in_array($page_flags, array(PAGE_NORMAL, PAGE_SOAPBOX, PAGE_FREELOVE))) if (($account_type == ACCOUNT_TYPE_PERSON) && !in_array($page_flags, array(PAGE_NORMAL, PAGE_SOAPBOX, PAGE_FREELOVE)))
$page_flags = PAGE_NORMAL; $page_flags = PAGE_NORMAL;
elseif (($account_type == ACCOUNT_TYPE_ORGANISATION) AND !in_array($page_flags, array(PAGE_SOAPBOX))) elseif (($account_type == ACCOUNT_TYPE_ORGANISATION) && !in_array($page_flags, array(PAGE_SOAPBOX)))
$page_flags = PAGE_SOAPBOX; $page_flags = PAGE_SOAPBOX;
elseif (($account_type == ACCOUNT_TYPE_NEWS) AND !in_array($page_flags, array(PAGE_SOAPBOX))) elseif (($account_type == ACCOUNT_TYPE_NEWS) && !in_array($page_flags, array(PAGE_SOAPBOX)))
$page_flags = PAGE_SOAPBOX; $page_flags = PAGE_SOAPBOX;
elseif (($account_type == ACCOUNT_TYPE_COMMUNITY) AND !in_array($page_flags, array(PAGE_COMMUNITY, PAGE_PRVGROUP))) elseif (($account_type == ACCOUNT_TYPE_COMMUNITY) && !in_array($page_flags, array(PAGE_COMMUNITY, PAGE_PRVGROUP)))
$page_flags = PAGE_COMMUNITY; $page_flags = PAGE_COMMUNITY;
$email_changed = false; $email_changed = false;
@ -949,7 +949,7 @@ function settings_content(App $a) {
$is_experimental = file_exists('view/theme/' . $th . '/experimental'); $is_experimental = file_exists('view/theme/' . $th . '/experimental');
$unsupported = file_exists('view/theme/' . $th . '/unsupported'); $unsupported = file_exists('view/theme/' . $th . '/unsupported');
$is_mobile = file_exists('view/theme/' . $th . '/mobile'); $is_mobile = file_exists('view/theme/' . $th . '/mobile');
if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){ if (!$is_experimental || ($is_experimental && (get_config('experimentals','exp_themes')==1 || get_config('experimentals','exp_themes')===false))){
$theme_name = (($is_experimental) ? sprintf("%s - \x28Experimental\x29", $f) : $f); $theme_name = (($is_experimental) ? sprintf("%s - \x28Experimental\x29", $f) : $f);
if ($is_mobile) { if ($is_mobile) {
$mobile_themes[$f]=$theme_name; $mobile_themes[$f]=$theme_name;
@ -1101,7 +1101,7 @@ function settings_content(App $a) {
// Set the account type to "Community" when the page is a community page but the account type doesn't fit // Set the account type to "Community" when the page is a community page but the account type doesn't fit
// This is only happening on the first visit after the update // This is only happening on the first visit after the update
if (in_array($a->user['page-flags'], array(PAGE_COMMUNITY, PAGE_PRVGROUP)) AND if (in_array($a->user['page-flags'], array(PAGE_COMMUNITY, PAGE_PRVGROUP)) &&
($a->user['account-type'] != ACCOUNT_TYPE_COMMUNITY)) ($a->user['account-type'] != ACCOUNT_TYPE_COMMUNITY))
$a->user['account-type'] = ACCOUNT_TYPE_COMMUNITY; $a->user['account-type'] = ACCOUNT_TYPE_COMMUNITY;
@ -1118,39 +1118,39 @@ function settings_content(App $a) {
'$type_community' => ACCOUNT_TYPE_COMMUNITY, '$type_community' => ACCOUNT_TYPE_COMMUNITY,
'$account_person' => array('account-type', t('Personal Page'), ACCOUNT_TYPE_PERSON, '$account_person' => array('account-type', t('Personal Page'), ACCOUNT_TYPE_PERSON,
t('This account is a regular personal profile'), t('Account for a personal profile.'),
($a->user['account-type'] == ACCOUNT_TYPE_PERSON)), ($a->user['account-type'] == ACCOUNT_TYPE_PERSON)),
'$account_organisation' => array('account-type', t('Organisation Page'), ACCOUNT_TYPE_ORGANISATION, '$account_organisation' => array('account-type', t('Organisation Page'), ACCOUNT_TYPE_ORGANISATION,
t('This account is a profile for an organisation'), t('Account for an organisation that automatically approves contact requests as "Followers".'),
($a->user['account-type'] == ACCOUNT_TYPE_ORGANISATION)), ($a->user['account-type'] == ACCOUNT_TYPE_ORGANISATION)),
'$account_news' => array('account-type', t('News Page'), ACCOUNT_TYPE_NEWS, '$account_news' => array('account-type', t('News Page'), ACCOUNT_TYPE_NEWS,
t('This account is a news account/reflector'), t('Account for a news reflector that automatically approves contact requests as "Followers".'),
($a->user['account-type'] == ACCOUNT_TYPE_NEWS)), ($a->user['account-type'] == ACCOUNT_TYPE_NEWS)),
'$account_community' => array('account-type', t('Community Forum'), ACCOUNT_TYPE_COMMUNITY, '$account_community' => array('account-type', t('Community Forum'), ACCOUNT_TYPE_COMMUNITY,
t('This account is a community forum where people can discuss with each other'), t('Account for community discussions.'),
($a->user['account-type'] == ACCOUNT_TYPE_COMMUNITY)), ($a->user['account-type'] == ACCOUNT_TYPE_COMMUNITY)),
'$page_normal' => array('page-flags', t('Normal Account Page'), PAGE_NORMAL, '$page_normal' => array('page-flags', t('Normal Account Page'), PAGE_NORMAL,
t('This account is a normal personal profile'), t('Account for a regular personal profile that requires manual approval of "Friends" and "Followers".'),
($a->user['page-flags'] == PAGE_NORMAL)), ($a->user['page-flags'] == PAGE_NORMAL)),
'$page_soapbox' => array('page-flags', t('Soapbox Page'), PAGE_SOAPBOX, '$page_soapbox' => array('page-flags', t('Soapbox Page'), PAGE_SOAPBOX,
t('Automatically approve all connection/friend requests as read-only fans'), t('Account for a public profile that automatically approves contact requests as "Followers".'),
($a->user['page-flags'] == PAGE_SOAPBOX)), ($a->user['page-flags'] == PAGE_SOAPBOX)),
'$page_community' => array('page-flags', t('Public Forum'), PAGE_COMMUNITY, '$page_community' => array('page-flags', t('Public Forum'), PAGE_COMMUNITY,
t('Automatically approve all contact requests'), t('Automatically approves all contact requests.'),
($a->user['page-flags'] == PAGE_COMMUNITY)), ($a->user['page-flags'] == PAGE_COMMUNITY)),
'$page_freelove' => array('page-flags', t('Automatic Friend Page'), PAGE_FREELOVE, '$page_freelove' => array('page-flags', t('Automatic Friend Page'), PAGE_FREELOVE,
t('Automatically approve all connection/friend requests as friends'), t('Account for a popular profile that automatically approves contact requests as "Friends".'),
($a->user['page-flags'] == PAGE_FREELOVE)), ($a->user['page-flags'] == PAGE_FREELOVE)),
'$page_prvgroup' => array('page-flags', t('Private Forum [Experimental]'), PAGE_PRVGROUP, '$page_prvgroup' => array('page-flags', t('Private Forum [Experimental]'), PAGE_PRVGROUP,
t('Private forum - approved members only'), t('Requires manual approval of contact requests.'),
($a->user['page-flags'] == PAGE_PRVGROUP)), ($a->user['page-flags'] == PAGE_PRVGROUP)),

Some files were not shown because too many files have changed in this diff Show more