From 2e022733f67acb2fe027075429ed2078429c55ea Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 21 Dec 2017 22:54:58 +0000 Subject: [PATCH 01/80] Standards --- include/like.php | 8 ++++---- mod/like.php | 29 ++++++++++++++++------------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/include/like.php b/include/like.php index 9a8b9b957b..6b8c138b95 100644 --- a/include/like.php +++ b/include/like.php @@ -24,7 +24,7 @@ use Friendica\Protocol\Diaspora; function do_like($item_id, $verb) { $a = get_app(); - if (! local_user() && ! remote_user()) { + if (!local_user() && !remote_user()) { return false; } @@ -73,21 +73,21 @@ function do_like($item_id, $verb) { dbesc($item_id) ); - if (! $item_id || ! DBM::is_result($items)) { + if (!$item_id || !DBM::is_result($items)) { logger('like: unknown item ' . $item_id); return false; } $item = $items[0]; - if (! can_write_wall($a, $item['uid'])) { + if (!can_write_wall($a, $item['uid'])) { logger('like: unable to write on wall ' . $item['uid']); return false; } // Retrieves the local post owner $owners = q("SELECT `contact`.* FROM `contact` - WHERE `contact`.`self` = 1 + WHERE `contact`.`self` AND `contact`.`uid` = %d", intval($item['uid']) ); diff --git a/mod/like.php b/mod/like.php index 6918bd5521..3c7e70cea6 100644 --- a/mod/like.php +++ b/mod/like.php @@ -3,33 +3,35 @@ use Friendica\App; use Friendica\Core\System; -require_once('include/security.php'); -require_once('include/bbcode.php'); -require_once('include/items.php'); -require_once('include/like.php'); +require_once 'include/security.php'; +require_once 'include/bbcode.php'; +require_once 'include/items.php'; +require_once 'include/like.php'; function like_content(App $a) { - if(! local_user() && ! remote_user()) { + if (!local_user() && !remote_user()) { return false; } $verb = notags(trim($_GET['verb'])); - if(! $verb) + if (!$verb) { $verb = 'like'; + } $item_id = (($a->argc > 1) ? notags(trim($a->argv[1])) : 0); $r = do_like($item_id, $verb); - if (!$r) return; + if (!$r) { + return; + } // See if we've been passed a return path to redirect to $return_path = ((x($_REQUEST,'return')) ? $_REQUEST['return'] : ''); like_content_return(System::baseUrl(), $return_path); killme(); // NOTREACHED -// return; // NOTREACHED } @@ -37,15 +39,16 @@ function like_content(App $a) { // then redirect back to the calling page. If not, just quietly end function like_content_return($baseurl, $return_path) { - - if($return_path) { + if ($return_path) { $rand = '_=' . time(); - if(strpos($return_path, '?')) $rand = "&$rand"; - else $rand = "?$rand"; + if (strpos($return_path, '?')) { + $rand = "&$rand"; + } else { + $rand = "?$rand"; + } goaway($baseurl . "/" . $return_path . $rand); } killme(); } - From 1e7e83510a91c7aabd802b178a094c6bed0c27b8 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 22 Dec 2017 14:48:29 +0000 Subject: [PATCH 02/80] Old stuff had been removed from the update routine --- boot.php | 85 ++- update.php | 1610 +--------------------------------------------------- 2 files changed, 50 insertions(+), 1645 deletions(-) diff --git a/boot.php b/boot.php index 7be7063eb1..0fb8c01b9e 100644 --- a/boot.php +++ b/boot.php @@ -619,10 +619,17 @@ function is_ajax() function check_db($via_worker) { $build = Config::get('system', 'build'); - if (!x($build)) { + + if (empty($build)) { Config::set('system', 'build', DB_UPDATE_VERSION); $build = DB_UPDATE_VERSION; } + + // We don't support upgrading from very old versions anymore + if ($build < NEW_UPDATE_ROUTINE_VERSION) { + die('You try to update from a version prior to database version 1170. The direct upgrade path is not supported. Please update to version 3.5.4 before updating to this version.'); + } + if ($build != DB_UPDATE_VERSION) { // When we cannot execute the database update via the worker, we will do it directly if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) { @@ -647,7 +654,7 @@ function check_url(App $a) // and www.example.com vs example.com. // We will only change the url to an ip address if there is no existing setting - if (!x($url)) { + if (empty($url)) { $url = Config::set('system', 'url', System::baseUrl()); } if ((!link_compare($url, System::baseUrl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->get_hostname))) { @@ -664,7 +671,8 @@ function check_url(App $a) function update_db(App $a) { $build = Config::get('system', 'build'); - if (!x($build)) { + + if (empty($build)) { $build = Config::set('system', 'build', DB_UPDATE_VERSION); } @@ -674,53 +682,32 @@ function update_db(App $a) if ($stored < $current) { Config::load('database'); - // We're reporting a different version than what is currently installed. - // Run any existing update scripts to bring the database up to current. - // make sure that boot.php and update.php are the same release, we might be - // updating right this very second and the correct version of the update.php - // file may not be here yet. This can happen on a very busy site. + // Compare the current structure with the defined structure + $t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION); + if (!is_null($t)) { + return; + } - if (DB_UPDATE_VERSION == UPDATE_VERSION) { - // Compare the current structure with the defined structure + Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time()); - $t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION); - if (!is_null($t)) { - return; - } + // run update routine + // it update the structure in one call + $retval = DBStructure::update(false, true); + if ($retval) { + DBStructure::updateFail( + DB_UPDATE_VERSION, + $retval + ); + return; + } else { + Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success'); + } - Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time()); - - // run old update routine (wich could modify the schema and - // conflits with new routine) - for ($x = $stored; $x < NEW_UPDATE_ROUTINE_VERSION; $x++) { - $r = run_update_function($x); - if (!$r) { - break; - } - } - if ($stored < NEW_UPDATE_ROUTINE_VERSION) { - $stored = NEW_UPDATE_ROUTINE_VERSION; - } - - // run new update routine - // it update the structure in one call - $retval = DBStructure::update(false, true); - if ($retval) { - DBStructure::updateFail( - DB_UPDATE_VERSION, - $retval - ); - return; - } else { - Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success'); - } - - // run any left update_nnnn functions in update.php - for ($x = $stored; $x < $current; $x ++) { - $r = run_update_function($x); - if (!$r) { - break; - } + // run any left update_nnnn functions in update.php + for ($x = $stored; $x < $current; $x ++) { + $r = run_update_function($x); + if (!$r) { + break; } } } @@ -996,7 +983,7 @@ function remote_user() if (local_user()) { return false; } - if ((x($_SESSION, 'authenticated')) && (x($_SESSION, 'visitor_id'))) { + if (x($_SESSION, 'authenticated') && x($_SESSION, 'visitor_id')) { return intval($_SESSION['visitor_id']); } return false; @@ -1051,7 +1038,7 @@ function info($s) function get_max_import_size() { $a = get_app(); - return ((x($a->config, 'max_import_size')) ? $a->config['max_import_size'] : 0 ); + return (x($a->config, 'max_import_size') ? $a->config['max_import_size'] : 0); } diff --git a/update.php b/update.php index a968451e36..6c1785885c 100644 --- a/update.php +++ b/update.php @@ -1,7 +1,5 @@ false )); - $sprvkey = ''; - openssl_pkey_export($sres, $sprvkey); - $spkey = openssl_pkey_get_details($sres); - $spubkey = $spkey["key"]; - $r = q("UPDATE `user` SET `spubkey` = '%s', `sprvkey` = '%s' - WHERE `uid` = %d", - dbesc($spubkey), - dbesc($sprvkey), - intval($rr['uid']) - ); - } - } -} - -function update_1007() { - q("ALTER TABLE `user` ADD `page-flags` INT NOT NULL DEFAULT '0' AFTER `notify-flags`"); - q("ALTER TABLE `user` ADD INDEX ( `nickname` )"); -} - -function update_1008() { - q("ALTER TABLE `profile` ADD `with` TEXT NOT NULL AFTER `marital` "); -} - -function update_1009() { - q("ALTER TABLE `user` ADD `allow_location` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `default-location` "); -} - -function update_1010() { - q("ALTER TABLE `contact` ADD `lrdd` CHAR( 255 ) NOT NULL AFTER `url` "); -} - -function update_1011() { - q("ALTER TABLE `contact` ADD `nick` CHAR( 255 ) NOT NULL AFTER `name` "); - $r = q("SELECT * FROM `contact` WHERE 1"); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - q("UPDATE `contact` SET `nick` = '%s' WHERE `id` = %d", - dbesc(basename($rr['url'])), - intval($rr['id']) - ); - } - } -} - -function update_1012() { - q("ALTER TABLE `item` ADD `inform` MEDIUMTEXT NOT NULL AFTER `tag` "); -} - -function update_1013() { - q("ALTER TABLE `item` ADD `target-type` CHAR( 255 ) NOT NULL - AFTER `object` , ADD `target` TEXT NOT NULL AFTER `target-type`"); -} - -function update_1014() -{ - q("ALTER TABLE `contact` ADD `micro` TEXT NOT NULL AFTER `thumb` "); - $r = q("SELECT * FROM `photo` WHERE `scale` = 4"); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - $Image = new Image($rr['data']); - if ($Image->isValid()) { - $Image->scaleDown(48); - Photo::store($Image, $rr['uid'],$rr['contact-id'],$rr['resource-id'],$rr['filename'],$rr['album'],6,(($rr['profile']) ? 1 : 0)); - } - } - } - $r = q("SELECT * FROM `contact` WHERE 1"); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - if(stristr($rr['thumb'],'avatar')) - q("UPDATE `contact` SET `micro` = '%s' WHERE `id` = %d", - dbesc(str_replace('avatar','micro',$rr['thumb'])), - intval($rr['id'])); - else - q("UPDATE `contact` SET `micro` = '%s' WHERE `id` = %d", - dbesc(str_replace('5.jpg','6.jpg',$rr['thumb'])), - intval($rr['id'])); - } - } -} - -function update_1015() { - q("ALTER TABLE `item` CHANGE `body` `body` mediumtext NOT NULL"); -} - -function update_1016() { - q("ALTER TABLE `user` ADD `openid` CHAR( 255 ) NOT NULL AFTER `email` "); -} - -function update_1017() { - - q(" CREATE TABLE IF NOT EXISTS `clients` ( -`client_id` VARCHAR( 20 ) NOT NULL , -`pw` VARCHAR( 20 ) NOT NULL , -`redirect_uri` VARCHAR( 200 ) NOT NULL , -PRIMARY KEY ( `client_id` ) -) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); - - q(" CREATE TABLE IF NOT EXISTS `tokens` ( -`id` VARCHAR( 40 ) NOT NULL , -`client_id` VARCHAR( 20 ) NOT NULL , -`expires` INT NOT NULL , -`scope` VARCHAR( 200 ) NOT NULL , -PRIMARY KEY ( `id` ) -) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); - - q("CREATE TABLE IF NOT EXISTS `auth_codes` ( -`id` VARCHAR( 40 ) NOT NULL , -`client_id` VARCHAR( 20 ) NOT NULL , -`redirect_uri` VARCHAR( 200 ) NOT NULL , -`expires` INT NOT NULL , -`scope` VARCHAR( 250 ) NOT NULL , -PRIMARY KEY ( `id` ) -) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); - -} - -function update_1018() { - q("CREATE TABLE IF NOT EXISTS `queue` ( -`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , -`cid` INT NOT NULL , -`created` DATETIME NOT NULL , -`last` DATETIME NOT NULL , -`content` MEDIUMTEXT NOT NULL -) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); -} - -function update_1019() { - q("ALTER TABLE `mail` DROP `delivered`"); - q("ALTER TABLE `profile` ADD `showwith` TINYINT(1) NOT NULL DEFAULT '0' AFTER `marital` "); -} - -function update_1020() { - q("ALTER TABLE `profile` DROP `showwith`"); - q("ALTER TABLE `item` ADD `thr-parent` CHAR( 255 ) NOT NULL AFTER `parent-uri` "); -} - -function update_1021() { - q("ALTER TABLE `profile_check` ADD `sec` CHAR( 255 ) NOT NULL AFTER `dfrn_id` "); - q("ALTER TABLE `profile_check` ADD `cid` INT(10) unsigned NOT NULL DEFAULT '0' AFTER `uid`"); - q("ALTER TABLE `item` ADD `private` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `deny_gid` "); -} - -function update_1022() { - q("CREATE TABLE `pconfig` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `uid` INT NOT NULL DEFAULT '0', - `cat` CHAR( 255 ) NOT NULL , - `k` CHAR( 255 ) NOT NULL , - `v` MEDIUMTEXT NOT NULL - ) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci "); -} - -function update_1023() { - q("ALTER TABLE `user` ADD `register_date` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `timezone` , - ADD `login_date` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `register_date` "); -} - -function update_1024() { - q("ALTER TABLE `profile` ADD `keywords` TEXT NOT NULL AFTER `religion` "); -} - -function update_1025() { - q("ALTER TABLE `user` ADD `maxreq` int(11) NOT NULL DEFAULT '10' AFTER `pwdreset` "); -} - -function update_1026() { - q("CREATE TABLE IF NOT EXISTS `hook` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `hook` CHAR( 255 ) NOT NULL , - `file` CHAR( 255 ) NOT NULL , - `function` CHAR( 255 ) NOT NULL - ) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); -} - - -function update_1027() { - q("CREATE TABLE IF NOT EXISTS `addon` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `name` CHAR( 255 ) NOT NULL , - `version` CHAR( 255 ) NOT NULL , - `installed` TINYINT( 1 ) NOT NULL DEFAULT '0' - ) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); -} - -function update_1028() { - q("ALTER TABLE `user` ADD `openidserver` text NOT NULL AFTER `deny_gid` "); -} - -function update_1029() { - q("ALTER TABLE `contact` ADD `info` MEDIUMTEXT NOT NULL AFTER `reason` "); -} - -function update_1030() { - q("ALTER TABLE `contact` ADD `bdyear` CHAR( 4 ) NOT NULL COMMENT 'birthday notify flag' AFTER `profile-id` "); - - q("CREATE TABLE IF NOT EXISTS `event` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `uid` INT NOT NULL , - `cid` INT NOT NULL , - `created` DATETIME NOT NULL , - `edited` DATETIME NOT NULL , - `start` DATETIME NOT NULL , - `finish` DATETIME NOT NULL , - `desc` TEXT NOT NULL , - `location` TEXT NOT NULL , - `type` CHAR( 255 ) NOT NULL , - `adjust` TINYINT( 1 ) NOT NULL DEFAULT '1', - `allow_cid` MEDIUMTEXT NOT NULL , - `allow_gid` MEDIUMTEXT NOT NULL , - `deny_cid` MEDIUMTEXT NOT NULL , - `deny_gid` MEDIUMTEXT NOT NULL - ) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); - - -} - -function update_1031() { - // Repair any bad links that slipped into the item table - $r = q("SELECT `id`, `object` FROM `item` WHERE `object` != '' "); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - if (strstr($rr['object'],'type="http')) { - q("UPDATE `item` SET `object` = '%s' WHERE `id` = %d", - dbesc(str_replace('type="http','href="http',$rr['object'])), - intval($rr['id']) - ); - } - } - } -} - -function update_1032() { - q("ALTER TABLE `profile` ADD `pdesc` CHAR( 255 ) NOT NULL AFTER `name` "); -} - -function update_1033() { - q("CREATE TABLE IF NOT EXISTS `cache` ( - `k` CHAR( 255 ) NOT NULL PRIMARY KEY , - `v` TEXT NOT NULL, - `updated` DATETIME NOT NULL - ) DEFAULT CHARSET=utf8 "); -} - - -function update_1034() { - - /* - * If you have any of these parent-less posts they can cause problems, and - * we need to delete them. You can't see them anyway. - * Legitimate items will usually get re-created on the next - * pull from the hub. - * But don't get rid of a post that may have just come in - * and may not yet have the parent id set. - */ - q("DELETE FROM `item` WHERE `parent` = 0 AND `created` < UTC_TIMESTAMP() - INTERVAL 2 MINUTE"); - -} - - -function update_1035() { - - q("ALTER TABLE `contact` ADD `success_update` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `last-update` "); - -} - -function update_1036() { - - $r = dbq("SELECT * FROM `contact` WHERE `network` = 'dfrn' AND `photo` LIKE '%include/photo%' "); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - q("UPDATE `contact` SET `photo` = '%s', `thumb` = '%s', `micro` = '%s' WHERE `id` = %d", - dbesc(str_replace('include/photo','photo',$rr['photo'])), - dbesc(str_replace('include/photo','photo',$rr['thumb'])), - dbesc(str_replace('include/photo','photo',$rr['micro'])), - intval($rr['id'])); - } - } -} - -function update_1037() { - - q("ALTER TABLE `contact` CHANGE `lrdd` `alias` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL "); - -} - -function update_1038() { - q("ALTER TABLE `item` ADD `plink` CHAR( 255 ) NOT NULL AFTER `target` "); -} - -function update_1039() { - q("ALTER TABLE `addon` ADD `timestamp` BIGINT NOT NULL DEFAULT '0'"); -} - - -function update_1040() { - - q("CREATE TABLE IF NOT EXISTS `fcontact` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `url` CHAR( 255 ) NOT NULL , - `name` CHAR( 255 ) NOT NULL , - `photo` CHAR( 255 ) NOT NULL - ) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); - - q("CREATE TABLE IF NOT EXISTS `ffinder` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `uid` INT UNSIGNED NOT NULL , - `cid` INT UNSIGNED NOT NULL , - `fid` INT UNSIGNED NOT NULL - ) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); - -} - -function update_1041() { - q("ALTER TABLE `profile` CHANGE `keywords` `prv_keywords` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL "); - q("ALTER TABLE `profile` ADD `pub_keywords` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER `religion` "); -} - -function update_1042() { - q("ALTER TABLE `user` ADD `expire` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `maxreq` "); -} - - -function update_1043() { - q("ALTER TABLE `user` ADD `blockwall` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `blocked` "); -} - -function update_1044() { - q("ALTER TABLE `profile` ADD FULLTEXT ( `pub_keywords` ) "); - q("ALTER TABLE `profile` ADD FULLTEXT ( `prv_keywords` ) "); -} - -function update_1045() { - q("ALTER TABLE `user` ADD `language` CHAR( 16 ) NOT NULL DEFAULT 'en' AFTER `timezone` "); -} - -function update_1046() { - q("ALTER TABLE `item` ADD `attach` MEDIUMTEXT NOT NULL AFTER `tag` "); -} - -function update_1047() { - q("ALTER TABLE `contact` ADD `writable` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `readonly` "); -} - -function update_1048() { - q("UPDATE `contact` SET `writable` = 1 WHERE `network` = 'stat' AND `notify` != '' "); -} - -function update_1049() { - q("CREATE TABLE `mailacct` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `uid` INT NOT NULL, - `server` CHAR( 255 ) NOT NULL , - `user` CHAR( 255 ) NOT NULL , - `pass` CHAR( 255 ) NOT NULL , - `reply_to` CHAR( 255 ) NOT NULL , - `last_check` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' - ) ENGINE = MYISAM "); -} - -function update_1050() { - q("CREATE TABLE `attach` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `uid` INT NOT NULL , - `filetype` CHAR( 64 ) NOT NULL , - `filesize` INT NOT NULL , - `data` LONGBLOB NOT NULL , - `created` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', - `edited` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', - `allow_cid` MEDIUMTEXT NOT NULL , - `allow_gid` MEDIUMTEXT NOT NULL , - `deny_cid` MEDIUMTEXT NOT NULL , - `deny_gid` MEDIUMTEXT NOT NULL - ) ENGINE = MYISAM "); - -} - -function update_1051() { - q("ALTER TABLE `mailacct` ADD `port` INT NOT NULL AFTER `server` , - ADD `ssltype` CHAR( 16 ) NOT NULL AFTER `port` , - ADD `mailbox` CHAR( 255 ) NOT NULL AFTER `ssltype` "); - - q("ALTER TABLE `contact` ADD `addr` CHAR( 255 ) NOT NULL AFTER `url` "); -} - -function update_1052() { - q("ALTER TABLE `mailacct` CHANGE `pass` `pass` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL"); - q("ALTER TABLE `mailacct` ADD `pubmail` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `reply_to` "); - q("ALTER TABLE `item` ADD `pubmail` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `private` "); -} - - -function update_1053() { - q("ALTER TABLE `item` ADD `extid` CHAR( 255 ) NOT NULL AFTER `parent-uri` , ADD INDEX ( `extid` ) "); -} - -function update_1054() { - q("ALTER TABLE `register` ADD `language` CHAR( 16 ) NOT NULL AFTER `password` "); -} - -function update_1055() { - q("ALTER TABLE `profile` ADD `hidewall` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `hide-friends` "); -} - -function update_1056() { - q("ALTER TABLE `attach` ADD `hash` CHAR( 64 ) NOT NULL AFTER `uid` "); -} - -function update_1057() { - q("ALTER TABLE `attach` ADD `filename` CHAR( 255 ) NOT NULL AFTER `hash` "); -} - -function update_1058() { - q("ALTER TABLE `item` ADD `event-id` INT NOT NULL AFTER `resource-id` "); -} - -function update_1059() { - q("ALTER TABLE `queue` ADD `network` CHAR( 32 ) NOT NULL AFTER `cid` "); -} - -function update_1060() { - q("ALTER TABLE `event` ADD `uri` CHAR( 255 ) NOT NULL AFTER `cid` "); -} - -function update_1061() { - q("ALTER TABLE `event` ADD `nofinish` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `type` "); -} - -function update_1062() { - q("ALTER TABLE `user` ADD `prvnets` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `page-flags` "); -} -function update_1063() { - q("ALTER TABLE `addon` ADD `plugin_admin` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `timestamp` "); -} - -function update_1064() { - q("ALTER TABLE `item` ADD `app` CHAR( 255 ) NOT NULL AFTER `body` "); -} - -function update_1065() { - q("ALTER TABLE `intro` ADD `fid` INT NOT NULL DEFAULT '0' AFTER `uid`"); -} - -function update_1066() { - $r = q("ALTER TABLE `item` ADD `received` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `edited` "); - if($r) - q("ALTER TABLE `item` ADD INDEX ( `received` ) "); - - $r = q("UPDATE `item` SET `received` = `edited` WHERE 1"); -} - -function update_1067() { - q("ALTER TABLE `ffinder` ADD `type` CHAR( 16 ) NOT NULL AFTER `id` , - ADD `note` TEXT NOT NULL AFTER `type` "); -} - -function update_1068() { - // 1067 was short-sighted. Undo it. - q("ALTER TABLE `ffinder` DROP `type` , DROP `note` "); - - // and do this instead. - - q("CREATE TABLE IF NOT EXISTS `fsuggest` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `uid` INT NOT NULL , - `cid` INT NOT NULL , - `name` CHAR( 255 ) NOT NULL , - `url` CHAR( 255 ) NOT NULL , - `photo` CHAR( 255 ) NOT NULL , - `note` TEXT NOT NULL , - `created` DATETIME NOT NULL - ) ENGINE = MYISAM DEFAULT CHARSET=utf8"); - -} - -function update_1069() { - q("ALTER TABLE `fsuggest` ADD `request` CHAR( 255 ) NOT NULL AFTER `url` "); - q("ALTER TABLE `fcontact` ADD `request` CHAR( 255 ) NOT NULL AFTER `photo` "); -} - -// mail body needs to accomodate private photos - -function update_1070() { - q("ALTER TABLE `mail` CHANGE `body` `body` MEDIUMTEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL "); -} - -function update_1071() { - q("ALTER TABLE `photo` ADD INDEX ( `uid` ) "); - q("ALTER TABLE `photo` ADD INDEX ( `resource-id` ) "); - q("ALTER TABLE `photo` ADD INDEX ( `album` ) "); - q("ALTER TABLE `photo` ADD INDEX ( `scale` ) "); - q("ALTER TABLE `photo` ADD INDEX ( `profile` ) "); - -} - -function update_1072() { - q("ALTER TABLE `item` ADD `starred` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `visible` "); - q("ALTER TABLE `item` ADD INDEX ( `starred` ) "); -} - -function update_1073() { - q("ALTER TABLE `contact` ADD `remote_self` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `self` "); -} - -function update_1074() { - q("ALTER TABLE `user` ADD `hidewall` TINYINT( 1) NOT NULL DEFAULT '0' AFTER `blockwall` "); - $r = q("SELECT `uid` FROM `profile` WHERE `is-default` = 1 AND `hidewall` = 1"); - if (DBM::is_result($r)) { - foreach($r as $rr) - q("UPDATE `user` SET `hidewall` = 1 WHERE `uid` = %d", - intval($rr['uid']) - ); - } - q("ALTER TABLE `profile` DROP `hidewall`"); -} - -function update_1075() { - q("ALTER TABLE `user` ADD `guid` CHAR( 16 ) NOT NULL AFTER `uid` "); - $r = q("SELECT `uid` FROM `user` WHERE 1"); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - $found = true; - do { - $guid = random_string(16); - $x = q("SELECT `uid` FROM `user` WHERE `guid` = '%s' LIMIT 1", - dbesc($guid) - ); - if(! count($x)) - $found = false; - } while ($found == true ); - - q("UPDATE `user` SET `guid` = '%s' WHERE `uid` = %d", - dbesc($guid), - intval($rr['uid']) - ); - } - } -} - -function update_1076() { - q("CREATE TABLE `guid` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `guid` CHAR( 16 ) NOT NULL , INDEX ( `guid` ) ) ENGINE = MYISAM "); - -} - -// There was a typo in 1076 so we'll try again in 1077 to make sure -// We'll also make it big enough to allow for future growth, I seriously -// doubt Diaspora will be able to leave guids at 16 bytes, -// and we can also use the same structure for our own larger guids - -function update_1077() { - q("CREATE TABLE IF NOT EXISTS `guid` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `guid` CHAR( 16 ) NOT NULL , INDEX ( `guid` ) ) ENGINE = MYISAM "); - - q("ALTER TABLE `guid` CHANGE `guid` `guid` CHAR( 64 ) NOT NULL"); -} - -function update_1078() { - q("ALTER TABLE `item` ADD `guid` CHAR( 64 ) NOT NULL AFTER `id` , ADD INDEX ( `guid` ) "); -} - -function update_1079() { - q("CREATE TABLE IF NOT EXISTS `sign` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `iid` INT UNSIGNED NOT NULL , - `signed_text` MEDIUMTEXT NOT NULL , - `signature` TEXT NOT NULL , - `signer` CHAR( 255 ) NOT NULL , - INDEX ( `iid` ) - ) ENGINE = MYISAM "); - - q("ALTER TABLE `fcontact` ADD `nick` CHAR( 255 ) NOT NULL , - ADD `addr` CHAR( 255 ) NOT NULL , - ADD `notify` CHAR( 255 ) NOT NULL , - ADD `poll` CHAR( 255 ) NOT NULL , - ADD `confirm` CHAR( 255 ) NOT NULL , - ADD `priority` TINYINT( 1 ) NOT NULL , - ADD `network` CHAR( 32 ) NOT NULL , - ADD `alias` CHAR( 255 ) NOT NULL , - ADD `pubkey` TEXT NOT NULL , - ADD INDEX ( `addr` ) , - ADD INDEX ( `network` ) "); - -} - -function update_1080() { - q("ALTER TABLE `fcontact` ADD `updated` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00'"); -} - -function update_1081() { - // there was a typo in update 1081 so it was corrected and moved up to 1082 -} - -function update_1082() { - q("ALTER TABLE `photo` ADD `guid` CHAR( 64 ) NOT NULL AFTER `contact-id`, - ADD INDEX ( `guid` ) "); - // make certain the following code is only executed once - $r = q("select `id` from `photo` where `guid` != '' limit 1"); - if (DBM::is_result($r)) - return; - $r = q("SELECT distinct(`resource-id`) FROM `photo` WHERE 1 group by `id`"); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - $guid = get_guid(); - q("update `photo` set `guid` = '%s' where `resource-id` = '%s'", - dbesc($guid), - dbesc($rr['resource-id']) - ); - } - } -} - -function update_1083() { - q("CREATE TABLE IF NOT EXISTS `deliverq` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `cmd` CHAR( 32 ) NOT NULL , - `item` INT NOT NULL , - `contact` INT NOT NULL - ) ENGINE = MYISAM "); - -} - -function update_1084() { - q("ALTER TABLE `contact` ADD `attag` CHAR( 255 ) NOT NULL AFTER `nick` "); -} - -function update_1085() { - q("CREATE TABLE IF NOT EXISTS `search` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `uid` INT NOT NULL , - `term` CHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, - INDEX ( `uid` ), - INDEX ( `term` ) - ) ENGINE = MYISAM "); -} - -function update_1086() { - q("ALTER TABLE `item` ADD `bookmark` tinyint(1) NOT NULL DEFAULT '0' AFTER `starred` "); -} - -function update_1087() { - q("ALTER TABLE `item` ADD `commented` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `edited` "); - - $r = q("SELECT `id` FROM `item` WHERE `parent` = `id` "); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - $x = q("SELECT max(`created`) AS `cdate` FROM `item` WHERE `parent` = %d LIMIT 1", - intval($rr['id']) - ); - if(count($x)) - q("UPDATE `item` SET `commented` = '%s' WHERE `id` = %d", - dbesc($x[0]['cdate']), - intval($rr['id']) - ); - } - } -} - -function update_1088() { - q("ALTER TABLE `user` ADD `account_expired` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `expire` , - ADD `account_expires_on` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `account_expired` , - ADD `expire_notification_sent` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `account_expires_on` "); -} - -function update_1089() { - q("ALTER TABLE `user` ADD `blocktags` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `hidewall` "); -} - -function update_1090() { - q("ALTER TABLE `contact` ADD `batch` char(255) NOT NULL AFTER `prvkey` "); - - q("UPDATE `contact` SET `batch` = concat(substring_index(`url`,'/',3),'/receive/public') WHERE `network` = 'dspr' "); - -} - -function update_1091() { - - // catch a few stragglers that may have crept in before we added this on remote connects - q("UPDATE `contact` SET `batch` = concat(substring_index(`url`,'/',3),'/receive/public') WHERE `network` = 'dspr' AND `batch` = '' "); - q("ALTER TABLE `queue` ADD `batch` TINYINT( 1 ) NOT NULL DEFAULT '0' "); - q("ALTER TABLE `fcontact` ADD `batch` char(255) NOT NULL AFTER `addr` "); - -} - -function update_1092() { - q("ALTER TABLE `user` ADD INDEX ( `login_date` ) "); - q("ALTER TABLE `user` ADD INDEX ( `account_expired` ) "); -} - -function update_1093() { - q("CREATE TABLE IF NOT EXISTS `fserver` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `server` CHAR( 255 ) NOT NULL , - `posturl` CHAR( 255 ) NOT NULL , - `key` TEXT NOT NULL, - INDEX ( `server` ) - ) ENGINE = MYISAM "); - - q("ALTER TABLE `group` ADD `visible` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `uid` "); - -} - -function update_1094() { - q("ALTER TABLE `item` ADD `postopts` TEXT NOT NULL AFTER `target` "); -} - -function update_1095() { - q("ALTER TABLE `contact` ADD `bd` DATE NOT NULL AFTER `bdyear` "); -} - -function update_1096() { - q("ALTER TABLE `item` ADD `origin` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `deleted` , ADD INDEX ( `origin` ) "); -} - -function update_1097() { - q("ALTER TABLE `queue` - ADD INDEX (`cid`), - ADD INDEX (`created`), - ADD INDEX (`last`), - ADD INDEX (`network`), - ADD INDEX (`batch`) - "); -} - -function update_1098() { - q("ALTER TABLE `contact` - ADD INDEX (`network`), - ADD INDEX (`name`), - ADD INDEX (`nick`), - ADD INDEX (`attag`), - ADD INDEX (`url`), - ADD INDEX (`addr`), - ADD INDEX (`batch`) - "); -} - -function update_1099() { - q("CREATE TABLE IF NOT EXISTS `gcontact` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `name` CHAR( 255 ) NOT NULL , - `url` CHAR( 255 ) NOT NULL , - `nurl` CHAR( 255 ) NOT NULL , - `photo` CHAR( 255 ) NOT NULL - ) ENGINE = MYISAM "); - - q("CREATE TABLE IF NOT EXISTS `glink` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `cid` INT NOT NULL , - `uid` INT NOT NULL , - `gcid` INT NOT NULL, - `updated` DATETIME NOT NULL - ) ENGINE = MYISAM "); - - q("ALTER TABLE `gcontact` ADD INDEX (`nurl`) "); - q("ALTER TABLE `glink` ADD INDEX (`cid`), ADD INDEX (`uid`), ADD INDEX (`gcid`), ADD INDEX (`updated`) "); - - q("ALTER TABLE `contact` ADD `poco` TEXT NOT NULL AFTER `confirm` "); - -} - -function update_1100() { - q("ALTER TABLE `contact` ADD `nurl` CHAR( 255 ) NOT NULL AFTER `url` "); - q("alter table contact add index (`nurl`) "); - - require_once('include/text.php'); - - $r = q("select id, url from contact where url != '' and nurl = '' "); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - q("update contact set nurl = '%s' where id = %d", - dbesc(normalise_link($rr['url'])), - intval($rr['id']) - ); - } - } -} - - -function update_1101() { - q("CREATE TABLE IF NOT EXISTS `gcign` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `uid` INT NOT NULL , - `gcid` INT NOT NULL - ) ENGINE = MYISAM "); - - q("ALTER TABLE `gcign` ADD INDEX (`uid`), ADD INDEX (`gcid`) "); -} - -function update_1102() { - q("ALTER TABLE `clients` ADD `name` TEXT NULL DEFAULT NULL AFTER `redirect_uri` "); - q("ALTER TABLE `clients` ADD `icon` TEXT NULL DEFAULT NULL AFTER `name` "); - q("ALTER TABLE `clients` ADD `uid` INT NOT NULL DEFAULT 0 AFTER `icon` "); - - q("ALTER TABLE `tokens` ADD `secret` TEXT NOT NULL AFTER `id` "); - q("ALTER TABLE `tokens` ADD `uid` INT NOT NULL AFTER `scope` "); -} - - -function update_1103() { -// q("ALTER TABLE `item` ADD INDEX ( `wall` ) "); - q("ALTER TABLE `item` ADD FULLTEXT ( `tag` ) "); - q("ALTER TABLE `contact` ADD INDEX ( `pending` ) "); - q("ALTER TABLE `user` ADD INDEX ( `hidewall` ) "); - q("ALTER TABLE `user` ADD INDEX ( `blockwall` ) "); - q("ALTER TABLE `user` ADD INDEX ( `blocked` ) "); - q("ALTER TABLE `user` ADD INDEX ( `verified` ) "); - -} - -function update_1104() { - q("ALTER TABLE `item` ADD `forum_mode` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `origin` , ADD INDEX ( `forum_mode` ) "); - -} - -function update_1105() { - q("ALTER TABLE `mail` ADD `convid` INT NOT NULL AFTER `contact-id` "); - q("ALTER TABLE `mail` ADD `guid` CHAR( 64 ) NOT NULL AFTER `uid` "); - - q("CREATE TABLE IF NOT EXISTS `conv` ( - `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `guid` CHAR( 64 ) NOT NULL , - `recips` MEDIUMTEXT NOT NULL , - `uid` INT NOT NULL - ) ENGINE = MYISAM "); -} - - -function update_1106() { - q("ALTER TABLE `item` ADD INDEX ( `author-link` ) "); - -} - -function update_1107() { - q("ALTER TABLE `item` ADD INDEX ( `bookmark` ) "); - -} - -function update_1108() { - q("ALTER TABLE `contact` ADD `hidden` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `writable` , -ADD INDEX ( `hidden` ) "); - -} - -function update_1109() { - q("ALTER TABLE `conv` ADD `creator` CHAR( 255 ) NOT NULL , - ADD `created` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', - ADD `updated` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00', - ADD `subject` MEDIUMTEXT NOT NULL, - ADD INDEX ( `created` ), ADD INDEX ( `updated` ) "); -} - -function update_1110() { - q("ALTER TABLE `mail` ADD `reply` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `seen`, - ADD INDEX ( `reply` ), ADD INDEX ( `uid` ), ADD INDEX ( `guid` ), ADD INDEX ( `seen` ), - ADD INDEX ( `uri` ), ADD INDEX ( `parent-uri`), ADD INDEX ( `created` ), ADD INDEX ( `convid` ) "); - -} - -function update_1111() { - q("ALTER TABLE `gcontact` ADD `connect` CHAR( 255 ) NOT NULL "); -} - - -function update_1112() { - - q("CREATE TABLE IF NOT EXISTS `notify` ( -`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , -`type` INT( 11 ) NOT NULL , -`name` CHAR( 255 ) NOT NULL , -`url` CHAR( 255 ) NOT NULL , -`photo` CHAR( 255 ) NOT NULL , -`date` DATETIME NOT NULL , -`msg` MEDIUMTEXT NOT NULL , -`uid` INT NOT NULL , -`link` CHAR( 255 ) NOT NULL , -`seen` TINYINT( 1 ) NOT NULL DEFAULT '0' -) ENGINE = MYISAM "); - - q("ALTER TABLE `notify` ADD INDEX ( `type` ), ADD INDEX ( `uid`), ADD INDEX (`seen`), ADD INDEX (`date`) "); - -} - -function update_1113() { - q("ALTER TABLE `notify` ADD `verb` CHAR( 255 ) NOT NULL , -ADD `otype` CHAR( 16 ) NOT NULL"); -} - -function update_1114() { - q("CREATE TABLE IF NOT EXISTS `item_id` ( -`iid` INT NOT NULL , -`uid` INT NOT NULL , -`face` CHAR( 255 ) NOT NULL , -`dspr` CHAR( 255 ) NOT NULL , -`twit` CHAR( 255 ) NOT NULL , -`stat` CHAR( 255 ) NOT NULL , -PRIMARY KEY ( `iid` ), -INDEX ( `uid` ), -INDEX ( `face` ), -INDEX ( `dspr` ), -INDEX ( `twit` ), -INDEX ( `stat` ) -) ENGINE = MYISAM "); - -} - -function update_1115() { - q("ALTER TABLE `item` ADD `moderated` - TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `pubmail`, - ADD INDEX (`moderated`) "); -} - -function update_1116() { - //typo! corrected update was rolled forward -} - -function update_1117() { -q("create table if not exists `manage` ( -`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , -`uid` INT NOT NULL , -`mid` INT NOT NULL, -INDEX ( `uid` ), -INDEX ( `mid` ) -) ENGINE = MYISAM "); - -} - -function update_1118() { - // rolled forward -} - -function update_1119() { -q("ALTER TABLE `contact` ADD `closeness` TINYINT( 2 ) NOT NULL DEFAULT '99' AFTER `reason` , ADD INDEX (`closeness`) "); -q("update contact set closeness = 0 where self = 1"); -q("ALTER TABLE `item` ADD `spam` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `visible` , ADD INDEX (`spam`) "); -} - - -function update_1120() { - - // item table update from 1119 did not get into database.sql file. - // might be missing on new installs. We'll check. - - $r = q("describe item"); - if (DBM::is_result($r)) { - foreach($r as $rr) - if($rr['Field'] == 'spam') - return; - } - q("ALTER TABLE `item` ADD `spam` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `visible` , ADD INDEX (`spam`) "); - -} - -function update_1121() { - q("CREATE TABLE IF NOT EXISTS `poll_result` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `poll_id` INT NOT NULL , - `choice` INT NOT NULL , - INDEX ( `poll_id` ), - INDEX ( `choice` ) - ) ENGINE = MYISAM "); - - q("CREATE TABLE IF NOT EXISTS `poll` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `uid` INT NOT NULL , - `q0` MEDIUMTEXT NOT NULL , - `q1` MEDIUMTEXT NOT NULL , - `q2` MEDIUMTEXT NOT NULL , - `q3` MEDIUMTEXT NOT NULL , - `q4` MEDIUMTEXT NOT NULL , - `q5` MEDIUMTEXT NOT NULL , - `q6` MEDIUMTEXT NOT NULL , - `q7` MEDIUMTEXT NOT NULL , - `q8` MEDIUMTEXT NOT NULL , - `q9` MEDIUMTEXT NOT NULL , - INDEX ( `uid` ) - ) ENGINE = MYISAM "); - -} - -function update_1122() { -q("ALTER TABLE `notify` ADD `hash` CHAR( 64 ) NOT NULL AFTER `id` , -ADD INDEX ( `hash` ) "); -} - -function update_1123() { -Config::set('system','allowed_themes','dispy,quattro,testbubble,vier,darkbubble,darkzero,duepuntozero,greenzero,purplezero,quattro-green,slackr'); -} - -function update_1124() { -q("alter table item add index (`author-name`) "); -} - -function update_1125() { - q("CREATE TABLE IF NOT EXISTS `notify-threads` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `notify-id` INT NOT NULL, - `master-parent-item` INT( 10 ) unsigned NOT NULL DEFAULT '0', - `parent-item` INT( 10 ) unsigned NOT NULL DEFAULT '0', - `receiver-uid` INT NOT NULL, - INDEX ( `master-parent-item` ), - INDEX ( `receiver-uid` ) - ) ENGINE = MyISAM DEFAULT CHARSET=utf8"); -} - -function update_1126() { - q("ALTER TABLE `mailacct` ADD `action` INT NOT NULL AFTER `pass`, - ADD `movetofolder` CHAR(255) NOT NULL AFTER `action`"); -} - -function update_1127() { - q("CREATE TABLE IF NOT EXISTS `spam` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - `uid` INT NOT NULL, - `spam` INT NOT NULL DEFAULT '0', - `ham` INT NOT NULL DEFAULT '0', - `term` CHAR(255) NOT NULL, - INDEX ( `uid` ), - INDEX ( `spam` ), - INDEX ( `ham` ), - INDEX ( `term` ) - ) ENGINE = MyISAM DEFAULT CHARSET=utf8"); -} - - -function update_1128() { - q("alter table spam add `date` DATETIME NOT NULL DEFAULT '0001-01-01 00:00:00' AFTER `term` "); -} - -function update_1129() { - q("ALTER TABLE `notify` ADD `parent` INT NOT NULL AFTER `link` , ADD INDEX ( `parent` ), ADD INDEX ( `link` ), ADD INDEX ( `otype` ) "); -} - -function update_1130() { - q("ALTER TABLE `item` ADD `file` MEDIUMTEXT NOT NULL AFTER `inform`, ADD FULLTEXT KEY (`file`) "); -} - -function update_1131() { - q("ALTER TABLE `contact` ADD `forum` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `writable` , ADD INDEX ( `forum` ) "); -} - - -function update_1132() { - q("CREATE TABLE IF NOT EXISTS `userd` ( -`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , -`username` CHAR( 255 ) NOT NULL, -INDEX ( `username` ) -) ENGINE = MYISAM "); - -} - -function update_1133() { -q("ALTER TABLE `user` ADD `unkmail` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `blocktags` , ADD INDEX ( `unkmail` ) "); -q("ALTER TABLE `user` ADD `cntunkmail` INT NOT NULL DEFAULT '10' AFTER `unkmail` , ADD INDEX ( `cntunkmail` ) "); -q("ALTER TABLE `mail` ADD `unknown` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `replied` , ADD INDEX ( `unknown` ) "); -} - -function update_1134() { - // faulty update merged forward - // had a hardwired tablename of 'friendica' which isn't the right name on most systems -} - -function update_1135() { - //there can't be indexes with more than 1000 bytes in mysql, - //so change charset to be smaller - q("ALTER TABLE `config` CHANGE `cat` `cat` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL , -CHANGE `k` `k` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL"); - - //same thing for pconfig - q("ALTER TABLE `pconfig` CHANGE `cat` `cat` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL , - CHANGE `k` `k` CHAR( 255 ) CHARACTER SET ascii COLLATE ascii_general_ci NOT NULL"); - // faulty update merged forward. Bad update in 1134 caused duplicate k,cat pairs - // these have to be cleared before the unique keys can be added. -} - -function update_1136() { - - $arr = array(); - - // order in reverse so that we save the newest entry - - $r = q("select * from config where 1 order by id desc"); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - $found = false; - foreach($arr as $x) { - if($x['cat'] == $rr['cat'] && $x['k'] == $rr['k']) { - $found = true; - q("delete from config where id = %d", - intval($rr['id']) - ); - } - } - if(! $found) { - $arr[] = $rr; - } - } - } - - $arr = array(); - $r = q("select * from pconfig where 1 order by id desc"); - if (DBM::is_result($r)) { - foreach ($r as $rr) { - $found = false; - foreach($arr as $x) { - if($x['uid'] == $rr['uid'] && $x['cat'] == $rr['cat'] && $x['k'] == $rr['k']) { - $found = true; - q("delete from pconfig where id = %d", - intval($rr['id']) - ); - } - } - if(! $found) { - $arr[] = $rr; - } - } - } - q("ALTER TABLE `config` ADD UNIQUE `access` ( `cat` , `k` ) "); - q("ALTER TABLE `pconfig` ADD UNIQUE `access` ( `uid` , `cat` , `k` )"); - -} - - -function update_1137() { - q("alter table item_id DROP `face` , DROP `dspr` , DROP `twit` , DROP `stat` "); - q("ALTER TABLE `item_id` ADD `sid` CHAR( 255 ) NOT NULL AFTER `uid` , ADD `service` CHAR( 255 ) NOT NULL AFTER `sid` , add index (`sid`), add index ( `service`) "); -} - -function update_1138() { - q("alter table contact add archive tinyint(1) not null default '0' after hidden, add index (archive)"); -} - -function update_1139() { - $r = q("alter table user add account_removed tinyint(1) not null default '0' after expire, add index(account_removed) "); - if(! $r) - return UPDATE_FAILED ; - return UPDATE_SUCCESS ; -} - -function update_1140() { - $r = q("alter table addon add hidden tinyint(1) not null default '0' after installed, add index(hidden) "); - if(! $r) - return UPDATE_FAILED ; - return UPDATE_SUCCESS ; -} - -function update_1141() { - $r = q("alter table glink add zcid int(11) not null after gcid, add index(zcid) "); - if(! $r) - return UPDATE_FAILED ; - return UPDATE_SUCCESS ; -} - - -function update_1142() { - $r = q("alter table user add service_class char(32) not null after expire_notification_sent, add index(service_class) "); - if(! $r) - return UPDATE_FAILED ; - return UPDATE_SUCCESS ; -} - -function update_1143() { - $r = q("alter table user add def_gid int(11) not null default '0' after service_class"); - if(! $r) - return UPDATE_FAILED ; - return UPDATE_SUCCESS ; -} - -function update_1144() { - $r = q("alter table contact add prv tinyint(1) not null default '0' after forum"); - if(! $r) - return UPDATE_FAILED ; - return UPDATE_SUCCESS ; -} - -function update_1145() { - $r = q("alter table profile add howlong datetime not null default '0001-01-01 00:00:00' after `with`"); - if(! $r) - return UPDATE_FAILED ; - return UPDATE_SUCCESS ; -} - -function update_1146() { - $r = q("alter table profile add hometown char(255) not null after `country-name`, add index ( `hometown` ) "); - if(! $r) - return UPDATE_FAILED ; - return UPDATE_SUCCESS ; -} - -function update_1147() { - $r1 = q("ALTER TABLE `sign` ALTER `iid` SET DEFAULT '0'"); - $r2 = q("ALTER TABLE `sign` ADD `retract_iid` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `iid`"); - $r3 = q("ALTER TABLE `sign` ADD INDEX ( `retract_iid` )"); - if((! $r1) || (! $r2) || (! $r3)) - return UPDATE_FAILED ; - return UPDATE_SUCCESS ; -} - -function update_1148() { - $r = q("ALTER TABLE photo ADD type CHAR(128) NOT NULL DEFAULT 'image/jpeg' AFTER filename"); - if (!$r) - return UPDATE_FAILED; - return UPDATE_SUCCESS; -} - - -function update_1149() { - $r1 = q("ALTER TABLE profile ADD likes text NOT NULL after prv_keywords"); - $r2 = q("ALTER TABLE profile ADD dislikes text NOT NULL after likes"); - if (! ($r1 && $r2)) - return UPDATE_FAILED; - return UPDATE_SUCCESS; -} - - -function update_1150() { - $r = q("ALTER TABLE event ADD summary text NOT NULL after finish, add index ( uid ), add index ( cid ), add index ( uri ), add index ( `start` ), add index ( finish ), add index ( `type` ), add index ( adjust ) "); - if(! $r) - return UPDATE_FAILED; - return UPDATE_SUCCESS; -} - - -function update_1151() { - $r = q("CREATE TABLE IF NOT EXISTS locks ( - id INT NOT NULL AUTO_INCREMENT PRIMARY KEY , - name CHAR( 128 ) NOT NULL , - locked TINYINT( 1 ) NOT NULL DEFAULT '0' - ) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); - if (!$r) - return UPDATE_FAILED; - return UPDATE_SUCCESS; -} - -function update_1152() { - $r = q("CREATE TABLE IF NOT EXISTS `term` ( - `tid` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , - `oid` INT UNSIGNED NOT NULL , - `otype` TINYINT( 3 ) UNSIGNED NOT NULL , - `type` TINYINT( 3 ) UNSIGNED NOT NULL , - `term` CHAR( 255 ) NOT NULL , - `url` CHAR( 255 ) NOT NULL, - KEY `oid` ( `oid` ), - KEY `otype` ( `otype` ), - KEY `type` ( `type` ), - KEY `term` ( `term` ) - ) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); - if (!$r) - return UPDATE_FAILED; - return UPDATE_SUCCESS; -} - -function update_1153() { - $r = q("ALTER TABLE `hook` ADD `priority` INT(11) UNSIGNED NOT NULL DEFAULT '0'"); - - if(!$r) return UPDATE_FAILED; - return UPDATE_SUCCESS; -} - -function update_1154() { - $r = q("ALTER TABLE `event` ADD `ignore` TINYINT( 1 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `adjust` , ADD INDEX ( `ignore` )"); - - if(!$r) return UPDATE_FAILED; - return UPDATE_SUCCESS; -} - -function update_1155() { - $r1 = q("ALTER TABLE `item_id` DROP PRIMARY KEY"); - $r2 = q("ALTER TABLE `item_id` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST"); - $r3 = q("ALTER TABLE `item_id` ADD INDEX ( `iid` ) "); - - if($r1 && $r2 && $r3) - return UPDATE_SUCCESS; - - return UPDATE_FAILED; -} - -function update_1156() { - $r = q("ALTER TABLE `photo` ADD `datasize` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `width` , -ADD INDEX ( `datasize` ) "); - - if(!$r) return UPDATE_FAILED; - return UPDATE_SUCCESS; -} - -function update_1157() { - $r = q("CREATE TABLE IF NOT EXISTS `dsprphotoq` ( - `id` int(10) unsigned NOT NULL AUTO_INCREMENT, - `uid` int(11) NOT NULL, - `msg` mediumtext NOT NULL, - `attempt` tinyint(4) NOT NULL, - PRIMARY KEY (`id`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8" - ); - - if($r) - return UPDATE_SUCCESS; -} - -function update_1158() { - Config::set('system', 'maintenance', 1); - - // Wait for 15 seconds for current requests to - // clear before locking up the database - sleep(15); - - $r = q("CREATE INDEX event_id ON item(`event-id`)"); - Config::set('system', 'maintenance', 0); - - if($r) - return UPDATE_SUCCESS; - - return UPDATE_FAILED; -} - -function update_1159() { - $r = q("ALTER TABLE `term` ADD `aid` int(10) unsigned NOT NULL DEFAULT '0', - ADD `uid` int(10) unsigned NOT NULL DEFAULT '0', - ADD INDEX (`uid`), - ADD INDEX (`aid`)"); - - if(!$r) - return UPDATE_FAILED; - - return UPDATE_SUCCESS; -} - -function update_1160() { - Config::set('system', 'maintenance', 1); - - // Wait for 15 seconds for current requests to - // clear before locking up the database - sleep(15); - - $r = q("ALTER TABLE `item` ADD `mention` TINYINT(1) NOT NULL DEFAULT '0', ADD INDEX (`mention`)"); - Config::set('system', 'maintenance', 0); - - if(!$r) - return UPDATE_FAILED; - - return UPDATE_SUCCESS; -} - -function update_1161() { - $r = q("ALTER TABLE `pconfig` ADD INDEX (`cat`)"); - - if(!$r) - return UPDATE_FAILED; - - return UPDATE_SUCCESS; -} - -function update_1162() { - require_once('include/tags.php'); - update_items(); - - return UPDATE_SUCCESS; -} - -function update_1163() { - Config::set('system', 'maintenance', 1); - - $r = q("ALTER TABLE `item` ADD `network` char(32) NOT NULL"); - - Config::set('system', 'maintenance', 0); - if(!$r) - return UPDATE_FAILED; - - return UPDATE_SUCCESS; -} -function update_1164() { - Config::set('system', 'maintenance', 1); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_DFRN); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_DFRN, NETWORK_DFRN); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_OSTATUS, NETWORK_OSTATUS); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_FEED, NETWORK_FEED); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_DIASPORA, NETWORK_DIASPORA); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_MAIL, NETWORK_MAIL); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_FACEBOOK, NETWORK_FACEBOOK); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_LINKEDIN, NETWORK_LINKEDIN); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_XMPP, NETWORK_XMPP); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_MYSPACE, NETWORK_MYSPACE); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_GPLUS, NETWORK_GPLUS); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_PUMPIO, NETWORK_PUMPIO); - - $r = q("UPDATE `item` SET `network`='%s' WHERE `contact-id` IN (SELECT `id` FROM`contact` WHERE `network` = '%s' AND `contact`.`uid` = `item`.`uid`)", - NETWORK_TWITTER, NETWORK_TWITTER); - - Config::set('system', 'maintenance', 0); - - return UPDATE_SUCCESS; -} - -function update_1165() { - $r = q("CREATE TABLE IF NOT EXISTS `push_subscriber` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - `uid` INT NOT NULL, - `callback_url` CHAR( 255 ) NOT NULL, - `topic` CHAR( 255 ) NOT NULL, - `nickname` CHAR( 255 ) NOT NULL, - `push` INT NOT NULL, - `last_update` DATETIME NOT NULL, - `secret` CHAR( 255 ) NOT NULL - ) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); - if (!$r) - return UPDATE_FAILED; - - return UPDATE_SUCCESS; -} - -function update_1166() { - $r = q("CREATE TABLE IF NOT EXISTS `unique_contacts` ( - `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, - `url` CHAR(255) NOT NULL, - `nick` CHAR(255) NOT NULL, - `name` CHAR(255) NOT NULL, - `avatar` CHAR(255) NOT NULL, - INDEX (`url`) - ) ENGINE = MYISAM DEFAULT CHARSET=utf8 "); - if (!$r) - return UPDATE_FAILED; - - return UPDATE_SUCCESS; -} - -function update_1167() { - $r = q("ALTER TABLE `contact` ADD `notify_new_posts` TINYINT(1) NOT NULL DEFAULT '0'"); - if (!$r) - return UPDATE_FAILED; - - return UPDATE_SUCCESS; -} - -function update_1168() { - $r = q("ALTER TABLE `contact` ADD `fetch_further_information` TINYINT(1) NOT NULL DEFAULT '0'"); - if (!$r) - return UPDATE_FAILED; - - return UPDATE_SUCCESS; -} - -function update_1169() { - $r = q("CREATE TABLE IF NOT EXISTS `thread` ( - `iid` int(10) unsigned NOT NULL DEFAULT '0', - `uid` int(10) unsigned NOT NULL DEFAULT '0', - `contact-id` int(11) unsigned NOT NULL DEFAULT '0', - `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00', - `edited` datetime NOT NULL DEFAULT '0001-01-01 00:00:00', - `commented` datetime NOT NULL DEFAULT '0001-01-01 00:00:00', - `received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00', - `changed` datetime NOT NULL DEFAULT '0001-01-01 00:00:00', - `wall` tinyint(1) NOT NULL DEFAULT '0', - `private` tinyint(1) NOT NULL DEFAULT '0', - `pubmail` tinyint(1) NOT NULL DEFAULT '0', - `moderated` tinyint(1) NOT NULL DEFAULT '0', - `visible` tinyint(1) NOT NULL DEFAULT '0', - `spam` tinyint(1) NOT NULL DEFAULT '0', - `starred` tinyint(1) NOT NULL DEFAULT '0', - `bookmark` tinyint(1) NOT NULL DEFAULT '0', - `unseen` tinyint(1) NOT NULL DEFAULT '1', - `deleted` tinyint(1) NOT NULL DEFAULT '0', - `origin` tinyint(1) NOT NULL DEFAULT '0', - `forum_mode` tinyint(1) NOT NULL DEFAULT '0', - `mention` tinyint(1) NOT NULL DEFAULT '0', - `network` char(32) NOT NULL, - PRIMARY KEY (`iid`), - KEY `created` (`created`), - KEY `commented` (`commented`), - KEY `uid_network_commented` (`uid`,`network`,`commented`), - KEY `uid_network_created` (`uid`,`network`,`created`), - KEY `uid_contactid_commented` (`uid`,`contact-id`,`commented`), - KEY `uid_contactid_created` (`uid`,`contact-id`,`created`), - KEY `wall_private_received` (`wall`,`private`,`received`), - KEY `uid_created` (`uid`,`created`), - KEY `uid_commented` (`uid`,`commented`) - ) ENGINE=MyISAM DEFAULT CHARSET=utf8;"); - if (!$r) - return UPDATE_FAILED; - - Worker::add(PRIORITY_LOW, "ThreadUpdate"); - - return UPDATE_SUCCESS; -} - -/* -========== -ATTENTION! -========== - -All following update functions are ONLY for jobs that need to run AFTER the database changes are applied. - -Database changes are ONLY applied in the file src/Database/DBStructure.php. -*/ - function update_1177() { - require_once("mod/profiles.php"); + require_once 'mod/profiles.php'; $profiles = q("SELECT `uid`, `about`, `locality`, `pub_keywords`, `gender` FROM `profile` WHERE `is-default`"); @@ -1664,7 +82,7 @@ function update_1188() { function update_1190() { - require_once('include/plugin.php'); + require_once 'include/plugin.php'; Config::set('system', 'maintenance', 1); From 2e2a2b8040af4261a1132a3dd4c068ec61a0d301 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 22 Dec 2017 14:51:50 +0000 Subject: [PATCH 03/80] Corrected wrong handling of the return value --- boot.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/boot.php b/boot.php index 0fb8c01b9e..245fdc9035 100644 --- a/boot.php +++ b/boot.php @@ -673,7 +673,8 @@ function update_db(App $a) $build = Config::get('system', 'build'); if (empty($build)) { - $build = Config::set('system', 'build', DB_UPDATE_VERSION); + Config::set('system', 'build', DB_UPDATE_VERSION); + $build = DB_UPDATE_VERSION; } if ($build != DB_UPDATE_VERSION) { From 00c6261daeb01a2972f16234b62c8e73da9e6c38 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 22 Dec 2017 14:56:40 +0000 Subject: [PATCH 04/80] Only include the update.php, when really needed --- boot.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/boot.php b/boot.php index 245fdc9035..4571e0aa3a 100644 --- a/boot.php +++ b/boot.php @@ -37,7 +37,6 @@ require_once 'include/datetime.php'; require_once 'include/pgettext.php'; require_once 'include/nav.php'; require_once 'include/identity.php'; -require_once 'update.php'; define('FRIENDICA_PLATFORM', 'Friendica'); define('FRIENDICA_CODENAME', 'Asparagus'); @@ -678,6 +677,8 @@ function update_db(App $a) } if ($build != DB_UPDATE_VERSION) { + require_once 'update.php'; + $stored = intval($build); $current = intval(DB_UPDATE_VERSION); if ($stored < $current) { From a614b17ed57f22c7a85113ab204380fcfc66ff31 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 22 Dec 2017 20:06:15 +0000 Subject: [PATCH 05/80] Grammar correction --- update.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/update.php b/update.php index 6c1785885c..eb91baf3a1 100644 --- a/update.php +++ b/update.php @@ -16,7 +16,7 @@ use Friendica\Object\Image; * * Database structure changes are done in src/Database/DBStructure.php * - * If there is a need for a post procession to a structure change, update this file + * If there is a need for a post process to a structure change, update this file * by adding a new function at the end with the number of the current DB_UPDATE_VERSION. * * The DB_UPDATE_VERSION will always be at least one greater than the last From 3fdfc2e4257ecc6e02fb7d6d5e9d9f774c7eee8b Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 22 Dec 2017 21:31:32 +0000 Subject: [PATCH 06/80] Hopefully this is now clearer --- boot.php | 2 +- update.php | 23 +++++++++++------------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/boot.php b/boot.php index 4571e0aa3a..199ca05551 100644 --- a/boot.php +++ b/boot.php @@ -706,7 +706,7 @@ function update_db(App $a) } // run any left update_nnnn functions in update.php - for ($x = $stored; $x < $current; $x ++) { + for ($x = $stored + 1; $x <= $current; $x++) { $r = run_update_function($x); if (!$r) { break; diff --git a/update.php b/update.php index eb91baf3a1..352092ec22 100644 --- a/update.php +++ b/update.php @@ -17,20 +17,19 @@ use Friendica\Object\Image; * Database structure changes are done in src/Database/DBStructure.php * * If there is a need for a post process to a structure change, update this file - * by adding a new function at the end with the number of the current DB_UPDATE_VERSION. + * by adding a new function at the end with the number of the new DB_UPDATE_VERSION. * - * The DB_UPDATE_VERSION will always be at least one greater than the last - * numbered script in this file. + * The numbered script in this file has to be exactly like the DB_UPDATE_VERSION * * Example: * You are currently on version 4711 and you are preparing changes that demand an update script. * - * - Create a function "update_4711()" here in the update.php - * - Apply the needed structural changes in src/Database/DBStructure.php - * - Set DB_UPDATE_VERSION in boot.php to 4712. + * 1. Create a function "update_4712()" here in the update.php + * 2. Apply the needed structural changes in src/Database/DBStructure.php + * 3. Set DB_UPDATE_VERSION in boot.php to 4712. */ -function update_1177() { +function update_1178() { require_once 'mod/profiles.php'; $profiles = q("SELECT `uid`, `about`, `locality`, `pub_keywords`, `gender` FROM `profile` WHERE `is-default`"); @@ -51,7 +50,7 @@ function update_1177() { } } -function update_1178() { +function update_1179() { if (Config::get('system','no_community_page')) Config::set('system','community_page_style', CP_NO_COMMUNITY_PAGE); @@ -61,7 +60,7 @@ function update_1178() { return UPDATE_SUCCESS; } -function update_1180() { +function update_1181() { // Fill the new fields in the term table. Worker::add(PRIORITY_LOW, "TagUpdate"); @@ -69,7 +68,7 @@ function update_1180() { return UPDATE_SUCCESS; } -function update_1188() { +function update_1189() { if (strlen(Config::get('system','directory_submit_url')) && !strlen(Config::get('system','directory'))) { @@ -80,7 +79,7 @@ function update_1188() { return UPDATE_SUCCESS; } -function update_1190() { +function update_1191() { require_once 'include/plugin.php'; @@ -144,7 +143,7 @@ function update_1190() { } -function update_1202() { +function update_1203() { $r = q("UPDATE `user` SET `account-type` = %d WHERE `page-flags` IN (%d, %d)", dbesc(ACCOUNT_TYPE_COMMUNITY), dbesc(PAGE_COMMUNITY), dbesc(PAGE_PRVGROUP)); } From a309d3c7333381af9cbd4c82aebd8261b962222c Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 22 Dec 2017 23:00:49 +0000 Subject: [PATCH 07/80] Bugfix for the api call for remoteauth --- include/api.php | 30 +++++++++++++----------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/include/api.php b/include/api.php index 07c83f8625..0c9ef0d629 100644 --- a/include/api.php +++ b/include/api.php @@ -4547,8 +4547,8 @@ function prepare_photo_data($type, $scale, $photo_id) */ function api_friendica_remoteauth() { - $url = ((x($_GET, 'url')) ? $_GET['url'] : ''); - $c_url = ((x($_GET, 'c_url')) ? $_GET['c_url'] : ''); + $url = (x($_GET, 'url') ? $_GET['url'] : ''); + $c_url = (x($_GET, 'c_url') ? $_GET['c_url'] : ''); if ($url === '' || $c_url === '') { throw new BadRequestException("Wrong parameters."); @@ -4558,26 +4558,22 @@ function api_friendica_remoteauth() // traditional DFRN - $r = q( - "SELECT * FROM `contact` WHERE `id` = %d AND `nurl` = '%s' LIMIT 1", - dbesc($c_url), - intval(api_user()) - ); + $r = dba::select('contact', [], ['uid' => api_user(), 'nurl' => $c_url], ['limit' => 1]); - if ((! DBM::is_result($r)) || ($r[0]['network'] !== NETWORK_DFRN)) { + if (!DBM::is_result($r) || ($r['network'] !== NETWORK_DFRN)) { throw new BadRequestException("Unknown contact"); } - $cid = $r[0]['id']; + $cid = $r['id']; - $dfrn_id = $orig_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']); + $dfrn_id = $orig_id = (($r['issued-id']) ? $r['issued-id'] : $r['dfrn-id']); - if ($r[0]['duplex'] && $r[0]['issued-id']) { - $orig_id = $r[0]['issued-id']; + if ($r['duplex'] && $r['issued-id']) { + $orig_id = $r['issued-id']; $dfrn_id = '1:' . $orig_id; } - if ($r[0]['duplex'] && $r[0]['dfrn-id']) { - $orig_id = $r[0]['dfrn-id']; + if ($r['duplex'] && $r['dfrn-id']) { + $orig_id = $r['dfrn-id']; $dfrn_id = '0:' . $orig_id; } @@ -4593,10 +4589,10 @@ function api_friendica_remoteauth() intval(time() + 45) ); - logger($r[0]['name'] . ' ' . $sec, LOGGER_DEBUG); - $dest = (($url) ? '&destination_url=' . $url : ''); + logger($r['name'] . ' ' . $sec, LOGGER_DEBUG); + $dest = ($url ? '&destination_url=' . $url : ''); goaway( - $r[0]['poll'] . '?dfrn_id=' . $dfrn_id + $r['poll'] . '?dfrn_id=' . $dfrn_id . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest . $quiet ); From 1fc399399081fad0b058344c3b40dffa7cd34d72 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 22 Dec 2017 23:10:32 +0000 Subject: [PATCH 08/80] Code cleaning --- include/api.php | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/include/api.php b/include/api.php index 0c9ef0d629..7cdb448c4f 100644 --- a/include/api.php +++ b/include/api.php @@ -217,7 +217,7 @@ function api_login(App $a) */ call_hooks('authenticate', $addon_auth); - if (($addon_auth['authenticated']) && (count($addon_auth['user_record']))) { + if ($addon_auth['authenticated'] && count($addon_auth['user_record'])) { $record = $addon_auth['user_record']; } else { $user_id = User::authenticate(trim($user), trim($password)); @@ -226,7 +226,7 @@ function api_login(App $a) } } - if ((! $record) || (! count($record))) { + if (!$record || !count($record)) { logger('API_login failure: ' . print_r($_SERVER, true), LOGGER_DEBUG); header('WWW-Authenticate: Basic realm="Friendica"'); //header('HTTP/1.0 401 Unauthorized'); @@ -2694,14 +2694,15 @@ function api_get_entitities(&$text, $bbcode) foreach ($ordered_urls as $url) { if ((substr($url["title"], 0, 7) != "http://") && (substr($url["title"], 0, 8) != "https://") && !strpos($url["title"], "http://") && !strpos($url["title"], "https://") - ) + ) { $display_url = $url["title"]; - else { + } else { $display_url = str_replace(array("http://www.", "https://www."), array("", ""), $url["url"]); $display_url = str_replace(array("http://", "https://"), array("", ""), $display_url); - if (strlen($display_url) > 26) + if (strlen($display_url) > 26) { $display_url = substr($display_url, 0, 25)."…"; + } } //$start = strpos($text, $url, $offset); @@ -3051,12 +3052,13 @@ function api_format_items($r, $user_info, $filter_user = false, $type = "json") if ($item["coord"] != "") { $coords = explode(' ', $item["coord"]); if (count($coords) == 2) { - if ($type == "json") + if ($type == "json") { $status["geo"] = array('type' => 'Point', 'coordinates' => array((float) $coords[0], (float) $coords[1])); - else // Not sure if this is the official format - if someone founds a documentation we can check + } else {// Not sure if this is the official format - if someone founds a documentation we can check $status["georss:point"] = $item["coord"]; + } } } $ret[] = $status; @@ -4284,7 +4286,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ } // check against max upload size within Friendica instance $maximagesize = Config::get('system', 'maximagesize'); - if (($maximagesize) && ($filesize > $maximagesize)) { + if ($maximagesize && ($filesize > $maximagesize)) { $formattedBytes = formatBytes($maximagesize); throw new InternalServerErrorException("image size exceeds Friendica config setting (uploaded size: $formattedBytes)"); } @@ -4866,20 +4868,20 @@ function api_clean_attachments($body) { $data = get_attachment_data($body); - if (!$data) + if (!$data) { return $body; - + } $body = ""; - if (isset($data["text"])) + if (isset($data["text"])) { $body = $data["text"]; - - if (($body == "") && (isset($data["title"]))) + } + if (($body == "") && isset($data["title"])) { $body = $data["title"]; - - if (isset($data["url"])) + } + if (isset($data["url"])) { $body .= "\n".$data["url"]; - + } $body .= $data["after"]; return $body; @@ -5098,9 +5100,9 @@ function api_friendica_group_create($type) intval($cid), intval($uid) ); - if (count($contact)) + if (count($contact)) { $result = Group::addMember($gid, $cid); - else { + } else { $erroraddinguser = true; $errorusers[] = $cid; } From 0691d83bbc2d6d28ee2f4e9dd4e8fc11ff644939 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 23 Dec 2017 01:23:20 +0100 Subject: [PATCH 09/80] Typo --- include/api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/api.php b/include/api.php index 07c83f8625..e561f397c0 100644 --- a/include/api.php +++ b/include/api.php @@ -399,7 +399,7 @@ function api_call(App $a) * * @param string $type Return type (xml, json, rss, as) * @param object $e HTTPException Error object - * @return strin error message formatted as $type + * @return string error message formatted as $type */ function api_error($type, $e) { From 37aef324406498445770f41f7d5b921ad6599b77 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 23 Dec 2017 01:23:28 +0100 Subject: [PATCH 10/80] Remove unused variable --- include/api.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/api.php b/include/api.php index e561f397c0..724568279a 100644 --- a/include/api.php +++ b/include/api.php @@ -950,8 +950,6 @@ function api_create_xml($data, $root_element) */ function api_format_data($root_element, $type, $data) { - $a = get_app(); - switch ($type) { case "atom": case "rss": From b4cf27e76731556c2b4d2941f51b74e1935e0ba7 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 23 Dec 2017 01:25:43 +0100 Subject: [PATCH 11/80] api_format_data can also return an array --- include/api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/api.php b/include/api.php index 724568279a..b6181ea1a4 100644 --- a/include/api.php +++ b/include/api.php @@ -946,7 +946,7 @@ function api_create_xml($data, $root_element) * @param string $type Return type (atom, rss, xml, json) * @param array $data JSON style array * - * @return (string|object) XML data or JSON data + * @return (string|object|array) XML data or JSON data */ function api_format_data($root_element, $type, $data) { From 521d4b09b6b1ef6f3d35529f562a3e0cd2ee1c99 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 23 Dec 2017 01:27:17 +0100 Subject: [PATCH 12/80] Unused argument --- include/api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/api.php b/include/api.php index b6181ea1a4..c9c227daaa 100644 --- a/include/api.php +++ b/include/api.php @@ -1494,7 +1494,7 @@ function api_users_search($type) if (DBM::is_result($r)) { $k = 0; foreach ($r as $user) { - $user_info = api_get_user($a, $user["id"], "json"); + $user_info = api_get_user($a, $user["id"]); if ($type == "xml") { $userlist[$k++.":user"] = $user_info; From 70ab9dc9bea07a90fa19937a0f4ae8606ced21fa Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 23 Dec 2017 01:30:50 +0100 Subject: [PATCH 13/80] Undefined variable --- include/api.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/api.php b/include/api.php index c9c227daaa..d7e383d53c 100644 --- a/include/api.php +++ b/include/api.php @@ -3163,10 +3163,10 @@ function api_statuses_f($qtype) return false; } + $sql_extra = ''; if ($qtype == 'friends') { $sql_extra = sprintf(" AND ( `rel` = %d OR `rel` = %d ) ", intval(CONTACT_IS_SHARING), intval(CONTACT_IS_FRIEND)); - } - if ($qtype == 'followers') { + } elseif ($qtype == 'followers') { $sql_extra = sprintf(" AND ( `rel` = %d OR `rel` = %d ) ", intval(CONTACT_IS_FOLLOWER), intval(CONTACT_IS_FRIEND)); } From da6a7b1fced470f2ac47118862d51d6674b718cb Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 23 Dec 2017 01:32:47 +0100 Subject: [PATCH 14/80] Typo --- include/api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/api.php b/include/api.php index d7e383d53c..deb6a76da4 100644 --- a/include/api.php +++ b/include/api.php @@ -3311,7 +3311,7 @@ function api_statusnet_config($type) $private = ((Config::get('system', 'block_public')) ? 'true' : 'false'); $textlimit = (string) (($a->config['max_import_size']) ? $a->config['max_import_size'] : 200000); if ($a->config['api_import_size']) { - $texlimit = string($a->config['api_import_size']); + $textlimit = (string) $a->config['api_import_size']; } $ssl = ((Config::get('system', 'have_ssl')) ? 'true' : 'false'); $sslserver = (($ssl === 'true') ? str_replace('http:', 'https:', System::baseUrl()) : ''); From f2758d00fb133ad5524ecd84e40437db457a6253 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 23 Dec 2017 01:34:12 +0100 Subject: [PATCH 15/80] Unused variable --- include/api.php | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/include/api.php b/include/api.php index deb6a76da4..f44afd3a41 100644 --- a/include/api.php +++ b/include/api.php @@ -3363,17 +3363,6 @@ function api_ff_ids($type,$qtype) $user_info = api_get_user($a); - if ($qtype == 'friends') { - $sql_extra = sprintf(" AND ( `rel` = %d OR `rel` = %d ) ", intval(CONTACT_IS_SHARING), intval(CONTACT_IS_FRIEND)); - } - if ($qtype == 'followers') { - $sql_extra = sprintf(" AND ( `rel` = %d OR `rel` = %d ) ", intval(CONTACT_IS_FOLLOWER), intval(CONTACT_IS_FRIEND)); - } - - if (!$user_info["self"]) { - $sql_extra = " AND false "; - } - $stringify_ids = (x($_REQUEST, 'stringify_ids') ? $_REQUEST['stringify_ids'] : false); $r = q( From ca73ec5cbbd286cf902c128322d7d6a0e0fabc3e Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 23 Dec 2017 01:36:55 +0100 Subject: [PATCH 16/80] Incorrect return type --- include/api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/api.php b/include/api.php index f44afd3a41..42937b3aac 100644 --- a/include/api.php +++ b/include/api.php @@ -4594,7 +4594,7 @@ api_register_func('api/friendica/remoteauth', 'api_friendica_remoteauth', true); * @brief Return the item shared, if the item contains only the [share] tag * * @param array $item Sharer item - * @return array Shared item or false if not a reshare + * @return array|false Shared item or false if not a reshare */ function api_share_as_retweet(&$item) { From 0305aa2d8218a0919526a08910ffaebfdc5bb2c5 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sun, 24 Dec 2017 00:27:45 +0100 Subject: [PATCH 17/80] Lint api.php --- include/api.php | 198 +++++++++++++++++++++++++++++++----------------- 1 file changed, 128 insertions(+), 70 deletions(-) diff --git a/include/api.php b/include/api.php index 002f807fb3..9580afa86c 100644 --- a/include/api.php +++ b/include/api.php @@ -186,7 +186,7 @@ function api_login(App $a) } if (!x($_SERVER, 'PHP_AUTH_USER')) { - logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG); + logger('API_login: ' . print_r($_SERVER, true), LOGGER_DEBUG); header('WWW-Authenticate: Basic realm="Friendica"'); throw new UnauthorizedException("This API requires login"); } @@ -367,12 +367,13 @@ function api_call(App $a) break; case "json": header("Content-Type: application/json"); - foreach ($r as $rr) + foreach ($r as $rr) { $json = json_encode($rr); - if (x($_GET, 'callback')) { - $json = $_GET['callback'] . "(" . $json . ")"; - } - return $json; + } + if (x($_GET, 'callback')) { + $json = $_GET['callback'] . "(" . $json . ")"; + } + return $json; break; case "rss": header("Content-Type: application/rss+xml"); @@ -1737,7 +1738,8 @@ function api_statuses_public_timeline($type) $sql_extra = 'AND `thread`.`iid` <= ' . intval($max_id); } - $r = dba::p("SELECT " . item_fieldlists() . " + $r = dba::p( + "SELECT " . item_fieldlists() . " FROM `thread` STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid` " . item_joins() . " @@ -1766,7 +1768,8 @@ function api_statuses_public_timeline($type) $sql_extra .= ' AND `item`.`parent` = ' . intval($conversation_id); } - $r = dba::p("SELECT " . item_fieldlists() . " + $r = dba::p( + "SELECT " . item_fieldlists() . " FROM `item` " . item_joins() . " STRAIGHT_JOIN `user` ON `user`.`uid` = `item`.`uid` @@ -1837,7 +1840,8 @@ function api_statuses_networkpublic_timeline($type) $sql_extra = 'AND `thread`.`iid` <= ' . intval($max_id); } - $r = dba::p("SELECT " . item_fieldlists() . " + $r = dba::p( + "SELECT " . item_fieldlists() . " FROM `thread` STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid` " . item_joins() . " @@ -2009,10 +2013,12 @@ function api_conversation_show($type) AND `item`.`uid` = %d AND `item`.`verb` = '%s' AND `item`.`id`>%d $sql_extra ORDER BY `item`.`id` DESC LIMIT %d ,%d", - intval($id), intval(api_user()), + intval($id), + intval(api_user()), dbesc(ACTIVITY_POST), intval($since_id), - intval($start), intval($count) + intval($start), + intval($count) ); if (!DBM::is_result($r)) { @@ -2321,7 +2327,7 @@ function api_statuses_user_timeline($type) } /// @TODO move to top of file or somwhere better -api_register_func('api/statuses/user_timeline','api_statuses_user_timeline', true); +api_register_func('api/statuses/user_timeline', 'api_statuses_user_timeline', true); /** * Star/unstar an item @@ -2372,7 +2378,7 @@ function api_favorites_create_destroy($type) throw new BadRequestException("Invalid action ".$action); } - $r = q("UPDATE item SET starred=%d WHERE id=%d AND uid=%d", $item[0]['starred'], $itemid, api_user()); + $r = q("UPDATE item SET starred=%d WHERE id=%d AND uid=%d", $item[0]['starred'], $itemid, api_user()); q("UPDATE thread SET starred=%d WHERE iid=%d AND uid=%d", $item[0]['starred'], $itemid, api_user()); @@ -2719,8 +2725,9 @@ function api_get_entitities(&$text, $bbcode) foreach ($images[1] as $image) { //$start = strpos($text, $url, $offset); $start = iconv_strpos($text, $image, 0, "UTF-8"); - if (!($start === false)) + if (!($start === false)) { $ordered_images[$start] = $image; + } } //$entities["media"] = array(); $offset = 0; @@ -2729,8 +2736,9 @@ function api_get_entitities(&$text, $bbcode) $display_url = str_replace(array("http://www.", "https://www."), array("", ""), $url); $display_url = str_replace(array("http://", "https://"), array("", ""), $display_url); - if (strlen($display_url) > 26) + if (strlen($display_url) > 26) { $display_url = substr($display_url, 0, 25)."…"; + } $start = iconv_strpos($text, $url, $offset, "UTF-8"); if (!($start === false)) { @@ -2881,8 +2889,9 @@ function api_format_items_activities(&$item, $type = "json") $xml_activities["friendica:".$k] = $v; // add user data into xml output $k_user = 0; - foreach ($v as $user) + foreach ($v as $user) { $xml_activities["friendica:".$k][$k_user++.":user"] = $user; + } } $activities = $xml_activities; } @@ -3355,7 +3364,7 @@ api_register_func('api/statusnet/version', 'api_statusnet_version', false); /** * @todo use api_format_data() to return data */ -function api_ff_ids($type,$qtype) +function api_ff_ids($type, $qtype) { $a = get_app(); @@ -3409,9 +3418,13 @@ function api_direct_messages_new($type) $a = get_app(); - if (api_user() === false) throw new ForbiddenException(); + if (api_user() === false) { + throw new ForbiddenException(); + } - if (!x($_POST, "text") || (!x($_POST, "screen_name") && !x($_POST, "user_id"))) return; + if (!x($_POST, "text") || (!x($_POST, "screen_name") && !x($_POST, "user_id"))) { + return; + } $sender = api_get_user($a); @@ -3466,7 +3479,6 @@ function api_direct_messages_new($type) } return api_format_data("direct-messages", $type, $data); - } /// @TODO move to top of file or somewhere better @@ -3545,7 +3557,6 @@ function api_direct_messages_destroy($type) } } /// @todo return JSON data like Twitter API not yet implemented - } /// @TODO move to top of file or somewhere better @@ -3727,8 +3738,9 @@ function api_fr_photoalbum_delete($type) intval(api_user()), dbesc($album) ); - if (!DBM::is_result($r)) + if (!DBM::is_result($r)) { throw new BadRequestException("album not available"); + } // function for setting the items to "deleted = 1" which ensures that comments, likes etc. are not shown anymore // to the user and the contacts of the users (drop_items() performs the federation of the deletion to other networks @@ -4264,7 +4276,8 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ } logger( "File upload src: " . $src . " - filename: " . $filename . - " - size: " . $filesize . " - type: " . $filetype, LOGGER_DEBUG + " - size: " . $filesize . " - type: " . $filetype, + LOGGER_DEBUG ); // check if there was a php upload error @@ -4663,8 +4676,9 @@ function api_share_as_retweet(&$item) $posted = ""; preg_match("/posted='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if ($matches[1] != "") { $posted = $matches[1]; + } preg_match('/posted="(.*?)"/ism', $attributes, $matches); if ($matches[1] != "") { @@ -4686,7 +4700,6 @@ function api_share_as_retweet(&$item) $reshared_item["edited"] = $posted; return $reshared_item; - } function api_get_nick($profile) @@ -4781,9 +4794,11 @@ function api_in_reply_to($item) $in_reply_to['screen_name'] = null; 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']), - dbesc($item['thr-parent'])); + dbesc($item['thr-parent']) + ); if (DBM::is_result($r)) { $in_reply_to['status_id'] = intval($r[0]['id']); @@ -4793,7 +4808,8 @@ function api_in_reply_to($item) $in_reply_to['status_id_str'] = (string) intval($in_reply_to['status_id']); - $r = q("SELECT `contact`.`nick`, `contact`.`name`, `contact`.`id`, `contact`.`url` FROM item + $r = q( + "SELECT `contact`.`nick`, `contact`.`name`, `contact`.`id`, `contact`.`url` FROM item STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`author-id` WHERE `item`.`id` = %d LIMIT 1", intval($in_reply_to['status_id']) @@ -4878,39 +4894,56 @@ function api_best_nickname(&$contacts) { $best_contact = array(); - if (count($contact) == 0) + if (count($contact) == 0) { return; + } - foreach ($contacts as $contact) + foreach ($contacts as $contact) { if ($contact["network"] == "") { $contact["network"] = "dfrn"; $best_contact = array($contact); } + } - if (sizeof($best_contact) == 0) - foreach ($contacts as $contact) - if ($contact["network"] == "dfrn") + if (sizeof($best_contact) == 0) { + foreach ($contacts as $contact) { + if ($contact["network"] == "dfrn") { $best_contact = array($contact); + } + } + } - if (sizeof($best_contact) == 0) - foreach ($contacts as $contact) - if ($contact["network"] == "dspr") + if (sizeof($best_contact) == 0) { + foreach ($contacts as $contact) { + if ($contact["network"] == "dspr") { $best_contact = array($contact); + } + } + } - if (sizeof($best_contact) == 0) - foreach ($contacts as $contact) - if ($contact["network"] == "stat") + if (sizeof($best_contact) == 0) { + foreach ($contacts as $contact) { + if ($contact["network"] == "stat") { $best_contact = array($contact); + } + } + } - if (sizeof($best_contact) == 0) - foreach ($contacts as $contact) - if ($contact["network"] == "pump") + if (sizeof($best_contact) == 0) { + foreach ($contacts as $contact) { + if ($contact["network"] == "pump") { $best_contact = array($contact); + } + } + } - if (sizeof($best_contact) == 0) - foreach ($contacts as $contact) - if ($contact["network"] == "twit") + if (sizeof($best_contact) == 0) { + foreach ($contacts as $contact) { + if ($contact["network"] == "twit") { $best_contact = array($contact); + } + } + } if (sizeof($best_contact) == 1) { $contacts = $best_contact; @@ -4924,7 +4957,9 @@ function api_friendica_group_show($type) { $a = get_app(); - if (api_user() === false) throw new ForbiddenException(); + if (api_user() === false) { + throw new ForbiddenException(); + } // params $user_info = api_get_user($a); @@ -4939,8 +4974,9 @@ function api_friendica_group_show($type) intval($gid) ); // error message if specified gid is not in database - if (!DBM::is_result($r)) + if (!DBM::is_result($r)) { throw new BadRequestException("gid not available"); + } } else { $r = q( "SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d", @@ -5035,7 +5071,9 @@ function api_friendica_group_create($type) { $a = get_app(); - if (api_user() === false) throw new ForbiddenException(); + if (api_user() === false) { + throw new ForbiddenException(); + } // params $user_info = api_get_user($a); @@ -5045,8 +5083,9 @@ function api_friendica_group_create($type) $users = $json['user']; // error if no name specified - if ($name == "") + if ($name == "") { throw new BadRequestException('group name not specified'); + } // get data of the specified group name $rname = q( @@ -5055,8 +5094,9 @@ function api_friendica_group_create($type) dbesc($name) ); // error message if specified group name already exists - if (DBM::is_result($rname)) + if (DBM::is_result($rname)) { throw new BadRequestException('group name already exists'); + } // check if specified group name is a deleted group $rname = q( @@ -5065,8 +5105,9 @@ function api_friendica_group_create($type) dbesc($name) ); // error message if specified group name already exists - if (DBM::is_result($rname)) + if (DBM::is_result($rname)) { $reactivate_group = true; + } // create group $ret = Group::create($uid, $name); @@ -5108,7 +5149,9 @@ function api_friendica_group_update($type) { $a = get_app(); - if (api_user() === false) throw new ForbiddenException(); + if (api_user() === false) { + throw new ForbiddenException(); + } // params $user_info = api_get_user($a); @@ -5119,12 +5162,14 @@ function api_friendica_group_update($type) $users = $json['user']; // error if no name specified - if ($name == "") + if ($name == "") { throw new BadRequestException('group name not specified'); + } // error if no gid specified - if ($gid == "") + if ($gid == "") { throw new BadRequestException('gid not specified'); + } // remove members $members = Contact::getByGroupId($gid); @@ -5170,7 +5215,9 @@ function api_friendica_activity($type) { $a = get_app(); - if (api_user() === false) throw new ForbiddenException(); + if (api_user() === false) { + throw new ForbiddenException(); + } $verb = strtolower($a->argv[3]); $verb = preg_replace("|\..*$|", "", $verb); @@ -5212,16 +5259,21 @@ function api_friendica_notification($type) { $a = get_app(); - if (api_user() === false) throw new ForbiddenException(); - if ($a->argc!==3) throw new BadRequestException("Invalid argument count"); + if (api_user() === false) { + throw new ForbiddenException(); + } + if ($a->argc!==3) { + throw new BadRequestException("Invalid argument count"); + } $nm = new NotificationsManager(); $notes = $nm->getAll(array(), "+seen -date", 50); if ($type == "xml") { $xmlnotes = array(); - foreach ($notes as $note) + foreach ($notes as $note) { $xmlnotes[] = array("@attributes" => $note); + } $notes = $xmlnotes; } @@ -5241,14 +5293,20 @@ function api_friendica_notification_seen($type) { $a = get_app(); - if (api_user() === false) throw new ForbiddenException(); - if ($a->argc!==4) throw new BadRequestException("Invalid argument count"); + if (api_user() === false) { + throw new ForbiddenException(); + } + if ($a->argc!==4) { + throw new BadRequestException("Invalid argument count"); + } $id = (x($_REQUEST, 'id') ? intval($_REQUEST['id']) : 0); $nm = new NotificationsManager(); $note = $nm->getByID($id); - if (is_null($note)) throw new BadRequestException("Invalid argument"); + if (is_null($note)) { + throw new BadRequestException("Invalid argument"); + } $nm->setSeen($note); if ($note['otype']=='item') { @@ -5505,15 +5563,15 @@ api_register_func('api/saved_searches/list', 'api_saved_searches_list', true); /* @TODO Maybe open to implement? To.Do: - [pagename] => api/1.1/statuses/lookup.json - [id] => 605138389168451584 - [include_cards] => true - [cards_platform] => Android-12 - [include_entities] => true - [include_my_retweet] => 1 - [include_rts] => 1 - [include_reply_count] => true - [include_descendent_reply_count] => true + [pagename] => api/1.1/statuses/lookup.json + [id] => 605138389168451584 + [include_cards] => true + [cards_platform] => Android-12 + [include_entities] => true + [include_my_retweet] => 1 + [include_rts] => 1 + [include_reply_count] => true + [include_descendent_reply_count] => true (?) From 833815bff5c25c12be4b12434d0df94232ec68a9 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sun, 24 Dec 2017 00:39:42 +0100 Subject: [PATCH 18/80] Lint doc/Developers-Intro.md --- doc/Developers-Intro.md | 53 +++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/doc/Developers-Intro.md b/doc/Developers-Intro.md index f40186f1da..044599435b 100644 --- a/doc/Developers-Intro.md +++ b/doc/Developers-Intro.md @@ -1,5 +1,6 @@ -Where to get started to help improve Friendica? -=============================================== +# Where to get started to help improve Friendica + + * [Home](help) @@ -10,29 +11,25 @@ A project like Friendica is the sum of many different contributions. We are looking for helpers in all areas, whether you write text or code, whether you spread the word to convince people or design new icons. Whether you feel like an expert or like a newbie - join us with your ideas! -Contact us ---- +## Contact us The discussion of Friendica development takes place in the following Friendica forums: * The main [forum for Friendica development](https://forum.friendi.ca/profile/developers) * The [forum for Friendica theme development](https://friendica.eu/profile/ftdevs) -Help other users ---- +## Help other users Remember the questions you had when you first tried Friendica? A good place to start can be to help new people find their way around Friendica in the [general support forum](https://forum.friendi.ca/prufile/helpers). Welcome them, answer their questions, point them to documentation or ping other helpers directly if you can't help but think you know who can. -Translation ---- +## Translation The documentation contains help on how to translate Friendica [at Transifex](/help/translations) where the UI is translated. If you don't want to translate the UI, or it is already done to your satisfaction, you might want to work on the translation of the /help files? -Design ---- +## Design Are you good at designing things? If you have seen Friendica you probably have ideas to improve it, haven't you? @@ -40,11 +37,10 @@ If you have seen Friendica you probably have ideas to improve it, haven't you? * If you would like to work with us on enhancing the user interface, please join the [UX Watchdogs forum](https://fc.oscp.info/profile/ux-watchdogs) * Make plans for a better Friendica interface design and share them with us. * Tell us if you are able to realize your ideas or what kind of help you need. -We can't promise we have the right skills in the group but we'll try. + We can't promise we have the right skills in the group but we'll try. * Choose a thing to start with, e.g. work on the icon set of your favorite theme -Programming ---- +## Programming ### Composer @@ -60,13 +56,14 @@ It's a command-line tool that downloads required libraries into the `vendor` fol For the sake of consistency between contribution and general code readability, Friendica follows the widespread [PSR-2 coding standards](http://www.php-fig.org/psr/psr-2/) to the exception of a few rules. Here's a few primers if you are new to Friendica or to the PSR-2 coding standards: - * Indentation is tabs, period (not PSR-2). - * 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'` - * Braces are mandatory in conditions - * Boolean operators are `&&` and `||` for PHP conditions, `AND` and `OR` for SQL queries - * No closing PHP tag - * No trailing spaces + +* Indentation is tabs, period (not PSR-2). +* 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'` +* Braces are mandatory in conditions +* Boolean operators are `&&` and `||` for PHP conditions, `AND` and `OR` for SQL queries +* No closing PHP tag +* No trailing spaces Don't worry, you don't have to know by heart the PSR-2 coding standards to start contributing to Friendica. There are a few tools you can use to check or fix your files before you commit. @@ -100,7 +97,7 @@ If you are interested in having the documentation of the Friendica code outside The configuration file for Doxygen is located in the `util` directory of the project sources. Run - $> doxygen util/Doxyfile + $> doxygen util/Doxyfile to generate the files which will be located in the `doc/html` subdirectory in the Friendica directory. You can browse these files with any browser. @@ -111,11 +108,11 @@ If you find missing documentation, don't hesitate to contact us and write it dow Have a look at our [issue tracker](https://github.com/friendica/friendica) on github! - * Try to reproduce a bug that needs more inquiries and write down what you find out. - * If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed. - * Fix a bug if you can. Please make the pull request against the *develop* branch of the repository. - * There is a *Junior Job* label for issues we think might be a good point to start with. - But you don't have to limit yourself to those issues. +* Try to reproduce a bug that needs more inquiries and write down what you find out. +* If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed. +* Fix a bug if you can. Please make the pull request against the *develop* branch of the repository. +* There is a *Junior Job* label for issues we think might be a good point to start with. + But you don't have to limit yourself to those issues. ### Web interface @@ -124,10 +121,10 @@ This is a piece of work! If you want to get involved here: * Look at the first steps that were made (e.g. the clean theme). -Ask us to find out whom to talk to about their experiences. + Ask us to find out whom to talk to about their experiences. * Talk to design people if you know any. * Let us know about your plans [in the dev forum](https://forum.friendi.ca/profile/developers) or the [theme developer forum](https://friendica.eu/profile/ftdevs). -Do not worry about cross-posting. + Do not worry about cross-posting. ### Client software From fc0031f4ba37117c25b2a613731951a82eb41a6c Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 24 Dec 2017 11:36:30 +0000 Subject: [PATCH 19/80] First steps to support public likes --- include/like.php | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/include/like.php b/include/like.php index 6b8c138b95..05bb758c2a 100644 --- a/include/like.php +++ b/include/like.php @@ -80,22 +80,26 @@ function do_like($item_id, $verb) { $item = $items[0]; - if (!can_write_wall($a, $item['uid'])) { + if (!can_write_wall($a, $item['uid']) && ($item['uid'] != 0)) { logger('like: unable to write on wall ' . $item['uid']); return false; } // Retrieves the local post owner - $owners = q("SELECT `contact`.* FROM `contact` - WHERE `contact`.`self` - AND `contact`.`uid` = %d", - intval($item['uid']) - ); - if (DBM::is_result($owners)) { - $owner_self_contact = $owners[0]; + if ($item['uid'] != 0) { + $owners = q("SELECT `contact`.* FROM `contact` + WHERE `contact`.`self` + AND `contact`.`uid` = %d", + intval($item['uid']) + ); + if (DBM::is_result($owners)) { + $owner_self_contact = $owners[0]; + } else { + logger('like: unknown owner ' . $item['uid']); + return false; + } } else { - logger('like: unknown owner ' . $item['uid']); - return false; + $owner_self_contact = ['uid' => 0, 'nick' => 'feed-item']; } // Retrieve the current logged in user's public contact From e848e376b89a6aaf35054c178c1662d4a23035fa Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 24 Dec 2017 11:51:38 +0000 Subject: [PATCH 20/80] Fix for issue 4121 - now the description isn't empty --- include/api.php | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/include/api.php b/include/api.php index 9580afa86c..eb3ef796d2 100644 --- a/include/api.php +++ b/include/api.php @@ -743,13 +743,27 @@ function api_get_user(App $a, $contact_id = null) $pcontact_id = Contact::getIdForURL($uinfo[0]['url'], 0, true); + if (!empty($profile[0]['pdesc'])) { + $description = $profile[0]['pdesc']; + } else { + $description = $uinfo[0]["about"]; + } + + if (!empty($usr[0]['default-location'])) { + $location = $usr[0]['default-location']; + } elseif (!empty($uinfo[0]["location"])) { + $location = $uinfo[0]["location"]; + } else { + $location = network_name; + } + $ret = array( 'id' => intval($pcontact_id), 'id_str' => (string) intval($pcontact_id), 'name' => (($uinfo[0]['name']) ? $uinfo[0]['name'] : $uinfo[0]['nick']), 'screen_name' => (($uinfo[0]['nick']) ? $uinfo[0]['nick'] : $uinfo[0]['name']), - 'location' => ($usr) ? $usr[0]['default-location'] : $network_name, - 'description' => (($profile) ? $profile[0]['pdesc'] : null), + 'location' => $location, + 'description' => $description, 'profile_image_url' => $uinfo[0]['micro'], 'profile_image_url_https' => $uinfo[0]['micro'], 'url' => $uinfo[0]['url'], From 37eecad8ccfaebc7b74b3b3ef976f836a94b01cb Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sun, 24 Dec 2017 03:20:50 +0100 Subject: [PATCH 21/80] Add missing doc in api.php --- include/api.php | 443 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 389 insertions(+), 54 deletions(-) diff --git a/include/api.php b/include/api.php index 9580afa86c..dcd594ead8 100644 --- a/include/api.php +++ b/include/api.php @@ -1,8 +1,8 @@ ". * Some clients doesn't send a source param, we support ones we know * (only Twidere, atm) * + * @brief Get source name from API client + * * @return string * Client source name, default to "api" if unset/unknown */ @@ -110,9 +110,9 @@ function api_date($str) } /** - * @brief Register API endpoint + * Register a function to be the endpoint for defined API path. * - * Register a function to be the endpont for defined API path. + * @brief Register API endpoint * * @param string $path API URL path, relative to System::baseUrl() * @param string $func Function name to call on path request @@ -142,11 +142,11 @@ function api_register_func($path, $func, $auth = false, $method = API_METHOD_ANY } /** - * @brief Login API user - * * Log in user via OAuth1 or Simple HTTP Auth. * Simple Auth allow username in form of
user@server
, ignoring server part * + * @brief Login API user + * * @param object $a App * @hook 'authenticate' * array $addon_auth @@ -242,12 +242,12 @@ function api_login(App $a) } /** - * @brief Check HTTP method of called API - * * API endpoints can define which HTTP method to accept when called. * This function check the current HTTP method agains endpoint * registered method. * + * @brief Check HTTP method of called API + * * @param string $method Required methods, uppercase, separated by comma * @return bool */ @@ -260,10 +260,10 @@ function api_check_method($method) } /** - * @brief Main API entry point - * * Authenticate user, call registered API function, set HTTP headers * + * @brief Main API entry point + * * @param object $a App * @return string API call result */ @@ -972,7 +972,9 @@ function api_format_data($root_element, $type, $data) /** * Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful; * returns a 401 status code and an error message if not. - * http://developer.twitter.com/doc/get/account/verify_credentials + * @see https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-account-verify_credentials + * + * @param string $type Return type (atom, rss, xml, json) */ function api_account_verify_credentials($type) { @@ -1018,6 +1020,8 @@ api_register_func('api/account/verify_credentials', 'api_account_verify_credenti /** * Get data from $_POST or $_GET + * + * @param string $k */ function requestdata($k) { @@ -1030,7 +1034,13 @@ function requestdata($k) return null; } -/*Waitman Gobble Mod*/ +/** + * Waitman Gobble Mod + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_statuses_mediap($type) { $a = get_app(); @@ -1074,6 +1084,14 @@ function api_statuses_mediap($type) /// @TODO move this to top of file or somewhere better! api_register_func('api/statuses/mediap', 'api_statuses_mediap', true, API_METHOD_POST); +/** + * Updates the user’s current status. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + * @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-update + */ function api_statuses_update($type) { @@ -1249,6 +1267,14 @@ function api_statuses_update($type) api_register_func('api/statuses/update', 'api_statuses_update', true, API_METHOD_POST); api_register_func('api/statuses/update_with_media', 'api_statuses_update', true, API_METHOD_POST); +/** + * Uploads an image to Friendica. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array + * @see https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload + */ function api_media_upload($type) { $a = get_app(); @@ -1287,6 +1313,12 @@ function api_media_upload($type) /// @TODO move to top of file or somwhere better api_register_func('api/media/upload', 'api_media_upload', true, API_METHOD_POST); +/** + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_status_show($type) { $a = get_app(); @@ -1391,7 +1423,9 @@ function api_status_show($type) /** * Returns extended information of a given user, specified by ID or screen name as per the required id parameter. * The author's most recent status will be returned inline. - * http://developer.twitter.com/doc/get/users/show + * + * @param string $type Return type (atom, rss, xml, json) + * @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-show */ function api_users_show($type) { @@ -1477,6 +1511,14 @@ function api_users_show($type) api_register_func('api/users/show', 'api_users_show'); api_register_func('api/externalprofile/show', 'api_users_show'); +/** + * Search a public user account. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + * @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-search + */ function api_users_search($type) { $a = get_app(); @@ -1607,11 +1649,14 @@ api_register_func('api/search/tweets', 'api_search', true); api_register_func('api/search', 'api_search', true); /** + * Returns the most recent statuses posted by the user and the users they follow. * - * http://developer.twitter.com/doc/get/statuses/home_timeline + * @see https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-home_timeline * - * TODO: Optional parameters - * TODO: Add reply info + * @param string $type Return type (atom, rss, xml, json) + * + * @todo Optional parameters + * @todo Add reply info */ function api_statuses_home_timeline($type) { @@ -1708,6 +1753,13 @@ function api_statuses_home_timeline($type) api_register_func('api/statuses/home_timeline', 'api_statuses_home_timeline', true); api_register_func('api/statuses/friends_timeline', 'api_statuses_home_timeline', true); +/** + * Returns the most recent statuses from public users. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_statuses_public_timeline($type) { $a = get_app(); @@ -1808,6 +1860,8 @@ function api_statuses_public_timeline($type) api_register_func('api/statuses/public_timeline', 'api_statuses_public_timeline', true); /** + * Returns the most recent statuses posted by users this node knows about. + * * @brief Returns the list of public federated posts this node knows about * * @param string $type Return format: json, xml, atom, rss @@ -1878,7 +1932,11 @@ function api_statuses_networkpublic_timeline($type) api_register_func('api/statuses/networkpublic_timeline', 'api_statuses_networkpublic_timeline', true); /** - * @TODO nothing to say? + * Returns a single status. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/get-statuses-show-id */ function api_statuses_show($type) { @@ -1949,7 +2007,10 @@ function api_statuses_show($type) api_register_func('api/statuses/show', 'api_statuses_show', true); /** - * @TODO nothing to say? + * + * @param string $type Return type (atom, rss, xml, json) + * + * @todo nothing to say? */ function api_conversation_show($type) { @@ -2036,7 +2097,11 @@ api_register_func('api/conversation/show', 'api_conversation_show', true); api_register_func('api/statusnet/conversation', 'api_conversation_show', true); /** - * @TODO nothing to say? + * Repeats a status. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-retweet-id */ function api_statuses_repeat($type) { @@ -2114,7 +2179,11 @@ function api_statuses_repeat($type) api_register_func('api/statuses/retweet', 'api_statuses_repeat', true, API_METHOD_POST); /** - * @TODO nothing to say? + * Destroys a specific status. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-destroy-id */ function api_statuses_destroy($type) { @@ -2151,8 +2220,11 @@ function api_statuses_destroy($type) api_register_func('api/statuses/destroy', 'api_statuses_destroy', true, API_METHOD_DELETE); /** - * @TODO Nothing more than an URL to say? - * http://developer.twitter.com/doc/get/statuses/mentions + * Returns the most recent mentions. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @see http://developer.twitter.com/doc/get/statuses/mentions */ function api_statuses_mentions($type) { @@ -2238,11 +2310,14 @@ api_register_func('api/statuses/mentions', 'api_statuses_mentions', true); api_register_func('api/statuses/replies', 'api_statuses_mentions', true); /** + * Returns the most recent statuses posted by the user. + * * @brief Returns a user's public timeline * * @param string $type Either "json" or "xml" * @return string|array * @throws ForbiddenException + * @see https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline */ function api_statuses_user_timeline($type) { @@ -2330,10 +2405,12 @@ function api_statuses_user_timeline($type) api_register_func('api/statuses/user_timeline', 'api_statuses_user_timeline', true); /** - * Star/unstar an item + * Star/unstar an item. * param: id : id of the item * - * api v1 : https://web.archive.org/web/20131019055350/https://dev.twitter.com/docs/api/1/post/favorites/create/%3Aid + * @param string $type Return type (atom, rss, xml, json) + * + * @see https://web.archive.org/web/20131019055350/https://dev.twitter.com/docs/api/1/post/favorites/create/%3Aid */ function api_favorites_create_destroy($type) { @@ -2405,6 +2482,13 @@ function api_favorites_create_destroy($type) api_register_func('api/favorites/create', 'api_favorites_create_destroy', true, API_METHOD_POST); api_register_func('api/favorites/destroy', 'api_favorites_create_destroy', true, API_METHOD_DELETE); +/** + * Returns the most recent favorite statuses. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return string|array + */ function api_favorites($type) { global $called_api; @@ -2479,6 +2563,14 @@ function api_favorites($type) /// @TODO move to top of file or somwhere better api_register_func('api/favorites', 'api_favorites', true); +/** + * + * @param array $item + * @param array $recipient + * @param array $sender + * + * @return array + */ function api_format_messages($item, $recipient, $sender) { // standard meta information @@ -2523,6 +2615,12 @@ function api_format_messages($item, $recipient, $sender) return $ret; } +/** + * + * @param array $item + * + * @return array + */ function api_convert_item($item) { $body = $item['body']; @@ -2592,6 +2690,12 @@ function api_convert_item($item) ); } +/** + * + * @param string $body + * + * @return array + */ function api_get_attachments(&$body) { $text = $body; @@ -2623,13 +2727,16 @@ function api_get_attachments(&$body) return $attachments; } +/** + * + * @param string $text + * @param string $bbcode + * + * @return array + * @todo Links at the first character of the post + */ function api_get_entitities(&$text, $bbcode) { - /* - To-Do: - * Links at the first character of the post - */ - $a = get_app(); $include_entities = strtolower(x($_REQUEST, 'include_entities') ? $_REQUEST['include_entities'] : "false"); @@ -2788,6 +2895,14 @@ function api_get_entitities(&$text, $bbcode) return $entities; } + +/** + * + * @param array $item + * @param string $text + * + * @return string + */ function api_format_items_embeded_images(&$item, $text) { $text = preg_replace_callback( @@ -2806,7 +2921,7 @@ function api_format_items_embeded_images(&$item, $text) * * @param string $txt text * @return array - * name => 'name' + * 'name' => 'name', * 'url => 'url' */ function api_contactlink_to_array($txt) @@ -2832,8 +2947,10 @@ function api_contactlink_to_array($txt) * @brief return likes, dislikes and attend status for item * * @param array $item array + * @param string $type Return type (atom, rss, xml, json) + * * @return array - * likes => int count + * likes => int count, * dislikes => int count */ function api_format_items_activities(&$item, $type = "json") @@ -2956,9 +3073,10 @@ function api_format_items_profiles(&$profile = null, $type = "json") /** * @brief format items to be returned by api * - * @param array $r array of items - * @param array $user_info - * @param bool $filter_user filter items by $user_info + * @param array $r array of items + * @param array $user_info + * @param bool $filter_user filter items by $user_info + * @param string $type Return type (atom, rss, xml, json) */ function api_format_items($r, $user_info, $filter_user = false, $type = "json") { @@ -3073,6 +3191,13 @@ function api_format_items($r, $user_info, $filter_user = false, $type = "json") return $ret; } +/** + * Returns the remaining number of API requests available to the user before the API limit is reached. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_account_rate_limit_status($type) { if ($type == "xml") { @@ -3101,6 +3226,13 @@ function api_account_rate_limit_status($type) /// @TODO move to top of file or somwhere better api_register_func('api/account/rate_limit_status', 'api_account_rate_limit_status', true); +/** + * Returns the string "ok" in the requested format with a 200 OK HTTP status code. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_help_test($type) { if ($type == 'xml') { @@ -3115,6 +3247,12 @@ function api_help_test($type) /// @TODO move to top of file or somwhere better api_register_func('api/help/test', 'api_help_test', false); +/** + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_lists($type) { $ret = array(); @@ -3125,6 +3263,14 @@ function api_lists($type) /// @TODO move to top of file or somwhere better api_register_func('api/lists', 'api_lists', true); +/** + * Returns all lists the user subscribes to. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + * @see https://developer.twitter.com/en/docs/accounts-and-users/create-manage-lists/api-reference/get-lists-list + */ function api_lists_list($type) { $ret = array(); @@ -3136,11 +3282,11 @@ function api_lists_list($type) api_register_func('api/lists/list', 'api_lists_list', true); /** - * @brief Returns either the friends of the follower list - * - * Note: Considers friends and followers lists to be private and won't return + * Considers friends and followers lists to be private and won't return * anything if any user_id parameter is passed. * + * @brief Returns either the friends of the follower list + * * @param string $qtype Either "friends" or "followers" * @return boolean|array * @throws ForbiddenException @@ -3225,6 +3371,8 @@ function api_statuses_f($qtype) /** + * Returns the user's friends. + * * @brief Returns the list of friends of the provided user * * @deprecated By Twitter API in favor of friends/list @@ -3242,7 +3390,9 @@ function api_statuses_friends($type) } /** - * @brief Returns the list of friends of the provided user + * Returns the user's followers. + * + * @brief Returns the list of followers of the provided user * * @deprecated By Twitter API in favor of friends/list * @@ -3310,6 +3460,13 @@ function api_friendships_incoming($type) /// @TODO move to top of file or somewhere better api_register_func('api/friendships/incoming', 'api_friendships_incoming', true); +/** + * Returns the instance's configuration information. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_statusnet_config($type) { $a = get_app(); @@ -3349,6 +3506,12 @@ function api_statusnet_config($type) api_register_func('api/gnusocial/config', 'api_statusnet_config', false); api_register_func('api/statusnet/config', 'api_statusnet_config', false); +/** + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_statusnet_version($type) { // liar @@ -3362,6 +3525,10 @@ api_register_func('api/gnusocial/version', 'api_statusnet_version', false); api_register_func('api/statusnet/version', 'api_statusnet_version', false); /** + * + * @param string $type Return type (atom, rss, xml, json) + * @param string $qtype + * * @todo use api_format_data() to return data */ function api_ff_ids($type, $qtype) @@ -3399,11 +3566,27 @@ function api_ff_ids($type, $qtype) return api_format_data("ids", $type, array('id' => $ids)); } +/** + * Returns the ID of every user the user is following. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + * @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-ids + */ function api_friends_ids($type) { return api_ff_ids($type, 'friends'); } +/** + * Returns the ID of every user following the user. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + * @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-followers-ids + */ function api_followers_ids($type) { return api_ff_ids($type, 'followers'); @@ -3413,6 +3596,14 @@ function api_followers_ids($type) api_register_func('api/friends/ids', 'api_friends_ids', true); api_register_func('api/followers/ids', 'api_followers_ids', true); +/** + * Sends a new direct message. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/new-message + */ function api_direct_messages_new($type) { @@ -3485,10 +3676,13 @@ function api_direct_messages_new($type) api_register_func('api/direct_messages/new', 'api_direct_messages_new', true, API_METHOD_POST); /** + * Destroys a direct message. + * * @brief delete a direct_message from mail table through api * * @param string $type Known types are 'atom', 'rss', 'xml' and 'json' * @return string + * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/delete-message */ function api_direct_messages_destroy($type) { @@ -3562,6 +3756,14 @@ function api_direct_messages_destroy($type) /// @TODO move to top of file or somewhere better api_register_func('api/direct_messages/destroy', 'api_direct_messages_destroy', true, API_METHOD_DELETE); +/** + * + * @param string $type Return type (atom, rss, xml, json) + * @param string $box + * @param string $verbose + * + * @return array|string + */ function api_direct_messages_box($type, $box, $verbose) { $a = get_app(); @@ -3653,24 +3855,52 @@ function api_direct_messages_box($type, $box, $verbose) return api_format_data("direct-messages", $type, $data); } +/** + * Returns the most recent direct messages sent by the user. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/get-sent-message + */ function api_direct_messages_sentbox($type) { $verbose = (x($_GET, 'friendica_verbose') ? strtolower($_GET['friendica_verbose']) : "false"); return api_direct_messages_box($type, "sentbox", $verbose); } +/** + * Returns the most recent direct messages sent to the user. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/get-messages + */ function api_direct_messages_inbox($type) { $verbose = (x($_GET, 'friendica_verbose') ? strtolower($_GET['friendica_verbose']) : "false"); return api_direct_messages_box($type, "inbox", $verbose); } +/** + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_direct_messages_all($type) { $verbose = (x($_GET, 'friendica_verbose') ? strtolower($_GET['friendica_verbose']) : "false"); return api_direct_messages_box($type, "all", $verbose); } +/** + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_direct_messages_conversation($type) { $verbose = (x($_GET, 'friendica_verbose') ? strtolower($_GET['friendica_verbose']) : "false"); @@ -3683,6 +3913,12 @@ api_register_func('api/direct_messages/all', 'api_direct_messages_all', true); api_register_func('api/direct_messages/sent', 'api_direct_messages_sentbox', true); api_register_func('api/direct_messages', 'api_direct_messages_inbox', true); +/** + * Returns an OAuth Request Token. + * + * @param string $type Return type (atom, rss, xml, json) + * @see https://oauth.net/core/1.0/#auth_step1 + */ function api_oauth_request_token($type) { $oauth1 = new FKOAuth1(); @@ -3696,6 +3932,14 @@ function api_oauth_request_token($type) killme(); } +/** + * Returns an OAuth Access Token. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + * @see https://oauth.net/core/1.0/#auth_step3 + */ function api_oauth_access_token($type) { $oauth1 = new FKOAuth1(); @@ -4093,10 +4337,14 @@ function api_fr_photo_detail($type) /** + * Updates the user’s profile image. + * * @brief updates the profile image for the user (either a specified profile or the default profile) * * @param string $type Known types are 'atom', 'rss', 'xml' and 'json' + * * @return string + * @see https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile_image */ function api_account_update_profile_image($type) { @@ -4210,7 +4458,10 @@ api_register_func('api/friendica/photo/delete', 'api_fr_photo_delete', true, API api_register_func('api/friendica/photo', 'api_fr_photo_detail', true); api_register_func('api/account/update_profile_image', 'api_account_update_profile_image', true, API_METHOD_POST); - +/** + * + * @param string $acl_string + */ function check_acl_input($acl_string) { if ($acl_string == null || $acl_string == " ") { @@ -4236,6 +4487,21 @@ function check_acl_input($acl_string) return $contact_not_found; } +/** + * + * @param string $mediatype + * @param array $media + * @param string $type + * @param string $album + * @param string $allow_cid + * @param string $deny_cid + * @param string $allow_gid + * @param string $deny_gid + * @param string $desc + * @param integer $profile + * @param boolean $visibility + * @param string $photo_id + */ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $desc, $profile = 0, $visibility = false, $photo_id = null) { $visitor = 0; @@ -4384,6 +4650,16 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ } } +/** + * + * @param string $hash + * @param string $allow_cid + * @param string $deny_cid + * @param string $allow_gid + * @param string $deny_gid + * @param string $filetype + * @param boolean $visibility + */ function post_photo_item($hash, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $filetype, $visibility = false) { // get data about the api authenticated user @@ -4429,6 +4705,14 @@ function post_photo_item($hash, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $f item_store($arr); } +/** + * + * @param string $type + * @param int $scale + * @param string $photo_id + * + * @return array + */ function prepare_photo_data($type, $scale, $photo_id) { $scale_sql = ($scale === false ? "" : sprintf("AND scale=%d", intval($scale))); @@ -4702,13 +4986,16 @@ function api_share_as_retweet(&$item) return $reshared_item; } +/** + * + * @param string $profile + * + * @return string|false + * @todo remove trailing junk from profile url + * @todo pump.io check has to check the website + */ function api_get_nick($profile) { - /* To-Do: - - remove trailing junk from profile url - - pump.io check has to check the website - */ - $nick = ""; $r = q( @@ -4783,6 +5070,12 @@ function api_get_nick($profile) return false; } +/** + * + * @param array $item + * + * @return array + */ function api_in_reply_to($item) { $in_reply_to = array(); @@ -4841,6 +5134,12 @@ function api_in_reply_to($item) return $in_reply_to; } +/** + * + * @param string $Text + * + * @return string + */ function api_clean_plain_items($Text) { $include_entities = strtolower(x($_REQUEST, 'include_entities') ? $_REQUEST['include_entities'] : "false"); @@ -4890,6 +5189,12 @@ function api_clean_attachments($body) return $body; } +/** + * + * @param array $contacts + * + * @return array + */ function api_best_nickname(&$contacts) { $best_contact = array(); @@ -4952,7 +5257,13 @@ function api_best_nickname(&$contacts) } } -// return all or a specified group of the user with the containing contacts +/** + * Return all or a specified group of the user with the containing contacts. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_friendica_group_show($type) { $a = get_app(); @@ -5010,7 +5321,13 @@ function api_friendica_group_show($type) api_register_func('api/friendica/group_show', 'api_friendica_group_show', true); -// delete the specified group of the user +/** + * Delete the specified group of the user. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_friendica_group_delete($type) { $a = get_app(); @@ -5066,7 +5383,13 @@ function api_friendica_group_delete($type) api_register_func('api/friendica/group_delete', 'api_friendica_group_delete', true, API_METHOD_DELETE); -// create the specified group with the posted array of contacts +/** + * Create the specified group with the posted array of contacts. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_friendica_group_create($type) { $a = get_app(); @@ -5144,7 +5467,13 @@ function api_friendica_group_create($type) api_register_func('api/friendica/group_create', 'api_friendica_group_create', true, API_METHOD_POST); -// update the specified group with the posted array of contacts +/** + * Update the specified group with the posted array of contacts. + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_friendica_group_update($type) { $a = get_app(); @@ -5211,6 +5540,12 @@ function api_friendica_group_update($type) api_register_func('api/friendica/group_update', 'api_friendica_group_update', true, API_METHOD_POST); +/** + * + * @param string $type Return type (atom, rss, xml, json) + * + * @return array|string + */ function api_friendica_activity($type) { $a = get_app(); @@ -5282,10 +5617,10 @@ function api_friendica_notification($type) } /** - * @brief Set notification as seen and returns associated item (if possible) - * * POST request with 'id' param as notification id * + * @brief Set notification as seen and returns associated item (if possible) + * * @param string $type Known types are 'atom', 'rss', 'xml' and 'json' * @return string */ @@ -5393,7 +5728,7 @@ api_register_func('api/friendica/direct_messages_setseen', 'api_friendica_direct * @brief search for direct_messages containing a searchstring through api * * @param string $type Known types are 'atom', 'rss', 'xml' and 'json' - * @return string (success: success=true if found and search_result contains found messages + * @return string (success: success=true if found and search_result contains found messages, * success=false if nothing was found, search_result='nothing found', * error: result=error with error message) */ From 3873d4863fa7e73467f34c8f3db9fee9387f8502 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sun, 24 Dec 2017 16:08:34 +0100 Subject: [PATCH 22/80] add Socialhome to the federation stats --- mod/admin.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mod/admin.php b/mod/admin.php index f5bd1d4f59..9408aa31c6 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -534,7 +534,7 @@ function admin_page_federation(App $a) // off one % two of them are needed in the query // Add more platforms if you like, when one returns 0 known nodes it is not // displayed on the stats page. - $platforms = array('Friendi%%a', 'Diaspora', '%%red%%', 'Hubzilla', 'BlaBlaNet', 'GNU Social', 'StatusNet', 'Mastodon', 'Pleroma'); + $platforms = array('Friendi%%a', 'Diaspora', '%%red%%', 'Hubzilla', 'BlaBlaNet', 'GNU Social', 'StatusNet', 'Mastodon', 'Pleroma', 'socialhome'); $colors = array( 'Friendi%%a' => '#ffc018', // orange from the logo 'Diaspora' => '#a1a1a1', // logo is black and white, makes a gray @@ -544,7 +544,8 @@ function admin_page_federation(App $a) 'GNU Social' => '#a22430', // dark red from the logo 'StatusNet' => '#789240', // the green from the logo (red and blue have already others 'Mastodon' => '#1a9df9', // blue from the Mastodon logo - 'Pleroma' => '#E46F0F' // Orange from the text that is used on Pleroma instances + 'Pleroma' => '#E46F0F', // Orange from the text that is used on Pleroma instances + 'socialhome' => '#52056b' // lilac from the Django Image used at the Socialhome homepage ); $counts = array(); $total = 0; From ba4329da61492e6369005dc54c86da4e7618179c Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 24 Dec 2017 23:07:14 +0000 Subject: [PATCH 23/80] Fixed typo --- include/api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/api.php b/include/api.php index eb3ef796d2..790c94c519 100644 --- a/include/api.php +++ b/include/api.php @@ -754,7 +754,7 @@ function api_get_user(App $a, $contact_id = null) } elseif (!empty($uinfo[0]["location"])) { $location = $uinfo[0]["location"]; } else { - $location = network_name; + $location = $network_name; } $ret = array( From 0475fc1fce4965e660332cd538a43c1c82b7df6c Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 25 Dec 2017 05:39:11 +0000 Subject: [PATCH 24/80] API: Better use "about" instead of "pdesc" --- include/api.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/api.php b/include/api.php index 790c94c519..84ad2a94b4 100644 --- a/include/api.php +++ b/include/api.php @@ -743,8 +743,8 @@ function api_get_user(App $a, $contact_id = null) $pcontact_id = Contact::getIdForURL($uinfo[0]['url'], 0, true); - if (!empty($profile[0]['pdesc'])) { - $description = $profile[0]['pdesc']; + if (!empty($profile[0]['about'])) { + $description = $profile[0]['about']; } else { $description = $uinfo[0]["about"]; } From de5dae07513fbc9323b0d2a45394fbae628e5436 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Sat, 23 Dec 2017 00:46:01 +0100 Subject: [PATCH 25/80] Basic support for account/update_profile API (fixes #4094) --- doc/api.md | 18 +++++++++++++++++- include/api.php | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/doc/api.md b/doc/api.md index c565d8699c..3306c7d4dd 100644 --- a/doc/api.md +++ b/doc/api.md @@ -692,6 +692,23 @@ On error: --- +### account/update_profile (POST; AUTH) + +#### Parameters + +* name (optional): full name of the user +* description (optional): a description of the user + +#### Unsupported parameters + +* url +* location +* profile_link_color +* include_entities +* skip_status + +--- + ### friendships/incoming (*; AUTH) #### Unsupported parameters @@ -1205,7 +1222,6 @@ The following API calls from the Twitter API are not implemented in either Frien * friendships/lookup * account/settings * account/update_delivery_device -* account/update_profile * blocks/ids * users/show * users/search diff --git a/include/api.php b/include/api.php index 0b401f6dff..46b7cd3dea 100644 --- a/include/api.php +++ b/include/api.php @@ -4472,6 +4472,39 @@ api_register_func('api/friendica/photo/delete', 'api_fr_photo_delete', true, API api_register_func('api/friendica/photo', 'api_fr_photo_detail', true); api_register_func('api/account/update_profile_image', 'api_account_update_profile_image', true, API_METHOD_POST); +/** + * Update user profile + * + * @param string $type Known types are 'atom', 'rss', 'xml' and 'json' + * + * @return array|string + */ +function api_account_update_profile($type) +{ + $local_user = local_user(); + $api_user = api_get_user(get_app()); + + if (x($_POST['name'])) { + dba::update('profile', ['name' => $_POST['name']], ['uid' => $local_user]); + dba::update('user', ['username' => $_POST['name']], ['uid' => $local_user]); + dba::update('contact', ['name' => $_POST['name']], ['uid' => $local_user, 'self' => 1]); + dba::update('contact', ['name' => $_POST['name']], ['id' => $api_user['id']]); + } + + if (x($_POST['description'])) { + dba::update('profile', ['about' => $_POST['description']], ['uid' => $local_user]); + dba::update('contact', ['about' => $_POST['description']], ['uid' => $local_user, 'self' => 1]); + dba::update('contact', ['about' => $_POST['description']], ['id' => $api_user['id']]); + } + + Worker::add(PRIORITY_LOW, 'ProfileUpdate', api_user()); + + return api_account_verify_credentials($type); +} + +/// @TODO move to top of file or somewhere better +api_register_func('api/account/update_profile', 'api_account_update_profile', true, API_METHOD_POST); + /** * * @param string $acl_string From ee5301018aad22a522304b07d8fa096c0c4d0ef3 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Mon, 25 Dec 2017 21:12:08 +0100 Subject: [PATCH 26/80] Fix typo --- include/api.php | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/include/api.php b/include/api.php index 0b401f6dff..edc9376e89 100644 --- a/include/api.php +++ b/include/api.php @@ -1029,7 +1029,7 @@ function api_account_verify_credentials($type) return api_format_data("user", $type, array('user' => $user_info)); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/account/verify_credentials', 'api_account_verify_credentials', true); /** @@ -1277,7 +1277,7 @@ function api_statuses_update($type) return api_status_show($type); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/statuses/update', 'api_statuses_update', true, API_METHOD_POST); api_register_func('api/statuses/update_with_media', 'api_statuses_update', true, API_METHOD_POST); @@ -1324,7 +1324,7 @@ function api_media_upload($type) return array("media" => $returndata); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/media/upload', 'api_media_upload', true, API_METHOD_POST); /** @@ -2415,7 +2415,7 @@ function api_statuses_user_timeline($type) return api_format_data("statuses", $type, $data); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/statuses/user_timeline', 'api_statuses_user_timeline', true); /** @@ -2492,7 +2492,7 @@ function api_favorites_create_destroy($type) return api_format_data("status", $type, $data); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/favorites/create', 'api_favorites_create_destroy', true, API_METHOD_POST); api_register_func('api/favorites/destroy', 'api_favorites_create_destroy', true, API_METHOD_DELETE); @@ -2574,7 +2574,7 @@ function api_favorites($type) return api_format_data("statuses", $type, $data); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/favorites', 'api_favorites', true); /** @@ -3237,7 +3237,7 @@ function api_account_rate_limit_status($type) return api_format_data('hash', $type, array('hash' => $hash)); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/account/rate_limit_status', 'api_account_rate_limit_status', true); /** @@ -3258,7 +3258,7 @@ function api_help_test($type) return api_format_data('ok', $type, array("ok" => $ok)); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/help/test', 'api_help_test', false); /** @@ -3274,7 +3274,7 @@ function api_lists($type) return api_format_data('lists', $type, array("lists_list" => $ret)); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/lists', 'api_lists', true); /** @@ -3292,7 +3292,7 @@ function api_lists_list($type) return api_format_data('lists', $type, array("lists_list" => $ret)); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/lists/list', 'api_lists_list', true); /** @@ -5586,7 +5586,7 @@ function api_friendica_activity($type) } } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/friendica/activity/like', 'api_friendica_activity', true, API_METHOD_POST); api_register_func('api/friendica/activity/dislike', 'api_friendica_activity', true, API_METHOD_POST); api_register_func('api/friendica/activity/attendyes', 'api_friendica_activity', true, API_METHOD_POST); @@ -5677,7 +5677,7 @@ function api_friendica_notification_seen($type) return api_format_data('result', $type, array('result' => "success")); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/friendica/notification/seen', 'api_friendica_notification_seen', true, API_METHOD_POST); api_register_func('api/friendica/notification', 'api_friendica_notification', true, API_METHOD_GET); @@ -5735,7 +5735,7 @@ function api_friendica_direct_messages_setseen($type) } } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/friendica/direct_messages_setseen', 'api_friendica_direct_messages_setseen', true); /** @@ -5798,7 +5798,7 @@ function api_friendica_direct_messages_search($type) return api_format_data("direct_message_search", $type, array('$result' => $success)); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/friendica/direct_messages_search', 'api_friendica_direct_messages_search', true); /** @@ -5906,7 +5906,7 @@ function api_saved_searches_list($type) return api_format_data("terms", $type, array('terms' => $result)); } -/// @TODO move to top of file or somwhere better +/// @TODO move to top of file or somewhere better api_register_func('api/saved_searches/list', 'api_saved_searches_list', true); /* From 8c17b9674959159b2b756e2a90fb04e162b40e2a Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Mon, 25 Dec 2017 21:14:02 +0100 Subject: [PATCH 27/80] Missing return types in docblocks --- include/api.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/api.php b/include/api.php index edc9376e89..a7941a979e 100644 --- a/include/api.php +++ b/include/api.php @@ -2708,7 +2708,7 @@ function api_convert_item($item) * * @param string $body * - * @return array + * @return array|false */ function api_get_attachments(&$body) { @@ -4329,7 +4329,7 @@ function api_fr_photo_delete($type) * @brief returns the details of a specified photo id, if scale is given, returns the photo data in base 64 * * @param string $type Known types are 'atom', 'rss', 'xml' and 'json' - * @return string + * @return string|array */ function api_fr_photo_detail($type) { From 869af9f323ac8254a8c75b14cd772a5a48c455dd Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 25 Dec 2017 23:03:14 +0000 Subject: [PATCH 28/80] Some more logging for auth_ejabberd --- src/Util/ExAuth.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Util/ExAuth.php b/src/Util/ExAuth.php index 054b87aad4..555ab861bd 100644 --- a/src/Util/ExAuth.php +++ b/src/Util/ExAuth.php @@ -310,6 +310,7 @@ class ExAuth $lockpath = Config::get('jabber', 'lockpath'); if (is_null($lockpath)) { + $this->writeLog(LOG_INFO, 'No lockpath defined.'); return; } @@ -325,6 +326,9 @@ class ExAuth // Now it is safe to create the pid file PidFile::create($file); + if (!file_exists($file)) { + $this->writeLog(LOG_WARNING, 'Logfile ' . $file . " couldn't be created."); + } } /** From 94244024aca2840913ba43992350505a3115c232 Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Tue, 26 Dec 2017 01:05:00 +0100 Subject: [PATCH 29/80] Improve conditions in api_account_update_profile --- include/api.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/api.php b/include/api.php index 46b7cd3dea..59317fcd31 100644 --- a/include/api.php +++ b/include/api.php @@ -4481,17 +4481,17 @@ api_register_func('api/account/update_profile_image', 'api_account_update_profil */ function api_account_update_profile($type) { - $local_user = local_user(); + $local_user = api_user(); $api_user = api_get_user(get_app()); - if (x($_POST['name'])) { + if (!empty($_POST['name'])) { dba::update('profile', ['name' => $_POST['name']], ['uid' => $local_user]); dba::update('user', ['username' => $_POST['name']], ['uid' => $local_user]); dba::update('contact', ['name' => $_POST['name']], ['uid' => $local_user, 'self' => 1]); dba::update('contact', ['name' => $_POST['name']], ['id' => $api_user['id']]); } - if (x($_POST['description'])) { + if (isset($_POST['description'])) { dba::update('profile', ['about' => $_POST['description']], ['uid' => $local_user]); dba::update('contact', ['about' => $_POST['description']], ['uid' => $local_user, 'self' => 1]); dba::update('contact', ['about' => $_POST['description']], ['id' => $api_user['id']]); From c490a718acbbb8eb34d1c7f8e49806148a33380e Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Tue, 26 Dec 2017 01:08:51 +0100 Subject: [PATCH 30/80] Update profile in directory when calling api_account_update_profile --- include/api.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/include/api.php b/include/api.php index 59317fcd31..e2d35d59df 100644 --- a/include/api.php +++ b/include/api.php @@ -4498,6 +4498,11 @@ function api_account_update_profile($type) } Worker::add(PRIORITY_LOW, 'ProfileUpdate', api_user()); + // Update global directory in background + $url = $_SESSION['my_url']; + if ($url && strlen(Config::get('system', 'directory'))) { + Worker::add(PRIORITY_LOW, "Directory", $url); + } return api_account_verify_credentials($type); } From 8b10bfe3a815676e269570405035e93ff7c230bf Mon Sep 17 00:00:00 2001 From: Pierre Rudloff Date: Tue, 26 Dec 2017 21:49:43 +0100 Subject: [PATCH 31/80] Cleaner way to get user URL in api_account_update_profile --- include/api.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/include/api.php b/include/api.php index e2d35d59df..f52b664aa1 100644 --- a/include/api.php +++ b/include/api.php @@ -4497,11 +4497,10 @@ function api_account_update_profile($type) dba::update('contact', ['about' => $_POST['description']], ['id' => $api_user['id']]); } - Worker::add(PRIORITY_LOW, 'ProfileUpdate', api_user()); + Worker::add(PRIORITY_LOW, 'ProfileUpdate', $local_user); // Update global directory in background - $url = $_SESSION['my_url']; - if ($url && strlen(Config::get('system', 'directory'))) { - Worker::add(PRIORITY_LOW, "Directory", $url); + if ($api_user['url'] && strlen(Config::get('system', 'directory'))) { + Worker::add(PRIORITY_LOW, "Directory", $api_user['url']); } return api_account_verify_credentials($type); From d0a43b8533a5066385f5caa0c58979be3977530e Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 27 Dec 2017 15:26:17 +0000 Subject: [PATCH 32/80] Missing include --- mod/contacts.php | 1 + mod/fsuggest.php | 2 ++ 2 files changed, 3 insertions(+) diff --git a/mod/contacts.php b/mod/contacts.php index fd1d6776cc..3421babf61 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -13,6 +13,7 @@ use Friendica\Network\Probe; require_once 'include/contact_selectors.php'; require_once 'mod/proxy.php'; +require_once 'include/follow.php'; function contacts_init(App $a) { if (! local_user()) { diff --git a/mod/fsuggest.php b/mod/fsuggest.php index dd698db58e..59ea6c88b0 100644 --- a/mod/fsuggest.php +++ b/mod/fsuggest.php @@ -4,6 +4,8 @@ use Friendica\App; use Friendica\Core\Worker; use Friendica\Database\DBM; +require_once 'include/follow.php'; + function fsuggest_post(App $a) { if (! local_user()) { From 1c72a71933901979b02818198ae8970aa4d7a3d3 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 27 Dec 2017 21:44:22 +0000 Subject: [PATCH 33/80] Use another uid for likes --- include/like.php | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/include/like.php b/include/like.php index 05bb758c2a..32a2cabcfd 100644 --- a/include/like.php +++ b/include/like.php @@ -79,26 +79,28 @@ function do_like($item_id, $verb) { } $item = $items[0]; + $uid = $item['uid']; - if (!can_write_wall($a, $item['uid']) && ($item['uid'] != 0)) { - logger('like: unable to write on wall ' . $item['uid']); + if (!can_write_wall($a, $uid) && (($uid != 0) || !local_user())) { + logger('like: unable to write on wall ' . $uid); return false; } // Retrieves the local post owner - if ($item['uid'] != 0) { + if ($uid != 0) { $owners = q("SELECT `contact`.* FROM `contact` WHERE `contact`.`self` AND `contact`.`uid` = %d", - intval($item['uid']) + intval($uid) ); if (DBM::is_result($owners)) { $owner_self_contact = $owners[0]; } else { - logger('like: unknown owner ' . $item['uid']); + logger('like: unknown owner ' . $uid); return false; } } else { + $uid = local_user(); $owner_self_contact = ['uid' => 0, 'nick' => 'feed-item']; } @@ -116,11 +118,11 @@ function do_like($item_id, $verb) { } // Contact-id is the uid-dependant author contact - if (local_user() == $item['uid']) { + if (local_user() == $uid) { $item_contact_id = $owner_self_contact['id']; $item_contact = $owner_self_contact; } else { - $item_contact_id = Contact::getIdForURL($author_contact['url'], $item['uid']); + $item_contact_id = Contact::getIdForURL($author_contact['url'], $uid); $contacts = q("SELECT * FROM `contact` WHERE `id` = %d", intval($item_contact_id) @@ -150,7 +152,7 @@ function do_like($item_id, $verb) { AND (`parent` = '%s' OR `parent-uri` = '%s' OR `thr-parent` = '%s') LIMIT 1", intval($author_contact['id']), - intval($item['uid']), + intval($uid), dbesc($item_id), dbesc($item_id), dbesc($item['uri']) ); @@ -209,8 +211,8 @@ EOT; $new_item = array( 'guid' => get_guid(32), - 'uri' => item_new_uri($a->get_hostname(), $item['uid']), - 'uid' => $item['uid'], + 'uri' => item_new_uri($a->get_hostname(), $uid), + 'uid' => $uid, 'contact-id' => $item_contact_id, 'type' => 'activity', 'wall' => $item['wall'], @@ -244,9 +246,8 @@ EOT; // @todo: Explain this block if (! $item['visible']) { - q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d AND `uid` = %d", - intval($item['id']), - intval($item['uid']) + q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d", + intval($item['id']) ); } From 9acc2ffc24b3df0465a6970502c63d690aa16a4f Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 27 Dec 2017 21:51:16 +0000 Subject: [PATCH 34/80] Make it easier --- include/like.php | 29 ++++++++++++++--------------- src/Worker/Notifier.php | 9 ++++++++- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/include/like.php b/include/like.php index 32a2cabcfd..31698658a2 100644 --- a/include/like.php +++ b/include/like.php @@ -81,27 +81,26 @@ function do_like($item_id, $verb) { $item = $items[0]; $uid = $item['uid']; - if (!can_write_wall($a, $uid) && (($uid != 0) || !local_user())) { + if (($uid == 0) && local_user()) { + $uid = local_user(); + } + + if (!can_write_wall($a, $uid)) { logger('like: unable to write on wall ' . $uid); return false; } // Retrieves the local post owner - if ($uid != 0) { - $owners = q("SELECT `contact`.* FROM `contact` - WHERE `contact`.`self` - AND `contact`.`uid` = %d", - intval($uid) - ); - if (DBM::is_result($owners)) { - $owner_self_contact = $owners[0]; - } else { - logger('like: unknown owner ' . $uid); - return false; - } + $owners = q("SELECT `contact`.* FROM `contact` + WHERE `contact`.`self` + AND `contact`.`uid` = %d", + intval($uid) + ); + if (DBM::is_result($owners)) { + $owner_self_contact = $owners[0]; } else { - $uid = local_user(); - $owner_self_contact = ['uid' => 0, 'nick' => 'feed-item']; + logger('like: unknown owner ' . $uid); + return false; } // Retrieve the current logged in user's public contact diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index e8dc25c5ee..78daae2752 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -154,10 +154,12 @@ class Notifier { FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d AND visible AND NOT moderated ORDER BY `id` ASC", intval($parent_id) ); +logger('Blubb: a-'.$item_id); if (!count($items)) { return; } +logger('Blubb: b-'.$item_id); // avoid race condition with deleting entries if ($items[0]['deleted']) { @@ -171,11 +173,13 @@ class Notifier { $top_level = true; } } +logger('Blubb: 0-'.$item_id.' - '.$uid); $owner = User::getOwnerDataById($uid); if (!$owner) { return; } +logger('Blubb: 1-'.$item_id); $walltowall = ($top_level && ($owner['id'] != $items[0]['contact-id']) ? true : false); @@ -193,12 +197,14 @@ class Notifier { // fill this in with a single salmon slap if applicable $slap = ''; +logger('Blubb: 2-'.$item_id); if (! ($mail || $fsuggest || $relocate)) { $slap = OStatus::salmon($target_item, $owner); $parent = $items[0]; +logger('Blubb: 3-'.$item_id); $thr_parent = q("SELECT `network`, `author-link`, `owner-link` FROM `item` WHERE `uri` = '%s' AND `uid` = %d", dbesc($target_item["thr-parent"]), intval($target_item["uid"])); @@ -280,7 +286,6 @@ class Notifier { } } if ($relay_to_owner) { - logger('notifier: followup '.$target_item["guid"], LOGGER_DEBUG); // local followup to remote post $followup = true; $public_message = false; // not public @@ -288,6 +293,8 @@ class Notifier { $recipients = array($parent['contact-id']); $recipients_followup = array($parent['contact-id']); + logger('notifier: followup '.$target_item["guid"].' to '.$conversant_str, LOGGER_DEBUG); + //if (!$target_item['private'] && $target_item['wall'] && if (!$target_item['private'] && (strlen($target_item['allow_cid'].$target_item['allow_gid']. From 0bcbe6034ecca48c26196ff68bc08950efbb46af Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 27 Dec 2017 22:21:40 +0000 Subject: [PATCH 35/80] Like on uid=0 does work now --- include/like.php | 6 +++--- src/Worker/Notifier.php | 6 ------ 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/include/like.php b/include/like.php index 31698658a2..8b8759c2f6 100644 --- a/include/like.php +++ b/include/like.php @@ -151,7 +151,7 @@ function do_like($item_id, $verb) { AND (`parent` = '%s' OR `parent-uri` = '%s' OR `thr-parent` = '%s') LIMIT 1", intval($author_contact['id']), - intval($uid), + intval($item['uid']), dbesc($item_id), dbesc($item_id), dbesc($item['uri']) ); @@ -210,8 +210,8 @@ EOT; $new_item = array( 'guid' => get_guid(32), - 'uri' => item_new_uri($a->get_hostname(), $uid), - 'uid' => $uid, + 'uri' => item_new_uri($a->get_hostname(), $item['uid']), + 'uid' => $item['uid'], 'contact-id' => $item_contact_id, 'type' => 'activity', 'wall' => $item['wall'], diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index 78daae2752..5c86a95efe 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -154,12 +154,10 @@ class Notifier { FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d AND visible AND NOT moderated ORDER BY `id` ASC", intval($parent_id) ); -logger('Blubb: a-'.$item_id); if (!count($items)) { return; } -logger('Blubb: b-'.$item_id); // avoid race condition with deleting entries if ($items[0]['deleted']) { @@ -173,13 +171,11 @@ logger('Blubb: b-'.$item_id); $top_level = true; } } -logger('Blubb: 0-'.$item_id.' - '.$uid); $owner = User::getOwnerDataById($uid); if (!$owner) { return; } -logger('Blubb: 1-'.$item_id); $walltowall = ($top_level && ($owner['id'] != $items[0]['contact-id']) ? true : false); @@ -197,14 +193,12 @@ logger('Blubb: 1-'.$item_id); // fill this in with a single salmon slap if applicable $slap = ''; -logger('Blubb: 2-'.$item_id); if (! ($mail || $fsuggest || $relocate)) { $slap = OStatus::salmon($target_item, $owner); $parent = $items[0]; -logger('Blubb: 3-'.$item_id); $thr_parent = q("SELECT `network`, `author-link`, `owner-link` FROM `item` WHERE `uri` = '%s' AND `uid` = %d", dbesc($target_item["thr-parent"]), intval($target_item["uid"])); From c7bcc13451c5a0ec12a3faabe4cc0cdc7e7715cd Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 28 Dec 2017 20:37:23 +0000 Subject: [PATCH 36/80] Reformatted file, improved coding for "twist" --- mod/photos.php | 130 +++++++++++++++++++++++-------------------------- 1 file changed, 62 insertions(+), 68 deletions(-) diff --git a/mod/photos.php b/mod/photos.php index 412f2aafff..886ccd4fdf 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -28,7 +28,7 @@ function photos_init(App $a) { auto_redir($a, $a->argv[1]); } - if ((Config::get('system', 'block_public')) && (! local_user()) && (! remote_user())) { + if (Config::get('system', 'block_public') && !local_user() && !remote_user()) { return; } @@ -40,7 +40,7 @@ function photos_init(App $a) { dbesc($nick) ); - if (! DBM::is_result($user)) { + if (!DBM::is_result($user)) { return; } @@ -64,7 +64,7 @@ function photos_init(App $a) { $albums = photo_albums($a->data['user']['uid']); - $albums_visible = ((intval($a->data['user']['hidewall']) && (! local_user()) && (! remote_user())) ? false : true); + $albums_visible = ((intval($a->data['user']['hidewall']) && !local_user() && !remote_user()) ? false : true); // add various encodings to the array so we can just loop through and pick them out in a template $ret = array('success' => false); @@ -78,7 +78,7 @@ function photos_init(App $a) { $ret['albums'] = array(); foreach ($albums as $k => $album) { //hide profile photos to others - if ((! $is_owner) && (! remote_user()) && ($album['album'] == t('Profile Photos'))) + if (!$is_owner && !remote_user() && ($album['album'] == t('Profile Photos'))) continue; $entry = array( 'text' => $album['album'], @@ -110,7 +110,7 @@ function photos_init(App $a) { } - if (! x($a->page, 'aside')) { + if (!x($a->page, 'aside')) { $a->page['aside'] = ''; } $a->page['aside'] .= $vcard_widget; @@ -145,7 +145,7 @@ function photos_post(App $a) { $page_owner_uid = $a->data['user']['uid']; $community_page = (($a->data['user']['page-flags'] == PAGE_COMMUNITY) ? true : false); - if ((local_user()) && (local_user() == $page_owner_uid)) { + if (local_user() && (local_user() == $page_owner_uid)) { $can_post = true; } else { if ($community_page && remote_user()) { @@ -172,7 +172,7 @@ function photos_post(App $a) { } } - if (! $can_post) { + if (!$can_post) { notice( t('Permission denied.') . EOL ); killme(); } @@ -182,7 +182,7 @@ function photos_post(App $a) { intval($page_owner_uid) ); - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { notice( t('Contact information unavailable') . EOL); logger('photos_post: unable to locate contact record for page owner. uid=' . $page_owner_uid); killme(); @@ -399,11 +399,11 @@ function photos_post(App $a) { if (($a->argc > 2) && ((x($_POST,'desc') !== false) || (x($_POST,'newtag') !== false)) || (x($_POST,'albname') !== false)) { - $desc = ((x($_POST,'desc')) ? notags(trim($_POST['desc'])) : ''); - $rawtags = ((x($_POST,'newtag')) ? notags(trim($_POST['newtag'])) : ''); - $item_id = ((x($_POST,'item_id')) ? intval($_POST['item_id']) : 0); - $albname = ((x($_POST,'albname')) ? notags(trim($_POST['albname'])) : ''); - $origaname = ((x($_POST,'origaname')) ? notags(trim($_POST['origaname'])) : ''); + $desc = (x($_POST,'desc') ? notags(trim($_POST['desc'])) : ''); + $rawtags = (x($_POST,'newtag') ? notags(trim($_POST['newtag'])) : ''); + $item_id = (x($_POST,'item_id') ? intval($_POST['item_id']) : 0); + $albname = (x($_POST,'albname') ? notags(trim($_POST['albname'])) : ''); + $origaname = (x($_POST,'origaname') ? notags(trim($_POST['origaname'])) : ''); $str_group_allow = perms2str($_POST['group_allow']); $str_contact_allow = perms2str($_POST['contact_allow']); $str_group_deny = perms2str($_POST['group_deny']); @@ -411,7 +411,7 @@ function photos_post(App $a) { $resource_id = $a->argv[2]; - if (! strlen($albname)) { + if (!strlen($albname)) { $albname = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y'); } @@ -502,7 +502,7 @@ function photos_post(App $a) { $visibility = 1; } - if (! $item_id) { + if (!$item_id) { // Create item container @@ -614,7 +614,7 @@ function photos_post(App $a) { intval($page_owner_uid) ); - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { //select someone by attag or nick and the name passed in $r = q("SELECT * FROM `contact` WHERE `attag` = '%s' OR `nick` = '%s' AND `uid` = %d ORDER BY `attag` DESC LIMIT 1", dbesc($name), @@ -761,7 +761,7 @@ function photos_post(App $a) { logger('mod/photos.php: photos_post(): album= ' . $album . ' newalbum= ' . $newalbum , LOGGER_DEBUG); - if (! strlen($album)) { + if (!strlen($album)) { if (strlen($newalbum)) { $album = $newalbum; } else { @@ -781,7 +781,7 @@ function photos_post(App $a) { dbesc($album), intval($page_owner_uid) ); - if ((! DBM::is_result($r)) || ($album == t('Profile Photos'))) { + if (!DBM::is_result($r) || ($album == t('Profile Photos'))) { $visible = 1; } else { $visible = 0; @@ -791,10 +791,10 @@ function photos_post(App $a) { $visible = 0; } - $str_group_allow = perms2str(((is_array($_REQUEST['group_allow'])) ? $_REQUEST['group_allow'] : explode(',', $_REQUEST['group_allow']))); - $str_contact_allow = perms2str(((is_array($_REQUEST['contact_allow'])) ? $_REQUEST['contact_allow'] : explode(',', $_REQUEST['contact_allow']))); - $str_group_deny = perms2str(((is_array($_REQUEST['group_deny'])) ? $_REQUEST['group_deny'] : explode(',', $_REQUEST['group_deny']))); - $str_contact_deny = perms2str(((is_array($_REQUEST['contact_deny'])) ? $_REQUEST['contact_deny'] : explode(',', $_REQUEST['contact_deny']))); + $str_group_allow = perms2str((is_array($_REQUEST['group_allow']) ? $_REQUEST['group_allow'] : explode(',', $_REQUEST['group_allow']))); + $str_contact_allow = perms2str((is_array($_REQUEST['contact_allow']) ? $_REQUEST['contact_allow'] : explode(',', $_REQUEST['contact_allow']))); + $str_group_deny = perms2str((is_array($_REQUEST['group_deny']) ? $_REQUEST['group_deny'] : explode(',', $_REQUEST['group_deny']))); + $str_contact_deny = perms2str((is_array($_REQUEST['contact_deny']) ? $_REQUEST['contact_deny'] : explode(',', $_REQUEST['contact_deny']))); $ret = array('src' => '', 'filename' => '', 'filesize' => 0, 'type' => ''); @@ -819,7 +819,7 @@ function photos_post(App $a) { $maximagesize = Config::get('system','maximagesize'); - if (($maximagesize) && ($filesize > $maximagesize)) { + if ($maximagesize && ($filesize > $maximagesize)) { notice( sprintf(t('Image exceeds size limit of %s'), formatBytes($maximagesize)) . EOL); @unlink($src); $foo = 0; @@ -827,7 +827,7 @@ function photos_post(App $a) { return; } - if (! $filesize) { + if (!$filesize) { notice( t('Image file is empty.') . EOL); @unlink($src); $foo = 0; @@ -841,7 +841,7 @@ function photos_post(App $a) { $Image = new Image($imagedata, $type); - if (! $Image->isValid()) { + if (!$Image->isValid()) { logger('mod/photos.php: photos_post(): unable to process image' , LOGGER_DEBUG); notice( t('Unable to process image.') . EOL ); @unlink($src); @@ -854,7 +854,7 @@ function photos_post(App $a) { @unlink($src); $max_length = Config::get('system', 'max_image_length'); - if (! $max_length) { + if (!$max_length) { $max_length = MAX_IMAGE_LENGTH; } if ($max_length > 0) { @@ -870,7 +870,7 @@ function photos_post(App $a) { $r = Photo::store($Image, $page_owner_uid, $visitor, $photo_hash, $filename, $album, 0 , 0, $str_contact_allow, $str_group_allow, $str_contact_deny, $str_group_deny); - if (! $r) { + if (!$r) { logger('mod/photos.php: photos_post(): image store failed' , LOGGER_DEBUG); notice( t('Image upload failed.') . EOL ); killme(); @@ -967,7 +967,7 @@ function photos_content(App $a) { // photos/name/image/xxxxx/edit - if ((Config::get('system', 'block_public')) && (! local_user()) && (! remote_user())) { + if (Config::get('system', 'block_public') && !local_user() && !remote_user()) { notice( t('Public access denied.') . EOL); return; } @@ -976,7 +976,7 @@ function photos_content(App $a) { require_once 'include/security.php'; require_once 'include/conversation.php'; - if (! x($a->data,'user')) { + if (!x($a->data,'user')) { notice( t('No photos selected') . EOL ); return; } @@ -1018,7 +1018,7 @@ function photos_content(App $a) { $community_page = (($a->data['user']['page-flags'] == PAGE_COMMUNITY) ? true : false); - if ((local_user()) && (local_user() == $owner_uid)) { + if (local_user() && (local_user() == $owner_uid)) { $can_post = true; } else { if ($community_page && remote_user()) { @@ -1048,7 +1048,7 @@ function photos_content(App $a) { // perhaps they're visiting - but not a community page, so they wouldn't have write access - if (remote_user() && (! $visitor)) { + if (remote_user() && !$visitor) { $contact_id = 0; if (is_array($_SESSION['remote'])) { foreach ($_SESSION['remote'] as $v) { @@ -1072,14 +1072,14 @@ function photos_content(App $a) { } /// @TODO merge these 2 if() into one? - if (! $remote_contact) { + if (!$remote_contact) { if (local_user()) { $contact_id = $_SESSION['cid']; $contact = $a->contact; } } - if ($a->data['user']['hidewall'] && (local_user() != $owner_uid) && (! $remote_contact)) { + if ($a->data['user']['hidewall'] && (local_user() != $owner_uid) && !$remote_contact) { notice( t('Access to this item is restricted.') . EOL); return; } @@ -1097,19 +1097,19 @@ function photos_content(App $a) { */ if ($datatype === 'upload') { - if (! ($can_post)) { + if (!$can_post) { notice(t('Permission denied.')); return; } - $selname = (($datum) ? hex2bin($datum) : ''); + $selname = ($datum ? hex2bin($datum) : ''); $albumselect = ''; - $albumselect .= ''; + $albumselect .= ''; if (count($a->data['albums'])) { foreach ($a->data['albums'] as $album) { if (($album['album'] === '') || ($album['album'] === 'Contact Photos') || ($album['album'] === t('Contact Photos'))) { @@ -1160,7 +1160,7 @@ function photos_content(App $a) { $tpl = get_markup_template('photos_upload.tpl'); $albumselect_e = $albumselect; - $aclselect_e = (($visitor) ? '' : populate_acl($a->user)); + $aclselect_e = ($visitor ? '' : populate_acl($a->user)); $o .= replace_macros($tpl,array( '$pagename' => t('Upload Photos'), @@ -1174,8 +1174,8 @@ function photos_content(App $a) { '$permissions' => t('Permissions'), '$aclselect' => $aclselect_e, '$alt_uploader' => $ret['addon_text'], - '$default_upload_box' => (($ret['default_upload']) ? $default_upload_box : ''), - '$default_upload_submit' => (($ret['default_upload']) ? $default_upload_submit : ''), + '$default_upload_box' => ($ret['default_upload'] ? $default_upload_box : ''), + '$default_upload_submit' => ($ret['default_upload'] ? $default_upload_submit : ''), '$uploadurl' => $ret['post_url'], // ACL permissions box @@ -1262,13 +1262,9 @@ function photos_content(App $a) { $photos = array(); if (DBM::is_result($r)) - $twist = 'rotright'; + $twist = false; foreach ($r as $rr) { - if ($twist == 'rotright') { - $twist = 'rotleft'; - } else { - $twist = 'rotright'; - } + $twist = !$twist; $ext = $phototypes[$rr['type']]; @@ -1277,7 +1273,7 @@ function photos_content(App $a) { $photos[] = array( 'id' => $rr['id'], - 'twist' => ' ' . $twist . rand(2,4), + 'twist' => ' ' . ($twist ? 'rotleft' : 'rotright') . rand(2,4), 'link' => 'photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'] . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''), 'title' => t('View Photo'), @@ -1318,7 +1314,7 @@ function photos_content(App $a) { dbesc($datum) ); - if (! DBM::is_result($ph)) { + if (!DBM::is_result($ph)) { $ph = q("SELECT `id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' LIMIT 1", intval($owner_uid), @@ -1339,10 +1335,11 @@ function photos_content(App $a) { // The query leads to a really intense used index. // By now we hide it if someone wants to. if (!Config::get('system', 'no_count', false)) { - if ($_GET['order'] === 'posted') + if ($_GET['order'] === 'posted') { $order = 'ASC'; - else + } else { $order = 'DESC'; + } $prvnxt = q("SELECT `resource-id` FROM `photo` WHERE `album` = '%s' AND `uid` = %d AND `scale` = 0 $sql_extra ORDER BY `created` $order ", @@ -1364,7 +1361,7 @@ function photos_content(App $a) { break; } } - $edit_suffix = ((($cmd === 'edit') && ($can_post)) ? '/edit' : ''); + $edit_suffix = ((($cmd === 'edit') && $can_post) ? '/edit' : ''); $prevlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . $edit_suffix . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''); $nextlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . $edit_suffix . (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''); } @@ -1479,7 +1476,7 @@ function photos_content(App $a) { ); - if ((local_user()) && (local_user() == $link_item['uid'])) { + if (local_user() && (local_user() == $link_item['uid'])) { q("UPDATE `item` SET `unseen` = 0 WHERE `parent` = %d and `uid` = %d", intval($link_item['parent']), intval(local_user()) @@ -1513,7 +1510,7 @@ function photos_content(App $a) { $edit = Null; - if (($cmd === 'edit') && ($can_post)) { + if (($cmd === 'edit') && $can_post) { $edit_tpl = get_markup_template('photo_edit.tpl'); // Private/public post links for the non-JS ACL form @@ -1556,7 +1553,7 @@ function photos_content(App $a) { '$permissions' => t('Permissions'), '$aclselect' => $aclselect_e, - '$item_id' => ((count($linked_items)) ? $link_item['id'] : 0), + '$item_id' => (count($linked_items) ? $link_item['id'] : 0), '$submit' => t('Submit'), '$delete' => t('Delete Photo'), @@ -1593,7 +1590,7 @@ function photos_content(App $a) { } $comments = ''; - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { if (($can_post || can_write_wall($a, $owner_uid)) && $link_item['last-child']) { $comments .= replace_macros($cmnt_tpl, array( '$return_path' => '', @@ -1633,8 +1630,8 @@ function photos_content(App $a) { builtin_activity_puller($item, $conv_responses); } - $like = ((x($conv_responses['like'], $link_item['uri'])) ? format_like($conv_responses['like'][$link_item['uri']], $conv_responses['like'][$link_item['uri'] . '-l'], 'like',$link_item['id']) : ''); - $dislike = ((x($conv_responses['dislike'], $link_item['uri'])) ? format_like($conv_responses['dislike'][$link_item['uri']], $conv_responses['dislike'][$link_item['uri'] . '-l'], 'dislike',$link_item['id']) : ''); + $like = (x($conv_responses['like'], $link_item['uri']) ? format_like($conv_responses['like'][$link_item['uri']], $conv_responses['like'][$link_item['uri'] . '-l'], 'like',$link_item['id']) : ''); + $dislike = (x($conv_responses['dislike'], $link_item['uri']) ? format_like($conv_responses['dislike'][$link_item['uri']], $conv_responses['dislike'][$link_item['uri'] . '-l'], 'dislike',$link_item['id']) : ''); if (($can_post || can_write_wall($a, $owner_uid)) && $link_item['last-child']) { $comments .= replace_macros($cmnt_tpl,array( @@ -1662,14 +1659,14 @@ function photos_content(App $a) { $template = $tpl; $sparkle = ''; - if (((activity_match($item['verb'],ACTIVITY_LIKE)) || (activity_match($item['verb'],ACTIVITY_DISLIKE))) && ($item['id'] != $item['parent'])) + if ((activity_match($item['verb'], ACTIVITY_LIKE) || activity_match($item['verb'], ACTIVITY_DISLIKE)) && ($item['id'] != $item['parent'])) continue; $redirect_url = 'redir/' . $item['cid']; if (local_user() && ($item['contact-uid'] == local_user()) - && ($item['network'] == NETWORK_DFRN) && (! $item['self'] )) { + && ($item['network'] == NETWORK_DFRN) && !$item['self']) { $profile_url = $redirect_url; $sparkle = ' sparkle'; } else { @@ -1679,8 +1676,8 @@ function photos_content(App $a) { $diff_author = (($item['url'] !== $item['author-link']) ? true : false); - $profile_name = (((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']); - $profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $item['thumb']); + $profile_name = ((strlen($item['author-name']) && $diff_author) ? $item['author-name'] : $item['name']); + $profile_avatar = ((strlen($item['author-avatar']) && $diff_author) ? $item['author-avatar'] : $item['thumb']); $profile_link = $profile_url; @@ -1807,16 +1804,13 @@ function photos_content(App $a) { $photos = array(); if (DBM::is_result($r)) { - $twist = 'rotright'; + $twist = false; foreach ($r as $rr) { //hide profile photos to others - if ((! $is_owner) && (! remote_user()) && ($rr['album'] == t('Profile Photos'))) - continue; + if (!$is_owner && !remote_user() && ($rr['album'] == t('Profile Photos'))) + continue; - if ($twist == 'rotright') - $twist = 'rotleft'; - else - $twist = 'rotright'; + $twist = !$twist; $ext = $phototypes[$rr['type']]; @@ -1825,7 +1819,7 @@ function photos_content(App $a) { $photos[] = array( 'id' => $rr['id'], - 'twist' => ' ' . $twist . rand(2,4), + 'twist' => ' ' . ($twist ? 'rotleft' : 'rotright') . rand(2,4), 'link' => 'photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id'], 'title' => t('View Photo'), 'src' => 'photo/' . $rr['resource-id'] . '-' . ((($rr['scale']) == 6) ? 4 : $rr['scale']) . '.' . $ext, From 319e21f6e3da03de4a6a0e8986505dc857d53c86 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 29 Dec 2017 12:47:56 +0000 Subject: [PATCH 37/80] Added explanation --- mod/photos.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mod/photos.php b/mod/photos.php index 886ccd4fdf..4741815758 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -1262,6 +1262,7 @@ function photos_content(App $a) { $photos = array(); if (DBM::is_result($r)) + // "Twist" is only used for the duepunto theme with style "slackr" $twist = false; foreach ($r as $rr) { $twist = !$twist; @@ -1804,6 +1805,7 @@ function photos_content(App $a) { $photos = array(); if (DBM::is_result($r)) { + // "Twist" is only used for the duepunto theme with style "slackr" $twist = false; foreach ($r as $rr) { //hide profile photos to others From 80a41922a914bb7514a1dedd2e36b5fcd60a520f Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 29 Dec 2017 18:52:26 +0000 Subject: [PATCH 38/80] We now send participations when receiving public posts --- src/Protocol/Diaspora.php | 49 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index a0d99959bb..bf60272703 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -2688,6 +2688,8 @@ class Diaspora self::fetchGuid($datarray); $message_id = item_store($datarray); + self::sendParticipation($contact, $datarray); + if ($message_id) { logger("Stored reshare ".$datarray["guid"]." with message id ".$message_id, LOGGER_DEBUG); return true; @@ -2926,6 +2928,8 @@ class Diaspora self::fetchGuid($datarray); $message_id = item_store($datarray); + self::sendParticipation($contact, $datarray); + if ($message_id) { logger("Stored item ".$datarray["guid"]." with message id ".$message_id, LOGGER_DEBUG); return true; @@ -3215,6 +3219,51 @@ class Diaspora return $return_code; } + /** + * @brief sends a participation (Used to get all further updates) + * + * @param array $contact Target of the communication + * @param array $item Item array + * + * @return int The result of the transmission + */ + private static function sendParticipation($contact, $item) + { + // Don't send notifications for private postings + if ($item['private']) { + return; + } + + $cachekey = "diaspora:sendParticipation:".$item['guid']; + + $result = Cache::get($cachekey); + if (!is_null($result)) { + return; + } + + // Fetch some user id to have a valid handle to transmit the participation. + // In fact it doesn't matter which user sends this - but it is needed by the protocol. + $condition = ['verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false]; + $first_user = dba::select('user', ['uid'], $condition, ['limit' => 1]); + $owner = User::getOwnerDataById($first_user['uid']); + + $parent_type = (self::isReshare($item['body']) ? 'Reshare' : 'StatusMessage'); + + $author = self::myHandle($owner); + + $message = array("author" => $author, + "guid" => get_guid(32), + "parent_type" => $parent_type, + "parent_guid" => $item["guid"]); + + logger("Send participation for ".$parent_type." ".$item["guid"]." by ".$author, LOGGER_DEBUG); + + // It doesn't matter what we store, we only want to avoid sending repeated notifications for the same item + Cache::set($cachekey, $item["guid"], CACHE_QUARTER_HOUR); + + return self::buildAndTransmit($owner, $contact, "participation", $message); + } + /** * @brief sends an account migration * From d3b626a2669b197720afeb80214a949a7a5626f4 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 29 Dec 2017 19:18:25 +0000 Subject: [PATCH 39/80] We should send "Post" --- src/Protocol/Diaspora.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index bf60272703..aa80460cdb 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -3247,16 +3247,14 @@ class Diaspora $first_user = dba::select('user', ['uid'], $condition, ['limit' => 1]); $owner = User::getOwnerDataById($first_user['uid']); - $parent_type = (self::isReshare($item['body']) ? 'Reshare' : 'StatusMessage'); - $author = self::myHandle($owner); $message = array("author" => $author, "guid" => get_guid(32), - "parent_type" => $parent_type, + "parent_type" => "Post", "parent_guid" => $item["guid"]); - logger("Send participation for ".$parent_type." ".$item["guid"]." by ".$author, LOGGER_DEBUG); + logger("Send participation for ".$item["guid"]." by ".$author, LOGGER_DEBUG); // It doesn't matter what we store, we only want to avoid sending repeated notifications for the same item Cache::set($cachekey, $item["guid"], CACHE_QUARTER_HOUR); From 10bea2f1200185e24fccc3aa7ab3e7936475e911 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 29 Dec 2017 20:02:15 +0000 Subject: [PATCH 40/80] Use the "real" receiver when possible --- src/Protocol/Diaspora.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index aa80460cdb..15a30f532e 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -3243,9 +3243,14 @@ class Diaspora // Fetch some user id to have a valid handle to transmit the participation. // In fact it doesn't matter which user sends this - but it is needed by the protocol. - $condition = ['verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false]; - $first_user = dba::select('user', ['uid'], $condition, ['limit' => 1]); - $owner = User::getOwnerDataById($first_user['uid']); + // If the item belongs to a user, we take this user id. + if ($item['uid'] == 0) { + $condition = ['verified' => true, 'blocked' => false, 'account_removed' => false, 'account_expired' => false]; + $first_user = dba::select('user', ['uid'], $condition, ['limit' => 1]); + $owner = User::getOwnerDataById($first_user['uid']); + } else { + $owner = User::getOwnerDataById($item['uid']); + } $author = self::myHandle($owner); From 69d16d9cfa235b5ba9f726aeb7e88c62b0e235e1 Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 29 Dec 2017 22:53:08 +0000 Subject: [PATCH 41/80] Don't show the connect link in the profile on the "follow" page --- include/identity.php | 16 +++++++++++----- mod/follow.php | 21 +++++++++++---------- 2 files changed, 22 insertions(+), 15 deletions(-) diff --git a/include/identity.php b/include/identity.php index 8f515580f4..79bfe3830b 100644 --- a/include/identity.php +++ b/include/identity.php @@ -41,8 +41,9 @@ require_once 'mod/proxy.php'; * @param string $nickname string * @param int $profile int * @param array $profiledata array + * @param boolean $show_connect Show connect link */ -function profile_load(App $a, $nickname, $profile = 0, $profiledata = array()) +function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $show_connect = true) { $user = q( "SELECT `uid` FROM `user` WHERE `nickname` = '%s' LIMIT 1", @@ -115,7 +116,7 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array()) ); } - $block = (((Config::get('system', 'block_public')) && (! local_user()) && (! remote_user())) ? true : false); + $block = ((Config::get('system', 'block_public') && !local_user() && !remote_user()) ? true : false); /** * @todo @@ -123,9 +124,9 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array()) * But: When this profile was on the same server, then we could display the contacts */ if ($profiledata) { - $a->page['aside'] .= profile_sidebar($profiledata, true); + $a->page['aside'] .= profile_sidebar($profiledata, true, $show_connect); } else { - $a->page['aside'] .= profile_sidebar($a->profile, $block); + $a->page['aside'] .= profile_sidebar($a->profile, $block, $show_connect); } /*if (! $block) @@ -206,6 +207,7 @@ function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0) * * @param array $profile * @param int $block + * @param boolean $show_connect Show connect link * * @return HTML string stuitable for sidebar inclusion * @@ -216,7 +218,7 @@ function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0) * @hooks 'profile_sidebar' * array $arr */ -function profile_sidebar($profile, $block = 0) +function profile_sidebar($profile, $block = 0, $show_connect = true) { $a = get_app(); @@ -256,6 +258,10 @@ function profile_sidebar($profile, $block = 0) } } + if (!$show_connect) { + $connect = false; + } + // Is the local user already connected to that user? if ($connect && local_user()) { if (isset($profile["url"])) { diff --git a/mod/follow.php b/mod/follow.php index f0cffff4a1..41c008da51 100644 --- a/mod/follow.php +++ b/mod/follow.php @@ -11,8 +11,8 @@ require_once 'include/contact_selectors.php'; function follow_post(App $a) { - if (! local_user()) { - notice( t('Permission denied.') . EOL); + if (!local_user()) { + notice(t('Permission denied.') . EOL); goaway($_SESSION['return_url']); // NOTREACHED } @@ -40,7 +40,7 @@ function follow_post(App $a) { goaway(System::baseUrl().'/contacts/'.$result['cid']); } - info( t('Contact added').EOL); + info(t('Contact added').EOL); if (strstr($return_url,'contacts')) { goaway(System::baseUrl().'/contacts/'.$contact_id); @@ -52,8 +52,8 @@ function follow_post(App $a) { function follow_content(App $a) { - if (! local_user()) { - notice( t('Permission denied.') . EOL); + if (!local_user()) { + notice(t('Permission denied.') . EOL); goaway($_SESSION['return_url']); // NOTREACHED } @@ -81,21 +81,21 @@ function follow_content(App $a) { $ret = Probe::uri($url); if (($ret["network"] == NETWORK_DIASPORA) && !Config::get('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 = ""; //goaway($_SESSION['return_url']); // NOTREACHED } if (($ret["network"] == NETWORK_OSTATUS) && Config::get('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 = ""; //goaway($_SESSION['return_url']); // NOTREACHED } if ($ret["network"] == NETWORK_PHANTOM) { - notice( t("The network type couldn't be detected. Contact can't be added.") . EOL); + notice(t("The network type couldn't be detected. Contact can't be added.") . EOL); $submit = ""; //goaway($_SESSION['return_url']); // NOTREACHED @@ -116,7 +116,7 @@ function follow_content(App $a) { $r = q("SELECT `url` FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1", intval($uid)); if (!$r) { - notice( t('Permission denied.') . EOL); + notice(t('Permission denied.') . EOL); goaway($_SESSION['return_url']); // NOTREACHED } @@ -176,7 +176,8 @@ function follow_content(App $a) { )); $a->page['aside'] = ""; - profile_load($a, "", 0, Contact::getDetailsByURL($ret["url"])); + + profile_load($a, "", 0, Contact::getDetailsByURL($ret["url"]), false); if ($gcontact_id <> 0) { $o .= replace_macros(get_markup_template('section_title.tpl'), From 19878a63977aa484300d5b3d0c027df52cc9c085 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Fri, 29 Dec 2017 22:12:18 -0500 Subject: [PATCH 42/80] Fix formatting dfrn_poll --- mod/dfrn_poll.php | 322 ++++++++++++++++++++++------------------------ 1 file changed, 153 insertions(+), 169 deletions(-) diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index 1e07242875..575343bc19 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -1,4 +1,5 @@ argc > 1) && ($dfrn_id == '') && !strstr($_SERVER["HTTP_USER_AGENT"], 'Friendica')) { @@ -31,28 +33,28 @@ function dfrn_poll_init(App $a) { killme(); } - $direction = (-1); + $direction = -1; - - if(strpos($dfrn_id,':') == 1) { - $direction = intval(substr($dfrn_id,0,1)); - $dfrn_id = substr($dfrn_id,2); + if (strpos($dfrn_id, ':') == 1) { + $direction = intval(substr($dfrn_id, 0, 1)); + $dfrn_id = substr($dfrn_id, 2); } $hidewall = false; - if(($dfrn_id === '') && (! x($_POST,'dfrn_id'))) { - if((Config::get('system','block_public')) && (! local_user()) && (! remote_user())) { + if (($dfrn_id === '') && (!x($_POST, 'dfrn_id'))) { + if (Config::get('system', 'block_public') && !local_user() && !remote_user()) { http_status_exit(403); } $user = ''; - if($a->argc > 1) { + if ($a->argc > 1) { $r = q("SELECT `hidewall`,`nickname` FROM `user` WHERE `user`.`nickname` = '%s' LIMIT 1", dbesc($a->argv[1]) ); - if (!$r) + if (!$r) { http_status_exit(404); + } $hidewall = ($r[0]['hidewall'] && !local_user()); @@ -61,16 +63,15 @@ function dfrn_poll_init(App $a) { logger('dfrn_poll: public feed request from ' . $_SERVER['REMOTE_ADDR'] . ' for ' . $user); header("Content-type: application/atom+xml"); - echo DFRN::feed('', $user,$last_update, 0, $hidewall); + echo DFRN::feed('', $user, $last_update, 0, $hidewall); killme(); } - if(($type === 'profile') && (! strlen($sec))) { - + if (($type === 'profile') && (!strlen($sec))) { $sql_extra = ''; - switch($direction) { - case (-1): - $sql_extra = sprintf(" AND ( `dfrn-id` = '%s' OR `issued-id` = '%s' ) ", dbesc($dfrn_id),dbesc($dfrn_id)); + switch ($direction) { + case -1: + $sql_extra = sprintf(" AND ( `dfrn-id` = '%s' OR `issued-id` = '%s' ) ", dbesc($dfrn_id), dbesc($dfrn_id)); $my_id = $dfrn_id; break; case 0: @@ -94,28 +95,29 @@ function dfrn_poll_init(App $a) { ); if (DBM::is_result($r)) { - $s = fetch_url($r[0]['poll'] . '?dfrn_id=' . $my_id . '&type=profile-check'); logger("dfrn_poll: old profile returns " . $s, LOGGER_DATA); - if(strlen($s)) { - + if (strlen($s)) { $xml = parse_xml_string($s); - if((int) $xml->status == 1) { + if ((int) $xml->status === 1) { $_SESSION['authenticated'] = 1; - if(! x($_SESSION,'remote')) + if (!x($_SESSION, 'remote')) { $_SESSION['remote'] = array(); + } - $_SESSION['remote'][] = array('cid' => $r[0]['id'],'uid' => $r[0]['uid'],'url' => $r[0]['url']); + $_SESSION['remote'][] = array('cid' => $r[0]['id'], 'uid' => $r[0]['uid'], 'url' => $r[0]['url']); $_SESSION['visitor_id'] = $r[0]['id']; $_SESSION['visitor_home'] = $r[0]['url']; $_SESSION['visitor_handle'] = $r[0]['addr']; $_SESSION['visitor_visiting'] = $r[0]['uid']; - if(!$quiet) - info( sprintf(t('%1$s welcomes %2$s'), $r[0]['username'] , $r[0]['name']) . EOL); + if (!$quiet) { + info(sprintf(t('%1$s welcomes %2$s'), $r[0]['username'], $r[0]['name']) . EOL); + } + // Visitors get 1 day session. $session_id = session_id(); $expire = time() + 86400; @@ -129,53 +131,53 @@ function dfrn_poll_init(App $a) { goaway((strlen($destination_url)) ? $destination_url : System::baseUrl() . '/profile/' . $profile); } goaway(System::baseUrl()); - } - if($type === 'profile-check' && $dfrn_version < 2.2 ) { - - if((strlen($challenge)) && (strlen($sec))) { - + if ($type === 'profile-check' && $dfrn_version < 2.2) { + if ((strlen($challenge)) && (strlen($sec))) { q("DELETE FROM `profile_check` WHERE `expire` < " . intval(time())); $r = q("SELECT * FROM `profile_check` WHERE `sec` = '%s' ORDER BY `expire` DESC LIMIT 1", dbesc($sec) ); - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { xml_status(3, 'No ticket'); // NOTREACHED } + $orig_id = $r[0]['dfrn_id']; - if(strpos($orig_id, ':')) - $orig_id = substr($orig_id,2); + if (strpos($orig_id, ':')) { + $orig_id = substr($orig_id, 2); + } $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($r[0]['cid']) ); - if (! DBM::is_result($c)) { + if (!DBM::is_result($c)) { xml_status(3, 'No profile'); } + $contact = $c[0]; $sent_dfrn_id = hex2bin($dfrn_id); - $challenge = hex2bin($challenge); + $challenge = hex2bin($challenge); $final_dfrn_id = ''; - if(($contact['duplex']) && strlen($contact['prvkey'])) { - openssl_private_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['prvkey']); - openssl_private_decrypt($challenge,$decoded_challenge,$contact['prvkey']); - } - else { - openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']); - openssl_public_decrypt($challenge,$decoded_challenge,$contact['pubkey']); + if (($contact['duplex']) && strlen($contact['prvkey'])) { + openssl_private_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['prvkey']); + openssl_private_decrypt($challenge, $decoded_challenge, $contact['prvkey']); + } else { + openssl_public_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['pubkey']); + openssl_public_decrypt($challenge, $decoded_challenge, $contact['pubkey']); } $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.')); - if(strpos($final_dfrn_id,':') == 1) - $final_dfrn_id = substr($final_dfrn_id,2); + if (strpos($final_dfrn_id, ':') == 1) { + $final_dfrn_id = substr($final_dfrn_id, 2); + } - if($final_dfrn_id != $orig_id) { + if ($final_dfrn_id != $orig_id) { logger('profile_check: ' . $final_dfrn_id . ' != ' . $orig_id, LOGGER_DEBUG); // did not decode properly - cannot trust this site xml_status(3, 'Bad decryption'); @@ -185,11 +187,9 @@ function dfrn_poll_init(App $a) { echo "0$decoded_challenge$sec"; killme(); // NOTREACHED - } - else { - // old protocol - - switch($direction) { + } else { + // old protocol + switch ($direction) { case 1: $dfrn_id = '0:' . $dfrn_id; break; @@ -200,7 +200,6 @@ function dfrn_poll_init(App $a) { break; } - q("DELETE FROM `profile_check` WHERE `expire` < " . intval(time())); $r = q("SELECT * FROM `profile_check` WHERE `dfrn_id` = '%s' ORDER BY `expire` DESC", dbesc($dfrn_id)); @@ -212,67 +211,65 @@ function dfrn_poll_init(App $a) { return; // NOTREACHED } } - } +function dfrn_poll_post(App $a) +{ + $dfrn_id = x($_POST,'dfrn_id') ? $_POST['dfrn_id'] : ''; + $challenge = x($_POST,'challenge') ? $_POST['challenge'] : ''; + $url = x($_POST,'url') ? $_POST['url'] : ''; + $sec = x($_POST,'sec') ? $_POST['sec'] : ''; + $ptype = x($_POST,'type') ? $_POST['type'] : ''; + $dfrn_version = x($_POST,'dfrn_version') ? (float) $_POST['dfrn_version'] : 2.0; + $perm = x($_POST,'perm') ? $_POST['perm'] : 'r'; - -function dfrn_poll_post(App $a) { - - $dfrn_id = ((x($_POST,'dfrn_id')) ? $_POST['dfrn_id'] : ''); - $challenge = ((x($_POST,'challenge')) ? $_POST['challenge'] : ''); - $url = ((x($_POST,'url')) ? $_POST['url'] : ''); - $sec = ((x($_POST,'sec')) ? $_POST['sec'] : ''); - $ptype = ((x($_POST,'type')) ? $_POST['type'] : ''); - $dfrn_version = ((x($_POST,'dfrn_version')) ? (float) $_POST['dfrn_version'] : 2.0); - $perm = ((x($_POST,'perm')) ? $_POST['perm'] : 'r'); - - if($ptype === 'profile-check') { - - if((strlen($challenge)) && (strlen($sec))) { - + if ($ptype === 'profile-check') { + if (strlen($challenge) && strlen($sec)) { logger('dfrn_poll: POST: profile-check'); q("DELETE FROM `profile_check` WHERE `expire` < " . intval(time())); $r = q("SELECT * FROM `profile_check` WHERE `sec` = '%s' ORDER BY `expire` DESC LIMIT 1", dbesc($sec) ); - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { xml_status(3, 'No ticket'); // NOTREACHED } + $orig_id = $r[0]['dfrn_id']; - if(strpos($orig_id, ':')) - $orig_id = substr($orig_id,2); + if (strpos($orig_id, ':')) { + $orig_id = substr($orig_id, 2); + } $c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", intval($r[0]['cid']) ); - if (! DBM::is_result($c)) { + if (!DBM::is_result($c)) { xml_status(3, 'No profile'); } + $contact = $c[0]; $sent_dfrn_id = hex2bin($dfrn_id); - $challenge = hex2bin($challenge); + $challenge = hex2bin($challenge); $final_dfrn_id = ''; - if(($contact['duplex']) && strlen($contact['prvkey'])) { - openssl_private_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['prvkey']); - openssl_private_decrypt($challenge,$decoded_challenge,$contact['prvkey']); - } - else { - openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']); - openssl_public_decrypt($challenge,$decoded_challenge,$contact['pubkey']); + if ($contact['duplex'] && strlen($contact['prvkey'])) { + openssl_private_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['prvkey']); + openssl_private_decrypt($challenge, $decoded_challenge, $contact['prvkey']); + } else { + openssl_public_decrypt($sent_dfrn_id, $final_dfrn_id, $contact['pubkey']); + openssl_public_decrypt($challenge, $decoded_challenge, $contact['pubkey']); } $final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.')); - if(strpos($final_dfrn_id,':') == 1) - $final_dfrn_id = substr($final_dfrn_id,2); + if (strpos($final_dfrn_id, ':') == 1) { + $final_dfrn_id = substr($final_dfrn_id, 2); + } - if($final_dfrn_id != $orig_id) { + if ($final_dfrn_id != $orig_id) { logger('profile_check: ' . $final_dfrn_id . ' != ' . $orig_id, LOGGER_DEBUG); // did not decode properly - cannot trust this site xml_status(3, 'Bad decryption'); @@ -283,22 +280,20 @@ function dfrn_poll_post(App $a) { killme(); // NOTREACHED } - } - $direction = (-1); - if(strpos($dfrn_id,':') == 1) { - $direction = intval(substr($dfrn_id,0,1)); - $dfrn_id = substr($dfrn_id,2); + $direction = -1; + if (strpos($dfrn_id, ':') == 1) { + $direction = intval(substr($dfrn_id, 0, 1)); + $dfrn_id = substr($dfrn_id, 2); } - $r = q("SELECT * FROM `challenge` WHERE `dfrn-id` = '%s' AND `challenge` = '%s' LIMIT 1", dbesc($dfrn_id), dbesc($challenge) ); - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { killme(); } @@ -312,8 +307,8 @@ function dfrn_poll_post(App $a) { $sql_extra = ''; - switch($direction) { - case (-1): + switch ($direction) { + case -1: $sql_extra = sprintf(" AND `issued-id` = '%s' ", dbesc($dfrn_id)); $my_id = $dfrn_id; break; @@ -330,11 +325,8 @@ function dfrn_poll_post(App $a) { break; // NOTREACHED } - $r = q("SELECT * FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 $sql_extra LIMIT 1"); - - - if (! DBM::is_result($r)) { + if (!DBM::is_result($r)) { killme(); } @@ -342,8 +334,7 @@ function dfrn_poll_post(App $a) { $owner_uid = $r[0]['uid']; $contact_id = $r[0]['id']; - - if($type === 'reputation' && strlen($url)) { + if ($type === 'reputation' && strlen($url)) { $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1", dbesc($url), intval($owner_uid) @@ -355,7 +346,7 @@ function dfrn_poll_post(App $a) { $reputation = $r[0]['rating']; $text = $r[0]['reason']; - if($r[0]['id'] == $contact_id) { // inquiring about own reputation not allowed + if ($r[0]['id'] == $contact_id) { // inquiring about own reputation not allowed $reputation = 0; $text = ''; } @@ -370,18 +361,17 @@ function dfrn_poll_post(App $a) { "; killme(); // NOTREACHED - } - else { - + } else { // Update the writable flag if it changed - logger('dfrn_poll: post request feed: ' . print_r($_POST,true),LOGGER_DATA); - if($dfrn_version >= 2.21) { - if($perm === 'rw') + logger('dfrn_poll: post request feed: ' . print_r($_POST, true), LOGGER_DATA); + if ($dfrn_version >= 2.21) { + if ($perm === 'rw') { $writable = 1; - else + } else { $writable = 0; + } - if($writable != $contact['writable']) { + if ($writable != $contact['writable']) { q("UPDATE `contact` SET `writable` = %d WHERE `id` = %d", intval($writable), intval($contact_id) @@ -393,29 +383,27 @@ function dfrn_poll_post(App $a) { $o = DFRN::feed($dfrn_id, $a->argv[1], $last_update, $direction); echo $o; killme(); - } } -function dfrn_poll_content(App $a) { +function dfrn_poll_content(App $a) +{ + $dfrn_id = x($_GET,'dfrn_id') ? $_GET['dfrn_id'] : ''; + $type = x($_GET,'type') ? $_GET['type'] : 'data'; + $last_update = x($_GET,'last_update') ? $_GET['last_update'] : ''; + $destination_url = x($_GET,'destination_url') ? $_GET['destination_url'] : ''; + $sec = x($_GET,'sec') ? $_GET['sec'] : ''; + $dfrn_version = x($_GET,'dfrn_version') ? (float) $_GET['dfrn_version'] : 2.0; + $perm = x($_GET,'perm') ? $_GET['perm'] : 'r'; + $quiet = x($_GET,'quiet') ? true : false; - $dfrn_id = ((x($_GET,'dfrn_id')) ? $_GET['dfrn_id'] : ''); - $type = ((x($_GET,'type')) ? $_GET['type'] : 'data'); - $last_update = ((x($_GET,'last_update')) ? $_GET['last_update'] : ''); - $destination_url = ((x($_GET,'destination_url')) ? $_GET['destination_url'] : ''); - $sec = ((x($_GET,'sec')) ? $_GET['sec'] : ''); - $dfrn_version = ((x($_GET,'dfrn_version')) ? (float) $_GET['dfrn_version'] : 2.0); - $perm = ((x($_GET,'perm')) ? $_GET['perm'] : 'r'); - $quiet = ((x($_GET,'quiet')) ? true : false); - - $direction = (-1); - if(strpos($dfrn_id,':') == 1) { - $direction = intval(substr($dfrn_id,0,1)); - $dfrn_id = substr($dfrn_id,2); + $direction = -1; + if (strpos($dfrn_id, ':') == 1) { + $direction = intval(substr($dfrn_id, 0, 1)); + $dfrn_id = substr($dfrn_id, 2); } - - if($dfrn_id != '') { + if ($dfrn_id != '') { // initial communication from external contact $hash = random_string(); @@ -423,7 +411,7 @@ function dfrn_poll_content(App $a) { $r = q("DELETE FROM `challenge` WHERE `expire` < " . intval(time())); - if($type !== 'profile') { + if ($type !== 'profile') { $r = q("INSERT INTO `challenge` ( `challenge`, `dfrn-id`, `expire` , `type`, `last_update` ) VALUES( '%s', '%s', '%s', '%s', '%s' ) ", dbesc($hash), @@ -433,13 +421,16 @@ function dfrn_poll_content(App $a) { dbesc($last_update) ); } + $sql_extra = ''; - switch($direction) { - case (-1): - if($type === 'profile') - $sql_extra = sprintf(" AND ( `dfrn-id` = '%s' OR `issued-id` = '%s' ) ", dbesc($dfrn_id),dbesc($dfrn_id)); - else + switch ($direction) { + case -1: + if ($type === 'profile') { + $sql_extra = sprintf(" AND ( `dfrn-id` = '%s' OR `issued-id` = '%s' ) ", dbesc($dfrn_id), dbesc($dfrn_id)); + } else { $sql_extra = sprintf(" AND `issued-id` = '%s' ", dbesc($dfrn_id)); + } + $my_id = $dfrn_id; break; case 0: @@ -463,36 +454,30 @@ function dfrn_poll_content(App $a) { AND `user`.`nickname` = '%s' $sql_extra LIMIT 1", dbesc($nickname) ); - if (DBM::is_result($r)) { - $challenge = ''; $encrypted_id = ''; - $id_str = $my_id . '.' . mt_rand(1000,9999); + $id_str = $my_id . '.' . mt_rand(1000, 9999); - if(($r[0]['duplex'] && strlen($r[0]['pubkey'])) || (! strlen($r[0]['prvkey']))) { - openssl_public_encrypt($hash,$challenge,$r[0]['pubkey']); - openssl_public_encrypt($id_str,$encrypted_id,$r[0]['pubkey']); - } - else { - openssl_private_encrypt($hash,$challenge,$r[0]['prvkey']); - openssl_private_encrypt($id_str,$encrypted_id,$r[0]['prvkey']); + if (($r[0]['duplex'] && strlen($r[0]['pubkey'])) || !strlen($r[0]['prvkey'])) { + openssl_public_encrypt($hash, $challenge, $r[0]['pubkey']); + openssl_public_encrypt($id_str, $encrypted_id, $r[0]['pubkey']); + } else { + openssl_private_encrypt($hash, $challenge, $r[0]['prvkey']); + openssl_private_encrypt($id_str, $encrypted_id, $r[0]['prvkey']); } $challenge = bin2hex($challenge); $encrypted_id = bin2hex($encrypted_id); - } - else { + } else { $status = 1; $challenge = ''; $encrypted_id = ''; } - if(($type === 'profile') && (strlen($sec))) { - + if (($type === 'profile') && (strlen($sec))) { // URL reply - - if($dfrn_version < 2.2) { + if ($dfrn_version < 2.2) { $s = fetch_url($r[0]['poll'] . '?dfrn_id=' . $encrypted_id . '&type=profile-check' @@ -500,8 +485,7 @@ function dfrn_poll_content(App $a) { . '&challenge=' . $challenge . '&sec=' . $sec ); - } - else { + } else { $s = post_url($r[0]['poll'], array( 'dfrn_id' => $encrypted_id, 'type' => 'profile-check', @@ -513,7 +497,7 @@ function dfrn_poll_content(App $a) { $profile = ((DBM::is_result($r) && $r[0]['nickname']) ? $r[0]['nickname'] : $nickname); - switch($destination_url) { + switch ($destination_url) { case 'profile': $dest = System::baseUrl() . '/profile/' . $profile . '?f=&tab=profile'; break; @@ -532,26 +516,28 @@ function dfrn_poll_content(App $a) { logger("dfrn_poll: sec profile: " . $s, LOGGER_DATA); - if(strlen($s) && strstr($s,'challenge . ' expecting ' . $hash); logger('dfrn_poll: secure profile: sec: ' . $xml->sec . ' expecting ' . $sec); - - if(((int) $xml->status == 0) && ($xml->challenge == $hash) && ($xml->sec == $sec)) { + if (((int) $xml->status == 0) && ($xml->challenge == $hash) && ($xml->sec == $sec)) { $_SESSION['authenticated'] = 1; - if(! x($_SESSION,'remote')) + if (!x($_SESSION, 'remote')) { $_SESSION['remote'] = array(); - $_SESSION['remote'][] = array('cid' => $r[0]['id'],'uid' => $r[0]['uid'],'url' => $r[0]['url']); + } + + $_SESSION['remote'][] = array('cid' => $r[0]['id'], 'uid' => $r[0]['uid'], 'url' => $r[0]['url']); $_SESSION['visitor_id'] = $r[0]['id']; $_SESSION['visitor_home'] = $r[0]['url']; $_SESSION['visitor_visiting'] = $r[0]['uid']; - if(!$quiet) - info( sprintf(t('%1$s welcomes %2$s'), $r[0]['username'] , $r[0]['name']) . EOL); + if (!$quiet) { + info(sprintf(t('%1$s welcomes %2$s'), $r[0]['username'], $r[0]['name']) . EOL); + } + // Visitors get 1 day session. $session_id = session_id(); $expire = time() + 86400; @@ -565,9 +551,7 @@ function dfrn_poll_content(App $a) { } goaway($dest); // NOTREACHED - - } - else { + } else { // XML reply header("Content-type: text/xml"); echo '' . "\r\n" @@ -576,7 +560,7 @@ function dfrn_poll_content(App $a) { . "\t" . '' . DFRN_PROTOCOL_VERSION . '' . "\r\n" . "\t" . '' . $encrypted_id . '' . "\r\n" . "\t" . '' . $challenge . '' . "\r\n" - . '' . "\r\n" ; + . '' . "\r\n"; killme(); // NOTREACHED } From 095d458de4de8e18e0a7222f17ba6e76f80a652f Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Fri, 29 Dec 2017 22:23:58 -0500 Subject: [PATCH 43/80] Fix formatting mod/profile --- mod/profile.php | 165 ++++++++++++++++++++++++------------------------ 1 file changed, 83 insertions(+), 82 deletions(-) diff --git a/mod/profile.php b/mod/profile.php index 59835bd4cb..9b609f885a 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -6,78 +6,79 @@ use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBM; -require_once('include/contact_widgets.php'); -require_once('include/redir.php'); +require_once 'include/contact_widgets.php'; +require_once 'include/redir.php'; -function profile_init(App $a) { - - if(! x($a->page,'aside')) +function profile_init(App $a) +{ + if (!x($a->page, 'aside')) { $a->page['aside'] = ''; + } - if($a->argc > 1) + if ($a->argc > 1) { $which = htmlspecialchars($a->argv[1]); - else { - $r = q("select nickname from user where blocked = 0 and account_expired = 0 and account_removed = 0 and verified = 1 order by rand() limit 1"); + } else { + $r = q("SELECT `nickname` FROM `user` WHERE `blocked` = 0 AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 ORDER BY RAND() LIMIT 1"); if (DBM::is_result($r)) { goaway(System::baseUrl() . '/profile/' . $r[0]['nickname']); - } - else { + } else { logger('profile error: mod_profile ' . $a->query_string, LOGGER_DEBUG); - notice( t('Requested profile is not available.') . EOL ); + notice(t('Requested profile is not available.') . EOL); $a->error = 404; return; } } $profile = 0; - if((local_user()) && ($a->argc > 2) && ($a->argv[2] === 'view')) { + if (local_user() && $a->argc > 2 && $a->argv[2] === 'view') { $which = $a->user['nickname']; $profile = htmlspecialchars($a->argv[1]); - } - else { + } else { auto_redir($a, $which); } - profile_load($a,$which,$profile); + profile_load($a, $which, $profile); - $blocked = (((Config::get('system','block_public')) && (! local_user()) && (! remote_user())) ? true : false); - $userblock = (($a->profile['hidewall'] && (! local_user()) && (! remote_user())) ? true : false); + $blocked = Config::get('system', 'block_public') && !local_user() && !remote_user(); + $userblock = $a->profile['hidewall'] && !local_user() && !remote_user(); - if((x($a->profile,'page-flags')) && ($a->profile['page-flags'] == PAGE_COMMUNITY)) { + if (x($a->profile, 'page-flags') && $a->profile['page-flags'] == PAGE_COMMUNITY) { $a->page['htmlhead'] .= ''; } - if (x($a->profile,'openidserver')) { + + if (x($a->profile, 'openidserver')) { $a->page['htmlhead'] .= '' . "\r\n"; } - if (x($a->profile,'openid')) { - $delegate = ((strstr($a->profile['openid'],'://')) ? $a->profile['openid'] : 'https://' . $a->profile['openid']); + + if (x($a->profile, 'openid')) { + $delegate = ((strstr($a->profile['openid'], '://')) ? $a->profile['openid'] : 'https://' . $a->profile['openid']); $a->page['htmlhead'] .= '' . "\r\n"; } // site block - if ((! $blocked) && (! $userblock)) { - $keywords = ((x($a->profile,'pub_keywords')) ? $a->profile['pub_keywords'] : ''); - $keywords = str_replace(array('#',',',' ',',,'),array('',' ',',',','),$keywords); - if(strlen($keywords)) - $a->page['htmlhead'] .= '' . "\r\n" ; + if (!$blocked && !$userblock) { + $keywords = x($a->profile, 'pub_keywords') ? $a->profile['pub_keywords'] : ''; + $keywords = str_replace(array('#', ',', ' ', ',,'), array('', ' ', ',', ','), $keywords); + if (strlen($keywords)) { + $a->page['htmlhead'] .= '' . "\r\n"; + } } - $a->page['htmlhead'] .= '' . "\r\n" ; - $a->page['htmlhead'] .= '' . "\r\n" ; - $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : '')); + $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; + $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . ($a->path ? '/' . $a->path : '')); $a->page['htmlhead'] .= '' . "\r\n"; header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false); $dfrn_pages = array('request', 'confirm', 'notify', 'poll'); foreach ($dfrn_pages as $dfrn) { - $a->page['htmlhead'] .= "\r\n"; + $a->page['htmlhead'] .= "\r\n"; } - $a->page['htmlhead'] .= "\r\n"; + $a->page['htmlhead'] .= "\r\n"; } - -function profile_content(App $a, $update = 0) { - +function profile_content(App $a, $update = 0) +{ $category = $datequery = $datequery2 = ''; if ($a->argc > 2) { @@ -94,21 +95,21 @@ function profile_content(App $a, $update = 0) { } } - if (! x($category)) { - $category = ((x($_GET,'category')) ? $_GET['category'] : ''); + if (!x($category)) { + $category = x($_GET, 'category') ? $_GET['category'] : ''; } - $hashtags = (x($_GET, 'tag') ? $_GET['tag'] : ''); + $hashtags = x($_GET, 'tag') ? $_GET['tag'] : ''; - if (Config::get('system','block_public') && (! local_user()) && (! remote_user())) { + if (Config::get('system', 'block_public') && (!local_user()) && (!remote_user())) { return login(); } - require_once("include/bbcode.php"); - require_once('include/security.php'); - require_once('include/conversation.php'); - require_once('include/acl_selectors.php'); - require_once('include/items.php'); + require_once 'include/bbcode.php'; + require_once 'include/security.php'; + require_once 'include/conversation.php'; + require_once 'include/acl_selectors.php'; + require_once 'include/items.php'; $groups = array(); @@ -148,74 +149,72 @@ function profile_content(App $a, $update = 0) { } } - if (! $remote_contact) { + if (!$remote_contact) { if (local_user()) { $contact_id = $_SESSION['cid']; $contact = $a->contact; } } - $is_owner = ((local_user()) && (local_user() == $a->profile['profile_uid']) ? true : false); + $is_owner = local_user() && local_user() == $a->profile['profile_uid']; $last_updated_key = "profile:" . $a->profile['profile_uid'] . ":" . local_user() . ":" . remote_user(); - if ($a->profile['hidewall'] && (! $is_owner) && (! $remote_contact)) { - notice( t('Access to this profile has been restricted.') . EOL); + if ($a->profile['hidewall'] && !$is_owner && !$remote_contact) { + notice(t('Access to this profile has been restricted.') . EOL); return; } - if (! $update) { - if (x($_GET,'tab')) { + if (!$update) { + if (x($_GET, 'tab')) { $tab = notags(trim($_GET['tab'])); } - $o.=profile_tabs($a, $is_owner, $a->profile['nickname']); + $o .= profile_tabs($a, $is_owner, $a->profile['nickname']); if ($tab === 'profile') { $o .= advanced_profile($a); - call_hooks('profile_advanced',$o); + call_hooks('profile_advanced', $o); return $o; } $o .= common_friends_visitor_widget($a->profile['profile_uid']); - if (x($_SESSION,'new_member') && $_SESSION['new_member'] && $is_owner) { + if (x($_SESSION, 'new_member') && $_SESSION['new_member'] && $is_owner) { $o .= '' . t('Tips for New Members') . '' . EOL; } $commpage = (($a->profile['page-flags'] == PAGE_COMMUNITY) ? true : false); $commvisitor = (($commpage && $remote_contact == true) ? true : false); - $a->page['aside'] .= posted_date_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'],$a->profile['profile_uid'],true); - $a->page['aside'] .= categories_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'],(x($category) ? xmlify($category) : '')); + $a->page['aside'] .= posted_date_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], $a->profile['profile_uid'], true); + $a->page['aside'] .= categories_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], (x($category) ? xmlify($category) : '')); $a->page['aside'] .= tagcloud_wall_widget(); - if (can_write_wall($a,$a->profile['profile_uid'])) { - + if (can_write_wall($a, $a->profile['profile_uid'])) { $x = array( 'is_owner' => $is_owner, 'allow_location' => ((($is_owner || $commvisitor) && $a->profile['allow_location']) ? true : false), 'default_location' => (($is_owner) ? $a->user['default-location'] : ''), 'nickname' => $a->profile['nickname'], - 'lockstate' => (((is_array($a->user) && ((strlen($a->user['allow_cid'])) || - (strlen($a->user['allow_gid'])) || (strlen($a->user['deny_cid'])) || - (strlen($a->user['deny_gid']))))) ? 'lock' : 'unlock'), - 'acl' => (($is_owner) ? populate_acl($a->user, true) : ''), + 'lockstate' => is_array($a->user) + && (strlen($a->user['allow_cid']) + || strlen($a->user['allow_gid']) + || strlen($a->user['deny_cid']) + || strlen($a->user['deny_gid']) + ) ? 'lock' : 'unlock', + 'acl' => $is_owner ? populate_acl($a->user, true) : '', 'bang' => '', - 'visitor' => (($is_owner || $commvisitor) ? 'block' : 'none'), + 'visitor' => $is_owner || $commvisitor ? 'block' : 'none', 'profile_uid' => $a->profile['profile_uid'], - 'acl_data' => ( $is_owner ? construct_acl_data($a, $a->user) : '' ), // For non-Javascript ACL selector + 'acl_data' => $is_owner ? construct_acl_data($a, $a->user) : '', // For non-Javascript ACL selector ); - $o .= status_editor($a,$x); + $o .= status_editor($a, $x); } } - - /** - * Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups - */ - $sql_extra = item_permissions_sql($a->profile['profile_uid'],$remote_contact,$groups); - + // Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups + $sql_extra = item_permissions_sql($a->profile['profile_uid'], $remote_contact, $groups); if ($update) { $last_updated = (x($_SESSION['last_updated'], $last_updated_key) ? $_SESSION['last_updated'][$last_updated_key] : 0); @@ -233,7 +232,7 @@ function profile_content(App $a, $update = 0) { FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0 WHERE `item`.`uid` = %d AND `item`.`visible` = 1 AND - (`item`.`deleted` = 0 OR item.verb = '" . ACTIVITY_LIKE ."' + (`item`.`deleted` = 0 OR item.verb = '" . ACTIVITY_LIKE . "' OR item.verb = '" . ACTIVITY_DISLIKE . "' OR item.verb = '" . ACTIVITY_ATTEND . "' OR item.verb = '" . ACTIVITY_ATTENDNO . "' OR item.verb = '" . ACTIVITY_ATTENDMAYBE . "') AND `item`.`moderated` = 0 @@ -247,7 +246,6 @@ function profile_content(App $a, $update = 0) { if (!DBM::is_result($r)) { return ''; } - } else { $sql_post_table = ""; @@ -263,10 +261,10 @@ function profile_content(App $a, $update = 0) { } if ($datequery) { - $sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery)))); + $sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` <= '%s' ", dbesc(datetime_convert(date_default_timezone_get(), '', $datequery)))); } if ($datequery2) { - $sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2)))); + $sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(), '', $datequery2)))); } // Belongs the profile page to a forum? @@ -283,20 +281,22 @@ function profile_content(App $a, $update = 0) { // check if we serve a mobile device and get the user settings // accordingly if ($a->is_mobile) { - $itemspage_network = PConfig::get(local_user(),'system','itemspage_mobile_network'); + $itemspage_network = PConfig::get(local_user(), 'system', 'itemspage_mobile_network'); $itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 10); } else { - $itemspage_network = PConfig::get(local_user(),'system','itemspage_network'); + $itemspage_network = PConfig::get(local_user(), 'system', 'itemspage_network'); $itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 20); } + // now that we have the user settings, see if the theme forces // a maximum item number which is lower then the user choice - if(($a->force_max_items > 0) && ($a->force_max_items < $itemspage_network)) + if (($a->force_max_items > 0) && ($a->force_max_items < $itemspage_network)) { $itemspage_network = $a->force_max_items; + } $a->set_pager_itemspage($itemspage_network); - $pager_sql = sprintf(" LIMIT %d, %d ",intval($a->pager['start']), intval($a->pager['itemspage'])); + $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); $r = q("SELECT `thread`.`iid` AS `item_id`, `thread`.`network` AS `item_network` FROM `thread` @@ -312,7 +312,6 @@ function profile_content(App $a, $update = 0) { ORDER BY `thread`.`created` DESC $pager_sql", intval($a->profile['profile_uid']) ); - } $parents_arr = array(); @@ -323,23 +322,25 @@ function profile_content(App $a, $update = 0) { $_SESSION['last_updated'][$last_updated_key] = time(); if (DBM::is_result($r)) { - foreach($r as $rr) + foreach ($r as $rr) { $parents_arr[] = $rr['item_id']; + } + $parents_str = implode(', ', $parents_arr); - $items = q(item_query()." AND `item`.`uid` = %d + $items = q(item_query() . " AND `item`.`uid` = %d AND `item`.`parent` IN (%s) $sql_extra ", intval($a->profile['profile_uid']), dbesc($parents_str) ); - $items = conv_sort($items,'created'); + $items = conv_sort($items, 'created'); } else { $items = array(); } - if($is_owner && (! $update) && (! Config::get('theme','hide_eventlist'))) { + if ($is_owner && !$update && !Config::get('theme', 'hide_eventlist')) { $o .= get_birthdays(); $o .= get_events(); } From c2e29f26851565bcc292b7ac299e677feac590bc Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 30 Dec 2017 00:19:16 -0500 Subject: [PATCH 44/80] Add type parameter to OStatus::feed - Removed unused parameter $a - Added $nocache parameter - Updated usages --- mod/dfrn_poll.php | 2 +- src/Protocol/OStatus.php | 90 ++++++++++++++++++++++++------------ src/Worker/PubSubPublish.php | 2 +- 3 files changed, 63 insertions(+), 31 deletions(-) diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index 575343bc19..ff6c31b627 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -29,7 +29,7 @@ function dfrn_poll_init(App $a) if (($a->argc > 1) && ($dfrn_id == '') && !strstr($_SERVER["HTTP_USER_AGENT"], 'Friendica')) { $nickname = $a->argv[1]; header("Content-type: application/atom+xml"); - echo OStatus::feed($a, $nickname, $last_update, 10); + echo OStatus::feed($nickname, $last_update, 10); killme(); } diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index 757c525f96..1b02b313f9 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -1240,7 +1240,7 @@ class OStatus * * @return object header root element */ - private static function addHeader($doc, $owner) + private static function addHeader($doc, $owner, $type) { $a = get_app(); @@ -1256,10 +1256,16 @@ class OStatus $root->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET); $root->setAttribute("xmlns:mastodon", NAMESPACE_MASTODON); - $attributes = array("uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION."-".DB_UPDATE_VERSION); + switch ($type) { + case 'activity': $title = t('%s\'s timeline', $owner['name']); break; + case 'posts' : $title = t('%s\'s posts' , $owner['name']); break; + case 'comments': $title = t('%s\'s comments', $owner['name']); break; + } + + $attributes = array("uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION . "-" . DB_UPDATE_VERSION); XML::addElement($doc, $root, "generator", FRIENDICA_PLATFORM, $attributes); - XML::addElement($doc, $root, "id", System::baseUrl()."/profile/".$owner["nick"]); - XML::addElement($doc, $root, "title", sprintf("%s timeline", $owner["name"])); + XML::addElement($doc, $root, "id", System::baseUrl() . "/profile/" . $owner["nick"]); + XML::addElement($doc, $root, "title", $title); XML::addElement($doc, $root, "subtitle", sprintf("Updates from %s on %s", $owner["name"], $a->config["sitename"])); XML::addElement($doc, $root, "logo", $owner["photo"]); XML::addElement($doc, $root, "updated", datetime_convert("UTC", "UTC", "now", ATOM_TIME)); @@ -1278,17 +1284,17 @@ class OStatus self::hublinks($doc, $root, $owner["nick"]); - $attributes = array("href" => System::baseUrl()."/salmon/".$owner["nick"], "rel" => "salmon"); + $attributes = array("href" => System::baseUrl() . "/salmon/" . $owner["nick"], "rel" => "salmon"); XML::addElement($doc, $root, "link", "", $attributes); - $attributes = array("href" => System::baseUrl()."/salmon/".$owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-replies"); + $attributes = array("href" => System::baseUrl() . "/salmon/" . $owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-replies"); XML::addElement($doc, $root, "link", "", $attributes); - $attributes = array("href" => System::baseUrl()."/salmon/".$owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-mention"); + $attributes = array("href" => System::baseUrl() . "/salmon/" . $owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-mention"); XML::addElement($doc, $root, "link", "", $attributes); - $attributes = array("href" => System::baseUrl()."/api/statuses/user_timeline/".$owner["nick"].".atom", - "rel" => "self", "type" => "application/atom+xml"); + $attributes = array("href" => System::baseUrl() . "/api/statuses/user_timeline/" . $owner["nick"] . ".atom", + "rel" => "self", "type" => "application/atom+xml"); XML::addElement($doc, $root, "link", "", $attributes); return $root; @@ -2067,42 +2073,51 @@ class OStatus } /** + * Creates the XML feed for a given nickname + * + * Supported filters: + * - activity (default): all the public posts + * - posts: all the public top-level posts + * - comments: all the public replies + * + * Updates the provided last_update parameter if the result comes from the + * cache or it is empty + * * @brief Creates the XML feed for a given nickname * - * @param object $a The application class * @param string $owner_nick Nickname of the feed owner * @param string $last_update Date of the last update * @param integer $max_items Number of maximum items to fetch + * @param string $type Type of feed (posts, comments or activity) + * @param boolean $nocache Wether to bypass the cache * * @return string XML feed */ - public static function feed(App $a, $owner_nick, &$last_update, $max_items = 300) + public static function feed($owner_nick, &$last_update, $max_items = 300, $type = 'activity', $nocache = false) { $stamp = microtime(true); - $cachekey = "ostatus:feed:".$owner_nick.":".$last_update; + $cachekey = "ostatus:feed:" . $owner_nick . ":" . $type . ":" . $last_update; $previous_created = $last_update; $result = Cache::get($cachekey); - if (!is_null($result)) { - logger('Feed duration: '.number_format(microtime(true) - $stamp, 3).' - '.$owner_nick.' - '.$previous_created.' (cached)', LOGGER_DEBUG); + if (!$nocache && !is_null($result)) { + logger('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $type . ' - ' . $previous_created . ' (cached)', LOGGER_DEBUG); $last_update = $result['last_update']; return $result['feed']; } - $r = q( + $owner = dba::fetch_first( "SELECT `contact`.*, `user`.`nickname`, `user`.`timezone`, `user`.`page-flags` FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid` - WHERE `contact`.`self` AND `user`.`nickname` = '%s' LIMIT 1", - dbesc($owner_nick) + WHERE `contact`.`self` AND `user`.`nickname` = ? LIMIT 1", + $owner_nick ); - if (!DBM::is_result($r)) { + if (!DBM::is_result($owner)) { return; } - $owner = $r[0]; - if (!strlen($last_update)) { $last_update = 'now -30 days'; } @@ -2110,23 +2125,40 @@ class OStatus $check_date = datetime_convert('UTC', 'UTC', $last_update, 'Y-m-d H:i:s'); $authorid = Contact::getIdForURL($owner["url"], 0); + $sql_extra = ''; + if ($type === 'posts') { + $sql_extra .= ' AND `item`.`id` = `item`.`parent` '; + } + + if ($type === 'comments') { + $sql_extra .= sprintf(" AND `item`.`object-type` = '%s' ", dbesc(ACTIVITY_OBJ_COMMENT)); + } + $items = q( "SELECT `item`.*, `item`.`id` AS `item_id` FROM `item` USE INDEX (`uid_contactid_created`) STRAIGHT_JOIN `thread` ON `thread`.`iid` = `item`.`parent` - WHERE `item`.`uid` = %d AND `item`.`contact-id` = %d AND - `item`.`author-id` = %d AND `item`.`created` > '%s' AND - NOT `item`.`deleted` AND NOT `item`.`private` AND - `thread`.`network` IN ('%s', '%s') + WHERE `item`.`uid` = %d + AND `item`.`contact-id` = %d + AND `item`.`author-id` = %d + AND `item`.`created` > '%s' + AND NOT `item`.`deleted` + AND NOT `item`.`private` + AND `thread`.`network` IN ('%s', '%s') + $sql_extra ORDER BY `item`.`created` DESC LIMIT %d", - intval($owner["uid"]), intval($owner["id"]), - intval($authorid), dbesc($check_date), - dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DFRN), intval($max_items) + intval($owner["uid"]), + intval($owner["id"]), + intval($authorid), + dbesc($check_date), + dbesc(NETWORK_OSTATUS), + dbesc(NETWORK_DFRN), + intval($max_items) ); $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; - $root = self::addHeader($doc, $owner); + $root = self::addHeader($doc, $owner, $type); foreach ($items as $item) { if (Config::get('system', 'ostatus_debug')) { @@ -2145,7 +2177,7 @@ class OStatus $msg = array('feed' => $feeddata, 'last_update' => $last_update); Cache::set($cachekey, $msg, CACHE_QUARTER_HOUR); - logger('Feed duration: '.number_format(microtime(true) - $stamp, 3).' - '.$owner_nick.' - '.$previous_created, LOGGER_DEBUG); + logger('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $type . ' - ' . $previous_created, LOGGER_DEBUG); return $feeddata; } diff --git a/src/Worker/PubSubPublish.php b/src/Worker/PubSubPublish.php index e2ecedbdf0..3af206e80d 100644 --- a/src/Worker/PubSubPublish.php +++ b/src/Worker/PubSubPublish.php @@ -52,7 +52,7 @@ class PubSubPublish { logger("Generate feed of user ".$rr['nickname']." to ".$rr['callback_url']." - last updated ".$rr['last_update'], LOGGER_DEBUG); $last_update = $rr['last_update']; - $params = OStatus::feed($a, $rr['nickname'], $last_update); + $params = OStatus::feed($rr['nickname'], $last_update); if (!$params) { return; From fec3aaf9b2f0d6feedb5267586f3a4c5b5bafa31 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 30 Dec 2017 00:19:45 -0500 Subject: [PATCH 45/80] Add Feed module - Update profile alternate links --- mod/profile.php | 4 +++- src/Module/Feed.php | 53 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 src/Module/Feed.php diff --git a/mod/profile.php b/mod/profile.php index 9b609f885a..843f06de3e 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -64,7 +64,9 @@ function profile_init(App $a) } $a->page['htmlhead'] .= '' . "\r\n"; - $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . ($a->path ? '/' . $a->path : '')); $a->page['htmlhead'] .= '' . "\r\n"; header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false); diff --git a/src/Module/Feed.php b/src/Module/Feed.php new file mode 100644 index 0000000000..a8101e8061 --- /dev/null +++ b/src/Module/Feed.php @@ -0,0 +1,53 @@ + posts + * - /feed/[nickname]/posts => posts + * - /feed/[nickname]/comments => comments + * - /feed/[nickname]/replies => comments + * - /feed/[nickname]/activity => activity + * + * @brief Provides public Atom feeds + * + * @author Hypolite Petovan + */ +class Feed extends BaseModule +{ + public static function content() + { + $a = self::getApp(); + + $last_update = x($_GET, 'last_update') ? $_GET['last_update'] : ''; + $nocache = x($_GET, 'nocache') && local_user(); + + $type = null; + if ($a->argc > 2) { + $type = $a->argv[2]; + } + + switch ($type) { + case 'posts': + case 'comments': + case 'activity': + break; + case 'replies': + $type = 'comments'; + break; + default: + $type = 'posts'; + } + + $nickname = $a->argv[1]; + header("Content-type: application/atom+xml"); + echo OStatus::feed($nickname, $last_update, 10, $type, $nocache); + killme(); + } +} From a75a27e08f308b4e53322b0b6c7ebe31ef88eb54 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 30 Dec 2017 00:19:45 -0500 Subject: [PATCH 46/80] Add Feed module - Update profile alternate links --- mod/profile.php | 4 ++- src/Module/Feed.php | 59 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 src/Module/Feed.php diff --git a/mod/profile.php b/mod/profile.php index 9b609f885a..843f06de3e 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -64,7 +64,9 @@ function profile_init(App $a) } $a->page['htmlhead'] .= '' . "\r\n"; - $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . ($a->path ? '/' . $a->path : '')); $a->page['htmlhead'] .= '' . "\r\n"; header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false); diff --git a/src/Module/Feed.php b/src/Module/Feed.php new file mode 100644 index 0000000000..678e77e83a --- /dev/null +++ b/src/Module/Feed.php @@ -0,0 +1,59 @@ + posts + * - /feed/[nickname]/posts => posts + * - /feed/[nickname]/comments => comments + * - /feed/[nickname]/replies => comments + * - /feed/[nickname]/activity => activity + * + * The nocache GET parameter is provided mainly for debug purposes, requires auth + * + * @brief Provides public Atom feeds + * + * @author Hypolite Petovan + */ +class Feed extends BaseModule +{ + public static function content() + { + $a = self::getApp(); + + $last_update = x($_GET, 'last_update') ? $_GET['last_update'] : ''; + $nocache = x($_GET, 'nocache') && local_user(); + + if ($a->argc < 2) { + http_status_exit(400); + } + + $type = null; + if ($a->argc > 2) { + $type = $a->argv[2]; + } + + switch ($type) { + case 'posts': + case 'comments': + case 'activity': + break; + case 'replies': + $type = 'comments'; + break; + default: + $type = 'posts'; + } + + $nickname = $a->argv[1]; + header("Content-type: application/atom+xml"); + echo OStatus::feed($nickname, $last_update, 10, $type, $nocache); + killme(); + } +} From a25d07e5e8e9ac4cfc01673e63c31d56968a9e88 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 30 Dec 2017 00:34:50 -0500 Subject: [PATCH 47/80] Renamed type to filter in OStatus::feed --- src/Protocol/OStatus.php | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index 1b02b313f9..3c284b29f5 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -1235,12 +1235,13 @@ class OStatus /** * @brief Adds the header elements to the XML document * - * @param object $doc XML document - * @param array $owner Contact data of the poster + * @param object $doc XML document + * @param array $owner Contact data of the poster + * @param string $filter The related feed filter (activity, posts or comments) * * @return object header root element */ - private static function addHeader($doc, $owner, $type) + private static function addHeader($doc, $owner, $filter) { $a = get_app(); @@ -1256,7 +1257,7 @@ class OStatus $root->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET); $root->setAttribute("xmlns:mastodon", NAMESPACE_MASTODON); - switch ($type) { + switch ($filter) { case 'activity': $title = t('%s\'s timeline', $owner['name']); break; case 'posts' : $title = t('%s\'s posts' , $owner['name']); break; case 'comments': $title = t('%s\'s comments', $owner['name']); break; @@ -2088,22 +2089,22 @@ class OStatus * @param string $owner_nick Nickname of the feed owner * @param string $last_update Date of the last update * @param integer $max_items Number of maximum items to fetch - * @param string $type Type of feed (posts, comments or activity) - * @param boolean $nocache Wether to bypass the cache + * @param string $filter Feed items filter (activity, posts or comments) + * @param boolean $nocache Wether to bypass caching * * @return string XML feed */ - public static function feed($owner_nick, &$last_update, $max_items = 300, $type = 'activity', $nocache = false) + public static function feed($owner_nick, &$last_update, $max_items = 300, $filter = 'activity', $nocache = false) { $stamp = microtime(true); - $cachekey = "ostatus:feed:" . $owner_nick . ":" . $type . ":" . $last_update; + $cachekey = "ostatus:feed:" . $owner_nick . ":" . $filter . ":" . $last_update; $previous_created = $last_update; $result = Cache::get($cachekey); if (!$nocache && !is_null($result)) { - logger('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $type . ' - ' . $previous_created . ' (cached)', LOGGER_DEBUG); + logger('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $filter . ' - ' . $previous_created . ' (cached)', LOGGER_DEBUG); $last_update = $result['last_update']; return $result['feed']; } @@ -2126,11 +2127,11 @@ class OStatus $authorid = Contact::getIdForURL($owner["url"], 0); $sql_extra = ''; - if ($type === 'posts') { + if ($filter === 'posts') { $sql_extra .= ' AND `item`.`id` = `item`.`parent` '; } - if ($type === 'comments') { + if ($filter === 'comments') { $sql_extra .= sprintf(" AND `item`.`object-type` = '%s' ", dbesc(ACTIVITY_OBJ_COMMENT)); } @@ -2158,7 +2159,7 @@ class OStatus $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; - $root = self::addHeader($doc, $owner, $type); + $root = self::addHeader($doc, $owner, $filter); foreach ($items as $item) { if (Config::get('system', 'ostatus_debug')) { @@ -2177,7 +2178,7 @@ class OStatus $msg = array('feed' => $feeddata, 'last_update' => $last_update); Cache::set($cachekey, $msg, CACHE_QUARTER_HOUR); - logger('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $type . ' - ' . $previous_created, LOGGER_DEBUG); + logger('Feed duration: ' . number_format(microtime(true) - $stamp, 3) . ' - ' . $owner_nick . ' - ' . $filter . ' - ' . $previous_created, LOGGER_DEBUG); return $feeddata; } From cc8493965875e6693061c6c770d96ca137695212 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 30 Dec 2017 00:40:21 -0500 Subject: [PATCH 48/80] Updated hcard with the new feed links --- mod/hcard.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mod/hcard.php b/mod/hcard.php index f8d4cfc3bf..9c1f348a27 100644 --- a/mod/hcard.php +++ b/mod/hcard.php @@ -45,7 +45,9 @@ function hcard_init(App $a) { } $a->page['htmlhead'] .= '' . "\r\n" ; - $a->page['htmlhead'] .= '' . "\r\n" ; + $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n"; $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : '')); $a->page['htmlhead'] .= '' . "\r\n"; header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false); From 9e6bf793805e6c8ded23b91b1a30a0a118a45a46 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Sat, 30 Dec 2017 11:51:49 -0500 Subject: [PATCH 49/80] Crypto to src move Crypto to src and Friendica\Util namespace --- include/crypto.php | 172 ------------------------- include/items.php | 1 - mod/dfrn_confirm.php | 5 +- mod/fetch.php | 2 - mod/hostxrd.php | 22 ++-- mod/item.php | 1 - mod/receive.php | 2 - mod/salmon.php | 10 +- mod/xrd.php | 24 ++-- src/Model/User.php | 6 +- src/Network/Probe.php | 10 +- src/Protocol/DFRN.php | 2 +- src/Protocol/Diaspora.php | 19 +-- src/Protocol/Salmon.php | 11 +- src/Util/Crypto.php | 260 ++++++++++++++++++++++++++++++++++++++ 15 files changed, 317 insertions(+), 230 deletions(-) delete mode 100644 include/crypto.php create mode 100644 src/Util/Crypto.php diff --git a/include/crypto.php b/include/crypto.php deleted file mode 100644 index dfc44c1792..0000000000 --- a/include/crypto.php +++ /dev/null @@ -1,172 +0,0 @@ -SetIntBuffer($Modulus); - $publicExponent = new ASNValue(ASNValue::TAG_INTEGER); - $publicExponent->SetIntBuffer($PublicExponent); - $keySequenceItems = array($modulus, $publicExponent); - $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE); - $keySequence->SetSequence($keySequenceItems); - //Encode bit string - $bitStringValue = $keySequence->Encode(); - $bitStringValue = chr(0x00) . $bitStringValue; //Add unused bits byte - $bitString = new ASNValue(ASNValue::TAG_BITSTRING); - $bitString->Value = $bitStringValue; - //Encode body - $bodyValue = "\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00" . $bitString->Encode(); - $body = new ASNValue(ASNValue::TAG_SEQUENCE); - $body->Value = $bodyValue; - //Get DER encoded public key: - $PublicDER = $body->Encode(); - return $PublicDER; -} - -function pkcs1_encode($Modulus, $PublicExponent) { - //Encode key sequence - $modulus = new ASNValue(ASNValue::TAG_INTEGER); - $modulus->SetIntBuffer($Modulus); - $publicExponent = new ASNValue(ASNValue::TAG_INTEGER); - $publicExponent->SetIntBuffer($PublicExponent); - $keySequenceItems = array($modulus, $publicExponent); - $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE); - $keySequence->SetSequence($keySequenceItems); - //Encode bit string - $bitStringValue = $keySequence->Encode(); - return $bitStringValue; -} - -function metopem($m, $e) { - $der = pkcs8_encode($m, $e); - $key = DerToPem($der, false); - return $key; -} - -function pubrsatome($key, &$m, &$e) -{ - require_once 'library/asn1.php'; - - $lines = explode("\n", $key); - unset($lines[0]); - unset($lines[count($lines)]); - $x = base64_decode(implode('', $lines)); - - $r = ASN_BASE::parseASNString($x); - - $m = base64url_decode($r[0]->asnData[0]->asnData); - $e = base64url_decode($r[0]->asnData[1]->asnData); -} - - -function rsatopem($key) { - pubrsatome($key, $m, $e); - return metopem($m, $e); -} - -function pemtorsa($key) { - pemtome($key, $m, $e); - return metorsa($m, $e); -} - -function pemtome($key, &$m, &$e) -{ - $lines = explode("\n", $key); - unset($lines[0]); - unset($lines[count($lines)]); - $x = base64_decode(implode('', $lines)); - - $r = ASN_BASE::parseASNString($x); - - $m = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData); - $e = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData); -} - -function metorsa($m, $e) { - $der = pkcs1_encode($m, $e); - $key = DerToRsa($der); - return $key; -} - -function salmon_key($pubkey) { - pemtome($pubkey, $m, $e); - return 'RSA' . '.' . base64url_encode($m, true) . '.' . base64url_encode($e, true) ; -} - -function new_keypair($bits) { - $openssl_options = array( - 'digest_alg' => 'sha1', - 'private_key_bits' => $bits, - 'encrypt_key' => false - ); - - $conf = Config::get('system', 'openssl_conf_file'); - if ($conf) { - $openssl_options['config'] = $conf; - } - $result = openssl_pkey_new($openssl_options); - - if (empty($result)) { - logger('new_keypair: failed'); - return false; - } - - // Get private key - $response = array('prvkey' => '', 'pubkey' => ''); - - openssl_pkey_export($result, $response['prvkey']); - - // Get public key - $pkey = openssl_pkey_get_details($result); - $response['pubkey'] = $pkey["key"]; - - return $response; -} diff --git a/include/items.php b/include/items.php index 275052c1fd..a3f3c823b7 100644 --- a/include/items.php +++ b/include/items.php @@ -21,7 +21,6 @@ use Friendica\Protocol\Feed; require_once 'include/bbcode.php'; require_once 'include/oembed.php'; -require_once 'include/crypto.php'; require_once 'include/tags.php'; require_once 'include/files.php'; require_once 'include/text.php'; diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 112ee34ab3..a5f5f1bd34 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -29,6 +29,7 @@ use Friendica\Model\Group; use Friendica\Model\User; use Friendica\Network\Probe; use Friendica\Protocol\Diaspora; +use Friendica\Util\Crypto; require_once 'include/enotify.php'; @@ -162,9 +163,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) { * worried about key leakage than anybody cracking it. * */ - require_once 'include/crypto.php'; - - $res = new_keypair(4096); + $res = Crypto::newKeypair(4096); $private_key = $res['prvkey']; diff --git a/mod/fetch.php b/mod/fetch.php index 68f6acc917..c097ee4c46 100644 --- a/mod/fetch.php +++ b/mod/fetch.php @@ -8,8 +8,6 @@ use Friendica\Core\System; use Friendica\Protocol\Diaspora; use Friendica\Util\XML; -require_once "include/crypto.php"; - function fetch_init(App $a) { diff --git a/mod/hostxrd.php b/mod/hostxrd.php index 0403945efc..a38d3ab61f 100644 --- a/mod/hostxrd.php +++ b/mod/hostxrd.php @@ -1,18 +1,20 @@ $a->get_hostname(), '$zroot' => System::baseUrl(), '$domain' => System::baseUrl(), - '$bigkey' => salmon_key(Config::get('system','site_pubkey')), - )); - exit(); + '$bigkey' => Crypto::salmonKey(Config::get('system', 'site_pubkey'))) + ); + exit(); } diff --git a/mod/item.php b/mod/item.php index 13877fb356..1faef96016 100644 --- a/mod/item.php +++ b/mod/item.php @@ -29,7 +29,6 @@ use Friendica\Protocol\Diaspora; use Friendica\Protocol\Email; use Friendica\Util\Emailer; -require_once 'include/crypto.php'; require_once 'include/enotify.php'; require_once 'include/tags.php'; require_once 'include/files.php'; diff --git a/mod/receive.php b/mod/receive.php index 467a0d00a5..fcc898a0c0 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -9,8 +9,6 @@ use Friendica\Core\Config; use Friendica\Database\DBM; use Friendica\Protocol\Diaspora; -require_once 'include/crypto.php'; - /** * @param object $a App * @return void diff --git a/mod/salmon.php b/mod/salmon.php index 4d8b130f94..bd08431a4c 100644 --- a/mod/salmon.php +++ b/mod/salmon.php @@ -7,8 +7,8 @@ use Friendica\Core\PConfig; use Friendica\Database\DBM; use Friendica\Protocol\OStatus; use Friendica\Protocol\Salmon; +use Friendica\Util\Crypto; -require_once 'include/crypto.php'; require_once 'include/items.php'; require_once 'include/follow.php'; @@ -117,23 +117,23 @@ function salmon_post(App $a) { logger('mod-salmon: key details: ' . print_r($key_info,true), LOGGER_DEBUG); - $pubkey = metopem($m,$e); + $pubkey = Crypto::meToPem($m, $e); // We should have everything we need now. Let's see if it verifies. // Try GNU Social format - $verify = rsa_verify($signed_data, $signature, $pubkey); + $verify = Crypto::rsaVerify($signed_data, $signature, $pubkey); $mode = 1; if (! $verify) { logger('mod-salmon: message did not verify using protocol. Trying compliant format.'); - $verify = rsa_verify($compliant_format, $signature, $pubkey); + $verify = Crypto::rsaVerify($compliant_format, $signature, $pubkey); $mode = 2; } if (! $verify) { logger('mod-salmon: message did not verify using padding. Trying old statusnet format.'); - $verify = rsa_verify($stnet_signed_data, $signature, $pubkey); + $verify = Crypto::rsaVerify($stnet_signed_data, $signature, $pubkey); $mode = 3; } diff --git a/mod/xrd.php b/mod/xrd.php index 49fdde2544..599ee3794b 100644 --- a/mod/xrd.php +++ b/mod/xrd.php @@ -1,12 +1,14 @@ argv[0] == 'xrd') { $uri = urldecode(notags(trim($_GET['uri']))); if ($_SERVER['HTTP_ACCEPT'] == 'application/jrd+json') { @@ -54,8 +56,9 @@ function xrd_init(App $a) { } } -function xrd_json($a, $uri, $alias, $profile_url, $r) { - $salmon_key = salmon_key($r['spubkey']); +function xrd_json($a, $uri, $alias, $profile_url, $r) +{ + $salmon_key = Crypto::salmonKey($r['spubkey']); header('Access-Control-Allow-Origin: *'); header("Content-type: application/json; charset=utf-8"); @@ -79,8 +82,9 @@ function xrd_json($a, $uri, $alias, $profile_url, $r) { killme(); } -function xrd_xml($a, $uri, $alias, $profile_url, $r) { - $salmon_key = salmon_key($r['spubkey']); +function xrd_xml($a, $uri, $alias, $profile_url, $r) +{ + $salmon_key = Crypto::salmonKey($r['spubkey']); header('Access-Control-Allow-Origin: *'); header("Content-type: text/xml"); @@ -100,8 +104,8 @@ function xrd_xml($a, $uri, $alias, $profile_url, $r) { '$salmon' => System::baseUrl() . '/salmon/' . $r['nickname'], '$salmen' => System::baseUrl() . '/salmon/' . $r['nickname'] . '/mention', '$subscribe' => System::baseUrl() . '/follow?url={uri}', - '$modexp' => 'data:application/magic-public-key,' . $salmon_key, - )); + '$modexp' => 'data:application/magic-public-key,' . $salmon_key) + ); $arr = array('user' => $r, 'xml' => $o); call_hooks('personal_xrd', $arr); diff --git a/src/Model/User.php b/src/Model/User.php index f487de7661..4f294f6e89 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -16,11 +16,11 @@ use Friendica\Model\Contact; use Friendica\Model\Group; use Friendica\Model\Photo; use Friendica\Object\Image; +use Friendica\Util\Crypto; use dba; use Exception; require_once 'boot.php'; -require_once 'include/crypto.php'; require_once 'include/dba.php'; require_once 'include/enotify.php'; require_once 'include/network.php'; @@ -299,7 +299,7 @@ class User $return['password'] = $new_password; - $keys = new_keypair(4096); + $keys = Crypto::newKeypair(4096); if ($keys === false) { throw new Exception(t('SERIOUS ERROR: Generation of security keys failed.')); } @@ -308,7 +308,7 @@ class User $pubkey = $keys['pubkey']; // Create another keypair for signing/verifying salmon protocol messages. - $sres = new_keypair(512); + $sres = Crypto::newKeypair(512); $sprvkey = $sres['prvkey']; $spubkey = $sres['pubkey']; diff --git a/src/Network/Probe.php b/src/Network/Probe.php index 56abbb7fdc..539803b6e4 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -17,6 +17,7 @@ use Friendica\Database\DBM; use Friendica\Model\Profile; use Friendica\Protocol\Email; use Friendica\Protocol\Feed; +use Friendica\Util\Crypto; use Friendica\Util\XML; use dba; @@ -25,7 +26,6 @@ use DOMDocument; require_once 'include/dba.php'; require_once 'include/network.php'; -require_once "include/crypto.php"; /** * @brief This class contain functions for probing URL @@ -944,7 +944,7 @@ class Probe //if (strstr($data["pubkey"], 'RSA ') || ($link["type"] == "RSA")) if (strstr($data["pubkey"], 'RSA ')) { - $data["pubkey"] = rsatopem($data["pubkey"]); + $data["pubkey"] = Crypto::rsaToPem($data["pubkey"]); } } } @@ -1043,7 +1043,7 @@ class Probe if ($search->length > 0) { $data["pubkey"] = $search->item(0)->nodeValue; if (strstr($data["pubkey"], 'RSA ')) { - $data["pubkey"] = rsatopem($data["pubkey"]); + $data["pubkey"] = Crypto::rsaToPem($data["pubkey"]); } } @@ -1133,7 +1133,7 @@ class Probe //if (strstr($data["pubkey"], 'RSA ') || ($link["type"] == "RSA")) if (strstr($data["pubkey"], 'RSA ')) { - $data["pubkey"] = rsatopem($data["pubkey"]); + $data["pubkey"] = Crypto::rsaToPem($data["pubkey"]); } } } @@ -1244,7 +1244,7 @@ class Probe if (sizeof($key) >= 3) { $m = base64url_decode($key[1]); $e = base64url_decode($key[2]); - $data["pubkey"] = metopem($m, $e); + $data["pubkey"] = Crypto::meToPem($m, $e); } } } diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index eeedd6324d..5e9c91645b 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -463,7 +463,7 @@ class DFRN /* get site pubkey. this could be a new installation with no site keys*/ $pubkey = Config::get('system', 'site_pubkey'); if (! $pubkey) { - $res = new_keypair(1024); + $res = Crypto::newKeypair(1024); Config::set('system', 'site_prvkey', $res['prvkey']); Config::set('system', 'site_pubkey', $res['pubkey']); } diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 15a30f532e..59ca2757f3 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -22,6 +22,7 @@ use Friendica\Model\Group; use Friendica\Model\Profile; use Friendica\Model\User; use Friendica\Network\Probe; +use Friendica\Util\Crypto; use Friendica\Util\XML; use dba; @@ -173,7 +174,7 @@ class Diaspora $key = self::key($handle); - $verify = rsa_verify($signable_data, $sig, $key); + $verify = Crypto::rsaVerify($signable_data, $sig, $key); if (!$verify) { logger('Message did not verify. Discarding.'); return false; @@ -273,7 +274,7 @@ class Diaspora $author_addr = base64_decode($key_id); $key = self::key($author_addr); - $verify = rsa_verify($signed_data, $signature, $key); + $verify = Crypto::rsaVerify($signed_data, $signature, $key); if (!$verify) { logger('Message did not verify. Discarding.'); http_status_exit(400); @@ -406,7 +407,7 @@ class Diaspora http_status_exit(400); } - $verify = rsa_verify($signed_data, $signature, $key); + $verify = Crypto::rsaVerify($signed_data, $signature, $key); if (!$verify) { logger('Message did not verify. Discarding.'); @@ -699,7 +700,7 @@ class Diaspora $key = self::key($msg["author"]); - if (!rsa_verify($signed_data, $parent_author_signature, $key, "sha256")) { + if (!Crypto::rsaVerify($signed_data, $parent_author_signature, $key, "sha256")) { logger("No valid parent author signature for parent author ".$msg["author"]. " in type ".$type." - signed data: ".$signed_data." - Message: ".$msg["message"]." - Signature ".$parent_author_signature, LOGGER_DEBUG); return false; } @@ -709,7 +710,7 @@ class Diaspora $key = self::key($fields->author); - if (!rsa_verify($signed_data, $author_signature, $key, "sha256")) { + if (!Crypto::rsaVerify($signed_data, $author_signature, $key, "sha256")) { logger("No valid author signature for author ".$fields->author. " in type ".$type." - signed data: ".$signed_data." - Message: ".$msg["message"]." - Signature ".$author_signature, LOGGER_DEBUG); return false; } else { @@ -1432,7 +1433,7 @@ class Diaspora // Check signature $signed_text = 'AccountMigration:'.$old_handle.':'.$new_handle; $key = self::key($old_handle); - if (!rsa_verify($signed_text, $signature, $key, "sha256")) { + if (!Crypto::rsaVerify($signed_text, $signature, $key, "sha256")) { logger('No valid signature for migration.'); return false; } @@ -3032,7 +3033,7 @@ class Diaspora $user['uprvkey'] = $user['prvkey']; } - $signature = rsa_sign($signable_data, $user["uprvkey"]); + $signature = Crypto::rsaSign($signable_data, $user["uprvkey"]); $sig = base64url_encode($signature); $xmldata = array("me:env" => array("me:data" => $data, @@ -3088,7 +3089,7 @@ class Diaspora $signed_text = implode(";", $sigmsg); - return base64_encode(rsa_sign($signed_text, $owner["uprvkey"], "sha256")); + return base64_encode(Crypto::rsaSign($signed_text, $owner["uprvkey"], "sha256")); } /** @@ -3282,7 +3283,7 @@ class Diaspora $profile = self::createProfileData($uid); $signed_text = 'AccountMigration:'.$old_handle.':'.$profile['author']; - $signature = base64_encode(rsa_sign($signed_text, $owner["uprvkey"], "sha256")); + $signature = base64_encode(Crypto::rsaSign($signed_text, $owner["uprvkey"], "sha256")); $message = array("author" => $old_handle, "profile" => $profile, diff --git a/src/Protocol/Salmon.php b/src/Protocol/Salmon.php index d26a3229d1..38a88c14af 100644 --- a/src/Protocol/Salmon.php +++ b/src/Protocol/Salmon.php @@ -5,10 +5,9 @@ namespace Friendica\Protocol; use Friendica\Network\Probe; +use Friendica\Util\Crypto; use Friendica\Util\XML; -require_once 'include/crypto.php'; - /** * @brief Salmon Protocol class * The Salmon Protocol is a message exchange protocol running over HTTP designed to decentralize commentary @@ -107,18 +106,18 @@ class Salmon $data_type = 'application/atom+xml'; $encoding = 'base64url'; $algorithm = 'RSA-SHA256'; - $keyhash = base64url_encode(hash('sha256', salmon_key($owner['spubkey'])), true); + $keyhash = base64url_encode(hash('sha256', Crypto::salmonKey($owner['spubkey'])), true); $precomputed = '.' . base64url_encode($data_type) . '.' . base64url_encode($encoding) . '.' . base64url_encode($algorithm); // GNU Social format - $signature = base64url_encode(rsa_sign($data . $precomputed, $owner['sprvkey'])); + $signature = base64url_encode(Crypto::rsaSign($data . $precomputed, $owner['sprvkey'])); // Compliant format - $signature2 = base64url_encode(rsa_sign(str_replace('=', '', $data . $precomputed), $owner['sprvkey'])); + $signature2 = base64url_encode(Crypto::rsaSign(str_replace('=', '', $data . $precomputed), $owner['sprvkey'])); // Old Status.net format - $signature3 = base64url_encode(rsa_sign($data, $owner['sprvkey'])); + $signature3 = base64url_encode(Crypto::rsaSign($data, $owner['sprvkey'])); // At first try the non compliant method that works for GNU Social $xmldata = array("me:env" => array("me:data" => $data, diff --git a/src/Util/Crypto.php b/src/Util/Crypto.php new file mode 100644 index 0000000000..433a5cd674 --- /dev/null +++ b/src/Util/Crypto.php @@ -0,0 +1,260 @@ +SetIntBuffer($Modulus); + $publicExponent = new ASNValue(ASNValue::TAG_INTEGER); + $publicExponent->SetIntBuffer($PublicExponent); + $keySequenceItems = array($modulus, $publicExponent); + $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE); + $keySequence->SetSequence($keySequenceItems); + //Encode bit string + $bitStringValue = $keySequence->Encode(); + $bitStringValue = chr(0x00) . $bitStringValue; //Add unused bits byte + $bitString = new ASNValue(ASNValue::TAG_BITSTRING); + $bitString->Value = $bitStringValue; + //Encode body + $bodyValue = "\x30\x0d\x06\x09\x2a\x86\x48\x86\xf7\x0d\x01\x01\x01\x05\x00" . $bitString->Encode(); + $body = new ASNValue(ASNValue::TAG_SEQUENCE); + $body->Value = $bodyValue; + //Get DER encoded public key: + $PublicDER = $body->Encode(); + return $PublicDER; + } + + /** + * @param string $Modulus modulo + * @param string $PublicExponent exponent + * @return string + */ + private static function pkcs1Encode($Modulus, $PublicExponent) + { + //Encode key sequence + $modulus = new ASNValue(ASNValue::TAG_INTEGER); + $modulus->SetIntBuffer($Modulus); + $publicExponent = new ASNValue(ASNValue::TAG_INTEGER); + $publicExponent->SetIntBuffer($PublicExponent); + $keySequenceItems = array($modulus, $publicExponent); + $keySequence = new ASNValue(ASNValue::TAG_SEQUENCE); + $keySequence->SetSequence($keySequenceItems); + //Encode bit string + $bitStringValue = $keySequence->Encode(); + return $bitStringValue; + } + + /** + * @param string $m modulo + * @param string $e exponent + * @return string + */ + public static function meToPem($m, $e) + { + $der = self::pkcs8Encode($m, $e); + $key = self::DerToPem($der, false); + return $key; + } + + /** + * @param string $key key + * @param string $m modulo reference + * @param object $e exponent reference + * @return void + */ + private static function pubRsaToMe($key, &$m, &$e) + { + $lines = explode("\n", $key); + unset($lines[0]); + unset($lines[count($lines)]); + $x = base64_decode(implode('', $lines)); + + $r = ASN_BASE::parseASNString($x); + + $m = base64url_decode($r[0]->asnData[0]->asnData); + $e = base64url_decode($r[0]->asnData[1]->asnData); + } + + /** + * @param string $key key + * @return string + */ + public static function rsaToPem($key) + { + self::pubRsaToMe($key, $m, $e); + return self::meToPem($m, $e); + } + + /** + * @param string $key key + * @return string + */ + private static function pemToRsa($key) + { + self::pemToMe($key, $m, $e); + return self::meToRsa($m, $e); + } + + /** + * @param string $key key + * @param string $m modulo reference + * @param string $e exponent reference + * @return void + */ + private static function pemToMe($key, &$m, &$e) + { + $lines = explode("\n", $key); + unset($lines[0]); + unset($lines[count($lines)]); + $x = base64_decode(implode('', $lines)); + + $r = ASN_BASE::parseASNString($x); + + $m = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData); + $e = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData); + } + + /** + * @param string $m modulo + * @param string $e exponent + * @return string + */ + private static function meToRsa($m, $e) + { + $der = self::pkcs1Encode($m, $e); + $key = self::DerToRsa($der); + return $key; + } + + /** + * @param string $pubkey public key + * @return string + */ + public static function salmonKey($pubkey) + { + self::pemToMe($pubkey, $m, $e); + return 'RSA' . '.' . base64url_encode($m, true) . '.' . base64url_encode($e, true); + } + + /** + * @param integer $bits number of bits + * @return mixed + */ + public static function newKeypair($bits) + { + $openssl_options = array( + 'digest_alg' => 'sha1', + 'private_key_bits' => $bits, + 'encrypt_key' => false + ); + + $conf = Config::get('system', 'openssl_conf_file'); + if ($conf) { + $openssl_options['config'] = $conf; + } + $result = openssl_pkey_new($openssl_options); + + if (empty($result)) { + logger('new_keypair: failed'); + return false; + } + + // Get private key + $response = array('prvkey' => '', 'pubkey' => ''); + + openssl_pkey_export($result, $response['prvkey']); + + // Get public key + $pkey = openssl_pkey_get_details($result); + $response['pubkey'] = $pkey["key"]; + + return $response; + } +} From 5d352641a86c09856db4f6062e3954a48cc261b5 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Sat, 30 Dec 2017 12:09:08 -0500 Subject: [PATCH 50/80] ASN_BASE error ASN_BASE not found. Probably a namespace thing. --- src/Util/Crypto.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Util/Crypto.php b/src/Util/Crypto.php index 433a5cd674..1e304bc09b 100644 --- a/src/Util/Crypto.php +++ b/src/Util/Crypto.php @@ -156,7 +156,7 @@ class Crypto unset($lines[count($lines)]); $x = base64_decode(implode('', $lines)); - $r = ASN_BASE::parseASNString($x); + $r = parseASNString($x); $m = base64url_decode($r[0]->asnData[0]->asnData); $e = base64url_decode($r[0]->asnData[1]->asnData); @@ -195,7 +195,7 @@ class Crypto unset($lines[count($lines)]); $x = base64_decode(implode('', $lines)); - $r = ASN_BASE::parseASNString($x); + $r = parseASNString($x); $m = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData); $e = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData); From a00303a6a04e49e56206de475c42c8908c5c0903 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Sat, 30 Dec 2017 12:23:45 -0500 Subject: [PATCH 51/80] Another ASN attempt #2 --- src/Util/Crypto.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Util/Crypto.php b/src/Util/Crypto.php index 1e304bc09b..c63149e5fa 100644 --- a/src/Util/Crypto.php +++ b/src/Util/Crypto.php @@ -5,6 +5,7 @@ namespace Friendica\Util; use Friendica\Core\Config; +use ASN_BASE; require_once 'library/ASNValue.class.php'; require_once 'library/asn1.php'; @@ -156,7 +157,7 @@ class Crypto unset($lines[count($lines)]); $x = base64_decode(implode('', $lines)); - $r = parseASNString($x); + $r = ASN_BASE::parseASNString($x); $m = base64url_decode($r[0]->asnData[0]->asnData); $e = base64url_decode($r[0]->asnData[1]->asnData); @@ -195,7 +196,7 @@ class Crypto unset($lines[count($lines)]); $x = base64_decode(implode('', $lines)); - $r = parseASNString($x); + $r = ASN_BASE::parseASNString($x); $m = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[0]->asnData); $e = base64url_decode($r[0]->asnData[1]->asnData[0]->asnData[1]->asnData); From 0131fd57451669bbf8fe1d0d199c168f3de6d7b9 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Sat, 30 Dec 2017 12:44:43 -0500 Subject: [PATCH 52/80] ASNValue add missing ASNValue --- src/Util/Crypto.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Util/Crypto.php b/src/Util/Crypto.php index c63149e5fa..677697b1ec 100644 --- a/src/Util/Crypto.php +++ b/src/Util/Crypto.php @@ -6,6 +6,7 @@ namespace Friendica\Util; use Friendica\Core\Config; use ASN_BASE; +use ASNValue; require_once 'library/ASNValue.class.php'; require_once 'library/asn1.php'; From db653e4451b24e9c0a285ea09cd5fc93392ca335 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Sun, 31 Dec 2017 08:04:36 -0500 Subject: [PATCH 53/80] Move salmonKey to Salmon class move the salmonKey function from Crypto to Salmon --- mod/hostxrd.php | 3 ++- mod/xrd.php | 6 +++--- src/Protocol/Salmon.php | 12 +++++++++++- src/Util/Crypto.php | 10 ---------- 4 files changed, 16 insertions(+), 15 deletions(-) diff --git a/mod/hostxrd.php b/mod/hostxrd.php index a38d3ab61f..1da8fda998 100644 --- a/mod/hostxrd.php +++ b/mod/hostxrd.php @@ -5,6 +5,7 @@ use Friendica\App; use Friendica\Core\Config; use Friendica\Core\System; +use Friendica\Protocol\Salmon; use Friendica\Util\Crypto; function hostxrd_init(App $a) @@ -25,7 +26,7 @@ function hostxrd_init(App $a) '$zhost' => $a->get_hostname(), '$zroot' => System::baseUrl(), '$domain' => System::baseUrl(), - '$bigkey' => Crypto::salmonKey(Config::get('system', 'site_pubkey'))) + '$bigkey' => Salmon::salmonKey(Config::get('system', 'site_pubkey'))) ); exit(); diff --git a/mod/xrd.php b/mod/xrd.php index 599ee3794b..363994a8d4 100644 --- a/mod/xrd.php +++ b/mod/xrd.php @@ -5,7 +5,7 @@ use Friendica\App; use Friendica\Core\System; use Friendica\Database\DBM; -use Friendica\Util\Crypto; +use Friendica\Protocol\Salmon; function xrd_init(App $a) { @@ -58,7 +58,7 @@ function xrd_init(App $a) function xrd_json($a, $uri, $alias, $profile_url, $r) { - $salmon_key = Crypto::salmonKey($r['spubkey']); + $salmon_key = Salmon::salmonKey($r['spubkey']); header('Access-Control-Allow-Origin: *'); header("Content-type: application/json; charset=utf-8"); @@ -84,7 +84,7 @@ function xrd_json($a, $uri, $alias, $profile_url, $r) function xrd_xml($a, $uri, $alias, $profile_url, $r) { - $salmon_key = Crypto::salmonKey($r['spubkey']); + $salmon_key = Salmon::salmonKey($r['spubkey']); header('Access-Control-Allow-Origin: *'); header("Content-type: text/xml"); diff --git a/src/Protocol/Salmon.php b/src/Protocol/Salmon.php index 38a88c14af..bf349a6808 100644 --- a/src/Protocol/Salmon.php +++ b/src/Protocol/Salmon.php @@ -106,7 +106,7 @@ class Salmon $data_type = 'application/atom+xml'; $encoding = 'base64url'; $algorithm = 'RSA-SHA256'; - $keyhash = base64url_encode(hash('sha256', Crypto::salmonKey($owner['spubkey'])), true); + $keyhash = base64url_encode(hash('sha256', self::salmonKey($owner['spubkey'])), true); $precomputed = '.' . base64url_encode($data_type) . '.' . base64url_encode($encoding) . '.' . base64url_encode($algorithm); @@ -200,4 +200,14 @@ class Salmon return (($return_code >= 200) && ($return_code < 300)) ? 0 : 1; } + + /** + * @param string $pubkey public key + * @return string + */ + public static function salmonKey($pubkey) + { + self::pemToMe($pubkey, $m, $e); + return 'RSA' . '.' . base64url_encode($m, true) . '.' . base64url_encode($e, true); + } } diff --git a/src/Util/Crypto.php b/src/Util/Crypto.php index 677697b1ec..d6dbbd8b6b 100644 --- a/src/Util/Crypto.php +++ b/src/Util/Crypto.php @@ -215,16 +215,6 @@ class Crypto return $key; } - /** - * @param string $pubkey public key - * @return string - */ - public static function salmonKey($pubkey) - { - self::pemToMe($pubkey, $m, $e); - return 'RSA' . '.' . base64url_encode($m, true) . '.' . base64url_encode($e, true); - } - /** * @param integer $bits number of bits * @return mixed From fe3dac4825a6b0eb5d70cab44fb6b2102d70ac8b Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Sun, 31 Dec 2017 08:29:03 -0500 Subject: [PATCH 54/80] Fix self call was self when in Crypto.. --- src/Protocol/Salmon.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Protocol/Salmon.php b/src/Protocol/Salmon.php index bf349a6808..2bf86f0e36 100644 --- a/src/Protocol/Salmon.php +++ b/src/Protocol/Salmon.php @@ -207,7 +207,7 @@ class Salmon */ public static function salmonKey($pubkey) { - self::pemToMe($pubkey, $m, $e); + Crypto::pemToMe($pubkey, $m, $e); return 'RSA' . '.' . base64url_encode($m, true) . '.' . base64url_encode($e, true); } } From dc5de5adbd84bc8bb9769f2b2d793d9ffece3e76 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Sun, 31 Dec 2017 08:31:06 -0500 Subject: [PATCH 55/80] Public function Make private function public. --- src/Util/Crypto.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Util/Crypto.php b/src/Util/Crypto.php index d6dbbd8b6b..adee8cd60e 100644 --- a/src/Util/Crypto.php +++ b/src/Util/Crypto.php @@ -190,7 +190,7 @@ class Crypto * @param string $e exponent reference * @return void */ - private static function pemToMe($key, &$m, &$e) + public static function pemToMe($key, &$m, &$e) { $lines = explode("\n", $key); unset($lines[0]); From e7c53af6fa3ade7540f03ebc8d701bc5c70bf499 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 31 Dec 2017 20:58:09 -0500 Subject: [PATCH 56/80] Add Module\Oembed and Content\OEmbed --- include/bbcode.php | 7 +- src/Content/OEmbed.php | 352 +++++++++++++++++++++++++++++++++++++++++ src/Module/Oembed.php | 53 +++++++ src/ParseUrl.php | 4 +- src/Protocol/DFRN.php | 3 +- 5 files changed, 413 insertions(+), 6 deletions(-) create mode 100644 src/Content/OEmbed.php create mode 100644 src/Module/Oembed.php diff --git a/include/bbcode.php b/include/bbcode.php index be59c18072..e672001937 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -2,6 +2,7 @@ use Friendica\App; use Friendica\Content\Smilies; +use Friendica\Content\OEmbed; use Friendica\Core\Cache; use Friendica\Core\System; use Friendica\Core\Config; @@ -232,7 +233,7 @@ function tryoembed($match) { $url = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"), array("https://www.youtube.com/", "https://player.vimeo.com/"), $url); - $o = oembed_fetch_url($url); + $o = OEmbed::fetchURL($url); if (!is_object($o)) { return $match[0]; @@ -246,7 +247,7 @@ function tryoembed($match) { return $match[0]; } - $html = oembed_format_object($o); + $html = OEmbed::formatObject($o); return $html; } @@ -1263,7 +1264,7 @@ function bbcode($Text, $preserve_nl = false, $tryoembed = true, $simplehtml = fa // $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '', $Text); // oembed tag - $Text = oembed_bbcode2html($Text); + $Text = OEmbed::BBCode2HTML($Text); // Avoid triple linefeeds through oembed $Text = str_replace("


", "

", $Text); diff --git a/src/Content/OEmbed.php b/src/Content/OEmbed.php new file mode 100644 index 0000000000..db2c130eaf --- /dev/null +++ b/src/Content/OEmbed.php @@ -0,0 +1,352 @@ + normalise_link($embedurl)); + $r = dba::select('oembed', array('content'), $condition, array('limit' => 1)); + + if (DBM::is_result($r)) { + $txt = $r["content"]; + } else { + $txt = Cache::get($a->videowidth . $embedurl); + } + // These media files should now be caught in bbcode.php + // left here as a fallback in case this is called from another source + + $noexts = array("mp3", "mp4", "ogg", "ogv", "oga", "ogm", "webm"); + $ext = pathinfo(strtolower($embedurl), PATHINFO_EXTENSION); + + + if (is_null($txt)) { + $txt = ""; + + if (!in_array($ext, $noexts)) { + // try oembed autodiscovery + $redirects = 0; + $html_text = fetch_url($embedurl, false, $redirects, 15, "text/*"); + if ($html_text) { + $dom = @DOMDocument::loadHTML($html_text); + if ($dom) { + $xpath = new DOMXPath($dom); + $entries = $xpath->query("//link[@type='application/json+oembed']"); + foreach ($entries as $e) { + $href = $e->getAttributeNode("href")->nodeValue; + $txt = fetch_url($href . '&maxwidth=' . $a->videowidth); + break; + } + $entries = $xpath->query("//link[@type='text/json+oembed']"); + foreach ($entries as $e) { + $href = $e->getAttributeNode("href")->nodeValue; + $txt = fetch_url($href . '&maxwidth=' . $a->videowidth); + break; + } + } + } + } + + $txt = trim($txt); + + if ($txt[0] != "{") { + $txt = '{"type":"error"}'; + } else { //save in cache + $j = json_decode($txt); + if ($j->type != "error") { + dba::insert('oembed', array('url' => normalise_link($embedurl), + 'content' => $txt, 'created' => datetime_convert()), true); + } + + Cache::set($a->videowidth . $embedurl, $txt, CACHE_DAY); + } + } + + $j = json_decode($txt); + + if (!is_object($j)) { + return false; + } + + // Always embed the SSL version + if (isset($j->html)) { + $j->html = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"), array("https://www.youtube.com/", "https://player.vimeo.com/"), $j->html); + } + + $j->embedurl = $embedurl; + + // If fetching information doesn't work, then improve via internal functions + if (($j->type == "error") || ($no_rich_type && ($j->type == "rich"))) { + $data = ParseUrl::getSiteinfoCached($embedurl, true, false); + $j->type = $data["type"]; + + if ($j->type == "photo") { + $j->url = $data["url"]; + //$j->width = $data["images"][0]["width"]; + //$j->height = $data["images"][0]["height"]; + } + + if (isset($data["title"])) { + $j->title = $data["title"]; + } + + if (isset($data["text"])) { + $j->description = $data["text"]; + } + + if (is_array($data["images"])) { + $j->thumbnail_url = $data["images"][0]["src"]; + $j->thumbnail_width = $data["images"][0]["width"]; + $j->thumbnail_height = $data["images"][0]["height"]; + } + } + + call_hooks('oembed_fetch_url', $embedurl, $j); + + return $j; + } + + public static function formatObject($j) + { + $embedurl = $j->embedurl; + $jhtml = OEmbed::iframe($j->embedurl, (isset($j->width) ? $j->width : null), (isset($j->height) ? $j->height : null)); + $ret = ""; + switch ($j->type) { + case "video": + if (isset($j->thumbnail_url)) { + $tw = (isset($j->thumbnail_width) && intval($j->thumbnail_width)) ? $j->thumbnail_width : 200; + $th = (isset($j->thumbnail_height) && intval($j->thumbnail_height)) ? $j->thumbnail_height : 180; + // make sure we don't attempt divide by zero, fallback is a 1:1 ratio + $tr = (($th) ? $tw / $th : 1); + + $th = 120; + $tw = $th * $tr; + $tpl = get_markup_template('oembed_video.tpl'); + $ret.=replace_macros($tpl, array( + '$baseurl' => System::baseUrl(), + '$embedurl' => $embedurl, + '$escapedhtml' => base64_encode($jhtml), + '$tw' => $tw, + '$th' => $th, + '$turl' => $j->thumbnail_url, + )); + } else { + $ret = $jhtml; + } + //$ret.="
"; + break; + case "photo": + $ret.= ""; + break; + case "link": + break; + case "rich": + // not so safe.. + if (!Config::get("system", "no_oembed_rich_content")) { + $ret.= proxy_parse_html($jhtml); + } + break; + } + + // add link to source if not present in "rich" type + if ($j->type != 'rich' || !strpos($j->html, $embedurl)) { + $ret .= "

"; + if (isset($j->title)) { + if (isset($j->provider_name)) { + $ret .= $j->provider_name . ": "; + } + + $embedlink = (isset($j->title)) ? $j->title : $embedurl; + $ret .= "$embedlink"; + if (isset($j->author_name)) { + $ret.=" (" . $j->author_name . ")"; + } + } elseif (isset($j->provider_name) || isset($j->author_name)) { + $embedlink = ""; + if (isset($j->provider_name)) { + $embedlink .= $j->provider_name; + } + + if (isset($j->author_name)) { + if ($embedlink != "") { + $embedlink .= ": "; + } + + $embedlink .= $j->author_name; + } + if (trim($embedlink) == "") { + $embedlink = $embedurl; + } + + $ret .= "$embedlink"; + } + //if (isset($j->author_name)) $ret.=" by ".$j->author_name; + //if (isset($j->provider_name)) $ret.=" on ".$j->provider_name; + $ret .= "

"; + } else { + // add for html2bbcode conversion + $ret .= "$embedurl"; + } + $ret.="
"; + $ret = str_replace("\n", "", $ret); + return mb_convert_encoding($ret, 'HTML-ENTITIES', mb_detect_encoding($ret)); + } + + public static function BBCode2HTML($text) + { + $stopoembed = Config::get("system", "no_oembed"); + if ($stopoembed == true) { + return preg_replace("/\[embed\](.+?)\[\/embed\]/is", "" . t('Embedding disabled') . " : $1", $text); + } + return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", ['self', 'replaceCallback'], $text); + } + + /** + * Find .... + * and replace it with [embed]url[/embed] + */ + public static function HTML2BBCode($text) + { + // start parser only if 'oembed' is in text + if (strpos($text, "oembed")) { + + // convert non ascii chars to html entities + $html_text = mb_convert_encoding($text, 'HTML-ENTITIES', mb_detect_encoding($text)); + + // If it doesn't parse at all, just return the text. + $dom = @DOMDocument::loadHTML($html_text); + if (!$dom) { + return $text; + } + $xpath = new DOMXPath($dom); + + $xattr = OEmbed::buildXPath("class", "oembed"); + $entries = $xpath->query("//span[$xattr]"); + + $xattr = "@rel='oembed'"; //oe_build_xpath("rel","oembed"); + foreach ($entries as $e) { + $href = $xpath->evaluate("a[$xattr]/@href", $e)->item(0)->nodeValue; + if (!is_null($href)) { + $e->parentNode->replaceChild(new DOMText("[embed]" . $href . "[/embed]"), $e); + } + } + return OEmbed::getInnerHTML($dom->getElementsByTagName("body")->item(0)); + } else { + return $text; + } + } + + /** + * @brief Generates the iframe HTML for an oembed attachment. + * + * Width and height are given by the remote, and are regularly too small for + * the generated iframe. + * + * The width is entirely discarded for the actual width of the post, while fixed + * height is used as a starting point before the inevitable resizing. + * + * Since the iframe is automatically resized on load, there are no need for ugly + * and impractical scrollbars. + * + * @param string $src Original remote URL to embed + * @param string $width + * @param string $height + * @return string formatted HTML + * + * @see oembed_format_object() + */ + private static function iframe($src, $width, $height) + { + $a = get_app(); + + if (!$height || strstr($height, '%')) { + $height = '200'; + } + $width = '100%'; + + $s = System::baseUrl() . '/oembed/' . base64url_encode($src); + return ''; + } + + /** + * Generates an XPath query to select elements whose provided attribute contains + * the provided value in a space-separated list. + * + * @brief Generates attribute search XPath string + * + * @param string $attr Name of the attribute to seach + * @param string $value Value to search in a space-separated list + * @return string + */ + private static function buildXPath($attr, $value) + { + // https://www.westhoffswelt.de/blog/2009/6/9/select-html-elements-with-more-than-one-css-class-using-xpath + return "contains( normalize-space( @$attr ), ' $value ' ) or substring( normalize-space( @$attr ), 1, string-length( '$value' ) + 1 ) = '$value ' or substring( normalize-space( @$attr ), string-length( @$attr ) - string-length( '$value' ) ) = ' $value' or @$attr = '$value'"; + } + + /** + * Returns the inner XML string of a provided DOMNode + * + * @brief Returns the inner XML string of a provided DOMNode + * + * @param DOMNode $node + * @return string + */ + private static function getInnerHTML(DOMNode $node) + { + $innerHTML = ''; + $children = $node->childNodes; + foreach ($children as $child) { + $innerHTML .= $child->ownerDocument->saveXML($child); + } + return $innerHTML; + } +} diff --git a/src/Module/Oembed.php b/src/Module/Oembed.php new file mode 100644 index 0000000000..f30fb861bc --- /dev/null +++ b/src/Module/Oembed.php @@ -0,0 +1,53 @@ + + */ +class Oembed extends BaseModule +{ + public static function content() + { + $a = self::getApp(); + + // Unused form: /oembed/b2h?url=... + if ($a->argv[1] == 'b2h') { + $url = array("", trim(hex2bin($_REQUEST['url']))); + echo Content\OEmbed::replaceCallback($url); + killme(); + } + + // Unused form: /oembed/h2b?text=... + if ($a->argv[1] == 'h2b') { + $text = trim(hex2bin($_REQUEST['text'])); + echo Content\OEmbed::HTML2BBCode($text); + killme(); + } + + if ($a->argc == 2) { + echo ''; + $url = base64url_decode($a->argv[1]); + $j = Content\OEmbed::fetchURL($url); + + // workaround for media.ccc.de (and any other endpoint that return size 0) + if (substr($j->html, 0, 7) == "html, 'width="0"')) { + $j->html = '' . $j->html; + $j->html = str_replace('width="0"', '', $j->html); + $j->html = str_replace('height="0"', '', $j->html); + } + echo $j->html; + echo ''; + } + killme(); + } +} diff --git a/src/ParseUrl.php b/src/ParseUrl.php index 9e46281ec9..6252e0b68a 100644 --- a/src/ParseUrl.php +++ b/src/ParseUrl.php @@ -5,7 +5,7 @@ */ namespace Friendica; -use Friendica\Core\Config; +use Friendica\Content\OEmbed; use Friendica\Object\Image; use Friendica\Util\XML; @@ -164,7 +164,7 @@ class ParseUrl $body = $data["body"]; if ($do_oembed) { - $oembed_data = oembed_fetch_url($url); + $oembed_data = OEmbed::fetchURL($url); if (!in_array($oembed_data->type, array("error", "rich", ""))) { $siteinfo["type"] = $oembed_data->type; diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 5e9c91645b..1ec0c792e0 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -8,6 +8,7 @@ */ namespace Friendica\Protocol; +use Friendica\Content\OEmbed; use Friendica\Core\Config; use Friendica\Core\System; use Friendica\Core\Worker; @@ -2502,7 +2503,7 @@ class DFRN $item['body'] = html2bb_video($item['body']); - $item['body'] = oembed_html2bbcode($item['body']); + $item['body'] = OEmbed::HTML2BBCode($item['body']); $config = \HTMLPurifier_Config::createDefault(); $config->set('Cache.DefinitionImpl', null); From eb1b6605b7d94e985786f93e910d6dce2dd9bad1 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sun, 31 Dec 2017 20:58:32 -0500 Subject: [PATCH 57/80] Remove include/oembed and mod/oembed --- include/bb2diaspora.php | 1 - include/bbcode.php | 1 - include/items.php | 1 - include/oembed.php | 317 ---------------------------------------- mod/oembed.php | 38 ----- src/ParseUrl.php | 1 - src/Protocol/DFRN.php | 1 - 7 files changed, 360 deletions(-) delete mode 100644 include/oembed.php delete mode 100644 mod/oembed.php diff --git a/include/bb2diaspora.php b/include/bb2diaspora.php index e1a67d432d..714d780048 100644 --- a/include/bb2diaspora.php +++ b/include/bb2diaspora.php @@ -7,7 +7,6 @@ use Friendica\Network\Probe; use League\HTMLToMarkdown\HtmlConverter; -require_once 'include/oembed.php'; require_once 'include/event.php'; require_once 'library/markdown.php'; require_once 'include/html2bbcode.php'; diff --git a/include/bbcode.php b/include/bbcode.php index e672001937..30d0165770 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -9,7 +9,6 @@ use Friendica\Core\Config; use Friendica\Model\Contact; use Friendica\Util\Map; -require_once 'include/oembed.php'; require_once 'include/event.php'; require_once 'mod/proxy.php'; require_once 'include/plaintext.php'; diff --git a/include/items.php b/include/items.php index a3f3c823b7..4d495d3515 100644 --- a/include/items.php +++ b/include/items.php @@ -20,7 +20,6 @@ use Friendica\Protocol\OStatus; use Friendica\Protocol\Feed; require_once 'include/bbcode.php'; -require_once 'include/oembed.php'; require_once 'include/tags.php'; require_once 'include/files.php'; require_once 'include/text.php'; diff --git a/include/oembed.php b/include/oembed.php deleted file mode 100644 index b7c1616fee..0000000000 --- a/include/oembed.php +++ /dev/null @@ -1,317 +0,0 @@ - normalise_link($embedurl)); - $r = dba::select('oembed', array('content'), $condition, array('limit' => 1)); - - if (DBM::is_result($r)) { - $txt = $r["content"]; - } else { - $txt = Cache::get($a->videowidth . $embedurl); - } - // These media files should now be caught in bbcode.php - // left here as a fallback in case this is called from another source - - $noexts = array("mp3", "mp4", "ogg", "ogv", "oga", "ogm", "webm"); - $ext = pathinfo(strtolower($embedurl), PATHINFO_EXTENSION); - - - if (is_null($txt)) { - $txt = ""; - - if (!in_array($ext, $noexts)){ - // try oembed autodiscovery - $redirects = 0; - $html_text = fetch_url($embedurl, false, $redirects, 15, "text/*"); - if ($html_text) { - $dom = @DOMDocument::loadHTML($html_text); - if ($dom) { - $xpath = new DOMXPath($dom); - $attr = "oembed"; - $xattr = oe_build_xpath("class","oembed"); - $entries = $xpath->query("//link[@type='application/json+oembed']"); - foreach ($entries as $e) { - $href = $e->getAttributeNode("href")->nodeValue; - $txt = fetch_url($href . '&maxwidth=' . $a->videowidth); - break; - } - $entries = $xpath->query("//link[@type='text/json+oembed']"); - foreach ($entries as $e) { - $href = $e->getAttributeNode("href")->nodeValue; - $txt = fetch_url($href . '&maxwidth=' . $a->videowidth); - break; - } - } - } - } - - $txt = trim($txt); - - if ($txt[0] != "{") { - $txt = '{"type":"error"}'; - } else { //save in cache - $j = json_decode($txt); - if ($j->type != "error") { - dba::insert('oembed', array('url' => normalise_link($embedurl), - 'content' => $txt, 'created' => datetime_convert()), true); - } - - Cache::set($a->videowidth.$embedurl, $txt, CACHE_DAY); - } - } - - $j = json_decode($txt); - - if (!is_object($j)) { - return false; - } - - // Always embed the SSL version - if (isset($j->html)) { - $j->html = str_replace(array("http://www.youtube.com/", "http://player.vimeo.com/"), - array("https://www.youtube.com/", "https://player.vimeo.com/"), $j->html); - } - - $j->embedurl = $embedurl; - - // If fetching information doesn't work, then improve via internal functions - if (($j->type == "error") || ($no_rich_type && ($j->type == "rich"))) { - $data = ParseUrl::getSiteinfoCached($embedurl, true, false); - $j->type = $data["type"]; - - if ($j->type == "photo") { - $j->url = $data["url"]; - //$j->width = $data["images"][0]["width"]; - //$j->height = $data["images"][0]["height"]; - } - - if (isset($data["title"])) { - $j->title = $data["title"]; - } - - if (isset($data["text"])) { - $j->description = $data["text"]; - } - - if (is_array($data["images"])) { - $j->thumbnail_url = $data["images"][0]["src"]; - $j->thumbnail_width = $data["images"][0]["width"]; - $j->thumbnail_height = $data["images"][0]["height"]; - } - } - - call_hooks('oembed_fetch_url', $embedurl, $j); - - return $j; -} - -function oembed_format_object($j){ - require_once("mod/proxy.php"); - - $embedurl = $j->embedurl; - $jhtml = oembed_iframe($j->embedurl,(isset($j->width) ? $j->width : null), (isset($j->height) ? $j->height : null) ); - $ret=""; - switch ($j->type) { - case "video": - if (isset($j->thumbnail_url)) { - $tw = (isset($j->thumbnail_width) && intval($j->thumbnail_width)) ? $j->thumbnail_width:200; - $th = (isset($j->thumbnail_height) && intval($j->thumbnail_height)) ? $j->thumbnail_height:180; - // make sure we don't attempt divide by zero, fallback is a 1:1 ratio - $tr = (($th) ? $tw/$th : 1); - - $th=120; $tw = $th*$tr; - $tpl=get_markup_template('oembed_video.tpl'); - $ret.=replace_macros($tpl, array( - '$baseurl' => System::baseUrl(), - '$embedurl' => $embedurl, - '$escapedhtml' => base64_encode($jhtml), - '$tw' => $tw, - '$th' => $th, - '$turl' => $j->thumbnail_url, - )); - - } else { - $ret=$jhtml; - } - //$ret.="
"; - break; - case "photo": - $ret.= ""; - break; - case "link": - break; - case "rich": - // not so safe.. - if (!Config::get("system","no_oembed_rich_content")) { - $ret.= proxy_parse_html($jhtml); - } - break; - } - - // add link to source if not present in "rich" type - if ($j->type!='rich' || !strpos($j->html,$embedurl) ){ - $ret .= "

"; - if (isset($j->title)) { - if (isset($j->provider_name)) { - $ret .= $j->provider_name.": "; - } - - $embedlink = (isset($j->title))?$j->title:$embedurl; - $ret .= "$embedlink"; - if (isset($j->author_name)) { - $ret.=" (".$j->author_name.")"; - } - } elseif (isset($j->provider_name) || isset($j->author_name)) { - $embedlink = ""; - if (isset($j->provider_name)) { - $embedlink .= $j->provider_name; - } - - if (isset($j->author_name)) { - if ($embedlink != "") { - $embedlink .= ": "; - } - - $embedlink .= $j->author_name; - } - if (trim($embedlink) == "") { - $embedlink = $embedurl; - } - - $ret .= "$embedlink"; - } - //if (isset($j->author_name)) $ret.=" by ".$j->author_name; - //if (isset($j->provider_name)) $ret.=" on ".$j->provider_name; - $ret .= "

"; - } else { - // add for html2bbcode conversion - $ret .= "$embedurl"; - } - $ret.="
"; - $ret = str_replace("\n","",$ret); - return mb_convert_encoding($ret, 'HTML-ENTITIES', mb_detect_encoding($ret)); -} - -/** - * @brief Generates the iframe HTML for an oembed attachment. - * - * Width and height are given by the remote, and are regularly too small for - * the generated iframe. - * - * The width is entirely discarded for the actual width of the post, while fixed - * height is used as a starting point before the inevitable resizing. - * - * Since the iframe is automatically resized on load, there are no need for ugly - * and impractical scrollbars. - * - * @param string $src Original remote URL to embed - * @param string $width - * @param string $height - * @return string formatted HTML - * - * @see oembed_format_object() - */ -function oembed_iframe($src, $width, $height) { - $a = get_app(); - - if (!$height || strstr($height,'%')) { - $height = '200'; - } - $width = '100%'; - - $s = System::baseUrl() . '/oembed/' . base64url_encode($src); - return ''; -} - - - -function oembed_bbcode2html($text){ - $stopoembed = Config::get("system","no_oembed"); - if ($stopoembed == true){ - return preg_replace("/\[embed\](.+?)\[\/embed\]/is", "". t('Embedding disabled') ." : $1" ,$text); - } - return preg_replace_callback("/\[embed\](.+?)\[\/embed\]/is", 'oembed_replacecb' ,$text); -} - - -function oe_build_xpath($attr, $value){ - // http://westhoffswelt.de/blog/0036_xpath_to_select_html_by_class.html - return "contains( normalize-space( @$attr ), ' $value ' ) or substring( normalize-space( @$attr ), 1, string-length( '$value' ) + 1 ) = '$value ' or substring( normalize-space( @$attr ), string-length( @$attr ) - string-length( '$value' ) ) = ' $value' or @$attr = '$value'"; -} - -function oe_get_inner_html($node) { - $innerHTML= ''; - $children = $node->childNodes; - foreach ($children as $child) { - $innerHTML .= $child->ownerDocument->saveXML($child); - } - return $innerHTML; -} - -/** - * Find .... - * and replace it with [embed]url[/embed] - */ -function oembed_html2bbcode($text) { - // start parser only if 'oembed' is in text - if (strpos($text, "oembed")) { - - // convert non ascii chars to html entities - $html_text = mb_convert_encoding($text, 'HTML-ENTITIES', mb_detect_encoding($text)); - - // If it doesn't parse at all, just return the text. - $dom = @DOMDocument::loadHTML($html_text); - if (! $dom) { - return $text; - } - $xpath = new DOMXPath($dom); - $attr = "oembed"; - - $xattr = oe_build_xpath("class","oembed"); - $entries = $xpath->query("//span[$xattr]"); - - $xattr = "@rel='oembed'";//oe_build_xpath("rel","oembed"); - foreach ($entries as $e) { - $href = $xpath->evaluate("a[$xattr]/@href", $e)->item(0)->nodeValue; - if (!is_null($href)) { - $e->parentNode->replaceChild(new DOMText("[embed]".$href."[/embed]"), $e); - } - } - return oe_get_inner_html( $dom->getElementsByTagName("body")->item(0) ); - } else { - return $text; - } -} diff --git a/mod/oembed.php b/mod/oembed.php deleted file mode 100644 index 3266ad963e..0000000000 --- a/mod/oembed.php +++ /dev/null @@ -1,38 +0,0 @@ -query_string, LOGGER_ALL); - - if ($a->argv[1]=='b2h'){ - $url = array( "", trim(hex2bin($_REQUEST['url']))); - echo oembed_replacecb($url); - killme(); - } - - if ($a->argv[1]=='h2b'){ - $text = trim(hex2bin($_REQUEST['text'])); - echo oembed_html2bbcode($text); - killme(); - } - - if ($a->argc == 2){ - echo ""; - $url = base64url_decode($a->argv[1]); - $j = oembed_fetch_url($url); - - // workaround for media.ccc.de (and any other endpoint that return size 0) - if (substr($j->html, 0, 7) == "html, 'width="0"')) { - $j->html = ''. $j->html; - $j->html = str_replace('width="0"', '', $j->html); - $j->html = str_replace('height="0"', '', $j->html); - } - echo $j->html; -// logger('mod-oembed ' . $j->html, LOGGER_ALL); - echo ""; - } - killme(); -} diff --git a/src/ParseUrl.php b/src/ParseUrl.php index 6252e0b68a..0c67589ddf 100644 --- a/src/ParseUrl.php +++ b/src/ParseUrl.php @@ -15,7 +15,6 @@ use DOMDocument; require_once 'include/dba.php'; require_once "include/network.php"; -require_once "include/oembed.php"; /** * @brief Class with methods for extracting certain content from an url diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 1ec0c792e0..752921424c 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -34,7 +34,6 @@ require_once "include/tags.php"; require_once "include/files.php"; require_once "include/event.php"; require_once "include/text.php"; -require_once "include/oembed.php"; require_once "include/html2bbcode.php"; require_once "include/bbcode.php"; From 23e38cd559764db98fd5bab164d8494ab2a64580 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 1 Jan 2018 17:29:50 -0500 Subject: [PATCH 58/80] Revert "Updated hcard with the new feed links" This reverts commit cc8493965875e6693061c6c770d96ca137695212. --- mod/hcard.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mod/hcard.php b/mod/hcard.php index 9c1f348a27..f8d4cfc3bf 100644 --- a/mod/hcard.php +++ b/mod/hcard.php @@ -45,9 +45,7 @@ function hcard_init(App $a) { } $a->page['htmlhead'] .= '' . "\r\n" ; - $a->page['htmlhead'] .= '' . "\r\n"; - $a->page['htmlhead'] .= '' . "\r\n"; - $a->page['htmlhead'] .= '' . "\r\n"; + $a->page['htmlhead'] .= '' . "\r\n" ; $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . (($a->path) ? '/' . $a->path : '')); $a->page['htmlhead'] .= '' . "\r\n"; header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false); From 7e2a08c7bce16ff7b36ede087cd13809262f2d61 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 1 Jan 2018 17:43:03 -0500 Subject: [PATCH 59/80] Review changes - Add file comment in Content\OEmbed - Add self where relevant - Remove useless spaces from the XPath expression --- src/Content/OEmbed.php | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Content/OEmbed.php b/src/Content/OEmbed.php index db2c130eaf..020d3b9b76 100644 --- a/src/Content/OEmbed.php +++ b/src/Content/OEmbed.php @@ -1,9 +1,7 @@ */ class OEmbed { public static function replaceCallback($matches) { $embedurl = $matches[1]; - $j = OEmbed::fetchURL($embedurl); - $s = OEmbed::formatObject($j); + $j = self::fetchURL($embedurl); + $s = self::formatObject($j); return $s; } @@ -157,7 +160,7 @@ class OEmbed public static function formatObject($j) { $embedurl = $j->embedurl; - $jhtml = OEmbed::iframe($j->embedurl, (isset($j->width) ? $j->width : null), (isset($j->height) ? $j->height : null)); + $jhtml = self::iframe($j->embedurl, (isset($j->width) ? $j->width : null), (isset($j->height) ? $j->height : null)); $ret = ""; switch ($j->type) { case "video": @@ -268,7 +271,7 @@ class OEmbed } $xpath = new DOMXPath($dom); - $xattr = OEmbed::buildXPath("class", "oembed"); + $xattr = self::buildXPath("class", "oembed"); $entries = $xpath->query("//span[$xattr]"); $xattr = "@rel='oembed'"; //oe_build_xpath("rel","oembed"); @@ -278,7 +281,7 @@ class OEmbed $e->parentNode->replaceChild(new DOMText("[embed]" . $href . "[/embed]"), $e); } } - return OEmbed::getInnerHTML($dom->getElementsByTagName("body")->item(0)); + return self::getInnerHTML($dom->getElementsByTagName("body")->item(0)); } else { return $text; } @@ -329,7 +332,7 @@ class OEmbed private static function buildXPath($attr, $value) { // https://www.westhoffswelt.de/blog/2009/6/9/select-html-elements-with-more-than-one-css-class-using-xpath - return "contains( normalize-space( @$attr ), ' $value ' ) or substring( normalize-space( @$attr ), 1, string-length( '$value' ) + 1 ) = '$value ' or substring( normalize-space( @$attr ), string-length( @$attr ) - string-length( '$value' ) ) = ' $value' or @$attr = '$value'"; + return "contains(normalize-space(@$attr), ' $value ') or substring(normalize-space(@$attr), 1, string-length('$value') + 1) = '$value ' or substring(normalize-space(@$attr), string-length(@$attr) - string-length('$value')) = ' $value' or @$attr = '$value'"; } /** From 49eda1e154a3481ead99aa833ae314a8952ce7f4 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 1 Jan 2018 14:50:47 -0500 Subject: [PATCH 60/80] Add defaults() function --- boot.php | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/boot.php b/boot.php index 199ca05551..a9d5ffdb88 100644 --- a/boot.php +++ b/boot.php @@ -572,6 +572,51 @@ function x($s, $k = null) } } +/** + * Return the provided variable value if it exists and is truthy or the provided + * default value instead. + * + * Works with initialized variables and potentially uninitialized array keys + * + * Usages: + * - defaults($var, $default) + * - defaults($array, 'key', $default) + * + * @brief Returns a defaut value if the provided variable or array key is falsy + * @see x() + * @return mixed + */ +function defaults() { + $args = func_get_args(); + + if (count($args) < 2) { + throw new BadFunctionCallException('defaults() requires at least 2 parameters'); + } + if (count($args) > 3) { + throw new BadFunctionCallException('defaults() cannot use more than 3 parameters'); + } + if (count($args) === 3 && !is_array($args[0])) { + throw new BadFunctionCallException('defaults($arr, $key, $def) requires an array as first parameter'); + } + if (count($args) === 3 && is_null($args[1])) { + throw new BadFunctionCallException('defaults($arr, $key, $def) $key is null'); + } + + $default = array_pop($args); + + if (call_user_func_array('x', $args)) { + if (count($args) === 1) { + $return = $args[0]; + } else { + $return = $args[0][$args[1]]; + } + } else { + $return = $default; + } + + return $return; +} + /** * @brief Returns the baseurl. * From 54d598ce7c66308dbcf5d5aa0b14b3aec73885a8 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 1 Jan 2018 15:05:09 -0500 Subject: [PATCH 61/80] Fix formatting and PHP Notice in frio theme - Fix undefined variable $a->install in frio/style - Removed unused $args assignments in frio/theme - Removed unused $sql_extra2 variable in frio_acl_lookup() --- view/theme/frio/style.php | 13 +++-- view/theme/frio/theme.php | 112 +++++++++++++++++++------------------- 2 files changed, 65 insertions(+), 60 deletions(-) diff --git a/view/theme/frio/style.php b/view/theme/frio/style.php index 04379b244e..a7b8c8a9d8 100644 --- a/view/theme/frio/style.php +++ b/view/theme/frio/style.php @@ -8,7 +8,7 @@ $schemecss = ""; $schemecssfile = false; $scheme_modified = 0; -if (! $a->install) { +if ($a->module !== 'install') { // Get the UID of the profile owner. $uid = get_theme_uid(); if ($uid) { @@ -57,7 +57,7 @@ if (! $a->install) { // Setting $schema to '' wasn't working for some reason, so we'll check it's // not --- like the mobile theme does instead. // Allow layouts to over-ride the schema. -if ($_REQUEST['schema']) { +if (x($_REQUEST, 'schema')) { $schema = $_REQUEST['schema']; } @@ -103,7 +103,7 @@ $contentbg_transp = ((isset($contentbg_transp) && $contentbg_transp != "") ? $co // Calculate some colors in dependance of existing colors. // Some colors are calculated to don't have too many selection // fields in the theme settings. -if (! $menu_background_hover_color) { +if (!isset($menu_background_hover_color)) { $mbhc = new Color($nav_bg); $mcolor = $mbhc->getHex(); @@ -115,7 +115,7 @@ if (! $menu_background_hover_color) { $menu_background_hover_color = '#' . $mbhc->lighten(5); } } -if (! $nav_icon_hover_color) { +if (!isset($nav_icon_hover_color)) { $nihc = new Color($nav_bg); if ($nihc->isLight()) { @@ -124,7 +124,7 @@ if (! $nav_icon_hover_color) { $nav_icon_hover_color = '#' . $nihc->lighten(10); } } -if (! $link_hover_color) { +if (!isset($link_hover_color)) { $lhc = new Color($link_color); $lcolor = $lhc->getHex(); @@ -137,6 +137,9 @@ if (! $link_hover_color) { } // Convert $bg_image_options into css. +if (!isset($bg_image_option)) { + $bg_image_option = null; +} switch ($bg_image_option) { case "stretch": $background_size_img = "100%"; diff --git a/view/theme/frio/theme.php b/view/theme/frio/theme.php index 8b17130269..c529b1f98e 100644 --- a/view/theme/frio/theme.php +++ b/view/theme/frio/theme.php @@ -1,4 +1,5 @@ ReadMe. @@ -18,8 +19,8 @@ $frio = "view/theme/frio"; global $frio; -function frio_init(App $a) { - +function frio_init(App $a) +{ // disable the events module link in the profile tab $a->theme_events_in_profile = false; @@ -35,19 +36,21 @@ function frio_init(App $a) { // if the device is a mobile device set js is_mobile // variable so the js scripts can use this information - if($a->is_mobile || $a->is_tablet) { + if ($a->is_mobile || $a->is_tablet) { $a->page["htmlhead"] .= <<< EOT EOT; -} + } - if ($style == "") + if ($style == "") { $style = Config::get('frio', 'style'); + } } -function frio_install() { +function frio_install() +{ register_hook('prepare_body_final', 'view/theme/frio/theme.php', 'frio_item_photo_links'); register_hook('item_photo_menu', 'view/theme/frio/theme.php', 'frio_item_photo_menu'); register_hook('contact_photo_menu', 'view/theme/frio/theme.php', 'frio_contact_photo_menu'); @@ -58,7 +61,8 @@ function frio_install() { logger("installed theme frio"); } -function frio_uninstall() { +function frio_uninstall() +{ unregister_hook('prepare_body_final', 'view/theme/frio/theme.php', 'frio_item_photo_links'); unregister_hook('item_photo_menu', 'view/theme/frio/theme.php', 'frio_item_photo_menu'); unregister_hook('contact_photo_menu', 'view/theme/frio/theme.php', 'frio_contact_photo_menu'); @@ -68,6 +72,7 @@ function frio_uninstall() { logger("uninstalled theme frio"); } + /** * @brief Replace friendica photo links hook * @@ -86,19 +91,19 @@ function frio_item_photo_links(App $a, &$body_info) $occurence = 1; $p = bb_find_open_close($body_info['html'], ""); - while($p !== false && ($occurence++ < 500)) { + while ($p !== false && ($occurence++ < 500)) { $link = substr($body_info['html'], $p['start'], $p['end'] - $p['start']); $matches = array(); preg_match("/\/photos\/[\w]+\/image\/([\w]+)/", $link, $matches); - if($matches) { + if ($matches) { // Replace the link for the photo's page with a direct link to the photo itself $newlink = str_replace($matches[0], "/photo/{$matches[1]}", $link); // Add a "quiet" parameter to any redir links to prevent the "XX welcomes YY" info boxes $newlink = preg_replace("/href=\"([^\"]+)\/redir\/([^\"]+)&url=([^\"]+)\"/", 'href="$1/redir/$2&quiet=1&url=$3"', $newlink); - // Having any arguments to the link for Colorbox causes it to fetch base64 code instead of the image + // Having any arguments to the link for Colorbox causes it to fetch base64 code instead of the image $newlink = preg_replace("/\/[?&]zrl=([^&\"]+)/", '', $newlink); $body_info['html'] = str_replace($link, $newlink, $body_info['html']); @@ -118,15 +123,14 @@ function frio_item_photo_links(App $a, &$body_info) * @param App $a Unused but required by the hook definition * @param array $arr Contains item data and the original photo_menu */ -function frio_item_photo_menu(App $a, &$arr) { - - foreach($arr["menu"] as $k =>$v) { - if(strpos($v,'poke/?f=&c=') === 0 || strpos($v,'message/new/') === 0) { +function frio_item_photo_menu(App $a, &$arr) +{ + foreach ($arr["menu"] as $k => $v) { + if (strpos($v, 'poke/?f=&c=') === 0 || strpos($v, 'message/new/') === 0) { $v = "javascript:addToModal('" . $v . "'); return false;"; $arr["menu"][$k] = $v; } } - $args = array('item' => $item, 'menu' => $menu); } /** @@ -141,12 +145,8 @@ function frio_item_photo_menu(App $a, &$arr) { * @param App $a The app data * @param array $args Contains contact data and the original photo_menu */ -function frio_contact_photo_menu(App $a, &$args){ - - $pokelink = ""; - $pmlink = ""; - $cid = ""; - +function frio_contact_photo_menu(App $a, &$args) +{ $cid = $args["contact"]["id"]; $pokelink = $args["menu"]["poke"][1]; $pmlink = $args["menu"]["pm"][1]; @@ -160,8 +160,8 @@ function frio_contact_photo_menu(App $a, &$args){ // The value for opening in a new tab is e.g. when // $args["menu"]["status"][2] is true. If the value of the [2] key is true // and if it's a friendica contact we set it to false - foreach($args["menu"] as $k =>$v) { - if($k === "status" || $k === "profile" || $k === "photos") { + foreach ($args["menu"] as $k => $v) { + if ($k === "status" || $k === "profile" || $k === "photos") { $v[2] = (($args["contact"]["network"] === "dfrn") ? false : true); $args["menu"][$k][2] = $v[2]; } @@ -170,13 +170,13 @@ function frio_contact_photo_menu(App $a, &$args){ // Add to pm and poke links a new key with the value 'modal'. // Later we can make conditions in the corresponing templates (e.g. // contact_template.tpl) - if(strpos($pokelink,'poke/?f=&c='. $cid) !== false) + if (strpos($pokelink, 'poke/?f=&c=' . $cid) !== false) { $args["menu"]["poke"][3] = "modal"; + } - if(strpos($pmlink,'message/new/' . $cid) !== false) + if (strpos($pmlink, 'message/new/' . $cid) !== false) { $args["menu"]["pm"][3] = "modal"; - - $args = array('contact' => $contact, 'menu' => &$menu); + } } /** @@ -193,11 +193,13 @@ function frio_contact_photo_menu(App $a, &$args){ * @param App $a The App class * @param array $nav The original nav menu */ -function frio_remote_nav($a,&$nav) { +function frio_remote_nav($a, &$nav) +{ // get the homelink from $_XSESSION $homelink = get_my_url(); - if(! $homelink) - $homelink = ((x($_SESSION,'visitor_home')) ? $_SESSION['visitor_home'] : ''); + if (!$homelink) { + $homelink = defaults($_SESSION, 'visitor_home', ''); + } // split up the url in it's parts (protocol,domain/directory, /profile/, nickname // I'm not familiar with regex, so someone might find a better solutionen @@ -213,7 +215,7 @@ function frio_remote_nav($a,&$nav) { // And construct a webbie (e.g. mickey@friendica.domain.com for the search in gcontact // We use the webbie for search in gcontact because we don't know if gcontact table stores // the right value if its http or https protocol - if(count($url_parts)) { + if (count($url_parts)) { $server_url = $url_parts[1] . $url_parts[2]; $webbie = $url_parts[4] . '@' . $url_parts[2]; } @@ -228,11 +230,9 @@ function frio_remote_nav($a,&$nav) { $r[0]['photo'] = (DBM::is_result($r) ? $a->remove_baseurl($r[0]['micro']) : "images/person-48.jpg"); $r[0]['name'] = $a->user['username']; - } elseif (!local_user() && remote_user()) { $r = q("SELECT `name`, `nick`, `micro` AS `photo` FROM `contact` WHERE `id` = %d", intval(remote_user())); $nav['remote'] = t("Guest"); - } elseif (get_my_url()) { $r = q("SELECT `name`, `nick`, `photo` FROM `gcontact` WHERE `addr` = '%s' AND `network` = 'dfrn'", @@ -243,18 +243,18 @@ function frio_remote_nav($a,&$nav) { } if (DBM::is_result($r)) { - $nav['userinfo'] = array( - 'icon' => (DBM::is_result($r) ? $r[0]['photo'] : "images/person-48.jpg"), - 'name' => $r[0]['name'], - ); - } + $nav['userinfo'] = array( + 'icon' => (DBM::is_result($r) ? $r[0]['photo'] : "images/person-48.jpg"), + 'name' => $r[0]['name'], + ); + } if (!local_user() && !empty($server_url)) { $nav['logout'] = Array($server_url . '/logout', t('Logout'), "", t('End this session')); // user menu $nav['usermenu'][] = Array($server_url . '/profile/' . $a->user['nickname'], t('Status'), "", t('Your posts and conversations')); - $nav['usermenu'][] = Array($server_url . '/profile/' . $a->user['nickname']. '?tab=profile', t('Profile'), "", t('Your profile page')); + $nav['usermenu'][] = Array($server_url . '/profile/' . $a->user['nickname'] . '?tab=profile', t('Profile'), "", t('Your profile page')); $nav['usermenu'][] = Array($server_url . '/photos/' . $a->user['nickname'], t('Photos'), "", t('Your photos')); $nav['usermenu'][] = Array($server_url . '/videos/' . $a->user['nickname'], t('Videos'), "", t('Your videos')); $nav['usermenu'][] = Array($server_url . '/events/', t('Events'), "", t('Your events')); @@ -263,11 +263,12 @@ function frio_remote_nav($a,&$nav) { $nav['network'] = array($server_url . '/network', t('Network'), "", t('Conversations from your friends')); $nav['events'] = Array($server_url . '/events', t('Events'), "", t('Events and Calendar')); $nav['messages'] = array($server_url . '/message', t('Messages'), "", t('Private mail')); - $nav['settings'] = array($server_url . '/settings', t('Settings'),"", t('Account settings')); - $nav['contacts'] = array($server_url . '/contacts', t('Contacts'),"", t('Manage/edit friends and contacts')); + $nav['settings'] = array($server_url . '/settings', t('Settings'), "", t('Account settings')); + $nav['contacts'] = array($server_url . '/contacts', t('Contacts'), "", t('Manage/edit friends and contacts')); $nav['sitename'] = $a->config['sitename']; } } + /** * @brief: Search for contacts * @@ -281,10 +282,11 @@ function frio_remote_nav($a,&$nav) { * @param App $a The app data @TODO Unused * @param array $results The array with the originals from acl_lookup() */ -function frio_acl_lookup(App $a, &$results) { - require_once("mod/contacts.php"); +function frio_acl_lookup(App $a, &$results) +{ + require_once 'mod/contacts.php'; - $nets = ((x($_GET,"nets")) ? notags(trim($_GET["nets"])) : ""); + $nets = x($_GET, "nets") ? notags(trim($_GET["nets"])) : ""; // we introduce a new search type, r should do the same query like it's // done in /mod/contacts for connections @@ -295,17 +297,17 @@ function frio_acl_lookup(App $a, &$results) { $search_txt = dbesc(protect_sprintf(preg_quote($search))); $searching = true; } - $sql_extra .= (($searching) ? " AND (`attag` LIKE '%%".dbesc($search_txt)."%%' OR `name` LIKE '%%".dbesc($search_txt)."%%' OR `nick` LIKE '%%".dbesc($search_txt)."%%') " : ""); + $sql_extra = ''; + if ($searching) { + $sql_extra .= " AND (`attag` LIKE '%%" . dbesc($search_txt) . "%%' OR `name` LIKE '%%" . dbesc($search_txt) . "%%' OR `nick` LIKE '%%" . dbesc($search_txt) . "%%') "; + } if ($nets) { $sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets)); } - $sql_extra2 = ((($sort_type > 0) && ($sort_type <= CONTACT_IS_FRIEND)) ? sprintf(" AND `rel` = %d ",intval($sort_type)) : ''); - - $r = q("SELECT COUNT(*) AS `total` FROM `contact` - WHERE `uid` = %d AND NOT `self` AND NOT `pending` $sql_extra $sql_extra2 ", + WHERE `uid` = %d AND NOT `self` AND NOT `pending` $sql_extra ", intval($_SESSION['uid'])); if (DBM::is_result($r)) { $total = $r[0]["total"]; @@ -313,7 +315,7 @@ function frio_acl_lookup(App $a, &$results) { $sql_extra3 = unavailable_networks(); - $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND NOT `self` AND NOT `pending` $sql_extra $sql_extra2 $sql_extra3 ORDER BY `name` ASC LIMIT 100 ", + $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND NOT `self` AND NOT `pending` $sql_extra $sql_extra3 ORDER BY `name` ASC LIMIT 100 ", intval($_SESSION['uid']) ); @@ -332,19 +334,19 @@ function frio_acl_lookup(App $a, &$results) { /** * @brief Manipulate the data of the item - * + * * At the moment we use this function to add some own stuff to the item menu - * + * * @param App $a App $a The app data * @param array $arr Array with the item and the item actions
* 'item' => Array with item data
* 'output' => Array with item actions
*/ -function frio_display_item(App $a,&$arr) { - +function frio_display_item(App $a, &$arr) +{ // Add subthread to the item menu $subthread = array(); - if ((local_user()) && local_user() == $arr['item']['uid'] && $arr['item']['parent'] == $arr['item']['id'] && (! $arr['item']['self'])) { + if (local_user() == $arr['item']['uid'] && $arr['item']['parent'] == $arr['item']['id'] && !$arr['item']['self']) { $subthread = array( 'menu' => 'follow_thread', 'title' => t('Follow Thread'), From 585c00347d501b3f61c2c0bd662fd7b2562f9ac9 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 1 Jan 2018 15:08:00 -0500 Subject: [PATCH 62/80] Fix PHP notices in boot, index and App - Use defaults() with $_GET variables in boot - Initialize $a before checking for object member in boot - Initilialize the $_SESSION variable for backend mode in index - Add member variable page_offset to App --- boot.php | 12 +++++------- index.php | 3 ++- src/App.php | 1 + 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/boot.php b/boot.php index a9d5ffdb88..73a1ef1007 100644 --- a/boot.php +++ b/boot.php @@ -1635,14 +1635,11 @@ function argv($x) function infinite_scroll_data($module) { if (PConfig::get(local_user(), 'system', 'infinite_scroll') - && ($module == "network") && ($_GET["mode"] != "minimal") + && $module == 'network' + && defaults($_GET, 'mode', '') != 'minimal' ) { // get the page number - if (is_string($_GET["page"])) { - $pageno = $_GET["page"]; - } else { - $pageno = 1; - } + $pageno = defaults($_GET, 'page', 1); $reload_uri = ""; @@ -1653,7 +1650,8 @@ function infinite_scroll_data($module) } } - if (($a->page_offset != "") && ! strstr($reload_uri, "&offset=")) { + $a = get_app(); + if ($a->page_offset != "" && !strstr($reload_uri, "&offset=")) { $reload_uri .= "&offset=" . urlencode($a->page_offset); } diff --git a/index.php b/index.php index 9cbbad605a..a20646cb0f 100644 --- a/index.php +++ b/index.php @@ -97,6 +97,7 @@ if (!$a->is_backend()) { session_start(); $a->save_timestamp($stamp1, "parser"); } else { + $_SESSION = []; Worker::executeIfIdle(); } @@ -148,7 +149,7 @@ if ((x($_GET, 'zrl')) && (!$install && !$maintenance)) { // header('Link: <' . System::baseUrl() . '/amcd>; rel="acct-mgmt";'); -if (x($_COOKIE["Friendica"]) || (x($_SESSION, 'authenticated')) || (x($_POST, 'auth-params')) || ($a->module === 'login')) { +if (x($_COOKIE, "Friendica") || (x($_SESSION, 'authenticated')) || (x($_POST, 'auth-params')) || ($a->module === 'login')) { require "include/auth.php"; } diff --git a/src/App.php b/src/App.php index c32cf79d98..f9f4434490 100644 --- a/src/App.php +++ b/src/App.php @@ -37,6 +37,7 @@ class App { public $query_string; public $config; public $page; + public $page_offset; public $profile; public $profile_uid; public $user; From 66dbef93e3031da5cab37c01adb9a82f414809bc Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 1 Jan 2018 15:10:20 -0500 Subject: [PATCH 63/80] Fix formatting and PHP notices in bb_ShareAttributes - Use x() to check for existence of key in $matches - Remove unused $reldate from template shared_content --- include/bbcode.php | 131 +++++++++++++++++------------- view/templates/shared_content.tpl | 1 - 2 files changed, 73 insertions(+), 59 deletions(-) diff --git a/include/bbcode.php b/include/bbcode.php index 30d0165770..ef7053010d 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -435,60 +435,67 @@ function bb_replace_images($body, $images) { return $newbody; } -function bb_ShareAttributes($share, $simplehtml) { +function bb_ShareAttributes($share, $simplehtml) +{ $attributes = $share[2]; $author = ""; preg_match("/author='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") - $author = html_entity_decode($matches[1],ENT_QUOTES,'UTF-8'); + if (x($matches, 1)) { + $author = html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8'); + } preg_match('/author="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $author = $matches[1]; + } $profile = ""; preg_match("/profile='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $profile = $matches[1]; + } preg_match('/profile="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $profile = $matches[1]; + } $avatar = ""; preg_match("/avatar='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $avatar = $matches[1]; + } preg_match('/avatar="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $avatar = $matches[1]; + } $link = ""; preg_match("/link='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $link = $matches[1]; + } preg_match('/link="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $link = $matches[1]; + } $posted = ""; $itemcache = get_itemcachepath(); preg_match("/posted='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $posted = $matches[1]; + } preg_match('/posted="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") + if (x($matches, 1)) { $posted = $matches[1]; - - // relative dates only make sense when they aren't cached - if ($itemcache == "") - $reldate = (($posted) ? " " . relative_date($posted) : ''); + } // We only call this so that a previously unknown contact can be added. // This is important for the function "get_contact_details_by_url". @@ -497,99 +504,107 @@ function bb_ShareAttributes($share, $simplehtml) { $data = Contact::getDetailsByURL($profile); - if (isset($data["name"]) && ($data["name"] != "") && isset($data["addr"]) && ($data["addr"] != "")) - $userid_compact = $data["name"]." (".$data["addr"].")"; - else - $userid_compact = GetProfileUsername($profile,$author, true); + if (x($data, "name") && x($data, "addr")) { + $userid_compact = $data["name"] . " (" . $data["addr"] . ")"; + } else { + $userid_compact = GetProfileUsername($profile, $author, true); + } - if (isset($data["addr"]) && ($data["addr"] != "")) + if (x($data, "addr")) { $userid = $data["addr"]; - else - $userid = GetProfileUsername($profile,$author, false); + } else { + $userid = GetProfileUsername($profile, $author, false); + } - if (isset($data["name"]) && ($data["name"] != "")) + if (x($data, "name")) { $author = $data["name"]; + } - if (isset($data["micro"]) && ($data["micro"] != "")) + if (x($data, "micro")) { $avatar = $data["micro"]; + } $preshare = trim($share[1]); - if ($preshare != "") + if ($preshare != "") { $preshare .= "

"; + } switch ($simplehtml) { case 1: - $text = $preshare.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8').' '.$userid.":
»".$share[3]."«"; + $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid . ":
»" . $share[3] . "«"; break; case 2: - $text = $preshare.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8').' '.$userid_compact.":
".$share[3]; + $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid_compact . ":
" . $share[3]; break; case 3: // Diaspora - $headline .= ''.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8').$userid.':
'; + $headline .= '' . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . $userid . ':
'; $text = trim($share[1]); - if ($text != "") + if ($text != "") { $text .= "
"; + } if (substr(normalise_link($link), 0, 19) != "http://twitter.com/") { - $text .= $headline.'
'.trim($share[3])."

"; + $text .= $headline . '
' . trim($share[3]) . "

"; - if ($link != "") - $text .= '
[l]'; - } else - $text .= '
'.$link.''; + if ($link != "") { + $text .= '
[l]'; + } + } else { + $text .= '
' . $link . ''; + } break; case 4: - $headline .= '
'.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); - $headline .= sprintf(t('%2$s %3$s'), $link, $userid, $posted); + $headline .= '
' . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8'); + $headline .= t('%2$s %3$s', $link, $userid, $posted); $headline .= ":
"; $text = trim($share[1]); - if ($text != "") + if ($text != "") { $text .= "
"; + } - $text .= $headline.'
'.trim($share[3])."

"; + $text .= $headline . '
' . trim($share[3]) . "

"; break; case 5: - $text = $preshare.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8').' '.$userid_compact.":
".$share[3]; + $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid_compact . ":
" . $share[3]; break; case 6: // app.net - $text = $preshare.">> @".$userid_compact.":
".$share[3]; + $text = $preshare . ">> @" . $userid_compact . ":
" . $share[3]; break; case 7: // statusnet/GNU Social - $text = $preshare.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8')." @".$userid_compact.": ".$share[3]; + $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . " @" . $userid_compact . ": " . $share[3]; break; case 8: // twitter - $text = $preshare."RT @".$userid_compact.": ".$share[3]; + $text = $preshare . "RT @" . $userid_compact . ": " . $share[3]; break; case 9: // Google+/Facebook - $text = $preshare.html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8').' '.$userid_compact.":
".$share[3]; + $text = $preshare . html_entity_decode("♲ ", ENT_QUOTES, 'UTF-8') . ' ' . $userid_compact . ":
" . $share[3]; - if ($link != "") - $text .= "

".$link; + if ($link != "") { + $text .= "

" . $link; + } break; default: - $text = trim($share[1])."\n"; + $text = trim($share[1]) . "\n"; $avatar = proxy_url($avatar, false, PROXY_SIZE_THUMB); $tpl = get_markup_template('shared_content.tpl'); - $text .= replace_macros($tpl, - array( - '$profile' => $profile, - '$avatar' => $avatar, - '$author' => $author, - '$link' => $link, - '$posted' => $posted, - '$reldate' => $reldate, - '$content' => trim($share[3]) - ) - ); + $text .= replace_macros($tpl, array( + '$profile' => $profile, + '$avatar' => $avatar, + '$author' => $author, + '$link' => $link, + '$posted' => $posted, + '$content' => trim($share[3]) + ) + ); break; } diff --git a/view/templates/shared_content.tpl b/view/templates/shared_content.tpl index d3df6321ab..ee78f842c0 100644 --- a/view/templates/shared_content.tpl +++ b/view/templates/shared_content.tpl @@ -5,7 +5,6 @@ {{/if}} - {{*{{$author}} wrote the following post{{$reldate}}:*}} From 3069f3b59d5e8b4400ae17baadb2358b9217ece3 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 1 Jan 2018 15:27:33 -0500 Subject: [PATCH 64/80] Fix formatting and PHP notices in include/conversation - Remove unused $nickname variable - Remove unused $comment variable - Use defaults() in get_responses() to check for array key existence --- include/conversation.php | 161 ++++++++++++++++++--------------------- 1 file changed, 76 insertions(+), 85 deletions(-) diff --git a/include/conversation.php b/include/conversation.php index ee68d8f5c9..958d507d78 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -545,8 +545,10 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { $profile_owner = $a->profile['profile_uid']; if (!$update) { - $tab = notags(trim($_GET['tab'])); - $tab = ( $tab ? $tab : 'posts' ); + $tab = 'posts'; + if (x($_GET, 'tab')) { + $tab = notags(trim($_GET['tab'])); + } if ($tab === 'posts') { /* * This is ugly, but we can't pass the profile_uid through the session to the ajax updater, @@ -647,20 +649,10 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { $threadsid++; - $comment = ''; $owner_url = ''; $owner_name = ''; $sparkle = ''; - if ($mode === 'search' || $mode === 'community') { - if (((activity_match($item['verb'], ACTIVITY_LIKE)) || (activity_match($item['verb'], ACTIVITY_DISLIKE))) - && ($item['id'] != $item['parent'])) - continue; - $nickname = $item['nickname']; - } else { - $nickname = $a->user['nickname']; - } - // prevent private email from leaking. if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) { continue; @@ -813,7 +805,6 @@ function conversation(App $a, $items, $mode, $update, $preview = false) { 'like' => '', 'dislike' => '', 'comment' => '', - //'conv' => (($preview) ? '' : array('href'=> 'display/' . $nickname . '/' . $item['id'], 'title'=> t('View in context'))), 'conv' => (($preview) ? '' : array('href'=> 'display/'.$item['guid'], 'title'=> t('View in context'))), 'previewing' => $previewing, 'wait' => t('Please wait'), @@ -1197,39 +1188,40 @@ function format_like($cnt, array $arr, $type, $id) { return $o; } -function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { +function status_editor(App $a, $x, $notes_cid = 0, $popup = false) +{ $o = ''; - $geotag = (x($x, 'allow_location') ? replace_macros(get_markup_template('jot_geotag.tpl'), array()) : ''); + $geotag = x($x, 'allow_location') ? replace_macros(get_markup_template('jot_geotag.tpl'), array()) : ''; $tpl = get_markup_template('jot-header.tpl'); $a->page['htmlhead'] .= replace_macros($tpl, array( - '$newpost' => 'true', - '$baseurl' => System::baseUrl(true), - '$geotag' => $geotag, - '$nickname' => $x['nickname'], - '$ispublic' => t('Visible to everybody'), - '$linkurl' => t('Please enter a link URL:'), - '$vidurl' => t("Please enter a video link/URL:"), - '$audurl' => t("Please enter an audio link/URL:"), - '$term' => t('Tag term:'), - '$fileas' => t('Save to Folder:'), + '$newpost' => 'true', + '$baseurl' => System::baseUrl(true), + '$geotag' => $geotag, + '$nickname' => $x['nickname'], + '$ispublic' => t('Visible to everybody'), + '$linkurl' => t('Please enter a link URL:'), + '$vidurl' => t("Please enter a video link/URL:"), + '$audurl' => t("Please enter an audio link/URL:"), + '$term' => t('Tag term:'), + '$fileas' => t('Save to Folder:'), '$whereareu' => t('Where are you right now?'), - '$delitems' => t('Delete item(s)?') + '$delitems' => t('Delete item(s)?') )); $tpl = get_markup_template('jot-end.tpl'); $a->page['end'] .= replace_macros($tpl, array( - '$newpost' => 'true', - '$baseurl' => System::baseUrl(true), - '$geotag' => $geotag, - '$nickname' => $x['nickname'], - '$ispublic' => t('Visible to everybody'), - '$linkurl' => t('Please enter a link URL:'), - '$vidurl' => t("Please enter a video link/URL:"), - '$audurl' => t("Please enter an audio link/URL:"), - '$term' => t('Tag term:'), - '$fileas' => t('Save to Folder:'), + '$newpost' => 'true', + '$baseurl' => System::baseUrl(true), + '$geotag' => $geotag, + '$nickname' => $x['nickname'], + '$ispublic' => t('Visible to everybody'), + '$linkurl' => t('Please enter a link URL:'), + '$vidurl' => t("Please enter a video link/URL:"), + '$audurl' => t("Please enter an audio link/URL:"), + '$term' => t('Tag term:'), + '$fileas' => t('Save to Folder:'), '$whereareu' => t('Where are you right now?') )); @@ -1262,57 +1254,56 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { $tpl = get_markup_template("jot.tpl"); $o .= replace_macros($tpl,array( - '$return_path' => $query_str, - '$action' => 'item', - '$share' => (x($x,'button') ? $x['button'] : t('Share')), - '$upload' => t('Upload photo'), - '$shortupload' => t('upload photo'), - '$attach' => t('Attach file'), - '$shortattach' => t('attach file'), - '$weblink' => t('Insert web link'), + '$return_path' => $query_str, + '$action' => 'item', + '$share' => defaults($x, 'button', t('Share')), + '$upload' => t('Upload photo'), + '$shortupload' => t('upload photo'), + '$attach' => t('Attach file'), + '$shortattach' => t('attach file'), + '$weblink' => t('Insert web link'), '$shortweblink' => t('web link'), - '$video' => t('Insert video link'), - '$shortvideo' => t('video link'), - '$audio' => t('Insert audio link'), - '$shortaudio' => t('audio link'), - '$setloc' => t('Set your location'), - '$shortsetloc' => t('set location'), - '$noloc' => t('Clear browser location'), - '$shortnoloc' => t('clear location'), - '$title' => $x['title'], + '$video' => t('Insert video link'), + '$shortvideo' => t('video link'), + '$audio' => t('Insert audio link'), + '$shortaudio' => t('audio link'), + '$setloc' => t('Set your location'), + '$shortsetloc' => t('set location'), + '$noloc' => t('Clear browser location'), + '$shortnoloc' => t('clear location'), + '$title' => defaults($x, 'title', ''), '$placeholdertitle' => t('Set title'), - '$category' => $x['category'], - '$placeholdercategory' => (Feature::isEnabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : ''), - '$wait' => t('Please wait'), - '$permset' => t('Permission settings'), + '$category' => defaults($x, 'category', ''), + '$placeholdercategory' => Feature::isEnabled(local_user(), 'categories') ? t('Categories (comma-separated list)') : '', + '$wait' => t('Please wait'), + '$permset' => t('Permission settings'), '$shortpermset' => t('permissions'), - '$ptyp' => (($notes_cid) ? 'note' : 'wall'), - '$content' => $x['content'], - '$post_id' => $x['post_id'], - '$baseurl' => System::baseUrl(true), - '$defloc' => $x['default_location'], - '$visitor' => $x['visitor'], - '$pvisit' => (($notes_cid) ? 'none' : $x['visitor']), - '$public' => t('Public post'), - '$jotnets' => $jotnets, - '$lockstate' => $x['lockstate'], - '$bang' => $x['bang'], - '$profile_uid' => $x['profile_uid'], - '$preview' => ((Feature::isEnabled($x['profile_uid'],'preview')) ? t('Preview') : ''), - '$jotplugins' => $jotplugins, - '$notes_cid' => $notes_cid, - '$sourceapp' => t($a->sourcename), - '$cancel' => t('Cancel'), - '$rand_num' => random_digits(12), + '$ptyp' => $notes_cid ? 'note' : 'wall', + '$content' => defaults($x, 'content', ''), + '$post_id' => defaults($x, 'post_id', ''), + '$baseurl' => System::baseUrl(true), + '$defloc' => $x['default_location'], + '$visitor' => $x['visitor'], + '$pvisit' => $notes_cid ? 'none' : $x['visitor'], + '$public' => t('Public post'), + '$lockstate' => $x['lockstate'], + '$bang' => $x['bang'], + '$profile_uid' => $x['profile_uid'], + '$preview' => Feature::isEnabled($x['profile_uid'], 'preview') ? t('Preview') : '', + '$jotplugins' => $jotplugins, + '$notes_cid' => $notes_cid, + '$sourceapp' => t($a->sourcename), + '$cancel' => t('Cancel'), + '$rand_num' => random_digits(12), // ACL permissions box - '$acl' => $x['acl'], - '$acl_data' => $x['acl_data'], - '$group_perms' => t('Post to Groups'), + '$acl' => $x['acl'], + '$acl_data' => $x['acl_data'], + '$group_perms' => t('Post to Groups'), '$contact_perms' => t('Post to Contacts'), - '$private' => t('Private post'), - '$is_private' => $private_post, - '$public_link' => $public_post_link, + '$private' => t('Private post'), + '$is_private' => $private_post, + '$public_link' => $public_post_link, //jot nav tab (used in some themes) '$message' => t('Message'), @@ -1321,7 +1312,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) { if ($popup == true) { - $o = ''; + $o = ''; } return $o; @@ -1577,9 +1568,9 @@ function get_responses($conv_responses, $response_verbs, $ob, $item) { $ret = array(); foreach ($response_verbs as $v) { $ret[$v] = array(); - $ret[$v]['count'] = ((x($conv_responses[$v], $item['uri'])) ? $conv_responses[$v][$item['uri']] : ''); - $ret[$v]['list'] = ((x($conv_responses[$v], $item['uri'])) ? $conv_responses[$v][$item['uri'] . '-l'] : ''); - $ret[$v]['self'] = ((x($conv_responses[$v], $item['uri'])) ? $conv_responses[$v][$item['uri'] . '-self'] : '0'); + $ret[$v]['count'] = defaults($conv_responses[$v], $item['uri'], ''); + $ret[$v]['list'] = defaults($conv_responses[$v], $item['uri'] . '-l', ''); + $ret[$v]['self'] = defaults($conv_responses[$v], $item['uri'] . '-self', '0'); if (count($ret[$v]['list']) > MAX_LIKERS) { $ret[$v]['list_part'] = array_slice($ret[$v]['list'], 0, MAX_LIKERS); array_push($ret[$v]['list_part'], ' * * @param string $sql_extra Additional sql conditions (e.g. permission request). - * + * * @return array Query results. */ function events_by_date($owner_uid = 0, $event_params, $sql_extra = '') { @@ -626,6 +626,9 @@ function process_events($arr) { // Show edit and drop actions only if the user is the owner of the event and the event // is a real event (no bithdays). + $edit = null; + $copy = null; + $drop = null; if (local_user() && local_user() == $rr['uid'] && $rr['type'] == 'event') { $edit = ((! $rr['cid']) ? array(System::baseUrl() . '/events/event/' . $rr['id'], t('Edit event'), '', '') : null); $copy = ((! $rr['cid']) ? array(System::baseUrl() . '/events/copy/' . $rr['id'], t('Duplicate event'), '', '') : null); @@ -768,7 +771,7 @@ function event_format_export ($events, $format = 'ical', $timezone) { /** * @brief Get all events for a user ID. - * + * * The query for events is done permission sensitive. * If the user is the owner of the calendar he/she * will get all of his/her available events. @@ -922,7 +925,7 @@ function widget_events() { /** * @brief Format an item array with event data to HTML. - * + * * @param arr $item Array with item and event data. * @return string HTML output. */ @@ -1013,12 +1016,12 @@ function format_event_item($item) { /** * @brief Format a string with map bbcode to an array with location data. - * + * * Note: The string must only contain location data. A string with no bbcode will be * handled as location name. - * + * * @param string $s The string with the bbcode formatted location data. - * + * * @return array The array with the location data. * 'name' => The name of the location,
* 'address' => The address of the location,
diff --git a/mod/events.php b/mod/events.php index 7a05274e23..eb804b5d66 100644 --- a/mod/events.php +++ b/mod/events.php @@ -20,7 +20,7 @@ function events_init(App $a) { return; } - if ($a->argc == 1) { + if ($a->argc > 1) { // If it's a json request abort here because we don't // need the widget data if ($a->argv[1] === 'json') { @@ -234,6 +234,7 @@ function events_content(App $a) { )); $o = ''; + $tabs = ''; // tabs if ($a->theme_events_in_profile) { $tabs = profile_tabs($a, true); @@ -309,10 +310,13 @@ function events_content(App $a) { $start = sprintf('%d-%d-%d %d:%d:%d', $y, $m, 1, 0, 0, 0); $finish = sprintf('%d-%d-%d %d:%d:%d', $y, $m, $dim, 23, 59, 59); - - if ($a->argv[1] === 'json') { - if (x($_GET, 'start')) {$start = $_GET['start'];} - if (x($_GET, 'end')) {$finish = $_GET['end'];} + if ($a->argc > 1 && $a->argv[1] === 'json') { + if (x($_GET, 'start')) { + $start = $_GET['start']; + } + if (x($_GET, 'end')) { + $finish = $_GET['end']; + } } $start = datetime_convert('UTC', 'UTC', $start); @@ -358,7 +362,7 @@ function events_content(App $a) { $events = process_events($r); } - if ($a->argv[1] === 'json'){ + if ($a->argc > 1 && $a->argv[1] === 'json'){ echo json_encode($events); killme(); } From 861c4c74749e78a0e6ffae1149c988ee4b8d53f2 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Mon, 1 Jan 2018 15:47:20 -0500 Subject: [PATCH 66/80] Fix formatting and PHP notices in identity - Change flow of profile_load() function to return early if $profiledata and !$user - Replace remaining double quotes by single - Add back uninitialized variables in profile_sidebar --- include/identity.php | 376 +++++++++++++++++++++---------------------- 1 file changed, 182 insertions(+), 194 deletions(-) diff --git a/include/identity.php b/include/identity.php index 79bfe3830b..0ad0e646dc 100644 --- a/include/identity.php +++ b/include/identity.php @@ -1,8 +1,8 @@ query_string, LOGGER_DEBUG); notice(t('Requested account is not available.') . EOL); $a->error = 404; return; } + if (!x($a->page, 'aside')) { + $a->page['aside'] = ''; + } + + if ($profiledata) { + $a->page['aside'] .= profile_sidebar($profiledata, true, $show_connect); + + if (!DBM::is_result($user)) { + return; + } + } + $pdata = get_profiledata_by_nick($nickname, $user[0]['uid'], $profile); if (empty($pdata) && empty($profiledata)) { @@ -73,8 +85,9 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $ "SELECT `pub_keywords` FROM `profile` WHERE `uid` = %d AND `is-default` = 1 LIMIT 1", intval($pdata['profile_uid']) ); - if ($x && count($x)) + if ($x && count($x)) { $pdata['pub_keywords'] = $x[0]['pub_keywords']; + } } $a->profile = $pdata; @@ -83,9 +96,9 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $ $a->profile['mobile-theme'] = PConfig::get($a->profile['profile_uid'], 'system', 'mobile_theme'); $a->profile['network'] = NETWORK_DFRN; - $a->page['title'] = $a->profile['name'] . " @ " . $a->config['sitename']; + $a->page['title'] = $a->profile['name'] . ' @ ' . $a->config['sitename']; - if (!$profiledata && !PConfig::get(local_user(), 'system', 'always_my_theme')) { + if (!$profiledata && !PConfig::get(local_user(), 'system', 'always_my_theme')) { $_SESSION['theme'] = $a->profile['theme']; } @@ -97,19 +110,18 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $ $a->set_template_engine(); // reset the template engine to the default in case the user's theme doesn't specify one - $theme_info_file = "view/theme/" . current_theme() . "/theme.php"; + $theme_info_file = 'view/theme/' . current_theme() . '/theme.php'; if (file_exists($theme_info_file)) { require_once $theme_info_file; } - if (! (x($a->page, 'aside'))) { + if (!x($a->page, 'aside')) { $a->page['aside'] = ''; } if (local_user() && local_user() == $a->profile['uid'] && $profiledata) { $a->page['aside'] .= replace_macros( - get_markup_template('profile_edlink.tpl'), - array( + get_markup_template('profile_edlink.tpl'), array( '$editprofile' => t('Edit profile'), '$profid' => $a->profile['id'] ) @@ -123,19 +135,13 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $ * By now, the contact block isn't shown, when a different profile is given * But: When this profile was on the same server, then we could display the contacts */ - if ($profiledata) { - $a->page['aside'] .= profile_sidebar($profiledata, true, $show_connect); - } else { + if (!$profiledata) { $a->page['aside'] .= profile_sidebar($a->profile, $block, $show_connect); } - /*if (! $block) - $a->page['aside'] .= contact_block();*/ - return; } - /** * @brief Get all profil data of a local user * @@ -144,11 +150,12 @@ function profile_load(App $a, $nickname, $profile = 0, $profiledata = array(), $ * Passing a non-zero profile ID can also allow a preview of a selected profile * by the owner * + * Includes all available profile data + * * @param string $nickname nick * @param int $uid uid * @param int $profile ID of the profile * @returns array - * Includes all available profile data */ function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0) { @@ -198,7 +205,6 @@ function get_profiledata_by_nick($nickname, $uid = 0, $profile = 0) return $r; } - /** * @brief Formats a profile for display in the sidebar. * @@ -225,28 +231,27 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) $o = ''; $location = false; $address = false; - // $pdesc = true; // This function can also use contact information in $profile $is_contact = x($profile, 'cid'); - if ((! is_array($profile)) && (! count($profile))) { + if (!is_array($profile) && !count($profile)) { return $o; } - $profile['picdate'] = urlencode($profile['picdate']); + $profile['picdate'] = urlencode(defaults($profile, 'picdate', '')); - if (($profile['network'] != "") && ($profile['network'] != NETWORK_DFRN)) { + if (($profile['network'] != '') && ($profile['network'] != NETWORK_DFRN)) { $profile['network_name'] = format_network_name($profile['network'], $profile['url']); } else { - $profile['network_name'] = ""; + $profile['network_name'] = ''; } call_hooks('profile_sidebar_enter', $profile); // don't show connect link to yourself - $connect = (($profile['uid'] != local_user()) ? t('Connect') : false); + $connect = $profile['uid'] != local_user() ? t('Connect') : false; // don't show connect link to authenticated visitors either if (remote_user() && count($_SESSION['remote'])) { @@ -264,10 +269,10 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) // Is the local user already connected to that user? if ($connect && local_user()) { - if (isset($profile["url"])) { - $profile_url = normalise_link($profile["url"]); + if (isset($profile['url'])) { + $profile_url = normalise_link($profile['url']); } else { - $profile_url = normalise_link(System::baseUrl()."/profile/".$profile["nickname"]); + $profile_url = normalise_link(System::baseUrl() . '/profile/' . $profile['nickname']); } if (dba::exists('contact', array('pending' => false, 'uid' => local_user(), 'nurl' => $profile_url))) { @@ -275,21 +280,24 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) } } - if ($connect && ($profile['network'] != NETWORK_DFRN) && !isset($profile['remoteconnect'])) + if ($connect && ($profile['network'] != NETWORK_DFRN) && !isset($profile['remoteconnect'])) { $connect = false; + } $remoteconnect = null; - if (isset($profile['remoteconnect'])) + if (isset($profile['remoteconnect'])) { $remoteconnect = $profile['remoteconnect']; + } - if ($connect && ($profile['network'] == NETWORK_DFRN) && !isset($remoteconnect)) - $subscribe_feed = t("Atom feed"); - else + if ($connect && ($profile['network'] == NETWORK_DFRN) && !isset($remoteconnect)) { + $subscribe_feed = t('Atom feed'); + } else { $subscribe_feed = false; + } - if (remote_user() || (get_my_url() && $profile['unkmail'] && ($profile['uid'] != local_user()))) { + if (remote_user() || (get_my_url() && x($profile, 'unkmail') && ($profile['uid'] != local_user()))) { $wallmessage = t('Message'); - $wallmessage_link = "wallmessage/".$profile["nickname"]; + $wallmessage_link = 'wallmessage/' . $profile['nickname']; if (remote_user()) { $r = q( @@ -307,9 +315,9 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) ); } if ($r) { - $remote_url = $r[0]["url"]; - $message_path = preg_replace("=(.*)/profile/(.*)=ism", "$1/message/new/", $remote_url); - $wallmessage_link = $message_path.base64_encode($profile["addr"]); + $remote_url = $r[0]['url']; + $message_path = preg_replace('=(.*)/profile/(.*)=ism', '$1/message/new/', $remote_url); + $wallmessage_link = $message_path . base64_encode($profile['addr']); } } else { $wallmessage = false; @@ -318,7 +326,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) // show edit profile to yourself if (!$is_contact && $profile['uid'] == local_user() && Feature::isEnabled(local_user(), 'multi_profiles')) { - $profile['edit'] = array(System::baseUrl(). '/profiles', t('Profiles'),"", t('Manage/edit profiles')); + $profile['edit'] = array(System::baseUrl() . '/profiles', t('Profiles'), '', t('Manage/edit profiles')); $r = q( "SELECT * FROM `profile` WHERE `uid` = %d", local_user() @@ -338,14 +346,14 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) 'alt' => t('Profile Image'), 'profile_name' => $rr['profile-name'], 'isdefault' => $rr['is-default'], - 'visibile_to_everybody' => t('visible to everybody'), + 'visibile_to_everybody' => t('visible to everybody'), 'edit_visibility' => t('Edit visibility'), ); } } } if (!$is_contact && $profile['uid'] == local_user() && !Feature::isEnabled(local_user(), 'multi_profiles')) { - $profile['edit'] = array(System::baseUrl(). '/profiles/'.$profile['id'], t('Edit profile'),"", t('Edit profile')); + $profile['edit'] = array(System::baseUrl() . '/profiles/' . $profile['id'], t('Edit profile'), '', t('Edit profile')); $profile['menu'] = array( 'chg_photo' => t('Change profile photo'), 'cr_new' => null, @@ -356,28 +364,23 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) // Fetch the account type $account_type = Contact::getAccountType($profile); - if ((x($profile, 'address') == 1) - || (x($profile, 'location') == 1) - || (x($profile, 'locality') == 1) - || (x($profile, 'region') == 1) - || (x($profile, 'postal-code') == 1) - || (x($profile, 'country-name') == 1) + if (x($profile, 'address') + || x($profile, 'location') + || x($profile, 'locality') + || x($profile, 'region') + || x($profile, 'postal-code') + || x($profile, 'country-name') ) { $location = t('Location:'); } - $gender = ((x($profile, 'gender') == 1) ? t('Gender:') : false); + $gender = x($profile, 'gender') ? t('Gender:') : false; + $marital = x($profile, 'marital') ? t('Status:') : false; + $homepage = x($profile, 'homepage') ? t('Homepage:') : false; + $about = x($profile, 'about') ? t('About:') : false; + $xmpp = x($profile, 'xmpp') ? t('XMPP:') : false; - - $marital = ((x($profile, 'marital') == 1) ? t('Status:') : false); - - $homepage = ((x($profile, 'homepage') == 1) ? t('Homepage:') : false); - - $about = ((x($profile, 'about') == 1) ? t('About:') : false); - - $xmpp = ((x($profile, 'xmpp') == 1) ? t('XMPP:') : false); - - if (($profile['hidewall'] || $block) && (! local_user()) && (! remote_user())) { + if ((x($profile, 'hidewall') || $block) && !local_user() && !remote_user()) { $location = $pdesc = $gender = $marital = $homepage = $about = false; } @@ -385,7 +388,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) $firstname = $split_name['first']; $lastname = $split_name['last']; - if ($profile['guid'] != "") { + if (x($profile, 'guid')) { $diaspora = array( 'guid' => $profile['guid'], 'podloc' => System::baseUrl(), @@ -402,6 +405,9 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) $diaspora = false; } + $contact_block = ''; + $updated = ''; + $contacts = 0; if (!$block) { $contact_block = contact_block(); @@ -411,7 +417,7 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) intval($a->profile['uid']) ); if (DBM::is_result($r)) { - $updated = date("c", strtotime($r[0]['updated'])); + $updated = date('c', strtotime($r[0]['updated'])); } $r = q( @@ -437,45 +443,41 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) $p[$k] = $v; } - if (isset($p["about"])) { - $p["about"] = bbcode($p["about"]); + if (isset($p['about'])) { + $p['about'] = bbcode($p['about']); } - if (isset($p["address"])) { - $p["address"] = bbcode($p["address"]); + if (isset($p['address'])) { + $p['address'] = bbcode($p['address']); } else { - $p["address"] = bbcode($p["location"]); + $p['address'] = bbcode($p['location']); } - if (isset($p["photo"])) { - $p["photo"] = proxy_url($p["photo"], false, PROXY_SIZE_SMALL); + if (isset($p['photo'])) { + $p['photo'] = proxy_url($p['photo'], false, PROXY_SIZE_SMALL); } $tpl = get_markup_template('profile_vcard.tpl'); - $o .= replace_macros( - $tpl, - array( + $o .= replace_macros($tpl, array( '$profile' => $p, '$xmpp' => $xmpp, - '$connect' => $connect, - '$remoteconnect' => $remoteconnect, + '$connect' => $connect, + '$remoteconnect' => $remoteconnect, '$subscribe_feed' => $subscribe_feed, '$wallmessage' => $wallmessage, '$wallmessage_link' => $wallmessage_link, '$account_type' => $account_type, '$location' => $location, - '$gender' => $gender, - // '$pdesc' => $pdesc, - '$marital' => $marital, + '$gender' => $gender, + '$marital' => $marital, '$homepage' => $homepage, '$about' => $about, - '$network' => t('Network:'), + '$network' => t('Network:'), '$contacts' => $contacts, '$updated' => $updated, '$diaspora' => $diaspora, '$contact_block' => $contact_block, - ) - ); + )); $arr = array('profile' => &$profile, 'entry' => &$o); @@ -484,27 +486,26 @@ function profile_sidebar($profile, $block = 0, $show_connect = true) return $o; } - function get_birthdays() { $a = get_app(); $o = ''; - if (! local_user() || $a->is_mobile || $a->is_tablet) { + if (!local_user() || $a->is_mobile || $a->is_tablet) { return $o; } /* * $mobile_detect = new Mobile_Detect(); * $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet(); - * if ($is_mobile) - * return $o; + * if ($is_mobile) + * return $o; */ $bd_format = t('g A l F d'); // 8 AM Friday January 18 $bd_short = t('F d'); - $cachekey = "get_birthdays:".local_user(); + $cachekey = 'get_birthdays:' . local_user(); $r = Cache::get($cachekey); if (is_null($r)) { $s = dba::p( @@ -538,7 +539,7 @@ function get_birthdays() $classtoday = $istoday ? ' birthday-today ' : ''; if ($total) { foreach ($r as &$rr) { - if (! strlen($rr['name'])) { + if (!strlen($rr['name'])) { continue; } @@ -553,54 +554,50 @@ function get_birthdays() $sparkle = ''; $url = $rr['url']; if ($rr['network'] === NETWORK_DFRN) { - $sparkle = " sparkle"; - $url = System::baseUrl() . '/redir/' . $rr['cid']; + $sparkle = ' sparkle'; + $url = System::baseUrl() . '/redir/' . $rr['cid']; } $rr['link'] = $url; $rr['title'] = $rr['name']; - $rr['date'] = day_translate(datetime_convert('UTC', $a->timezone, $rr['start'], $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . t('[today]') : ''); + $rr['date'] = day_translate(datetime_convert('UTC', $a->timezone, $rr['start'], $rr['adjust'] ? $bd_format : $bd_short)) . (($today) ? ' ' . t('[today]') : ''); $rr['startime'] = null; $rr['today'] = $today; } } } - $tpl = get_markup_template("birthdays_reminder.tpl"); - return replace_macros( - $tpl, - array( + $tpl = get_markup_template('birthdays_reminder.tpl'); + return replace_macros($tpl, array( '$baseurl' => System::baseUrl(), '$classtoday' => $classtoday, '$count' => $total, '$event_reminders' => t('Birthday Reminders'), '$event_title' => t('Birthdays this week:'), '$events' => $r, - '$lbr' => '{', // raw brackets mess up if/endif macro processing + '$lbr' => '{', // raw brackets mess up if/endif macro processing '$rbr' => '}' - ) - ); + )); } - function get_events() { require_once 'include/bbcode.php'; $a = get_app(); - if (! local_user() || $a->is_mobile || $a->is_tablet) { + if (!local_user() || $a->is_mobile || $a->is_tablet) { return $o; } /* - * $mobile_detect = new Mobile_Detect(); - * $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet(); - * if ($is_mobile) - * return $o; + * $mobile_detect = new Mobile_Detect(); + * $is_mobile = $mobile_detect->isMobile() || $mobile_detect->isTablet(); + * if ($is_mobile) + * return $o; */ $bd_format = t('g A l F d'); // 8 AM Friday January 18 - $bd_short = t('F d'); + $classtoday = ''; $s = dba::p( "SELECT `event`.* FROM `event` @@ -614,7 +611,6 @@ function get_events() $r = array(); if (DBM::is_result($s)) { - $now = strtotime('now'); $istoday = false; while ($rr = dba::fetch($s)) { @@ -634,7 +630,7 @@ function get_events() } $description = substr(strip_tags(bbcode($rr['desc'])), 0, 32) . '... '; - if (! $description) { + if (!$description) { $description = t('[No description]'); } @@ -647,8 +643,8 @@ function get_events() $today = ((substr($strt, 0, 10) === datetime_convert('UTC', $a->timezone, 'now', 'Y-m-d')) ? true : false); $rr['title'] = $title; - $rr['description'] = $desciption; - $rr['date'] = day_translate(datetime_convert('UTC', $rr['adjust'] ? $a->timezone : 'UTC', $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : ''); + $rr['description'] = $description; + $rr['date'] = day_translate(datetime_convert('UTC', $rr['adjust'] ? $a->timezone : 'UTC', $rr['start'], $bd_format)) . (($today) ? ' ' . t('[today]') : ''); $rr['startime'] = $strt; $rr['today'] = $today; @@ -657,18 +653,15 @@ function get_events() dba::close($s); $classtoday = (($istoday) ? 'event-today' : ''); } - $tpl = get_markup_template("events_reminder.tpl"); - return replace_macros( - $tpl, - array( + $tpl = get_markup_template('events_reminder.tpl'); + return replace_macros($tpl, array( '$baseurl' => System::baseUrl(), '$classtoday' => $classtoday, '$count' => count($r), '$event_reminders' => t('Event Reminders'), '$event_title' => t('Events this week:'), '$events' => $r, - ) - ); + )); } function advanced_profile(App $a) @@ -677,9 +670,8 @@ function advanced_profile(App $a) $uid = $a->profile['uid']; $o .= replace_macros( - get_markup_template('section_title.tpl'), - array( - '$title' => t('Profile') + get_markup_template('section_title.tpl'), array( + '$title' => t('Profile') ) ); @@ -688,32 +680,32 @@ function advanced_profile(App $a) $profile = array(); - $profile['fullname'] = array( t('Full Name:'), $a->profile['name'] ) ; + $profile['fullname'] = array(t('Full Name:'), $a->profile['name']); if ($a->profile['gender']) { - $profile['gender'] = array( t('Gender:'), $a->profile['gender'] ); + $profile['gender'] = array(t('Gender:'), $a->profile['gender']); } if (($a->profile['dob']) && ($a->profile['dob'] > '0001-01-01')) { $year_bd_format = t('j F, Y'); $short_bd_format = t('j F'); + $val = intval($a->profile['dob']) ? + day_translate(datetime_convert('UTC', 'UTC', $a->profile['dob'] . ' 00:00 +00:00', $year_bd_format)) + : day_translate(datetime_convert('UTC', 'UTC', '2001-' . substr($a->profile['dob'], 5) . ' 00:00 +00:00', $short_bd_format)); - $val = ((intval($a->profile['dob'])) - ? day_translate(datetime_convert('UTC', 'UTC', $a->profile['dob'] . ' 00:00 +00:00', $year_bd_format)) - : day_translate(datetime_convert('UTC', 'UTC', '2001-' . substr($a->profile['dob'], 5) . ' 00:00 +00:00', $short_bd_format))); - - $profile['birthday'] = array( t('Birthday:'), $val); + $profile['birthday'] = array(t('Birthday:'), $val); } + if (!empty($a->profile['dob']) && $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); } if ($a->profile['marital']) { - $profile['marital'] = array( t('Status:'), $a->profile['marital']); + $profile['marital'] = array(t('Status:'), $a->profile['marital']); } /// @TODO Maybe use x() here, plus below? @@ -726,95 +718,92 @@ function advanced_profile(App $a) } if ($a->profile['sexual']) { - $profile['sexual'] = array( t('Sexual Preference:'), $a->profile['sexual'] ); + $profile['sexual'] = array(t('Sexual Preference:'), $a->profile['sexual']); } if ($a->profile['homepage']) { - $profile['homepage'] = array( t('Homepage:'), linkify($a->profile['homepage']) ); + $profile['homepage'] = array(t('Homepage:'), linkify($a->profile['homepage'])); } if ($a->profile['hometown']) { - $profile['hometown'] = array( t('Hometown:'), linkify($a->profile['hometown']) ); + $profile['hometown'] = array(t('Hometown:'), linkify($a->profile['hometown'])); } if ($a->profile['pub_keywords']) { - $profile['pub_keywords'] = array( t('Tags:'), $a->profile['pub_keywords']); + $profile['pub_keywords'] = array(t('Tags:'), $a->profile['pub_keywords']); } if ($a->profile['politic']) { - $profile['politic'] = array( t('Political Views:'), $a->profile['politic']); + $profile['politic'] = array(t('Political Views:'), $a->profile['politic']); } if ($a->profile['religion']) { - $profile['religion'] = array( t('Religion:'), $a->profile['religion']); + $profile['religion'] = array(t('Religion:'), $a->profile['religion']); } if ($txt = prepare_text($a->profile['about'])) { - $profile['about'] = array( t('About:'), $txt ); + $profile['about'] = array(t('About:'), $txt); } if ($txt = prepare_text($a->profile['interest'])) { - $profile['interest'] = array( t('Hobbies/Interests:'), $txt); + $profile['interest'] = array(t('Hobbies/Interests:'), $txt); } if ($txt = prepare_text($a->profile['likes'])) { - $profile['likes'] = array( t('Likes:'), $txt); + $profile['likes'] = array(t('Likes:'), $txt); } if ($txt = prepare_text($a->profile['dislikes'])) { - $profile['dislikes'] = array( t('Dislikes:'), $txt); + $profile['dislikes'] = array(t('Dislikes:'), $txt); } if ($txt = prepare_text($a->profile['contact'])) { - $profile['contact'] = array( t('Contact information and Social Networks:'), $txt); + $profile['contact'] = array(t('Contact information and Social Networks:'), $txt); } if ($txt = prepare_text($a->profile['music'])) { - $profile['music'] = array( t('Musical interests:'), $txt); + $profile['music'] = array(t('Musical interests:'), $txt); } if ($txt = prepare_text($a->profile['book'])) { - $profile['book'] = array( t('Books, literature:'), $txt); + $profile['book'] = array(t('Books, literature:'), $txt); } if ($txt = prepare_text($a->profile['tv'])) { - $profile['tv'] = array( t('Television:'), $txt); + $profile['tv'] = array(t('Television:'), $txt); } if ($txt = prepare_text($a->profile['film'])) { - $profile['film'] = array( t('Film/dance/culture/entertainment:'), $txt); + $profile['film'] = array(t('Film/dance/culture/entertainment:'), $txt); } if ($txt = prepare_text($a->profile['romance'])) { - $profile['romance'] = array( t('Love/Romance:'), $txt); + $profile['romance'] = array(t('Love/Romance:'), $txt); } if ($txt = prepare_text($a->profile['work'])) { - $profile['work'] = array( t('Work/employment:'), $txt); + $profile['work'] = array(t('Work/employment:'), $txt); } if ($txt = prepare_text($a->profile['education'])) { - $profile['education'] = array( t('School/education:'), $txt ); + $profile['education'] = array(t('School/education:'), $txt); } //show subcribed forum if it is enabled in the usersettings if (Feature::isEnabled($uid, 'forumlist_profile')) { - $profile['forumlist'] = array( t('Forums:'), ForumManager::profileAdvanced($uid)); + $profile['forumlist'] = array(t('Forums:'), ForumManager::profileAdvanced($uid)); } if ($a->profile['uid'] == local_user()) { - $profile['edit'] = array(System::baseUrl(). '/profiles/'.$a->profile['id'], t('Edit profile'),"", t('Edit profile')); + $profile['edit'] = array(System::baseUrl() . '/profiles/' . $a->profile['id'], t('Edit profile'), '', t('Edit profile')); } - return replace_macros( - $tpl, - array( + return replace_macros($tpl, array( '$title' => t('Profile'), '$basic' => t('Basic'), '$advanced' => t('Advanced'), '$profile' => $profile - ) - ); + )); } return ''; @@ -822,12 +811,11 @@ function advanced_profile(App $a) function profile_tabs($a, $is_owner = false, $nickname = null) { - //echo "
"; var_dump($a->user); killme();
-
 	if (is_null($nickname)) {
-		$nickname  = $a->user['nickname'];
+		$nickname = $a->user['nickname'];
 	}
 
+	$tab = false;
 	if (x($_GET, 'tab')) {
 		$tab = notags(trim($_GET['tab']));
 	}
@@ -836,85 +824,85 @@ function profile_tabs($a, $is_owner = false, $nickname = null)
 
 	$tabs = array(
 		array(
-			'label'=>t('Status'),
-			'url' => $url,
-			'sel' => ((!isset($tab) && $a->argv[0]=='profile') ? 'active' : ''),
+			'label' => t('Status'),
+			'url'   => $url,
+			'sel'   => !$tab && $a->argv[0] == 'profile' ? 'active' : '',
 			'title' => t('Status Messages and Posts'),
-			'id' => 'status-tab',
+			'id'    => 'status-tab',
 			'accesskey' => 'm',
 		),
 		array(
 			'label' => t('Profile'),
-			'url' 	=> $url.'/?tab=profile',
-			'sel'	=> ((isset($tab) && $tab=='profile') ? 'active' : ''),
+			'url'   => $url . '/?tab=profile',
+			'sel'   => $tab == 'profile' ? 'active' : '',
 			'title' => t('Profile Details'),
-			'id' => 'profile-tab',
+			'id'    => 'profile-tab',
 			'accesskey' => 'r',
 		),
 		array(
 			'label' => t('Photos'),
-			'url'	=> System::baseUrl() . '/photos/' . $nickname,
-			'sel'	=> ((!isset($tab) && $a->argv[0]=='photos') ? 'active' : ''),
+			'url'   => System::baseUrl() . '/photos/' . $nickname,
+			'sel'   => !$tab && $a->argv[0] == 'photos' ? 'active' : '',
 			'title' => t('Photo Albums'),
-			'id' => 'photo-tab',
+			'id'    => 'photo-tab',
 			'accesskey' => 'h',
 		),
 		array(
 			'label' => t('Videos'),
-			'url'	=> System::baseUrl() . '/videos/' . $nickname,
-			'sel'	=> ((!isset($tab) && $a->argv[0]=='videos') ? 'active' : ''),
+			'url'   => System::baseUrl() . '/videos/' . $nickname,
+			'sel'   => !$tab && $a->argv[0] == 'videos' ? 'active' : '',
 			'title' => t('Videos'),
-			'id' => 'video-tab',
+			'id'    => 'video-tab',
 			'accesskey' => 'v',
 		),
 	);
 
 	// the calendar link for the full featured events calendar
 	if ($is_owner && $a->theme_events_in_profile) {
-			$tabs[] = array(
-				'label' => t('Events'),
-				'url'	=> System::baseUrl() . '/events',
-				'sel' 	=>((!isset($tab) && $a->argv[0]=='events') ? 'active' : ''),
-				'title' => t('Events and Calendar'),
-				'id' => 'events-tab',
-				'accesskey' => 'e',
-			);
+		$tabs[] = array(
+			'label' => t('Events'),
+			'url'   => System::baseUrl() . '/events',
+			'sel'   => !$tab && $a->argv[0] == 'events' ? 'active' : '',
+			'title' => t('Events and Calendar'),
+			'id'    => 'events-tab',
+			'accesskey' => 'e',
+		);
 		// if the user is not the owner of the calendar we only show a calendar
 		// with the public events of the calendar owner
-	} elseif (! $is_owner) {
+	} elseif (!$is_owner) {
 		$tabs[] = array(
-				'label' => t('Events'),
-				'url'	=> System::baseUrl() . '/cal/' . $nickname,
-				'sel' 	=>((!isset($tab) && $a->argv[0]=='cal') ? 'active' : ''),
-				'title' => t('Events and Calendar'),
-				'id' => 'events-tab',
-				'accesskey' => 'e',
-			);
+			'label' => t('Events'),
+			'url'   => System::baseUrl() . '/cal/' . $nickname,
+			'sel'   => !$tab && $a->argv[0] == 'cal' ? 'active' : '',
+			'title' => t('Events and Calendar'),
+			'id'    => 'events-tab',
+			'accesskey' => 'e',
+		);
 	}
 
 	if ($is_owner) {
 		$tabs[] = array(
 			'label' => t('Personal Notes'),
-			'url'	=> System::baseUrl() . '/notes',
-			'sel' 	=>((!isset($tab) && $a->argv[0]=='notes') ? 'active' : ''),
+			'url'   => System::baseUrl() . '/notes',
+			'sel'   => !$tab && $a->argv[0] == 'notes' ? 'active' : '',
 			'title' => t('Only You Can See This'),
-			'id' => 'notes-tab',
+			'id'    => 'notes-tab',
 			'accesskey' => 't',
 		);
 	}
 
-	if ((! $is_owner) && ((count($a->profile)) || (! $a->profile['hide-friends']))) {
+	if ((!$is_owner) && ((count($a->profile)) || (!$a->profile['hide-friends']))) {
 		$tabs[] = array(
 			'label' => t('Contacts'),
-			'url'	=> System::baseUrl() . '/viewcontacts/' . $nickname,
-			'sel'	=> ((!isset($tab) && $a->argv[0]=='viewcontacts') ? 'active' : ''),
+			'url'   => System::baseUrl() . '/viewcontacts/' . $nickname,
+			'sel'   => !$tab && $a->argv[0] == 'viewcontacts' ? 'active' : '',
 			'title' => t('Contacts'),
-			'id' => 'viewcontacts-tab',
+			'id'    => 'viewcontacts-tab',
 			'accesskey' => 'k',
 		);
 	}
 
-	$arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => (($tab) ? $tab : false), 'tabs' => $tabs);
+	$arr = array('is_owner' => $is_owner, 'nickname' => $nickname, 'tab' => $tab, 'tabs' => $tabs);
 	call_hooks('profile_tabs', $arr);
 
 	$tpl = get_markup_template('common_tabs.tpl');
@@ -938,9 +926,9 @@ function zrl_init(App $a)
 		// The check fetches the cached value from gprobe to reduce the load for this system
 		$urlparts = parse_url($tmp_str);
 
-		$result = Cache::get("gprobe:" . $urlparts["host"]);
-		if ((!is_null($result)) && (in_array($result["network"], array(NETWORK_FEED, NETWORK_PHANTOM)))) {
-			logger("DDoS attempt detected for " . $urlparts["host"] . " by " . $_SERVER["REMOTE_ADDR"] . ". server data: " . print_r($_SERVER, true), LOGGER_DEBUG);
+		$result = Cache::get('gprobe:' . $urlparts['host']);
+		if ((!is_null($result)) && (in_array($result['network'], array(NETWORK_FEED, NETWORK_PHANTOM)))) {
+			logger('DDoS attempt detected for ' . $urlparts['host'] . ' by ' . $_SERVER['REMOTE_ADDR'] . '. server data: ' . print_r($_SERVER, true), LOGGER_DEBUG);
 			return;
 		}
 
@@ -952,10 +940,10 @@ function zrl_init(App $a)
 
 function zrl($s, $force = false)
 {
-	if (! strlen($s)) {
+	if (!strlen($s)) {
 		return $s;
 	}
-	if ((! strpos($s, '/profile/')) && (! $force)) {
+	if ((!strpos($s, '/profile/')) && (!$force)) {
 		return $s;
 	}
 	if ($force && substr($s, -1, 1) !== '/') {
@@ -963,7 +951,7 @@ function zrl($s, $force = false)
 	}
 	$achar = strpos($s, '?') ? '&' : '?';
 	$mine = get_my_url();
-	if ($mine && ! link_compare($mine, $s)) {
+	if ($mine && !link_compare($mine, $s)) {
 		return $s . $achar . 'zrl=' . urlencode($mine);
 	}
 	return $s;
@@ -986,7 +974,7 @@ function zrl($s, $force = false)
 function get_theme_uid()
 {
 	$uid = ((!empty($_REQUEST['puid'])) ? intval($_REQUEST['puid']) : 0);
-	if ((local_user()) && ((PConfig::get(local_user(), 'system', 'always_my_theme')) || (! $uid))) {
+	if ((local_user()) && ((PConfig::get(local_user(), 'system', 'always_my_theme')) || (!$uid))) {
 		return local_user();
 	}
 

From 9f04017e278e84638af0f35b08433d6289eacf45 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Mon, 1 Jan 2018 15:51:02 -0500
Subject: [PATCH 67/80] Quick fix PHP notices in various files

- Remove unused variables
- Fix variable name typos
- Use x() and defaults() to fix undefined index
- Add back uninitialized variables
---
 include/items.php     |  2 +-
 include/text.php      | 18 +++++++++++-------
 mod/display.php       |  7 ++++---
 mod/nogroup.php       |  9 +++------
 mod/ping.php          | 10 ++++++----
 mod/videos.php        | 21 +++++++++++----------
 src/Core/Worker.php   |  1 +
 src/Model/Contact.php |  4 ++--
 src/Network/Probe.php |  4 ++--
 9 files changed, 41 insertions(+), 35 deletions(-)

diff --git a/include/items.php b/include/items.php
index 4d495d3515..9bb5ceb79c 100644
--- a/include/items.php
+++ b/include/items.php
@@ -733,7 +733,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 		logger("Contact-id was missing for post ".$arr["guid"]." from user id ".$uid." - now set to ".$arr["contact-id"], LOGGER_DEBUG);
 	}
 
-	if ($arr["gcontact-id"] == 0) {
+	if (defaults($arr, "gcontact-id", 0) === 0) {
 		/*
 		 * The gcontact should mostly behave like the contact. But is is supposed to be global for the system.
 		 * This means that wall posts, repeated posts, etc. should have the gcontact id of the owner.
diff --git a/include/text.php b/include/text.php
index cbba8d0c5b..5a24c68ed3 100644
--- a/include/text.php
+++ b/include/text.php
@@ -994,7 +994,7 @@ function contact_block() {
 function micropro($contact, $redirect = false, $class = '', $textmode = false) {
 
 	// Use the contact URL if no address is available
-	if ($contact["addr"] == "") {
+	if (!x($contact, "addr")) {
 		$contact["addr"] = $contact["url"];
 	}
 
@@ -1020,7 +1020,7 @@ function micropro($contact, $redirect = false, $class = '', $textmode = false) {
 	}
 
 	return replace_macros(get_markup_template(($textmode)?'micropro_txt.tpl':'micropro_img.tpl'),array(
-		'$click' => (($contact['click']) ? $contact['click'] : ''),
+		'$click' => defaults($contact, 'click', ''),
 		'$class' => $class,
 		'$url' => $url,
 		'$photo' => proxy_url($contact['thumb'], false, PROXY_SIZE_THUMB),
@@ -1202,11 +1202,15 @@ function redir_private_images($a, &$item)
 	}
 }
 
-function put_item_in_cache(&$item, $update = false) {
-
-	if (($item["rendered-hash"] != hash("md5", $item["body"])) || ($item["rendered-hash"] == "") ||
-		($item["rendered-html"] == "") || Config::get("system", "ignore_cache")) {
+function put_item_in_cache(&$item, $update = false)
+{
+	$rendered_hash = defaults($item, 'rendered-hash', '');
 
+	if ($rendered_hash == ''
+		|| $item["rendered-html"] == ""
+		|| $rendered_hash != hash("md5", $item["body"])
+		|| Config::get("system", "ignore_cache")
+	) {
 		// The function "redir_private_images" changes the body.
 		// I'm not sure if we should store it permanently, so we save the old value.
 		$body = $item["body"];
@@ -2026,7 +2030,7 @@ function deindent($text, $chr = "[\t ]", $count = NULL) {
 }
 
 function formatBytes($bytes, $precision = 2) {
-	 $units = array('B', 'KB', 'MB', 'GB', 'TB');
+	$units = array('B', 'KB', 'MB', 'GB', 'TB');
 
 	$bytes = max($bytes, 0);
 	$pow = floor(($bytes ? log($bytes) : 0) / log(1024));
diff --git a/mod/display.php b/mod/display.php
index 12b10f36f8..c124f48bb5 100644
--- a/mod/display.php
+++ b/mod/display.php
@@ -201,8 +201,9 @@ function display_content(App $a, $update = false, $update_uid = 0) {
 
 	if ($update) {
 		$item_id = $_REQUEST['item_id'];
-		$item = dba::select('item', ['uid'], ['id' => $item_id], ['limit' => 1]);
+		$item = dba::select('item', ['uid', 'parent'], ['id' => $item_id], ['limit' => 1]);
 		$a->profile = array('uid' => intval($item['uid']), 'profile_uid' => intval($item['uid']));
+		$item_parent = $item['parent'];
 	} else {
 		$item_id = (($a->argc > 2) ? $a->argv[2] : 0);
 
@@ -260,7 +261,7 @@ function display_content(App $a, $update = false, $update_uid = 0) {
 
 	$contact_id = 0;
 
-	if (is_array($_SESSION['remote'])) {
+	if (x($_SESSION, 'remote') && is_array($_SESSION['remote'])) {
 		foreach ($_SESSION['remote'] as $v) {
 			if ($v['uid'] == $a->profile['uid']) {
 				$contact_id = $v['cid'];
@@ -294,7 +295,7 @@ function display_content(App $a, $update = false, $update_uid = 0) {
 	}
 	$is_owner = (local_user() && (in_array($a->profile['profile_uid'], [local_user(), 0])) ? true : false);
 
-	if ($a->profile['hidewall'] && !$is_owner && !$remote_contact) {
+	if (x($a->profile, 'hidewall') && !$is_owner && !$remote_contact) {
 		notice(t('Access to this profile has been restricted.') . EOL);
 		return;
 	}
diff --git a/mod/nogroup.php b/mod/nogroup.php
index d80b6d3dbd..9f5425d9eb 100644
--- a/mod/nogroup.php
+++ b/mod/nogroup.php
@@ -41,28 +41,25 @@ function nogroup_content(App $a)
 			$contact_details = Contact::getDetailsByURL($rr['url'], local_user(), $rr);
 
 			$contacts[] = array(
-				'img_hover' => sprintf(t('Visit %s\'s profile [%s]'), $contact_details['name'], $rr['url']),
+				'img_hover' => t('Visit %s\'s profile [%s]', $contact_details['name'], $rr['url']),
 				'edit_hover' => t('Edit contact'),
 				'photo_menu' => Contact::photoMenu($rr),
 				'id' => $rr['id'],
-				'alt_text' => $alt_text,
-				'dir_icon' => $dir_icon,
 				'thumb' => proxy_url($contact_details['thumb'], false, PROXY_SIZE_THUMB),
 				'name' => $contact_details['name'],
 				'username' => $contact_details['name'],
 				'details'       => $contact_details['location'],
 				'tags'          => $contact_details['keywords'],
 				'about'         => $contact_details['about'],
-				'sparkle' => $sparkle,
 				'itemurl' => (($contact_details['addr'] != "") ? $contact_details['addr'] : $rr['url']),
 				'url' => $rr['url'],
-				'network' => network_to_name($rr['network'], $url),
+				'network' => network_to_name($rr['network'], $rr['url']),
 			);
 		}
 	}
 
 	$tpl = get_markup_template("nogroup-template.tpl");
-	$o .= replace_macros(
+	$o = replace_macros(
 		$tpl,
 		array(
 		'$header' => t('Contacts who are not members of a group'),
diff --git a/mod/ping.php b/mod/ping.php
index 930ed54ff9..d8eaa8126f 100644
--- a/mod/ping.php
+++ b/mod/ping.php
@@ -164,8 +164,8 @@ function ping_init(App $a)
 
 			if (intval(Feature::isEnabled(local_user(), 'forumlist_widget'))) {
 				$forum_counts = ForumManager::countUnseenItems();
-				if (DBM::is_result($forums_counts)) {
-					foreach ($forums_counts as $forum_count) {
+				if (DBM::is_result($forum_counts)) {
+					foreach ($forum_counts as $forum_count) {
 						if ($forum_count['count'] > 0) {
 							$forums_unseen[] = $forum_count;
 						}
@@ -490,8 +490,10 @@ function ping_get_notifications($uid)
 
 			$notification["href"] = System::baseUrl() . "/notify/view/" . $notification["id"];
 
-			if ($notification["visible"] && !$notification["spam"]
-				&& !$notification["deleted"] && !is_array($result[$notification["parent"]])
+			if ($notification["visible"]
+				&& !$notification["spam"]
+				&& !$notification["deleted"]
+				&& !(x($result, $notification["parent"]) && is_array($result[$notification["parent"]]))
 			) {
 				// Should we condense the notifications or show them all?
 				if (PConfig::get(local_user(), 'system', 'detailed_notif')) {
diff --git a/mod/videos.php b/mod/videos.php
index bb0e0c237f..c4e5d0aaa4 100644
--- a/mod/videos.php
+++ b/mod/videos.php
@@ -7,11 +7,11 @@ use Friendica\Core\Worker;
 use Friendica\Database\DBM;
 use Friendica\Model\Contact;
 
-require_once('include/items.php');
-require_once('include/acl_selectors.php');
-require_once('include/bbcode.php');
-require_once('include/security.php');
-require_once('include/redir.php');
+require_once 'include/items.php';
+require_once 'include/acl_selectors.php';
+require_once 'include/bbcode.php';
+require_once 'include/security.php';
+require_once 'include/redir.php';
 
 function videos_init(App $a) {
 
@@ -44,12 +44,12 @@ function videos_init(App $a) {
 
 		$tpl = get_markup_template("vcard-widget.tpl");
 
-		$vcard_widget .= replace_macros($tpl, array(
+		$vcard_widget = replace_macros($tpl, array(
 			'$name' => $profile['name'],
 			'$photo' => $profile['photo'],
-			'$addr' => (($profile['addr'] != "") ? $profile['addr'] : ""),
+			'$addr' => defaults($profile, 'addr', ''),
 			'$account_type' => $account_type,
-			'$pdesc' => (($profile['pdesc'] != "") ? $profile['pdesc'] : ""),
+			'$pdesc' => defaults($profile, 'pdesc', ''),
 		));
 
 
@@ -280,8 +280,9 @@ function videos_content(App $a) {
 		}
 	}
 
-	// perhaps they're visiting - but not a community page, so they wouldn't have write access
+	$groups = [];
 
+	// perhaps they're visiting - but not a community page, so they wouldn't have write access
 	if(remote_user() && (! $visitor)) {
 		$contact_id = 0;
 		if(is_array($_SESSION['remote'])) {
@@ -317,7 +318,7 @@ function videos_content(App $a) {
 		return;
 	}
 
-	$sql_extra = permissions_sql($owner_uid,$remote_contact,$groups);
+	$sql_extra = permissions_sql($owner_uid, $remote_contact, $groups);
 
 	$o = "";
 
diff --git a/src/Core/Worker.php b/src/Core/Worker.php
index 760b40b1d3..55e2b33a04 100644
--- a/src/Core/Worker.php
+++ b/src/Core/Worker.php
@@ -606,6 +606,7 @@ class Worker
 			$exponent = 3;
 			$slope = $maxworkers / pow($maxsysload, $exponent);
 			$queues = ceil($slope * pow(max(0, $maxsysload - $load), $exponent));
+			$processlist = '';
 
 			if (Config::get('system', 'worker_debug')) {
 				// Create a list of queue entries grouped by their priority
diff --git a/src/Model/Contact.php b/src/Model/Contact.php
index 1b15f1c76d..067a2fda7f 100644
--- a/src/Model/Contact.php
+++ b/src/Model/Contact.php
@@ -662,7 +662,7 @@ class Contact extends BaseObject
 		if (!DBM::is_result($contact)) {
 			// The link could be provided as http although we stored it as https
 			$ssl_url = str_replace('http://', 'https://', $url);
-			$r = dba::select('contact', array('id', 'avatar-date'), array('`alias` IN (?, ?, ?) AND `uid` = ?', $url, normalise_link($url), $ssl_url, $uid), array('limit' => 1));
+			$r = dba::select('contact', array('id', 'avatar', 'avatar-date'), array('`alias` IN (?, ?, ?) AND `uid` = ?', $url, normalise_link($url), $ssl_url, $uid), array('limit' => 1));
 			$contact = dba::fetch($r);
 			dba::close($r);
 		}
@@ -674,7 +674,7 @@ class Contact extends BaseObject
 			$update_contact = ($contact['avatar-date'] < datetime_convert('', '', 'now -7 days'));
 
 			// We force the update if the avatar is empty
-			if ($contact['avatar'] == '') {
+			if (!x($contact, 'avatar')) {
 				$update_contact = true;
 			}
 
diff --git a/src/Network/Probe.php b/src/Network/Probe.php
index 539803b6e4..8912088cbb 100644
--- a/src/Network/Probe.php
+++ b/src/Network/Probe.php
@@ -330,7 +330,7 @@ class Probe
 			$data["url"] = $uri;
 		}
 
-		if ($data["photo"] != "") {
+		if (x($data, "photo")) {
 			$data["baseurl"] = matching_url(normalise_link($data["baseurl"]), normalise_link($data["photo"]));
 		} else {
 			$data["photo"] = System::baseUrl().'/images/person-175.jpg';
@@ -341,7 +341,7 @@ class Probe
 				$data["name"] = $data["nick"];
 			}
 
-			if ($data["name"] == "") {
+			if (!x($data, "name")) {
 				$data["name"] = $data["url"];
 			}
 		}

From d0d4e3813b063978b3f9e17577fc9b1ab984c9d0 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Mon, 1 Jan 2018 15:57:29 -0500
Subject: [PATCH 68/80] Fix formatting and PHP notices in include/tags

- Change remaining double quotes into single
---
 include/tags.php | 154 +++++++++++++++++++++++++----------------------
 1 file changed, 83 insertions(+), 71 deletions(-)

diff --git a/include/tags.php b/include/tags.php
index 8d8fb76559..584ed30e5b 100644
--- a/include/tags.php
+++ b/include/tags.php
@@ -1,4 +1,5 @@
 $link) {
+	$pattern = '/\W([\#@])\[url\=(.*?)\](.*?)\[\/url\]/ism';
+	if (preg_match_all($pattern, $data, $matches, PREG_SET_ORDER)) {
+		foreach ($matches as $match) {
+			$tags[$match[1] . strtolower(trim($match[3], ',.:;[]/\"?!'))] = $match[2];
+		}
+	}
 
-		if (substr(trim($tag), 0, 1) == "#") {
+	foreach ($tags as $tag => $link) {
+		if (substr(trim($tag), 0, 1) == '#') {
 			// try to ignore #039 or #1 or anything like that
-			if (ctype_digit(substr(trim($tag),1)))
+			if (ctype_digit(substr(trim($tag), 1)))
 				continue;
 			// try to ignore html hex escapes, e.g. #x2317
-			if ((substr(trim($tag),1,1) == 'x' || substr(trim($tag),1,1) == 'X') && ctype_digit(substr(trim($tag),2)))
+			if ((substr(trim($tag), 1, 1) == 'x' || substr(trim($tag), 1, 1) == 'X') && ctype_digit(substr(trim($tag), 2)))
 				continue;
 			$type = TERM_HASHTAG;
 			$term = substr($tag, 1);
-		} elseif (substr(trim($tag), 0, 1) == "@") {
+		} elseif (substr(trim($tag), 0, 1) == '@') {
 			$type = TERM_MENTION;
 			$term = substr($tag, 1);
 		} else { // This shouldn't happen
@@ -77,78 +85,78 @@ function create_tags_from_item($itemid) {
 			$term = $tag;
 		}
 
-		if ($message["uid"] == 0) {
+		if ($message['uid'] == 0) {
 			$global = true;
 
 			q("UPDATE `term` SET `global` = 1 WHERE `otype` = %d AND `guid` = '%s'",
-				intval(TERM_OBJ_POST), dbesc($message["guid"]));
+				intval(TERM_OBJ_POST), dbesc($message['guid']));
 		} else {
 			$isglobal = q("SELECT `global` FROM `term` WHERE `uid` = 0 AND `otype` = %d AND `guid` = '%s'",
-				intval(TERM_OBJ_POST), dbesc($message["guid"]));
+				intval(TERM_OBJ_POST), dbesc($message['guid']));
 
 			$global = (count($isglobal) > 0);
 		}
 
 		$r = q("INSERT INTO `term` (`uid`, `oid`, `otype`, `type`, `term`, `url`, `guid`, `created`, `received`, `global`)
 				VALUES (%d, %d, %d, %d, '%s', '%s', '%s', '%s', '%s', %d)",
-			intval($message["uid"]), intval($itemid), intval(TERM_OBJ_POST), intval($type), dbesc($term),
-			dbesc($link), dbesc($message["guid"]), dbesc($message["created"]), dbesc($message["received"]), intval($global));
+			intval($message['uid']), intval($itemid), intval(TERM_OBJ_POST), intval($type), dbesc($term),
+			dbesc($link), dbesc($message['guid']), dbesc($message['created']), dbesc($message['received']), intval($global));
 
 		// Search for mentions
 		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);
 			foreach ($users AS $user) {
-				if ($user["uid"] == $message["uid"]) {
+				if ($user['uid'] == $message['uid']) {
 					q("UPDATE `item` SET `mention` = 1 WHERE `id` = %d", intval($itemid));
 
-					q("UPDATE `thread` SET `mention` = 1 WHERE `iid` = %d", intval($message["parent"]));
+					q("UPDATE `thread` SET `mention` = 1 WHERE `iid` = %d", intval($message['parent']));
 				}
 			}
 		}
 	}
 }
 
-function create_tags_from_itemuri($itemuri, $uid) {
+function create_tags_from_itemuri($itemuri, $uid)
+{
 	$messages = q("SELECT `id` FROM `item` WHERE uri ='%s' AND uid=%d", dbesc($itemuri), intval($uid));
 
 	if (count($messages)) {
 		foreach ($messages as $message) {
-			create_tags_from_item($message["id"]);
+			create_tags_from_item($message['id']);
 		}
 	}
 }
 
-function update_items() {
-
+function update_items()
+{
 	$messages = dba::p("SELECT `oid`,`item`.`guid`, `item`.`created`, `item`.`received` FROM `term` INNER JOIN `item` ON `item`.`id`=`term`.`oid` WHERE `term`.`otype` = 1 AND `term`.`guid` = ''");
 
-	logger("fetched messages: ".dba::num_rows($messages));
+	logger('fetched messages: ' . dba::num_rows($messages));
 	while ($message = dba::fetch($messages)) {
-
-		if ($message["uid"] == 0) {
+		if ($message['uid'] == 0) {
 			$global = true;
 
 			q("UPDATE `term` SET `global` = 1 WHERE `otype` = %d AND `guid` = '%s'",
-				intval(TERM_OBJ_POST), dbesc($message["guid"]));
+				intval(TERM_OBJ_POST), dbesc($message['guid']));
 		} else {
 			$isglobal = q("SELECT `global` FROM `term` WHERE `uid` = 0 AND `otype` = %d AND `guid` = '%s'",
-				intval(TERM_OBJ_POST), dbesc($message["guid"]));
+				intval(TERM_OBJ_POST), dbesc($message['guid']));
 
 			$global = (count($isglobal) > 0);
 		}
 
 		q("UPDATE `term` SET `guid` = '%s', `created` = '%s', `received` = '%s', `global` = %d WHERE `otype` = %d AND `oid` = %d",
-			dbesc($message["guid"]), dbesc($message["created"]), dbesc($message["received"]),
-			intval($global), intval(TERM_OBJ_POST), intval($message["oid"]));
+			dbesc($message['guid']), dbesc($message['created']), dbesc($message['received']),
+			intval($global), intval(TERM_OBJ_POST), intval($message['oid']));
 	}
 
 	dba::close($messages);
 
 	$messages = dba::p("SELECT `guid` FROM `item` WHERE `uid` = 0");
 
-	logger("fetched messages: ".dba::num_rows($messages));
+	logger('fetched messages: ' . dba::num_rows($messages));
 	while ($message = dba::fetch(messages)) {
-		q("UPDATE `item` SET `global` = 1 WHERE `guid` = '%s'", dbesc($message["guid"]));
+		q("UPDATE `item` SET `global` = 1 WHERE `guid` = '%s'", dbesc($message['guid']));
 	}
 
 	dba::close($messages);
@@ -166,21 +174,22 @@ function update_items() {
  *
  * @return arr          Alphabetical sorted array of used tags of an user.
  */
-function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HASHTAG) {
-	require_once('include/security.php');
+function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HASHTAG)
+{
+	require_once 'include/security.php';
 
 	$item_condition = item_condition();
 	$sql_options = item_permissions_sql($uid);
-	$limit = $count ? sprintf("LIMIT %d", intval($count)) : "";
+	$limit = $count ? sprintf('LIMIT %d', intval($count)) : '';
 
 	if ($flags) {
 		if ($flags === 'wall') {
-			$sql_options .= " AND `item`.`wall` ";
+			$sql_options .= ' AND `item`.`wall` ';
 		}
 	}
 
 	if ($owner_id) {
-		$sql_options .= " AND `item`.`owner-id` = ".intval($owner_id)." ";
+		$sql_options .= ' AND `item`.`owner-id` = ' . intval($owner_id) . ' ';
 	}
 
 	// Fetch tags
@@ -194,7 +203,7 @@ function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HA
 		$type,
 		TERM_OBJ_POST
 	);
-	if(!DBM::is_result($r)) {
+	if (!DBM::is_result($r)) {
 		return array();
 	}
 
@@ -212,32 +221,32 @@ function tagadelic($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HA
  *
  * @return string       HTML formatted output.
  */
-function wtagblock($uid, $count = 0,$owner_id = 0, $flags = '', $type = TERM_HASHTAG) {
+function wtagblock($uid, $count = 0, $owner_id = 0, $flags = '', $type = TERM_HASHTAG)
+{
 	$o = '';
 	$r = tagadelic($uid, $count, $owner_id, $flags, $type);
 	if (count($r)) {
 		$contact = dba::select(
-			"contact",
-			array("url"),
-			array("id" => $uid),
-			array("limit" => 1)
+			'contact',
+			array('url'),
+			array('id' => $uid),
+			array('limit' => 1)
 		);
 		$url = System::removedBaseUrl($contact['url']);
 
 		foreach ($r as $rr) {
 			$tag['level'] = $rr[2];
-			$tag['url'] = $url."?tag=".urlencode($rr[0]);
+			$tag['url'] = $url . '?tag=' . urlencode($rr[0]);
 			$tag['name'] = $rr[0];
 
 			$tags[] = $tag;
 		}
 
-		$tpl = get_markup_template("tagblock_widget.tpl");
+		$tpl = get_markup_template('tagblock_widget.tpl');
 		$o = replace_macros($tpl, array(
 			'$title' => t('Tags'),
-			'$tags'  => $tags
+			'$tags' => $tags
 		));
-
 	}
 	return $o;
 }
@@ -248,7 +257,8 @@ function wtagblock($uid, $count = 0,$owner_id = 0, $flags = '', $type = TERM_HAS
  * @param array $arr Array of tags/terms with tag/term name and total count of use.
  * @return array     Alphabetical sorted array of used tags/terms of an user.
  */
-function tag_calc($arr) {
+function tag_calc($arr)
+{
 	$tags = array();
 	$min = 1e9;
 	$max = -1e9;
@@ -285,7 +295,8 @@ function tag_calc($arr) {
  *
  * @return int
  */
-function tags_sort($a, $b) {
+function tags_sort($a, $b)
+{
 	if (strtolower($a[0]) == strtolower($b[0])) {
 		return 0;
 	}
@@ -298,21 +309,22 @@ function tags_sort($a, $b) {
  * @param int     $limit Max number of displayed tags.
  * @return string HTML formattat output.
  */
-function tagcloud_wall_widget($limit = 50) {
+function tagcloud_wall_widget($limit = 50)
+{
 	$a = get_app();
 
-	if(!$a->profile['profile_uid'] || !$a->profile['url']) {
-		return "";
+	if (!$a->profile['profile_uid'] || !$a->profile['url']) {
+		return '';
 	}
 
-	if(Feature::isEnabled($a->profile['profile_uid'], 'tagadelic')) {
+	if (Feature::isEnabled($a->profile['profile_uid'], 'tagadelic')) {
 		$owner_id = Contact::getIdForURL($a->profile['url']);
 
-		if(!$owner_id) {
-			return "";
+		if (!$owner_id) {
+			return '';
 		}
 		return wtagblock($a->profile['profile_uid'], $limit, $owner_id, 'wall');
 	}
 
-	return "";
+	return '';
 }

From f7165156f1d049e110226dbd25730e44d5c550ba Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Mon, 1 Jan 2018 16:27:01 -0500
Subject: [PATCH 69/80] Fix formatting and PHP notices in contacts

- Use x() and defaults() to fix undefined indexes
- Fix variable and constant name typos
- Remove unused variables and commented out code
- Add back undefined variables
---
 mod/contacts.php  |  81 +++++++++++++++++----------------
 mod/crepair.php   | 112 +++++++++++++++++++++++-----------------------
 mod/hovercard.php |  89 ++++++++++++++++++------------------
 3 files changed, 139 insertions(+), 143 deletions(-)

diff --git a/mod/contacts.php b/mod/contacts.php
index 3421babf61..c58dc0fc4f 100644
--- a/mod/contacts.php
+++ b/mod/contacts.php
@@ -35,8 +35,9 @@ function contacts_init(App $a) {
 
 	require_once 'include/contact_widgets.php';
 
-	if ($_GET['nets'] == "all") {
-		$_GET['nets'] = "";
+	$nets = defaults($_GET, 'nets', '');
+	if ($nets == "all") {
+		$nets = "";
 	}
 
 	if (! x($a->page,'aside')) {
@@ -63,22 +64,22 @@ function contacts_init(App $a) {
 			'$account_type' => Contact::getAccountType($a->data['contact'])
 		));
 
-		$finpeople_widget = '';
+		$findpeople_widget = '';
 		$follow_widget = '';
 		$networks_widget = '';
 	} else {
 		$vcard_widget = '';
-		$networks_widget .= networks_widget('contacts',$_GET['nets']);
+		$networks_widget = networks_widget('contacts', $nets);
 		if (isset($_GET['add'])) {
 			$follow_widget = follow_widget($_GET['add']);
 		} else {
 			$follow_widget = follow_widget();
 		}
 
-		$findpeople_widget .= findpeople_widget();
+		$findpeople_widget = findpeople_widget();
 	}
 
-	$groups_widget .= Group::sidebarWidget('contacts','group','full',0,$contact_id);
+	$groups_widget = Group::sidebarWidget('contacts','group','full',0,$contact_id);
 
 	$a->page['aside'] .= replace_macros(get_markup_template("contacts-widget-sidebar.tpl"),array(
 		'$vcard_widget' => $vcard_widget,
@@ -515,8 +516,6 @@ function contacts_content(App $a) {
 
 		require_once 'include/contact_selectors.php';
 
-		$tpl = get_markup_template("contact_edit.tpl");
-
 		switch($contact['rel']) {
 			case CONTACT_IS_FRIEND:
 				$dir_icon = 'images/lrarrow.gif';
@@ -577,6 +576,7 @@ function contacts_content(App $a) {
 
 		$lost_contact = (($contact['archive'] && $contact['term-date'] > NULL_DATE && $contact['term-date'] < datetime_convert('','','now')) ? t('Communications lost with this contact!') : '');
 
+		$fetch_further_information = null;
 		if ($contact['network'] == NETWORK_FEED) {
 			$fetch_further_information = array('fetch_further_information',
 							t('Fetch further information for feeds'),
@@ -587,12 +587,19 @@ function contacts_content(App $a) {
 									'3' => t('Fetch keywords'),
 									'2' => t('Fetch information and keywords')));
 		}
-		if (in_array($contact['network'], array(NETWORK_FEED, NETWORK_MAIL)))
+
+		$poll_interval = null;
+		if (in_array($contact['network'], array(NETWORK_FEED, NETWORK_MAIL))) {
 			$poll_interval = contact_poll_interval($contact['priority'],(! $poll_enabled));
+		}
 
-		if ($contact['network'] == NETWORK_DFRN)
+		$profile_select = null;
+		if ($contact['network'] == NETWORK_DFRN) {
 			$profile_select = contact_profile_assign($contact['profile-id'],(($contact['network'] !== NETWORK_DFRN) ? true : false));
+		}
 
+		$follow = '';
+		$follow_text = '';
 		if (in_array($contact['network'], array(NETWORK_DIASPORA, NETWORK_OSTATUS))) {
 			if ($contact['rel'] == CONTACT_IS_FOLLOWER) {
 				$follow = System::baseUrl(true)."/follow?url=".urlencode($contact["url"]);
@@ -606,7 +613,7 @@ function contacts_content(App $a) {
 		// Load contactact related actions like hide, suggest, delete and others
 		$contact_actions = contact_actions($contact);
 
-
+		$tpl = get_markup_template("contact_edit.tpl");
 		$o .= replace_macros($tpl, array(
 			//'$header' => t('Contact Editor'),
 			'$header' => t("Contact"),
@@ -618,9 +625,7 @@ function contacts_content(App $a) {
 			'$lbl_info2' => t('Their personal note'),
 			'$reason' => trim(notags($contact['reason'])),
 			'$infedit' => t('Edit contact notes'),
-			'$common_text' => $common_text,
 			'$common_link' => 'common/loc/' . local_user() . '/' . $contact['id'],
-			'$all_friends' => $all_friends,
 			'$relation_text' => $relation_text,
 			'$visit' => sprintf( t('Visit %s\'s profile [%s]'),$contact['name'],$contact['url']),
 			'$blockunblock' => t('Block/Unblock contact'),
@@ -658,7 +663,6 @@ function contacts_content(App $a) {
 			'$photo' => $contact['photo'],
 			'$name' => htmlentities($contact['name']),
 			'$dir_icon' => $dir_icon,
-			'$alt_text' => $alt_text,
 			'$sparkle' => $sparkle,
 			'$url' => $url,
 			'$profileurllabel' => t('Profile URL'),
@@ -688,36 +692,33 @@ function contacts_content(App $a) {
 
 	}
 
-	$blocked = false;
-	$hidden = false;
-	$ignored = false;
-	$all = false;
+	$blocked  = false;
+	$hidden   = false;
+	$ignored  = false;
+	$archived = false;
+	$all      = false;
 
 	if(($a->argc == 2) && ($a->argv[1] === 'all')) {
 		$sql_extra = '';
 		$all = true;
-	}
-	elseif(($a->argc == 2) && ($a->argv[1] === 'blocked')) {
+	} elseif(($a->argc == 2) && ($a->argv[1] === 'blocked')) {
 		$sql_extra = " AND `blocked` = 1 ";
 		$blocked = true;
-	}
-	elseif(($a->argc == 2) && ($a->argv[1] === 'hidden')) {
+	} elseif(($a->argc == 2) && ($a->argv[1] === 'hidden')) {
 		$sql_extra = " AND `hidden` = 1 ";
 		$hidden = true;
-	}
-	elseif(($a->argc == 2) && ($a->argv[1] === 'ignored')) {
+	} elseif(($a->argc == 2) && ($a->argv[1] === 'ignored')) {
 		$sql_extra = " AND `readonly` = 1 ";
 		$ignored = true;
-	}
-	elseif(($a->argc == 2) && ($a->argv[1] === 'archived')) {
+	} elseif(($a->argc == 2) && ($a->argv[1] === 'archived')) {
 		$sql_extra = " AND `archive` = 1 ";
 		$archived = true;
-	}
-	else
+	} else {
 		$sql_extra = " AND `blocked` = 0 ";
+	}
 
-	$search = ((x($_GET,'search')) ? notags(trim($_GET['search'])) : '');
-	$nets = ((x($_GET,'nets')) ? notags(trim($_GET['nets'])) : '');
+	$search = x($_GET, 'search') ? notags(trim($_GET['search'])) : '';
+	$nets = x($_GET, 'nets') ? notags(trim($_GET['nets'])) : '';
 
 	$tabs = array(
 		array(
@@ -786,25 +787,25 @@ function contacts_content(App $a) {
 	$tab_tpl = get_markup_template('common_tabs.tpl');
 	$t = replace_macros($tab_tpl, array('$tabs'=>$tabs));
 
-
-
 	$searching = false;
-	if($search) {
+	$search_hdr = null;
+	if ($search) {
 		$search_hdr = $search;
 		$search_txt = dbesc(protect_sprintf(preg_quote($search)));
 		$searching = true;
 	}
 	$sql_extra .= (($searching) ? " AND (name REGEXP '$search_txt' OR url REGEXP '$search_txt'  OR nick REGEXP '$search_txt') " : "");
 
-	if($nets)
+	if ($nets) {
 		$sql_extra .= sprintf(" AND network = '%s' ", dbesc($nets));
+	}
 
 	$sql_extra2 = ((($sort_type > 0) && ($sort_type <= CONTACT_IS_FRIEND)) ? sprintf(" AND `rel` = %d ",intval($sort_type)) : '');
 
-
 	$r = q("SELECT COUNT(*) AS `total` FROM `contact`
 		WHERE `uid` = %d AND `self` = 0 AND `pending` = 0 $sql_extra $sql_extra2 ",
-		intval($_SESSION['uid']));
+		intval($_SESSION['uid'])
+	);
 	if (DBM::is_result($r)) {
 		$a->set_pager_total($r[0]['total']);
 		$total = $r[0]['total'];
@@ -834,7 +835,7 @@ function contacts_content(App $a) {
 		'$total' => $total,
 		'$search' => $search_hdr,
 		'$desc' => t('Search your contacts'),
-		'$finding' => (($searching) ? sprintf(t('Results for: %s'),$search) : ""),
+		'$finding' => $searching ? t('Results for: %s', $search) : "",
 		'$submit' => t('Find'),
 		'$cmd' => $a->cmd,
 		'$contacts' => $contacts,
@@ -849,7 +850,6 @@ function contacts_content(App $a) {
 		),
 		'$h_batch_actions' => t('Batch Actions'),
 		'$paginate' => paginate($a),
-
 	));
 
 	return $o;
@@ -927,12 +927,11 @@ function contact_posts($a, $contact_id) {
 		$contact = $r[0];
 		$a->page['aside'] = "";
 		profile_load($a, "", 0, Contact::getDetailsByURL($contact["url"]));
-	} else
-		$profile = "";
+	}
 
 	$tab_str = contacts_tab($a, $contact_id, 1);
 
-	$o .= $tab_str;
+	$o = $tab_str;
 
 	$o .= Contact::getPostsFromUrl($contact["url"]);
 
diff --git a/mod/crepair.php b/mod/crepair.php
index 32db9be92c..1a135a602f 100644
--- a/mod/crepair.php
+++ b/mod/crepair.php
@@ -1,4 +1,5 @@
 argc == 2) && intval($a->argv[1])) {
+	if (($a->argc == 2) && intval($a->argv[1])) {
 		$contact_id = intval($a->argv[1]);
 		$r = q("SELECT * FROM `contact` WHERE `uid` = %d and `id` = %d LIMIT 1",
 			intval(local_user()),
 			intval($contact_id)
 		);
-		if (! DBM::is_result($r)) {
+		if (!DBM::is_result($r)) {
 			$contact_id = 0;
 		}
 	}
 
-	if(! x($a->page,'aside'))
+	if (!x($a->page, 'aside')) {
 		$a->page['aside'] = '';
+	}
 
-	if($contact_id) {
+	if ($contact_id) {
 		$a->data['contact'] = $r[0];
 		$contact = $r[0];
 		profile_load($a, "", 0, Contact::getDetailsByURL($contact["url"]));
 	}
 }
 
-function crepair_post(App $a) {
-	if (! local_user()) {
+function crepair_post(App $a)
+{
+	if (!local_user()) {
 		return;
 	}
 
 	$cid = (($a->argc > 1) ? intval($a->argv[1]) : 0);
 
-	if($cid) {
+	if ($cid) {
 		$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
 			intval($cid),
 			intval(local_user())
 		);
 	}
 
-	if (! DBM::is_result($r)) {
+	if (!DBM::is_result($r)) {
 		return;
 	}
 
 	$contact = $r[0];
 
-	$name    = ((x($_POST,'name')) ? $_POST['name'] : $contact['name']);
-	$nick    = ((x($_POST,'nick')) ? $_POST['nick'] : '');
-	$url     = ((x($_POST,'url')) ? $_POST['url'] : '');
-	$request = ((x($_POST,'request')) ? $_POST['request'] : '');
-	$confirm = ((x($_POST,'confirm')) ? $_POST['confirm'] : '');
-	$notify  = ((x($_POST,'notify')) ? $_POST['notify'] : '');
-	$poll    = ((x($_POST,'poll')) ? $_POST['poll'] : '');
-	$attag   = ((x($_POST,'attag')) ? $_POST['attag'] : '');
-	$photo   = ((x($_POST,'photo')) ? $_POST['photo'] : '');
-	$remote_self = ((x($_POST,'remote_self')) ? $_POST['remote_self'] : false);
-	$nurl    = normalise_link($url);
+	$name        = defaults($_POST, 'name'       , $contact['name']);
+	$nick        = defaults($_POST, 'nick'       , '');
+	$url         = defaults($_POST, 'url'        , '');
+	$request     = defaults($_POST, 'request'    , '');
+	$confirm     = defaults($_POST, 'confirm'    , '');
+	$notify      = defaults($_POST, 'notify'     , '');
+	$poll        = defaults($_POST, 'poll'       , '');
+	$attag       = defaults($_POST, 'attag'      , '');
+	$photo       = defaults($_POST, 'photo'      , '');
+	$remote_self = defaults($_POST, 'remote_self', false);
+	$nurl        = normalise_link($url);
 
 	$r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `url` = '%s', `nurl` = '%s', `request` = '%s', `confirm` = '%s', `notify` = '%s', `poll` = '%s', `attag` = '%s' , `remote_self` = %d
 		WHERE `id` = %d AND `uid` = %d",
@@ -101,26 +105,24 @@ function crepair_post(App $a) {
 	return;
 }
 
-
-
-function crepair_content(App $a) {
-
-	if (! local_user()) {
-		notice( t('Permission denied.') . EOL);
+function crepair_content(App $a)
+{
+	if (!local_user()) {
+		notice(t('Permission denied.') . EOL);
 		return;
 	}
 
 	$cid = (($a->argc > 1) ? intval($a->argv[1]) : 0);
 
-	if($cid) {
+	if ($cid) {
 		$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
 			intval($cid),
 			intval(local_user())
 		);
 	}
 
-	if (! DBM::is_result($r)) {
-		notice( t('Contact not found.') . EOL);
+	if (!DBM::is_result($r)) {
+		notice(t('Contact not found.') . EOL);
 		return;
 	}
 
@@ -131,45 +133,44 @@ function crepair_content(App $a) {
 
 	$returnaddr = "contacts/$cid";
 
-	$allow_remote_self = Config::get('system','allow_users_remote_self');
+	$allow_remote_self = Config::get('system', 'allow_users_remote_self');
 
 	// Disable remote self for everything except feeds.
 	// There is an issue when you repeat an item from maybe twitter and you got comments from friendica and twitter
 	// Problem is, you couldn't reply to both networks.
-	if (!in_array($contact['network'], array(NETWORK_FEED, NETWORK_DFRN, NETWORK_DIASPORA)))
+	if (!in_array($contact['network'], array(NETWORK_FEED, NETWORK_DFRN, NETWORK_DIASPORA))) {
 		$allow_remote_self = false;
+	}
 
-	if ($contact['network'] == NETWORK_FEED)
-		$remote_self_options = array('0'=>t('No mirroring'), '1'=>t('Mirror as forwarded posting'), '2'=>t('Mirror as my own posting'));
-	else
-		$remote_self_options = array('0'=>t('No mirroring'), '2'=>t('Mirror as my own posting'));
+	if ($contact['network'] == NETWORK_FEED) {
+		$remote_self_options = array('0' => t('No mirroring'), '1' => t('Mirror as forwarded posting'), '2' => t('Mirror as my own posting'));
+	} else {
+		$remote_self_options = array('0' => t('No mirroring'), '2' => t('Mirror as my own posting'));
+	}
 
-	$update_profile = in_array($contact['network'], array(NETWORK_DFRN, NETWORK_DSPR, NETWORK_OSTATUS));
+	$update_profile = in_array($contact['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS));
 
 	$tab_str = contacts_tab($a, $contact['id'], 5);
 
-
 	$tpl = get_markup_template('crepair.tpl');
-	$o .= replace_macros($tpl, array(
-		//'$title'	=> t('Repair Contact Settings'),
-		'$tab_str'	=> $tab_str,
-		'$warning'	=> $warning,
-		'$info'		=> $info,
-		'$returnaddr'	=> $returnaddr,
-		'$return'	=> t('Return to contact editor'),
-		'$update_profile' => update_profile,
-		'$udprofilenow' => t('Refetch contact data'),
-		'$contact_id'	=> $contact['id'],
-		'$lbl_submit'	=> t('Submit'),
-
+	$o = replace_macros($tpl, array(
+		'$tab_str'        => $tab_str,
+		'$warning'        => $warning,
+		'$info'           => $info,
+		'$returnaddr'     => $returnaddr,
+		'$return'         => t('Return to contact editor'),
+		'$update_profile' => $update_profile,
+		'$udprofilenow'   => t('Refetch contact data'),
+		'$contact_id'     => $contact['id'],
+		'$lbl_submit'     => t('Submit'),
 		'$label_remote_self' => t('Remote Self'),
 		'$allow_remote_self' => $allow_remote_self,
 		'$remote_self' => array('remote_self',
-					t('Mirror postings from this contact'),
-					$contact['remote_self'],
-					t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.'),
-					$remote_self_options
-				),
+			t('Mirror postings from this contact'),
+			$contact['remote_self'],
+			t('Mark this contact as remote_self, this will cause friendica to repost new entries from this contact.'),
+			$remote_self_options
+		),
 
 		'$name'		=> array('name', t('Name') , htmlentities($contact['name'])),
 		'$nick'		=> array('nick', t('Account Nickname'), htmlentities($contact['nick'])),
@@ -183,5 +184,4 @@ function crepair_content(App $a) {
 	));
 
 	return $o;
-
 }
diff --git a/mod/hovercard.php b/mod/hovercard.php
index 8ad5cd0ebe..29dfd26891 100644
--- a/mod/hovercard.php
+++ b/mod/hovercard.php
@@ -7,90 +7,87 @@
  * Author: Rabuzarus 
  * License: GNU AFFERO GENERAL PUBLIC LICENSE (Version 3)
  */
-
 use Friendica\App;
 use Friendica\Core\Config;
 use Friendica\Model\Contact;
 use Friendica\Model\GContact;
 
-function hovercard_init(App $a) {
+function hovercard_init(App $a)
+{
 	// Just for testing purposes
-	$_GET["mode"] = "minimal";
+	$_GET['mode'] = 'minimal';
 }
 
-function hovercard_content() {
-	$profileurl	=	(x($_REQUEST,'profileurl')	? $_REQUEST['profileurl']	: "");
-	$datatype	=	(x($_REQUEST,'datatype')	?$_REQUEST['datatype']		: "json");
+function hovercard_content()
+{
+	$profileurl = defaults($_REQUEST, 'profileurl', '');
+	$datatype   = defaults($_REQUEST, 'datatype'  , 'json');
 
 	// Get out if the system doesn't have public access allowed
-	if(intval(Config::get('system','block_public')))
+	if (intval(Config::get('system', 'block_public'))) {
 		http_status_exit(401);
+	}
 
 	// Return the raw content of the template. We use this to make templates usable for js functions.
 	// Look at hovercard.js (function getHoverCardTemplate()).
-	// This part should be moved in it's own module. Maybe we could make more templates accessabel.
-	// (We need to discuss possible security lacks before doing this)
-	if ($datatype == "tpl") {
-		$templatecontent = get_template_content("hovercard.tpl");
+	// This part should be moved in its own module. Maybe we could make more templates accessible.
+	// (We need to discuss possible security leaks before doing this)
+	if ($datatype == 'tpl') {
+		$templatecontent = get_template_content('hovercard.tpl');
 		echo $templatecontent;
 		killme();
 	}
 
-	// If a contact is connected the url is internally changed to "redir/CID". We need the pure url to search for
+	// If a contact is connected the url is internally changed to 'redir/CID'. We need the pure url to search for
 	// the contact. So we strip out the contact id from the internal url and look in the contact table for
 	// the real url (nurl)
-	if (local_user() && strpos($profileurl, "redir/") === 0) {
+	$cid = 0;
+	if (local_user() && strpos($profileurl, 'redir/') === 0) {
 		$cid = intval(substr($profileurl, 6));
-		$r = dba::select('contact', array('nurl', 'self'), array('id' => $cid), array('limit' => 1));
-		$profileurl = ($r["nurl"] ? $r["nurl"] : "");
-		$self = ($r["self"] ? $r["self"] : "");
+		$r = dba::select('contact', array('nurl'), array('id' => $cid), array('limit' => 1));
+		$profileurl = defaults($r, 'nurl', '');
 	}
 
+	$contact = [];
 	// if it's the url containing https it should be converted to http
 	$nurl = normalise_link(GContact::cleanContactUrl($profileurl));
-	if($nurl) {
+	if ($nurl) {
 		// Search for contact data
 		$contact = Contact::getDetailsByURL($nurl);
 	}
-	if(!is_array($contact))
+	if (!count($contact)) {
 		return;
+	}
 
 	// Get the photo_menu - the menu if possible contact actions
-	if(local_user())
+	if (local_user()) {
 		$actions = Contact::photoMenu($contact);
-
+	}
 
 	// Move the contact data to the profile array so we can deliver it to
-	//
 	$profile = array(
-		'name' => $contact["name"],
-		'nick'	=> $contact["nick"],
-		'addr'	=> (($contact["addr"] != "") ? $contact["addr"] : $contact["url"]),
-		'thumb' => proxy_url($contact["thumb"], false, PROXY_SIZE_THUMB),
-		'url' => ($cid ? ("redir/".$cid) : zrl($contact["url"])),
-		'nurl' => $contact["nurl"], // We additionally store the nurl as identifier
-//		'alias' => $contact["alias"],
-		'location' => $contact["location"],
-		'gender' => $contact["gender"],
-		'about' => $contact["about"],
-		'network' => format_network_name($contact["network"], $contact["url"]),
-		'tags' => $contact["keywords"],
-//		'nsfw' => intval($contact["nsfw"]),
-//		'server_url' => $contact["server_url"],
-		'bd' => (($contact["birthday"] <= '0001-01-01') ? "" : $contact["birthday"]),
-//		'generation' => $contact["generation"],
+		'name'     => $contact['name'],
+		'nick'     => $contact['nick'],
+		'addr'     => defaults($contact, 'addr', $contact['url']),
+		'thumb'    => proxy_url($contact['thumb'], false, PROXY_SIZE_THUMB),
+		'url'      => $cid ? ('redir/' . $cid) : zrl($contact['url']),
+		'nurl'     => $contact['nurl'], // We additionally store the nurl as identifier
+		'location' => $contact['location'],
+		'gender'   => $contact['gender'],
+		'about'    => $contact['about'],
+		'network'  => format_network_name($contact['network'], $contact['url']),
+		'tags'     => $contact['keywords'],
+		'bd'       => $contact['birthday'] <= '0001-01-01' ? '' : $contact['birthday'],
 		'account_type' => Contact::getAccountType($contact),
-		'actions' => $actions,
+		'actions'  => $actions,
 	);
-	if($datatype == "html") {
-		$t = get_markup_template("hovercard.tpl");
-
-		$o = replace_macros($t, array(
+	if ($datatype == 'html') {
+		$tpl = get_markup_template('hovercard.tpl');
+		$o = replace_macros($tpl, array(
 			'$profile' => $profile,
 		));
 
 		return $o;
-
 	} else {
 		json_return_and_die($profile);
 	}
@@ -104,15 +101,15 @@ function hovercard_content() {
  *
  * @return string|bool Output the raw content if existent, otherwise false
  */
-function get_template_content($template, $root = "") {
-
+function get_template_content($template, $root = '')
+{
 	// We load the whole template system to get the filename.
 	// Maybe we can do it a little bit smarter if I get time.
 	$t = get_markup_template($template, $root);
 	$filename = $t->filename;
 
 	// Get the content of the template file
-	if(file_exists($filename)) {
+	if (file_exists($filename)) {
 		$content = file_get_contents($filename);
 
 		return $content;

From e52c11cc5837d0c2b55d6f0c1a81a8052efceeeb Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Mon, 1 Jan 2018 16:29:48 -0500
Subject: [PATCH 70/80] Fix formatting and PHP notice in mod/message

- Use argc to check for argv existence
- Simplify sprintf(t()) structures
---
 mod/message.php | 168 +++++++++++++++++++++++-------------------------
 1 file changed, 80 insertions(+), 88 deletions(-)

diff --git a/mod/message.php b/mod/message.php
index eba1c9a62c..9e0cb32c0e 100644
--- a/mod/message.php
+++ b/mod/message.php
@@ -10,107 +10,104 @@ require_once 'include/acl_selectors.php';
 require_once 'include/message.php';
 require_once 'include/conversation.php';
 
-function message_init(App $a) {
-
+function message_init(App $a)
+{
 	$tabs = '';
 
-	if ($a->argc >1 && is_numeric($a->argv[1])) {
-		$tabs = render_messages(get_messages(local_user(),0,5), 'mail_list.tpl');
+	if ($a->argc > 1 && is_numeric($a->argv[1])) {
+		$tabs = render_messages(get_messages(local_user(), 0, 5), 'mail_list.tpl');
 	}
 
 	$new = array(
 		'label' => t('New Message'),
 		'url' => 'message/new',
-		'sel'=> ($a->argv[1] == 'new'),
+		'sel' => $a->argc > 1 && $a->argv[1] == 'new',
 		'accesskey' => 'm',
 	);
 
 	$tpl = get_markup_template('message_side.tpl');
 	$a->page['aside'] = replace_macros($tpl, array(
-		'$tabs'=>$tabs,
-		'$new'=>$new,
+		'$tabs' => $tabs,
+		'$new' => $new,
 	));
 	$base = System::baseUrl();
 
 	$head_tpl = get_markup_template('message-head.tpl');
-	$a->page['htmlhead'] .= replace_macros($head_tpl,array(
+	$a->page['htmlhead'] .= replace_macros($head_tpl, array(
 		'$baseurl' => System::baseUrl(true),
 		'$base' => $base
 	));
 
 	$end_tpl = get_markup_template('message-end.tpl');
-	$a->page['end'] .= replace_macros($end_tpl,array(
+	$a->page['end'] .= replace_macros($end_tpl, array(
 		'$baseurl' => System::baseUrl(true),
 		'$base' => $base
 	));
-
 }
 
-function message_post(App $a) {
-
-	if (! local_user()) {
-		notice( t('Permission denied.') . EOL);
+function message_post(App $a)
+{
+	if (!local_user()) {
+		notice(t('Permission denied.') . EOL);
 		return;
 	}
 
-	$replyto   = ((x($_REQUEST,'replyto'))   ? notags(trim($_REQUEST['replyto']))   : '');
-	$subject   = ((x($_REQUEST,'subject'))   ? notags(trim($_REQUEST['subject']))   : '');
-	$body      = ((x($_REQUEST,'body'))      ? escape_tags(trim($_REQUEST['body'])) : '');
-	$recipient = ((x($_REQUEST,'messageto')) ? intval($_REQUEST['messageto'])       : 0 );
+	$replyto   = x($_REQUEST, 'replyto')   ? notags(trim($_REQUEST['replyto']))   : '';
+	$subject   = x($_REQUEST, 'subject')   ? notags(trim($_REQUEST['subject']))   : '';
+	$body      = x($_REQUEST, 'body')      ? escape_tags(trim($_REQUEST['body'])) : '';
+	$recipient = x($_REQUEST, 'messageto') ? intval($_REQUEST['messageto'])       : 0;
 
 	$ret = send_message($recipient, $body, $subject, $replyto);
 	$norecip = false;
 
-	switch($ret){
+	switch ($ret) {
 		case -1:
-			notice( t('No recipient selected.') . EOL );
+			notice(t('No recipient selected.') . EOL);
 			$norecip = true;
 			break;
 		case -2:
-			notice( t('Unable to locate contact information.') . EOL );
+			notice(t('Unable to locate contact information.') . EOL);
 			break;
 		case -3:
-			notice( t('Message could not be sent.') . EOL );
+			notice(t('Message could not be sent.') . EOL);
 			break;
 		case -4:
-			notice( t('Message collection failure.') . EOL );
+			notice(t('Message collection failure.') . EOL);
 			break;
 		default:
-			info( t('Message sent.') . EOL );
+			info(t('Message sent.') . EOL);
 	}
 
 	// fake it to go back to the input form if no recipient listed
-
 	if ($norecip) {
 		$a->argc = 2;
 		$a->argv[1] = 'new';
-	} else
+	} else {
 		goaway($_SESSION['return_url']);
-
+	}
 }
 
-function message_content(App $a) {
-
+function message_content(App $a)
+{
 	$o = '';
 	nav_set_selected('messages');
 
-	if (! local_user()) {
-		notice( t('Permission denied.') . EOL);
+	if (!local_user()) {
+		notice(t('Permission denied.') . EOL);
 		return;
 	}
 
-	$myprofile = System::baseUrl().'/profile/' . $a->user['nickname'];
+	$myprofile = System::baseUrl() . '/profile/' . $a->user['nickname'];
 
 	$tpl = get_markup_template('mail_head.tpl');
 	$header = replace_macros($tpl, array(
 		'$messages' => t('Messages'),
-		'$tab_content' => $tab_content
 	));
 
-
 	if (($a->argc == 3) && ($a->argv[1] === 'drop' || $a->argv[1] === 'dropconv')) {
-		if (! intval($a->argv[2]))
+		if (!intval($a->argv[2])) {
 			return;
+		}
 
 		// Check if we should do HTML-based delete confirmation
 		if ($_REQUEST['confirm']) {
@@ -118,7 +115,7 @@ function message_content(App $a) {
 			// so add any arguments as hidden inputs
 			$query = explode_querystring($a->query_string);
 			$inputs = array();
-			foreach($query['args'] as $arg) {
+			foreach ($query['args'] as $arg) {
 				if (strpos($arg, 'confirm=') === false) {
 					$arg_parts = explode('=', $arg);
 					$inputs[] = array('name' => $arg_parts[0], 'value' => $arg_parts[1]);
@@ -148,7 +145,7 @@ function message_content(App $a) {
 				intval(local_user())
 			);
 			if ($r) {
-				info( t('Message deleted.') . EOL );
+				info(t('Message deleted.') . EOL);
 			}
 			//goaway(System::baseUrl(true) . '/message' );
 			goaway($_SESSION['return_url']);
@@ -170,24 +167,22 @@ function message_content(App $a) {
 				// Actually if we do this, we can never receive another reply to that conversation,
 				// as we will never again have the info we need to re-create it.
 				// We'll just have to orphan it.
-
 				//if ($convid) {
 				//	q("delete from conv where id = %d limit 1",
 				//		intval($convid)
 				//	);
 				//}
 
-				if ($r)
-					info( t('Conversation removed.') . EOL );
+				if ($r) {
+					info(t('Conversation removed.') . EOL);
+				}
 			}
 			//goaway(System::baseUrl(true) . '/message' );
 			goaway($_SESSION['return_url']);
 		}
-
 	}
 
 	if (($a->argc > 1) && ($a->argv[1] === 'new')) {
-
 		$o .= $header;
 
 		$tpl = get_markup_template('msg-header.tpl');
@@ -204,8 +199,7 @@ function message_content(App $a) {
 			'$linkurl' => t('Please enter a link URL:')
 		));
 
-		$preselect = (isset($a->argv[2])?array($a->argv[2]):false);
-
+		$preselect = isset($a->argv[2]) ? array($a->argv[2]) : false;
 
 		$prename = $preurl = $preid = '';
 
@@ -233,18 +227,18 @@ function message_content(App $a) {
 				$preurl = $r[0]['url'];
 				$preid = $r[0]['id'];
 				$preselect = array($preid);
-			} else
+			} else {
 				$preselect = false;
+			}
 		}
 
-		$prefill = (($preselect) ? $prename  : '');
+		$prefill = $preselect ? $prename : '';
 
 		// the ugly select box
-
-		$select = contact_select('messageto','message-to-select', $preselect, 4, true, false, false, 10);
+		$select = contact_select('messageto', 'message-to-select', $preselect, 4, true, false, false, 10);
 
 		$tpl = get_markup_template('prv_message.tpl');
-		$o .= replace_macros($tpl,array(
+		$o .= replace_macros($tpl, array(
 			'$header' => t('Send Private Message'),
 			'$to' => t('To:'),
 			'$showinputs' => 'true',
@@ -252,8 +246,8 @@ function message_content(App $a) {
 			'$autocomp' => $autocomp,
 			'$preid' => $preid,
 			'$subject' => t('Subject:'),
-			'$subjtxt' => ((x($_REQUEST,'subject')) ? strip_tags($_REQUEST['subject']) : ''),
-			'$text' => ((x($_REQUEST,'body')) ? escape_tags(htmlspecialchars($_REQUEST['body'])) : ''),
+			'$subjtxt' => x($_REQUEST, 'subject') ? strip_tags($_REQUEST['subject']) : '',
+			'$text' => x($_REQUEST, 'body') ? escape_tags(htmlspecialchars($_REQUEST['body'])) : '',
 			'$readonly' => '',
 			'$yourmessage' => t('Your message:'),
 			'$select' => $select,
@@ -286,8 +280,8 @@ function message_content(App $a) {
 
 		$r = get_messages(local_user(), $a->pager['start'], $a->pager['itemspage']);
 
-		if (! DBM::is_result($r)) {
-			info( t('No messages.') . EOL);
+		if (!DBM::is_result($r)) {
+			info(t('No messages.') . EOL);
 			return $o;
 		}
 
@@ -325,8 +319,8 @@ function message_content(App $a) {
 				intval(local_user())
 			);
 		}
-		if (! count($messages)) {
-			notice( t('Message not available.') . EOL );
+		if (!count($messages)) {
+			notice(t('Message not available.') . EOL);
 			return $o;
 		}
 
@@ -355,24 +349,24 @@ function message_content(App $a) {
 		$seen = 0;
 		$unknown = false;
 
-		foreach($messages as $message) {
+		foreach ($messages as $message) {
 			if ($message['unknown'])
 				$unknown = true;
 			if ($message['from-url'] == $myprofile) {
 				$from_url = $myprofile;
 				$sparkle = '';
 			} elseif ($message['contact-id'] != 0) {
-				$from_url = 'redir/'.$message['contact-id'];
+				$from_url = 'redir/' . $message['contact-id'];
 				$sparkle = ' sparkle';
 			} else {
-				$from_url = $message['from-url']."?zrl=".urlencode($myprofile);
+				$from_url = $message['from-url'] . "?zrl=" . urlencode($myprofile);
 				$sparkle = ' sparkle';
 			}
 
-
 			$extracted = item_extract_images($message['body']);
-			if ($extracted['images'])
+			if ($extracted['images']) {
 				$message['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $message['contact-id']);
+			}
 
 			$from_name_e = $message['from-name'];
 			$subject_e = $message['title'];
@@ -380,10 +374,11 @@ function message_content(App $a) {
 			$to_name_e = $message['name'];
 
 			$contact = Contact::getDetailsByURL($message['from-url']);
-			if (isset($contact["thumb"]))
+			if (isset($contact["thumb"])) {
 				$from_photo = $contact["thumb"];
-			else
+			} else {
 				$from_photo = $message['from-photo'];
+			}
 
 			$mails[] = array(
 				'id' => $message['id'],
@@ -396,26 +391,22 @@ function message_content(App $a) {
 				'body' => $body_e,
 				'delete' => t('Delete message'),
 				'to_name' => $to_name_e,
-				'date' => datetime_convert('UTC',date_default_timezone_get(),$message['created'],'D, d M Y - g:i A'),
-                                'ago' => relative_date($message['created']),
+				'date' => datetime_convert('UTC', date_default_timezone_get(), $message['created'], 'D, d M Y - g:i A'),
+				'ago' => relative_date($message['created']),
 			);
 
 			$seen = $message['seen'];
 		}
 
-
 		$select = $message['name'] . '';
 		$parent = '';
 
 		$tpl = get_markup_template('mail_display.tpl');
-
-		$subjtxt_e = $message['title'];
-
 		$o = replace_macros($tpl, array(
 			'$thread_id' => $a->argv[1],
 			'$thread_subject' => $message['title'],
 			'$thread_seen' => $seen,
-			'$delete' =>  t('Delete conversation'),
+			'$delete' => t('Delete conversation'),
 			'$canreply' => (($unknown) ? false : '1'),
 			'$unknown_text' => t("No secure communications available. You may be able to respond from the sender's profile page."),
 			'$mails' => $mails,
@@ -425,7 +416,7 @@ function message_content(App $a) {
 			'$to' => t('To:'),
 			'$showinputs' => '',
 			'$subject' => t('Subject:'),
-			'$subjtxt' => $subjtxt_e,
+			'$subjtxt' => $message['title'],
 			'$readonly' => ' readonly="readonly" style="background: #BBBBBB;" ',
 			'$yourmessage' => t('Your message:'),
 			'$text' => '',
@@ -435,14 +426,14 @@ function message_content(App $a) {
 			'$insert' => t('Insert web link'),
 			'$submit' => t('Submit'),
 			'$wait' => t('Please wait')
-
 		));
 
 		return $o;
 	}
 }
 
-function get_messages($user, $lstart, $lend) {
+function get_messages($user, $lstart, $lend)
+{
 	//TODO: rewritte with a sub-query to get the first message of each private thread with certainty
 	return q("SELECT max(`mail`.`created`) AS `mailcreated`, min(`mail`.`seen`) AS `mailseen`,
 		ANY_VALUE(`mail`.`id`) AS `id`, ANY_VALUE(`mail`.`uid`) AS `uid`, ANY_VALUE(`mail`.`guid`) AS `guid`,
@@ -461,33 +452,34 @@ function get_messages($user, $lstart, $lend) {
 	);
 }
 
-function render_messages(array $msg, $t) {
-
+function render_messages(array $msg, $t)
+{
 	$a = get_app();
 
 	$tpl = get_markup_template($t);
 	$rslt = '';
 
-	$myprofile = System::baseUrl().'/profile/' . $a->user['nickname'];
+	$myprofile = System::baseUrl() . '/profile/' . $a->user['nickname'];
 
-	foreach($msg as $rr) {
-
-		if ($rr['unknown'])
-			$participants = sprintf( t("Unknown sender - %s"),$rr['from-name']);
-		elseif (link_compare($rr['from-url'], $myprofile))
-			$participants = sprintf( t("You and %s"), $rr['name']);
-		else
-			$participants = sprintf(t("%s and You"), $rr['from-name']);
+	foreach ($msg as $rr) {
+		if ($rr['unknown']) {
+			$participants = t("Unknown sender - %s", $rr['from-name']);
+		} elseif (link_compare($rr['from-url'], $myprofile)) {
+			$participants = t("You and %s", $rr['name']);
+		} else {
+			$participants = t("%s and You", $rr['from-name']);
+		}
 
 		$subject_e = (($rr['mailseen']) ? $rr['title'] : '' . $rr['title'] . '');
 		$body_e = $rr['body'];
 		$to_name_e = $rr['name'];
 
 		$contact = Contact::getDetailsByURL($rr['url']);
-		if (isset($contact["thumb"]))
+		if (isset($contact["thumb"])) {
 			$from_photo = $contact["thumb"];
-		else
+		} else {
 			$from_photo = (($rr['thumb']) ? $rr['thumb'] : $rr['from-photo']);
+		}
 
 		$rslt .= replace_macros($tpl, array(
 			'$id' => $rr['id'],
@@ -500,10 +492,10 @@ function render_messages(array $msg, $t) {
 			'$delete' => t('Delete conversation'),
 			'$body' => $body_e,
 			'$to_name' => $to_name_e,
-			'$date' => datetime_convert('UTC',date_default_timezone_get(),$rr['mailcreated'], t('D, d M Y - g:i A')),
-															'$ago' => relative_date($rr['mailcreated']),
+			'$date' => datetime_convert('UTC', date_default_timezone_get(), $rr['mailcreated'], t('D, d M Y - g:i A')),
+			'$ago' => relative_date($rr['mailcreated']),
 			'$seen' => $rr['mailseen'],
-			'$count' => sprintf( tt('%d message', '%d messages', $rr['count']), $rr['count']),
+			'$count' => tt('%d message', '%d messages', $rr['count']),
 		));
 	}
 

From 97bc54cf1bc5b98fa22b8455b60fd278068ae804 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Mon, 1 Jan 2018 16:33:21 -0500
Subject: [PATCH 71/80] Fix formatting and PHP notices in network and photo
 modules

- Remove unused variable $file and associated SQL
- Add back uninitialized variables
---
 mod/network.php | 36 +++++++++++++--------------------
 mod/photo.php   | 54 ++++++++++++++++++-------------------------------
 2 files changed, 34 insertions(+), 56 deletions(-)

diff --git a/mod/network.php b/mod/network.php
index 552625c2af..81e6754c23 100644
--- a/mod/network.php
+++ b/mod/network.php
@@ -365,7 +365,7 @@ function networkConversation($a, $items, $mode, $update) {
 	// Set this so that the conversation function can find out contact info for our wall-wall items
 	$a->page_contact = $a->contact;
 
-	$o .= conversation($a, $items, $mode, $update);
+	$o = conversation($a, $items, $mode, $update);
 
 	if (!$update) {
 		if (PConfig::get(local_user(), 'system', 'infinite_scroll')) {
@@ -568,9 +568,9 @@ function networkThreadedView(App $a, $update = 0) {
 
 		if ($group) {
 			if (($t = Contact::getOStatusCountByGroupId($group)) && !PConfig::get(local_user(), 'system', 'nowarn_insecure')) {
-				notice(sprintf(tt("Warning: This group contains %s member from a network that doesn't allow non public messages.",
+				notice(tt("Warning: This group contains %s member from a network that doesn't allow non public messages.",
 						"Warning: This group contains %s members from a network that doesn't allow non public messages.",
-						$t), $t).EOL);
+						$t) . EOL);
 				notice(t("Messages in this group won't be send to these receivers.").EOL);
 			}
 		}
@@ -664,7 +664,7 @@ function networkThreadedView(App $a, $update = 0) {
 		}
 
 		$o = replace_macros(get_markup_template("section_title.tpl"),array(
-			'$title' => sprintf(t('Group: %s'), $r['name'])
+			'$title' => t('Group: %s', $r['name'])
 		)) . $o;
 
 	} elseif ($cid) {
@@ -716,13 +716,6 @@ function networkThreadedView(App $a, $update = 0) {
 	$sql_order = "";
 	$order_mode = "received";
 
-	if (strlen($file)) {
-		$sql_post_table .= sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ",
-				dbesc(protect_sprintf($file)), intval(TERM_OBJ_POST), intval(TERM_FILE), intval(local_user()));
-		$sql_order = "`item`.`id`";
-		$order_mode = "id";
-	}
-
 	if ($conv) {
 		$sql_extra3 .= " AND $sql_table.`mention`";
 	}
@@ -744,7 +737,7 @@ function networkThreadedView(App $a, $update = 0) {
 		$sql_order = "$sql_table.$ordering";
 	}
 
-	if (($_GET["offset"] != "")) {
+	if (x($_GET, 'offset')) {
 		$sql_extra3 .= sprintf(" AND $sql_order <= '%s'", dbesc($_GET["offset"]));
 	}
 
@@ -816,9 +809,10 @@ function networkThreadedView(App $a, $update = 0) {
 	$parents_str = '';
 	$date_offset = "";
 
+	$items = array();
 	if (DBM::is_result($r)) {
 		foreach ($r as $rr) {
-			if (!in_array($rr['item_id'],$parents_arr)) {
+			if (!in_array($rr['item_id'], $parents_arr)) {
 				$parents_arr[] = $rr['item_id'];
 			}
 		}
@@ -833,12 +827,10 @@ function networkThreadedView(App $a, $update = 0) {
 			$max_comments = 100;
 		}
 
-		$items = array();
-
 		foreach ($parents_arr AS $parents) {
-			$thread_items = dba::p(item_query()." AND `item`.`uid` = ?
+			$thread_items = dba::p(item_query() . " AND `item`.`uid` = ?
 				AND `item`.`parent` = ?
-				ORDER BY `item`.`commented` DESC LIMIT ".intval($max_comments + 1),
+				ORDER BY `item`.`commented` DESC LIMIT " . intval($max_comments + 1),
 				local_user(),
 				$parents
 			);
@@ -847,15 +839,15 @@ function networkThreadedView(App $a, $update = 0) {
 				$items = array_merge($items, dba::inArray($thread_items));
 			}
 		}
-		$items = conv_sort($items,$ordering);
-	} else {
-		$items = array();
+		$items = conv_sort($items, $ordering);
 	}
 
-	if ($_GET["offset"] == "") {
+	if (x($_GET, 'offset')) {
+		$date_offset = $_GET["offset"];
+	} elseif(count($items)) {
 		$date_offset = $items[0][$order_mode];
 	} else {
-		$date_offset = $_GET["offset"];
+		$date_offset = '';
 	}
 
 	$a->page_offset = $date_offset;
diff --git a/mod/photo.php b/mod/photo.php
index 243dfda029..dc7d856783 100644
--- a/mod/photo.php
+++ b/mod/photo.php
@@ -1,4 +1,5 @@
  $e) {
-			$uid = str_replace('.'.$e, '', $uid);
+			$uid = str_replace('.' . $e, '', $uid);
 		}
 
 		$r = q("SELECT * FROM `photo` WHERE `scale` = %d AND `uid` = %d AND `profile` = 1 LIMIT 1",
@@ -92,16 +90,12 @@ function photo_init(App $a) {
 			$mimetype = 'image/jpeg';
 		}
 	} else {
-
-		/**
-		 * Other photos
-		 */
-
+		// Other photos
 		$resolution = 0;
 		$photo = str_replace(array('.jpg', '.png', '.gif'), array('', '', ''), $photo);
 
 		foreach (Image::supportedTypes() AS $m => $e) {
-			$photo = str_replace('.'.$e, '', $photo);
+			$photo = str_replace('.' . $e, '', $photo);
 		}
 
 		if (substr($photo, -2, 1) == '-') {
@@ -115,22 +109,18 @@ function photo_init(App $a) {
 			intval($resolution)
 		);
 		if (DBM::is_result($r)) {
-
 			$sql_extra = permissions_sql($r[0]['uid']);
 
 			// Now we'll see if we can access the photo
-
 			$r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `scale` <= %d $sql_extra ORDER BY scale DESC LIMIT 1",
 				dbesc($photo),
 				intval($resolution)
 			);
-
-			$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)) {
 				$resolution = $r[0]['scale'];
 				$data = $r[0]['data'];
 				$mimetype = $r[0]['type'];
+				$public = $r[0]['allow_cid'] == '' && $r[0]['allow_gid'] == '' && $r[0]['deny_cid'] == '' && $r[0]['deny_gid'] == '';
 			} else {
 				// The picure exists. We already checked with the first query.
 				// obviously, this is not an authorized viev!
@@ -145,7 +135,6 @@ function photo_init(App $a) {
 	if (empty($data)) {
 		if (isset($resolution)) {
 			switch ($resolution) {
-
 				case 4:
 					$data = file_get_contents('images/person-175.jpg');
 					$mimetype = 'image/jpeg';
@@ -167,7 +156,7 @@ function photo_init(App $a) {
 	}
 
 	// Resize only if its not a GIF and it is supported by the library
-	if (($mimetype != "image/gif") && in_array($mimetype, Image::supportedTypes())) {
+	if ($mimetype != "image/gif" && in_array($mimetype, Image::supportedTypes())) {
 		$Image = new Image($data, $mimetype);
 		if ($Image->isValid()) {
 			if (isset($customres) && $customres > 0 && $customres < 500) {
@@ -183,36 +172,33 @@ function photo_init(App $a) {
 		header_remove('pragma');
 	}
 
-	header("Content-type: ".$mimetype);
+	header("Content-type: " . $mimetype);
 
 	if ($prvcachecontrol) {
-
 		// it is a private photo that they have no permission to view.
 		// tell the browser not to cache it, in case they authenticate
 		// and subsequently have permission to see it
-
 		header("Cache-Control: no-store, no-cache, must-revalidate");
-
 	} else {
 		header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . " GMT");
-		header('Etag: "'.md5($data).'"');
-	 	header("Expires: " . gmdate("D, d M Y H:i:s", time() + (31536000)) . " GMT");
+		header('Etag: "' . md5($data) . '"');
+		header("Expires: " . gmdate("D, d M Y H:i:s", time() + (31536000)) . " GMT");
 		header("Cache-Control: max-age=31536000");
 	}
 	echo $data;
 
 	// If the photo is public and there is an existing photo directory store the photo there
-	if ($public and ($file != "")) {
+	if ($public and $file != '') {
 		// If the photo path isn't there, try to create it
 		$basepath = $a->get_basepath();
-		if (!is_dir($basepath."/photo")) {
+		if (!is_dir($basepath . "/photo")) {
 			if (is_writable($basepath)) {
-				mkdir($basepath."/photo");
+				mkdir($basepath . "/photo");
 			}
 		}
 
-		if (is_dir($basepath."/photo")) {
-			file_put_contents($basepath."/photo/".$file, $data);
+		if (is_dir($basepath . "/photo")) {
+			file_put_contents($basepath . "/photo/" . $file, $data);
 		}
 	}
 

From 93ca0d79fe3f68e2b9942b1c251475065add2f81 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Mon, 1 Jan 2018 16:47:00 -0500
Subject: [PATCH 72/80] Fix formatting and PHP notice in mod/photos

- Use x() and defaults() to fix undefined indexes.
- Add missing fields in SQL query in dropalbum
- Improve file upload error messaging
- Remove unused variables
- Add back undefined variables
- Simplify nested conditions
- Remove unused public/private code block in photo upload and photo edit
---
 mod/photos.php | 385 +++++++++++++++++++------------------------------
 1 file changed, 147 insertions(+), 238 deletions(-)

diff --git a/mod/photos.php b/mod/photos.php
index 4741815758..fde505a6f7 100644
--- a/mod/photos.php
+++ b/mod/photos.php
@@ -54,12 +54,12 @@ function photos_init(App $a) {
 
 		$tpl = get_markup_template("vcard-widget.tpl");
 
-		$vcard_widget .= replace_macros($tpl, array(
+		$vcard_widget = replace_macros($tpl, array(
 			'$name' => $profile['name'],
 			'$photo' => $profile['photo'],
-			'$addr' => (($profile['addr'] != "") ? $profile['addr'] : ""),
+			'$addr' => defaults($profile, 'addr', ''),
 			'$account_type' => $account_type,
-			'$pdesc' => (($profile['pdesc'] != "") ? $profile['pdesc'] : ""),
+			'$pdesc' => defaults($profile, 'pdesc', ''),
 		));
 
 		$albums = photo_albums($a->data['user']['uid']);
@@ -91,18 +91,16 @@ function photos_init(App $a) {
 			}
 		}
 
-		$albums = $ret;
-
 		if (local_user() && $a->data['user']['uid'] == local_user()) {
 			$can_post = true;
 		}
 
-		if ($albums['success']) {
+		if ($ret['success']) {
 			$photo_albums_widget = replace_macros(get_markup_template('photo_albums.tpl'), array(
 				'$nick'     => $a->data['user']['nickname'],
 				'$title'    => t('Photo Albums'),
 				'$recent'   => t('Recent Photos'),
-				'$albums'   => $albums['albums'],
+				'$albums'   => $ret['albums'],
 				'$baseurl'  => System::baseUrl(),
 				'$upload'   => array(t('Upload New Photos'), 'photos/' . $a->data['user']['nickname'] . '/upload'),
 				'$can_post' => $can_post
@@ -116,26 +114,20 @@ function photos_init(App $a) {
 		$a->page['aside'] .= $vcard_widget;
 		$a->page['aside'] .= $photo_albums_widget;
 
-
 		$tpl = get_markup_template("photos_head.tpl");
 		$a->page['htmlhead'] .= replace_macros($tpl,array(
 			'$ispublic' => t('everybody')
 		));
-
 	}
 
 	return;
 }
 
-
-
-function photos_post(App $a) {
-
+function photos_post(App $a)
+{
 	logger('mod-photos: photos_post: begin' , LOGGER_DEBUG);
-
-
-	logger('mod_photos: REQUEST ' . print_r($_REQUEST,true), LOGGER_DATA);
-	logger('mod_photos: FILES '   . print_r($_FILES,true), LOGGER_DATA);
+	logger('mod_photos: REQUEST ' . print_r($_REQUEST, true), LOGGER_DATA);
+	logger('mod_photos: FILES '   . print_r($_FILES, true), LOGGER_DATA);
 
 	$phototypes = Image::supportedTypes();
 
@@ -143,14 +135,14 @@ function photos_post(App $a) {
 	$visitor   = 0;
 
 	$page_owner_uid = $a->data['user']['uid'];
-	$community_page = (($a->data['user']['page-flags'] == PAGE_COMMUNITY) ? true : false);
+	$community_page = $a->data['user']['page-flags'] == PAGE_COMMUNITY;
 
 	if (local_user() && (local_user() == $page_owner_uid)) {
 		$can_post = true;
 	} else {
 		if ($community_page && remote_user()) {
 			$contact_id = 0;
-			if (is_array($_SESSION['remote'])) {
+			if (x($_SESSION, 'remote') && is_array($_SESSION['remote'])) {
 				foreach ($_SESSION['remote'] as $v) {
 					if ($v['uid'] == $page_owner_uid) {
 						$contact_id = $v['cid'];
@@ -159,7 +151,6 @@ function photos_post(App $a) {
 				}
 			}
 			if ($contact_id) {
-
 				$r = q("SELECT `uid` FROM `contact` WHERE `blocked` = 0 AND `pending` = 0 AND `id` = %d AND `uid` = %d LIMIT 1",
 					intval($contact_id),
 					intval($page_owner_uid)
@@ -190,8 +181,7 @@ function photos_post(App $a) {
 
 	$owner_record = $r[0];
 
-
-	if (($a->argc > 3) && ($a->argv[2] === 'album')) {
+	if ($a->argc > 3 && $a->argv[2] === 'album') {
 		$album = hex2bin($a->argv[3]);
 
 		if ($album === t('Profile Photos') || $album === 'Contact Photos' || $album === t('Contact Photos')) {
@@ -214,10 +204,7 @@ function photos_post(App $a) {
 			goaway($_SESSION['photo_return']);
 		}
 
-		/*
-		 * RENAME photo album
-		 */
-
+		// RENAME photo album
 		$newalbum = notags(trim($_POST['albumname']));
 		if ($newalbum != $album) {
 			q("UPDATE `photo` SET `album` = '%s' WHERE `album` = '%s' AND `uid` = %d",
@@ -228,7 +215,7 @@ function photos_post(App $a) {
 			// Update the photo albums cache
 			photo_albums($page_owner_uid, true);
 
-			$newurl = str_replace(bin2hex($album),bin2hex($newalbum),$_SESSION['photo_return']);
+			$newurl = str_replace(bin2hex($album), bin2hex($newalbum), $_SESSION['photo_return']);
 			goaway($newurl);
 			return; // NOTREACHED
 		}
@@ -238,9 +225,8 @@ function photos_post(App $a) {
 		 */
 
 		if ($_POST['dropalbum'] == t('Delete Album')) {
-
 			// Check if we should do HTML-based delete confirmation
-			if ($_REQUEST['confirm']) {
+			if (x($_REQUEST, 'confirm')) {
 				$drop_url = $a->query_string;
 				$extra_inputs = array(
 					array('name' => 'albumname', 'value' => $_POST['albumname']),
@@ -286,14 +272,12 @@ function photos_post(App $a) {
 			$str_res = implode(',', $res);
 
 			// remove the associated photos
-
 			q("DELETE FROM `photo` WHERE `resource-id` IN ( $str_res ) AND `uid` = %d",
 				intval($page_owner_uid)
 			);
 
 			// find and delete the corresponding item with all the comments and likes/dislikes
-
-			$r = q("SELECT `parent-uri` FROM `item` WHERE `resource-id` IN ( $str_res ) AND `uid` = %d",
+			$r = q("SELECT `id`, `parent-uri`, `visible` FROM `item` WHERE `resource-id` IN ( $str_res ) AND `uid` = %d",
 				intval($page_owner_uid)
 			);
 			if (DBM::is_result($r)) {
@@ -309,7 +293,6 @@ function photos_post(App $a) {
 					$drop_id = intval($rr['id']);
 
 					// send the notification upstream/downstream as the case may be
-
 					if ($rr['visible']) {
 						Worker::add(PRIORITY_HIGH, "Notifier", "drop", $drop_id);
 					}
@@ -326,16 +309,16 @@ function photos_post(App $a) {
 
 
 	// Check if the user has responded to a delete confirmation query for a single photo
-	if (($a->argc > 2) && $_REQUEST['canceled']) {
+	if ($a->argc > 2 && x($_REQUEST, 'canceled')) {
 		goaway($_SESSION['photo_return']);
 	}
 
-	if (($a->argc > 2) && (x($_POST,'delete')) && ($_POST['delete'] == t('Delete Photo'))) {
+	if ($a->argc > 2 && defaults($_POST, 'delete', '') === t('Delete Photo')) {
 
 		// same as above but remove single photo
 
 		// Check if we should do HTML-based delete confirmation
-		if ($_REQUEST['confirm']) {
+		if (x($_REQUEST, 'confirm')) {
 			$drop_url = $a->query_string;
 			$a->page['content'] = replace_macros(get_markup_template('confirm.tpl'), array(
 				'$method' => 'post',
@@ -367,7 +350,7 @@ function photos_post(App $a) {
 				intval($page_owner_uid),
 				dbesc($r[0]['resource-id'])
 			);
-			$i = q("SELECT * FROM `item` WHERE `resource-id` = '%s' AND `uid` = %d LIMIT 1",
+			$i = q("SELECT `id`, `uri`, `visible` FROM `item` WHERE `resource-id` = '%s' AND `uid` = %d LIMIT 1",
 				dbesc($r[0]['resource-id']),
 				intval($page_owner_uid)
 			);
@@ -397,13 +380,12 @@ function photos_post(App $a) {
 		return; // NOTREACHED
 	}
 
-	if (($a->argc > 2) && ((x($_POST,'desc') !== false) || (x($_POST,'newtag') !== false)) || (x($_POST,'albname') !== false)) {
-
-		$desc        = (x($_POST,'desc')      ? notags(trim($_POST['desc']))    : '');
-		$rawtags     = (x($_POST,'newtag')    ? notags(trim($_POST['newtag']))  : '');
-		$item_id     = (x($_POST,'item_id')   ? intval($_POST['item_id'])       : 0);
-		$albname     = (x($_POST,'albname')   ? notags(trim($_POST['albname'])) : '');
-		$origaname   = (x($_POST,'origaname') ? notags(trim($_POST['origaname'])) : '');
+	if ($a->argc > 2 && (x($_POST, 'desc') !== false || x($_POST, 'newtag') !== false || x($_POST, 'albname') !== false)) {
+		$desc        = x($_POST, 'desc')      ? notags(trim($_POST['desc']))      : '';
+		$rawtags     = x($_POST, 'newtag')    ? notags(trim($_POST['newtag']))    : '';
+		$item_id     = x($_POST, 'item_id')   ? intval($_POST['item_id'])         : 0;
+		$albname     = x($_POST, 'albname')   ? notags(trim($_POST['albname']))   : '';
+		$origaname   = x($_POST, 'origaname') ? notags(trim($_POST['origaname'])) : '';
 		$str_group_allow   = perms2str($_POST['group_allow']);
 		$str_contact_allow = perms2str($_POST['contact_allow']);
 		$str_group_deny    = perms2str($_POST['group_deny']);
@@ -415,9 +397,8 @@ function photos_post(App $a) {
 			$albname = datetime_convert('UTC',date_default_timezone_get(),'now', 'Y');
 		}
 
-
-		if ((x($_POST,'rotate') !== false) &&
-		   ( (intval($_POST['rotate']) == 1) || (intval($_POST['rotate']) == 2) )) {
+		if (x($_POST,'rotate') !== false &&
+		   (intval($_POST['rotate']) == 1 || intval($_POST['rotate']) == 2)) {
 			logger('rotate');
 
 			$r = q("SELECT * FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d AND `scale` = 0 LIMIT 1",
@@ -503,9 +484,7 @@ function photos_post(App $a) {
 		}
 
 		if (!$item_id) {
-
 			// Create item container
-
 			$title = '';
 			$uri = item_new_uri($a->get_hostname(),$page_owner_uid);
 
@@ -538,7 +517,6 @@ function photos_post(App $a) {
 						. '[/url]';
 
 			$item_id = item_store($arr);
-
 		}
 
 		if ($item_id) {
@@ -553,13 +531,11 @@ function photos_post(App $a) {
 		}
 
 		if (strlen($rawtags)) {
-
 			$str_tags = '';
 			$inform   = '';
 
 			// if the new tag doesn't have a namespace specifier (@foo or #foo) give it a hashtag
-
-			$x = substr($rawtags,0,1);
+			$x = substr($rawtags, 0, 1);
 			if ($x !== '@' && $x !== '#') {
 				$rawtags = '#' . $rawtags;
 			}
@@ -569,10 +545,8 @@ function photos_post(App $a) {
 
 			if (count($tags)) {
 				foreach ($tags as $tag) {
-					if (isset($profile)) {
-						unset($profile);
-					}
 					if (strpos($tag, '@') === 0) {
+						$profile = '';
 						$name = substr($tag,1);
 						if ((strpos($name, '@')) || (strpos($name, 'http://'))) {
 							$newname = $name;
@@ -690,8 +664,7 @@ function photos_post(App $a) {
 
 			if (count($taginfo)) {
 				foreach ($taginfo as $tagged) {
-
-					$uri = item_new_uri($a->get_hostname(),$page_owner_uid);
+					$uri = item_new_uri($a->get_hostname(), $page_owner_uid);
 
 					$arr = array();
 					$arr['guid']          = get_guid(32);
@@ -746,18 +719,12 @@ function photos_post(App $a) {
 	}
 
 
-	/**
-	 * default post action - upload a photo
-	 */
-
+	// default post action - upload a photo
 	call_hooks('photo_post_init', $_POST);
 
-	/**
-	 * Determine the album to use
-	 */
-
-	$album    = notags(trim($_REQUEST['album']));
-	$newalbum = notags(trim($_REQUEST['newalbum']));
+	// Determine the album to use
+	$album    = x($_REQUEST, 'album') ? notags(trim($_REQUEST['album'])) : '';
+	$newalbum = x($_REQUEST, 'newalbum') ? notags(trim($_REQUEST['newalbum'])) : '';
 
 	logger('mod/photos.php: photos_post(): album= ' . $album . ' newalbum= ' . $newalbum , LOGGER_DEBUG);
 
@@ -787,51 +754,85 @@ function photos_post(App $a) {
 		$visible = 0;
 	}
 
-	if (intval($_REQUEST['not_visible']) || $_REQUEST['not_visible'] === 'true') {
+	if (x($_REQUEST, 'not_visible') && $_REQUEST['not_visible'] !== 'false') {
 		$visible = 0;
 	}
 
-	$str_group_allow   = perms2str((is_array($_REQUEST['group_allow'])   ? $_REQUEST['group_allow']   : explode(',', $_REQUEST['group_allow'])));
-	$str_contact_allow = perms2str((is_array($_REQUEST['contact_allow']) ? $_REQUEST['contact_allow'] : explode(',', $_REQUEST['contact_allow'])));
-	$str_group_deny    = perms2str((is_array($_REQUEST['group_deny'])    ? $_REQUEST['group_deny']    : explode(',', $_REQUEST['group_deny'])));
-	$str_contact_deny  = perms2str((is_array($_REQUEST['contact_deny'])  ? $_REQUEST['contact_deny']  : explode(',', $_REQUEST['contact_deny'])));
+	$group_allow   = defaults($_REQUEST, 'group_allow'  , []);
+	$contact_allow = defaults($_REQUEST, 'contact_allow', []);
+	$group_deny    = defaults($_REQUEST, 'group_deny'   , []);
+	$contact_deny  = defaults($_REQUEST, 'contact_deny' , []);
+
+	$str_group_allow   = perms2str(is_array($group_allow)   ? $group_allow   : explode(',', $group_allow));
+	$str_contact_allow = perms2str(is_array($contact_allow) ? $contact_allow : explode(',', $contact_allow));
+	$str_group_deny    = perms2str(is_array($group_deny)    ? $group_deny    : explode(',', $group_deny));
+	$str_contact_deny  = perms2str(is_array($contact_deny)  ? $contact_deny  : explode(',', $contact_deny));
 
 	$ret = array('src' => '', 'filename' => '', 'filesize' => 0, 'type' => '');
 
-	call_hooks('photo_post_file',$ret);
+	call_hooks('photo_post_file', $ret);
 
-	if (x($ret,'src') && x($ret,'filesize')) {
+	if (x($ret, 'src') && x($ret, 'filesize')) {
 		$src      = $ret['src'];
 		$filename = $ret['filename'];
 		$filesize = $ret['filesize'];
 		$type     = $ret['type'];
+		$error    = UPLOAD_ERR_OK;
 	} else {
-		$src        = $_FILES['userfile']['tmp_name'];
-		$filename   = basename($_FILES['userfile']['name']);
-		$filesize   = intval($_FILES['userfile']['size']);
-		$type       = $_FILES['userfile']['type'];
+		$src      = $_FILES['userfile']['tmp_name'];
+		$filename = basename($_FILES['userfile']['name']);
+		$filesize = intval($_FILES['userfile']['size']);
+		$type     = $_FILES['userfile']['type'];
+		$error    = $_FILES['userfile']['error'];
 	}
+
+	if ($error !== UPLOAD_ERR_OK) {
+		switch ($error) {
+			case UPLOAD_ERR_INI_SIZE:
+				notice(t('Image exceeds size limit of %s', ini_get('upload_max_filesize')) . EOL);
+				break;
+			case UPLOAD_ERR_FORM_SIZE:
+				notice(t('Image exceeds size limit of %s', formatBytes(defaults($_REQUEST, 'MAX_FILE_SIZE', 0))) . EOL);
+				break;
+			case UPLOAD_ERR_PARTIAL:
+				notice(t('Image upload didn\'t complete, please try again') . EOL);
+				break;
+			case UPLOAD_ERR_NO_FILE:
+				notice(t('Image file is missing') . EOL);
+				break;
+			case UPLOAD_ERR_NO_TMP_DIR:
+			case UPLOAD_ERR_CANT_WRITE:
+			case UPLOAD_ERR_EXTENSION:
+				notice(t('Server can\'t accept new file upload at this time, please contact your administrator') . EOL);
+				break;
+		}
+		@unlink($src);
+		$foo = 0;
+		call_hooks('photo_post_end', $foo);
+		return;
+	}
+
 	if ($type == "") {
 		$type = Image::guessType($filename);
 	}
 
 	logger('photos: upload: received file: ' . $filename . ' as ' . $src . ' ('. $type . ') ' . $filesize . ' bytes', LOGGER_DEBUG);
 
-	$maximagesize = Config::get('system','maximagesize');
+	$maximagesize = Config::get('system', 'maximagesize');
 
 	if ($maximagesize && ($filesize > $maximagesize)) {
-		notice( sprintf(t('Image exceeds size limit of %s'), formatBytes($maximagesize)) . EOL);
+		notice(t('Image exceeds size limit of %s', formatBytes($maximagesize)) . EOL);
 		@unlink($src);
 		$foo = 0;
-		call_hooks('photo_post_end',$foo);
+		call_hooks('photo_post_end', $foo);
 		return;
 	}
 
 	if (!$filesize) {
-		notice( t('Image file is empty.') . EOL);
+		notice(t('Image file is empty.') . EOL);
 		@unlink($src);
 		$foo = 0;
-		call_hooks('photo_post_end',$foo);
+		call_hooks('photo_post_end', $foo);
 		return;
 	}
 
@@ -843,7 +844,7 @@ function photos_post(App $a) {
 
 	if (!$Image->isValid()) {
 		logger('mod/photos.php: photos_post(): unable to process image' , LOGGER_DEBUG);
-		notice( t('Unable to process image.') . EOL );
+		notice(t('Unable to process image.') . EOL);
 		@unlink($src);
 		$foo = 0;
 		call_hooks('photo_post_end',$foo);
@@ -872,7 +873,7 @@ function photos_post(App $a) {
 
 	if (!$r) {
 		logger('mod/photos.php: photos_post(): image store failed' , LOGGER_DEBUG);
-		notice( t('Image upload failed.') . EOL );
+		notice(t('Image upload failed.') . EOL);
 		killme();
 	}
 
@@ -888,23 +889,16 @@ function photos_post(App $a) {
 		$smallest = 2;
 	}
 
-	$basename = basename($filename);
 	$uri = item_new_uri($a->get_hostname(), $page_owner_uid);
 
 	// Create item container
-
 	$lat = $lon = null;
-
-	/// @TODO merge these 2 if() into one?
-	if ($exif && $exif['GPS']) {
-		if (Feature::isEnabled($channel_id,'photo_location')) {
-			$lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']);
-			$lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']);
-		}
+	if ($exif && $exif['GPS'] && Feature::isEnabled($channel_id, 'photo_location')) {
+		$lat = getGps($exif['GPS']['GPSLatitude'], $exif['GPS']['GPSLatitudeRef']);
+		$lon = getGps($exif['GPS']['GPSLongitude'], $exif['GPS']['GPSLongitudeRef']);
 	}
 
 	$arr = array();
-
 	if ($lat && $lon) {
 		$arr['coord'] = $lat . ' ' . $lon;
 	}
@@ -946,17 +940,15 @@ function photos_post(App $a) {
 
 	call_hooks('photo_post_end',intval($item_id));
 
-	/*
-	 * addon uploaders should call "killme()" [e.g. exit] within the photo_post_end hook
-	 * if they do not wish to be redirected
-	 */
+	// addon uploaders should call "killme()" [e.g. exit] within the photo_post_end hook
+	// if they do not wish to be redirected
 
 	goaway($_SESSION['photo_return']);
 	// NOTREACHED
 }
 
-function photos_content(App $a) {
-
+function photos_content(App $a)
+{
 	// URLs:
 	// photos/name
 	// photos/name/upload
@@ -966,7 +958,6 @@ function photos_content(App $a) {
 	// photos/name/image/xxxxx
 	// photos/name/image/xxxxx/edit
 
-
 	if (Config::get('system', 'block_public') && !local_user() && !remote_user()) {
 		notice( t('Public access denied.') . EOL);
 		return;
@@ -985,10 +976,8 @@ function photos_content(App $a) {
 
 	$_SESSION['photo_return'] = $a->cmd;
 
-	//
 	// Parse arguments
-	//
-
+	$datum = null;
 	if ($a->argc > 3) {
 		$datatype = $a->argv[2];
 		$datum = $a->argv[3];
@@ -1004,10 +993,7 @@ function photos_content(App $a) {
 		$cmd = 'view';
 	}
 
-	//
 	// Setup permissions structures
-	//
-
 	$can_post       = false;
 	$visitor        = 0;
 	$contact        = null;
@@ -1046,8 +1032,9 @@ function photos_content(App $a) {
 		}
 	}
 
-	// perhaps they're visiting - but not a community page, so they wouldn't have write access
+	$groups = [];
 
+	// perhaps they're visiting - but not a community page, so they wouldn't have write access
 	if (remote_user() && !$visitor) {
 		$contact_id = 0;
 		if (is_array($_SESSION['remote'])) {
@@ -1071,12 +1058,9 @@ function photos_content(App $a) {
 		}
 	}
 
-	/// @TODO merge these 2 if() into one?
-	if (!$remote_contact) {
-		if (local_user()) {
-			$contact_id = $_SESSION['cid'];
-			$contact = $a->contact;
-		}
+	if (!$remote_contact && local_user()) {
+		$contact_id = $_SESSION['cid'];
+		$contact = $a->contact;
 	}
 
 	if ($a->data['user']['hidewall'] && (local_user() != $owner_uid) && !$remote_contact) {
@@ -1084,7 +1068,7 @@ function photos_content(App $a) {
 		return;
 	}
 
-	$sql_extra = permissions_sql($owner_uid,$remote_contact,$groups);
+	$sql_extra = permissions_sql($owner_uid, $remote_contact, $groups);
 
 	$o = "";
 
@@ -1092,23 +1076,17 @@ function photos_content(App $a) {
 	$is_owner = (local_user() && (local_user() == $owner_uid));
 	$o .= profile_tabs($a, $is_owner, $a->data['user']['nickname']);
 
-	/**
-	 * Display upload form
-	 */
-
+	// Display upload form
 	if ($datatype === 'upload') {
 		if (!$can_post) {
 			notice(t('Permission denied.'));
 			return;
 		}
 
-
-		$selname = ($datum ? hex2bin($datum) : '');
-
+		$selname = $datum ? hex2bin($datum) : '';
 
 		$albumselect = '';
 
-
 		$albumselect .= '';
 		if (count($a->data['albums'])) {
 			foreach ($a->data['albums'] as $album) {
@@ -1135,31 +1113,8 @@ function photos_content(App $a) {
 
 		$usage_message = '';
 
-		// Private/public post links for the non-JS ACL form
-		$private_post = 1;
-		if ($_REQUEST['public']) {
-			$private_post = 0;
-		}
-
-		$query_str = $a->query_string;
-		if (strpos($query_str, 'public=1') !== false) {
-			$query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
-		}
-
-		/*
-		 * I think $a->query_string may never have ? in it, but I could be wrong
-		 * It looks like it's from the index.php?q=[etc] rewrite that the web
-		 * server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
-		 */
-		if (strpos($query_str, '?') === false) {
-			$public_post_link = '?public=1';
-		} else {
-			$public_post_link = '&public=1';
-		}
-
 		$tpl = get_markup_template('photos_upload.tpl');
 
-		$albumselect_e = $albumselect;
 		$aclselect_e = ($visitor ? '' : populate_acl($a->user));
 
 		$o .= replace_macros($tpl,array(
@@ -1170,7 +1125,7 @@ function photos_content(App $a) {
 			'$newalbum' => t('New album name: '),
 			'$existalbumtext' => t('or existing album name: '),
 			'$nosharetext' => t('Do not show a status post for this upload'),
-			'$albumselect' => $albumselect_e,
+			'$albumselect' => $albumselect,
 			'$permissions' => t('Permissions'),
 			'$aclselect' => $aclselect_e,
 			'$alt_uploader' => $ret['addon_text'],
@@ -1182,23 +1137,14 @@ function photos_content(App $a) {
 			'$acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector
 			'$group_perms' => t('Show to Groups'),
 			'$contact_perms' => t('Show to Contacts'),
-			'$private' => t('Private Photo'),
-			'$public' => t('Public Photo'),
-			'$is_private' => $private_post,
-			'$return_path' => $query_str,
-			'$public_link' => $public_post_link,
-
+			'$return_path' => $a->query_string,
 		));
 
 		return $o;
 	}
 
-	/*
-	 * Display a single photo album
-	 */
-
+	// Display a single photo album
 	if ($datatype === 'album') {
-
 		$album = hex2bin($datum);
 
 		$r = q("SELECT `resource-id`, max(`scale`) AS `scale` FROM `photo` WHERE `uid` = %d AND `album` = '%s'
@@ -1212,7 +1158,8 @@ function photos_content(App $a) {
 		}
 
 		/// @TODO I have seen this many times, maybe generalize it script-wide and encapsulate it?
-		if ($_GET['order'] === 'posted') {
+		$order_field = defaults($_GET, 'order', '');
+		if ($order_field === 'posted') {
 			$order = 'ASC';
 		} else {
 			$order = 'DESC';
@@ -1253,7 +1200,7 @@ function photos_content(App $a) {
 			}
 		}
 
-		if ($_GET['order'] === 'posted') {
+		if ($order_field === 'posted') {
 			$order =  array(t('Show Newest First'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album));
 		} else {
 			$order = array(t('Show Oldest First'), 'photos/' . $a->data['user']['nickname'] . '/album/' . bin2hex($album) . '?f=&order=posted');
@@ -1261,7 +1208,7 @@ function photos_content(App $a) {
 
 		$photos = array();
 
-		if (DBM::is_result($r))
+		if (DBM::is_result($r)) {
 			// "Twist" is only used for the duepunto theme with style "slackr"
 			$twist = false;
 			foreach ($r as $rr) {
@@ -1276,14 +1223,15 @@ function photos_content(App $a) {
 					'id' => $rr['id'],
 					'twist' => ' ' . ($twist ? 'rotleft' : 'rotright') . rand(2,4),
 					'link' => 'photos/' . $a->data['user']['nickname'] . '/image/' . $rr['resource-id']
-						. (($_GET['order'] === 'posted') ? '?f=&order=posted' : ''),
+						. ($order_field === 'posted' ? '?f=&order=posted' : ''),
 					'title' => t('View Photo'),
 					'src' => 'photo/' . $rr['resource-id'] . '-' . $rr['scale'] . '.' .$ext,
 					'alt' => $imgalt_e,
 					'desc'=> $desc_e,
 					'ext' => $ext,
-					'hash'=> $rr['resource_id'],
+					'hash'=> $rr['resource-id'],
 				);
+			}
 		}
 
 		$tpl = get_markup_template('photo_album.tpl');
@@ -1301,14 +1249,9 @@ function photos_content(App $a) {
 
 	}
 
-	/*
-	 * Display one photo
-	 */
+	// Display one photo
 	if ($datatype === 'image') {
-
-		//$o = '';
 		// fetch image, item containing image, then comments
-
 		$ph = q("SELECT * FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s'
 			$sql_extra ORDER BY `scale` ASC ",
 			intval($owner_uid),
@@ -1336,7 +1279,8 @@ function photos_content(App $a) {
 		// The query leads to a really intense used index.
 		// By now we hide it if someone wants to.
 		if (!Config::get('system', 'no_count', false)) {
-			if ($_GET['order'] === 'posted') {
+			$order_field = defaults($_GET, 'order', '');
+			if ($order_field === 'posted') {
 				$order = 'ASC';
 			} else {
 				$order = 'DESC';
@@ -1363,8 +1307,8 @@ function photos_content(App $a) {
 					}
 				}
 				$edit_suffix = ((($cmd === 'edit') && $can_post) ? '/edit' : '');
-				$prevlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . $edit_suffix . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
-				$nextlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . $edit_suffix . (($_GET['order'] === 'posted') ? '?f=&order=posted' : '');
+				$prevlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$prv]['resource-id'] . $edit_suffix . ($order_field === 'posted' ? '?f=&order=posted' : '');
+				$nextlink = 'photos/' . $a->data['user']['nickname'] . '/image/' . $prvnxt[$nxt]['resource-id'] . $edit_suffix . ($order_field === 'posted' ? '?f=&order=posted' : '');
  			}
 		}
 
@@ -1438,6 +1382,7 @@ function photos_content(App $a) {
 		);
 
 		$map = null;
+		$link_item = [];
 
 		if (DBM::is_result($linked_items)) {
 			$link_item = $linked_items[0];
@@ -1511,31 +1456,9 @@ function photos_content(App $a) {
 
 
 		$edit = Null;
-		if (($cmd === 'edit') && $can_post) {
+		if ($cmd === 'edit' && $can_post) {
 			$edit_tpl = get_markup_template('photo_edit.tpl');
 
-			// Private/public post links for the non-JS ACL form
-			$private_post = 1;
-			if ($_REQUEST['public']) {
-				$private_post = 0;
-			}
-
-			$query_str = $a->query_string;
-			if (strpos($query_str, 'public=1') !== false) {
-				$query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
-			}
-
-			/*
-			 * I think $a->query_string may never have ? in it, but I could be wrong
-			 * It looks like it's from the index.php?q=[etc] rewrite that the web
-			 * server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
-			 */
-			if (strpos($query_str, '?') === false) {
-				$public_post_link = '?public=1';
-			} else {
-				$public_post_link = '&public=1';
-			}
-
 			$album_e = $ph[0]['album'];
 			$caption_e = $ph[0]['desc'];
 			$aclselect_e = populate_acl($ph[0]);
@@ -1554,7 +1477,7 @@ function photos_content(App $a) {
 				'$permissions' => t('Permissions'),
 				'$aclselect' => $aclselect_e,
 
-				'$item_id' => (count($linked_items) ? $link_item['id'] : 0),
+				'$item_id' => defaults($link_item, 'id', 0),
 				'$submit' => t('Submit'),
 				'$delete' => t('Delete Photo'),
 
@@ -1562,25 +1485,24 @@ function photos_content(App $a) {
 				'$acl_data' => construct_acl_data($a, $ph[0]), // For non-Javascript ACL selector
 				'$group_perms' => t('Show to Groups'),
 				'$contact_perms' => t('Show to Contacts'),
-				'$private' => t('Private photo'),
-				'$public' => t('Public photo'),
-				'$is_private' => $private_post,
-				'$return_path' => $query_str,
-				'$public_link' => $public_post_link,
+				'$return_path' => $a->query_string,
 			));
 		}
 
-		if (count($linked_items)) {
+		$like = '';
+		$dislike = '';
+		$likebuttons = '';
+		$comments = '';
+		$paginate = '';
+		$responses = '';
 
+		if (count($linked_items)) {
 			$cmnt_tpl = get_markup_template('comment_item.tpl');
 			$tpl = get_markup_template('photo_item.tpl');
 			$return_url = $a->cmd;
 
-			$like_tpl = get_markup_template('like_noshare.tpl');
-
-			$likebuttons = '';
-
 			if ($can_post || can_write_wall($a, $owner_uid)) {
+				$like_tpl = get_markup_template('like_noshare.tpl');
 				$likebuttons = replace_macros($like_tpl, array(
 					'$id' => $link_item['id'],
 					'$likethis' => t("I like this \x28toggle\x29"),
@@ -1590,7 +1512,6 @@ function photos_content(App $a) {
 				));
 			}
 
-			$comments = '';
 			if (!DBM::is_result($r)) {
 				if (($can_post || can_write_wall($a, $owner_uid)) && $link_item['last-child']) {
 					$comments .= replace_macros($cmnt_tpl, array(
@@ -1613,12 +1534,6 @@ function photos_content(App $a) {
 				}
 			}
 
-			$alike = array();
-			$dlike = array();
-
-			$like = '';
-			$dislike = '';
-
 			$conv_responses = array(
 				'like' => array('title' => t('Likes','title')),'dislike' => array('title' => t('Dislikes','title')),
 				'attendyes' => array('title' => t('Attending','title')), 'attendno' => array('title' => t('Not attending','title')), 'attendmaybe' => array('title' => t('Might attend','title'))
@@ -1626,13 +1541,16 @@ function photos_content(App $a) {
 
 			// display comments
 			if (DBM::is_result($r)) {
-
 				foreach ($r as $item) {
 					builtin_activity_puller($item, $conv_responses);
 				}
 
-				$like    = (x($conv_responses['like'], $link_item['uri']) ? format_like($conv_responses['like'][$link_item['uri']], $conv_responses['like'][$link_item['uri'] . '-l'], 'like',$link_item['id']) : '');
-				$dislike = (x($conv_responses['dislike'], $link_item['uri']) ? format_like($conv_responses['dislike'][$link_item['uri']], $conv_responses['dislike'][$link_item['uri'] . '-l'], 'dislike',$link_item['id']) : '');
+				if (x($conv_responses['like'], $link_item['uri'])) {
+					$like = format_like($conv_responses['like'][$link_item['uri']], $conv_responses['like'][$link_item['uri'] . '-l'], 'like', $link_item['id']);
+				}
+				if (x($conv_responses['dislike'], $link_item['uri'])) {
+					$dislike = format_like($conv_responses['dislike'][$link_item['uri']], $conv_responses['dislike'][$link_item['uri'] . '-l'], 'dislike', $link_item['id']);
+				}
 
 				if (($can_post || can_write_wall($a, $owner_uid)) && $link_item['last-child']) {
 					$comments .= replace_macros($cmnt_tpl,array(
@@ -1654,18 +1572,17 @@ function photos_content(App $a) {
 					));
 				}
 
-
 				foreach ($r as $item) {
 					$comment = '';
 					$template = $tpl;
 					$sparkle = '';
 
-					if ((activity_match($item['verb'], ACTIVITY_LIKE) || activity_match($item['verb'], ACTIVITY_DISLIKE)) && ($item['id'] != $item['parent']))
+					if ((activity_match($item['verb'], ACTIVITY_LIKE) || activity_match($item['verb'], ACTIVITY_DISLIKE)) && ($item['id'] != $item['parent'])) {
 						continue;
+					}
 
 					$redirect_url = 'redir/' . $item['cid'];
 
-
 					if (local_user() && ($item['contact-uid'] == local_user())
 						&& ($item['network'] == NETWORK_DFRN) && !$item['self']) {
 						$profile_url = $redirect_url;
@@ -1729,40 +1646,32 @@ function photos_content(App $a) {
 					}
 				}
 			}
+			$response_verbs = array('like');
+			if (Feature::isEnabled($owner_uid, 'dislike')) {
+				$response_verbs[] = 'dislike';
+			}
+			$responses = get_responses($conv_responses, $response_verbs, '', $link_item);
 
 			$paginate = paginate($a);
 		}
 
-
-		$response_verbs = array('like');
-		if (Feature::isEnabled($owner_uid, 'dislike')) {
-			$response_verbs[] = 'dislike';
-		}
-		$responses = get_responses($conv_responses,$response_verbs, '', $link_item);
-
 		$photo_tpl = get_markup_template('photo_view.tpl');
-
-		$album_e = array($album_link, $ph[0]['album']);
-		$tags_e = $tags;
-		$like_e = $like;
-		$dislike_e = $dislike;
-
 		$o .= replace_macros($photo_tpl, array(
 			'$id' => $ph[0]['id'],
-			'$album' => $album_e,
+			'$album' => [$album_link, $ph[0]['album']],
 			'$tools' => $tools,
 			'$lock' => $lock,
 			'$photo' => $photo,
 			'$prevlink' => $prevlink,
 			'$nextlink' => $nextlink,
 			'$desc' => $ph[0]['desc'],
-			'$tags' => $tags_e,
+			'$tags' => $tags,
 			'$edit' => $edit,
 			'$map' => $map,
 			'$map_text' => t('Map'),
 			'$likebuttons' => $likebuttons,
-			'$like' => $like_e,
-			'$dislike' => $dikslike_e,
+			'$like' => $like,
+			'$dislike' => $dislike,
 			'responses' => $responses,
 			'$comments' => $comments,
 			'$paginate' => $paginate,

From 4e6050489d2179adf9d156b3f00f3c8e9645af0c Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Mon, 1 Jan 2018 16:57:54 -0500
Subject: [PATCH 73/80] Fix formatting and PHP notice in mod/profile

- Use x() and defaults() to fix undefined indexes
- Simplify boolean variables assignment
- Add back undefined variables
---
 mod/profile.php | 48 ++++++++++++++++++++++++------------------------
 1 file changed, 24 insertions(+), 24 deletions(-)

diff --git a/mod/profile.php b/mod/profile.php
index 843f06de3e..de0e345573 100644
--- a/mod/profile.php
+++ b/mod/profile.php
@@ -39,8 +39,8 @@ function profile_init(App $a)
 
 	profile_load($a, $which, $profile);
 
-	$blocked = Config::get('system', 'block_public') && !local_user() && !remote_user();
-	$userblock = $a->profile['hidewall'] && !local_user() && !remote_user();
+	$blocked   = !local_user() && !remote_user() && Config::get('system', 'block_public');
+	$userblock = !local_user() && !remote_user() && $a->profile['hidewall'];
 
 	if (x($a->profile, 'page-flags') && $a->profile['page-flags'] == PAGE_COMMUNITY) {
 		$a->page['htmlhead'] .= '';
@@ -51,13 +51,13 @@ function profile_init(App $a)
 	}
 
 	if (x($a->profile, 'openid')) {
-		$delegate = ((strstr($a->profile['openid'], '://')) ? $a->profile['openid'] : 'https://' . $a->profile['openid']);
+		$delegate = strstr($a->profile['openid'], '://') ? $a->profile['openid'] : 'https://' . $a->profile['openid'];
 		$a->page['htmlhead'] .= '' . "\r\n";
 	}
+
 	// site block
 	if (!$blocked && !$userblock) {
-		$keywords = x($a->profile, 'pub_keywords') ? $a->profile['pub_keywords'] : '';
-		$keywords = str_replace(array('#', ',', ' ', ',,'), array('', ' ', ',', ','), $keywords);
+		$keywords = str_replace(array('#', ',', ' ', ',,'), array('', ' ', ',', ','), defaults($a->profile, 'pub_keywords', ''));
 		if (strlen($keywords)) {
 			$a->page['htmlhead'] .= '' . "\r\n";
 		}
@@ -75,8 +75,7 @@ function profile_init(App $a)
 	foreach ($dfrn_pages as $dfrn) {
 		$a->page['htmlhead'] .= "\r\n";
 	}
-
-	$a->page['htmlhead'] .= "\r\n";
+	$a->page['htmlhead'] .= '\r\n";
 }
 
 function profile_content(App $a, $update = 0)
@@ -98,12 +97,12 @@ function profile_content(App $a, $update = 0)
 	}
 
 	if (!x($category)) {
-		$category = x($_GET, 'category') ? $_GET['category'] : '';
+		$category = defaults($_GET, 'category', '');
 	}
 
-	$hashtags = x($_GET, 'tag') ? $_GET['tag'] : '';
+	$hashtags = defaults($_GET, 'tag', '');
 
-	if (Config::get('system', 'block_public') && (!local_user()) && (!remote_user())) {
+	if (Config::get('system', 'block_public') && !local_user() && !remote_user()) {
 		return login();
 	}
 
@@ -130,7 +129,7 @@ function profile_content(App $a, $update = 0)
 
 	$contact_id = 0;
 
-	if (is_array($_SESSION['remote'])) {
+	if (x($_SESSION, 'remote') && is_array($_SESSION['remote'])) {
 		foreach ($_SESSION['remote'] as $v) {
 			if ($v['uid'] == $a->profile['profile_uid']) {
 				$contact_id = $v['cid'];
@@ -158,15 +157,16 @@ function profile_content(App $a, $update = 0)
 		}
 	}
 
-	$is_owner = local_user() && local_user() == $a->profile['profile_uid'];
+	$is_owner = local_user() == $a->profile['profile_uid'];
 	$last_updated_key = "profile:" . $a->profile['profile_uid'] . ":" . local_user() . ":" . remote_user();
 
-	if ($a->profile['hidewall'] && !$is_owner && !$remote_contact) {
+	if (x($a->profile, 'hidewall') && !$is_owner && !$remote_contact) {
 		notice(t('Access to this profile has been restricted.') . EOL);
 		return;
 	}
 
 	if (!$update) {
+		$tab = false;
 		if (x($_GET, 'tab')) {
 			$tab = notags(trim($_GET['tab']));
 		}
@@ -181,12 +181,12 @@ function profile_content(App $a, $update = 0)
 
 		$o .= common_friends_visitor_widget($a->profile['profile_uid']);
 
-		if (x($_SESSION, 'new_member') && $_SESSION['new_member'] && $is_owner) {
+		if (x($_SESSION, 'new_member') && $is_owner) {
 			$o .= '' . t('Tips for New Members') . '' . EOL;
 		}
 
-		$commpage = (($a->profile['page-flags'] == PAGE_COMMUNITY) ? true : false);
-		$commvisitor = (($commpage && $remote_contact == true) ? true : false);
+		$commpage = $a->profile['page-flags'] == PAGE_COMMUNITY;
+		$commvisitor = $commpage && $remote_contact;
 
 		$a->page['aside'] .= posted_date_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], $a->profile['profile_uid'], true);
 		$a->page['aside'] .= categories_widget(System::baseUrl(true) . '/profile/' . $a->profile['nickname'], (x($category) ? xmlify($category) : ''));
@@ -195,8 +195,8 @@ function profile_content(App $a, $update = 0)
 		if (can_write_wall($a, $a->profile['profile_uid'])) {
 			$x = array(
 				'is_owner' => $is_owner,
-				'allow_location' => ((($is_owner || $commvisitor) && $a->profile['allow_location']) ? true : false),
-				'default_location' => (($is_owner) ? $a->user['default-location'] : ''),
+				'allow_location' => ($is_owner || $commvisitor) && $a->profile['allow_location'],
+				'default_location' => $is_owner ? $a->user['default-location'] : '',
 				'nickname' => $a->profile['nickname'],
 				'lockstate' => is_array($a->user)
 					&& (strlen($a->user['allow_cid'])
@@ -215,8 +215,10 @@ function profile_content(App $a, $update = 0)
 		}
 	}
 
+
 	// Get permissions SQL - if $remote_contact is true, our remote user has been pre-verified and we already have fetched his/her groups
 	$sql_extra = item_permissions_sql($a->profile['profile_uid'], $remote_contact, $groups);
+	$sql_extra2 = '';
 
 	if ($update) {
 		$last_updated = (x($_SESSION['last_updated'], $last_updated_key) ? $_SESSION['last_updated'][$last_updated_key] : 0);
@@ -254,7 +256,6 @@ function profile_content(App $a, $update = 0)
 		if (x($category)) {
 			$sql_post_table = sprintf("INNER JOIN (SELECT `oid` FROM `term` WHERE `term` = '%s' AND `otype` = %d AND `type` = %d AND `uid` = %d ORDER BY `tid` DESC) AS `term` ON `item`.`id` = `term`.`oid` ",
 				dbesc(protect_sprintf($category)), intval(TERM_OBJ_POST), intval(TERM_CATEGORY), intval($a->profile['profile_uid']));
-			//$sql_extra .= protect_sprintf(file_tag_file_query('item',$category,'category'));
 		}
 
 		if (x($hashtags)) {
@@ -274,7 +275,8 @@ function profile_content(App $a, $update = 0)
 		$r = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `page-flags` IN (%d, %d)",
 			intval($a->profile['profile_uid']),
 			intval(PAGE_COMMUNITY),
-			intval(PAGE_PRVGROUP));
+			intval(PAGE_PRVGROUP)
+		);
 
 		if (!DBM::is_result($r)) {
 			$sql_extra3 = sprintf(" AND `thread`.`contact-id` = %d ", intval(intval($a->profile['contact_id'])));
@@ -283,11 +285,9 @@ function profile_content(App $a, $update = 0)
 		//  check if we serve a mobile device and get the user settings
 		//  accordingly
 		if ($a->is_mobile) {
-			$itemspage_network = PConfig::get(local_user(), 'system', 'itemspage_mobile_network');
-			$itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 10);
+			$itemspage_network = PConfig::get(local_user(), 'system', 'itemspage_mobile_network', 10);
 		} else {
-			$itemspage_network = PConfig::get(local_user(), 'system', 'itemspage_network');
-			$itemspage_network = ((intval($itemspage_network)) ? $itemspage_network : 20);
+			$itemspage_network = PConfig::get(local_user(), 'system', 'itemspage_network', 20);
 		}
 
 		//  now that we have the user settings, see if the theme forces

From e8e2e41d73c0611ad10bc143efc6b01bb53c1840 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Mon, 1 Jan 2018 17:04:45 -0500
Subject: [PATCH 74/80] Fix formatting and PHP notices in Object\Post

- Use x() and defaults() to fix undefined indexes
- Simplify boolean variable assignments
- Simplify sprintf(t()) structures
---
 src/Object/Post.php | 126 +++++++++++++++++++-------------------------
 1 file changed, 53 insertions(+), 73 deletions(-)

diff --git a/src/Object/Post.php b/src/Object/Post.php
index 08e7548b9f..28dbf9c3bd 100644
--- a/src/Object/Post.php
+++ b/src/Object/Post.php
@@ -1,7 +1,9 @@
 data = $data;
 		$this->setTemplate('wall');
-		$this->toplevel = ($this->getId() == $this->getDataValue('parent'));
+		$this->toplevel = $this->getId() == $this->getDataValue('parent');
 
-		if (is_array($_SESSION['remote'])) {
+		if (x($_SESSION, 'remote') && is_array($_SESSION['remote'])) {
 			foreach ($_SESSION['remote'] as $visitor) {
 				if ($visitor['cid'] == $this->getDataValue('contact-id')) {
 					$this->visiting = true;
@@ -63,9 +65,7 @@ class Post extends BaseObject
 			}
 		}
 
-		$this->writable = ($this->getDataValue('writable') || $this->getDataValue('self'));
-
-		$ssl_state = ((local_user()) ? true : false);
+		$this->writable = $this->getDataValue('writable') || $this->getDataValue('self');
 		$this->redirect_url = 'redir/' . $this->getDataValue('cid');
 
 		if (!$this->isToplevel()) {
@@ -75,12 +75,10 @@ class Post extends BaseObject
 		// Prepare the children
 		if (count($data['children'])) {
 			foreach ($data['children'] as $item) {
-				/*
-				 * Only add will be displayed
-				 */
+				// Only add will be displayed
 				if ($item['network'] === NETWORK_MAIL && local_user() != $item['uid']) {
 					continue;
-				} elseif (! visible_activity($item)) {
+				} elseif (!visible_activity($item)) {
 					continue;
 				}
 
@@ -145,13 +143,13 @@ class Post extends BaseObject
 			|| strlen($item['deny_cid']) || strlen($item['deny_gid']))))
 			? t('Private Message')
 			: false);
-		$shareable = ((in_array($conv->getProfileOwner(), [0, local_user()]) && ($item['private'] != 1)) ? true : false);
+		$shareable = in_array($conv->getProfileOwner(), [0, local_user()]) && $item['private'] != 1;
 
 		if (local_user() && link_compare($a->contact['url'], $item['author-link'])) {
 			if ($item["event-id"] != 0) {
-				$edpost = array("events/event/".$item['event-id'], t("Edit"));
+				$edpost = array("events/event/" . $item['event-id'], t("Edit"));
 			} else {
-				$edpost = array("editpost/".$item['id'], t("Edit"));
+				$edpost = array("editpost/" . $item['id'], t("Edit"));
 			}
 		} else {
 			$edpost = false;
@@ -170,9 +168,9 @@ class Post extends BaseObject
 
 		$filer = (($conv->getProfileOwner() == local_user()) ? t("save to folder") : false);
 
-		$diff_author    = ((link_compare($item['url'], $item['author-link'])) ? false : true);
-		$profile_name   = htmlentities(((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
-		if ($item['author-link'] && (! $item['author-name'])) {
+		$diff_author = ((link_compare($item['url'], $item['author-link'])) ? false : true);
+		$profile_name = htmlentities(((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
+		if ($item['author-link'] && (!$item['author-name'])) {
 			$profile_name = $item['author-link'];
 		}
 
@@ -210,39 +208,25 @@ class Post extends BaseObject
 		call_hooks('render_location', $locate);
 		$location = ((strlen($locate['html'])) ? $locate['html'] : render_location_dummy($locate));
 
-		$tags=array();
-		$hashtags = array();
-		$mentions = array();
-
-		/*foreach(explode(',',$item['tag']) as $tag){
-			$tag = trim($tag);
-			if ($tag!="") {
-				$t = bbcode($tag);
-				$tags[] = $t;
-				if($t[0] == '#')
-					$hashtags[] = $t;
-				elseif($t[0] == '@')
-					$mentions[] = $t;
-			}
-		}*/
-
 		// process action responses - e.g. like/dislike/attend/agree/whatever
 		$response_verbs = array('like', 'dislike');
 
+		$isevent = false;
+		$attend = [];
 		if ($item['object-type'] === ACTIVITY_OBJ_EVENT) {
 			$response_verbs[] = 'attendyes';
 			$response_verbs[] = 'attendno';
 			$response_verbs[] = 'attendmaybe';
 			if ($conv->isWritable()) {
 				$isevent = true;
-				$attend = array( t('I will attend'), t('I will not attend'), t('I might attend'));
+				$attend = array(t('I will attend'), t('I will not attend'), t('I might attend'));
 			}
 		}
 
 		$responses = get_responses($conv_responses, $response_verbs, $this, $item);
 
 		foreach ($response_verbs as $value => $verbs) {
-			$responses[$verbs]['output']  = ((x($conv_responses[$verbs], $item['uri'])) ? format_like($conv_responses[$verbs][$item['uri']], $conv_responses[$verbs][$item['uri'] . '-l'], $verbs, $item['uri']) : '');
+			$responses[$verbs]['output'] = x($conv_responses[$verbs], $item['uri']) ? format_like($conv_responses[$verbs][$item['uri']], $conv_responses[$verbs][$item['uri'] . '-l'], $verbs, $item['uri']) : '';
 		}
 
 		/*
@@ -256,6 +240,8 @@ class Post extends BaseObject
 			$osparkle = ' sparkle';
 		}
 
+		$tagger = '';
+
 		if ($this->isToplevel()) {
 			if ($conv->getProfileOwner() == local_user()) {
 				$isstarred = (($item['starred']) ? "starred" : "unstarred");
@@ -264,9 +250,9 @@ class Post extends BaseObject
 					'do'        => t("add star"),
 					'undo'      => t("remove star"),
 					'toggle'    => t("toggle star status"),
-					'classdo'   => (($item['starred']) ? "hidden" : ""),
-					'classundo' => (($item['starred']) ? "" : "hidden"),
-					'starred'   =>  t('starred'),
+					'classdo'   => $item['starred'] ? "hidden" : "",
+					'classundo' => $item['starred'] ? "" : "hidden",
+					'starred'   => t('starred'),
 				);
 				$r = dba::select('thread', array('ignored'), array('uid' => $item['uid'], 'iid' => $item['id']), array('limit' => 1));
 				if (DBM::is_result($r)) {
@@ -274,13 +260,12 @@ class Post extends BaseObject
 						'do'        => t("ignore thread"),
 						'undo'      => t("unignore thread"),
 						'toggle'    => t("toggle ignore status"),
-						'classdo'   => (($r['ignored']) ? "hidden" : ""),
-						'classundo' => (($r['ignored']) ? "" : "hidden"),
-						'ignored'   =>  t('ignored'),
+						'classdo'   => $r['ignored'] ? "hidden" : "",
+						'classundo' => $r['ignored'] ? "" : "hidden",
+						'ignored'   => t('ignored'),
 					);
 				}
 
-				$tagger = '';
 				if (Feature::isEnabled($conv->getProfileOwner(), 'commtag')) {
 					$tagger = array(
 						'add'   => t("add tag"),
@@ -294,11 +279,11 @@ class Post extends BaseObject
 
 		if ($conv->isWritable()) {
 			$buttons = array(
-				'like' => array( t("I like this \x28toggle\x29"), t("like")),
-				'dislike' => ((Feature::isEnabled($conv->getProfileOwner(), 'dislike')) ? array( t("I don't like this \x28toggle\x29"), t("dislike")) : ''),
+				'like'    => array(t("I like this \x28toggle\x29"), t("like")),
+				'dislike' => Feature::isEnabled($conv->getProfileOwner(), 'dislike') ? array(t("I don't like this \x28toggle\x29"), t("dislike")) : '',
 			);
 			if ($shareable) {
-				$buttons['share'] = array( t('Share this'), t('share'));
+				$buttons['share'] = array(t('Share this'), t('share'));
 			}
 		}
 
@@ -322,10 +307,10 @@ class Post extends BaseObject
 		$owner_name_e = $this->getOwnerName();
 
 		// Disable features that aren't available in several networks
-
 		/// @todo Add NETWORK_DIASPORA when it will pass this information
 		if (!in_array($item["item_network"], array(NETWORK_DFRN)) && isset($buttons["dislike"])) {
-			unset($buttons["dislike"], $isevent);
+			unset($buttons["dislike"]);
+			$isevent = false;
 			$tagger = '';
 		}
 
@@ -355,8 +340,8 @@ class Post extends BaseObject
 			'guid'            => urlencode($item['guid']),
 			'isevent'         => $isevent,
 			'attend'          => $attend,
-			'linktitle'       => sprintf(t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
-			'olinktitle'      => sprintf(t('View %s\'s profile @ %s'), htmlentities($this->getOwnerName()), ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
+			'linktitle'       => t('View %s\'s profile @ %s', $profile_name, defaults($item, 'author-link', $item['url'])),
+			'olinktitle'      => t('View %s\'s profile @ %s', htmlentities($this->getOwnerName()), defaults($item, 'owner-link', $item['url'])),
 			'to'              => t('to'),
 			'via'             => t('via'),
 			'wall'            => t('Wall-to-Wall'),
@@ -369,7 +354,7 @@ class Post extends BaseObject
 			'sparkle'         => $sparkle,
 			'title'           => $title_e,
 			'localtime'       => datetime_convert('UTC', date_default_timezone_get(), $item['created'], 'r'),
-			'ago'             => (($item['app']) ? sprintf(t('%s from %s'), relative_date($item['created']), $item['app']) : relative_date($item['created'])),
+			'ago'             => $item['app'] ? t('%s from %s', relative_date($item['created']), $item['app']) : relative_date($item['created']),
 			'app'             => $item['app'],
 			'created'         => relative_date($item['created']),
 			'lock'            => $lock,
@@ -380,12 +365,12 @@ class Post extends BaseObject
 			'owner_photo'     => $a->remove_baseurl(proxy_url($item['owner-thumb'], false, PROXY_SIZE_THUMB)),
 			'owner_name'      => htmlentities($owner_name_e),
 			'plink'           => get_plink($item),
-			'edpost'          => ((Feature::isEnabled($conv->getProfileOwner(), 'edit_posts')) ? $edpost : ''),
+			'edpost'          => Feature::isEnabled($conv->getProfileOwner(), 'edit_posts') ? $edpost : '',
 			'isstarred'       => $isstarred,
-			'star'            => ((Feature::isEnabled($conv->getProfileOwner(), 'star_posts')) ? $star : ''),
-			'ignore'          => ((Feature::isEnabled($conv->getProfileOwner(), 'ignore_posts')) ? $ignore : ''),
+			'star'            => Feature::isEnabled($conv->getProfileOwner(), 'star_posts') ? $star : '',
+			'ignore'          => Feature::isEnabled($conv->getProfileOwner(), 'ignore_posts') ? $ignore : '',
 			'tagger'          => $tagger,
-			'filer'           => ((Feature::isEnabled($conv->getProfileOwner(), 'filing')) ? $filer : ''),
+			'filer'           => Feature::isEnabled($conv->getProfileOwner(), 'filing') ? $filer : '',
 			'drop'            => $drop,
 			'vote'            => $buttons,
 			'like'            => $responses['like']['output'],
@@ -393,7 +378,7 @@ class Post extends BaseObject
 			'responses'       => $responses,
 			'switchcomment'   => t('Comment'),
 			'comment'         => $comment,
-			'previewing'      => ($conv->isPreview() ? ' preview ' : ''),
+			'previewing'      => $conv->isPreview() ? ' preview ' : '',
 			'wait'            => t('Please wait'),
 			'thread_level'    => $thread_level,
 			'edited'          => $edited,
@@ -419,7 +404,7 @@ class Post extends BaseObject
 			// Collapse
 			if (($nb_children > 2) || ($thread_level > 1)) {
 				$result['children'][0]['comment_firstcollapsed'] = true;
-				$result['children'][0]['num_comments'] = sprintf(tt('%d comment', '%d comments', $total_children), $total_children);
+				$result['children'][0]['num_comments'] = tt('%d comment', '%d comments', $total_children);
 				$result['children'][0]['hidden_comments_num'] = $total_children;
 				$result['children'][0]['hidden_comments_text'] = tt('comment', 'comments', $total_children);
 				$result['children'][0]['hide_text'] = t('show more');
@@ -480,7 +465,7 @@ class Post extends BaseObject
 			logger('[ERROR] Post::addChild : Item has no ID!!', LOGGER_DEBUG);
 			return false;
 		} elseif ($this->getChild($item->getId())) {
-			logger('[WARN] Post::addChild : Item already exists ('. $item->getId() .').', LOGGER_DEBUG);
+			logger('[WARN] Post::addChild : Item already exists (' . $item->getId() . ').', LOGGER_DEBUG);
 			return false;
 		}
 		/*
@@ -574,7 +559,7 @@ class Post extends BaseObject
 				return true;
 			}
 		}
-		logger('[WARN] Item::removeChild : Item is not a child ('. $id .').', LOGGER_DEBUG);
+		logger('[WARN] Item::removeChild : Item is not a child (' . $id . ').', LOGGER_DEBUG);
 		return false;
 	}
 
@@ -657,7 +642,7 @@ class Post extends BaseObject
 	private function setTemplate($name)
 	{
 		if (!x($this->available_templates, $name)) {
-			logger('[ERROR] Item::setTemplate : Template not available ("'. $name .'").', LOGGER_DEBUG);
+			logger('[ERROR] Item::setTemplate : Template not available ("' . $name . '").', LOGGER_DEBUG);
 			return false;
 		}
 
@@ -696,7 +681,6 @@ class Post extends BaseObject
 		if ($conv) {
 			// This will allow us to comment on wall-to-wall items owned by our friends
 			// and community forums even if somebody else wrote the post.
-
 			// bug #517 - this fixes for conversation owner
 			if ($conv->getMode() == 'profile' && $conv->getProfileOwner() == local_user()) {
 				return true;
@@ -750,14 +734,13 @@ class Post extends BaseObject
 
 		$comment_box = '';
 		$conv = $this->getThread();
-		$template = get_markup_template($this->getCommentBoxTemplate());
 		$ww = '';
 		if (($conv->getMode() === 'network') && $this->isWallToWall()) {
 			$ww = 'ww';
 		}
 
 		if ($conv->isWritable() && $this->isWritable()) {
-			$qc = $qcomment =  null;
+			$qc = $qcomment = null;
 
 			/*
 			 * Hmmm, code depending on the presence of a particular plugin?
@@ -768,18 +751,16 @@ class Post extends BaseObject
 				$qcomment = (($qc) ? explode("\n", $qc) : null);
 			}
 
-			$comment_box = replace_macros(
-				$template,
-				array(
+			$template = get_markup_template($this->getCommentBoxTemplate());
+			$comment_box = replace_macros($template, array(
 				'$return_path' => $a->query_string,
 				'$threaded'    => $this->isThreaded(),
-				// '$jsreload'    => (($conv->getMode() === 'display') ? $_SESSION['return_url'] : ''),
 				'$jsreload'    => '',
-				'$type'        => (($conv->getMode() === 'profile') ? 'wall-comment' : 'net-comment'),
+				'$type'        => $conv->getMode() === 'profile' ? 'wall-comment' : 'net-comment',
 				'$id'          => $this->getId(),
 				'$parent'      => $this->getId(),
 				'$qcomment'    => $qcomment,
-				'$profile_uid' =>  $conv->getProfileOwner(),
+				'$profile_uid' => $conv->getProfileOwner(),
 				'$mylink'      => $a->remove_baseurl($a->contact['url']),
 				'$mytitle'     => t('This is you'),
 				'$myphoto'     => $a->remove_baseurl($a->contact['thumb']),
@@ -796,9 +777,9 @@ class Post extends BaseObject
 				'$preview'     => ((Feature::isEnabled($conv->getProfileOwner(), 'preview')) ? t('Preview') : ''),
 				'$indent'      => $indent,
 				'$sourceapp'   => t($a->sourcename),
-				'$ww'          => (($conv->getMode() === 'network') ? $ww : ''),
-				'$rand_num'    => random_digits(12))
-			);
+				'$ww'          => $conv->getMode() === 'network' ? $ww : '',
+				'$rand_num'    => random_digits(12)
+			));
 		}
 
 		return $comment_box;
@@ -839,14 +820,13 @@ class Post extends BaseObject
 					$alias_linkmatch = (($this->getDataValue('alias')) && link_compare($this->getDataValue('alias'), $this->getDataValue('author-link')));
 					$owner_namematch = (($this->getDataValue('owner-name')) && $this->getDataValue('owner-name') == $this->getDataValue('author-name'));
 
-					if ((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) {
+					if ((!$owner_linkmatch) && (!$alias_linkmatch) && (!$owner_namematch)) {
 						// The author url doesn't match the owner (typically the contact)
 						// and also doesn't match the contact alias.
 						// The name match is a hack to catch several weird cases where URLs are
 						// all over the park. It can be tricked, but this prevents you from
 						// seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn
 						// well that it's the same Bob Smith.
-
 						// But it could be somebody else with the same name. It just isn't highly likely.
 
 
@@ -854,8 +834,8 @@ class Post extends BaseObject
 						$this->owner_name = $this->getDataValue('owner-name');
 						$this->wall_to_wall = true;
 						// If it is our contact, use a friendly redirect link
-						if ((link_compare($this->getDataValue('owner-link'), $this->getDataValue('url')))
-							&& ($this->getDataValue('network') === NETWORK_DFRN)
+						if ($this->getDataValue('network') === NETWORK_DFRN
+							&& link_compare($this->getDataValue('owner-link'), $this->getDataValue('url'))
 						) {
 							$this->owner_url = $this->getRedirectUrl();
 						} else {

From 69df67740cf01e5a82db6033c7c5b5f3f22b0671 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Mon, 1 Jan 2018 17:12:40 -0500
Subject: [PATCH 75/80] Last minute fix to include/items

- Use defaults() to fix undefined indexes
---
 include/items.php | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/include/items.php b/include/items.php
index 9bb5ceb79c..02f21d4923 100644
--- a/include/items.php
+++ b/include/items.php
@@ -421,7 +421,7 @@ function uri_to_guid($uri, $host = "") {
  * @return array Item array with removed conversation data
  */
 function store_conversation($arr) {
-	if (in_array($arr['network'], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)) && !empty($arr['uri'])) {
+	if (in_array(defaults($arr, 'network', NETWORK_PHANTOM), array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)) && !empty($arr['uri'])) {
 		$conversation = array('item-uri' => $arr['uri'], 'received' => DBM::date());
 
 		if (isset($arr['parent-uri']) && ($arr['parent-uri'] != $arr['uri'])) {
@@ -535,7 +535,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 
 	// Converting the plink
 	/// @todo Check if this is really still needed
-	if ($arr['network'] == NETWORK_OSTATUS) {
+	if (defaults($arr, 'network', NETWORK_PHANTOM) == NETWORK_OSTATUS) {
 		if (isset($arr['plink'])) {
 			$arr['plink'] = OStatus::convertHref($arr['plink']);
 		} elseif (isset($arr['uri'])) {
@@ -581,7 +581,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 	 * We have to check several networks since Friendica posts could be repeated
 	 * via OStatus (maybe Diasporsa as well)
 	 */
-	if (in_array(trim($arr['network']), array(NETWORK_DIASPORA, NETWORK_DFRN, NETWORK_OSTATUS, ""))) {
+	if (in_array(trim(defaults($arr, 'network', NETWORK_PHANTOM)), array(NETWORK_DIASPORA, NETWORK_DFRN, NETWORK_OSTATUS, ""))) {
 		$r = q("SELECT `id`, `network` FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `network` IN ('%s', '%s', '%s')  LIMIT 1",
 				dbesc(trim($arr['uri'])),
 				intval($uid),

From 60d4c6b86e8e9834e05006a272edcd8058c53e55 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Tue, 2 Jan 2018 08:20:33 -0500
Subject: [PATCH 76/80] Fix PHP Notice in new OEmbed class

---
 src/Content/OEmbed.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/Content/OEmbed.php b/src/Content/OEmbed.php
index 020d3b9b76..70be8fd738 100644
--- a/src/Content/OEmbed.php
+++ b/src/Content/OEmbed.php
@@ -100,7 +100,7 @@ class OEmbed
 
 			$txt = trim($txt);
 
-			if ($txt[0] != "{") {
+			if (!$txt || $txt[0] != "{") {
 				$txt = '{"type":"error"}';
 			} else { //save in cache
 				$j = json_decode($txt);

From 3dab04e6cc5c2ced6ed474f0146cb0325e1a5700 Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Tue, 2 Jan 2018 08:30:15 -0500
Subject: [PATCH 77/80] Review: Removed unused code in include/bbcode

---
 include/bbcode.php | 2 --
 1 file changed, 2 deletions(-)

diff --git a/include/bbcode.php b/include/bbcode.php
index ef7053010d..261bdfcf66 100644
--- a/include/bbcode.php
+++ b/include/bbcode.php
@@ -485,8 +485,6 @@ function bb_ShareAttributes($share, $simplehtml)
 
 	$posted = "";
 
-	$itemcache = get_itemcachepath();
-
 	preg_match("/posted='(.*?)'/ism", $attributes, $matches);
 	if (x($matches, 1)) {
 		$posted = $matches[1];

From 9ea4fad46c7eb43f681abc104ad01f5ea5ac05be Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Tue, 2 Jan 2018 08:32:53 -0500
Subject: [PATCH 78/80] Review: Ensure $arr['network'] is populated in
 item_store

---
 include/items.php | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/include/items.php b/include/items.php
index 02f21d4923..8f15f94799 100644
--- a/include/items.php
+++ b/include/items.php
@@ -479,8 +479,8 @@ function store_conversation($arr) {
 }
 
 /// @TODO add type-hint array
-function item_store($arr, $force_parent = false, $notify = false, $dontcache = false) {
-
+function item_store($arr, $force_parent = false, $notify = false, $dontcache = false)
+{
 	$a = get_app();
 
 	// If it is a posting where users should get notifications, then define it as wall posting
@@ -502,6 +502,8 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 				$arr['guid'] = uri_to_guid($arr['uri'], $a->get_hostname());
 			}
 		}
+	} else {
+		$arr['network'] = trim(defaults($arr, 'network', NETWORK_PHANTOM));
 	}
 
 	if ($notify) {
@@ -535,7 +537,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 
 	// Converting the plink
 	/// @todo Check if this is really still needed
-	if (defaults($arr, 'network', NETWORK_PHANTOM) == NETWORK_OSTATUS) {
+	if ($arr['network'] == NETWORK_OSTATUS) {
 		if (isset($arr['plink'])) {
 			$arr['plink'] = OStatus::convertHref($arr['plink']);
 		} elseif (isset($arr['uri'])) {
@@ -581,7 +583,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 	 * We have to check several networks since Friendica posts could be repeated
 	 * via OStatus (maybe Diasporsa as well)
 	 */
-	if (in_array(trim(defaults($arr, 'network', NETWORK_PHANTOM)), array(NETWORK_DIASPORA, NETWORK_DFRN, NETWORK_OSTATUS, ""))) {
+	if (in_array($arr['network'], array(NETWORK_DIASPORA, NETWORK_DFRN, NETWORK_OSTATUS, ""))) {
 		$r = q("SELECT `id`, `network` FROM `item` WHERE `uri` = '%s' AND `uid` = %d AND `network` IN ('%s', '%s', '%s')  LIMIT 1",
 				dbesc(trim($arr['uri'])),
 				intval($uid),
@@ -644,7 +646,6 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 	$arr['attach']        = ((x($arr, 'attach'))        ? notags(trim($arr['attach']))        : '');
 	$arr['app']           = ((x($arr, 'app'))           ? notags(trim($arr['app']))           : '');
 	$arr['origin']        = ((x($arr, 'origin'))        ? intval($arr['origin'])              : 0 );
-	$arr['network']       = ((x($arr, 'network'))       ? trim($arr['network'])               : '');
 	$arr['postopts']      = ((x($arr, 'postopts'))      ? trim($arr['postopts'])              : '');
 	$arr['resource-id']   = ((x($arr, 'resource-id'))   ? trim($arr['resource-id'])           : '');
 	$arr['event-id']      = ((x($arr, 'event-id'))      ? intval($arr['event-id'])            : 0 );
@@ -674,18 +675,19 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 		$arr['plink'] = System::baseUrl() . '/display/' . urlencode($arr['guid']);
 	}
 
-	if ($arr['network'] == "") {
+	if ($arr['network'] == NETWORK_PHANTOM) {
 		$r = q("SELECT `network` FROM `contact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' AND `uid` = %d LIMIT 1",
 			dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS),
 			dbesc(normalise_link($arr['author-link'])),
 			intval($arr['uid'])
 		);
 
-		if (!DBM::is_result($r))
+		if (!DBM::is_result($r)) {
 			$r = q("SELECT `network` FROM `gcontact` WHERE `network` IN ('%s', '%s', '%s') AND `nurl` = '%s' LIMIT 1",
 				dbesc(NETWORK_DFRN), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_OSTATUS),
 				dbesc(normalise_link($arr['author-link']))
 			);
+		}
 
 		if (!DBM::is_result($r)) {
 			$r = q("SELECT `network` FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
@@ -733,7 +735,7 @@ function item_store($arr, $force_parent = false, $notify = false, $dontcache = f
 		logger("Contact-id was missing for post ".$arr["guid"]." from user id ".$uid." - now set to ".$arr["contact-id"], LOGGER_DEBUG);
 	}
 
-	if (defaults($arr, "gcontact-id", 0) === 0) {
+	if (!x($arr, "gcontact-id")) {
 		/*
 		 * The gcontact should mostly behave like the contact. But is is supposed to be global for the system.
 		 * This means that wall posts, repeated posts, etc. should have the gcontact id of the owner.

From 7d40f22a2ee9d0c0fb34894546f19176be29f48b Mon Sep 17 00:00:00 2001
From: Hypolite Petovan 
Date: Tue, 2 Jan 2018 08:36:35 -0500
Subject: [PATCH 79/80] Review: Simplify boolean assignment in Object\Post

---
 src/Object/Post.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/Object/Post.php b/src/Object/Post.php
index 28dbf9c3bd..dd32fc3e3e 100644
--- a/src/Object/Post.php
+++ b/src/Object/Post.php
@@ -168,7 +168,7 @@ class Post extends BaseObject
 
 		$filer = (($conv->getProfileOwner() == local_user()) ? t("save to folder") : false);
 
-		$diff_author = ((link_compare($item['url'], $item['author-link'])) ? false : true);
+		$diff_author = !link_compare($item['url'], $item['author-link']);
 		$profile_name = htmlentities(((strlen($item['author-name'])) && $diff_author) ? $item['author-name'] : $item['name']);
 		if ($item['author-link'] && (!$item['author-name'])) {
 			$profile_name = $item['author-link'];

From ebb60ddd58029b40e7650d1377dc94ec894f811e Mon Sep 17 00:00:00 2001
From: rabuzarus <>
Date: Tue, 2 Jan 2018 15:48:11 +0100
Subject: [PATCH 80/80] bugfix: -frio- save search button should be only
 visible if the feature is enabled

---
 view/theme/frio/templates/searchbox.tpl | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/view/theme/frio/templates/searchbox.tpl b/view/theme/frio/templates/searchbox.tpl
index 7d6fbef654..d95d1a4114 100644
--- a/view/theme/frio/templates/searchbox.tpl
+++ b/view/theme/frio/templates/searchbox.tpl
@@ -47,8 +47,10 @@ Some parts of this template will be moved by js to other places (see theme.js) -
 		
 	
 	{{* This form is inserted as experiment to move the search-save button to the second navbar with js *}}
+	{{if $savedsearch}}
 	
+ {{/if}}