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.
## 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.
+++ /dev/null
-<?php
-/**
- * Throwable exceptions to return HTTP status code
- *
- * This list of Exception has be extracted from
- * here http://racksburg.com/choosing-an-http-status-code/
- */
-
-class HTTPException extends Exception {
- var $httpcode = 200;
- var $httpdesc = "";
- public function __construct($message="", $code = 0, Exception $previous = null) {
- if ($this->httpdesc=="") {
- $this->httpdesc = preg_replace("|([a-z])([A-Z])|",'$1 $2', str_replace("Exception","",get_class($this)));
- }
- 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;
-}
-
-
-
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';
}
// 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) {
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) {
{
$body = trim($item["body"]);
- if (Diaspora::is_reshare($body, false)===false) {
+ if (Diaspora::isReshare($body, false)===false) {
return false;
}
$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) {
$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"] = "";
}
*/
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) {
* @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).")";
* @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
* @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)) {
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);
}
* @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);
}
}
'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')),
),
);
$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 {
$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
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) {
}
if ($contact['network'] == NETWORK_DIASPORA) {
- $ret = Diaspora::send_share($a->user,$contact);
+ $ret = Diaspora::sendShare($a->user, $contact);
logger('share returns: '.$ret);
}
}
}
// 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'",
return false;
}
-function group_rmv_member($uid,$name,$member) {
- $gid = group_byname($uid,$name);
- if (! $gid)
- return false;
- if (! ( $uid && $gid && $member))
+function group_rmv_member($uid, $name, $member) {
+ $gid = group_byname($uid, $name);
+
+ if (!$gid) {
return false;
- $r = q("DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `contact-id` = %d",
- intval($uid),
- intval($gid),
- intval($member)
- );
- return $r;
+ }
+ if (!($uid && $gid && $member)) {
+ return false;
+ }
+ $r = dba::delete('group_member', array('uid' => $uid, 'gid' => $gid, 'contact-id' => $member));
+ return $r;
}
$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."'";
* @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'])) {
}
- 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']) {
* 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
// 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);
}
// 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;
}
- q("DELETE FROM tokens WHERE id='%s'", $token->key);
+ dba::delete('tokens', array('id' => $token->key));
if (!is_null($ret) && $uverifier!==false){
* @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);
}
* @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.
* @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');
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);
}
}
-}}
+}
/**
* @brief check if addon is enabled
* @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.
* @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() {
$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();
}
return false;
-}}
+}
/**
* @brief Parse plugin comment in search of plugin infos.
* @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();
$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]);
$info['author'][] = array('name'=>$v);
}
} else {
- if (array_key_exists($k,$info)){
+ if (array_key_exists($k,$info)) {
$info[$k]=$v;
}
}
}
return $info;
-}}
+}
/**
* @return array
*/
-if (! function_exists('get_theme_info')){
-function get_theme_info($theme){
+function get_theme_info($theme) {
$info=Array(
'name' => $theme,
'description' => "",
$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) {
} 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]);
$info['maintainer'][] = array('name'=>$v);
}
} else {
- if (array_key_exists($k,$info)){
+ if (array_key_exists($k,$info)) {
$info[$k]=$v;
}
}
}
return $info;
-}}
+}
/**
* @brief Returns the theme's screenshot.
}
// 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");
$func = "{$theme}_uninstall";
$func();
}
-}}
+}
-if (! function_exists('install_theme')){
function install_theme($theme) {
// silently fail if theme was removed
return false;
}
-}}
+}
/**
* @brief Get the full path to relevant theme files by filename
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));
}
/**
}
// 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);
$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));
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);
}
*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 {
}
$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();
}
// 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;
}
$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;
}
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);
}
}
$ret = true;
if ($public) {
- Diaspora::dispatch_public($msg);
+ Diaspora::dispatchPublic($msg);
} else {
$ret = Diaspora::dispatch($importer, $msg);
}
-#!/usr/bin/php
+#!/usr/bin/env php
<?php
/*
* ejabberd extauth script for the integration with friendica
*
* 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 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
+ * $ 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"}.
+ * - 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
+ * - 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)"
+ * - 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)"
*
*/
use Friendica\App;
-use Friendica\Core\Config;
-use Friendica\Database\DBM;
+use Friendica\Util\ExAuth;
-if (sizeof($_SERVER["argv"]) == 0)
+if (sizeof($_SERVER["argv"]) == 0) {
die();
+}
$directory = dirname($_SERVER["argv"][0]);
-if (substr($directory, 0, 1) != "/")
- $directory = $_SERVER["PWD"]."/".$directory;
+if (substr($directory, 0, 1) != DIRECTORY_SEPARATOR) {
+ $directory = $_SERVER["PWD"] . DIRECTORY_SEPARATOR . $directory;
+}
-$directory = realpath($directory."/..");
+$directory = realpath($directory . DIRECTORY_SEPARATOR . "..");
chdir($directory);
$a = new App(dirname(__DIR__));
-@include(".htconfig.php");
+@include ".htconfig.php";
dba::connect($db_host, $db_user, $db_pass, $db_data);
unset($db_host, $db_user, $db_pass, $db_data);
-$oAuth = new exAuth();
-
-class exAuth {
- private $bDebug;
-
- /**
- * @brief Create the class and do the authentification studd
- *
- * @param boolean $bDebug Debug mode
- */
- public function __construct() {
- // setter
- $this->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;
+$oAuth = new ExAuth();
- $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();
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']));
}
}
}
* @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() {
--- /dev/null
+<?php\r
+\r
+/**\r
+ * Throwable exceptions to return HTTP status code\r
+ *\r
+ * This list of Exception has be extracted from\r
+ * here http://racksburg.com/choosing-an-http-status-code/\r
+ */\r
+\r
+namespace Friendica\Network;\r
+\r
+use Exception;\r
+\r
+class HTTPException extends Exception\r
+{\r
+ var $httpcode = 200;\r
+ var $httpdesc = "";\r
+\r
+ public function __construct($message = '', $code = 0, Exception $previous = null)\r
+ {\r
+ if ($this->httpdesc == '') {\r
+ $classname = str_replace('Exception', '', str_replace('Friendica\Network\HTTPException\\', '', get_class($this)));\r
+ $this->httpdesc = preg_replace("|([a-z])([A-Z])|",'$1 $2', $classname);\r
+ }\r
+ parent::__construct($message, $code, $previous);\r
+ }\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class BadGatewayException extends HTTPException\r
+{\r
+ var $httpcode = 502;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class BadRequestException extends HTTPException\r
+{\r
+ var $httpcode = 400;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class ConflictException extends HTTPException\r
+{\r
+ var $httpcode = 409;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class ExpectationFailedException extends HTTPException\r
+{\r
+ var $httpcode = 417;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class ForbiddenException extends HTTPException\r
+{\r
+ var $httpcode = 403;\r
+}
\ No newline at end of file
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class GatewayTimeoutException extends HTTPException\r
+{\r
+ var $httpcode = 504;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class GoneException extends HTTPException\r
+{\r
+ var $httpcode = 410;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class ImATeapotException extends HTTPException\r
+{\r
+ var $httpcode = 418;\r
+ var $httpdesc = "I'm A Teapot";\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class InternalServerErrorException extends HTTPException\r
+{\r
+ var $httpcode = 500;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class LenghtRequiredException extends HTTPException\r
+{\r
+ var $httpcode = 411;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class MethodNotAllowedException extends HTTPException\r
+{\r
+ var $httpcode = 405;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class NonAcceptableException extends HTTPException\r
+{\r
+ var $httpcode = 406;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class NotFoundException extends HTTPException {\r
+ var $httpcode = 404;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class NotImplementedException extends HTTPException\r
+{\r
+ var $httpcode = 501;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class PreconditionFailedException extends HTTPException\r
+{\r
+ var $httpcode = 412;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class ServiceUnavaiableException extends HTTPException\r
+{\r
+ var $httpcode = 503;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class TooManyRequestsException extends HTTPException\r
+{\r
+ var $httpcode = 429;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class UnauthorizedException extends HTTPException\r
+{\r
+ var $httpcode = 401;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class UnprocessableEntityException extends HTTPException\r
+{\r
+ var $httpcode = 422;\r
+}\r
--- /dev/null
+<?php\r
+\r
+namespace Friendica\Network\HTTPException;\r
+\r
+use Friendica\Network\HTTPException;\r
+\r
+class UnsupportedMediaTypeException extends HTTPException\r
+{\r
+ var $httpcode = 415;\r
+}\r
require_once 'boot.php';
require_once 'include/text.php';
+/**
+ * @brief functions for interacting with a contact
+ */
class Contact extends BaseObject
{
/**
* @brief Marks a contact for removal
*
- * @param int $id
+ * @param int $id contact id
* @return null
*/
public static function remove($id)
{
// We want just to make sure that we don't delete our "self" contact
- $r = q(
- "SELECT `uid` FROM `contact` WHERE `id` = %d AND NOT `self` LIMIT 1", intval($id)
- );
- if (!DBM::is_result($r) || !intval($r[0]['uid'])) {
+ $r = dba::select('contact', array('uid'), array('id' => $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;
}
/**
* @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)
{
* 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)
}
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
/// @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'])));
}
}
}
*
* @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;
}
* 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
*/
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]);
}
$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"]);
}
* 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
*/
/**
* @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)
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'];
$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(
$menucondensed = array();
- foreach ($menu AS $menuname => $menuitem) {
+ foreach ($menu as $menuname => $menuitem) {
if ($menuitem[1] != '') {
$menucondensed[$menuname] = $menuitem;
}
}
/**
+ * @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)
AND `pending` = 0
LIMIT %d, %d", intval($uid), intval($uid), intval($start), intval($count)
);
-
return $r;
}
* 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
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);
}
$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"],
'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;
}
/**
* @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 '';
" 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);
// "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']))
$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());
$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);
$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);
$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");
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']);
$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");
$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");
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);
* @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 == "") {
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;
/**
* @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(
* @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"]);
* @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);
// XML does need a single element as root element so we add a dummy element here
$data = parse_xml_string("<dummy>" . $r->link . "</dummy>", 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;
* @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)) {
$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']))) {
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);
}
}
}
- self::get_attachment($doc, $entry, $item);
+ self::getAttachment($doc, $entry, $item);
return $entry;
}
*
* @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);
}
*
* @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);
}
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
*
* @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(
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`)
* @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
$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;
// 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;
}
// 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;
}
$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;
}
// 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;
* @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 "";
* @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");
* @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();
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;
* @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");
* @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;
* @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;
* @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) {
"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",
* @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);
}
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);
// 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"])
);
*
* @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;
/**
* @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");
$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);
}
}
$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);
}
$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;
}
$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;
}
$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;
}
}
// 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))) {
}
}
- 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);
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);
+ }
}
}
* @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;
}
} 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);
}
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);
// 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"]) {
}
$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;
}
// 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);
*
* 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;
*
* @return array of relay servers
*/
- public static function relay_list()
+ public static function relayList()
{
$serverdata = Config::get("system", "relay_server");
if ($serverdata == "") {
*
* @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);
// 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);
}
}
*
* @return string verified data
*/
- private static function verify_magic_envelope($envelope)
+ private static function verifyMagicEnvelope($envelope)
{
$basedom = parse_xml_string($envelope);
*
* @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"));
}
*
* @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"));
}
* '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);
$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;
}
$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);
} 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) {
*
* @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) {
return false;
}
- if (!($postdata = self::valid_posting($msg))) {
+ if (!($postdata = self::validPosting($msg))) {
logger("Invalid posting");
return false;
}
// 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);
// 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;
}
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);
*
* @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"]);
logger("Fetching diaspora key for: ".$handle);
- $r = self::person_by_handle($handle);
+ $r = self::personByHandle($handle);
if ($r) {
return $r["pubkey"];
}
*
* @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",
// 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;
}
}
*
* @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(
*
* @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;
*
* @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);
*
* @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(
*
* @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.
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;
*
* @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
}
}
- 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;
}
*
* @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",
* @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"]
);
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"]
);
*
* @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",
// 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]';
}
/**
- * @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"]);
}
}
*
* @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"];
logger("Successfully fetched item ".$guid." from ".$server, LOGGER_DEBUG);
// Now call the dispatcher
- return self::dispatch_public($msg);
+ return self::dispatchPublic($msg);
}
/**
$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 {
*
* @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`,
);
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) {
* '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",
*
* @return bool is it a hubzilla server?
*/
- public static function is_redmatrix($url)
+ public static function isRedmatrix($url)
{
return(strstr($url, "/channel/"));
}
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;
}
$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;
}
// 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);
*
* @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;
*
* @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)) {
*
* @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)) {
*
* @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);
*
* @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));
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();
$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;
$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);
*
* @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));
$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');
"source_link" => $person["url"],
"source_photo" => $person["thumb"],
"verb" => ACTIVITY_POST,
- "otype" => "mail"
- ));
+ "otype" => "mail")
+ );
return true;
}
*
* @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));
return false;
}
- $contact = self::allowed_contact_by_handle($importer, $msg["author"], true);
+ $contact = self::allowedContactByHandle($importer, $msg["author"], true);
if (!$contact) {
return false;
}
}
foreach ($messages as $mesg) {
- self::receive_conversation_message($importer, $contact, $data, $msg, $mesg, $conversation);
+ self::receiveConversationMessage($importer, $contact, $data, $msg, $mesg, $conversation);
}
return true;
*
* @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]";
*
* @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 = '<link rel="alternate" type="text/html" href="'.System::baseUrl()."/display/".$importer["nickname"]."/".$parent_item["id"].'" />';
*
* @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));
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.
$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;
$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);
*
* @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));
$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;
}
$message_uri = $author.":".$guid;
- $person = self::person_by_handle($author);
+ $person = self::personByHandle($author);
if (!$person) {
logger("unable to find author details");
return false;
$body = diaspora2bb($text);
- $body = self::replace_people_guid($body, $person["url"]);
+ $body = self::replacePeopleGuid($body, $person["url"]);
dba::lock('mail');
*
* @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;
*
* @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
*
* @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;
*
* @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;
}
*
* @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();
);
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"])
$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;
*
* @return string The XML
*/
- private static function construct_new_friend_object($contact)
+ private static function constructNewFriendObject($contact)
{
$objtype = ACTIVITY_OBJ_PERSON;
$link = '<link rel="alternate" type="text/html" href="'.$contact["url"].'" />'."\n".
*
* @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);
$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.
$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;
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);
// 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.");
$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));
}
}
*
* @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(
// 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);
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) {
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];
*
* @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));
/// @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;
}
$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;
$datarray["object-type"] = $original_item["object-type"];
- self::fetch_guid($datarray);
+ self::fetchGuid($datarray);
$message_id = item_store($datarray);
if ($message_id) {
*
* @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;
*
* @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;
case "Post":
case "Reshare":
case "StatusMessage":
- return self::item_retraction($importer, $contact, $data);
+ return self::itemRetraction($importer, $contact, $data);
case "Contact":
case "Person":
*
* @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));
$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;
}
$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);
}
}
$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;
$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;
$datarray["coord"] = $address["lat"]." ".$address["lng"];
}
- self::fetch_guid($datarray);
+ self::fetchGuid($datarray);
$message_id = item_store($datarray);
if ($message_id) {
*
* @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"];
*
* @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);
$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));
*
* @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";
*
* @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;
*
* @return string The post XML
*/
- public static function build_post_xml($type, $message)
+ public static function buildPostXml($type, $message)
{
$data = array($type => $message);
*
* @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);
$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);
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);
}
/**
*
* @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
*/
/*
}
*/
- $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);
}
/**
*/
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);
}
/**
*
* @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);
);
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);
}
*
* @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)) {
$owner = $r[0];
- $eventdata['author'] = self::my_handle($owner);
+ $eventdata['author'] = self::myHandle($owner);
if ($event['guid']) {
$eventdata['guid'] = $event['guid'];
* '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,
}
if ($item['event-id'] > 0) {
- $event = self::build_event($item['event-id']);
+ $event = self::buildEvent($item['event-id']);
if (count($event)) {
$message['event'] = $event;
*
* @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"]);
}
/**
*
* @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",
$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,
*
* @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"])
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,
*
* @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)) {
$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"],
// 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);
*
* @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";
}
$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"]);
}
/**
*
* @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']);
*
* @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 {
// 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";
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"]);
}
/**
*
* @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";
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"]);
}
/**
*
* @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",
$type = "conversation";
}
- return self::build_and_transmit($owner, $contact, $type, $message, false, $item["guid"]);
+ return self::buildAndTransmit($owner, $contact, $type, $message, false, $item["guid"]);
}
/**
/**
* @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;
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);
}
}
*
* @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)) {
return false;
}
- $message = self::construct_like($r[0], $contact);
+ $message = self::constructLike($r[0], $contact);
$message["author_signature"] = self::signature($contact, $message);
/*
*
* @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);
$contact["uprvkey"] = $uprvkey;
- $message = self::construct_comment($item, $contact);
+ $message = self::constructComment($item, $contact);
$message["author_signature"] = self::signature($contact, $message);
/*
* @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)
{
*
* @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?
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']);
* @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)
{
*
* @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)
{
* @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 = '')
{
/**
* @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)
{
* @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)
{
* @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)
{
* @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)
{
* @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
* @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)
{
* @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)
{
--- /dev/null
+<?php\r
+\r
+/*\r
+ * ejabberd extauth script for the integration with friendica\r
+ *\r
+ * Originally written for joomla by Dalibor Karlovic <dado@krizevci.info>\r
+ * modified for Friendica by Michael Vogel <icarus@dabo.de>\r
+ * published under GPL\r
+ *\r
+ * Latest version of the original script for joomla is available at:\r
+ * http://87.230.15.86/~dado/ejabberd/joomla-login\r
+ *\r
+ * Installation:\r
+ *\r
+ * - Change it's owner to whichever user is running the server, ie. ejabberd\r
+ * $ chown ejabberd:ejabberd /path/to/friendica/scripts/auth_ejabberd.php\r
+ *\r
+ * - Change the access mode so it is readable only to the user ejabberd and has exec\r
+ * $ chmod 700 /path/to/friendica/scripts/auth_ejabberd.php\r
+ *\r
+ * - Edit your ejabberd.cfg file, comment out your auth_method and add:\r
+ * {auth_method, external}.\r
+ * {extauth_program, "/path/to/friendica/script/auth_ejabberd.php"}.\r
+ *\r
+ * - Restart your ejabberd service, you should be able to login with your friendica auth info\r
+ *\r
+ * Other hints:\r
+ * - if your users have a space or a @ in their nickname, they'll run into trouble\r
+ * registering with any client so they should be instructed to replace these chars\r
+ * " " (space) is replaced with "%20"\r
+ * "@" is replaced with "(a)"\r
+ *\r
+ */\r
+\r
+namespace Friendica\Util;\r
+\r
+use Friendica\Core\Config;\r
+use Friendica\Core\PConfig;\r
+use Friendica\Database\DBM;\r
+use dba;\r
+\r
+require_once 'include/dba.php';\r
+\r
+class ExAuth\r
+{\r
+ private $bDebug;\r
+\r
+ /**\r
+ * @brief Create the class\r
+ *\r
+ * @param boolean $bDebug Debug mode\r
+ */\r
+ public function __construct()\r
+ {\r
+ $this->bDebug = (int) Config::get('jabber', 'debug');\r
+\r
+ openlog('auth_ejabberd', LOG_PID, LOG_USER);\r
+\r
+ $this->writeLog(LOG_NOTICE, 'start');\r
+ }\r
+\r
+ /**\r
+ * @brief Standard input reading function, executes the auth with the provided\r
+ * parameters\r
+ *\r
+ * @return null\r
+ */\r
+ public function readStdin()\r
+ {\r
+ while (!feof(STDIN)) {\r
+ // Quit if the database connection went down\r
+ if (!dba::connected()) {\r
+ $this->writeLog(LOG_ERR, 'the database connection went down');\r
+ return;\r
+ }\r
+\r
+ $iHeader = fgets(STDIN, 3);\r
+ $aLength = unpack('n', $iHeader);\r
+ $iLength = $aLength['1'];\r
+\r
+ // No data? Then quit\r
+ if ($iLength == 0) {\r
+ $this->writeLog(LOG_ERR, 'we got no data, quitting');\r
+ return;\r
+ }\r
+\r
+ // Fetching the data\r
+ $sData = fgets(STDIN, $iLength + 1);\r
+ $this->writeLog(LOG_DEBUG, 'received data: ' . $sData);\r
+ $aCommand = explode(':', $sData);\r
+ if (is_array($aCommand)) {\r
+ switch ($aCommand[0]) {\r
+ case 'isuser':\r
+ // Check the existance of a given username\r
+ $this->isUser($aCommand);\r
+ break;\r
+ case 'auth':\r
+ // Check if the givven password is correct\r
+ $this->auth($aCommand);\r
+ break;\r
+ case 'setpass':\r
+ // We don't accept the setting of passwords here\r
+ $this->writeLog(LOG_NOTICE, 'setpass command disabled');\r
+ fwrite(STDOUT, pack('nn', 2, 0));\r
+ break;\r
+ default:\r
+ // We don't know the given command\r
+ $this->writeLog(LOG_NOTICE, 'unknown command ' . $aCommand[0]);\r
+ fwrite(STDOUT, pack('nn', 2, 0));\r
+ break;\r
+ }\r
+ } else {\r
+ $this->writeLog(LOG_NOTICE, 'invalid command string ' . $sData);\r
+ fwrite(STDOUT, pack('nn', 2, 0));\r
+ }\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @brief Check if the given username exists\r
+ *\r
+ * @param array $aCommand The command array\r
+ */\r
+ private function isUser(array $aCommand)\r
+ {\r
+ $a = get_app();\r
+\r
+ // Check if there is a username\r
+ if (!isset($aCommand[1])) {\r
+ $this->writeLog(LOG_NOTICE, 'invalid isuser command, no username given');\r
+ fwrite(STDOUT, pack('nn', 2, 0));\r
+ return;\r
+ }\r
+\r
+ // Now we check if the given user is valid\r
+ $sUser = str_replace(array('%20', '(a)'), array(' ', '@'), $aCommand[1]);\r
+\r
+ // Does the hostname match? So we try directly\r
+ if ($a->get_hostname() == $aCommand[2]) {\r
+ $this->writeLog(LOG_INFO, 'internal user check for ' . $sUser . '@' . $aCommand[2]);\r
+ $found = dba::exists('user', ['nickname' => $sUser]);\r
+ } else {\r
+ $found = false;\r
+ }\r
+\r
+ // If the hostnames doesn't match or there is some failure, we try to check remotely\r
+ if (!$found) {\r
+ $found = $this->checkUser($aCommand[2], $aCommand[1], true);\r
+ }\r
+\r
+ if ($found) {\r
+ // The user is okay\r
+ $this->writeLog(LOG_NOTICE, 'valid user: ' . $sUser);\r
+ fwrite(STDOUT, pack('nn', 2, 1));\r
+ } else {\r
+ // The user isn't okay\r
+ $this->writeLog(LOG_WARNING, 'invalid user: ' . $sUser);\r
+ fwrite(STDOUT, pack('nn', 2, 0));\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @brief Check remote user existance via HTTP(S)\r
+ *\r
+ * @param string $host The hostname\r
+ * @param string $user Username\r
+ * @param boolean $ssl Should the check be done via SSL?\r
+ *\r
+ * @return boolean Was the user found?\r
+ */\r
+ private function checkUser($host, $user, $ssl)\r
+ {\r
+ $this->writeLog(LOG_INFO, 'external user check for ' . $user . '@' . $host);\r
+\r
+ $url = ($ssl ? 'https' : 'http') . '://' . $host . '/noscrape/' . $user;\r
+\r
+ $data = z_fetch_url($url);\r
+\r
+ if (!is_array($data)) {\r
+ return false;\r
+ }\r
+\r
+ if ($data['return_code'] != '200') {\r
+ return false;\r
+ }\r
+\r
+ $json = @json_decode($data['body']);\r
+ if (!is_object($json)) {\r
+ return false;\r
+ }\r
+\r
+ return $json->nick == $user;\r
+ }\r
+\r
+ /**\r
+ * @brief Authenticate the given user and password\r
+ *\r
+ * @param array $aCommand The command array\r
+ */\r
+ private function auth(array $aCommand)\r
+ {\r
+ $a = get_app();\r
+\r
+ // check user authentication\r
+ if (sizeof($aCommand) != 4) {\r
+ $this->writeLog(LOG_NOTICE, 'invalid auth command, data missing');\r
+ fwrite(STDOUT, pack('nn', 2, 0));\r
+ return;\r
+ }\r
+\r
+ // We now check if the password match\r
+ $sUser = str_replace(array('%20', '(a)'), array(' ', '@'), $aCommand[1]);\r
+\r
+ // Does the hostname match? So we try directly\r
+ if ($a->get_hostname() == $aCommand[2]) {\r
+ $this->writeLog(LOG_INFO, 'internal auth for ' . $sUser . '@' . $aCommand[2]);\r
+\r
+ $aUser = dba::select('user', ['uid', 'password'], ['nickname' => $sUser], ['limit' => 1]);\r
+ if (DBM::is_result($aUser)) {\r
+ $uid = $aUser['uid'];\r
+ $Error = $aUser['password'] != hash('whirlpool', $aCommand[3]);\r
+ } else {\r
+ $this->writeLog(LOG_WARNING, 'user not found: ' . $sUser);\r
+ $Error = true;\r
+ $uid = -1;\r
+ }\r
+ if ($Error) {\r
+ $this->writeLog(LOG_INFO, 'check against alternate password for ' . $sUser . '@' . $aCommand[2]);\r
+ $sPassword = PConfig::get($uid, 'xmpp', 'password', null, true);\r
+ $Error = ($aCommand[3] != $sPassword);\r
+ }\r
+ } else {\r
+ $Error = true;\r
+ }\r
+\r
+ // If the hostnames doesn't match or there is some failure, we try to check remotely\r
+ if ($Error) {\r
+ $Error = !$this->checkCredentials($aCommand[2], $aCommand[1], $aCommand[3], true);\r
+ }\r
+\r
+ if ($Error) {\r
+ $this->writeLog(LOG_WARNING, 'authentification failed for user ' . $sUser . '@' . $aCommand[2]);\r
+ fwrite(STDOUT, pack('nn', 2, 0));\r
+ } else {\r
+ $this->writeLog(LOG_NOTICE, 'authentificated user ' . $sUser . '@' . $aCommand[2]);\r
+ fwrite(STDOUT, pack('nn', 2, 1));\r
+ }\r
+ }\r
+\r
+ /**\r
+ * @brief Check remote credentials via HTTP(S)\r
+ *\r
+ * @param string $host The hostname\r
+ * @param string $user Username\r
+ * @param string $password Password\r
+ * @param boolean $ssl Should the check be done via SSL?\r
+ *\r
+ * @return boolean Are the credentials okay?\r
+ */\r
+ private function checkCredentials($host, $user, $password, $ssl)\r
+ {\r
+ $url = ($ssl ? 'https' : 'http') . '://' . $host . '/api/account/verify_credentials.json';\r
+\r
+ $ch = curl_init();\r
+ curl_setopt($ch, CURLOPT_URL, $url);\r
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);\r
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);\r
+ curl_setopt($ch, CURLOPT_HEADER, true);\r
+ curl_setopt($ch, CURLOPT_NOBODY, true);\r
+ curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);\r
+ curl_setopt($ch, CURLOPT_USERPWD, $user . ':' . $password);\r
+\r
+ curl_exec($ch);\r
+ $curl_info = @curl_getinfo($ch);\r
+ $http_code = $curl_info['http_code'];\r
+ curl_close($ch);\r
+\r
+ $this->writeLog(LOG_INFO, 'external auth for ' . $user . '@' . $host . ' returned ' . $http_code);\r
+\r
+ return $http_code == 200;\r
+ }\r
+\r
+ /**\r
+ * @brief write data to the syslog\r
+ *\r
+ * @param integer $loglevel The syslog loglevel\r
+ * @param string $sMessage The syslog message\r
+ */\r
+ private function writeLog($loglevel, $sMessage)\r
+ {\r
+ if (!$this->bDebug && ($loglevel >= LOG_DEBUG)) {\r
+ return;\r
+ }\r
+ syslog($loglevel, $sMessage);\r
+ }\r
+\r
+ /**\r
+ * @brief destroy the class, close the syslog connection.\r
+ */\r
+ public function __destruct()\r
+ {\r
+ $this->writeLog(LOG_NOTICE, 'stop');\r
+ closelog();\r
+ }\r
+}\r
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;
break;
if ($mail) {
- Diaspora::send_mail($item,$owner,$contact);
+ Diaspora::sendMail($item,$owner,$contact);
break;
}
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);
} 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;
}
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`
return;
}
- Diaspora::send_profile($uid);
+ Diaspora::sendProfile($uid);
}
}
--- /dev/null
+# 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
+
+
--- /dev/null
+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()}})()
--- /dev/null
+#!/usr/bin/env php
+<?php
+
+/**
+ * @brief tool to block an account from the node
+ *
+ * With this tool, you can block an account in such a way, that no postings
+ * or comments this account writes are accepted to the node.
+ *
+ * Usage: pass the URL of the to be blocked account as only parameter
+ * at the command line when running this tool. E.g.
+ *
+ * $> 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";
+}
+
+?>
--- /dev/null
+#!/usr/bin/env php
+<?php
+
+/**
+ * @brief tool to silence accounts on the global community page
+ *
+ * With this tool, you can silence an account on the global community page.
+ * Postings from silenced accounts will not be displayed on the community
+ * page. This silencing does only affect the display on the community page,
+ * accounts following the silenced accounts will still get their postings.
+ *
+ * Usage: pass the URL of the profile to be silenced account as only parameter
+ * at the command line when running this tool. E.g.
+ *
+ * $> util/global_community_silence.php http://example.com/profile/bob
+ *
+ * will silence bob@example.com so that his postings 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";
+}
+
+?>
-
<div id="contact-edit-wrapper" >
{{* Insert Tab-Nav *}}
{{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}}
{{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}}
{{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}}