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. 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/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; -} - - - diff --git a/include/api.php b/include/api.php index 9f91139d1f..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'; @@ -3435,11 +3443,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 +3726,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) { @@ -4299,7 +4299,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; } @@ -4307,7 +4307,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/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"] = ""; } 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) { diff --git a/include/dba.php b/include/dba.php index 79c15c85bd..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,18 +1026,20 @@ 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); - 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/features.php b/include/features.php index 340394ecea..f199357315 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)), array('tagadelic', t('Tag Cloud'), t('Provide a personal tag cloud on your profile page'), false, Config::get('feature_lock', 'tagadelic')), ), ); @@ -126,7 +126,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 { 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/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/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; - - } diff --git a/include/items.php b/include/items.php index 1f55112174..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."'"; @@ -426,7 +427,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'])) { @@ -2122,7 +2123,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 +2190,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..1dcadde705 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); @@ -249,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/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/mod/contacts.php b/mod/contacts.php index 1859c2aa60..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'), '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)); 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/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/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() { diff --git a/src/Network/HTTPException.php b/src/Network/HTTPException.php new file mode 100644 index 0000000000..7602290c2b --- /dev/null +++ b/src/Network/HTTPException.php @@ -0,0 +1,27 @@ +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); + } +} 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 @@ + $id, 'self' => false), array('limit' => 1)); + + 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) { - q( - "UPDATE `contact` SET `archive` = 1, `network` = 'none', `writable` = 0 WHERE id = %d", intval($id) - ); + dba::update('contact', array('archive' => true, 'network' => 'none', 'writable' => false), array('id' => $id)); return; } @@ -56,8 +56,9 @@ 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 + * @return void */ public static function terminateFriendship(array $user, array $contact) { @@ -88,7 +89,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) @@ -99,18 +100,12 @@ 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` = ? AND `term-date` <= ?', normalise_link($contact['url']), NULL_DATE)); } } 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,19 +115,14 @@ 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. */ - 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']))); } } } @@ -143,17 +133,16 @@ 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) { - $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); + $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; } @@ -172,9 +161,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 +226,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 +280,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 +305,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 +352,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,14 +376,14 @@ 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; } - $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), array('limit' => 1)); if ($r) { - return self::photoMenu($r[0], $uid); + return self::photoMenu($r, $uid); } else { $profile_link = zrl($contact['url']); $connlnk = 'follow/?url=' . $contact['url']; @@ -438,7 +428,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 +449,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 +459,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) @@ -510,7 +501,6 @@ class Contact extends BaseObject AND `pending` = 0 LIMIT %d, %d", intval($uid), intval($uid), intval($start), intval($count) ); - return $r; } @@ -532,8 +522,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 @@ -561,7 +551,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); } @@ -608,7 +598,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"], @@ -619,9 +610,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' => array('id'), 'limit' => 2)); + $contacts = dba::inArray($s); if (!DBM::is_result($contacts)) { return 0; } @@ -735,19 +728,20 @@ 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 */ public static function getPostsFromUrl($contact_url) { + $a = self::getApp(); + require_once 'include/conversation.php'; // 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))); + WHERE `contact`.`nurl` = '%s' AND `contact`.`uid` = 0", dbesc(normalise_link($contact_url))); if (!DBM::is_result($r)) { return ''; @@ -767,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); @@ -790,8 +783,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'])) 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/Util/ExAuth.php b/src/Util/ExAuth.php new file mode 100644 index 0000000000..aa3300c4e9 --- /dev/null +++ b/src/Util/ExAuth.php @@ -0,0 +1,305 @@ + + * 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; +use dba; + +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', null, true); + $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(); + } +} 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; 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); } } diff --git a/util/bookmarklet-share2friendica/README.md b/util/bookmarklet-share2friendica/README.md new file mode 100644 index 0000000000..ad30baa9dd --- /dev/null +++ b/util/bookmarklet-share2friendica/README.md @@ -0,0 +1,47 @@ +# 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!* + +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 + +* 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()}})() diff --git a/util/global_community_block.php b/util/global_community_block.php new file mode 100755 index 0000000000..cb6789e45c --- /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"; +} + +?> diff --git a/util/global_community_silence.php b/util/global_community_silence.php new file mode 100755 index 0000000000..e6c936f0dd --- /dev/null +++ b/util/global_community_silence.php @@ -0,0 +1,68 @@ +#!/usr/bin/env php + util/global_community_silence.php http://example.com/profile/bob + * + * will silence bob@example.com so that his postings won't 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://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("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"; +} + +?> 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}}