From 7c3fd2adb5364385ed51b3ec8ab3613430caf20e Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 22 Nov 2017 07:21:19 +0000 Subject: [PATCH 01/38] Some more replaced old database functions --- include/dba.php | 14 ++---- include/event.php | 2 +- include/items.php | 20 ++------ include/like.php | 4 +- include/oauth.php | 2 +- include/oembed.php | 8 +-- include/plugin.php | 105 ++++++++++++++++------------------------ include/queue_fn.php | 4 +- include/threads.php | 2 +- src/Worker/CronJobs.php | 11 +++-- 10 files changed, 65 insertions(+), 107 deletions(-) diff --git a/include/dba.php b/include/dba.php index 79c15c85bd..642539a759 100644 --- a/include/dba.php +++ b/include/dba.php @@ -1016,16 +1016,12 @@ class dba { public static function update($table, $fields, $condition, $old_fields = array()) { $table = self::escape($table); - if (count($condition) > 0) { - $array_element = each($condition); - $array_key = $array_element['key']; - if (is_int($array_key)) { - $condition_string = " WHERE ".array_shift($condition); - } else { - $condition_string = " WHERE `".implode("` = ? AND `", array_keys($condition))."` = ?"; - } + $array_element = each($condition); + $array_key = $array_element['key']; + if (is_int($array_key)) { + $condition_string = " WHERE ".array_shift($condition); } else { - $condition_string = ""; + $condition_string = " WHERE `".implode("` = ? AND `", array_keys($condition))."` = ?"; } if (is_bool($old_fields)) { diff --git a/include/event.php b/include/event.php index 9a74551bcf..4ecc411b78 100644 --- a/include/event.php +++ b/include/event.php @@ -216,7 +216,7 @@ function event_delete($event_id) { return; } - q("DELETE FROM `event` WHERE `id` = %d", intval($event_id)); + dba::delete('event', array('id' => $event_id)); logger("Deleted event ".$event_id, LOGGER_DEBUG); } diff --git a/include/items.php b/include/items.php index 1f55112174..b251915347 100644 --- a/include/items.php +++ b/include/items.php @@ -2122,7 +2122,7 @@ function drop_item($id, $interactive = true) { } - if ((local_user() == $item['uid']) || ($contact_id) || (! $interactive)) { + if ((local_user() == $item['uid']) || $contact_id || !$interactive) { // Check if we should do HTML-based delete confirmation if ($_REQUEST['confirm']) { @@ -2189,30 +2189,18 @@ function drop_item($id, $interactive = true) { * generate a resource-id and therefore aren't intimately linked to the item. */ if (strlen($item['resource-id'])) { - q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `uid` = %d ", - dbesc($item['resource-id']), - intval($item['uid']) - ); - // ignore the result + dba::delete('photo', array('resource-id' => $item['resource-id'], 'uid' => $item['uid'])); } // If item is a link to an event, nuke the event record. if (intval($item['event-id'])) { - q("DELETE FROM `event` WHERE `id` = %d AND `uid` = %d", - intval($item['event-id']), - intval($item['uid']) - ); - // ignore the result + dba::delete('event', array('id' => $item['event-id'], 'uid' => $item['uid'])); } // If item has attachments, drop them foreach (explode(", ", $item['attach']) as $attach) { preg_match("|attach/(\d+)|", $attach, $matches); - q("DELETE FROM `attach` WHERE `id` = %d AND `uid` = %d", - intval($matches[1]), - local_user() - ); - // ignore the result + dba::delete('attach', array('id' => $matches[1], 'uid' => $item['uid'])); } // The new code splits the queries since the mysql optimizer really has bad problems with subqueries diff --git a/include/like.php b/include/like.php index e6f1aab6de..96cc477b8b 100644 --- a/include/like.php +++ b/include/like.php @@ -163,9 +163,7 @@ function do_like($item_id, $verb) { // Clean up the Diaspora signatures for this like // Go ahead and do it even if Diaspora support is disabled. We still want to clean up // if it had been enabled in the past - q("DELETE FROM `sign` WHERE `iid` = %d", - intval($like_item['id']) - ); + dba::delete('sign', array('iid' => $like_item['id'])); $like_item_id = $like_item['id']; Worker::add(PRIORITY_HIGH, "Notifier", "like", $like_item_id); diff --git a/include/oauth.php b/include/oauth.php index bb12278685..c6993d05b0 100644 --- a/include/oauth.php +++ b/include/oauth.php @@ -113,7 +113,7 @@ class FKOAuthDataStore extends OAuthDataStore { } - q("DELETE FROM tokens WHERE id='%s'", $token->key); + dba::delete('tokens', array('id' => $token->key)); if (!is_null($ret) && $uverifier!==false){ diff --git a/include/oembed.php b/include/oembed.php index 74ce90dd1a..b7c1616fee 100755 --- a/include/oembed.php +++ b/include/oembed.php @@ -28,17 +28,17 @@ function oembed_replacecb($matches){ * @return bool|object Returns object with embed content or false if no embedable * content exists */ -function oembed_fetch_url($embedurl, $no_rich_type = false){ +function oembed_fetch_url($embedurl, $no_rich_type = false) { $embedurl = trim($embedurl, "'"); $embedurl = trim($embedurl, '"'); $a = get_app(); - $r = q("SELECT * FROM `oembed` WHERE `url` = '%s'", - dbesc(normalise_link($embedurl))); + $condition = array('url' => normalise_link($embedurl)); + $r = dba::select('oembed', array('content'), $condition, array('limit' => 1)); if (DBM::is_result($r)) { - $txt = $r[0]["content"]; + $txt = $r["content"]; } else { $txt = Cache::get($a->videowidth . $embedurl); } diff --git a/include/plugin.php b/include/plugin.php index 2814b24647..276c36bd21 100644 --- a/include/plugin.php +++ b/include/plugin.php @@ -16,19 +16,16 @@ use Friendica\Database\DBM; * @param string $plugin name of the addon * @return boolean */ -if (! function_exists('uninstall_plugin')){ -function uninstall_plugin($plugin){ +function uninstall_plugin($plugin) { logger("Addons: uninstalling " . $plugin); - q("DELETE FROM `addon` WHERE `name` = '%s' ", - dbesc($plugin) - ); + dba::delete('addon', array('name' => $plugin)); @include_once('addon/' . $plugin . '/' . $plugin . '.php'); if (function_exists($plugin . '_uninstall')) { $func = $plugin . '_uninstall'; $func(); } -}} +} /** * @brief installs an addon. @@ -36,12 +33,12 @@ function uninstall_plugin($plugin){ * @param string $plugin name of the addon * @return bool */ -if (! function_exists('install_plugin')){ function install_plugin($plugin) { // silently fail if plugin was removed - if (! file_exists('addon/' . $plugin . '/' . $plugin . '.php')) + if (!file_exists('addon/' . $plugin . '/' . $plugin . '.php')) { return false; + } logger("Addons: installing " . $plugin); $t = @filemtime('addon/' . $plugin . '/' . $plugin . '.php'); @include_once('addon/' . $plugin . '/' . $plugin . '.php'); @@ -62,26 +59,24 @@ function install_plugin($plugin) { dba::update('addon', array('hidden' => true), array('name' => $plugin)); } return true; - } - else { + } else { logger("Addons: FAILED installing " . $plugin); return false; } - -}} +} // reload all updated plugins -if (! function_exists('reload_plugins')) { function reload_plugins() { - $plugins = Config::get('system','addon'); + $plugins = Config::get('system', 'addon'); if (strlen($plugins)) { $r = q("SELECT * FROM `addon` WHERE `installed` = 1"); - if (DBM::is_result($r)) + if (DBM::is_result($r)) { $installed = $r; - else + } else { $installed = array(); + } $parr = explode(',',$plugins); @@ -115,7 +110,7 @@ function reload_plugins() { } } -}} +} /** * @brief check if addon is enabled @@ -137,21 +132,17 @@ function plugin_enabled($plugin) { * @param int $priority A priority (defaults to 0) * @return mixed|bool */ -if (! function_exists('register_hook')) { -function register_hook($hook,$file,$function,$priority=0) { - - $r = q("SELECT * FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s' LIMIT 1", - dbesc($hook), - dbesc($file), - dbesc($function) - ); - if (DBM::is_result($r)) +function register_hook($hook, $file, $function, $priority=0) { + $condition = array('hook' => $hook, 'file' => $file, 'function' => $function); + $exists = dba::exists('hook', $condition); + if ($exists) { return true; + } $r = dba::insert('hook', array('hook' => $hook, 'file' => $file, 'function' => $function, 'priority' => $priority)); return $r; -}} +} /** * @brief unregisters a hook. @@ -161,16 +152,11 @@ function register_hook($hook,$file,$function,$priority=0) { * @param string $function the name of the function that the hook called * @return array */ -if (! function_exists('unregister_hook')) { -function unregister_hook($hook,$file,$function) { - - $r = q("DELETE FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s'", - dbesc($hook), - dbesc($file), - dbesc($function) - ); +function unregister_hook($hook, $file, $function) { + $condition = array('hook' => $hook, 'file' => $file, 'function' => $function); + $r = dba::delete('hook', $condition); return $r; -}} +} function load_hooks() { @@ -224,17 +210,13 @@ function call_single_hook($a, $name, $hook, &$data = null) { $func($a, $data); } else { // remove orphan hooks - q("DELETE FROM `hook` WHERE `hook` = '%s' AND `file` = '%s' AND `function` = '%s'", - dbesc($name), - dbesc($hook[0]), - dbesc($hook[1]) - ); + $condition = array('hook' => $name, 'file' => $hook[0], 'function' => $hook[1]); + dba::delete('hook', $condition); } } //check if an app_menu hook exist for plugin $name. //Return true if the plugin is an app -if (! function_exists('plugin_is_app')) { function plugin_is_app($name) { $a = get_app(); @@ -246,7 +228,7 @@ function plugin_is_app($name) { } return false; -}} +} /** * @brief Parse plugin comment in search of plugin infos. @@ -264,8 +246,7 @@ function plugin_is_app($name) { * @return array with the plugin information */ -if (! function_exists('get_plugin_info')){ -function get_plugin_info($plugin){ +function get_plugin_info($plugin) { $a = get_app(); @@ -285,14 +266,14 @@ function get_plugin_info($plugin){ $r = preg_match("|/\*.*\*/|msU", $f, $m); - if ($r){ + if ($r) { $ll = explode("\n", $m[0]); foreach ( $ll as $l ) { $l = trim($l,"\t\n\r */"); - if ($l!=""){ + if ($l != "") { list($k,$v) = array_map("trim", explode(":",$l,2)); $k= strtolower($k); - if ($k=="author"){ + if ($k == "author") { $r=preg_match("|([^<]+)<([^>]+)>|", $v, $m); if ($r) { $info['author'][] = array('name'=>$m[1], 'link'=>$m[2]); @@ -300,7 +281,7 @@ function get_plugin_info($plugin){ $info['author'][] = array('name'=>$v); } } else { - if (array_key_exists($k,$info)){ + if (array_key_exists($k,$info)) { $info[$k]=$v; } } @@ -310,7 +291,7 @@ function get_plugin_info($plugin){ } return $info; -}} +} /** @@ -329,8 +310,7 @@ function get_plugin_info($plugin){ * @return array */ -if (! function_exists('get_theme_info')){ -function get_theme_info($theme){ +function get_theme_info($theme) { $info=Array( 'name' => $theme, 'description' => "", @@ -356,14 +336,14 @@ function get_theme_info($theme){ $r = preg_match("|/\*.*\*/|msU", $f, $m); - if ($r){ + if ($r) { $ll = explode("\n", $m[0]); foreach ( $ll as $l ) { $l = trim($l,"\t\n\r */"); - if ($l!=""){ + if ($l != "") { list($k,$v) = array_map("trim", explode(":",$l,2)); $k= strtolower($k); - if ($k=="author"){ + if ($k == "author") { $r=preg_match("|([^<]+)<([^>]+)>|", $v, $m); if ($r) { @@ -371,8 +351,7 @@ function get_theme_info($theme){ } else { $info['author'][] = array('name'=>$v); } - } - elseif ($k=="maintainer"){ + } elseif ($k == "maintainer") { $r=preg_match("|([^<]+)<([^>]+)>|", $v, $m); if ($r) { $info['maintainer'][] = array('name'=>$m[1], 'link'=>$m[2]); @@ -380,7 +359,7 @@ function get_theme_info($theme){ $info['maintainer'][] = array('name'=>$v); } } else { - if (array_key_exists($k,$info)){ + if (array_key_exists($k,$info)) { $info[$k]=$v; } } @@ -390,7 +369,7 @@ function get_theme_info($theme){ } return $info; -}} +} /** * @brief Returns the theme's screenshot. @@ -411,8 +390,7 @@ function get_theme_screenshot($theme) { } // install and uninstall theme -if (! function_exists('uninstall_theme')){ -function uninstall_theme($theme){ +function uninstall_theme($theme) { logger("Addons: uninstalling theme " . $theme); include_once("view/theme/$theme/theme.php"); @@ -420,9 +398,8 @@ function uninstall_theme($theme){ $func = "{$theme}_uninstall"; $func(); } -}} +} -if (! function_exists('install_theme')){ function install_theme($theme) { // silently fail if theme was removed @@ -443,7 +420,7 @@ function install_theme($theme) { return false; } -}} +} /** * @brief Get the full path to relevant theme files by filename diff --git a/include/queue_fn.php b/include/queue_fn.php index e6fd14e07c..c4ab229aee 100644 --- a/include/queue_fn.php +++ b/include/queue_fn.php @@ -13,9 +13,7 @@ function update_queue_time($id) { function remove_queue_item($id) { logger('queue: remove queue item ' . $id); - q("DELETE FROM `queue` WHERE `id` = %d", - intval($id) - ); + dba::delete('queue', array('id' => $id)); } /** diff --git a/include/threads.php b/include/threads.php index 107f2f76b1..00848ccc6e 100644 --- a/include/threads.php +++ b/include/threads.php @@ -251,7 +251,7 @@ function delete_thread($itemid, $itemuri = "") { } // Using dba::delete at this time could delete the associated item entries - $result = q("DELETE FROM `thread` WHERE `iid` = %d", intval($itemid)); + $result = dba::e("DELETE FROM `thread` WHERE `iid` = ?", $itemid); logger("delete_thread: Deleted thread for item ".$itemid." - ".print_r($result, true), LOGGER_DEBUG); diff --git a/src/Worker/CronJobs.php b/src/Worker/CronJobs.php index 08a1af6dcf..cbfa86ed88 100644 --- a/src/Worker/CronJobs.php +++ b/src/Worker/CronJobs.php @@ -155,14 +155,15 @@ class CronJobs { if (!$cachetime) { $cachetime = PROXY_DEFAULT_TIME; } - q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime); + $condition = array('`uid` = 0 AND `resource-id` LIKE "pic:%" AND `created` < NOW() - INTERVAL ? SECOND', $cachetime); + dba::delete('photo', $condition); } - // Delete the cached OEmbed entries that are older than one year - q("DELETE FROM `oembed` WHERE `created` < NOW() - INTERVAL 3 MONTH"); + // Delete the cached OEmbed entries that are older than three month + dba::delete('oembed', array("`created` < NOW() - INTERVAL 3 MONTH")); - // Delete the cached "parse_url" entries that are older than one year - q("DELETE FROM `parsed_url` WHERE `created` < NOW() - INTERVAL 3 MONTH"); + // Delete the cached "parse_url" entries that are older than three month + dba::delete('parsed_url', array("`created` < NOW() - INTERVAL 3 MONTH")); // Maximum table size in megabyte $max_tablesize = intval(Config::get('system','optimize_max_tablesize')) * 1000000; From c6c180e8b92edc20f059fa9071e53d9cfee5664d Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 22 Nov 2017 09:11:44 +0000 Subject: [PATCH 02/38] Some more changed calls --- include/api.php | 12 ++---------- include/group.php | 26 +++++++++++--------------- 2 files changed, 13 insertions(+), 25 deletions(-) diff --git a/include/api.php b/include/api.php index 9f91139d1f..7c012ddbb7 100644 --- a/include/api.php +++ b/include/api.php @@ -3435,11 +3435,7 @@ function api_fr_photoalbum_delete($type) } // now let's delete all photos from the album - $result = q( - "DELETE FROM `photo` WHERE `uid` = %d AND `album` = '%s'", - intval(api_user()), - dbesc($album) - ); + $result = dba::delete('photo', array('uid' => api_user(), 'album' => $album)); // return success of deletion or error message if ($result) { @@ -3722,11 +3718,7 @@ function api_fr_photo_delete($type) throw new BadRequestException("photo not available"); } // now we can perform on the deletion of the photo - $result = q( - "DELETE FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s'", - intval(api_user()), - dbesc($photo_id) - ); + $result = dba::delete('photo', array('uid' => api_user(), 'resource-id' => $photo_id)); // return success of deletion or error message if ($result) { diff --git a/include/group.php b/include/group.php index d3c3a81710..6e7348c4e2 100644 --- a/include/group.php +++ b/include/group.php @@ -79,10 +79,7 @@ function group_rmv($uid,$name) { } // remove all members - $r = q("DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d ", - intval($uid), - intval($group_id) - ); + dba::delete('group_member', array('uid' => $uid, 'pid' => $group_id)); // remove group $r = q("UPDATE `group` SET `deleted` = 1 WHERE `uid` = %d AND `name` = '%s'", @@ -109,20 +106,19 @@ function group_byname($uid,$name) { return false; } -function group_rmv_member($uid,$name,$member) { - $gid = group_byname($uid,$name); - if (! $gid) +function group_rmv_member($uid, $name, $member) { + $gid = group_byname($uid, $name); + + if (!$gid) { return false; - if (! ( $uid && $gid && $member)) + } + + if (!($uid && $gid && $member)) { return false; - $r = q("DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `contact-id` = %d", - intval($uid), - intval($gid), - intval($member) - ); + } + + $r = dba::delete('group_member', array('uid' => $uid, 'gid' => $gid, 'contact-id' => $member)); return $r; - - } From 87660ac9e63bfc6c76e2abb668586a425a9c4fed Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 22 Nov 2017 09:14:42 +0000 Subject: [PATCH 03/38] /src is now free from old style delete queries --- src/App.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/App.php b/src/App.php index 1bb35e1dc2..ab64d7a3f4 100644 --- a/src/App.php +++ b/src/App.php @@ -722,7 +722,7 @@ class App { if (DBM::is_result($r)) { foreach ($r AS $process) { if (!posix_kill($process['pid'], 0)) { - q('DELETE FROM `process` WHERE `pid` = %d', intval($process['pid'])); + dba::delete('process', array('pid' => $process['pid'])); } } } @@ -733,7 +733,7 @@ class App { * @brief Remove the active process from the "process" table */ function end_process() { - q('DELETE FROM `process` WHERE `pid` = %d', intval(getmypid())); + dba::delete('process', array('pid' => getmypid())); } function get_useragent() { From a8b6052c5a84ed84287660490651369a96bf50b6 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Wed, 22 Nov 2017 09:02:55 -0500 Subject: [PATCH 04/38] Contact Standards Some updates for Contact --- src/Object/Contact.php | 52 ++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/src/Object/Contact.php b/src/Object/Contact.php index 876083971c..b10c9a16d5 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -21,12 +21,15 @@ use dba; require_once 'boot.php'; require_once 'include/text.php'; +/** + * @brief functions for interacting with a contact + */ class Contact extends BaseObject { /** * @brief Marks a contact for removal * - * @param int $id + * @param int $id contact id * @return null */ public static function remove($id) @@ -56,7 +59,7 @@ class Contact extends BaseObject /** * @brief Sends an unfriend message. Does not remove the contact * - * @param array $user User unfriending + * @param array $user User unfriending * @param array $contact Contact unfriended */ public static function terminateFriendship(array $user, array $contact) @@ -88,7 +91,7 @@ class Contact extends BaseObject * This provides for the possibility that their database is temporarily messed * up or some other transient event and that there's a possibility we could recover from it. * - * @param array $contact + * @param array $contact contact to mark for archival * @return type */ public static function markForArchival(array $contact) @@ -110,7 +113,6 @@ class Contact extends BaseObject ); } } else { - /* @todo * We really should send a notification to the owner after 2-3 weeks * so they won't be surprised when the contact vanishes and can take @@ -120,7 +122,6 @@ class Contact extends BaseObject /// @todo Check for contact vitality via probing $expiry = $contact['term-date'] . ' + 32 days '; if (datetime_convert() > datetime_convert('UTC', 'UTC', $expiry)) { - /* Relationship is really truly dead. archive them rather than * delete, though if the owner tries to unarchive them we'll start * the whole process over again. @@ -143,7 +144,7 @@ class Contact extends BaseObject * * @see Contact::markForArchival() * - * @param array $contact + * @param array $contact contact to be unmarked for archival * @return null */ public static function unmarkForArchival(array $contact) @@ -172,9 +173,9 @@ class Contact extends BaseObject * The function looks at several places (contact table and gcontact table) for the contact * It caches its result for the same script execution to prevent duplicate calls * - * @param string $url The profile link - * @param int $uid User id - * @param array $default If not data was found take this data as default value + * @param string $url The profile link + * @param int $uid User id + * @param array $default If not data was found take this data as default value * * @return array Contact data */ @@ -237,7 +238,7 @@ class Contact extends BaseObject if (DBM::is_result($r)) { // If there is more than one entry we filter out the connector networks if (count($r) > 1) { - foreach ($r AS $id => $result) { + foreach ($r as $id => $result) { if ($result["network"] == NETWORK_STATUSNET) { unset($r[$id]); } @@ -291,8 +292,9 @@ class Contact extends BaseObject $profile["micro"] = $profile["thumb"]; } - if ((($profile["addr"] == "") || ($profile["name"] == "")) && ($profile["gid"] != 0) && - in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS))) { + if ((($profile["addr"] == "") || ($profile["name"] == "")) && ($profile["gid"] != 0) + && in_array($profile["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS)) + ) { Worker::add(PRIORITY_LOW, "UpdateGContact", $profile["gid"]); } @@ -315,7 +317,7 @@ class Contact extends BaseObject * The function looks at several places (contact table and gcontact table) for the contact * * @param string $addr The profile link - * @param int $uid User id + * @param int $uid User id * * @return array Contact data */ @@ -362,8 +364,8 @@ class Contact extends BaseObject /** * @brief Returns the data array for the photo menu of a given contact * - * @param array $contact - * @param int $uid + * @param array $contact contact + * @param int $uid optional, default 0 * @return array */ public static function photoMenu(array $contact, $uid = 0) @@ -386,7 +388,7 @@ class Contact extends BaseObject if ($contact['uid'] != $uid) { if ($uid == 0) { $profile_link = zrl($contact['url']); - $menu = Array('profile' => array(t('View Profile'), $profile_link, true)); + $menu = array('profile' => array(t('View Profile'), $profile_link, true)); return $menu; } @@ -438,7 +440,7 @@ class Contact extends BaseObject $contact_drop_link = System::baseUrl() . '/contacts/' . $contact['id'] . '/drop?confirm=1'; /** - * menu array: + * Menu array: * "name" => [ "Label", "link", (bool)Should the link opened in a new tab? ] */ $menu = array( @@ -459,7 +461,7 @@ class Contact extends BaseObject $menucondensed = array(); - foreach ($menu AS $menuname => $menuitem) { + foreach ($menu as $menuname => $menuitem) { if ($menuitem[1] != '') { $menucondensed[$menuname] = $menuitem; } @@ -469,14 +471,15 @@ class Contact extends BaseObject } /** + * @brief Returns ungrouped contact count or list for user + * * Returns either the total number of ungrouped contacts for the given user * id or a paginated list of ungrouped contacts. * - * @brief Returns ungrouped contact count or list for user + * @param int $uid uid + * @param int $start optional, default 0 + * @param int $count optional, default 0 * - * @param int $uid - * @param int $start - * @param int $count * @return array */ public static function getUngroupedList($uid, $start = 0, $count = 0) @@ -532,8 +535,8 @@ class Contact extends BaseObject * Fourth, we update the existing record with the new data (avatar, alias, nick) * if there's any updates * - * @param string $url Contact URL - * @param integer $uid The user id for the contact (0 = public contact) + * @param string $url Contact URL + * @param integer $uid The user id for the contact (0 = public contact) * @param boolean $no_update Don't update the contact * * @return integer Contact ID @@ -735,7 +738,6 @@ class Contact extends BaseObject /** * @brief Returns posts from a given contact url * - * @param App $a argv application class * @param string $contact_url Contact URL * * @return string posts in HTML From c25578a2e2ffd8a311f25c3f08e96f62af233983 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Wed, 22 Nov 2017 16:29:47 -0500 Subject: [PATCH 05/38] Cleanup Clean up messy commits. --- src/Object/Contact.php | 80 +++++++++++++----------------------------- 1 file changed, 25 insertions(+), 55 deletions(-) diff --git a/src/Object/Contact.php b/src/Object/Contact.php index b10c9a16d5..ffa71be27d 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -35,18 +35,16 @@ class Contact extends BaseObject public static function remove($id) { // We want just to make sure that we don't delete our "self" contact - $r = q( - "SELECT `uid` FROM `contact` WHERE `id` = %d AND NOT `self` LIMIT 1", intval($id) - ); + $condition = array('`id` = ? AND NOT `self`', $id); + $r = dba::select('contact', array('uid'), $condition, array('limit' => 1)); + if (!DBM::is_result($r) || !intval($r[0]['uid'])) { return; } $archive = PConfig::get($r[0]['uid'], 'system', 'archive_removed_contacts'); if ($archive) { - q( - "UPDATE `contact` SET `archive` = 1, `network` = 'none', `writable` = 0 WHERE id = %d", intval($id) - ); + dba::update('contact', array('archive' => 1, 'network' => 'none', 'writable' => 0), array('id' => $id)); return; } @@ -102,15 +100,10 @@ class Contact extends BaseObject } if ($contact['term-date'] <= NULL_DATE) { - q( - "UPDATE `contact` SET `term-date` = '%s' WHERE `id` = %d", dbesc(datetime_convert()), intval($contact['id']) - ); + dba::update('contact', array('term-date' => datetime_convert()), array('id' => $contact['id'])); if ($contact['url'] != '') { - q( - "UPDATE `contact` SET `term-date` = '%s' - WHERE `nurl` = '%s' AND `term-date` <= '1000-00-00'", dbesc(datetime_convert()), dbesc(normalise_link($contact['url'])) - ); + dba::update('contact', array('term-date' => datetime_convert()), array('nurl' => normalise_link($contact['url']), 'term-date' <= NULL_DATE)); } } else { /* @todo @@ -126,14 +119,10 @@ class Contact extends BaseObject * delete, though if the owner tries to unarchive them we'll start * the whole process over again. */ - q( - "UPDATE `contact` SET `archive` = 1 WHERE `id` = %d", intval($contact['id']) - ); + dba::update('contact', array('archive' => 1), array('id' => $contact['id'])); if ($contact['url'] != '') { - q( - "UPDATE `contact` SET `archive` = 1 WHERE `nurl` = '%s'", dbesc(normalise_link($contact['url'])) - ); + dba::update('contact', array('archive' => 1), array('nurl' => normalise_link($contact['url']))); } } } @@ -149,9 +138,8 @@ class Contact extends BaseObject */ public static function unmarkForArchival(array $contact) { - $r = q( - "SELECT `term-date` FROM `contact` WHERE `id` = %d AND (`term-date` > '%s' OR `archive`)", intval($contact['id']), dbesc('1000-00-00 00:00:00') - ); + $condition = array('`id` => ? AND (`term-date` > ? OR `archive`)', $contact[`id`], NULL_DATE); + $r = dba::select('contact', array('term-date'), $condition); // We don't need to update, we never marked this contact for archival if (!DBM::is_result($r)) { @@ -393,7 +381,7 @@ class Contact extends BaseObject return $menu; } - $r = q("SELECT * FROM `contact` WHERE `nurl` = '%s' AND `network` = '%s' AND `uid` = %d", dbesc($contact['nurl']), dbesc($contact['network']), intval($uid)); + $r = dba::select('contact', array(), array('nurl' => $contact['nurl'], 'network' => $contact['network'], 'uid' => $uid)); if ($r) { return self::photoMenu($r[0], $uid); } else { @@ -485,34 +473,15 @@ class Contact extends BaseObject public static function getUngroupedList($uid, $start = 0, $count = 0) { if (!$count) { - $r = q( - "SELECT COUNT(*) AS `total` - FROM `contact` - WHERE `uid` = %d - AND `self` = 0 - AND `id` NOT IN ( - SELECT DISTINCT(`contact-id`) - FROM `group_member` - WHERE `uid` = %d - ) ", intval($uid), intval($uid) - ); + $fields = array('COUNT(*) AS `total`'); + $condition = array('`uid` = ? AND `self` = 0 AND `id` NOT IN (SELECT DISTINCT(`contact-id`) FROM `group_member` WHERE `uid` = ?', $uid, $uid); + $r = dba::select('contact', $fields, $condition); return $r; } - $r = q( - "SELECT * - FROM `contact` - WHERE `uid` = %d - AND `self` = 0 - AND `id` NOT IN ( - SELECT DISTINCT(`contact-id`) - FROM `group_member` WHERE `uid` = %d - ) - AND `blocked` = 0 - AND `pending` = 0 - LIMIT %d, %d", intval($uid), intval($uid), intval($start), intval($count) - ); + $innerCondition = array('`id` NOT IN (SELECT DISTINCT(`contact-id`) FROM `group_member` WHERE `uid` = ?', $uid); + $r = dba::select('contact', array(), array('uid' => $uid, 'self' => 0, $innerCondition, 'blocked' => 0, 'pending' => 0), array('limit ?, ?', $start, $count)); return $r; } @@ -564,7 +533,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::p("SELECT `id`, `avatar-date` FROM `contact` WHERE `alias` IN (?, ?, ?) AND `uid` = ? LIMIT 1", $url, normalise_link($url), $ssl_url, $uid); + $r = dba::select('contact', array('id', 'avatar-date'), array('`alias` IN (?, ?, ?) AND `uid` = ?', $url, normalise_link($url), $ssl_url, $uid), array('limit' => 1)); $contact = dba::fetch($r); dba::close($r); } @@ -611,7 +580,8 @@ class Contact extends BaseObject $url = $data["url"]; if (!$contact_id) { - dba::insert('contact', array('uid' => $uid, 'created' => datetime_convert(), 'url' => $data["url"], + dba::insert( + 'contact', array('uid' => $uid, 'created' => datetime_convert(), 'url' => $data["url"], 'nurl' => normalise_link($data["url"]), 'addr' => $data["addr"], 'alias' => $data["alias"], 'notify' => $data["notify"], 'poll' => $data["poll"], 'name' => $data["name"], 'nick' => $data["nick"], 'photo' => $data["photo"], @@ -622,9 +592,11 @@ class Contact extends BaseObject 'confirm' => $data["confirm"], 'poco' => $data["poco"], 'name-date' => datetime_convert(), 'uri-date' => datetime_convert(), 'avatar-date' => datetime_convert(), 'writable' => 1, 'blocked' => 0, - 'readonly' => 0, 'pending' => 0)); + 'readonly' => 0, 'pending' => 0) + ); - $contacts = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2", dbesc(normalise_link($data["url"])), intval($uid)); + $s = dba::select('contact', array('id'), array('nurl' => normalise_link($data["url"]), 'uid' => $uid), array('order' => 'id', 'limit' => 2)); + $contacts = dba::inArray($s); if (!DBM::is_result($contacts)) { return 0; } @@ -748,8 +720,7 @@ class Contact extends BaseObject // There are no posts with "uid = 0" with connector networks // This speeds up the query a lot - $r = q("SELECT `network`, `id` AS `author-id`, `contact-type` FROM `contact` - WHERE `contact`.`nurl` = '%s' AND `contact`.`uid` = 0", dbesc(normalise_link($contact_url))); + $r = dba::select('contact', array('network', 'id AS author-id', 'contact-type'), array('nurl' => normalise_link($contact_url), 'uid' => 0)); if (!DBM::is_result($r)) { return ''; @@ -792,8 +763,7 @@ class Contact extends BaseObject // "page-flags" is a field in the user table, // "forum" and "prv" are used in the contact table. They stand for PAGE_COMMUNITY and PAGE_PRVGROUP. // "community" is used in the gcontact table and is true if the contact is PAGE_COMMUNITY or PAGE_PRVGROUP. - if ( - (isset($contact['page-flags']) && (intval($contact['page-flags']) == PAGE_COMMUNITY)) + if ((isset($contact['page-flags']) && (intval($contact['page-flags']) == PAGE_COMMUNITY)) || (isset($contact['page-flags']) && (intval($contact['page-flags']) == PAGE_PRVGROUP)) || (isset($contact['forum']) && intval($contact['forum'])) || (isset($contact['prv']) && intval($contact['prv'])) From ffceb601d5dd62bef22b013dd921958a20b58b54 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 22 Nov 2017 22:50:45 +0000 Subject: [PATCH 06/38] Some handling for empty parameters --- include/dba.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/include/dba.php b/include/dba.php index 642539a759..684f53ea47 100644 --- a/include/dba.php +++ b/include/dba.php @@ -713,6 +713,12 @@ class dba { * @return boolean was the insert successfull? */ public static function insert($table, $param, $on_duplicate_update = false) { + + if (empty($table) || empty($param)) { + logger('Table and fields have to be set'); + return false; + } + $sql = "INSERT INTO `".self::escape($table)."` (`".implode("`, `", array_keys($param))."`) VALUES (". substr(str_repeat("?, ", count($param)), 0, -2).")"; @@ -852,6 +858,12 @@ class dba { * @return boolean|array was the delete successfull? When $in_process is set: deletion data */ public static function delete($table, $param, $in_process = false, &$callstack = array()) { + + if (empty($table) || empty($param)) { + logger('Table and condition have to be set'); + return false; + } + $commands = array(); // Create a key for the loop prevention @@ -1014,6 +1026,12 @@ class dba { * @return boolean was the update successfull? */ public static function update($table, $fields, $condition, $old_fields = array()) { + + if (empty($table) || empty($fields) || empty($condition)) { + logger('Table, fields and condition have to be set'); + return false; + } + $table = self::escape($table); $array_element = each($condition); From f5d682fe0ace90a0ede89fe5d1fe9f3e051ef3a9 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Wed, 22 Nov 2017 23:13:12 -0500 Subject: [PATCH 07/38] Review updates Updates based on review. --- src/Object/Contact.php | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Object/Contact.php b/src/Object/Contact.php index ffa71be27d..9fceb927af 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -38,11 +38,11 @@ class Contact extends BaseObject $condition = array('`id` = ? AND NOT `self`', $id); $r = dba::select('contact', array('uid'), $condition, array('limit' => 1)); - if (!DBM::is_result($r) || !intval($r[0]['uid'])) { + if (!DBM::is_result($r) || !intval($r['uid'])) { return; } - $archive = PConfig::get($r[0]['uid'], 'system', 'archive_removed_contacts'); + $archive = PConfig::get($r['uid'], 'system', 'archive_removed_contacts'); if ($archive) { dba::update('contact', array('archive' => 1, 'network' => 'none', 'writable' => 0), array('id' => $id)); return; @@ -59,6 +59,7 @@ class Contact extends BaseObject * * @param array $user User unfriending * @param array $contact Contact unfriended + * @return void */ public static function terminateFriendship(array $user, array $contact) { @@ -383,7 +384,7 @@ class Contact extends BaseObject $r = dba::select('contact', array(), array('nurl' => $contact['nurl'], 'network' => $contact['network'], 'uid' => $uid)); if ($r) { - return self::photoMenu($r[0], $uid); + return self::photoMenu(dba::fetch($r), $uid); } else { $profile_link = zrl($contact['url']); $connlnk = 'follow/?url=' . $contact['url']; @@ -477,13 +478,13 @@ class Contact extends BaseObject $condition = array('`uid` = ? AND `self` = 0 AND `id` NOT IN (SELECT DISTINCT(`contact-id`) FROM `group_member` WHERE `uid` = ?', $uid, $uid); $r = dba::select('contact', $fields, $condition); - return $r; + return dba::inArray($r); } $innerCondition = array('`id` NOT IN (SELECT DISTINCT(`contact-id`) FROM `group_member` WHERE `uid` = ?', $uid); $r = dba::select('contact', array(), array('uid' => $uid, 'self' => 0, $innerCondition, 'blocked' => 0, 'pending' => 0), array('limit ?, ?', $start, $count)); - return $r; + return dba::inArray($r); } /** @@ -720,21 +721,22 @@ class Contact extends BaseObject // There are no posts with "uid = 0" with connector networks // This speeds up the query a lot - $r = dba::select('contact', array('network', 'id AS author-id', 'contact-type'), array('nurl' => normalise_link($contact_url), 'uid' => 0)); + $s = dba::select('contact', array('network', 'id AS author-id', 'contact-type'), array('nurl' => normalise_link($contact_url), 'uid' => 0)); + $r = dba::inArray($s); if (!DBM::is_result($r)) { return ''; } - if (in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) { + if (in_array($r["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) { $sql = "(`item`.`uid` = 0 OR (`item`.`uid` = %d AND NOT `item`.`global`))"; } else { $sql = "`item`.`uid` = %d"; } - $author_id = intval($r[0]["author-id"]); + $author_id = intval($r["author-id"]); - $contact = ($r[0]["contact-type"] == ACCOUNT_TYPE_COMMUNITY ? 'owner-id' : 'author-id'); + $contact = ($r["contact-type"] == ACCOUNT_TYPE_COMMUNITY ? 'owner-id' : 'author-id'); $r = q(item_query() . " AND `item`.`" . $contact . "` = %d AND " . $sql . " ORDER BY `item`.`created` DESC LIMIT %d, %d", intval($author_id), intval(local_user()), intval($a->pager['start']), intval($a->pager['itemspage']) From 9409010d2d87e02f74d5567a1ba4c2e72120d584 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Wed, 22 Nov 2017 23:32:24 -0500 Subject: [PATCH 08/38] Review dba updates updates based on review comments. --- src/Object/Contact.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Object/Contact.php b/src/Object/Contact.php index 9fceb927af..81368bcb28 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -382,9 +382,9 @@ class Contact extends BaseObject return $menu; } - $r = dba::select('contact', array(), array('nurl' => $contact['nurl'], 'network' => $contact['network'], 'uid' => $uid)); + $r = dba::select('contact', array(), array('nurl' => $contact['nurl'], 'network' => $contact['network'], 'uid' => $uid), array('limit' => 1)); if ($r) { - return self::photoMenu(dba::fetch($r), $uid); + return self::photoMenu($r, $uid); } else { $profile_link = zrl($contact['url']); $connlnk = 'follow/?url=' . $contact['url']; @@ -721,8 +721,7 @@ class Contact extends BaseObject // There are no posts with "uid = 0" with connector networks // This speeds up the query a lot - $s = dba::select('contact', array('network', 'id AS author-id', 'contact-type'), array('nurl' => normalise_link($contact_url), 'uid' => 0)); - $r = dba::inArray($s); + $r = dba::select('contact', array('network', 'id AS author-id', 'contact-type'), array('nurl' => normalise_link($contact_url), 'uid' => 0), array('limit' => 1)); if (!DBM::is_result($r)) { return ''; From 6ea8b0441ba45ec81b4cd5cde3751971fdad2109 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Thu, 23 Nov 2017 08:15:38 -0500 Subject: [PATCH 09/38] More Review put back some q( calls and change some integer to boolean --- src/Object/Contact.php | 55 ++++++++++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 18 deletions(-) diff --git a/src/Object/Contact.php b/src/Object/Contact.php index 81368bcb28..50981659b2 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -35,8 +35,7 @@ class Contact extends BaseObject public static function remove($id) { // We want just to make sure that we don't delete our "self" contact - $condition = array('`id` = ? AND NOT `self`', $id); - $r = dba::select('contact', array('uid'), $condition, array('limit' => 1)); + $r = dba::select('contact', array('uid'), array('id' => $id, 'self' => false), array('limit' => 1)); if (!DBM::is_result($r) || !intval($r['uid'])) { return; @@ -44,7 +43,7 @@ class Contact extends BaseObject $archive = PConfig::get($r['uid'], 'system', 'archive_removed_contacts'); if ($archive) { - dba::update('contact', array('archive' => 1, 'network' => 'none', 'writable' => 0), array('id' => $id)); + dba::update('contact', array('archive' => true, 'network' => 'none', 'writable' => false), array('id' => $id)); return; } @@ -104,7 +103,7 @@ class Contact extends BaseObject dba::update('contact', array('term-date' => datetime_convert()), array('id' => $contact['id'])); if ($contact['url'] != '') { - dba::update('contact', array('term-date' => datetime_convert()), array('nurl' => normalise_link($contact['url']), 'term-date' <= NULL_DATE)); + dba::update('contact', array('term-date' => datetime_convert()), array('`nurl` = ? AND `term-date` <= 1000-00-00', normalise_link($contact['url']))); } } else { /* @todo @@ -140,10 +139,10 @@ class Contact extends BaseObject public static function unmarkForArchival(array $contact) { $condition = array('`id` => ? AND (`term-date` > ? OR `archive`)', $contact[`id`], NULL_DATE); - $r = dba::select('contact', array('term-date'), $condition); + $exists = dba::exists('contact', $condition); // We don't need to update, we never marked this contact for archival - if (!DBM::is_result($r)) { + if (!$exists) { return; } @@ -474,17 +473,36 @@ class Contact extends BaseObject public static function getUngroupedList($uid, $start = 0, $count = 0) { if (!$count) { - $fields = array('COUNT(*) AS `total`'); - $condition = array('`uid` = ? AND `self` = 0 AND `id` NOT IN (SELECT DISTINCT(`contact-id`) FROM `group_member` WHERE `uid` = ?', $uid, $uid); - $r = dba::select('contact', $fields, $condition); - - return dba::inArray($r); + $r = q( + "SELECT COUNT(*) AS `total` + FROM `contact` + WHERE `uid` = %d + AND `self` = 0 + AND `id` NOT IN ( + SELECT DISTINCT(`contact-id`) + FROM `group_member` + WHERE `uid` = %d + ) ", intval($uid), intval($uid) + ); + + return $r; } - $innerCondition = array('`id` NOT IN (SELECT DISTINCT(`contact-id`) FROM `group_member` WHERE `uid` = ?', $uid); - $r = dba::select('contact', array(), array('uid' => $uid, 'self' => 0, $innerCondition, 'blocked' => 0, 'pending' => 0), array('limit ?, ?', $start, $count)); + $r = q( + "SELECT * + FROM `contact` + WHERE `uid` = %d + AND `self` = 0 + AND `id` NOT IN ( + SELECT DISTINCT(`contact-id`) + FROM `group_member` WHERE `uid` = %d + ) + AND `blocked` = 0 + AND `pending` = 0 + LIMIT %d, %d", intval($uid), intval($uid), intval($start), intval($count) + ); - return dba::inArray($r); + return $r; } /** @@ -721,21 +739,22 @@ class Contact extends BaseObject // There are no posts with "uid = 0" with connector networks // This speeds up the query a lot - $r = dba::select('contact', array('network', 'id AS author-id', 'contact-type'), array('nurl' => normalise_link($contact_url), 'uid' => 0), array('limit' => 1)); + $r = q("SELECT `network`, `id` AS `author-id`, `contact-type` FROM `contact` + WHERE `contact`.`nurl` = '%s' AND `contact`.`uid` = 0", dbesc(normalise_link($contact_url))); if (!DBM::is_result($r)) { return ''; } - if (in_array($r["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) { + if (in_array($r[0]["network"], array(NETWORK_DFRN, NETWORK_DIASPORA, NETWORK_OSTATUS, ""))) { $sql = "(`item`.`uid` = 0 OR (`item`.`uid` = %d AND NOT `item`.`global`))"; } else { $sql = "`item`.`uid` = %d"; } - $author_id = intval($r["author-id"]); + $author_id = intval($r[0]["author-id"]); - $contact = ($r["contact-type"] == ACCOUNT_TYPE_COMMUNITY ? 'owner-id' : 'author-id'); + $contact = ($r[0]["contact-type"] == ACCOUNT_TYPE_COMMUNITY ? 'owner-id' : 'author-id'); $r = q(item_query() . " AND `item`.`" . $contact . "` = %d AND " . $sql . " ORDER BY `item`.`created` DESC LIMIT %d, %d", intval($author_id), intval(local_user()), intval($a->pager['start']), intval($a->pager['itemspage']) From 93924ceac452f6ed10ba326dce6d8b53bdae7cc2 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 23 Nov 2017 09:46:04 -0500 Subject: [PATCH 10/38] Move ExAuth class to src - Move executed code to separate readStdin function --- scripts/auth_ejabberd.php | 292 +++--------------------------------- src/Util/ExAuth.php | 304 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 326 insertions(+), 270 deletions(-) create mode 100644 src/Util/ExAuth.php diff --git a/scripts/auth_ejabberd.php b/scripts/auth_ejabberd.php index 9ad79004d5..5c516f3987 100755 --- a/scripts/auth_ejabberd.php +++ b/scripts/auth_ejabberd.php @@ -1,4 +1,4 @@ -#!/usr/bin/php +#!/usr/bin/env php bDebug = (int)Config::get('jabber', 'debug'); - - - openlog('auth_ejabberd', LOG_PID, LOG_USER); - - $this->writeLog(LOG_NOTICE, "start"); - - // We are connected to the SQL server. - while (!feof(STDIN)) { - // Quit if the database connection went down - if (!dba::connected()) { - $this->writeLog(LOG_ERR, "the database connection went down"); - return; - } - - $iHeader = fgets(STDIN, 3); - $aLength = unpack("n", $iHeader); - $iLength = $aLength["1"]; - - // No data? Then quit - if ($iLength == 0) { - $this->writeLog(LOG_ERR, "we got no data, quitting"); - return; - } - - // Fetching the data - $sData = fgets(STDIN, $iLength + 1); - $this->writeLog(LOG_DEBUG, "received data: ". $sData); - $aCommand = explode(":", $sData); - if (is_array($aCommand)) { - switch ($aCommand[0]) { - case "isuser": - // Check the existance of a given username - $this->isuser($aCommand); - break; - case "auth": - // Check if the givven password is correct - $this->auth($aCommand); - break; - case "setpass": - // We don't accept the setting of passwords here - $this->writeLog(LOG_NOTICE, "setpass command disabled"); - fwrite(STDOUT, pack("nn", 2, 0)); - break; - default: - // We don't know the given command - $this->writeLog(LOG_NOTICE, "unknown command ". $aCommand[0]); - fwrite(STDOUT, pack("nn", 2, 0)); - break; - } - } else { - $this->writeLog(LOG_NOTICE, "invalid command string ".$sData); - fwrite(STDOUT, pack("nn", 2, 0)); - } - } - } - - /** - * @brief Check if the given username exists - * - * @param array $aCommand The command array - */ - private function isuser($aCommand) { - $a = get_app(); - - // Check if there is a username - if (!isset($aCommand[1])) { - $this->writeLog(LOG_NOTICE, "invalid isuser command, no username given"); - fwrite(STDOUT, pack("nn", 2, 0)); - return; - } - - // Now we check if the given user is valid - $sUser = str_replace(array("%20", "(a)"), array(" ", "@"), $aCommand[1]); - - // Does the hostname match? So we try directly - if ($a->get_hostname() == $aCommand[2]) { - $this->writeLog(LOG_INFO, "internal user check for ". $sUser."@".$aCommand[2]); - $sQuery = "SELECT `uid` FROM `user` WHERE `nickname`='".dbesc($sUser)."'"; - $this->writeLog(LOG_DEBUG, "using query ". $sQuery); - $r = q($sQuery); - $found = DBM::is_result($r); - } else { - $found = false; - } - - // If the hostnames doesn't match or there is some failure, we try to check remotely - if (!$found) { - $found = $this->check_user($aCommand[2], $aCommand[1], true); - } - - if ($found) { - // The user is okay - $this->writeLog(LOG_NOTICE, "valid user: ". $sUser); - fwrite(STDOUT, pack("nn", 2, 1)); - } else { - // The user isn't okay - $this->writeLog(LOG_WARNING, "invalid user: ". $sUser); - fwrite(STDOUT, pack("nn", 2, 0)); - } - } - - /** - * @brief Check remote user existance via HTTP(S) - * - * @param string $host The hostname - * @param string $user Username - * @param boolean $ssl Should the check be done via SSL? - * - * @return boolean Was the user found? - */ - private function check_user($host, $user, $ssl) { - - $this->writeLog(LOG_INFO, "external user check for ".$user."@".$host); - - $url = ($ssl ? "https":"http")."://".$host."/noscrape/".$user; - - $data = z_fetch_url($url); - - if (!is_array($data)) - return(false); - - if ($data["return_code"] != "200") - return(false); - - $json = @json_decode($data["body"]); - if (!is_object($json)) - return(false); - - return($json->nick == $user); - } - - /** - * @brief Authenticate the givven user and password - * - * @param array $aCommand The command array - */ - private function auth($aCommand) { - $a = get_app(); - - // check user authentication - if (sizeof($aCommand) != 4) { - $this->writeLog(LOG_NOTICE, "invalid auth command, data missing"); - fwrite(STDOUT, pack("nn", 2, 0)); - return; - } - - // We now check if the password match - $sUser = str_replace(array("%20", "(a)"), array(" ", "@"), $aCommand[1]); - - // Does the hostname match? So we try directly - if ($a->get_hostname() == $aCommand[2]) { - $this->writeLog(LOG_INFO, "internal auth for ".$sUser."@".$aCommand[2]); - - $sQuery = "SELECT `uid`, `password` FROM `user` WHERE `nickname`='".dbesc($sUser)."'"; - $this->writeLog(LOG_DEBUG, "using query ". $sQuery); - if ($oResult = q($sQuery)) { - $uid = $oResult[0]["uid"]; - $Error = ($oResult[0]["password"] != hash('whirlpool',$aCommand[3])); - } else { - $this->writeLog(LOG_WARNING, "invalid query: ". $sQuery); - $Error = true; - $uid = -1; - } - if ($Error) { - $oConfig = q("SELECT `v` FROM `pconfig` WHERE `uid` = %d AND `cat` = 'xmpp' AND `k`='password' LIMIT 1;", intval($uid)); - $this->writeLog(LOG_INFO, "check against alternate password for ".$sUser."@".$aCommand[2]); - $Error = ($aCommand[3] != $oConfig[0]["v"]); - } - } else { - $Error = true; - } - - // If the hostnames doesn't match or there is some failure, we try to check remotely - if ($Error) { - $Error = !$this->check_credentials($aCommand[2], $aCommand[1], $aCommand[3], true); - } - - if ($Error) { - $this->writeLog(LOG_WARNING, "authentification failed for user ".$sUser."@". $aCommand[2]); - fwrite(STDOUT, pack("nn", 2, 0)); - } else { - $this->writeLog(LOG_NOTICE, "authentificated user ".$sUser."@".$aCommand[2]); - fwrite(STDOUT, pack("nn", 2, 1)); - } - } - - /** - * @brief Check remote credentials via HTTP(S) - * - * @param string $host The hostname - * @param string $user Username - * @param string $password Password - * @param boolean $ssl Should the check be done via SSL? - * - * @return boolean Are the credentials okay? - */ - private function check_credentials($host, $user, $password, $ssl) { - $url = ($ssl ? "https":"http")."://".$host."/api/account/verify_credentials.json"; - - $ch = curl_init(); - curl_setopt($ch, CURLOPT_URL, $url); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); - curl_setopt($ch, CURLOPT_HEADER, true); - curl_setopt($ch, CURLOPT_NOBODY, true); - curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); - curl_setopt($ch, CURLOPT_USERPWD, $user.':'.$password); - - $header = curl_exec($ch); - $curl_info = @curl_getinfo($ch); - $http_code = $curl_info["http_code"]; - curl_close($ch); - - $this->writeLog(LOG_INFO, "external auth for ".$user."@".$host." returned ".$http_code); - - return ($http_code == 200); - } - - /** - * @brief write data to the syslog - * - * @param integer $loglevel The syslog loglevel - * @param string $sMessage The syslog message - */ - private function writeLog($loglevel, $sMessage) { - if (!$this->bDebug && ($loglevel >= LOG_DEBUG)) { - return; - } - syslog($loglevel, $sMessage); - } - - /** - * @brief destroy the class, close the syslog connection. - */ - public function __destruct() { - $this->writeLog(LOG_NOTICE, "stop"); - closelog(); - } -} +$oAuth->readStdin(); diff --git a/src/Util/ExAuth.php b/src/Util/ExAuth.php new file mode 100644 index 0000000000..d0f295ab04 --- /dev/null +++ b/src/Util/ExAuth.php @@ -0,0 +1,304 @@ + + * modified for Friendica by Michael Vogel + * published under GPL + * + * Latest version of the original script for joomla is available at: + * http://87.230.15.86/~dado/ejabberd/joomla-login + * + * Installation: + * + * - Change it's owner to whichever user is running the server, ie. ejabberd + * $ chown ejabberd:ejabberd /path/to/friendica/scripts/auth_ejabberd.php + * + * - Change the access mode so it is readable only to the user ejabberd and has exec + * $ chmod 700 /path/to/friendica/scripts/auth_ejabberd.php + * + * - Edit your ejabberd.cfg file, comment out your auth_method and add: + * {auth_method, external}. + * {extauth_program, "/path/to/friendica/script/auth_ejabberd.php"}. + * + * - Restart your ejabberd service, you should be able to login with your friendica auth info + * + * Other hints: + * - if your users have a space or a @ in their nickname, they'll run into trouble + * registering with any client so they should be instructed to replace these chars + * " " (space) is replaced with "%20" + * "@" is replaced with "(a)" + * + */ + +namespace Friendica\Util; + +use Friendica\Core\Config; +use Friendica\Core\PConfig; +use Friendica\Database\DBM; + +require_once 'include/dba.php'; + +class ExAuth +{ + private $bDebug; + + /** + * @brief Create the class + * + * @param boolean $bDebug Debug mode + */ + public function __construct() + { + $this->bDebug = (int) Config::get('jabber', 'debug'); + + openlog('auth_ejabberd', LOG_PID, LOG_USER); + + $this->writeLog(LOG_NOTICE, 'start'); + } + + /** + * @brief Standard input reading function, executes the auth with the provided + * parameters + * + * @return null + */ + public function readStdin() + { + while (!feof(STDIN)) { + // Quit if the database connection went down + if (!dba::connected()) { + $this->writeLog(LOG_ERR, 'the database connection went down'); + return; + } + + $iHeader = fgets(STDIN, 3); + $aLength = unpack('n', $iHeader); + $iLength = $aLength['1']; + + // No data? Then quit + if ($iLength == 0) { + $this->writeLog(LOG_ERR, 'we got no data, quitting'); + return; + } + + // Fetching the data + $sData = fgets(STDIN, $iLength + 1); + $this->writeLog(LOG_DEBUG, 'received data: ' . $sData); + $aCommand = explode(':', $sData); + if (is_array($aCommand)) { + switch ($aCommand[0]) { + case 'isuser': + // Check the existance of a given username + $this->isUser($aCommand); + break; + case 'auth': + // Check if the givven password is correct + $this->auth($aCommand); + break; + case 'setpass': + // We don't accept the setting of passwords here + $this->writeLog(LOG_NOTICE, 'setpass command disabled'); + fwrite(STDOUT, pack('nn', 2, 0)); + break; + default: + // We don't know the given command + $this->writeLog(LOG_NOTICE, 'unknown command ' . $aCommand[0]); + fwrite(STDOUT, pack('nn', 2, 0)); + break; + } + } else { + $this->writeLog(LOG_NOTICE, 'invalid command string ' . $sData); + fwrite(STDOUT, pack('nn', 2, 0)); + } + } + } + + /** + * @brief Check if the given username exists + * + * @param array $aCommand The command array + */ + private function isUser(array $aCommand) + { + $a = get_app(); + + // Check if there is a username + if (!isset($aCommand[1])) { + $this->writeLog(LOG_NOTICE, 'invalid isuser command, no username given'); + fwrite(STDOUT, pack('nn', 2, 0)); + return; + } + + // Now we check if the given user is valid + $sUser = str_replace(array('%20', '(a)'), array(' ', '@'), $aCommand[1]); + + // Does the hostname match? So we try directly + if ($a->get_hostname() == $aCommand[2]) { + $this->writeLog(LOG_INFO, 'internal user check for ' . $sUser . '@' . $aCommand[2]); + $found = dba::exists('user', ['nickname' => $sUser]); + } else { + $found = false; + } + + // If the hostnames doesn't match or there is some failure, we try to check remotely + if (!$found) { + $found = $this->checkUser($aCommand[2], $aCommand[1], true); + } + + if ($found) { + // The user is okay + $this->writeLog(LOG_NOTICE, 'valid user: ' . $sUser); + fwrite(STDOUT, pack('nn', 2, 1)); + } else { + // The user isn't okay + $this->writeLog(LOG_WARNING, 'invalid user: ' . $sUser); + fwrite(STDOUT, pack('nn', 2, 0)); + } + } + + /** + * @brief Check remote user existance via HTTP(S) + * + * @param string $host The hostname + * @param string $user Username + * @param boolean $ssl Should the check be done via SSL? + * + * @return boolean Was the user found? + */ + private function checkUser($host, $user, $ssl) + { + $this->writeLog(LOG_INFO, 'external user check for ' . $user . '@' . $host); + + $url = ($ssl ? 'https' : 'http') . '://' . $host . '/noscrape/' . $user; + + $data = z_fetch_url($url); + + if (!is_array($data)) { + return false; + } + + if ($data['return_code'] != '200') { + return false; + } + + $json = @json_decode($data['body']); + if (!is_object($json)) { + return false; + } + + return $json->nick == $user; + } + + /** + * @brief Authenticate the given user and password + * + * @param array $aCommand The command array + */ + private function auth(array $aCommand) + { + $a = get_app(); + + // check user authentication + if (sizeof($aCommand) != 4) { + $this->writeLog(LOG_NOTICE, 'invalid auth command, data missing'); + fwrite(STDOUT, pack('nn', 2, 0)); + return; + } + + // We now check if the password match + $sUser = str_replace(array('%20', '(a)'), array(' ', '@'), $aCommand[1]); + + // Does the hostname match? So we try directly + if ($a->get_hostname() == $aCommand[2]) { + $this->writeLog(LOG_INFO, 'internal auth for ' . $sUser . '@' . $aCommand[2]); + + $aUser = dba::select('user', ['uid', 'password'], ['nickname' => $sUser], ['limit' => 1]); + if (DBM::is_result($aUser)) { + $uid = $aUser['uid']; + $Error = $aUser['password'] != hash('whirlpool', $aCommand[3]); + } else { + $this->writeLog(LOG_WARNING, 'user not found: ' . $sUser); + $Error = true; + $uid = -1; + } + if ($Error) { + $this->writeLog(LOG_INFO, 'check against alternate password for ' . $sUser . '@' . $aCommand[2]); + $sPassword = PConfig::get($uid, 'xmpp', 'password'); + $Error = ($aCommand[3] != $sPassword); + } + } else { + $Error = true; + } + + // If the hostnames doesn't match or there is some failure, we try to check remotely + if ($Error) { + $Error = !$this->checkCredentials($aCommand[2], $aCommand[1], $aCommand[3], true); + } + + if ($Error) { + $this->writeLog(LOG_WARNING, 'authentification failed for user ' . $sUser . '@' . $aCommand[2]); + fwrite(STDOUT, pack('nn', 2, 0)); + } else { + $this->writeLog(LOG_NOTICE, 'authentificated user ' . $sUser . '@' . $aCommand[2]); + fwrite(STDOUT, pack('nn', 2, 1)); + } + } + + /** + * @brief Check remote credentials via HTTP(S) + * + * @param string $host The hostname + * @param string $user Username + * @param string $password Password + * @param boolean $ssl Should the check be done via SSL? + * + * @return boolean Are the credentials okay? + */ + private function checkCredentials($host, $user, $password, $ssl) + { + $url = ($ssl ? 'https' : 'http') . '://' . $host . '/api/account/verify_credentials.json'; + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); + curl_setopt($ch, CURLOPT_HEADER, true); + curl_setopt($ch, CURLOPT_NOBODY, true); + curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); + curl_setopt($ch, CURLOPT_USERPWD, $user . ':' . $password); + + curl_exec($ch); + $curl_info = @curl_getinfo($ch); + $http_code = $curl_info['http_code']; + curl_close($ch); + + $this->writeLog(LOG_INFO, 'external auth for ' . $user . '@' . $host . ' returned ' . $http_code); + + return $http_code == 200; + } + + /** + * @brief write data to the syslog + * + * @param integer $loglevel The syslog loglevel + * @param string $sMessage The syslog message + */ + private function writeLog($loglevel, $sMessage) + { + if (!$this->bDebug && ($loglevel >= LOG_DEBUG)) { + return; + } + syslog($loglevel, $sMessage); + } + + /** + * @brief destroy the class, close the syslog connection. + */ + public function __destruct() + { + $this->writeLog(LOG_NOTICE, 'stop'); + closelog(); + } +} From d5887f9f9a4793e9546c6f99e3f6ed9d1b7e3121 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 23 Nov 2017 10:23:16 -0500 Subject: [PATCH 11/38] Add use dba --- src/Util/ExAuth.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Util/ExAuth.php b/src/Util/ExAuth.php index d0f295ab04..0769be2e66 100644 --- a/src/Util/ExAuth.php +++ b/src/Util/ExAuth.php @@ -37,6 +37,7 @@ namespace Friendica\Util; use Friendica\Core\Config; use Friendica\Core\PConfig; use Friendica\Database\DBM; +use dba; require_once 'include/dba.php'; From 609a4de5d01998af02085c7e50f97b35de197fae Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Thu, 23 Nov 2017 14:01:58 -0500 Subject: [PATCH 12/38] src Standards This basically completes coding standards changes for the entire src directory, with the exception of App.php --- include/api.php | 4 +- include/follow.php | 2 +- include/like.php | 2 +- mod/dfrn_confirm.php | 2 +- mod/dfrn_notify.php | 2 +- mod/fetch.php | 6 +- mod/item.php | 2 +- mod/p.php | 4 +- mod/receive.php | 6 +- src/Protocol/DFRN.php | 217 +++++++++--------- src/Protocol/Diaspora.php | 427 ++++++++++++++++++----------------- src/Protocol/OStatus.php | 20 +- src/Worker/Delivery.php | 10 +- src/Worker/Notifier.php | 2 +- src/Worker/ProfileUpdate.php | 2 +- 15 files changed, 370 insertions(+), 338 deletions(-) diff --git a/include/api.php b/include/api.php index 7c012ddbb7..50aa18c7e0 100644 --- a/include/api.php +++ b/include/api.php @@ -4291,7 +4291,7 @@ function api_share_as_retweet(&$item) { $body = trim($item["body"]); - if (Diaspora::is_reshare($body, false)===false) { + if (Diaspora::isReshare($body, false)===false) { return false; } @@ -4299,7 +4299,7 @@ function api_share_as_retweet(&$item) $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "$1", $body); /* * Skip if there is no shared message in there - * we already checked this in diaspora::is_reshare() + * we already checked this in diaspora::isReshare() * but better one more than one less... */ if ($body == $attributes) { diff --git a/include/follow.php b/include/follow.php index e2f81f1279..7e8b25d797 100644 --- a/include/follow.php +++ b/include/follow.php @@ -272,7 +272,7 @@ function new_contact($uid, $url, $interactive = false, $network = '') { } if ($contact['network'] == NETWORK_DIASPORA) { - $ret = Diaspora::send_share($a->user,$contact); + $ret = Diaspora::sendShare($a->user, $contact); logger('share returns: '.$ret); } } diff --git a/include/like.php b/include/like.php index 96cc477b8b..1dcadde705 100644 --- a/include/like.php +++ b/include/like.php @@ -247,7 +247,7 @@ EOT; } // Save the author information for the like in case we need to relay to Diaspora - Diaspora::store_like_signature($item_contact, $new_item_id); + Diaspora::storeLikeSignature($item_contact, $new_item_id); $new_item['id'] = $new_item_id; diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 8484ace2cf..47871debdb 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -440,7 +440,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) { if ((isset($new_relation) && $new_relation == CONTACT_IS_FRIEND)) { if (($contact) && ($contact['network'] === NETWORK_DIASPORA)) { - $ret = Diaspora::send_share($user[0],$r[0]); + $ret = Diaspora::sendShare($user[0],$r[0]); logger('share returns: ' . $ret); } diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index 8e2b18e496..61be7966e0 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -175,7 +175,7 @@ function dfrn_notify_post(App $a) { *we got a key. old code send only the key, without RINO version. * we assume RINO 1 if key and no RINO version */ - $data = DFRN::aes_decrypt(hex2bin($data), $final_key); + $data = DFRN::aesDecrypt(hex2bin($data), $final_key); break; case 2: try { diff --git a/mod/fetch.php b/mod/fetch.php index 8685504fff..68f6acc917 100644 --- a/mod/fetch.php +++ b/mod/fetch.php @@ -68,12 +68,12 @@ function fetch_init(App $a) } $user = $r[0]; - $status = Diaspora::build_status($item[0], $user); - $xml = Diaspora::build_post_xml($status["type"], $status["message"]); + $status = Diaspora::buildStatus($item[0], $user); + $xml = Diaspora::buildPostXml($status["type"], $status["message"]); // Send the envelope header("Content-Type: application/magic-envelope+xml; charset=utf-8"); - echo Diaspora::build_magic_envelope($xml, $user); + echo Diaspora::buildMagicEnvelope($xml, $user); killme(); } diff --git a/mod/item.php b/mod/item.php index 97c26b5f9b..4aafa22995 100644 --- a/mod/item.php +++ b/mod/item.php @@ -985,7 +985,7 @@ function item_post(App $a) { // Store the comment signature information in case we need to relay to Diaspora - Diaspora::store_comment_signature($datarray, $author, ($self ? $user['prvkey'] : false), $post_id); + Diaspora::storeCommentSignature($datarray, $author, ($self ? $user['prvkey'] : false), $post_id); } else { $parent = $post_id; diff --git a/mod/p.php b/mod/p.php index 9c1c2b71de..f44c32b335 100644 --- a/mod/p.php +++ b/mod/p.php @@ -58,8 +58,8 @@ function p_init($a){ } $user = $r[0]; - $status = Diaspora::build_status($item[0], $user); - $xml = Diaspora::build_post_xml($status["type"], $status["message"]); + $status = Diaspora::buildStatus($item[0], $user); + $xml = Diaspora::buildPostXml($status["type"], $status["message"]); header("Content-Type: application/xml; charset=utf-8"); echo $xml; diff --git a/mod/receive.php b/mod/receive.php index a1cb5f48fa..8241325bf9 100644 --- a/mod/receive.php +++ b/mod/receive.php @@ -49,14 +49,14 @@ function receive_post(App $a) { } logger('mod-diaspora: message is in the new format', LOGGER_DEBUG); - $msg = Diaspora::decode_raw($importer, $postdata); + $msg = Diaspora::decodeRaw($importer, $postdata); } else { logger('mod-diaspora: decode message in the old format', LOGGER_DEBUG); $msg = Diaspora::decode($importer, $xml); if ($public && !$msg) { logger('mod-diaspora: decode message in the new format', LOGGER_DEBUG); - $msg = Diaspora::decode_raw($importer, $xml); + $msg = Diaspora::decodeRaw($importer, $xml); } } @@ -72,7 +72,7 @@ function receive_post(App $a) { $ret = true; if ($public) { - Diaspora::dispatch_public($msg); + Diaspora::dispatchPublic($msg); } else { $ret = Diaspora::dispatch($importer, $msg); } diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index 9a378d874c..47aeaf05e5 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -60,7 +60,7 @@ class DFRN $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; - $root = self::add_header($doc, $owner, "dfrn:owner", "", false); + $root = self::addHeader($doc, $owner, "dfrn:owner", "", false); if (! count($items)) { return trim($doc->saveXML()); @@ -258,7 +258,7 @@ class DFRN $author = "author"; } - $root = self::add_header($doc, $owner, $author, $alternatelink, true); + $root = self::addHeader($doc, $owner, $author, $alternatelink, true); /// @TODO This hook can't work anymore // call_hooks('atom_feed', $atom); @@ -370,7 +370,7 @@ class DFRN $root->setAttribute("xmlns:ostatus", NAMESPACE_OSTATUS); $root->setAttribute("xmlns:statusnet", NAMESPACE_STATUSNET); - //$root = self::add_header($doc, $owner, "dfrn:owner", "", false); + //$root = self::addHeader($doc, $owner, "dfrn:owner", "", false); foreach ($items as $item) { $entry = self::entry($doc, $type, $item, $owner, true, 0); @@ -398,7 +398,7 @@ class DFRN $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; - $root = self::add_header($doc, $owner, "dfrn:owner", "", false); + $root = self::addHeader($doc, $owner, "dfrn:owner", "", false); $mail = $doc->createElement("dfrn:mail"); $sender = $doc->createElement("dfrn:sender"); @@ -411,7 +411,7 @@ class DFRN XML::addElement($doc, $mail, "dfrn:id", $item['uri']); XML::addElement($doc, $mail, "dfrn:in-reply-to", $item['parent-uri']); - XML::addElement($doc, $mail, "dfrn:sentdate", datetime_convert('UTC', 'UTC', $item['created'] . '+00:00' , ATOM_TIME)); + XML::addElement($doc, $mail, "dfrn:sentdate", datetime_convert('UTC', 'UTC', $item['created'] . '+00:00', ATOM_TIME)); XML::addElement($doc, $mail, "dfrn:subject", $item['title']); XML::addElement($doc, $mail, "dfrn:content", $item['body']); @@ -434,7 +434,7 @@ class DFRN $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; - $root = self::add_header($doc, $owner, "dfrn:owner", "", false); + $root = self::addHeader($doc, $owner, "dfrn:owner", "", false); $suggest = $doc->createElement("dfrn:suggest"); @@ -486,7 +486,7 @@ class DFRN $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; - $root = self::add_header($doc, $owner, "dfrn:owner", "", false); + $root = self::addHeader($doc, $owner, "dfrn:owner", "", false); $relocate = $doc->createElement("dfrn:relocate"); @@ -501,7 +501,7 @@ class DFRN XML::addElement($doc, $relocate, "dfrn:confirm", $owner['confirm']); XML::addElement($doc, $relocate, "dfrn:notify", $owner['notify']); XML::addElement($doc, $relocate, "dfrn:poll", $owner['poll']); - XML::addElement($doc, $relocate, "dfrn:sitepubkey", Config::get('system','site_pubkey')); + XML::addElement($doc, $relocate, "dfrn:sitepubkey", Config::get('system', 'site_pubkey')); $root->appendChild($relocate); @@ -520,7 +520,7 @@ class DFRN * @return object XML root object * @todo Add type-hints */ - private static function add_header($doc, $owner, $authorelement, $alternatelink = "", $public = false) + private static function addHeader($doc, $owner, $authorelement, $alternatelink = "", $public = false) { if ($alternatelink == "") { @@ -579,7 +579,7 @@ class DFRN XML::addElement($doc, $root, "updated", datetime_convert("UTC", "UTC", "now", ATOM_TIME)); - $author = self::add_author($doc, $owner, $authorelement, $public); + $author = self::addAuthor($doc, $owner, $authorelement, $public); $root->appendChild($author); return $root; @@ -588,14 +588,15 @@ class DFRN /** * @brief Adds the author element in the header for the DFRN protocol * - * @param object $doc XML document - * @param array $owner Owner record - * @param string $authorelement Element name for the author + * @param object $doc XML document + * @param array $owner Owner record + * @param string $authorelement Element name for the author + * @param boolean $public boolean * * @return object XML author object * @todo Add type-hints */ - private static function add_author($doc, $owner, $authorelement, $public) + private static function addAuthor($doc, $owner, $authorelement, $public) { // Is the profile hidden or shouldn't be published in the net? Then add the "hide" element $r = q( @@ -739,7 +740,7 @@ class DFRN * @return object XML author object * @todo Add type-hints */ - private static function add_entry_author($doc, $element, $contact_url, $item) + private static function addEntryAuthor($doc, $element, $contact_url, $item) { $contact = Contact::getDetailsByURL($contact_url, $item["uid"]); @@ -780,7 +781,7 @@ class DFRN * @return object XML activity object * @todo Add type-hints */ - private static function create_activity($doc, $element, $activity) + private static function createActivity($doc, $element, $activity) { if ($activity) { $entry = $doc->createElement($element); @@ -810,7 +811,7 @@ class DFRN // XML does need a single element as root element so we add a dummy element here $data = parse_xml_string("" . $r->link . "", false); if (is_object($data)) { - foreach ($data->link AS $link) { + foreach ($data->link as $link) { $attributes = array(); foreach ($link->attributes() as $parameter => $value) { $attributes[$parameter] = $value; @@ -843,7 +844,7 @@ class DFRN * @return object XML attachment object * @todo Add type-hints */ - private static function get_attachment($doc, $root, $item) + private static function getAttachment($doc, $root, $item) { $arr = explode('[/attach],', $item['attach']); if (count($arr)) { @@ -932,10 +933,10 @@ class DFRN $htmlbody = bbcode($htmlbody, false, false, 7); } - $author = self::add_entry_author($doc, "author", $item["author-link"], $item); + $author = self::addEntryAuthor($doc, "author", $item["author-link"], $item); $entry->appendChild($author); - $dfrnowner = self::add_entry_author($doc, "dfrn:owner", $item["owner-link"], $item); + $dfrnowner = self::addEntryAuthor($doc, "dfrn:owner", $item["owner-link"], $item); $entry->appendChild($dfrnowner); if (($item['parent'] != $item['id']) || ($item['parent-uri'] !== $item['uri']) || (($item['thr-parent'] !== '') && ($item['thr-parent'] !== $item['uri']))) { @@ -1041,12 +1042,12 @@ class DFRN XML::addElement($doc, $entry, "activity:object-type", ACTIVITY_OBJ_COMMENT); } - $actobj = self::create_activity($doc, "activity:object", $item['object']); + $actobj = self::createActivity($doc, "activity:object", $item['object']); if ($actobj) { $entry->appendChild($actobj); } - $actarg = self::create_activity($doc, "activity:target", $item['target']); + $actarg = self::createActivity($doc, "activity:target", $item['target']); if ($actarg) { $entry->appendChild($actarg); } @@ -1099,7 +1100,7 @@ class DFRN } } - self::get_attachment($doc, $entry, $item); + self::getAttachment($doc, $entry, $item); return $entry; } @@ -1112,7 +1113,7 @@ class DFRN * * @return string encrypted data */ - private static function aes_encrypt($data, $key) + private static function aesEncrypt($data, $key) { return openssl_encrypt($data, 'aes-128-ecb', $key, OPENSSL_RAW_DATA); } @@ -1125,7 +1126,7 @@ class DFRN * * @return string decrypted data */ - public static function aes_decrypt($encrypted, $key) + public static function aesDecrypt($encrypted, $key) { return openssl_decrypt($encrypted, 'aes-128-ecb', $key, OPENSSL_RAW_DATA); } @@ -1291,7 +1292,7 @@ class DFRN case 1: // Deprecated rino version! $key = openssl_random_pseudo_bytes(16); - $data = self::aes_encrypt($postvars['data'], $key); + $data = self::aesEncrypt($postvars['data'], $key); break; case 2: // RINO 2 based on php-encryption @@ -1392,9 +1393,10 @@ class DFRN * * @param array $contact Contact record * @param string $birthday Birthday of the contact + * @return void * @todo Add array type-hint for $contact */ - private static function birthday_event($contact, $birthday) + private static function birthdayEvent($contact, $birthday) { // Check for duplicates $r = q( @@ -1412,7 +1414,7 @@ class DFRN logger("updating birthday: ".$birthday." for contact ".$contact["id"]); $bdtext = sprintf(t("%s\'s birthday"), $contact["name"]); - $bdtext2 = sprintf(t("Happy Birthday %s"), " [url=".$contact["url"]."]".$contact["name"]."[/url]") ; + $bdtext2 = sprintf(t("Happy Birthday %s"), " [url=".$contact["url"]."]".$contact["name"]."[/url]"); $r = q( "INSERT INTO `event` (`uid`,`cid`,`created`,`edited`,`start`,`finish`,`summary`,`desc`,`type`) @@ -1437,6 +1439,7 @@ class DFRN * @param array $importer Record of the importer user mixed with contact of the content * @param string $element Element name from which the data is fetched * @param bool $onlyfetch Should the data only be fetched or should it update the contact record as well + * @param string $xml optional, default empty * * @return Returns an array with relevant data of the author * @todo Find good type-hints for all parameter @@ -1474,10 +1477,10 @@ class DFRN $avatarlist = array(); /// @todo check if "avatar" or "photo" would be the best field in the specification $avatars = $xpath->query($element."/atom:link[@rel='avatar']", $context); - foreach ($avatars AS $avatar) { + foreach ($avatars as $avatar) { $href = ""; $width = 0; - foreach ($avatar->attributes AS $attributes) { + foreach ($avatar->attributes as $attributes) { /// @TODO Rewrite these similar if () to one switch if ($attributes->name == "href") { $href = $attributes->textContent; @@ -1505,14 +1508,14 @@ class DFRN // When was the last change to name or uri? $name_element = $xpath->query($element . "/atom:name", $context)->item(0); - foreach ($name_element->attributes AS $attributes) { + foreach ($name_element->attributes as $attributes) { if ($attributes->name == "updated") { $poco["name-date"] = $attributes->textContent; } } $link_element = $xpath->query($element . "/atom:link", $context)->item(0); - foreach ($link_element->attributes AS $attributes) { + foreach ($link_element->attributes as $attributes) { if ($attributes->name == "updated") { $poco["uri-date"] = $attributes->textContent; } @@ -1571,7 +1574,7 @@ class DFRN // Save the keywords into the contact table $tags = array(); $tagelements = $xpath->evaluate($element . "/poco:tags/text()", $context); - foreach ($tagelements AS $tag) { + foreach ($tagelements as $tag) { $tags[$tag->nodeValue] = $tag->nodeValue; } @@ -1608,12 +1611,12 @@ class DFRN $contact = array_merge($contact, $poco); if ($old_bdyear != $contact["bdyear"]) { - self::birthday_event($contact, $birthday); + self::birthdayEvent($contact, $birthday); } // Get all field names $fields = array(); - foreach ($r[0] AS $field => $data) { + foreach ($r[0] as $field => $data) { $fields[$field] = $data; } @@ -1626,14 +1629,14 @@ class DFRN // Update check for this field has to be done differently $datefields = array("name-date", "uri-date"); - foreach ($datefields AS $field) { + foreach ($datefields as $field) { if (strtotime($contact[$field]) > strtotime($r[0][$field])) { logger("Difference for contact " . $contact["id"] . " in field '" . $field . "'. New value: '" . $contact[$field] . "', old value '" . $r[0][$field] . "'", LOGGER_DEBUG); $update = true; } } - foreach ($fields AS $field => $data) { + foreach ($fields as $field => $data) { if ($contact[$field] != $r[0][$field]) { logger("Difference for contact " . $contact["id"] . " in field '" . $field . "'. New value: '" . $contact[$field] . "', old value '" . $r[0][$field] . "'", LOGGER_DEBUG); $update = true; @@ -1692,7 +1695,7 @@ class DFRN * @return string XML string * @todo Find good type-hints for all parameter */ - private static function transform_activity($xpath, $activity, $element) + private static function transformActivity($xpath, $activity, $element) { if (!is_object($activity)) { return ""; @@ -1743,9 +1746,10 @@ class DFRN * @param object $xpath XPath object * @param object $mail mail elements * @param array $importer Record of the importer user mixed with contact of the content + * @return void * @todo Find good type-hints for all parameter */ - private static function process_mail($xpath, $mail, $importer) + private static function processMail($xpath, $mail, $importer) { logger("Processing mails"); @@ -1794,9 +1798,10 @@ class DFRN * @param object $xpath XPath object * @param object $suggestion suggestion elements * @param array $importer Record of the importer user mixed with contact of the content + * @return boolean * @todo Find good type-hints for all parameter */ - private static function process_suggestion($xpath, $suggestion, $importer) + private static function processSuggestion($xpath, $suggestion, $importer) { $a = get_app(); @@ -1903,20 +1908,21 @@ class DFRN intval(0) ); - notification(array( - "type" => NOTIFY_SUGGEST, - "notify_flags" => $importer["notify-flags"], - "language" => $importer["language"], - "to_name" => $importer["username"], - "to_email" => $importer["email"], - "uid" => $importer["importer_uid"], - "item" => $suggest, - "link" => System::baseUrl()."/notifications/intros", - "source_name" => $importer["name"], - "source_link" => $importer["url"], - "source_photo" => $importer["photo"], - "verb" => ACTIVITY_REQ_FRIEND, - "otype" => "intro") + notification( + array( + "type" => NOTIFY_SUGGEST, + "notify_flags" => $importer["notify-flags"], + "language" => $importer["language"], + "to_name" => $importer["username"], + "to_email" => $importer["email"], + "uid" => $importer["importer_uid"], + "item" => $suggest, + "link" => System::baseUrl()."/notifications/intros", + "source_name" => $importer["name"], + "source_link" => $importer["url"], + "source_photo" => $importer["photo"], + "verb" => ACTIVITY_REQ_FRIEND, + "otype" => "intro") ); return true; @@ -1928,9 +1934,10 @@ class DFRN * @param object $xpath XPath object * @param object $relocation relocation elements * @param array $importer Record of the importer user mixed with contact of the content + * @return boolean * @todo Find good type-hints for all parameter */ - private static function process_relocation($xpath, $relocation, $importer) + private static function processRelocation($xpath, $relocation, $importer) { logger("Processing relocations"); @@ -2080,9 +2087,10 @@ class DFRN * @param array $item the new item record * @param array $importer Record of the importer user mixed with contact of the content * @param int $entrytype Is it a toplevel entry, a comment or a relayed comment? + * @return mixed * @todo set proper type-hints (array?) */ - private static function update_content($current, $item, $importer, $entrytype) + private static function updateContent($current, $item, $importer, $entrytype) { $changed = false; @@ -2137,7 +2145,7 @@ class DFRN * @return int Is it a toplevel entry, a comment or a relayed comment? * @todo set proper type-hints (array?) */ - private static function get_entry_type($importer, $item) + private static function getEntryType($importer, $item) { if ($item["parent-uri"] != $item["uri"]) { $community = false; @@ -2208,9 +2216,10 @@ class DFRN * @param array $item the new item record * @param array $importer Record of the importer user mixed with contact of the content * @param int $posted_id The record number of item record that was just posted + * @return void * @todo set proper type-hints (array?) */ - private static function do_poke($item, $importer, $posted_id) + private static function doPoke($item, $importer, $posted_id) { $verb = urldecode(substr($item["verb"], strpos($item["verb"], "#")+1)); if (!$verb) { @@ -2245,7 +2254,7 @@ class DFRN "link" => System::baseUrl()."/display/".urlencode(get_item_guid($posted_id)), "source_name" => stripslashes($item["author-name"]), "source_link" => $item["author-link"], - "source_photo" => ((link_compare($item["author-link"],$importer["url"])) + "source_photo" => ((link_compare($item["author-link"], $importer["url"])) ? $importer["thumb"] : $item["author-avatar"]), "verb" => $item["verb"], "otype" => "person", @@ -2267,7 +2276,7 @@ class DFRN * @return bool Should the processing of the entries be continued? * @todo set proper type-hints (array?) */ - private static function process_verbs($entrytype, $importer, &$item, &$is_like) + private static function processVerbs($entrytype, $importer, &$item, &$is_like) { logger("Process verb ".$item["verb"]." and object-type ".$item["object-type"]." for entrytype ".$entrytype, LOGGER_DEBUG); @@ -2338,7 +2347,6 @@ class DFRN } if (($item["verb"] == ACTIVITY_TAG) && ($item["object-type"] == ACTIVITY_OBJ_TAGTERM)) { - $xo = parse_xml_string($item["object"], false); $xt = parse_xml_string($item["target"], false); @@ -2356,8 +2364,9 @@ class DFRN // extract tag, if not duplicate, add to parent item if ($xo->content) { - if (!(stristr($r[0]["tag"],trim($xo->content)))) { - q("UPDATE `item` SET `tag` = '%s' WHERE `id` = %d", + if (!(stristr($r[0]["tag"], trim($xo->content)))) { + q( + "UPDATE `item` SET `tag` = '%s' WHERE `id` = %d", dbesc($r[0]["tag"] . (strlen($r[0]["tag"]) ? ',' : '') . '#[url=' . $xo->id . ']'. $xo->content . '[/url]'), intval($r[0]["id"]) ); @@ -2375,17 +2384,18 @@ class DFRN * * @param object $links link elements * @param array $item the item record + * @return void * @todo set proper type-hints */ - private static function parse_links($links, &$item) + private static function parseLinks($links, &$item) { $rel = ""; $href = ""; $type = ""; $length = "0"; $title = ""; - foreach ($links AS $link) { - foreach ($link->attributes AS $attributes) { + foreach ($links as $link) { + foreach ($link->attributes as $attributes) { /// @TODO Rewrite these repeated (same) if () statements to a switch() if ($attributes->name == "href") { $href = $attributes->textContent; @@ -2424,13 +2434,15 @@ class DFRN /** * @brief Processes the entry elements which contain the items and comments * - * @param array $header Array of the header elements that always stay the same - * @param object $xpath XPath object - * @param object $entry entry elements - * @param array $importer Record of the importer user mixed with contact of the content + * @param array $header Array of the header elements that always stay the same + * @param object $xpath XPath object + * @param object $entry entry elements + * @param array $importer Record of the importer user mixed with contact of the content + * @param object $xml xml + * @return void * @todo Add type-hints */ - private static function process_entry($header, $xpath, $entry, $importer, $xml) + private static function processEntry($header, $xpath, $entry, $importer, $xml) { logger("Processing entries"); @@ -2527,7 +2539,7 @@ class DFRN $notice_info = $xpath->query("statusnet:notice_info", $entry); if ($notice_info && ($notice_info->length > 0)) { - foreach ($notice_info->item(0)->attributes AS $attributes) { + foreach ($notice_info->item(0)->attributes as $attributes) { if ($attributes->name == "source") { $item["app"] = strip_tags($attributes->textContent); } @@ -2549,7 +2561,7 @@ class DFRN } $object = $xpath->query("activity:object", $entry)->item(0); - $item["object"] = self::transform_activity($xpath, $object, "object"); + $item["object"] = self::transformActivity($xpath, $object, "object"); if (trim($item["object"]) != "") { $r = parse_xml_string($item["object"], false); @@ -2559,14 +2571,14 @@ class DFRN } $target = $xpath->query("activity:target", $entry)->item(0); - $item["target"] = self::transform_activity($xpath, $target, "target"); + $item["target"] = self::transformActivity($xpath, $target, "target"); $categories = $xpath->query("atom:category", $entry); if ($categories) { - foreach ($categories AS $category) { + foreach ($categories as $category) { $term = ""; $scheme = ""; - foreach ($category->attributes AS $attributes) { + foreach ($category->attributes as $attributes) { if ($attributes->name == "term") { $term = $attributes->textContent; } @@ -2596,14 +2608,14 @@ class DFRN $links = $xpath->query("atom:link", $entry); if ($links) { - self::parse_links($links, $item); + self::parseLinks($links, $item); } $item['conversation-uri'] = $xpath->query('ostatus:conversation/text()', $entry)->item(0)->nodeValue; $conv = $xpath->query('ostatus:conversation', $entry); if (is_object($conv->item(0))) { - foreach ($conv->item(0)->attributes AS $attributes) { + foreach ($conv->item(0)->attributes as $attributes) { if ($attributes->name == "ref") { $item['conversation-uri'] = $attributes->textContent; } @@ -2618,7 +2630,7 @@ class DFRN $inreplyto = $xpath->query("thr:in-reply-to", $entry); if (is_object($inreplyto->item(0))) { - foreach ($inreplyto->item(0)->attributes AS $attributes) { + foreach ($inreplyto->item(0)->attributes as $attributes) { if ($attributes->name == "ref") { $item["parent-uri"] = $attributes->textContent; } @@ -2626,7 +2638,7 @@ class DFRN } // Get the type of the item (Top level post, reply or remote reply) - $entrytype = self::get_entry_type($importer, $item); + $entrytype = self::getEntryType($importer, $item); // Now assign the rest of the values that depend on the type of the message if (in_array($entrytype, array(DFRN_REPLY, DFRN_REPLY_RC))) { @@ -2699,14 +2711,14 @@ class DFRN } } - if (!self::process_verbs($entrytype, $importer, $item, $is_like)) { - logger("Exiting because 'process_verbs' told us so", LOGGER_DEBUG); + if (!self::processVerbs($entrytype, $importer, $item, $is_like)) { + logger("Exiting because 'processVerbs' told us so", LOGGER_DEBUG); return; } // Update content if 'updated' changes if (DBM::is_result($current)) { - if (self::update_content($r[0], $item, $importer, $entrytype)) { + if (self::updateContent($r[0], $item, $importer, $entrytype)) { logger("Item ".$item["uri"]." was updated.", LOGGER_DEBUG); } else { logger("Item ".$item["uri"]." already existed.", LOGGER_DEBUG); @@ -2783,8 +2795,9 @@ class DFRN logger("Item was stored with id ".$posted_id, LOGGER_DEBUG); - if (stristr($item["verb"],ACTIVITY_POKE)) - self::do_poke($item, $importer, $posted_id); + if (stristr($item["verb"], ACTIVITY_POKE)) { + self::doPoke($item, $importer, $posted_id); + } } } @@ -2794,13 +2807,14 @@ class DFRN * @param object $xpath XPath object * @param object $deletion deletion elements * @param array $importer Record of the importer user mixed with contact of the content + * @return void * @todo set proper type-hints */ - private static function process_deletion($xpath, $deletion, $importer) + private static function processDeletion($xpath, $deletion, $importer) { logger("Processing deletions"); - foreach ($deletion->attributes AS $attributes) { + foreach ($deletion->attributes as $attributes) { if ($attributes->name == "ref") { $uri = $attributes->textContent; } @@ -2832,7 +2846,7 @@ class DFRN } else { $item = $r[0]; - $entrytype = self::get_entry_type($importer, $item); + $entrytype = self::getEntryType($importer, $item); if (!$item["deleted"]) { logger('deleting item '.$item["id"].' uri='.$uri, LOGGER_DEBUG); @@ -2846,7 +2860,6 @@ class DFRN } if (($item["verb"] == ACTIVITY_TAG) && ($item["object-type"] == ACTIVITY_OBJ_TAGTERM)) { - $xo = parse_xml_string($item["object"], false); $xt = parse_xml_string($item["target"], false); @@ -3017,8 +3030,8 @@ class DFRN // We are processing relocations even if we are ignoring a contact $relocations = $xpath->query("/atom:feed/dfrn:relocate"); - foreach ($relocations AS $relocation) { - self::process_relocation($xpath, $relocation, $importer); + foreach ($relocations as $relocation) { + self::processRelocation($xpath, $relocation, $importer); } if ($importer["readonly"]) { @@ -3029,29 +3042,29 @@ class DFRN } $mails = $xpath->query("/atom:feed/dfrn:mail"); - foreach ($mails AS $mail) { - self::process_mail($xpath, $mail, $importer); + foreach ($mails as $mail) { + self::processMail($xpath, $mail, $importer); } $suggestions = $xpath->query("/atom:feed/dfrn:suggest"); - foreach ($suggestions AS $suggestion) { - self::process_suggestion($xpath, $suggestion, $importer); + foreach ($suggestions as $suggestion) { + self::processSuggestion($xpath, $suggestion, $importer); } $deletions = $xpath->query("/atom:feed/at:deleted-entry"); - foreach ($deletions AS $deletion) { - self::process_deletion($xpath, $deletion, $importer); + foreach ($deletions as $deletion) { + self::processDeletion($xpath, $deletion, $importer); } if (!$sort_by_date) { $entries = $xpath->query("/atom:feed/atom:entry"); - foreach ($entries AS $entry) { - self::process_entry($header, $xpath, $entry, $importer, $xml); + foreach ($entries as $entry) { + self::processEntry($header, $xpath, $entry, $importer, $xml); } } else { $newentries = array(); $entries = $xpath->query("/atom:feed/atom:entry"); - foreach ($entries AS $entry) { + foreach ($entries as $entry) { $created = $xpath->query("atom:published/text()", $entry)->item(0)->nodeValue; $newentries[strtotime($created)] = $entry; } @@ -3059,8 +3072,8 @@ class DFRN // Now sort after the publishing date ksort($newentries); - foreach ($newentries AS $entry) { - self::process_entry($header, $xpath, $entry, $importer, $xml); + foreach ($newentries as $entry) { + self::processEntry($header, $xpath, $entry, $importer, $xml); } } logger("Import done for user " . $importer["uid"] . " from contact " . $importer["id"], LOGGER_DEBUG); diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 1a320d14e2..4d91f8b1c0 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -5,7 +5,7 @@ * * The new protocol is described here: http://diaspora.github.io/diaspora_federation/index.html * This implementation here interprets the old and the new protocol and sends the new one. - * In the future we will remove most stuff from "valid_posting" and interpret only the new protocol. + * In the future we will remove most stuff from "validPosting" and interpret only the new protocol. */ namespace Friendica\Protocol; @@ -46,7 +46,7 @@ class Diaspora * * @return array of relay servers */ - public static function relay_list() + public static function relayList() { $serverdata = Config::get("system", "relay_server"); if ($serverdata == "") { @@ -109,7 +109,7 @@ class Diaspora * * @return string the repaired signature */ - private static function repair_signature($signature, $handle = "", $level = 1) + private static function repairSignature($signature, $handle = "", $level = 1) { if ($signature == "") { return ($signature); @@ -121,7 +121,7 @@ class Diaspora // Do a recursive call to be able to fix even multiple levels if ($level < 10) { - $signature = self::repair_signature($signature, $handle, ++$level); + $signature = self::repairSignature($signature, $handle, ++$level); } } @@ -135,7 +135,7 @@ class Diaspora * * @return string verified data */ - private static function verify_magic_envelope($envelope) + private static function verifyMagicEnvelope($envelope) { $basedom = parse_xml_string($envelope); @@ -191,7 +191,7 @@ class Diaspora * * @return string encrypted data */ - private static function aes_encrypt($key, $iv, $data) + private static function aesEncrypt($key, $iv, $data) { return openssl_encrypt($data, 'aes-256-cbc', str_pad($key, 32, "\0"), OPENSSL_RAW_DATA, str_pad($iv, 16, "\0")); } @@ -205,7 +205,7 @@ class Diaspora * * @return string decrypted data */ - private static function aes_decrypt($key, $iv, $encrypted) + private static function aesDecrypt($key, $iv, $encrypted) { return openssl_decrypt($encrypted, 'aes-256-cbc', str_pad($key, 32, "\0"), OPENSSL_RAW_DATA, str_pad($iv, 16, "\0")); } @@ -221,7 +221,7 @@ class Diaspora * 'author' -> author diaspora handle * 'key' -> author public key (converted to pkcs#8) */ - public static function decode_raw($importer, $raw) + public static function decodeRaw($importer, $raw) { $data = json_decode($raw); @@ -242,7 +242,7 @@ class Diaspora $outer_iv = base64_decode($j_outer_key_bundle->iv); $outer_key = base64_decode($j_outer_key_bundle->key); - $xml = self::aes_decrypt($outer_key, $outer_iv, $ciphertext); + $xml = self::aesDecrypt($outer_key, $outer_iv, $ciphertext); } else { $xml = $raw; } @@ -329,7 +329,7 @@ class Diaspora $outer_iv = base64_decode($j_outer_key_bundle->iv); $outer_key = base64_decode($j_outer_key_bundle->key); - $decrypted = self::aes_decrypt($outer_key, $outer_iv, $ciphertext); + $decrypted = self::aesDecrypt($outer_key, $outer_iv, $ciphertext); logger('decrypted: '.$decrypted, LOGGER_DEBUG); $idom = parse_xml_string($decrypted); @@ -387,7 +387,7 @@ class Diaspora } else { // Decode the encrypted blob $inner_encrypted = base64_decode($data); - $inner_decrypted = self::aes_decrypt($inner_aes_key, $inner_iv, $inner_encrypted); + $inner_decrypted = self::aesDecrypt($inner_aes_key, $inner_iv, $inner_encrypted); } if (!$author_link) { @@ -428,7 +428,7 @@ class Diaspora * * @return int The message id of the generated message, "true" or "false" if there was an error */ - public static function dispatch_public($msg) + public static function dispatchPublic($msg) { $enabled = intval(Config::get("system", "diaspora_enabled")); if (!$enabled) { @@ -436,7 +436,7 @@ class Diaspora return false; } - if (!($postdata = self::valid_posting($msg))) { + if (!($postdata = self::validPosting($msg))) { logger("Invalid posting"); return false; } @@ -446,7 +446,7 @@ class Diaspora // Is it a an action (comment, like, ...) for our own post? if (isset($fields->parent_guid) && !$postdata["relayed"]) { $guid = notags(unxmlify($fields->parent_guid)); - $importer = self::importer_for_guid($guid); + $importer = self::importerForGuid($guid); if (is_array($importer)) { logger("delivering to origin: ".$importer["name"]); $message_id = self::dispatch($importer, $msg, $fields); @@ -508,7 +508,7 @@ class Diaspora // This is only needed for private postings since this is already done for public ones before if (is_null($fields)) { - if (!($postdata = self::valid_posting($msg))) { + if (!($postdata = self::validPosting($msg))) { logger("Invalid posting"); return false; } @@ -524,43 +524,43 @@ class Diaspora return self::receiveAccountMigration($importer, $fields); case "account_deletion": - return self::receive_account_deletion($importer, $fields); + return self::receiveAccountDeletion($importer, $fields); case "comment": - return self::receive_comment($importer, $sender, $fields, $msg["message"]); + return self::receiveComment($importer, $sender, $fields, $msg["message"]); case "contact": - return self::receive_contact_request($importer, $fields); + return self::receiveContactRequest($importer, $fields); case "conversation": - return self::receive_conversation($importer, $msg, $fields); + return self::receiveConversation($importer, $msg, $fields); case "like": - return self::receive_like($importer, $sender, $fields); + return self::receiveLike($importer, $sender, $fields); case "message": - return self::receive_message($importer, $fields); + return self::receiveMessage($importer, $fields); case "participation": // Not implemented - return self::receive_participation($importer, $fields); + return self::receiveParticipation($importer, $fields); case "photo": // Not implemented - return self::receive_photo($importer, $fields); + return self::receivePhoto($importer, $fields); case "poll_participation": // Not implemented - return self::receive_poll_participation($importer, $fields); + return self::receivePollParticipation($importer, $fields); case "profile": - return self::receive_profile($importer, $fields); + return self::receiveProfile($importer, $fields); case "reshare": - return self::receive_reshare($importer, $fields, $msg["message"]); + return self::receiveReshare($importer, $fields, $msg["message"]); case "retraction": - return self::receive_retraction($importer, $sender, $fields); + return self::receiveRetraction($importer, $sender, $fields); case "status_message": - return self::receive_status_message($importer, $fields, $msg["message"]); + return self::receiveStatusMessage($importer, $fields, $msg["message"]); default: logger("Unknown message type ".$type); @@ -580,7 +580,7 @@ class Diaspora * * @return bool|array If the posting is valid then an array with an SimpleXML object is returned */ - private static function valid_posting($msg) + private static function validPosting($msg) { $data = parse_xml_string($msg["message"]); @@ -731,7 +731,7 @@ class Diaspora logger("Fetching diaspora key for: ".$handle); - $r = self::person_by_handle($handle); + $r = self::personByHandle($handle); if ($r) { return $r["pubkey"]; } @@ -746,7 +746,7 @@ class Diaspora * * @return array the queried data */ - public static function person_by_handle($handle) + public static function personByHandle($handle) { $r = q( "SELECT * FROM `fcontact` WHERE `network` = '%s' AND `addr` = '%s' LIMIT 1", @@ -775,7 +775,7 @@ class Diaspora // Note that Friendica contacts will return a "Diaspora person" // if Diaspora connectivity is enabled on their server if ($r && ($r["network"] === NETWORK_DIASPORA)) { - self::add_fcontact($r, $update); + self::addFContact($r, $update); $person = $r; } } @@ -790,7 +790,7 @@ class Diaspora * * @return string The id of the fcontact entry */ - private static function add_fcontact($arr, $update = false) + private static function addFContact($arr, $update = false) { if ($update) { $r = q( @@ -859,7 +859,7 @@ class Diaspora * * @return string the handle */ - public static function handle_from_contact($contact_id, $gcontact_id = 0) + public static function handleFromContact($contact_id, $gcontact_id = 0) { $handle = false; @@ -908,7 +908,7 @@ class Diaspora * * @return string the contact url or null */ - public static function url_from_contact_guid($fcontact_guid) + public static function urlFromContactGuid($fcontact_guid) { logger("fcontact guid is ".$fcontact_guid, LOGGER_DEBUG); @@ -933,7 +933,7 @@ class Diaspora * * @return The contact id */ - private static function contact_by_handle($uid, $handle) + private static function contactByHandle($uid, $handle) { // First do a direct search on the contact table $r = q( @@ -986,8 +986,8 @@ class Diaspora * * @return bool is the contact allowed to post? */ - private static function post_allow($importer, $contact, $is_comment = false) { - + private static function postAllow($importer, $contact, $is_comment = false) + { /* * Perhaps we were already sharing with this person. Now they're sharing with us. * That makes us friends. @@ -1008,15 +1008,15 @@ class Diaspora if ($contact["blocked"] || $contact["readonly"] || $contact["archive"]) { // Maybe blocked, don't accept. return false; - // We are following this person? + // We are following this person? } elseif (($contact["rel"] == CONTACT_IS_SHARING) || ($contact["rel"] == CONTACT_IS_FRIEND)) { // Yes, then it is fine. return true; - // Is it a post to a community? + // Is it a post to a community? } elseif (($contact["rel"] == CONTACT_IS_FOLLOWER) && ($importer["page-flags"] == PAGE_COMMUNITY)) { // That's good return true; - // Is the message a global user or a comment? + // Is the message a global user or a comment? } elseif (($importer["uid"] == 0) || $is_comment) { // Messages for the global users and comments are always accepted return true; @@ -1034,9 +1034,9 @@ class Diaspora * * @return array The contact data */ - private static function allowed_contact_by_handle($importer, $handle, $is_comment = false) + private static function allowedContactByHandle($importer, $handle, $is_comment = false) { - $contact = self::contact_by_handle($importer["uid"], $handle); + $contact = self::contactByHandle($importer["uid"], $handle); if (!$contact) { logger("A Contact for handle ".$handle." and user ".$importer["uid"]." was not found"); // If a contact isn't found, we accept it anyway if it is a comment @@ -1047,7 +1047,7 @@ class Diaspora } } - if (!self::post_allow($importer, $contact, $is_comment)) { + if (!self::postAllow($importer, $contact, $is_comment)) { logger("The handle: ".$handle." is not allowed to post to user ".$importer["uid"]); return false; } @@ -1062,7 +1062,7 @@ class Diaspora * * @return int|bool message id if the message already was stored into the system - or false. */ - private static function message_exists($uid, $guid) + private static function messageExists($uid, $guid) { $r = q( "SELECT `id` FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1", @@ -1082,14 +1082,15 @@ class Diaspora * @brief Checks for links to posts in a message * * @param array $item The item array + * @return void */ - private static function fetch_guid($item) + private static function fetchGuid($item) { $expression = "=diaspora://.*?/post/([0-9A-Za-z\-_@.:]{15,254}[0-9A-Za-z])=ism"; preg_replace_callback( $expression, function ($match) use ($item) { - return self::fetch_guid_sub($match, $item); + return self::fetchGuidSub($match, $item); }, $item["body"] ); @@ -1097,7 +1098,7 @@ class Diaspora preg_replace_callback( "&\[url=/posts/([^\[\]]*)\](.*)\[\/url\]&Usi", function ($match) use ($item) { - return self::fetch_guid_sub($match, $item); + return self::fetchGuidSub($match, $item); }, $item["body"] ); @@ -1112,7 +1113,7 @@ class Diaspora * * @return the replaced string */ - public static function replace_people_guid($body, $author_link) + public static function replacePeopleGuid($body, $author_link) { $return = preg_replace_callback( "&\[url=/people/([^\[\]]*)\](.*)\[\/url\]&Usi", @@ -1121,7 +1122,7 @@ class Diaspora // 0 => '[url=/people/0123456789abcdef]Foo Bar[/url]' // 1 => '0123456789abcdef' // 2 => 'Foo Bar' - $handle = self::url_from_contact_guid($match[1]); + $handle = self::urlFromContactGuid($match[1]); if ($handle) { $return = '@[url='.$handle.']'.$match[2].'[/url]'; @@ -1140,15 +1141,16 @@ class Diaspora } /** - * @brief sub function of "fetch_guid" which checks for links in messages + * @brief sub function of "fetchGuid" which checks for links in messages * * @param array $match array containing a link that has to be checked for a message link * @param array $item The item array + * @return void */ - private static function fetch_guid_sub($match, $item) + private static function fetchGuidSub($match, $item) { - if (!self::store_by_guid($match[1], $item["author-link"])) { - self::store_by_guid($match[1], $item["owner-link"]); + if (!self::storeByGuid($match[1], $item["author-link"])) { + self::storeByGuid($match[1], $item["owner-link"]); } } @@ -1161,7 +1163,7 @@ class Diaspora * * @return int the message id of the stored message or false */ - private static function store_by_guid($guid, $server, $uid = 0) + private static function storeByGuid($guid, $server, $uid = 0) { $serverparts = parse_url($server); $server = $serverparts["scheme"]."://".$serverparts["host"]; @@ -1177,7 +1179,7 @@ class Diaspora logger("Successfully fetched item ".$guid." from ".$server, LOGGER_DEBUG); // Now call the dispatcher - return self::dispatch_public($msg); + return self::dispatchPublic($msg); } /** @@ -1206,7 +1208,7 @@ class Diaspora $envelope = fetch_url($source_url); if ($envelope) { logger("Envelope was fetched.", LOGGER_DEBUG); - $x = self::verify_magic_envelope($envelope); + $x = self::verifyMagicEnvelope($envelope); if (!$x) { logger("Envelope could not be verified.", LOGGER_DEBUG); } else { @@ -1275,7 +1277,7 @@ class Diaspora * * @return array the item record */ - private static function parent_item($uid, $guid, $author, $contact) + private static function parentItem($uid, $guid, $author, $contact) { $r = q( "SELECT `id`, `parent`, `body`, `wall`, `uri`, `guid`, `private`, `origin`, @@ -1287,11 +1289,11 @@ class Diaspora ); if (!$r) { - $result = self::store_by_guid($guid, $contact["url"], $uid); + $result = self::storeByGuid($guid, $contact["url"], $uid); if (!$result) { - $person = self::person_by_handle($author); - $result = self::store_by_guid($guid, $person["url"], $uid); + $person = self::personByHandle($author); + $result = self::storeByGuid($guid, $person["url"], $uid); } if ($result) { @@ -1328,7 +1330,7 @@ class Diaspora * 'cid' => contact id * 'network' => network type */ - private static function author_contact_by_url($contact, $person, $uid) + private static function authorContactByUrl($contact, $person, $uid) { $r = q( "SELECT `id`, `network`, `url` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d LIMIT 1", @@ -1357,7 +1359,7 @@ class Diaspora * * @return bool is it a hubzilla server? */ - public static function is_redmatrix($url) + public static function isRedmatrix($url) { return(strstr($url, "/channel/")); } @@ -1395,7 +1397,7 @@ class Diaspora return str_replace("/profile/".$r[0]["nick"]."/", "/display/".$guid, $r[0]["url"]."/"); } - if (self::is_redmatrix($r[0]["url"])) { + if (self::isRedmatrix($r[0]["url"])) { return $r[0]["url"]."/?f=&mid=".$guid; } @@ -1420,7 +1422,7 @@ class Diaspora $new_handle = notags(unxmlify($data->profile->author)); $signature = notags(unxmlify($data->signature)); - $contact = self::contact_by_handle($importer["uid"], $old_handle); + $contact = self::contactByHandle($importer["uid"], $old_handle); if (!$contact) { logger("cannot find contact for sender: ".$old_handle." and user ".$importer["uid"]); return false; @@ -1437,7 +1439,7 @@ class Diaspora } // Update the profile - self::receive_profile($importer, $data->profile); + self::receiveProfile($importer, $data->profile); // change the technical stuff in contact and gcontact $data = Probe::uri($new_handle); @@ -1507,13 +1509,13 @@ class Diaspora * * @return bool Success */ - private static function receive_account_deletion($importer, $data) + private static function receiveAccountDeletion($importer, $data) { /// @todo Account deletion should remove the contact from the global contacts as well $author = notags(unxmlify($data->author)); - $contact = self::contact_by_handle($importer["uid"], $author); + $contact = self::contactByHandle($importer["uid"], $author); if (!$contact) { logger("cannot find contact for author: ".$author); return false; @@ -1533,7 +1535,7 @@ class Diaspora * * @return string The constructed uri or the one from our database */ - private static function get_uri_from_guid($author, $guid, $onlyfound = false) + private static function getUriFromGuid($author, $guid, $onlyfound = false) { $r = q("SELECT `uri` FROM `item` WHERE `guid` = '%s' LIMIT 1", dbesc($guid)); if (DBM::is_result($r)) { @@ -1553,7 +1555,7 @@ class Diaspora * * @return string The post guid */ - private static function get_guid_from_uri($uri, $uid) + private static function getGuidFromUri($uri, $uid) { $r = q("SELECT `guid` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1", dbesc($uri), intval($uid)); if (DBM::is_result($r)) { @@ -1570,7 +1572,7 @@ class Diaspora * * @return array|boolean the origin owner of that post - or false */ - private static function importer_for_guid($guid) + private static function importerForGuid($guid) { $item = dba::fetch_first("SELECT `uid` FROM `item` WHERE `origin` AND `guid` = ? LIMIT 1", $guid); @@ -1594,7 +1596,7 @@ class Diaspora * * @return int The message id of the generated comment or "false" if there was an error */ - private static function receive_comment($importer, $sender, $data, $xml) + private static function receiveComment($importer, $sender, $data, $xml) { $author = notags(unxmlify($data->author)); $guid = notags(unxmlify($data->guid)); @@ -1609,34 +1611,34 @@ class Diaspora if (isset($data->thread_parent_guid)) { $thread_parent_guid = notags(unxmlify($data->thread_parent_guid)); - $thr_uri = self::get_uri_from_guid("", $thread_parent_guid, true); + $thr_uri = self::getUriFromGuid("", $thread_parent_guid, true); } else { $thr_uri = ""; } - $contact = self::allowed_contact_by_handle($importer, $sender, true); + $contact = self::allowedContactByHandle($importer, $sender, true); if (!$contact) { return false; } - $message_id = self::message_exists($importer["uid"], $guid); + $message_id = self::messageExists($importer["uid"], $guid); if ($message_id) { return true; } - $parent_item = self::parent_item($importer["uid"], $parent_guid, $author, $contact); + $parent_item = self::parentItem($importer["uid"], $parent_guid, $author, $contact); if (!$parent_item) { return false; } - $person = self::person_by_handle($author); + $person = self::personByHandle($author); if (!is_array($person)) { logger("unable to find author details"); return false; } // Fetch the contact id - if we know this contact - $author_contact = self::author_contact_by_url($contact, $person, $importer["uid"]); + $author_contact = self::authorContactByUrl($contact, $person, $importer["uid"]); $datarray = array(); @@ -1653,7 +1655,7 @@ class Diaspora $datarray["owner-avatar"] = ((x($contact, "thumb")) ? $contact["thumb"] : $contact["photo"]); $datarray["guid"] = $guid; - $datarray["uri"] = self::get_uri_from_guid($author, $guid); + $datarray["uri"] = self::getUriFromGuid($author, $guid); $datarray["type"] = "remote-comment"; $datarray["verb"] = ACTIVITY_POST; @@ -1676,9 +1678,9 @@ class Diaspora $body = diaspora2bb($text); - $datarray["body"] = self::replace_people_guid($body, $person["url"]); + $datarray["body"] = self::replacePeopleGuid($body, $person["url"]); - self::fetch_guid($datarray); + self::fetchGuid($datarray); $message_id = item_store($datarray); @@ -1715,7 +1717,7 @@ class Diaspora * * @return bool "true" if it was successful */ - private static function receive_conversation_message($importer, $contact, $data, $msg, $mesg, $conversation) + private static function receiveConversationMessage($importer, $contact, $data, $msg, $mesg, $conversation) { $author = notags(unxmlify($data->author)); $guid = notags(unxmlify($data->guid)); @@ -1744,7 +1746,7 @@ class Diaspora $body = diaspora2bb($msg_text); $message_uri = $msg_author.":".$msg_guid; - $person = self::person_by_handle($msg_author); + $person = self::personByHandle($msg_author); dba::lock('mail'); @@ -1794,8 +1796,8 @@ class Diaspora "source_link" => $person["url"], "source_photo" => $person["thumb"], "verb" => ACTIVITY_POST, - "otype" => "mail" - )); + "otype" => "mail") + ); return true; } @@ -1808,7 +1810,7 @@ class Diaspora * * @return bool Success */ - private static function receive_conversation($importer, $msg, $data) + private static function receiveConversation($importer, $msg, $data) { $author = notags(unxmlify($data->author)); $guid = notags(unxmlify($data->guid)); @@ -1823,7 +1825,7 @@ class Diaspora return false; } - $contact = self::allowed_contact_by_handle($importer, $msg["author"], true); + $contact = self::allowedContactByHandle($importer, $msg["author"], true); if (!$contact) { return false; } @@ -1867,7 +1869,7 @@ class Diaspora } foreach ($messages as $mesg) { - self::receive_conversation_message($importer, $contact, $data, $msg, $mesg, $conversation); + self::receiveConversationMessage($importer, $contact, $data, $msg, $mesg, $conversation); } return true; @@ -1882,7 +1884,8 @@ class Diaspora * * @return string the body */ - private static function construct_like_body($contact, $parent_item, $guid) { + private static function constructLikeBody($contact, $parent_item, $guid) + { $bodyverb = t('%1$s likes %2$s\'s %3$s'); $ulink = "[url=".$contact["url"]."]".$contact["name"]."[/url]"; @@ -1900,7 +1903,7 @@ class Diaspora * * @return string The XML */ - private static function construct_like_object($importer, $parent_item) + private static function constructLikeObject($importer, $parent_item) { $objtype = ACTIVITY_OBJ_NOTE; $link = ''; @@ -1925,7 +1928,7 @@ class Diaspora * * @return int The message id of the generated like or "false" if there was an error */ - private static function receive_like($importer, $sender, $data) + private static function receiveLike($importer, $sender, $data) { $author = notags(unxmlify($data->author)); $guid = notags(unxmlify($data->guid)); @@ -1939,29 +1942,29 @@ class Diaspora return false; } - $contact = self::allowed_contact_by_handle($importer, $sender, true); + $contact = self::allowedContactByHandle($importer, $sender, true); if (!$contact) { return false; } - $message_id = self::message_exists($importer["uid"], $guid); + $message_id = self::messageExists($importer["uid"], $guid); if ($message_id) { return true; } - $parent_item = self::parent_item($importer["uid"], $parent_guid, $author, $contact); + $parent_item = self::parentItem($importer["uid"], $parent_guid, $author, $contact); if (!$parent_item) { return false; } - $person = self::person_by_handle($author); + $person = self::personByHandle($author); if (!is_array($person)) { logger("unable to find author details"); return false; } // Fetch the contact id - if we know this contact - $author_contact = self::author_contact_by_url($contact, $person, $importer["uid"]); + $author_contact = self::authorContactByUrl($contact, $person, $importer["uid"]); // "positive" = "false" would be a Dislike - wich isn't currently supported by Diaspora // We would accept this anyhow. @@ -1988,7 +1991,7 @@ class Diaspora $datarray["owner-avatar"] = ((x($contact, "thumb")) ? $contact["thumb"] : $contact["photo"]); $datarray["guid"] = $guid; - $datarray["uri"] = self::get_uri_from_guid($author, $guid); + $datarray["uri"] = self::getUriFromGuid($author, $guid); $datarray["type"] = "activity"; $datarray["verb"] = $verb; @@ -1996,9 +1999,9 @@ class Diaspora $datarray["parent-uri"] = $parent_item["uri"]; $datarray["object-type"] = ACTIVITY_OBJ_NOTE; - $datarray["object"] = self::construct_like_object($importer, $parent_item); + $datarray["object"] = self::constructLikeObject($importer, $parent_item); - $datarray["body"] = self::construct_like_body($contact, $parent_item, $guid); + $datarray["body"] = self::constructLikeBody($contact, $parent_item, $guid); $message_id = item_store($datarray); @@ -2039,7 +2042,7 @@ class Diaspora * * @return bool Success? */ - private static function receive_message($importer, $data) + private static function receiveMessage($importer, $data) { $author = notags(unxmlify($data->author)); $guid = notags(unxmlify($data->guid)); @@ -2047,7 +2050,7 @@ class Diaspora $text = unxmlify($data->text); $created_at = datetime_convert("UTC", "UTC", notags(unxmlify($data->created_at))); - $contact = self::allowed_contact_by_handle($importer, $author, true); + $contact = self::allowedContactByHandle($importer, $author, true); if (!$contact) { return false; } @@ -2068,7 +2071,7 @@ class Diaspora $message_uri = $author.":".$guid; - $person = self::person_by_handle($author); + $person = self::personByHandle($author); if (!$person) { logger("unable to find author details"); return false; @@ -2076,7 +2079,7 @@ class Diaspora $body = diaspora2bb($text); - $body = self::replace_people_guid($body, $person["url"]); + $body = self::replacePeopleGuid($body, $person["url"]); dba::lock('mail'); @@ -2123,7 +2126,7 @@ class Diaspora * * @return bool always true */ - private static function receive_participation($importer, $data) + private static function receiveParticipation($importer, $data) { // I'm not sure if we can fully support this message type return true; @@ -2137,7 +2140,7 @@ class Diaspora * * @return bool always true */ - private static function receive_photo($importer, $data) + private static function receivePhoto($importer, $data) { // There doesn't seem to be a reason for this function, // since the photo data is transmitted in the status message as well @@ -2152,7 +2155,7 @@ class Diaspora * * @return bool always true */ - private static function receive_poll_participation($importer, $data) + private static function receivePollParticipation($importer, $data) { // We don't support polls by now return true; @@ -2166,11 +2169,11 @@ class Diaspora * * @return bool Success */ - private static function receive_profile($importer, $data) + private static function receiveProfile($importer, $data) { $author = strtolower(notags(unxmlify($data->author))); - $contact = self::contact_by_handle($importer["uid"], $author); + $contact = self::contactByHandle($importer["uid"], $author); if (!$contact) { return false; } @@ -2261,8 +2264,9 @@ class Diaspora * * @param array $importer Array of the importer user * @param array $contact The contact that send the request + * @return void */ - private static function receive_request_make_friend($importer, $contact) + private static function receiveRequestMakeFriend($importer, $contact) { $a = get_app(); @@ -2281,7 +2285,6 @@ class Diaspora ); if ($r && !$r[0]["hide-friends"] && !$contact["hidden"] && intval(PConfig::get($importer["uid"], "system", "post_newfriend"))) { - $self = q( "SELECT * FROM `contact` WHERE `self` AND `uid` = %d LIMIT 1", intval($importer["uid"]) @@ -2310,7 +2313,7 @@ class Diaspora $BPhoto = "[url=".$contact["url"]."][img]".$contact["thumb"]."[/img][/url]"; $arr["body"] = sprintf(t("%1$s is now friends with %2$s"), $A, $B)."\n\n\n".$Bphoto; - $arr["object"] = self::construct_new_friend_object($contact); + $arr["object"] = self::constructNewFriendObject($contact); $arr["last-child"] = 1; @@ -2334,7 +2337,7 @@ class Diaspora * * @return string The XML */ - private static function construct_new_friend_object($contact) + private static function constructNewFriendObject($contact) { $objtype = ACTIVITY_OBJ_PERSON; $link = ''."\n". @@ -2356,7 +2359,7 @@ class Diaspora * * @return bool Success */ - private static function receive_contact_request($importer, $data) + private static function receiveContactRequest($importer, $data) { $author = unxmlify($data->author); $recipient = unxmlify($data->recipient); @@ -2379,17 +2382,17 @@ class Diaspora $sharing = true; } - $contact = self::contact_by_handle($importer["uid"], $author); + $contact = self::contactByHandle($importer["uid"], $author); // perhaps we were already sharing with this person. Now they're sharing with us. // That makes us friends. if ($contact) { if ($following) { logger("Author ".$author." (Contact ".$contact["id"].") wants to follow us.", LOGGER_DEBUG); - self::receive_request_make_friend($importer, $contact); + self::receiveRequestMakeFriend($importer, $contact); // refetch the contact array - $contact = self::contact_by_handle($importer["uid"], $author); + $contact = self::contactByHandle($importer["uid"], $author); // If we are now friends, we are sending a share message. // Normally we needn't to do so, but the first message could have been vanished. @@ -2397,7 +2400,7 @@ class Diaspora $u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer["uid"])); if ($u) { logger("Sending share message to author ".$author." - Contact: ".$contact["id"]." - User: ".$importer["uid"], LOGGER_DEBUG); - $ret = self::send_share($u[0], $contact); + $ret = self::sendShare($u[0], $contact); } } return true; @@ -2422,7 +2425,7 @@ class Diaspora logger("Author ".$author." wants to listen to us.", LOGGER_DEBUG); } - $ret = self::person_by_handle($author); + $ret = self::personByHandle($author); if (!$ret || ($ret["network"] != NETWORK_DIASPORA)) { logger("Cannot resolve diaspora handle ".$author." for ".$recipient); @@ -2453,7 +2456,7 @@ class Diaspora // find the contact record we just created - $contact_record = self::contact_by_handle($importer["uid"], $author); + $contact_record = self::contactByHandle($importer["uid"], $author); if (!$contact_record) { logger("unable to locate newly created contact record."); @@ -2523,10 +2526,10 @@ class Diaspora $u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer["uid"])); if ($u) { logger("Sending share message (Relation: ".$new_relation.") to author ".$author." - Contact: ".$contact_record["id"]." - User: ".$importer["uid"], LOGGER_DEBUG); - $ret = self::send_share($u[0], $contact_record); + $ret = self::sendShare($u[0], $contact_record); // Send the profile data, maybe it weren't transmitted before - self::send_profile($importer["uid"], array($contact_record)); + self::sendProfile($importer["uid"], array($contact_record)); } } @@ -2542,7 +2545,7 @@ class Diaspora * * @return array The fetched item */ - private static function original_item($guid, $orig_author, $author) + private static function originalItem($guid, $orig_author, $author) { // Do we already have this item? $r = q( @@ -2558,12 +2561,12 @@ class Diaspora // Maybe it is already a reshared item? // Then refetch the content, if it is a reshare from a reshare. // If it is a reshared post from another network then reformat to avoid display problems with two share elements - if (self::is_reshare($r[0]["body"], true)) { + if (self::isReshare($r[0]["body"], true)) { $r = array(); - } elseif (self::is_reshare($r[0]["body"], false) || strstr($r[0]["body"], "[share")) { + } elseif (self::isReshare($r[0]["body"], false) || strstr($r[0]["body"], "[share")) { $r[0]["body"] = diaspora2bb(bb2diaspora($r[0]["body"])); - $r[0]["body"] = self::replace_people_guid($r[0]["body"], $r[0]["author-link"]); + $r[0]["body"] = self::replacePeopleGuid($r[0]["body"], $r[0]["author-link"]); // Add OEmbed and other information to the body $r[0]["body"] = add_page_info_to_body($r[0]["body"], false, true); @@ -2577,12 +2580,12 @@ class Diaspora if (!DBM::is_result($r)) { $server = "https://".substr($orig_author, strpos($orig_author, "@") + 1); logger("1st try: reshared message ".$guid." will be fetched via SSL from the server ".$server); - $item_id = self::store_by_guid($guid, $server); + $item_id = self::storeByGuid($guid, $server); if (!$item_id) { $server = "http://".substr($orig_author, strpos($orig_author, "@") + 1); logger("2nd try: reshared message ".$guid." will be fetched without SLL from the server ".$server); - $item_id = self::store_by_guid($guid, $server); + $item_id = self::storeByGuid($guid, $server); } if ($item_id) { @@ -2595,9 +2598,9 @@ class Diaspora if (DBM::is_result($r)) { // If it is a reshared post from another network then reformat to avoid display problems with two share elements - if (self::is_reshare($r[0]["body"], false)) { + if (self::isReshare($r[0]["body"], false)) { $r[0]["body"] = diaspora2bb(bb2diaspora($r[0]["body"])); - $r[0]["body"] = self::replace_people_guid($r[0]["body"], $r[0]["author-link"]); + $r[0]["body"] = self::replacePeopleGuid($r[0]["body"], $r[0]["author-link"]); } return $r[0]; @@ -2616,7 +2619,7 @@ class Diaspora * * @return int the message id */ - private static function receive_reshare($importer, $data, $xml) + private static function receiveReshare($importer, $data, $xml) { $author = notags(unxmlify($data->author)); $guid = notags(unxmlify($data->guid)); @@ -2626,17 +2629,17 @@ class Diaspora /// @todo handle unprocessed property "provider_display_name" $public = notags(unxmlify($data->public)); - $contact = self::allowed_contact_by_handle($importer, $author, false); + $contact = self::allowedContactByHandle($importer, $author, false); if (!$contact) { return false; } - $message_id = self::message_exists($importer["uid"], $guid); + $message_id = self::messageExists($importer["uid"], $guid); if ($message_id) { return true; } - $original_item = self::original_item($root_guid, $root_author, $author); + $original_item = self::originalItem($root_guid, $root_author, $author); if (!$original_item) { return false; } @@ -2658,7 +2661,7 @@ class Diaspora $datarray["owner-avatar"] = $datarray["author-avatar"]; $datarray["guid"] = $guid; - $datarray["uri"] = $datarray["parent-uri"] = self::get_uri_from_guid($author, $guid); + $datarray["uri"] = $datarray["parent-uri"] = self::getUriFromGuid($author, $guid); $datarray["verb"] = ACTIVITY_POST; $datarray["gravity"] = GRAVITY_PARENT; @@ -2685,7 +2688,7 @@ class Diaspora $datarray["object-type"] = $original_item["object-type"]; - self::fetch_guid($datarray); + self::fetchGuid($datarray); $message_id = item_store($datarray); if ($message_id) { @@ -2705,13 +2708,13 @@ class Diaspora * * @return bool success */ - private static function item_retraction($importer, $contact, $data) + private static function itemRetraction($importer, $contact, $data) { $author = notags(unxmlify($data->author)); $target_guid = notags(unxmlify($data->target_guid)); $target_type = notags(unxmlify($data->target_type)); - $person = self::person_by_handle($author); + $person = self::personByHandle($author); if (!is_array($person)) { logger("unable to find author detail for ".$author); return false; @@ -2785,11 +2788,11 @@ class Diaspora * * @return bool Success */ - private static function receive_retraction($importer, $sender, $data) + private static function receiveRetraction($importer, $sender, $data) { $target_type = notags(unxmlify($data->target_type)); - $contact = self::contact_by_handle($importer["uid"], $sender); + $contact = self::contactByHandle($importer["uid"], $sender); if (!$contact && (in_array($target_type, array("Contact", "Person")))) { logger("cannot find contact for sender: ".$sender." and user ".$importer["uid"]); return false; @@ -2803,7 +2806,7 @@ class Diaspora case "Post": case "Reshare": case "StatusMessage": - return self::item_retraction($importer, $contact, $data); + return self::itemRetraction($importer, $contact, $data); case "Contact": case "Person": @@ -2828,7 +2831,7 @@ class Diaspora * * @return int The message id of the newly created item */ - private static function receive_status_message($importer, $data, $xml) + private static function receiveStatusMessage($importer, $data, $xml) { $author = notags(unxmlify($data->author)); $guid = notags(unxmlify($data->guid)); @@ -2837,12 +2840,12 @@ class Diaspora $text = unxmlify($data->text); $provider_display_name = notags(unxmlify($data->provider_display_name)); - $contact = self::allowed_contact_by_handle($importer, $author, false); + $contact = self::allowedContactByHandle($importer, $author, false); if (!$contact) { return false; } - $message_id = self::message_exists($importer["uid"], $guid); + $message_id = self::messageExists($importer["uid"], $guid); if ($message_id) { return true; } @@ -2870,7 +2873,7 @@ class Diaspora $datarray["object-type"] = ACTIVITY_OBJ_NOTE; // Add OEmbed and other information to the body - if (!self::is_redmatrix($contact["url"])) { + if (!self::isRedmatrix($contact["url"])) { $body = add_page_info_to_body($body, false, true); } } @@ -2897,7 +2900,7 @@ class Diaspora $datarray["owner-avatar"] = $datarray["author-avatar"]; $datarray["guid"] = $guid; - $datarray["uri"] = $datarray["parent-uri"] = self::get_uri_from_guid($author, $guid); + $datarray["uri"] = $datarray["parent-uri"] = self::getUriFromGuid($author, $guid); $datarray["verb"] = ACTIVITY_POST; $datarray["gravity"] = GRAVITY_PARENT; @@ -2905,7 +2908,7 @@ class Diaspora $datarray["protocol"] = PROTOCOL_DIASPORA; $datarray["source"] = $xml; - $datarray["body"] = self::replace_people_guid($body, $contact["url"]); + $datarray["body"] = self::replacePeopleGuid($body, $contact["url"]); if ($provider_display_name != "") { $datarray["app"] = $provider_display_name; @@ -2923,7 +2926,7 @@ class Diaspora $datarray["coord"] = $address["lat"]." ".$address["lng"]; } - self::fetch_guid($datarray); + self::fetchGuid($datarray); $message_id = item_store($datarray); if ($message_id) { @@ -2945,7 +2948,7 @@ class Diaspora * * @return string the handle in the format user@domain.tld */ - private static function my_handle($contact) + private static function myHandle($contact) { if ($contact["addr"] != "") { return $contact["addr"]; @@ -2974,7 +2977,7 @@ class Diaspora * * @return string The encrypted data */ - public static function encode_private_data($msg, $user, $contact, $prvkey, $pubkey) + public static function encodePrivateData($msg, $user, $contact, $prvkey, $pubkey) { logger("Message: ".$msg, LOGGER_DATA); @@ -2989,7 +2992,7 @@ class Diaspora $iv = openssl_random_pseudo_bytes(16); $b_iv = base64_encode($iv); - $ciphertext = self::aes_encrypt($aes_key, $iv, $msg); + $ciphertext = self::aesEncrypt($aes_key, $iv, $msg); $json = json_encode(array("iv" => $b_iv, "key" => $b_aes_key)); @@ -3012,12 +3015,12 @@ class Diaspora * * @return string The envelope */ - public static function build_magic_envelope($msg, $user) + public static function buildMagicEnvelope($msg, $user) { $b64url_data = base64url_encode($msg); $data = str_replace(array("\n", "\r", " ", "\t"), array("", "", "", ""), $b64url_data); - $key_id = base64url_encode(self::my_handle($user)); + $key_id = base64url_encode(self::myHandle($user)); $type = "application/xml"; $encoding = "base64url"; $alg = "RSA-SHA256"; @@ -3055,14 +3058,14 @@ class Diaspora * * @return string The message that will be transmitted to other servers */ - private static function build_message($msg, $user, $contact, $prvkey, $pubkey, $public = false) + private static function buildMessage($msg, $user, $contact, $prvkey, $pubkey, $public = false) { // The message is put into an envelope with the sender's signature - $envelope = self::build_magic_envelope($msg, $user); + $envelope = self::buildMagicEnvelope($msg, $user); // Private messages are put into a second envelope, encrypted with the receivers public key if (!$public) { - $envelope = self::encode_private_data($envelope, $user, $contact, $prvkey, $pubkey); + $envelope = self::encodePrivateData($envelope, $user, $contact, $prvkey, $pubkey); } return $envelope; @@ -3169,7 +3172,7 @@ class Diaspora * * @return string The post XML */ - public static function build_post_xml($type, $message) + public static function buildPostXml($type, $message) { $data = array($type => $message); @@ -3189,9 +3192,9 @@ class Diaspora * * @return int Result of the transmission */ - private static function build_and_transmit($owner, $contact, $type, $message, $public_batch = false, $guid = "", $spool = false) + private static function buildAndTransmit($owner, $contact, $type, $message, $public_batch = false, $guid = "", $spool = false) { - $msg = self::build_post_xml($type, $message); + $msg = self::buildPostXml($type, $message); logger('message: '.$msg, LOGGER_DATA); logger('send guid '.$guid, LOGGER_DEBUG); @@ -3201,7 +3204,7 @@ class Diaspora $owner['uprvkey'] = $owner['prvkey']; } - $envelope = self::build_message($msg, $owner, $contact, $owner['uprvkey'], $contact['pubkey'], $public_batch); + $envelope = self::buildMessage($msg, $owner, $contact, $owner['uprvkey'], $contact['pubkey'], $public_batch); if ($spool) { add_to_queue($contact['id'], NETWORK_DIASPORA, $envelope, $public_batch); @@ -3238,7 +3241,7 @@ class Diaspora logger("Send account migration ".print_r($message, true), LOGGER_DEBUG); - return self::build_and_transmit($owner, $contact, "account_migration", $message); + return self::buildAndTransmit($owner, $contact, "account_migration", $message); } /** @@ -3249,13 +3252,13 @@ class Diaspora * * @return int The result of the transmission */ - public static function send_share($owner, $contact) + public static function sendShare($owner, $contact) { /** * @todo support the different possible combinations of "following" and "sharing" * Currently, Diaspora only interprets the "sharing" field * - * Before switching this code productive, we have to check all "send_share" calls if "rel" is set correctly + * Before switching this code productive, we have to check all "sendShare" calls if "rel" is set correctly */ /* @@ -3272,14 +3275,14 @@ class Diaspora } */ - $message = array("author" => self::my_handle($owner), + $message = array("author" => self::myHandle($owner), "recipient" => $contact["addr"], "following" => "true", "sharing" => "true"); logger("Send share ".print_r($message, true), LOGGER_DEBUG); - return self::build_and_transmit($owner, $contact, "contact", $message); + return self::buildAndTransmit($owner, $contact, "contact", $message); } /** @@ -3292,14 +3295,14 @@ class Diaspora */ public static function sendUnshare($owner, $contact) { - $message = array("author" => self::my_handle($owner), + $message = array("author" => self::myHandle($owner), "recipient" => $contact["addr"], "following" => "false", "sharing" => "false"); logger("Send unshare ".print_r($message, true), LOGGER_DEBUG); - return self::build_and_transmit($owner, $contact, "contact", $message); + return self::buildAndTransmit($owner, $contact, "contact", $message); } /** @@ -3310,7 +3313,7 @@ class Diaspora * * @return array|bool Reshare details or "false" if no reshare */ - public static function is_reshare($body, $complete = true) + public static function isReshare($body, $complete = true) { $body = trim($body); @@ -3356,7 +3359,7 @@ class Diaspora ); if ($r) { $ret= array(); - $ret["root_handle"] = self::handle_from_contact($r[0]["contact-id"]); + $ret["root_handle"] = self::handleFromContact($r[0]["contact-id"]); $ret["root_guid"] = $guid; return($ret); } @@ -3406,7 +3409,7 @@ class Diaspora * * @return array with event data */ - private static function build_event($event_id) + private static function buildEvent($event_id) { $r = q("SELECT `guid`, `uid`, `start`, `finish`, `nofinish`, `summary`, `desc`, `location`, `adjust` FROM `event` WHERE `id` = %d", intval($event_id)); if (!DBM::is_result($r)) { @@ -3431,7 +3434,7 @@ class Diaspora $owner = $r[0]; - $eventdata['author'] = self::my_handle($owner); + $eventdata['author'] = self::myHandle($owner); if ($event['guid']) { $eventdata['guid'] = $event['guid']; @@ -3483,23 +3486,23 @@ class Diaspora * 'type' -> Message type ("status_message" or "reshare") * 'message' -> Array of XML elements of the status */ - public static function build_status($item, $owner) + public static function buildStatus($item, $owner) { - $cachekey = "diaspora:build_status:".$item['guid']; + $cachekey = "diaspora:buildStatus:".$item['guid']; $result = Cache::get($cachekey); if (!is_null($result)) { return $result; } - $myaddr = self::my_handle($owner); + $myaddr = self::myHandle($owner); $public = (($item["private"]) ? "false" : "true"); $created = datetime_convert("UTC", "UTC", $item["created"], 'Y-m-d\TH:i:s\Z'); // Detect a share element and do a reshare - if (!$item['private'] && ($ret = self::is_reshare($item["body"]))) { + if (!$item['private'] && ($ret = self::isReshare($item["body"]))) { $message = array("author" => $myaddr, "guid" => $item["guid"], "created_at" => $created, @@ -3556,7 +3559,7 @@ class Diaspora } if ($item['event-id'] > 0) { - $event = self::build_event($item['event-id']); + $event = self::buildEvent($item['event-id']); if (count($event)) { $message['event'] = $event; @@ -3585,11 +3588,11 @@ class Diaspora * * @return int The result of the transmission */ - public static function send_status($item, $owner, $contact, $public_batch = false) + public static function sendStatus($item, $owner, $contact, $public_batch = false) { - $status = self::build_status($item, $owner); + $status = self::buildStatus($item, $owner); - return self::build_and_transmit($owner, $contact, $status["type"], $status["message"], $public_batch, $item["guid"]); + return self::buildAndTransmit($owner, $contact, $status["type"], $status["message"], $public_batch, $item["guid"]); } /** @@ -3600,7 +3603,7 @@ class Diaspora * * @return array The data for a "like" */ - private static function construct_like($item, $owner) + private static function constructLike($item, $owner) { $p = q( "SELECT `guid`, `uri`, `parent-uri` FROM `item` WHERE `uri` = '%s' LIMIT 1", @@ -3619,7 +3622,7 @@ class Diaspora $positive = "false"; } - return(array("author" => self::my_handle($owner), + return(array("author" => self::myHandle($owner), "guid" => $item["guid"], "parent_guid" => $parent["guid"], "parent_type" => $target_type, @@ -3635,8 +3638,8 @@ class Diaspora * * @return array The data for an "EventParticipation" */ - private static function construct_attend($item, $owner) { - + private static function constructAttend($item, $owner) + { $p = q( "SELECT `guid`, `uri`, `parent-uri` FROM `item` WHERE `uri` = '%s' LIMIT 1", dbesc($item["thr-parent"]) @@ -3662,7 +3665,7 @@ class Diaspora return false; } - return(array("author" => self::my_handle($owner), + return(array("author" => self::myHandle($owner), "guid" => $item["guid"], "parent_guid" => $parent["guid"], "status" => $attend_answer, @@ -3677,9 +3680,9 @@ class Diaspora * * @return array The data for a comment */ - private static function construct_comment($item, $owner) + private static function constructComment($item, $owner) { - $cachekey = "diaspora:construct_comment:".$item['guid']; + $cachekey = "diaspora:constructComment:".$item['guid']; $result = Cache::get($cachekey); if (!is_null($result)) { @@ -3701,7 +3704,7 @@ class Diaspora $text = html_entity_decode(bb2diaspora($item["body"])); $created = datetime_convert("UTC", "UTC", $item["created"], 'Y-m-d\TH:i:s\Z'); - $comment = array("author" => self::my_handle($owner), + $comment = array("author" => self::myHandle($owner), "guid" => $item["guid"], "created_at" => $created, "parent_guid" => $parent["guid"], @@ -3710,7 +3713,7 @@ class Diaspora // Send the thread parent guid only if it is a threaded comment if ($item['thr-parent'] != $item['parent-uri']) { - $comment['thread_parent_guid'] = self::get_guid_from_uri($item['thr-parent'], $item['uid']); + $comment['thread_parent_guid'] = self::getGuidFromUri($item['thr-parent'], $item['uid']); } Cache::set($cachekey, $comment, CACHE_QUARTER_HOUR); @@ -3728,16 +3731,16 @@ class Diaspora * * @return int The result of the transmission */ - public static function send_followup($item, $owner, $contact, $public_batch = false) + public static function sendFollowup($item, $owner, $contact, $public_batch = false) { if (in_array($item['verb'], array(ACTIVITY_ATTEND, ACTIVITY_ATTENDNO, ACTIVITY_ATTENDMAYBE))) { - $message = self::construct_attend($item, $owner); + $message = self::constructAttend($item, $owner); $type = "event_participation"; } elseif (in_array($item["verb"], array(ACTIVITY_LIKE, ACTIVITY_DISLIKE))) { - $message = self::construct_like($item, $owner); + $message = self::constructLike($item, $owner); $type = "like"; } else { - $message = self::construct_comment($item, $owner); + $message = self::constructComment($item, $owner); $type = "comment"; } @@ -3747,7 +3750,7 @@ class Diaspora $message["author_signature"] = self::signature($owner, $message); - return self::build_and_transmit($owner, $contact, $type, $message, $public_batch, $item["guid"]); + return self::buildAndTransmit($owner, $contact, $type, $message, $public_batch, $item["guid"]); } /** @@ -3758,7 +3761,7 @@ class Diaspora * * @return string The message */ - private static function message_from_signature($item, $signature) + private static function messageFromSignature($item, $signature) { // Split the signed text $signed_parts = explode(";", $signature['signed_text']); @@ -3808,10 +3811,10 @@ class Diaspora * * @return int The result of the transmission */ - public static function send_relay($item, $owner, $contact, $public_batch = false) + public static function sendRelay($item, $owner, $contact, $public_batch = false) { if ($item["deleted"]) { - return self::send_retraction($item, $owner, $contact, $public_batch, true); + return self::sendRetraction($item, $owner, $contact, $public_batch, true); } elseif (in_array($item["verb"], array(ACTIVITY_LIKE, ACTIVITY_DISLIKE))) { $type = "like"; } else { @@ -3837,13 +3840,13 @@ class Diaspora // Old way - is used by the internal Friendica functions /// @todo Change all signatur storing functions to the new format if ($signature['signed_text'] && $signature['signature'] && $signature['signer']) { - $message = self::message_from_signature($item, $signature); + $message = self::messageFromSignature($item, $signature); } else {// New way $msg = json_decode($signature['signed_text'], true); $message = array(); if (is_array($msg)) { - foreach ($msg AS $field => $data) { + foreach ($msg as $field => $data) { if (!$item["deleted"]) { if ($field == "diaspora_handle") { $field = "author"; @@ -3864,7 +3867,7 @@ class Diaspora logger("Relayed data ".print_r($message, true), LOGGER_DEBUG); - return self::build_and_transmit($owner, $contact, $type, $message, $public_batch, $item["guid"]); + return self::buildAndTransmit($owner, $contact, $type, $message, $public_batch, $item["guid"]); } /** @@ -3878,9 +3881,9 @@ class Diaspora * * @return int The result of the transmission */ - public static function send_retraction($item, $owner, $contact, $public_batch = false, $relay = false) + public static function sendRetraction($item, $owner, $contact, $public_batch = false, $relay = false) { - $itemaddr = self::handle_from_contact($item["contact-id"], $item["gcontact-id"]); + $itemaddr = self::handleFromContact($item["contact-id"], $item["gcontact-id"]); $msg_type = "retraction"; @@ -3898,7 +3901,7 @@ class Diaspora logger("Got message ".print_r($message, true), LOGGER_DEBUG); - return self::build_and_transmit($owner, $contact, $msg_type, $message, $public_batch, $item["guid"]); + return self::buildAndTransmit($owner, $contact, $msg_type, $message, $public_batch, $item["guid"]); } /** @@ -3910,9 +3913,9 @@ class Diaspora * * @return int The result of the transmission */ - public static function send_mail($item, $owner, $contact) + public static function sendMail($item, $owner, $contact) { - $myaddr = self::my_handle($owner); + $myaddr = self::myHandle($owner); $r = q( "SELECT * FROM `conv` WHERE `id` = %d AND `uid` = %d LIMIT 1", @@ -3960,7 +3963,7 @@ class Diaspora $type = "conversation"; } - return self::build_and_transmit($owner, $contact, $type, $message, false, $item["guid"]); + return self::buildAndTransmit($owner, $contact, $type, $message, false, $item["guid"]); } /** @@ -4041,9 +4044,11 @@ class Diaspora /** * @brief Sends profile data * - * @param int $uid The user id + * @param int $uid The user id + * @param bool $recips optional, default false + * @return void */ - public static function send_profile($uid, $recips = false) + public static function sendProfile($uid, $recips = false) { if (!$uid) { return; @@ -4067,7 +4072,7 @@ class Diaspora foreach ($recips as $recip) { logger("Send updated profile data for user ".$uid." to contact ".$recip["id"], LOGGER_DEBUG); - self::build_and_transmit($profile, $recip, "profile", $message, false, "", true); + self::buildAndTransmit($profile, $recip, "profile", $message, false, "", true); } } @@ -4079,7 +4084,7 @@ class Diaspora * * @return bool Success */ - public static function store_like_signature($contact, $post_id) + public static function storeLikeSignature($contact, $post_id) { // Is the contact the owner? Then fetch the private key if (!$contact['self'] || ($contact['uid'] == 0)) { @@ -4103,7 +4108,7 @@ class Diaspora return false; } - $message = self::construct_like($r[0], $contact); + $message = self::constructLike($r[0], $contact); $message["author_signature"] = self::signature($contact, $message); /* @@ -4126,7 +4131,7 @@ class Diaspora * * @return bool Success */ - public static function store_comment_signature($item, $contact, $uprvkey, $message_id) + public static function storeCommentSignature($item, $contact, $uprvkey, $message_id) { if ($uprvkey == "") { logger('No private key, so not storing comment signature', LOGGER_DEBUG); @@ -4135,7 +4140,7 @@ class Diaspora $contact["uprvkey"] = $uprvkey; - $message = self::construct_comment($item, $contact); + $message = self::constructComment($item, $contact); $message["author_signature"] = self::signature($contact, $message); /* diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index 7ff8f8f60c..ed762084c2 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -298,6 +298,7 @@ class OStatus * @param array $importer user record of the importing user * @param array $contact contact * @param string $hub Called by reference, returns the fetched hub data + * @return void */ public static function import($xml, $importer, &$contact, &$hub) { @@ -309,7 +310,7 @@ class OStatus * * @param string $xml The XML * @param array $importer user record of the importing user - * @param array $contact + * @param array $contact contact * @param string $hub Called by reference, returns the fetched hub data * @param boolean $stored Is the post fresh imported or from the database? * @param boolean $initialize Is it the leading post so that data has to be initialized? @@ -537,6 +538,10 @@ class OStatus return true; } + /** + * @param object $item item + * @return void + */ private static function deleteNotice($item) { $condition = array('uid' => $item['uid'], 'author-link' => $item['author-link'], 'uri' => $item['uri']); @@ -567,6 +572,7 @@ class OStatus * @param object $entry The xml entry that is processed * @param array $item The item array * @param array $importer user record of the importing user + * @return void */ private static function processPost($xpath, $entry, &$item, $importer) { @@ -708,6 +714,7 @@ class OStatus * * @param string $conversation The link to the conversation * @param string $conversation_uri The conversation in "uri" format + * @return void */ private static function fetchConversation($conversation, $conversation_uri) { @@ -768,6 +775,7 @@ class OStatus * @param string $xml The feed * @param string $conversation conversation * @param string $conversation_uri conversation uri + * @return void */ private static function storeConversation($xml, $conversation = '', $conversation_uri = '') { @@ -844,13 +852,14 @@ class OStatus /** * @brief Fetch the own post so that it can be stored later - * @param array $item The item array * * We want to store the original data for later processing. * This function is meant for cases where we process a feed with multiple entries. * In that case we need to fetch the single posts here. * * @param string $self The link to the self item + * @param array $item The item array + * @return void */ private static function fetchSelf($self, &$item) { @@ -885,6 +894,7 @@ class OStatus * @param string $related The link to the related item * @param string $related_uri The related item in "uri" format * @param array $importer user record of the importing user + * @return void */ private static function fetchRelated($related, $related_uri, $importer) { @@ -1293,6 +1303,7 @@ class OStatus * @param object $doc XML document * @param object $root XML root element where the hub links are added * @param object $nick nick + * @return void */ public static function hublinks($doc, $root, $nick) { @@ -1306,6 +1317,7 @@ class OStatus * @param object $doc XML document * @param object $root XML root element where the hub links are added * @param array $item Data of the item that is to be posted + * @return void */ private static function getAttachment($doc, $root, $item) { @@ -1582,7 +1594,7 @@ class OStatus * @param object $doc XML document * @param array $item Data of the item that is to be posted * @param array $owner Contact data of the poster - * @param $repeated_guid + * @param string $repeated_guid guid * @param bool $toplevel Is it for en entry element (false) or a feed entry (true)? * * @return object Entry element @@ -1872,6 +1884,7 @@ class OStatus * @param string $title Title for the post * @param string $verb The activity verb * @param bool $complete Add the "status_net" element? + * @return void */ private static function entryContent($doc, $entry, $item, $owner, $title, $verb = "", $complete = true) { @@ -1914,6 +1927,7 @@ class OStatus * @param array $item Data of the item that is to be posted * @param array $owner Contact data of the poster * @param bool $complete default true + * @return void */ private static function entryFooter($doc, $entry, $item, $owner, $complete = true) { diff --git a/src/Worker/Delivery.php b/src/Worker/Delivery.php index 14fe3027fc..216d2520d9 100644 --- a/src/Worker/Delivery.php +++ b/src/Worker/Delivery.php @@ -485,7 +485,7 @@ class Delivery { break; if ($mail) { - Diaspora::send_mail($item,$owner,$contact); + Diaspora::sendMail($item,$owner,$contact); break; } @@ -498,7 +498,7 @@ class Delivery { if (($target_item['deleted']) && (($target_item['uri'] === $target_item['parent-uri']) || $followup)) { // top-level retraction logger('diaspora retract: '.$loc); - Diaspora::send_retraction($target_item,$owner,$contact,$public_message); + Diaspora::sendRetraction($target_item,$owner,$contact,$public_message); break; } elseif ($relocate) { Diaspora::sendAccountMigration($owner, $contact, $uid); @@ -506,17 +506,17 @@ class Delivery { } elseif ($followup) { // send comments and likes to owner to relay logger('diaspora followup: '.$loc); - Diaspora::send_followup($target_item,$owner,$contact,$public_message); + Diaspora::sendFollowup($target_item,$owner,$contact,$public_message); break; } elseif ($target_item['uri'] !== $target_item['parent-uri']) { // we are the relay - send comments, likes and relayable_retractions to our conversants logger('diaspora relay: '.$loc); - Diaspora::send_relay($target_item,$owner,$contact,$public_message); + Diaspora::sendRelay($target_item,$owner,$contact,$public_message); break; } elseif ($top_level && !$walltowall) { // currently no workable solution for sending walltowall logger('diaspora status: '.$loc); - Diaspora::send_status($target_item,$owner,$contact,$public_message); + Diaspora::sendStatus($target_item,$owner,$contact,$public_message); break; } diff --git a/src/Worker/Notifier.php b/src/Worker/Notifier.php index f3096e41a1..ac8cf123c5 100644 --- a/src/Worker/Notifier.php +++ b/src/Worker/Notifier.php @@ -525,7 +525,7 @@ class Notifier { if ($diaspora_delivery) { if (!$followup) { - $r0 = Diaspora::relay_list(); + $r0 = Diaspora::relayList(); } $r1 = q("SELECT `batch`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`name`) AS `name`, ANY_VALUE(`network`) AS `network` diff --git a/src/Worker/ProfileUpdate.php b/src/Worker/ProfileUpdate.php index 43c76965d6..e33aa5d9a8 100644 --- a/src/Worker/ProfileUpdate.php +++ b/src/Worker/ProfileUpdate.php @@ -14,6 +14,6 @@ class ProfileUpdate { return; } - Diaspora::send_profile($uid); + Diaspora::sendProfile($uid); } } From da5857529fbefdb75e167b61ce44bc990c0d33e8 Mon Sep 17 00:00:00 2001 From: Michael Date: Thu, 23 Nov 2017 20:41:35 +0000 Subject: [PATCH 13/38] Additional features still had got problems --- include/features.php | 58 ++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/include/features.php b/include/features.php index 9895fd6f77..ade93a18e3 100644 --- a/include/features.php +++ b/include/features.php @@ -14,13 +14,13 @@ use Friendica\Core\PConfig; * @return boolean */ function feature_enabled($uid, $feature) { - $x = Config::get('feature_lock', $feature); + $x = Config::get('feature_lock', $feature, false); - if (is_null($x)) { - $x = PConfig::get($uid, 'feature', $feature); - if (is_null($x)) { - $x = Config::get('feature', $feature); - if (is_null($x)) { + if (!$x) { + $x = PConfig::get($uid, 'feature', $feature, false); + if (!$x) { + $x = Config::get('feature', $feature, false); + if (!$x) { $x = get_feature_default($feature); } } @@ -67,53 +67,53 @@ function get_features($filtered = true) { 'general' => array( t('General Features'), //array('expire', t('Content Expiration'), t('Remove old posts/comments after a period of time')), - array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles'), false, Config::get('feature_lock','multi_profiles')), - array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'), false, Config::get('feature_lock','photo_location')), - array('export_calendar', t('Export Public Calendar'), t('Ability for visitors to download the public calendar'), false, Config::get('feature_lock','export_calendar')), + array('multi_profiles', t('Multiple Profiles'), t('Ability to create multiple profiles'), false, Config::get('feature_lock','multi_profiles', false)), + array('photo_location', t('Photo Location'), t('Photo metadata is normally stripped. This extracts the location (if present) prior to stripping metadata and links it to a map.'), false, Config::get('feature_lock','photo_location', false)), + array('export_calendar', t('Export Public Calendar'), t('Ability for visitors to download the public calendar'), false, Config::get('feature_lock','export_calendar', false)), ), // Post composition 'composition' => array( t('Post Composition Features'), - array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them'), false, Config::get('feature_lock','preview')), - array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, Config::get('feature_lock','aclautomention')), + array('preview', t('Post Preview'), t('Allow previewing posts and comments before publishing them'), false, Config::get('feature_lock','preview', false)), + array('aclautomention', t('Auto-mention Forums'), t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, Config::get('feature_lock','aclautomention', false)), ), // Network sidebar widgets 'widgets' => array( t('Network Sidebar Widgets'), - array('archives', t('Search by Date'), t('Ability to select posts by date ranges'), false, Config::get('feature_lock','archives')), - array('forumlist_widget', t('List Forums'), t('Enable widget to display the forums your are connected with'), true, Config::get('feature_lock','forumlist_widget')), - array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group'), false, Config::get('feature_lock','groups')), - array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network'), false, Config::get('feature_lock','networks')), - array('savedsearch', t('Saved Searches'), t('Save search terms for re-use'), false, Config::get('feature_lock','savedsearch')), + array('archives', t('Search by Date'), t('Ability to select posts by date ranges'), false, Config::get('feature_lock','archives', false)), + array('forumlist_widget', t('List Forums'), t('Enable widget to display the forums your are connected with'), true, Config::get('feature_lock','forumlist_widget', false)), + array('groups', t('Group Filter'), t('Enable widget to display Network posts only from selected group'), false, Config::get('feature_lock','groups', false)), + array('networks', t('Network Filter'), t('Enable widget to display Network posts only from selected network'), false, Config::get('feature_lock','networks', false)), + array('savedsearch', t('Saved Searches'), t('Save search terms for re-use'), false, Config::get('feature_lock','savedsearch', false)), ), // Network tabs 'net_tabs' => array( t('Network Tabs'), - array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on'), false, Config::get('feature_lock','personal_tab')), - array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)'), false, Config::get('feature_lock','new_tab')), - array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them'), false, Config::get('feature_lock','link_tab')), + array('personal_tab', t('Network Personal Tab'), t('Enable tab to display only Network posts that you\'ve interacted on'), false, Config::get('feature_lock','personal_tab', false)), + array('new_tab', t('Network New Tab'), t('Enable tab to display only new Network posts (from the last 12 hours)'), false, Config::get('feature_lock','new_tab', false)), + array('link_tab', t('Network Shared Links Tab'), t('Enable tab to display only Network posts with links in them'), false, Config::get('feature_lock','link_tab', false)), ), // Item tools 'tools' => array( t('Post/Comment Tools'), - array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once'), false, Config::get('feature_lock','multi_delete')), - array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending'), false, Config::get('feature_lock','edit_posts')), - array('commtag', t('Tagging'), t('Ability to tag existing posts'), false, Config::get('feature_lock','commtag')), - array('categories', t('Post Categories'), t('Add categories to your posts'), false, Config::get('feature_lock','categories')), - array('filing', t('Saved Folders'), t('Ability to file posts under folders'), false, Config::get('feature_lock','filing')), - array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments'), false, Config::get('feature_lock','dislike')), - array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator'), false, Config::get('feature_lock','star_posts')), - array('ignore_posts', t('Mute Post Notifications'), t('Ability to mute notifications for a thread'), false, Config::get('feature_lock','ignore_posts')), + array('multi_delete', t('Multiple Deletion'), t('Select and delete multiple posts/comments at once'), false, Config::get('feature_lock','multi_delete', false)), + array('edit_posts', t('Edit Sent Posts'), t('Edit and correct posts and comments after sending'), false, Config::get('feature_lock','edit_posts', false)), + array('commtag', t('Tagging'), t('Ability to tag existing posts'), false, Config::get('feature_lock','commtag', false)), + array('categories', t('Post Categories'), t('Add categories to your posts'), false, Config::get('feature_lock','categories', false)), + array('filing', t('Saved Folders'), t('Ability to file posts under folders'), false, Config::get('feature_lock','filing', false)), + array('dislike', t('Dislike Posts'), t('Ability to dislike posts/comments'), false, Config::get('feature_lock','dislike', false)), + array('star_posts', t('Star Posts'), t('Ability to mark special posts with a star indicator'), false, Config::get('feature_lock','star_posts', false)), + array('ignore_posts', t('Mute Post Notifications'), t('Ability to mute notifications for a thread'), false, Config::get('feature_lock','ignore_posts', false)), ), // Advanced Profile Settings 'advanced_profile' => array( t('Advanced Profile Settings'), - array('forumlist_profile', t('List Forums'), t('Show visitors public community forums at the Advanced Profile Page'), false, Config::get('feature_lock','forumlist_profile')), + array('forumlist_profile', t('List Forums'), t('Show visitors public community forums at the Advanced Profile Page'), false, Config::get('feature_lock','forumlist_profile', false)), ), ); @@ -125,7 +125,7 @@ function get_features($filtered = true) { $kquantity = count($arr[$k]); for ($y = 0; $y < $kquantity; $y ++) { if (is_array($arr[$k][$y])) { - if (is_null($arr[$k][$y][4])) { + if (!$arr[$k][$y][4]) { $has_items = true; } else { From 130e02ddef74ef10ff3a0864a40bf0485ba0daf5 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Thu, 23 Nov 2017 19:22:30 -0500 Subject: [PATCH 14/38] Review null_date and spaces at end of line --- src/Object/Contact.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Object/Contact.php b/src/Object/Contact.php index 50981659b2..d799a7d892 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -103,7 +103,7 @@ class Contact extends BaseObject dba::update('contact', array('term-date' => datetime_convert()), array('id' => $contact['id'])); if ($contact['url'] != '') { - dba::update('contact', array('term-date' => datetime_convert()), array('`nurl` = ? AND `term-date` <= 1000-00-00', normalise_link($contact['url']))); + dba::update('contact', array('term-date' => datetime_convert()), array('`nurl` = ? AND `term-date` <= ?', normalise_link($contact['url']), NULL_DATE)); } } else { /* @todo @@ -484,7 +484,7 @@ class Contact extends BaseObject WHERE `uid` = %d ) ", intval($uid), intval($uid) ); - + return $r; } @@ -501,7 +501,7 @@ class Contact extends BaseObject AND `pending` = 0 LIMIT %d, %d", intval($uid), intval($uid), intval($start), intval($count) ); - + return $r; } From 40c37d76fe054df12242c27271f71c220b7d2dc5 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 23 Nov 2017 20:34:35 -0500 Subject: [PATCH 15/38] Don't cache the xmpp/password PConfig value --- src/Util/ExAuth.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Util/ExAuth.php b/src/Util/ExAuth.php index 0769be2e66..aa3300c4e9 100644 --- a/src/Util/ExAuth.php +++ b/src/Util/ExAuth.php @@ -226,7 +226,7 @@ class ExAuth } if ($Error) { $this->writeLog(LOG_INFO, 'check against alternate password for ' . $sUser . '@' . $aCommand[2]); - $sPassword = PConfig::get($uid, 'xmpp', 'password'); + $sPassword = PConfig::get($uid, 'xmpp', 'password', null, true); $Error = ($aCommand[3] != $sPassword); } } else { From 9df0457340b6497ccc2ccce0f99f18bb9274f9e0 Mon Sep 17 00:00:00 2001 From: Adam Magness Date: Thu, 23 Nov 2017 20:59:00 -0500 Subject: [PATCH 16/38] whitespace remove whitespace --- src/Object/Contact.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Object/Contact.php b/src/Object/Contact.php index d799a7d892..fff82e600d 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -501,7 +501,6 @@ class Contact extends BaseObject AND `pending` = 0 LIMIT %d, %d", intval($uid), intval($uid), intval($start), intval($count) ); - return $r; } From b41bf77ec8187b6c7bdc5229510032662901e416 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 23 Nov 2017 23:40:54 -0500 Subject: [PATCH 17/38] Add HTTPException class files --- src/Network/HTTPException.php | 23 +++++++++++++++++++ .../HTTPException/BadGatewayException.php | 10 ++++++++ .../HTTPException/BadRequestException.php | 10 ++++++++ .../HTTPException/ConflictException.php | 10 ++++++++ .../ExpectationFailedException.php | 10 ++++++++ .../HTTPException/ForbiddenException.php | 10 ++++++++ .../HTTPException/GatewayTimeoutException.php | 10 ++++++++ src/Network/HTTPException/GoneException.php | 10 ++++++++ .../HTTPException/ImATeapotException.php | 11 +++++++++ .../InternalServerErrorException.php | 10 ++++++++ .../HTTPException/LenghtRequiredException.php | 10 ++++++++ .../MethodNotAllowedException.php | 10 ++++++++ .../HTTPException/NonAcceptableException.php | 10 ++++++++ .../HTTPException/NotFoundException.php | 9 ++++++++ .../HTTPException/NotImplementedException.php | 10 ++++++++ .../PreconditionFailedException.php | 10 ++++++++ .../ServiceUnavaiableException.php | 10 ++++++++ .../TooManyRequestsException.php | 10 ++++++++ .../HTTPException/UnauthorizedException.php | 10 ++++++++ .../UnprocessableEntityException.php | 10 ++++++++ .../UnsupportedMediaTypeException.php | 10 ++++++++ 21 files changed, 223 insertions(+) create mode 100644 src/Network/HTTPException.php create mode 100644 src/Network/HTTPException/BadGatewayException.php create mode 100644 src/Network/HTTPException/BadRequestException.php create mode 100644 src/Network/HTTPException/ConflictException.php create mode 100644 src/Network/HTTPException/ExpectationFailedException.php create mode 100644 src/Network/HTTPException/ForbiddenException.php create mode 100644 src/Network/HTTPException/GatewayTimeoutException.php create mode 100644 src/Network/HTTPException/GoneException.php create mode 100644 src/Network/HTTPException/ImATeapotException.php create mode 100644 src/Network/HTTPException/InternalServerErrorException.php create mode 100644 src/Network/HTTPException/LenghtRequiredException.php create mode 100644 src/Network/HTTPException/MethodNotAllowedException.php create mode 100644 src/Network/HTTPException/NonAcceptableException.php create mode 100644 src/Network/HTTPException/NotFoundException.php create mode 100644 src/Network/HTTPException/NotImplementedException.php create mode 100644 src/Network/HTTPException/PreconditionFailedException.php create mode 100644 src/Network/HTTPException/ServiceUnavaiableException.php create mode 100644 src/Network/HTTPException/TooManyRequestsException.php create mode 100644 src/Network/HTTPException/UnauthorizedException.php create mode 100644 src/Network/HTTPException/UnprocessableEntityException.php create mode 100644 src/Network/HTTPException/UnsupportedMediaTypeException.php diff --git a/src/Network/HTTPException.php b/src/Network/HTTPException.php new file mode 100644 index 0000000000..eec4a9ced2 --- /dev/null +++ b/src/Network/HTTPException.php @@ -0,0 +1,23 @@ +httpdesc == "") { + $this->httpdesc = preg_replace("|([a-z])([A-Z])|",'$1 $2', str_replace("Exception","",get_class($this))); + } + parent::__construct($message, $code, $previous); + } +} diff --git a/src/Network/HTTPException/BadGatewayException.php b/src/Network/HTTPException/BadGatewayException.php new file mode 100644 index 0000000000..1bb8b29e98 --- /dev/null +++ b/src/Network/HTTPException/BadGatewayException.php @@ -0,0 +1,10 @@ + Date: Thu, 23 Nov 2017 23:47:52 -0500 Subject: [PATCH 18/38] Fix httpdesc to work with new namespace --- src/Network/HTTPException.php | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/Network/HTTPException.php b/src/Network/HTTPException.php index eec4a9ced2..7602290c2b 100644 --- a/src/Network/HTTPException.php +++ b/src/Network/HTTPException.php @@ -11,12 +11,16 @@ namespace Friendica\Network; use Exception; -class HTTPException extends Exception { +class HTTPException extends Exception +{ var $httpcode = 200; var $httpdesc = ""; - public function __construct($message = "", $code = 0, Exception $previous = null) { - if ($this->httpdesc == "") { - $this->httpdesc = preg_replace("|([a-z])([A-Z])|",'$1 $2', str_replace("Exception","",get_class($this))); + + public function __construct($message = '', $code = 0, Exception $previous = null) + { + if ($this->httpdesc == '') { + $classname = str_replace('Exception', '', str_replace('Friendica\Network\HTTPException\\', '', get_class($this))); + $this->httpdesc = preg_replace("|([a-z])([A-Z])|",'$1 $2', $classname); } parent::__construct($message, $code, $previous); } From 1f4fc87fd995fd048fd8ea28d42709a7b0d2c4cb Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 23 Nov 2017 23:48:15 -0500 Subject: [PATCH 19/38] Use new HTTPExceptions in API --- include/api.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/include/api.php b/include/api.php index 50aa18c7e0..a5e8063848 100644 --- a/include/api.php +++ b/include/api.php @@ -12,11 +12,19 @@ use Friendica\Core\Config; use Friendica\Core\NotificationsManager; use Friendica\Core\Worker; use Friendica\Database\DBM; +use Friendica\Network\HTTPException; +use Friendica\Network\HTTPException\BadRequestException; +use Friendica\Network\HTTPException\ForbiddenException; +use Friendica\Network\HTTPException\InternalServerErrorException; +use Friendica\Network\HTTPException\MethodNotAllowedException; +use Friendica\Network\HTTPException\NotFoundException; +use Friendica\Network\HTTPException\NotImplementedException; +use Friendica\Network\HTTPException\UnauthorizedException; +use Friendica\Network\HTTPException\TooManyRequestsException; use Friendica\Object\Contact; use Friendica\Protocol\Diaspora; use Friendica\Util\XML; -require_once 'include/HTTPExceptions.php'; require_once 'include/bbcode.php'; require_once 'include/datetime.php'; require_once 'include/conversation.php'; From 9943393b71d844141fa39f739fa93042cf0b114e Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Thu, 23 Nov 2017 23:52:23 -0500 Subject: [PATCH 20/38] Remove include/HTTPExceptions.php --- include/HTTPExceptions.php | 105 ------------------------------------- 1 file changed, 105 deletions(-) delete mode 100644 include/HTTPExceptions.php diff --git a/include/HTTPExceptions.php b/include/HTTPExceptions.php deleted file mode 100644 index 8571c99de5..0000000000 --- a/include/HTTPExceptions.php +++ /dev/null @@ -1,105 +0,0 @@ -httpdesc=="") { - $this->httpdesc = preg_replace("|([a-z])([A-Z])|",'$1 $2', str_replace("Exception","",get_class($this))); - } - parent::__construct($message, $code, $previous); - } -} - -// 4xx -class TooManyRequestsException extends HTTPException { - var $httpcode = 429; -} - -class UnauthorizedException extends HTTPException { - var $httpcode = 401; -} - -class ForbiddenException extends HTTPException { - var $httpcode = 403; -} - -class NotFoundException extends HTTPException { - var $httpcode = 404; -} - -class GoneException extends HTTPException { - var $httpcode = 410; -} - -class MethodNotAllowedException extends HTTPException { - var $httpcode = 405; -} - -class NonAcceptableException extends HTTPException { - var $httpcode = 406; -} - -class LenghtRequiredException extends HTTPException { - var $httpcode = 411; -} - -class PreconditionFailedException extends HTTPException { - var $httpcode = 412; -} - -class UnsupportedMediaTypeException extends HTTPException { - var $httpcode = 415; -} - -class ExpetationFailesException extends HTTPException { - var $httpcode = 417; -} - -class ConflictException extends HTTPException { - var $httpcode = 409; -} - -class UnprocessableEntityException extends HTTPException { - var $httpcode = 422; -} - -class ImATeapotException extends HTTPException { - var $httpcode = 418; - var $httpdesc = "I'm A Teapot"; -} - -class BadRequestException extends HTTPException { - var $httpcode = 400; -} - -// 5xx - -class ServiceUnavaiableException extends HTTPException { - var $httpcode = 503; -} - -class BadGatewayException extends HTTPException { - var $httpcode = 502; -} - -class GatewayTimeoutException extends HTTPException { - var $httpcode = 504; -} - -class NotImplementedException extends HTTPException { - var $httpcode = 501; -} - -class InternalServerErrorException extends HTTPException { - var $httpcode = 500; -} - - - From 4a4be4d6649764ed0317cee59bd632c33ef01f0e Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 24 Nov 2017 07:44:02 +0000 Subject: [PATCH 21/38] Fix some SQL problems --- include/items.php | 2 +- src/Object/Contact.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/items.php b/include/items.php index b251915347..c2247277f1 100644 --- a/include/items.php +++ b/include/items.php @@ -426,7 +426,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))) { + if (in_array($arr['network'], 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'])) { diff --git a/src/Object/Contact.php b/src/Object/Contact.php index fff82e600d..4f0b237dec 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -138,7 +138,7 @@ class Contact extends BaseObject */ public static function unmarkForArchival(array $contact) { - $condition = array('`id` => ? AND (`term-date` > ? OR `archive`)', $contact[`id`], NULL_DATE); + $condition = array('`id` = ? AND (`term-date` > ? OR `archive`)', $contact[`id`], NULL_DATE); $exists = dba::exists('contact', $condition); // We don't need to update, we never marked this contact for archival @@ -613,7 +613,7 @@ class Contact extends BaseObject 'readonly' => 0, 'pending' => 0) ); - $s = dba::select('contact', array('id'), array('nurl' => normalise_link($data["url"]), 'uid' => $uid), array('order' => 'id', 'limit' => 2)); + $s = dba::select('contact', array('id'), array('nurl' => normalise_link($data["url"]), 'uid' => $uid), array('order' => array('id'), 'limit' => 2)); $contacts = dba::inArray($s); if (!DBM::is_result($contacts)) { return 0; From d672f39930cea45e87222dce5e860bddfb8d92c5 Mon Sep 17 00:00:00 2001 From: hoergen Date: Fri, 24 Nov 2017 22:11:57 +0100 Subject: [PATCH 22/38] Bookmarklet for sharing links to friendica --- util/bookmarklet-share2friendica/README.md | 46 +++++++++++++++++++ .../bookmarklet-share2friendica.js | 1 + 2 files changed, 47 insertions(+) create mode 100644 util/bookmarklet-share2friendica/README.md create mode 100644 util/bookmarklet-share2friendica/bookmarklet-share2friendica.js diff --git a/util/bookmarklet-share2friendica/README.md b/util/bookmarklet-share2friendica/README.md new file mode 100644 index 0000000000..0133630722 --- /dev/null +++ b/util/bookmarklet-share2friendica/README.md @@ -0,0 +1,46 @@ +# Bookmarklet-share2friendica + +Javascript bookmarklet to share websites with your friendica account + +## Getting Started + +### Installing + +Open the file bookmarklet-share2friendica.js and change 'YourFriendicaDoomain.tld" with your friendica domain + +If you friendica is at https://myfriend.myfami.ly/ , the original ... +```javascript +javascript:(function(){f='https://YourFriendicaDomain.tld/bookmarklet/?url='+encodeURIC.... +``` +... has to be changed to ... + +```javascript +javascript:(function(){f='https://myfriend.myfami.ly/bookmarklet/?url='+encodeURIC.... +``` + +*Please copy the whole script, not only the part mentioned here!* + + +## Additional notes if it doesn't work + +* Make sure the site you want to share is allowed to run javascript. (enable it in your script blocker) +* Check the apostrophes that are used. Sometimes it is changed by the copy and paste process depending on the editor you are using, or if you copy it from a website. Correct it and it will work again. + + + +## Authors + +* **diaspora** - *Initial work* - [Share all teh internetz!](https://share.diasporafoundation.org/about.html) +* **hoergen** - *Adaptation to Friendica (2017)* - [hoergen.org](https://hoergen.org) + +## License + +This project is licensed under the same license like friendica + +## Acknowledgments + +* Hat tip to anyone who's code was used +* Hat tip to everyone who does everyday a little something ot make this world better +* Had tip but spent it + + diff --git a/util/bookmarklet-share2friendica/bookmarklet-share2friendica.js b/util/bookmarklet-share2friendica/bookmarklet-share2friendica.js new file mode 100644 index 0000000000..584dee2403 --- /dev/null +++ b/util/bookmarklet-share2friendica/bookmarklet-share2friendica.js @@ -0,0 +1 @@ +javascript:(function(){f='https://YourFriendicaDomain.tld/bookmarklet/?url='+encodeURIComponent(window.location.href)+'&title='+encodeURIComponent(document.title);a=function(){if(!window.open(f+'&jump=doclose','friendica','location=yes,links=no,scrollbars=no,toolbar=no,width=620,height=250'))location.href=f+'jump=yes'};if(/Firefox/.test(navigator.userAgent)){setTimeout(a,0)}else{a()}})() From 3046455b1cf1feefbaf5db332c042cdc4a45ee3a Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 24 Nov 2017 21:39:12 +0000 Subject: [PATCH 23/38] Some posts weren't shown --- include/conversation.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/conversation.php b/include/conversation.php index 5e764e6706..c957107220 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -1536,8 +1536,8 @@ function conv_sort(array $item_list, $order) */ foreach ($parents as $i => $parent) { $parents[$i]['children'] = - get_item_children($item_array, $parent, $thread_allowed) - + get_item_children($item_array, $parent, false); + array_merge(get_item_children($item_array, $parent, $thread_allowed), + get_item_children($item_array, $parent, false)); } foreach ($parents as $i => $parent) { From abc0b90fa9199b570c68a470eea44acf62655e2d Mon Sep 17 00:00:00 2001 From: Michael Date: Fri, 24 Nov 2017 22:15:35 +0000 Subject: [PATCH 24/38] getpostsbyurl hadn't worked --- src/Object/Contact.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Object/Contact.php b/src/Object/Contact.php index 4f0b237dec..d7e7853621 100644 --- a/src/Object/Contact.php +++ b/src/Object/Contact.php @@ -734,6 +734,8 @@ class Contact extends BaseObject */ public static function getPostsFromUrl($contact_url) { + $a = self::getApp(); + require_once 'include/conversation.php'; // There are no posts with "uid = 0" with connector networks @@ -759,7 +761,6 @@ class Contact extends BaseObject " ORDER BY `item`.`created` DESC LIMIT %d, %d", intval($author_id), intval(local_user()), intval($a->pager['start']), intval($a->pager['itemspage']) ); - $a = self::getApp(); $o = conversation($a, $r, 'community', false); From d7f0c08bce12d09bbf4c4ade2fe9768ae554fd80 Mon Sep 17 00:00:00 2001 From: hoergen Date: Sat, 25 Nov 2017 01:49:18 +0100 Subject: [PATCH 25/38] Added Description for creating a bookmark --- util/bookmarklet-share2friendica/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/util/bookmarklet-share2friendica/README.md b/util/bookmarklet-share2friendica/README.md index 0133630722..ad30baa9dd 100644 --- a/util/bookmarklet-share2friendica/README.md +++ b/util/bookmarklet-share2friendica/README.md @@ -20,6 +20,7 @@ javascript:(function(){f='https://myfriend.myfami.ly/bookmarklet/?url='+encodeUR *Please copy the whole script, not only the part mentioned here!* +Then create a new bookmark, give it a name like "share2Friendica" and paste the script in the address field. Save it. Now you can click on that bookmarklet every time you want to share a website, you are currently reading. A new small window will open where title is prefilled and the website you want to share is put as attachement in the body of the new post. ## Additional notes if it doesn't work From 4ddcc77c775e42aab3bb0df3fa2942c6da345db9 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 Nov 2017 10:07:49 +0000 Subject: [PATCH 26/38] Always show small preview pictures, not the big ones --- doc/htconfig.md | 1 + include/items.php | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/htconfig.md b/doc/htconfig.md index 9e0a2184df..3f5b28b917 100644 --- a/doc/htconfig.md +++ b/doc/htconfig.md @@ -23,6 +23,7 @@ Example: To set the directory value please add this line to your .htconfig.php: ## system ## * **allowed_link_protocols** (Array) - Allowed protocols in links URLs, add at your own risk. http is always allowed. +* **always_show_preview** (Boolean) - Only show small preview picures. Default value is false. * **birthday_input_format** - Default value is "ymd". * **block_local_dir** (Boolean) - Blocks the access to the directory of the local users. * **auth_cookie_lifetime** (Integer) - Number of days that should pass without any activity before a user who chose "Remember me" when logging in is considered logged out. Defaults to 7. diff --git a/include/items.php b/include/items.php index c2247277f1..cffa127288 100644 --- a/include/items.php +++ b/include/items.php @@ -207,7 +207,8 @@ function add_page_info_data($data) { $preview = str_replace(array("[", "]"), array("[", "]"), htmlentities($data["images"][0]["src"], ENT_QUOTES, 'UTF-8', false)); // if the preview picture is larger than 500 pixels then show it in a larger mode // But only, if the picture isn't higher than large (To prevent huge posts) - if (($data["images"][0]["width"] >= 500) && ($data["images"][0]["width"] >= $data["images"][0]["height"])) { + if (!Config::get('system', 'always_show_preview') && ($data["images"][0]["width"] >= 500) + && ($data["images"][0]["width"] >= $data["images"][0]["height"])) { $text .= " image='".$preview."'"; } else { $text .= " preview='".$preview."'"; From 3cb906c420579617e742f6bd1d22cda748893443 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 Nov 2017 11:59:20 +0000 Subject: [PATCH 27/38] Issue 3911: Fetch keywords for feeds --- include/feed.php | 5 ++++- mod/contacts.php | 2 +- view/templates/contact_edit.tpl | 3 +-- view/theme/frio/templates/contact_edit.tpl | 2 +- view/theme/vier/templates/contact_edit.tpl | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/include/feed.php b/include/feed.php index 22deff535a..0be6a5781c 100644 --- a/include/feed.php +++ b/include/feed.php @@ -344,7 +344,7 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) { $item["title"] = ''; } - if ($contact["fetch_further_information"]) { + if (!empty($contact["fetch_further_information"]) && ($contact["fetch_further_information"] < 3)) { $preview = ""; // Handle enclosures and treat them as preview picture @@ -384,6 +384,9 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) { if (!strstr($item["body"], '[url') && ($item['plink'] != '')) { $item["body"] .= "[hr][url]".$item['plink']."[/url]"; } + if ($contact["fetch_further_information"] == 3) { + $item["tag"] = add_page_keywords($item["plink"], false, $preview, true, $contact["ffi_keyword_blacklist"]); + } } if (!$simulate) { diff --git a/mod/contacts.php b/mod/contacts.php index 1859c2aa60..d294f6518d 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -577,7 +577,7 @@ function contacts_content(App $a) { if ($contact['network'] == NETWORK_FEED) { $fetch_further_information = array('fetch_further_information', t('Fetch further information for feeds'), $contact['fetch_further_information'], t('Fetch further information for feeds'), - array('0'=>t('Disabled'), '1'=>t('Fetch information'), '2'=>t('Fetch information and keywords'))); + array('0' => t('Disabled'), '1' => t('Fetch information'), '3' => t('Fetch keywords'), '2' => t('Fetch information and keywords'))); } if (in_array($contact['network'], array(NETWORK_FEED, NETWORK_MAIL, NETWORK_MAIL2))) $poll_interval = contact_poll_interval($contact['priority'],(! $poll_enabled)); diff --git a/view/templates/contact_edit.tpl b/view/templates/contact_edit.tpl index bad1b63c35..4493161899 100644 --- a/view/templates/contact_edit.tpl +++ b/view/templates/contact_edit.tpl @@ -1,4 +1,3 @@ -
{{* Insert Tab-Nav *}} @@ -71,7 +70,7 @@ {{include file="field_checkbox.tpl" field=$notify}} {{if $fetch_further_information}} {{include file="field_select.tpl" field=$fetch_further_information}} - {{if $fetch_further_information.2 == 2 }} {{include file="field_textarea.tpl" field=$ffi_keyword_blacklist}} {{/if}} + {{if $fetch_further_information.2 == 2 || $fetch_further_information.2 == 3}} {{include file="field_textarea.tpl" field=$ffi_keyword_blacklist}} {{/if}} {{/if}} {{include file="field_checkbox.tpl" field=$hidden}} diff --git a/view/theme/frio/templates/contact_edit.tpl b/view/theme/frio/templates/contact_edit.tpl index 540aebef54..52f3fc545e 100644 --- a/view/theme/frio/templates/contact_edit.tpl +++ b/view/theme/frio/templates/contact_edit.tpl @@ -134,7 +134,7 @@ {{include file="field_checkbox.tpl" field=$notify}} {{if $fetch_further_information}} {{include file="field_select.tpl" field=$fetch_further_information}} - {{if $fetch_further_information.2 == 2 }} {{include file="field_textarea.tpl" field=$ffi_keyword_blacklist}} {{/if}} + {{if $fetch_further_information.2 == 2 || $fetch_further_information.2 == 3}} {{include file="field_textarea.tpl" field=$ffi_keyword_blacklist}} {{/if}} {{/if}} {{include file="field_checkbox.tpl" field=$hidden}} diff --git a/view/theme/vier/templates/contact_edit.tpl b/view/theme/vier/templates/contact_edit.tpl index f4f85d611b..9dc11a31c2 100644 --- a/view/theme/vier/templates/contact_edit.tpl +++ b/view/theme/vier/templates/contact_edit.tpl @@ -71,7 +71,7 @@ {{include file="field_checkbox.tpl" field=$notify}} {{if $fetch_further_information}} {{include file="field_select.tpl" field=$fetch_further_information}} - {{if $fetch_further_information.2 == 2 }} {{include file="field_textarea.tpl" field=$ffi_keyword_blacklist}} {{/if}} + {{if $fetch_further_information.2 == 2 || $fetch_further_information.2 == 3}} {{include file="field_textarea.tpl" field=$ffi_keyword_blacklist}} {{/if}} {{/if}} {{include file="field_checkbox.tpl" field=$hidden}} From 8c2b678aaa3811af6b9ab086e5066a4dda6ff984 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 25 Nov 2017 15:16:55 +0100 Subject: [PATCH 28/38] silence accounts from global community page --- util/global_community_silence.php | 61 +++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 util/global_community_silence.php diff --git a/util/global_community_silence.php b/util/global_community_silence.php new file mode 100755 index 0000000000..b25c2af223 --- /dev/null +++ b/util/global_community_silence.php @@ -0,0 +1,61 @@ +#!/usr/bin/env php + util/global_community_silence.php http://example.com/profile/bob + * + * will silence bob@example.com so that his postings wont appear at + * the global community page. + * + * Author: Tobias Diekershoff + * + * License: AGPLv3 or later, same as Friendica + **/ + +if ($argc!=2 || $argv[1]=="-h" || $argv[1]=="--help" || $argv[1]=="-?") { + echo "Usage: ".$argv[0]." [-h|profile_url]\r\n"; + echo " -h, -?, --help ... show this help\r\n"; + echo " profile_url ...... The URL of the profile you want to silence\r\n"; + echo "\r\n"; + echo "Example: Silence bob@example.com\r\n"; + echo "$> ".$argv[0]." https://exaple.com/profiles/bob\r\n"; + echo "\r\n"; + exit(0); +} + +use Friendica\Database\DBM; +require_once("boot.php"); +require_once('include/dba.php'); +require_once("include/text.php"); +$a = get_app(); +require_once ".htconfig.php"; + +dba::connect($db_host, $db_user, $db_pass, $db_data); +unset($db_host, $db_user, $db_pass, $db_data); + +/** + * 1. make nurl from last parameter + * 2. check DB (contact) if there is a contact with uid=0 and that nurl, get the ID + * 3. set the flag hidden=1 for the contact entry with the found ID + **/ + +$nurl = normalise_link($argv[1]); +$r = dba::select("contact", array("id"), array("nurl" => $nurl, "uid" => 0), array("limit"=> 1)); +if (DBM::is_result($r)) { + dba::update("contact", array("hidden"=>1), array("id"=>$r["id"])); + echo "NOTICE: The account should be silenced from the global community page\r\n"; +} else { + echo "NOTICE: Could not find any entry for this URL (".$nurl.")\r\n"; +} + +?> From 1adff81a251141df401108bc2f86654dfa5d33c8 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 Nov 2017 14:43:28 +0000 Subject: [PATCH 29/38] Documentation for "fetch further information" --- mod/contacts.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mod/contacts.php b/mod/contacts.php index d294f6518d..8889e65131 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -576,8 +576,14 @@ 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!') : ''); if ($contact['network'] == NETWORK_FEED) { - $fetch_further_information = array('fetch_further_information', t('Fetch further information for feeds'), $contact['fetch_further_information'], t('Fetch further information for feeds'), - array('0' => t('Disabled'), '1' => t('Fetch information'), '3' => t('Fetch keywords'), '2' => t('Fetch information and keywords'))); + $fetch_further_information = array('fetch_further_information', + t('Fetch further information for feeds'), + $contact['fetch_further_information'], + t("Fetch information like preview pictures, title and teaser from the feed item. You can activate this if the feed doesn't contain much text. Keywords are taken from the meta header in the feed item and are posted as hash tags."), + array('0' => t('Disabled'), + '1' => t('Fetch information'), + '3' => t('Fetch keywords'), + '2' => t('Fetch information and keywords'))); } if (in_array($contact['network'], array(NETWORK_FEED, NETWORK_MAIL, NETWORK_MAIL2))) $poll_interval = contact_poll_interval($contact['priority'],(! $poll_enabled)); From 9f0e8cffbabee81adc9ab345068c4507e3ddd700 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 25 Nov 2017 16:25:53 +0100 Subject: [PATCH 30/38] use all profile formats, typos --- util/global_community_silence.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/util/global_community_silence.php b/util/global_community_silence.php index b25c2af223..d18efd345e 100755 --- a/util/global_community_silence.php +++ b/util/global_community_silence.php @@ -28,12 +28,14 @@ if ($argc!=2 || $argv[1]=="-h" || $argv[1]=="--help" || $argv[1]=="-?") { echo " profile_url ...... The URL of the profile you want to silence\r\n"; echo "\r\n"; echo "Example: Silence bob@example.com\r\n"; - echo "$> ".$argv[0]." https://exaple.com/profiles/bob\r\n"; + echo "$> ".$argv[0]." https://example.com/profiles/bob\r\n"; echo "\r\n"; exit(0); } use Friendica\Database\DBM; +use Friendica\Network\Probe; + require_once("boot.php"); require_once('include/dba.php'); require_once("include/text.php"); @@ -48,11 +50,16 @@ unset($db_host, $db_user, $db_pass, $db_data); * 2. check DB (contact) if there is a contact with uid=0 and that nurl, get the ID * 3. set the flag hidden=1 for the contact entry with the found ID **/ - -$nurl = normalise_link($argv[1]); -$r = dba::select("contact", array("id"), array("nurl" => $nurl, "uid" => 0), array("limit"=> 1)); +$net = Probe::uri($argv[1]); +if (in_array($net['network'], array(NETWORK_PHANTOM, NETWORK_MAIL))) { + echo "This account seems not to exist."; + echo "\r\n"; + exit(1); +} +$nurl = normalise_link($net['url']); +$r = dba::select("contact", array("id"), array("nurl" => $nurl, "uid" => 0), array("limit" => 1)); if (DBM::is_result($r)) { - dba::update("contact", array("hidden"=>1), array("id"=>$r["id"])); + dba::update("contact", array("hidden" => true), array("id" => $r["id"])); echo "NOTICE: The account should be silenced from the global community page\r\n"; } else { echo "NOTICE: Could not find any entry for this URL (".$nurl.")\r\n"; From 2d65eae2f5354912f4e6ff92c739ae96f7fbdc1a Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 25 Nov 2017 16:40:03 +0100 Subject: [PATCH 31/38] Script to block an account from the node --- util/global_community_block.php | 65 +++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100755 util/global_community_block.php diff --git a/util/global_community_block.php b/util/global_community_block.php new file mode 100755 index 0000000000..705054bb79 --- /dev/null +++ b/util/global_community_block.php @@ -0,0 +1,65 @@ +#!/usr/bin/env php + util/global_community_block.php http://example.com/profile/bob + * + * will block bob@example.com. + * + * Author: Tobias Diekershoff + * + * License: AGPLv3 or later, same as Friendica + **/ + +if ($argc!=2 || $argv[1]=="-h" || $argv[1]=="--help" || $argv[1]=="-?") { + echo "Usage: ".$argv[0]." [-h|profile_url]\r\n"; + echo " -h, -?, --help ... show this help\r\n"; + echo " profile_url ...... The URL of the profile you want to silence\r\n"; + echo "\r\n"; + echo "Example: block bob@example.com\r\n"; + echo "$> ".$argv[0]." https://example.com/profiles/bob\r\n"; + echo "\r\n"; + exit(0); +} + +use Friendica\Database\DBM; +use Friendica\Network\Probe; + +require_once("boot.php"); +require_once('include/dba.php'); +require_once("include/text.php"); +$a = get_app(); +require_once ".htconfig.php"; + +dba::connect($db_host, $db_user, $db_pass, $db_data); +unset($db_host, $db_user, $db_pass, $db_data); + +/** + * 1. make nurl from last parameter + * 2. check DB (contact) if there is a contact with uid=0 and that nurl, get the ID + * 3. set the flag hidden=1 for the contact entry with the found ID + **/ +$net = Probe::uri($argv[1]); +if (in_array($net['network'], array(NETWORK_PHANTOM, NETWORK_MAIL))) { + echo "This account seems not to exist."; + echo "\r\n"; + exit(1); +} +$nurl = normalise_link($net['url']); +$r = dba::select("contact", array("id"), array("nurl" => $nurl, "uid" => 0), array("limit" => 1)); +if (DBM::is_result($r)) { + dba::update("contact", array("blocked" => true), array("id" => $r["id"])); + echo "NOTICE: The account should be blocked from the node now\r\n"; +} else { + echo "NOTICE: Could not find any entry for this URL (".$nurl.")\r\n"; +} + +?> From d9185540a5462207d0256a4c879e3a98809dda23 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 25 Nov 2017 16:45:20 +0100 Subject: [PATCH 32/38] some minor stuff --- util/global_community_block.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/util/global_community_block.php b/util/global_community_block.php index 705054bb79..a0f8ec223b 100755 --- a/util/global_community_block.php +++ b/util/global_community_block.php @@ -19,7 +19,7 @@ * License: AGPLv3 or later, same as Friendica **/ -if ($argc!=2 || $argv[1]=="-h" || $argv[1]=="--help" || $argv[1]=="-?") { +if ($argc != 2 || $argv[1] == "-h" || $argv[1] == "--help" || $argv[1] == "-?") { echo "Usage: ".$argv[0]." [-h|profile_url]\r\n"; echo " -h, -?, --help ... show this help\r\n"; echo " profile_url ...... The URL of the profile you want to silence\r\n"; @@ -33,11 +33,11 @@ if ($argc!=2 || $argv[1]=="-h" || $argv[1]=="--help" || $argv[1]=="-?") { use Friendica\Database\DBM; use Friendica\Network\Probe; -require_once("boot.php"); +require_once('boot.php'); require_once('include/dba.php'); -require_once("include/text.php"); +require_once('include/text.php'); $a = get_app(); -require_once ".htconfig.php"; +require_once('.htconfig.php'); dba::connect($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data); From 32d71dbfccd90ad37cd49162acf26703402ab440 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 25 Nov 2017 16:55:58 +0100 Subject: [PATCH 33/38] update to the silence script --- util/global_community_silence.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/util/global_community_silence.php b/util/global_community_silence.php index d18efd345e..221a3f355b 100755 --- a/util/global_community_silence.php +++ b/util/global_community_silence.php @@ -5,16 +5,16 @@ * @brief tool to silence accounts on the global community page * * With this tool, you can silence an account on the global community page. - * Postings from silenced accounts will not be displayes on the community + * Postings from silenced accounts will not be displayed on the community * page. This silencing does only affect the display on the community page, * accounts following the silenced accounts will still get their postings. * - * Usage: pass the URL of the to be silenced account as only parameter + * Usage: pass the URL of the profile to be silenced account as only parameter * at the command line when running this tool. E.g. * * $> util/global_community_silence.php http://example.com/profile/bob * - * will silence bob@example.com so that his postings wont appear at + * will silence bob@example.com so that his postings won't appear at * the global community page. * * Author: Tobias Diekershoff @@ -22,7 +22,7 @@ * License: AGPLv3 or later, same as Friendica **/ -if ($argc!=2 || $argv[1]=="-h" || $argv[1]=="--help" || $argv[1]=="-?") { +if ($argc != 2 || $argv[1] == "-h" || $argv[1] == "--help" || $argv[1] == "-?") { echo "Usage: ".$argv[0]." [-h|profile_url]\r\n"; echo " -h, -?, --help ... show this help\r\n"; echo " profile_url ...... The URL of the profile you want to silence\r\n"; @@ -36,11 +36,11 @@ if ($argc!=2 || $argv[1]=="-h" || $argv[1]=="--help" || $argv[1]=="-?") { use Friendica\Database\DBM; use Friendica\Network\Probe; -require_once("boot.php"); +require_once'"boot.php'); require_once('include/dba.php'); -require_once("include/text.php"); +require_once('include/text.php'); $a = get_app(); -require_once ".htconfig.php"; +require_once('.htconfig.php'); dba::connect($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data); From ba184f903888c362e99ddfb2defdcb4490a1f8a6 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 25 Nov 2017 16:00:51 +0000 Subject: [PATCH 34/38] Show the preview picture even if the posting contains the huge image --- include/bbcode.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/include/bbcode.php b/include/bbcode.php index 83ea3fcfa6..196c3ca3c1 100644 --- a/include/bbcode.php +++ b/include/bbcode.php @@ -52,7 +52,10 @@ function bb_attachment($Text, $simplehtml = false, $tryoembed = true) { $data["title"] = str_replace(array("http://", "https://"), "", $data["title"]); } - if (((strpos($data["text"], "[img=") !== false) || (strpos($data["text"], "[img]") !== false)) && ($data["image"] != "")) { + if (((strpos($data["text"], "[img=") !== false) + || (strpos($data["text"], "[img]") !== false) + || Config::get('system', 'always_show_preview')) + && ($data["image"] != "")) { $data["preview"] = $data["image"]; $data["image"] = ""; } From 8a91e631cf6aa0663b789e81e6c4c077e011419b Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 25 Nov 2017 17:02:42 +0100 Subject: [PATCH 35/38] some more minor stuff --- util/global_community_block.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/util/global_community_block.php b/util/global_community_block.php index a0f8ec223b..cb6789e45c 100755 --- a/util/global_community_block.php +++ b/util/global_community_block.php @@ -33,11 +33,11 @@ if ($argc != 2 || $argv[1] == "-h" || $argv[1] == "--help" || $argv[1] == "-?") use Friendica\Database\DBM; use Friendica\Network\Probe; -require_once('boot.php'); -require_once('include/dba.php'); -require_once('include/text.php'); +require_once 'boot.php'; +require_once 'include/dba.php'; +require_once 'include/text.php'; $a = get_app(); -require_once('.htconfig.php'); +require_once '.htconfig.php'; dba::connect($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data); @@ -49,14 +49,14 @@ unset($db_host, $db_user, $db_pass, $db_data); **/ $net = Probe::uri($argv[1]); if (in_array($net['network'], array(NETWORK_PHANTOM, NETWORK_MAIL))) { - echo "This account seems not to exist."; + echo 'This account seems not to exist.'; echo "\r\n"; exit(1); } $nurl = normalise_link($net['url']); -$r = dba::select("contact", array("id"), array("nurl" => $nurl, "uid" => 0), array("limit" => 1)); +$r = dba::select('contact', array('id'), array('nurl' => $nurl, 'uid' => 0), array('limit' => 1)); if (DBM::is_result($r)) { - dba::update("contact", array("blocked" => true), array("id" => $r["id"])); + dba::update('contact', array('blocked' => true), array('id' => $r['id'])); echo "NOTICE: The account should be blocked from the node now\r\n"; } else { echo "NOTICE: Could not find any entry for this URL (".$nurl.")\r\n"; From 2d61aaf118efcaae102d201ccfd4062490b0a49b Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 25 Nov 2017 17:05:27 +0100 Subject: [PATCH 36/38] some minor stuff --- util/global_community_silence.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/util/global_community_silence.php b/util/global_community_silence.php index 221a3f355b..b90ea10eac 100755 --- a/util/global_community_silence.php +++ b/util/global_community_silence.php @@ -36,11 +36,11 @@ if ($argc != 2 || $argv[1] == "-h" || $argv[1] == "--help" || $argv[1] == "-?") use Friendica\Database\DBM; use Friendica\Network\Probe; -require_once'"boot.php'); -require_once('include/dba.php'); -require_once('include/text.php'); +require_once 'boot.php'; +require_once 'include/dba.php'; +require_once 'include/text.php'; $a = get_app(); -require_once('.htconfig.php'); +require_once'.htconfig.php'; dba::connect($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data); From 2ac797be8e0ba3f1daf19415b73d64e35a37c608 Mon Sep 17 00:00:00 2001 From: Tobias Diekershoff Date: Sat, 25 Nov 2017 17:10:29 +0100 Subject: [PATCH 37/38] let there be SPACE --- util/global_community_silence.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util/global_community_silence.php b/util/global_community_silence.php index b90ea10eac..e6c936f0dd 100755 --- a/util/global_community_silence.php +++ b/util/global_community_silence.php @@ -40,7 +40,7 @@ require_once 'boot.php'; require_once 'include/dba.php'; require_once 'include/text.php'; $a = get_app(); -require_once'.htconfig.php'; +require_once '.htconfig.php'; dba::connect($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data); From 21a3a6f45b2cb7573e0f2013d179bddd254a526d Mon Sep 17 00:00:00 2001 From: Silke Meyer Date: Sat, 25 Nov 2017 17:26:36 +0100 Subject: [PATCH 38/38] Markdown formatting and minor changes --- doc/SSL.md | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/doc/SSL.md b/doc/SSL.md index 95de83305f..9d2bee7756 100644 --- a/doc/SSL.md +++ b/doc/SSL.md @@ -69,30 +69,28 @@ If you can successfully access your Friendica instance through https, there are This is the simplest way to enforce site-wide secure access. Every time a user tries to access any Friendica page by any mean (manual address bar entry or link), the web server issues a Permanent Redirect response with the secure protocol prepended to the requested URL. -With Apache, simply add the following lines to the [code].htaccess[/code] file in the root folder of your Friendica instance (thanks to [url=https://github.com/AlfredSK]AlfredSK[/url]): +With Apache, enable the modules rewrite and ssl (with a shared hosting provider, this should be enabled already): -[code] -#Force SSL connections + sudo a2enmod rewrite ssl -RewriteEngine On -RewriteCond %{SERVER_PORT} 80 -RewriteRule ^(.*)$ https://your.friendica.domain/$1 [R=301,L] -[/code] +Add the following lines to the .htaccess file in the root folder of your Friendica instance (thanks to [url=https://github.com/AlfredSK]AlfredSK[/url]): -With nginx, configure your [code]server[/code] directive this way (thanks to [url=https://bjornjohansen.no/redirect-to-https-with-nginx/]Bjørn Johansen[/url]): + RewriteEngine On + RewriteCond %{SERVER_PORT} 80 + RewriteRule ^(.*)$ https://your.friendica.domain/$1 [R=301,L] -[code] -server { - listen 80; - listen [::]:80; - server_name your.friendica.domain; - return 301 https://$server_name$request_uri; -} -[/code] +With nginx, configure your server directive this way ([documentation](https://www.nginx.com/blog/creating-nginx-rewrite-rules/)): + + server { + listen 80; + server_name your.friendica.domain; + return 301 https://$server_name$request_uri; + } ### SSL Settings In the Admin Settings, there are three SSL-related settings: -- **SSL link policy**: this affects how Friendica generates internal links. If your SSL installation was successful, we recommend "Force all links to SSL" just in case your web server configuration can't be altered like described above. -- **Force SSL**: This forces all external links to HTTPS, which may solve Mixed-Content issues, but not all websites support HTTPS yet. Use at your own risk. -- **Verify SSL**: Enabling this will prevent Friendica to interact with self-signed SSL sites. We recommend you leave it on as a self-signed SSL certificate can be a vectorfor a man-in-the-middle attack. \ No newline at end of file + +1. **SSL link policy**: this affects how Friendica generates internal links. If your SSL installation was successful, we recommend "Force all links to SSL" just in case your web server configuration can't be altered like described above. +2. **Force SSL**: This forces all external links to HTTPS, which may solve Mixed-Content issues, but not all websites support HTTPS yet. Use at your own risk. +3. **Verify SSL**: Enabling this will prevent Friendica to interact with self-signed SSL sites. We recommend you leave it on as a self-signed SSL certificate can be a vectorfor a man-in-the-middle attack.