Merge branch 'develop' into improvement/frio-action-links-to-buttons

# Conflicts:
#	view/theme/frio/templates/search_item.tpl
#	view/theme/frio/templates/wall_thread.tpl
This commit is contained in:
Hypolite Petovan 2017-03-14 10:45:17 -04:00
commit 79f14749df
55 changed files with 13809 additions and 13796 deletions

View file

@ -1,4 +1,4 @@
Version 3.5.1
Version 3.5.1 (2017-03-12)
Friendica Core:
Updates to the translations (BG, CA, CS, DE, EO, ES, FR, IS, IT, NL, PL, PT-BR, RU, SV) [translation teams]
Fix for a potential XSS vector [heluecht, thanks to Vít Šesták 'v6ak' for reporting the problem]
@ -33,13 +33,13 @@ Version 3.5.1
ping now works with JSON as well [Hypolite]
On pending registrations, an email is now send to inform the user about it [tobiasd]
On systems where the registration needs approval, a note for the admin can now be written [tobiasd]
Theme developers can now announce if their theme does support the RichText editor or not [heluecht, rabuzarus]
Meta Information for HTML descriptions is now limited to 160 character [rabuzarus]
Removed very old deprecated themes from the repository [silke]
Marked frost and frost mobile as deprecated [silke]
When creating new postings in the UI, focus is automatically put into the Title field [Hypolite]
We are now shipping config files for "tx" (the Transifex client) and the "EditorConfig" addon for many common editors [fabrixxm, tobiasd]
The TinyMCE richtext editor was removed [Hypolite]
We defined a coding style, PSR-2 with some adjustments
Various bugfixes
Friendica Addons:
@ -58,11 +58,12 @@ Version 3.5.1
Twitter-bridge now supports quotes and long posts when importing tweets [heluecht]
Closed Issues
1019, 1163, 1612, 1613, 2177, 2252, 2260, 2403, 2991, 2614, 2751,
2752, 2772, 2791, 2800, 2804, 2813, 2814, 2816, 2817, 2823, 2850,
2858, 2865, 2892, 2894, 2895, 2907, 2908, 2914, 2015, 2926, 2948,
2955, 2958, 2963, 2964, 2968, 2987, 2993, 3020, 3052, 3062, 3066,
3091, 3108, 3116, 3117, 3118, 3126, 3130, 3135, 3155, 3163
1019, 1163, 1612, 1613, 2103, 2177, 2252, 2260, 2403, 2991, 2614,
2751, 2752, 2772, 2791, 2800, 2804, 2813, 2814, 2816, 2817, 2823,
2850, 2858, 2865, 2892, 2894, 2895, 2907, 2908, 2914, 2015, 2926,
2948, 2955, 2958, 2963, 2964, 2968, 2987, 2993, 3020, 3052, 3062,
3066, 3091, 3108, 3113, 3116, 3117, 3118, 3126, 3130, 3135, 3155,
3160, 3163, 3187, 3196
Version 3.5 (2016-09-13)
Friendica Core:

1
VERSION Normal file
View file

@ -0,0 +1 @@
3.5.2-dev

View file

@ -38,9 +38,9 @@ require_once('include/dbstructure.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_CODENAME', 'Asparagus');
define ( 'FRIENDICA_VERSION', '3.5.1-dev' );
define ( 'FRIENDICA_VERSION', '3.5.2-dev' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1214 );
define ( 'DB_UPDATE_VERSION', 1215 );
/**
* @brief Constant with a HTML line break.
@ -1889,11 +1889,35 @@ function goaway($s) {
* @return int|bool user id or false
*/
function local_user() {
if((x($_SESSION,'authenticated')) && (x($_SESSION,'uid')))
if (x($_SESSION, 'authenticated') && x($_SESSION, 'uid')) {
return intval($_SESSION['uid']);
}
return false;
}
/**
* @brief Returns the public contact id of logged in user or false.
*
* @return int|bool public contact id or false
*/
function public_contact() {
static $public_contact_id = false;
if (!$public_contact_id && x($_SESSION, 'authenticated')) {
if (x($_SESSION, 'my_address')) {
// Local user
$public_contact_id = intval(get_contact($_SESSION['my_address'], 0));
} else if (x($_SESSION, 'visitor_home')) {
// Remote user
$public_contact_id = intval(get_contact($_SESSION['visitor_home'], 0));
}
} else if (!x($_SESSION, 'authenticated')) {
$public_contact_id = false;
}
return $public_contact_id;
}
/**
* @brief Returns contact id of authenticated site visitor or false
*

View file

@ -1,6 +1,6 @@
-- ------------------------------------------
-- Friendica 3.5.1-dev (Asparagus)
-- DB_UPDATE_VERSION 1213
-- Friendica 3.5.1-rc (Asparagus)
-- DB_UPDATE_VERSION 1215
-- ------------------------------------------
@ -532,6 +532,7 @@ CREATE TABLE IF NOT EXISTS `item` (
INDEX `parent-uri` (`parent-uri`),
INDEX `extid` (`extid`),
INDEX `uid_id` (`uid`,`id`),
INDEX `uid_contactid_id` (`uid`,`contact-id`,`id`),
INDEX `uid_created` (`uid`,`created`),
INDEX `uid_unseen_contactid` (`uid`,`unseen`,`contact-id`),
INDEX `uid_network_received` (`uid`,`network`,`received`),
@ -1016,7 +1017,8 @@ CREATE TABLE IF NOT EXISTS `thread` (
INDEX `uid_contactid_commented` (`uid`,`contact-id`,`commented`),
INDEX `uid_contactid_created` (`uid`,`contact-id`,`created`),
INDEX `uid_created` (`uid`,`created`),
INDEX `uid_commented` (`uid`,`commented`)
INDEX `uid_commented` (`uid`,`commented`),
INDEX `uid_wall_created` (`uid`,`wall`,`created`)
) DEFAULT CHARSET=utf8mb4;
--

View file

@ -61,6 +61,8 @@ Here's a few primers if you are new to Friendica or to the PSR-2 coding standard
Don't worry, you don't have to know by heart the PSR-2 coding standards to start contributing to Friendica.
There are a few tools you can use to check or fix your files before you commit.
For documentation we use the standard of *one sentence per line* for the `md` files in the `/doc` and `/doc/$lng` subdirectories.
####Check with [PHP Code Sniffer](https://github.com/squizlabs/PHP_CodeSniffer)
This tool checks your files against a variety of coding standards, including PSR-2, and ouputs a report of all the standard violations.

View file

@ -1,7 +1,5 @@
<?php
require_once('include/Probe.php');
// Included here for completeness, but this is a very dangerous operation.
// It is the caller's responsibility to confirm the requestor's intent and
// authorisation to do this.
@ -355,6 +353,7 @@ function get_contact_details_by_addr($addr, $uid = -1) {
dbesc($addr));
if (!dbm::is_result($r)) {
require_once('include/Probe.php');
$data = Probe::uri($addr);
$profile = get_contact_details_by_url($data['url'], $uid);
@ -508,72 +507,96 @@ function contacts_not_grouped($uid,$start = 0,$count = 0) {
/**
* @brief Fetch the contact id for a given url and user
*
* First lookup in the contact table to find a record matching either `url`, `nurl`,
* `addr` or `alias`.
*
* If there's no record and we aren't looking for a public contact, we quit.
* If there's one, we check that it isn't time to update the picture else we
* directly return the found contact id.
*
* Second, we probe the provided $url wether it's http://server.tld/profile or
* nick@server.tld. We quit if we can't get any info back.
*
* Third, we create the contact record if it doesn't exist
*
* 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
* @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
*/
function get_contact($url, $uid = 0, $no_update = false) {
require_once("include/Scrape.php");
logger("Get contact data for url ".$url." and user ".$uid." - ".App::callstack(), LOGGER_DEBUG);;
$data = array();
$contactid = 0;
$contact_id = 0;
// is it an address in the format user@server.tld?
/// @todo use gcontact and/or the addr field for a lookup
if (!strstr($url, "http") OR strstr($url, "@")) {
$data = probe_url($url);
$url = $data["url"];
if ($url == "")
return 0;
}
$contact = q("SELECT `id`, `avatar-date` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2",
// We first try the nurl (http://server.tld/nick), most common case
$contacts = q("SELECT `id`, `avatar-date` FROM `contact`
WHERE `nurl` = '%s'
AND `uid` = %d",
dbesc(normalise_link($url)),
intval($uid));
if (!$contact)
$contact = q("SELECT `id`, `avatar-date` FROM `contact` WHERE `alias` IN ('%s', '%s') AND `uid` = %d ORDER BY `id` LIMIT 1",
// Then the addr (nick@server.tld)
if (! dbm::is_result($contacts)) {
$contacts = q("SELECT `id`, `avatar-date` FROM `contact`
WHERE `addr` = '%s'
AND `uid` = %d",
dbesc($url),
intval($uid));
}
// Then the alias (which could be anything)
if (! dbm::is_result($contacts)) {
$contacts = q("SELECT `id`, `avatar-date` FROM `contact`
WHERE `alias` IN ('%s', '%s')
AND `uid` = %d",
dbesc($url),
dbesc(normalise_link($url)),
intval($uid));
}
if ($contact) {
$contactid = $contact[0]["id"];
if (dbm::is_result($contacts)) {
$contact_id = $contacts[0]["id"];
// Update the contact every 7 days
$update_photo = ($contact[0]['avatar-date'] < datetime_convert('','','now -7 days'));
//$update_photo = ($contact[0]['avatar-date'] < datetime_convert('','','now -12 hours'));
$update_photo = ($contacts[0]['avatar-date'] < datetime_convert('','','now -7 days'));
if (!$update_photo OR $no_update) {
return($contactid);
return $contact_id;
}
} elseif ($uid != 0)
} elseif ($uid != 0) {
// Non-existing user-specific contact, exiting
return 0;
}
if (!count($data))
$data = probe_url($url);
require_once('include/Probe.php');
$data = Probe::uri($url);
// Does this address belongs to a valid network?
if (!in_array($data["network"], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA))) {
if ($uid != 0)
// Last try in gcontact for unsupported networks
if (!in_array($data["network"], array(NETWORK_DFRN, NETWORK_OSTATUS, NETWORK_DIASPORA, NETWORK_PUMPIO))) {
if ($uid != 0) {
return 0;
}
// Get data from the gcontact table
$r = q("SELECT `name`, `nick`, `url`, `photo`, `addr`, `alias`, `network` FROM `gcontact` WHERE `nurl` = '%s'",
$gcontacts = q("SELECT `name`, `nick`, `url`, `photo`, `addr`, `alias`, `network` FROM `gcontact` WHERE `nurl` = '%s'",
dbesc(normalise_link($url)));
if (!$r)
if (!$gcontacts) {
return 0;
}
$data = $r[0];
$data = $gcontacts[0];
}
$url = $data["url"];
if ($contactid == 0) {
if (!$contact_id) {
q("INSERT INTO `contact` (`uid`, `created`, `url`, `nurl`, `addr`, `alias`, `notify`, `poll`,
`name`, `nick`, `photo`, `network`, `pubkey`, `rel`, `priority`,
`batch`, `request`, `confirm`, `poco`, `name-date`, `uri-date`,
@ -602,45 +625,48 @@ function get_contact($url, $uid = 0, $no_update = false) {
dbesc(datetime_convert())
);
$contact = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2",
$contacts = q("SELECT `id` FROM `contact` WHERE `nurl` = '%s' AND `uid` = %d ORDER BY `id` LIMIT 2",
dbesc(normalise_link($data["url"])),
intval($uid));
if (!$contact)
if (!dbm::is_result($contacts)) {
return 0;
}
$contactid = $contact[0]["id"];
$contact_id = $contacts[0]["id"];
// Update the newly created contact from data in the gcontact table
$r = q("SELECT `location`, `about`, `keywords`, `gender` FROM `gcontact` WHERE `nurl` = '%s'",
$gcontacts = q("SELECT `location`, `about`, `keywords`, `gender` FROM `gcontact` WHERE `nurl` = '%s'",
dbesc(normalise_link($data["url"])));
if ($r) {
logger("Update contact ".$data["url"]);
if (dbm::is_result($gcontacts)) {
logger("Update contact " . $data["url"] . ' from gcontact');
q("UPDATE `contact` SET `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `id` = %d",
dbesc($r["location"]), dbesc($r["about"]), dbesc($r["keywords"]),
dbesc($r["gender"]), intval($contactid));
dbesc($gcontacts[0]["location"]), dbesc($gcontacts[0]["about"]), dbesc($gcontacts[0]["keywords"]),
dbesc($gcontacts[0]["gender"]), intval($contact_id));
}
}
if ((count($contact) > 1) AND ($uid == 0) AND ($contactid != 0) AND ($url != ""))
if (count($contacts) > 1 AND $uid == 0 AND $contact_id != 0 AND $url != "") {
q("DELETE FROM `contact` WHERE `nurl` = '%s' AND `id` != %d AND NOT `self`",
dbesc(normalise_link($url)),
intval($contactid));
intval($contact_id));
}
require_once("Photo.php");
require_once "Photo.php";
update_contact_avatar($data["photo"],$uid,$contactid);
update_contact_avatar($data["photo"], $uid, $contact_id);
$r = q("SELECT `addr`, `alias`, `name`, `nick` FROM `contact` WHERE `id` = %d", intval($contactid));
$contacts = q("SELECT `addr`, `alias`, `name`, `nick` FROM `contact` WHERE `id` = %d", intval($contact_id));
// This condition should always be true
if (!dbm::is_result($r))
return $contactid;
if (!dbm::is_result($contacts)) {
return $contact_id;
}
// Only update if there had something been changed
if (($data["addr"] != $r[0]["addr"]) OR
($data["alias"] != $r[0]["alias"]) OR
($data["name"] != $r[0]["name"]) OR
($data["nick"] != $r[0]["nick"]))
if ($data["addr"] != $contacts[0]["addr"] OR
$data["alias"] != $contacts[0]["alias"] OR
$data["name"] != $contacts[0]["name"] OR
$data["nick"] != $contacts[0]["nick"]) {
q("UPDATE `contact` SET `addr` = '%s', `alias` = '%s', `name` = '%s', `nick` = '%s',
`name-date` = '%s', `uri-date` = '%s' WHERE `id` = %d",
dbesc($data["addr"]),
@ -649,10 +675,11 @@ function get_contact($url, $uid = 0, $no_update = false) {
dbesc($data["nick"]),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
intval($contactid)
intval($contact_id)
);
}
return $contactid;
return $contact_id;
}
/**
@ -675,15 +702,6 @@ function posts_from_gcontact(App $a, $gcontact_id) {
else
$sql = "`item`.`uid` = %d";
if(get_config('system', 'old_pager')) {
$r = q("SELECT COUNT(*) AS `total` FROM `item`
WHERE `gcontact-id` = %d and $sql",
intval($gcontact_id),
intval(local_user()));
$a->set_pager_total($r[0]['total']);
}
$r = q("SELECT `item`.`uri`, `item`.*, `item`.`id` AS `item_id`,
`author-name` AS `name`, `owner-avatar` AS `photo`,
`owner-link` AS `url`, `owner-avatar` AS `thumb`
@ -699,11 +717,7 @@ function posts_from_gcontact(App $a, $gcontact_id) {
$o = conversation($a, $r, 'community', false);
if(!get_config('system', 'old_pager')) {
$o .= alt_pager($a, count($r));
} else {
$o .= paginate($a);
}
return $o;
}
@ -736,15 +750,6 @@ function posts_from_contact_url(App $a, $contact_url) {
$author_id = intval($r[0]["author-id"]);
if (get_config('system', 'old_pager')) {
$r = q("SELECT COUNT(*) AS `total` FROM `item`
WHERE `author-id` = %d and $sql",
intval($author_id),
intval(local_user()));
$a->set_pager_total($r[0]['total']);
}
$r = q(item_query()." AND `item`.`author-id` = %d AND ".$sql.
" ORDER BY `item`.`created` DESC LIMIT %d, %d",
intval($author_id),
@ -755,11 +760,7 @@ function posts_from_contact_url(App $a, $contact_url) {
$o = conversation($a, $r, 'community', false);
if (!get_config('system', 'old_pager')) {
$o .= alt_pager($a, count($r));
} else {
$o .= paginate($a);
}
return $o;
}

View file

@ -146,7 +146,9 @@ class ParseUrl {
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $a->get_useragent());
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, (($check_cert) ? 2 : false));
if ($check_cert) {
@curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
}
$header = curl_exec($ch);
$curl_info = @curl_getinfo($ch);

View file

@ -60,11 +60,20 @@ class Probe {
$xrd_timeout = Config::get('system','xrd_timeout', 20);
$redirects = 0;
$xml = fetch_url($ssl_url, false, $redirects, $xrd_timeout, "application/xrd+xml");
$ret = z_fetch_url($ssl_url, false, $redirects, array('timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml'));
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return false;
}
$xml = $ret['body'];
$xrd = parse_xml_string($xml, false);
if (!is_object($xrd)) {
$xml = fetch_url($url, false, $redirects, $xrd_timeout, "application/xrd+xml");
$ret = z_fetch_url($url, false, $redirects, array('timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml'));
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return false;
}
$xml = $ret['body'];
$xrd = parse_xml_string($xml, false);
}
if (!is_object($xrd))
@ -430,7 +439,12 @@ class Probe {
$xrd_timeout = Config::get('system','xrd_timeout', 20);
$redirects = 0;
$data = fetch_url($url, false, $redirects, $xrd_timeout, "application/xrd+xml");
$ret = z_fetch_url($url, false, $redirects, array('timeout' => $xrd_timeout, 'accept_content' => 'application/xrd+xml'));
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return false;
}
$data = $ret['body'];
$xrd = parse_xml_string($data, false);
if (!is_object($xrd)) {
@ -482,9 +496,14 @@ class Probe {
* @return array noscrape data
*/
private function poll_noscrape($noscrape, $data) {
$content = fetch_url($noscrape);
if (!$content)
$ret = z_fetch_url($noscrape);
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return false;
}
$content = $ret['body'];
if (!$content) {
return false;
}
$json = json_decode($content, true);
if (!is_array($json))
@ -663,10 +682,14 @@ class Probe {
* @return array hcard data
*/
private function poll_hcard($hcard, $data, $dfrn = false) {
$content = fetch_url($hcard);
if (!$content)
$ret = z_fetch_url($hcard);
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return false;
}
$content = $ret['body'];
if (!$content) {
return false;
}
$doc = new DOMDocument();
if (!@$doc->loadHTML($content))
@ -859,8 +882,13 @@ class Probe {
$pubkey = substr($pubkey, strpos($pubkey, ',') + 1);
else
$pubkey = substr($pubkey, 5);
} elseif (normalise_link($pubkey) == 'http://')
$pubkey = fetch_url($pubkey);
} elseif (normalise_link($pubkey) == 'http://') {
$ret = z_fetch_url($pubkey);
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return false;
}
$pubkey = $ret['body'];
}
$key = explode(".", $pubkey);
@ -880,7 +908,11 @@ class Probe {
return false;
// Fetch all additional data from the feed
$feed = fetch_url($data["poll"]);
$ret = z_fetch_url($data["poll"]);
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return false;
}
$feed = $ret['body'];
$feed_data = feed_import($feed,$dummy1,$dummy2, $dummy3, true);
if (!$feed_data)
return false;
@ -1035,7 +1067,11 @@ class Probe {
* @return array feed data
*/
private function feed($url, $probe = true) {
$feed = fetch_url($url);
$ret = z_fetch_url($url);
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return false;
}
$feed = $ret['body'];
$feed_data = feed_import($feed, $dummy1, $dummy2, $dummy3, true);
if (!$feed_data) {

View file

@ -1686,7 +1686,6 @@ use \Friendica\Core\Config;
);
if ($r[0]['body'] != "") {
if (!intval(get_config('system','old_share'))) {
if (strpos($r[0]['body'], "[/share]") !== false) {
$pos = strpos($r[0]['body'], "[share");
$post = substr($r[0]['body'], $pos);
@ -1697,9 +1696,6 @@ use \Friendica\Core\Config;
$post .= "[/share]";
}
$_REQUEST['body'] = $post;
} else
$_REQUEST['body'] = html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8')."[url=".$r[0]['reply_url']."]".$r[0]['reply_author']."[/url] \n".$r[0]['body'];
$_REQUEST['profile_uid'] = api_user();
$_REQUEST['type'] = 'wall';
$_REQUEST['api_source'] = true;

View file

@ -39,9 +39,9 @@ function diaspora2bb($s) {
$s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
// Handles single newlines
$s = str_replace("\r", '<br>', $s);
$s = str_replace("\r\n", "\n", $s);
$s = str_replace("\n", " \n", $s);
$s = str_replace("\r", " \n", $s);
// Replace lonely stars in lines not starting with it with literal stars
$s = preg_replace('/^([^\*]+)\*([^\*]*)$/im', '$1\*$2', $s);

View file

@ -1163,8 +1163,10 @@ function bbcode($Text,$preserve_nl = false, $tryoembed = true, $simplehtml = fal
// fix any escaped ampersands that may have been converted into links
$Text = preg_replace('/\<([^>]*?)(src|href)=(.*?)\&amp\;(.*?)\>/ism', '<$1$2=$3&$4>', $Text);
// sanitizes src attributes (only relative redir URIs or http URLs)
$Text = preg_replace('#<([^>]*?)(src)="(?!http|redir)(.*?)"(.*?)>#ism', '<$1$2=""$4 class="invalid-src" title="' . t('Invalid source protocol') . '">', $Text);
// sanitizes src attributes (http and redir URLs for displaying in a web page, cid used for inline images in emails)
static $allowed_src_protocols = array('http', 'redir', 'cid');
$Text = preg_replace('#<([^>]*?)(src)="(?!' . implode('|', $allowed_src_protocols) . ')(.*?)"(.*?)>#ism',
'<$1$2=""$4 class="invalid-src" title="' . t('Invalid source protocol') . '">', $Text);
// sanitize href attributes (only whitelisted protocols URLs)
// default value for backward compatibility

View file

@ -416,8 +416,8 @@ These Fields are not added below (yet). They are here to for bug search.
`item`.`shadow`,
*/
return "`item`.`author-link`, `item`.`author-name`, `item`.`author-avatar`,
`item`.`owner-link`, `item`.`owner-name`, `item`.`owner-avatar`,
return "`item`.`author-id`, `item`.`author-link`, `item`.`author-name`, `item`.`author-avatar`,
`item`.`owner-id`, `item`.`owner-link`, `item`.`owner-name`, `item`.`owner-avatar`,
`item`.`contact-id`, `item`.`uid`, `item`.`id`, `item`.`parent`,
`item`.`uri`, `item`.`thr-parent`, `item`.`parent-uri`,
`item`.`commented`, `item`.`created`, `item`.`edited`,
@ -1066,8 +1066,9 @@ function builtin_activity_puller($item, &$conv_responses) {
else
$conv_responses[$mode][$item['thr-parent']] ++;
if((local_user()) && (local_user() == $item['uid']) && ($item['self']))
if (public_contact() == $item['author-id']) {
$conv_responses[$mode][$item['thr-parent'] . '-self'] = 1;
}
$conv_responses[$mode][$item['thr-parent'] . '-l'][] = $url;

View file

@ -242,7 +242,7 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
if (!isset($database[$name]["fields"][$fieldname])) {
$sql2=db_add_table_field($fieldname, $parameters);
if ($sql3 == "") {
$sql3 = "ALTER TABLE `".$temp_name."` ".$sql2;
$sql3 = "ALTER" . $ignore . " TABLE `".$temp_name."` ".$sql2;
} else {
$sql3 .= ", ".$sql2;
}
@ -253,7 +253,7 @@ function update_structure($verbose, $action, $tables=null, $definition=null) {
if ($current_field_definition != $new_field_definition) {
$sql2=db_modify_table_field($fieldname, $parameters);
if ($sql3 == "") {
$sql3 = "ALTER TABLE `".$temp_name."` ".$sql2;
$sql3 = "ALTER" . $ignore . " TABLE `".$temp_name."` ".$sql2;
} else {
$sql3 .= ", ".$sql2;
}
@ -1526,6 +1526,7 @@ function db_definition($charset) {
"uid_contactid_created" => array("uid","contact-id","created"),
"uid_created" => array("uid","created"),
"uid_commented" => array("uid","commented"),
"uid_wall_created" => array("uid","wall","created"),
)
);
$database["tokens"] = array(

View file

@ -398,7 +398,7 @@ function delivery_run(&$argv, &$argc){
logger('notifier: dfrn_delivery to '.$contact["url"].' with guid '.$target_item["guid"].' returns '.$deliver_status);
if ($deliver_status == (-1)) {
if ($deliver_status < 0) {
logger('notifier: delivery failed: queuing message');
add_to_queue($contact['id'],NETWORK_DFRN,$atom);

View file

@ -391,7 +391,7 @@ class dfrn {
*
* @return object XML root object
*/
private function add_header($doc, $owner, $authorelement, $alternatelink = "", $public = false) {
private static function add_header($doc, $owner, $authorelement, $alternatelink = "", $public = false) {
if ($alternatelink == "")
$alternatelink = $owner['url'];
@ -462,7 +462,7 @@ class dfrn {
*
* @return object XML author object
*/
private function add_author($doc, $owner, $authorelement, $public) {
private static function add_author($doc, $owner, $authorelement, $public) {
// Is the profile hidden or shouldn't be published in the net? Then add the "hide" element
$r = q("SELECT `id` FROM `profile` INNER JOIN `user` ON `user`.`uid` = `profile`.`uid`
@ -591,7 +591,7 @@ class dfrn {
*
* @return object XML author object
*/
private function add_entry_author($doc, $element, $contact_url, $item) {
private static function add_entry_author($doc, $element, $contact_url, $item) {
$contact = get_contact_details_by_url($contact_url, $item["uid"]);
@ -631,7 +631,7 @@ class dfrn {
*
* @return object XML activity object
*/
private function create_activity($doc, $element, $activity) {
private static function create_activity($doc, $element, $activity) {
if($activity) {
$entry = $doc->createElement($element);
@ -685,7 +685,7 @@ class dfrn {
*
* @return object XML attachment object
*/
private function get_attachment($doc, $root, $item) {
private static function get_attachment($doc, $root, $item) {
$arr = explode('[/attach],',$item['attach']);
if(count($arr)) {
foreach($arr as $r) {
@ -720,7 +720,7 @@ class dfrn {
*
* @return object XML entry object
*/
private function entry($doc, $type, $item, $owner, $comment = false, $cid = 0) {
private static function entry($doc, $type, $item, $owner, $comment = false, $cid = 0) {
$mentioned = array();
@ -913,11 +913,18 @@ class dfrn {
logger('dfrn_deliver: ' . $url);
$xml = fetch_url($url);
$ret = z_fetch_url($url);
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return -2; // timed out
}
$xml = $ret['body'];
$curl_stat = $a->get_curl_code();
if(! $curl_stat)
return(-1); // timed out
if (!$curl_stat) {
return -3; // timed out
}
logger('dfrn_deliver: ' . $xml, LOGGER_DATA);
@ -1017,24 +1024,24 @@ class dfrn {
$key = Crypto::createNewRandomKey();
} catch (CryptoTestFailed $ex) {
logger('Cannot safely create a key');
return -1;
return -4;
} catch (CannotPerformOperation $ex) {
logger('Cannot safely create a key');
return -1;
return -5;
}
try {
$data = Crypto::encrypt($postvars['data'], $key);
} catch (CryptoTestFailed $ex) {
logger('Cannot safely perform encryption');
return -1;
return -6;
} catch (CannotPerformOperation $ex) {
logger('Cannot safely perform encryption');
return -1;
return -7;
}
break;
default:
logger("rino: invalid requested verision '$rino_remote_version'");
return -1;
return -8;
}
$postvars['rino'] = $rino_remote_version;
@ -1073,11 +1080,13 @@ class dfrn {
logger('dfrn_deliver: ' . "RECEIVED: " . $xml, LOGGER_DATA);
$curl_stat = $a->get_curl_code();
if((! $curl_stat) || (! strlen($xml)))
return(-1); // timed out
if ((!$curl_stat) || (!strlen($xml))) {
return -9; // timed out
}
if(($curl_stat == 503) && (stristr($a->get_curl_headers(),'retry-after')))
return(-1);
if (($curl_stat == 503) && (stristr($a->get_curl_headers(),'retry-after'))) {
return -10;
}
if(strpos($xml,'<?xml') === false) {
logger('dfrn_deliver: phase 2: no valid XML returned');
@ -1103,7 +1112,7 @@ class dfrn {
* @param string $birthday Birthday of the contact
*
*/
private function birthday_event($contact, $birthday) {
private static function birthday_event($contact, $birthday) {
// Check for duplicates
$r = q("SELECT `id` FROM `event` WHERE `uid` = %d AND `cid` = %d AND `start` = '%s' AND `type` = '%s' LIMIT 1",
@ -1146,7 +1155,7 @@ class dfrn {
*
* @return Returns an array with relevant data of the author
*/
private function fetchauthor($xpath, $context, $importer, $element, $onlyfetch, $xml = "") {
private static function fetchauthor($xpath, $context, $importer, $element, $onlyfetch, $xml = "") {
$author = array();
$author["name"] = $xpath->evaluate($element."/atom:name/text()", $context)->item(0)->nodeValue;
@ -1358,7 +1367,7 @@ class dfrn {
*
* @return string XML string
*/
private function transform_activity($xpath, $activity, $element) {
private static function transform_activity($xpath, $activity, $element) {
if (!is_object($activity))
return "";
@ -1403,7 +1412,7 @@ class dfrn {
* @param object $mail mail elements
* @param array $importer Record of the importer user mixed with contact of the content
*/
private function process_mail($xpath, $mail, $importer) {
private static function process_mail($xpath, $mail, $importer) {
logger("Processing mails");
@ -1454,7 +1463,7 @@ class dfrn {
* @param object $suggestion suggestion elements
* @param array $importer Record of the importer user mixed with contact of the content
*/
private function process_suggestion($xpath, $suggestion, $importer) {
private static function process_suggestion($xpath, $suggestion, $importer) {
$a = get_app();
logger("Processing suggestions");
@ -1556,7 +1565,7 @@ class dfrn {
* @param object $relocation relocation elements
* @param array $importer Record of the importer user mixed with contact of the content
*/
private function process_relocation($xpath, $relocation, $importer) {
private static function process_relocation($xpath, $relocation, $importer) {
logger("Processing relocations");
@ -1685,7 +1694,7 @@ class dfrn {
* @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?
*/
private function update_content($current, $item, $importer, $entrytype) {
private static function update_content($current, $item, $importer, $entrytype) {
$changed = false;
if (edited_timestamp_is_newer($current, $item)) {
@ -1737,7 +1746,7 @@ class dfrn {
*
* @return int Is it a toplevel entry, a comment or a relayed comment?
*/
private function get_entry_type($importer, $item) {
private static function get_entry_type($importer, $item) {
if ($item["parent-uri"] != $item["uri"]) {
$community = false;
@ -1803,7 +1812,7 @@ class dfrn {
* @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
*/
private function do_poke($item, $importer, $posted_id) {
private static function do_poke($item, $importer, $posted_id) {
$verb = urldecode(substr($item["verb"],strpos($item["verb"], "#")+1));
if(!$verb)
return;
@ -1858,7 +1867,7 @@ class dfrn {
*
* @return bool Should the processing of the entries be continued?
*/
private function process_verbs($entrytype, $importer, &$item, &$is_like) {
private static function process_verbs($entrytype, $importer, &$item, &$is_like) {
logger("Process verb ".$item["verb"]." and object-type ".$item["object-type"]." for entrytype ".$entrytype, LOGGER_DEBUG);
@ -1958,7 +1967,7 @@ class dfrn {
* @param object $links link elements
* @param array $item the item record
*/
private function parse_links($links, &$item) {
private static function parse_links($links, &$item) {
$rel = "";
$href = "";
$type = "";
@ -2001,7 +2010,7 @@ class dfrn {
* @param object $entry entry elements
* @param array $importer Record of the importer user mixed with contact of the content
*/
private function process_entry($header, $xpath, $entry, $importer) {
private static function process_entry($header, $xpath, $entry, $importer) {
logger("Processing entries");
@ -2010,6 +2019,20 @@ class dfrn {
// Get the uri
$item["uri"] = $xpath->query("atom:id/text()", $entry)->item(0)->nodeValue;
$item["edited"] = $xpath->query("atom:updated/text()", $entry)->item(0)->nodeValue;
$current = q("SELECT `id`, `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item["uri"]),
intval($importer["importer_uid"])
);
// Is there an existing item?
if (dbm::is_result($current) AND edited_timestamp_is_newer($current[0], $item) AND
(datetime_convert("UTC","UTC",$item["edited"]) < $current[0]["edited"])) {
logger("Item ".$item["uri"]." already existed.", LOGGER_DEBUG);
return;
}
// Fetch the owner
$owner = self::fetchauthor($xpath, $entry, $importer, "dfrn:owner", true);
@ -2027,7 +2050,6 @@ class dfrn {
$item["title"] = $xpath->query("atom:title/text()", $entry)->item(0)->nodeValue;
$item["created"] = $xpath->query("atom:published/text()", $entry)->item(0)->nodeValue;
$item["edited"] = $xpath->query("atom:updated/text()", $entry)->item(0)->nodeValue;
$item["body"] = $xpath->query("dfrn:env/text()", $entry)->item(0)->nodeValue;
$item["body"] = str_replace(array(' ',"\t","\r","\n"), array('','','',''),$item["body"]);
@ -2215,18 +2237,13 @@ class dfrn {
}
}
$r = q("SELECT `id`, `uid`, `last-child`, `edited`, `body` FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
dbesc($item["uri"]),
intval($importer["importer_uid"])
);
if (!self::process_verbs($entrytype, $importer, $item, $is_like)) {
logger("Exiting because 'process_verbs' told us so", LOGGER_DEBUG);
return;
}
// Update content if 'updated' changes
if (dbm::is_result($r)) {
if (dbm::is_result($current)) {
if (self::update_content($r[0], $item, $importer, $entrytype))
logger("Item ".$item["uri"]." was updated.", LOGGER_DEBUG);
else
@ -2311,7 +2328,7 @@ class dfrn {
* @param object $deletion deletion elements
* @param array $importer Record of the importer user mixed with contact of the content
*/
private function process_deletion($xpath, $deletion, $importer) {
private static function process_deletion($xpath, $deletion, $importer) {
logger("Processing deletions");

View file

@ -186,6 +186,10 @@ function discover_directory($search) {
*/
function gs_search_user($search) {
// Currently disabled, since the service isn't available anymore.
// It is not removed since I hope that there will be a successor.
return false;
$a = get_app();
$url = "http://gstools.org/api/users_search/".urlencode($search);

View file

@ -177,18 +177,6 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
foreach (array_reverse($entrylist) AS $entry) {
$item = array_merge($header, $author);
$item["title"] = $xpath->evaluate('atom:title/text()', $entry)->item(0)->nodeValue;
if ($item["title"] == "")
$item["title"] = $xpath->evaluate('title/text()', $entry)->item(0)->nodeValue;
if ($item["title"] == "")
$item["title"] = $xpath->evaluate('rss:title/text()', $entry)->item(0)->nodeValue;
$alternate = $xpath->query("atom:link[@rel='alternate']", $entry)->item(0)->attributes;
if (!is_object($alternate))
$alternate = $xpath->query("atom:link", $entry)->item(0)->attributes;
if (is_object($alternate))
foreach($alternate AS $attributes)
if ($attributes->name == "href")
@ -212,6 +200,27 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
$item["parent-uri"] = $item["uri"];
if (!$simulate) {
$r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s', '%s')",
intval($importer["uid"]), dbesc($item["uri"]), dbesc(NETWORK_FEED), dbesc(NETWORK_DFRN));
if ($r) {
logger("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already existed under id ".$r[0]["id"], LOGGER_DEBUG);
continue;
}
}
$item["title"] = $xpath->evaluate('atom:title/text()', $entry)->item(0)->nodeValue;
if ($item["title"] == "")
$item["title"] = $xpath->evaluate('title/text()', $entry)->item(0)->nodeValue;
if ($item["title"] == "")
$item["title"] = $xpath->evaluate('rss:title/text()', $entry)->item(0)->nodeValue;
$alternate = $xpath->query("atom:link[@rel='alternate']", $entry)->item(0)->attributes;
if (!is_object($alternate))
$alternate = $xpath->query("atom:link", $entry)->item(0)->attributes;
$published = $xpath->query('atom:published/text()', $entry)->item(0)->nodeValue;
if ($published == "")
@ -250,15 +259,6 @@ function feed_import($xml,$importer,&$contact, &$hub, $simulate = false) {
if ($creator != "")
$item["author-name"] = $creator;
if (!$simulate) {
$r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `network` IN ('%s', '%s')",
intval($importer["uid"]), dbesc($item["uri"]), dbesc(NETWORK_FEED), dbesc(NETWORK_DFRN));
if ($r) {
logger("Item with uri ".$item["uri"]." for user ".$importer["uid"]." already existed under id ".$r[0]["id"], LOGGER_DEBUG);
continue;
}
}
/// @TODO ?
// <category>Ausland</category>
// <media:thumbnail width="152" height="76" url="http://www.taz.de/picture/667875/192/14388767.jpg"/>

View file

@ -24,149 +24,163 @@ function do_like($item_id, $verb) {
switch ($verb) {
case 'like':
$bodyverb = t('%1$s likes %2$s\'s %3$s');
$activity = ACTIVITY_LIKE;
break;
case 'unlike':
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
$activity = ACTIVITY_LIKE;
break;
case 'dislike':
case 'undislike':
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
$activity = ACTIVITY_DISLIKE;
break;
case 'attendyes':
case 'unattendyes':
$bodyverb = t('%1$s is attending %2$s\'s %3$s');
$activity = ACTIVITY_ATTEND;
break;
case 'attendno':
case 'unattendno':
$bodyverb = t('%1$s is not attending %2$s\'s %3$s');
$activity = ACTIVITY_ATTENDNO;
break;
case 'attendmaybe':
case 'unattendmaybe':
$bodyverb = t('%1$s may attend %2$s\'s %3$s');
$activity = ACTIVITY_ATTENDMAYBE;
break;
default:
logger('like: unknown verb ' . $verb . ' for item ' . $item_id);
return false;
break;
}
// Enable activity toggling instead of on/off
$event_verb_flag = $activity === ACTIVITY_ATTEND || $activity === ACTIVITY_ATTENDNO || $activity === ACTIVITY_ATTENDMAYBE;
logger('like: verb ' . $verb . ' item ' . $item_id);
$r = q("SELECT * FROM `item` WHERE `id` = '%s' OR `uri` = '%s' LIMIT 1",
// Retrieve item
$items = q("SELECT * FROM `item` WHERE `id` = '%s' OR `uri` = '%s' LIMIT 1",
dbesc($item_id),
dbesc($item_id)
);
if(! $item_id || (! dbm::is_result($r))) {
logger('like: no item ' . $item_id);
if (! $item_id || ! dbm::is_result($items)) {
logger('like: unknown item ' . $item_id);
return false;
}
$item = $r[0];
$item = $items[0];
$owner_uid = $item['uid'];
if (! can_write_wall($a,$owner_uid)) {
if (! can_write_wall($a, $item['uid'])) {
logger('like: unable to write on wall ' . $item['uid']);
return false;
}
$remote_owner = null;
if(! $item['wall']) {
// The top level post may have been written by somebody on another system
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($item['contact-id']),
// Retrieves the local post owner
$owners = q("SELECT `contact`.* FROM `contact`
WHERE `contact`.`self` = 1
AND `contact`.`uid` = %d",
intval($item['uid'])
);
if (! dbm::is_result($r)) {
return false;
}
if (! $r[0]['self']) {
$remote_owner = $r[0];
}
}
// this represents the post owner on this system.
$r = q("SELECT `contact`.*, `user`.`nickname` FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
WHERE `contact`.`self` = 1 AND `contact`.`uid` = %d LIMIT 1",
intval($owner_uid)
);
if (dbm::is_result($r)) {
$owner = $r[0];
}
if (! $owner) {
logger('like: no owner');
return false;
}
if (! $remote_owner) {
$remote_owner = $owner;
}
// This represents the person posting
if ((local_user()) && (local_user() == $owner_uid)) {
$contact = $owner;
if (dbm::is_result($owners)) {
$owner_self_contact = $owners[0];
} else {
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($_SESSION['visitor_id']),
intval($owner_uid)
);
if (dbm::is_result($r)) {
$contact = $r[0];
}
}
if (! $contact) {
logger('like: unknown owner ' . $item['uid']);
return false;
}
// Retrieve the current logged in user's public contact
$author_id = public_contact();
$verbs = " '".dbesc($activity)."' ";
$contacts = q("SELECT * FROM `contact` WHERE `id` = %d",
intval($author_id)
);
if (dbm::is_result($contacts)) {
$author_contact = $contacts[0];
} else {
logger('like: unknown author ' . $author_id);
return false;
}
// Contact-id is the uid-dependant author contact
if (local_user() == $item['uid']) {
$item_contact_id = $owner_self_contact['id'];
$item_contact = $owner_self_contact;
} else {
$item_contact_id = get_contact($author_contact['url'], $item['uid']);
$contacts = q("SELECT * FROM `contact` WHERE `id` = %d",
intval($item_contact_id)
);
if (dbm::is_result($contacts)) {
$item_contact = $contacts[0];
} else {
logger('like: unknown item contact ' . $item_contact_id);
return false;
}
}
// Look for an existing verb row
// event participation are essentially radio toggles. If you make a subsequent choice,
// we need to eradicate your first choice.
if ($activity === ACTIVITY_ATTEND || $activity === ACTIVITY_ATTENDNO || $activity === ACTIVITY_ATTENDMAYBE) {
if ($event_verb_flag) {
$verbs = "'" . dbesc(ACTIVITY_ATTEND) . "', '" . dbesc(ACTIVITY_ATTENDNO) . "', '" . dbesc(ACTIVITY_ATTENDMAYBE) . "'";
} else {
$verbs = "'".dbesc($activity)."'";
}
$r = q("SELECT `id`, `guid` FROM `item` WHERE `verb` IN ( $verbs ) AND `deleted` = 0
AND `contact-id` = %d AND `uid` = %d
AND (`parent` = '%s' OR `parent-uri` = '%s' OR `thr-parent` = '%s') LIMIT 1",
intval($contact['id']), intval($owner_uid),
$existing_like = q("SELECT `id`, `guid`, `verb` FROM `item`
WHERE `verb` IN ($verbs)
AND `deleted` = 0
AND `author-id` = %d
AND `uid` = %d
AND (`parent` = '%s' OR `parent-uri` = '%s' OR `thr-parent` = '%s')
LIMIT 1",
intval($author_contact['id']),
intval($item['uid']),
dbesc($item_id), dbesc($item_id), dbesc($item['uri'])
);
if (dbm::is_result($r)) {
$like_item = $r[0];
// If it exists, mark it as deleted
if (dbm::is_result($existing_like)) {
$like_item = $existing_like[0];
// Already voted, undo it
$r = q("UPDATE `item` SET `deleted` = 1, `unseen` = 1, `changed` = '%s' WHERE `id` = %d",
q("UPDATE `item` SET `deleted` = 1, `unseen` = 1, `changed` = '%s' WHERE `id` = %d",
dbesc(datetime_convert()),
intval($like_item['id'])
);
// 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
$r = q("DELETE FROM `sign` WHERE `iid` = %d",
q("DELETE FROM `sign` WHERE `iid` = %d",
intval($like_item['id'])
);
$like_item_id = $like_item['id'];
proc_run(PRIORITY_HIGH, "include/notifier.php", "like", $like_item_id);
if (!$event_verb_flag || $like_item['verb'] == $activity) {
return true;
}
}
// Verb is "un-something", just trying to delete existing entries
if (strpos($verb, 'un') === 0) {
return true;
}
$uri = item_new_uri($a->get_hostname(),$owner_uid);
// Else or if event verb different from existing row, create a new item row
$post_type = (($item['resource-id']) ? t('photo') : t('status'));
if ($item['object-type'] === ACTIVITY_OBJ_EVENT) {
$post_type = t('event');
}
$objtype = (($item['resource-id']) ? ACTIVITY_OBJ_IMAGE : ACTIVITY_OBJ_NOTE );
$link = xmlify('<link rel="alternate" type="text/html" href="' . App::get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . '" />' . "\n") ;
$objtype = $item['resource-id'] ? ACTIVITY_OBJ_IMAGE : ACTIVITY_OBJ_NOTE ;
$link = xmlify('<link rel="alternate" type="text/html" href="' . App::get_baseurl() . '/display/' . $owner_self_contact['nick'] . '/' . $item['id'] . '" />' . "\n") ;
$body = $item['body'];
$obj = <<< EOT
@ -180,80 +194,62 @@ function do_like($item_id, $verb) {
<content>$body</content>
</object>
EOT;
if ($verb === 'like') {
$bodyverb = t('%1$s likes %2$s\'s %3$s');
}
if ($verb === 'dislike') {
$bodyverb = t('%1$s doesn\'t like %2$s\'s %3$s');
}
if ($verb === 'attendyes') {
$bodyverb = t('%1$s is attending %2$s\'s %3$s');
}
if ($verb === 'attendno') {
$bodyverb = t('%1$s is not attending %2$s\'s %3$s');
}
if ($verb === 'attendmaybe') {
$bodyverb = t('%1$s may attend %2$s\'s %3$s');
}
if (! isset($bodyverb)) {
return false;
}
$ulink = '[url=' . $contact['url'] . ']' . $contact['name'] . '[/url]';
$ulink = '[url=' . $author_contact['url'] . ']' . $author_contact['name'] . '[/url]';
$alink = '[url=' . $item['author-link'] . ']' . $item['author-name'] . '[/url]';
$plink = '[url=' . App::get_baseurl() . '/display/' . $owner['nickname'] . '/' . $item['id'] . ']' . $post_type . '[/url]';
$plink = '[url=' . App::get_baseurl() . '/display/' . $owner_self_contact['nick'] . '/' . $item['id'] . ']' . $post_type . '[/url]';
/// @TODO Or rewrite this to multi-line initialization of the array?
$arr = array();
$new_item = array(
'guid' => get_guid(32),
'uri' => item_new_uri($a->get_hostname(), $item['uid']),
'uid' => $item['uid'],
'contact-id' => $item_contact_id,
'type' => 'activity',
'wall' => $item['wall'],
'origin' => 1,
'gravity' => GRAVITY_LIKE,
'parent' => $item['id'],
'parent-uri' => $item['uri'],
'thr-parent' => $item['uri'],
'owner-id' => $item['owner-id'],
'owner-name' => $item['owner-name'],
'owner-link' => $item['owner-link'],
'owner-avatar' => $item['owner-avatar'],
'author-id' => $author_contact['id'],
'author-name' => $author_contact['name'],
'author-link' => $author_contact['url'],
'author-avatar' => $author_contact['thumb'],
'body' => sprintf($bodyverb, $ulink, $alink, $plink),
'verb' => $activity,
'object-type' => $objtype,
'object' => $obj,
'allow_cid' => $item['allow_cid'],
'allow_gid' => $item['allow_gid'],
'deny_cid' => $item['deny_cid'],
'deny_gid' => $item['deny_gid'],
'visible' => 1,
'unseen' => 1,
'last-child' => 0
);
$arr['guid'] = get_guid(32);
$arr['uri'] = $uri;
$arr['uid'] = $owner_uid;
$arr['contact-id'] = $contact['id'];
$arr['type'] = 'activity';
$arr['wall'] = $item['wall'];
$arr['origin'] = 1;
$arr['gravity'] = GRAVITY_LIKE;
$arr['parent'] = $item['id'];
$arr['parent-uri'] = $item['uri'];
$arr['thr-parent'] = $item['uri'];
$arr['owner-name'] = $remote_owner['name'];
$arr['owner-link'] = $remote_owner['url'];
$arr['owner-avatar'] = $remote_owner['thumb'];
$arr['author-name'] = $contact['name'];
$arr['author-link'] = $contact['url'];
$arr['author-avatar'] = $contact['thumb'];
$arr['body'] = sprintf( $bodyverb, $ulink, $alink, $plink );
$arr['verb'] = $activity;
$arr['object-type'] = $objtype;
$arr['object'] = $obj;
$arr['allow_cid'] = $item['allow_cid'];
$arr['allow_gid'] = $item['allow_gid'];
$arr['deny_cid'] = $item['deny_cid'];
$arr['deny_gid'] = $item['deny_gid'];
$arr['visible'] = 1;
$arr['unseen'] = 1;
$arr['last-child'] = 0;
$post_id = item_store($arr);
$new_item_id = item_store($new_item);
// @todo: Explain this block
if (! $item['visible']) {
$r = q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d AND `uid` = %d",
q("UPDATE `item` SET `visible` = 1 WHERE `id` = %d AND `uid` = %d",
intval($item['id']),
intval($owner_uid)
intval($item['uid'])
);
}
// Save the author information for the like in case we need to relay to Diaspora
Diaspora::store_like_signature($contact, $post_id);
Diaspora::store_like_signature($item_contact, $new_item_id);
$arr['id'] = $post_id;
$new_item['id'] = $new_item_id;
call_hooks('post_local_end', $arr);
call_hooks('post_local_end', $new_item);
proc_run(PRIORITY_HIGH, "include/notifier.php", "like", $post_id);
proc_run(PRIORITY_HIGH, "include/notifier.php", "like", $new_item_id);
return true;
}

View file

@ -118,7 +118,9 @@ function z_fetch_url($url,$binary = false, &$redirects = 0, $opts=array()) {
$check_cert = get_config('system','verifyssl');
@curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
@curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, (($check_cert) ? 2 : false));
if ($check_cert) {
@curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
}
$prx = get_config('system','proxy');
if(strlen($prx)) {
@ -141,6 +143,8 @@ function z_fetch_url($url,$binary = false, &$redirects = 0, $opts=array()) {
logger('fetch_url error fetching '.$url.': '.curl_error($ch), LOGGER_NORMAL);
}
$ret['errno'] = curl_errno($ch);
$base = $s;
$curl_info = @curl_getinfo($ch);
@ -265,7 +269,9 @@ function post_url($url,$params, $headers = null, &$redirects = 0, $timeout = 0)
$check_cert = get_config('system','verifyssl');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (($check_cert) ? true : false));
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, (($check_cert) ? 2 : false));
if ($check_cert) {
@curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
}
$prx = get_config('system','proxy');
if(strlen($prx)) {
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 1);

View file

@ -48,11 +48,13 @@ function onepoll_run(&$argv, &$argc){
$force = false;
$restart = false;
if(($argc > 1) && (intval($argv[1])))
if (($argc > 1) && (intval($argv[1]))) {
$contact_id = intval($argv[1]);
}
if(($argc > 2) && ($argv[2] == "force"))
if (($argc > 2) && ($argv[2] == "force")) {
$force = true;
}
if (! $contact_id) {
logger('onepoll: no contact');
@ -60,9 +62,11 @@ function onepoll_run(&$argv, &$argc){
}
// Don't check this stuff if the function is called by the poller
if (App::callstack() != "poller_run")
if (App::is_already_running('onepoll'.$contact_id, '', 540))
if (App::callstack() != "poller_run") {
if (App::is_already_running('onepoll'.$contact_id, '', 540)) {
return;
}
}
$d = datetime_convert();
@ -83,8 +87,9 @@ function onepoll_run(&$argv, &$argc){
intval($contact_id)
);
if(! count($contacts))
if (! count($contacts)) {
return;
}
$contact = $contacts[0];
@ -94,10 +99,12 @@ function onepoll_run(&$argv, &$argc){
where `cid` = %d and updated > UTC_TIMESTAMP() - INTERVAL 1 DAY",
intval($contact['id'])
);
if (dbm::is_result($r))
if (!$r[0]['total'])
if (dbm::is_result($r)) {
if (!$r[0]['total']) {
poco_load($contact['id'],$importer_uid,0,$contact['poco']);
}
}
}
/// @TODO Check why we don't poll the Diaspora feed at the moment (some guid problem in the items?)
/// @TODO Check whether this is possible with Redmatrix
@ -132,12 +139,12 @@ function onepoll_run(&$argv, &$argc){
$contact['priority'] = (($poll_interval !== false) ? intval($poll_interval) : 3);
$hub_update = false;
if(datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day"))
if (datetime_convert('UTC','UTC', 'now') > datetime_convert('UTC','UTC', $t . " + 1 day")) {
$hub_update = true;
}
else
} else {
$hub_update = false;
}
$importer_uid = $contact['uid'];
@ -167,34 +174,44 @@ function onepoll_run(&$argv, &$argc){
if (!update_contact($contact["id"])) {
mark_for_death($contact);
return;
} else
} else {
unmark_for_death($contact);
}
}
if ($contact['network'] === NETWORK_DFRN) {
$idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
if(intval($contact['duplex']) && $contact['dfrn-id'])
if (intval($contact['duplex']) && $contact['dfrn-id']) {
$idtosend = '0:' . $orig_id;
if(intval($contact['duplex']) && $contact['issued-id'])
}
if (intval($contact['duplex']) && $contact['issued-id']) {
$idtosend = '1:' . $orig_id;
}
// they have permission to write to us. We already filtered this in the contact query.
$perm = 'rw';
// But this may be our first communication, so set the writable flag if it isn't set already.
if(! intval($contact['writable']))
if (! intval($contact['writable'])) {
q("update contact set writable = 1 where id = %d", intval($contact['id']));
}
$url = $contact['poll'] . '?dfrn_id=' . $idtosend
. '&dfrn_version=' . DFRN_PROTOCOL_VERSION
. '&type=data&last_update=' . $last_update
. '&perm=' . $perm ;
$handshake_xml = fetch_url($url);
$ret = z_fetch_url($url);
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return;
}
$handshake_xml = $ret['body'];
$html_code = $a->get_curl_code();
logger('onepoll: handshake with url ' . $url . ' returns xml: ' . $handshake_xml, LOGGER_DATA);
@ -248,16 +265,14 @@ function onepoll_run(&$argv, &$argc){
intval($contact['id'])
);
mark_for_death($contact);
}
else {
if($contact['term-date'] != '0000-00-00 00:00:00') {
} elseif ($contact['term-date'] != '0000-00-00 00:00:00') {
logger("poller: $url back from the dead - removing mark for death");
unmark_for_death($contact);
}
}
if((intval($res->status) != 0) || (! strlen($res->challenge)) || (! strlen($res->dfrn_id)))
if ((intval($res->status) != 0) || (! strlen($res->challenge)) || (! strlen($res->dfrn_id))) {
return;
}
if (((float) $res->dfrn_version > 2.21) && ($contact['poco'] == '')) {
q("update contact set poco = '%s' where id = %d",
@ -276,16 +291,16 @@ function onepoll_run(&$argv, &$argc){
if (($contact['duplex']) && strlen($contact['prvkey'])) {
openssl_private_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['prvkey']);
openssl_private_decrypt($challenge,$postvars['challenge'],$contact['prvkey']);
}
else {
} else {
openssl_public_decrypt($sent_dfrn_id,$final_dfrn_id,$contact['pubkey']);
openssl_public_decrypt($challenge,$postvars['challenge'],$contact['pubkey']);
}
$final_dfrn_id = substr($final_dfrn_id, 0, strpos($final_dfrn_id, '.'));
if(strpos($final_dfrn_id,':') == 1)
if (strpos($final_dfrn_id,':') == 1) {
$final_dfrn_id = substr($final_dfrn_id,2);
}
if ($final_dfrn_id != $orig_id) {
logger('poller: ID did not decode: ' . $contact['id'] . ' orig: ' . $orig_id . ' final: ' . $final_dfrn_id);
@ -299,8 +314,7 @@ function onepoll_run(&$argv, &$argc){
$xml = post_url($contact['poll'],$postvars);
}
elseif(($contact['network'] === NETWORK_OSTATUS)
} elseif (($contact['network'] === NETWORK_OSTATUS)
|| ($contact['network'] === NETWORK_DIASPORA)
|| ($contact['network'] === NETWORK_FEED)) {
@ -311,8 +325,9 @@ function onepoll_run(&$argv, &$argc){
$stat_writeable = ((($contact['notify']) && ($contact['rel'] == CONTACT_IS_FOLLOWER || $contact['rel'] == CONTACT_IS_FRIEND)) ? 1 : 0);
// Contacts from OStatus are always writable
if($contact['network'] === NETWORK_OSTATUS)
if ($contact['network'] === NETWORK_OSTATUS) {
$stat_writeable = 1;
}
if ($stat_writeable != $contact['writable']) {
q("UPDATE `contact` SET `writable` = %d WHERE `id` = %d",
@ -323,14 +338,21 @@ function onepoll_run(&$argv, &$argc){
// Are we allowed to import from this person?
if($contact['rel'] == CONTACT_IS_FOLLOWER || $contact['blocked'] || $contact['readonly'])
if ($contact['rel'] == CONTACT_IS_FOLLOWER || $contact['blocked'] || $contact['readonly']) {
return;
}
$cookiejar = tempnam(get_temppath(), 'cookiejar-onepoll-');
$xml = fetch_url($contact['poll'], false, $redirects, 0, Null, $cookiejar);
unlink($cookiejar);
$ret = z_fetch_url($contact['poll'], false, $redirects, array('cookiejar' => $cookiejar));
if ($ret['errno'] == CURLE_OPERATION_TIMEDOUT) {
return;
}
elseif($contact['network'] === NETWORK_MAIL || $contact['network'] === NETWORK_MAIL2) {
$xml = $ret['body'];
unlink($cookiejar);
} elseif ($contact['network'] === NETWORK_MAIL || $contact['network'] === NETWORK_MAIL2) {
logger("Mail: Fetching", LOGGER_DEBUG);
@ -361,9 +383,10 @@ function onepoll_run(&$argv, &$argc){
intval($importer_uid)
);
logger("Mail: Connected to " . $mailconf[0]['user']);
} else
} else {
logger("Mail: Connection error ".$mailconf[0]['user']." ".print_r(imap_errors(), true));
}
}
if ($mbox) {
$msgs = email_poll($mbox,$contact['addr']);
@ -374,8 +397,7 @@ function onepoll_run(&$argv, &$argc){
$metas = email_msg_meta($mbox,implode(',',$msgs));
if (count($metas) != count($msgs)) {
logger("onepoll: for " . $mailconf[0]['user'] . " there are ". count($msgs) . " messages but received " . count($metas) . " metas", LOGGER_DEBUG);
}
else {
} else {
$msgs = array_combine($msgs, $metas);
foreach ($msgs as $msg_uid => $meta) {
@ -456,12 +478,13 @@ function onepoll_run(&$argv, &$argc){
// Decoding the header
$subject = imap_mime_header_decode($meta->subject);
$datarray['title'] = "";
foreach($subject as $subpart)
if ($subpart->charset != "default")
foreach ($subject as $subpart) {
if ($subpart->charset != "default") {
$datarray['title'] .= iconv($subpart->charset, 'UTF-8//IGNORE', $subpart->text);
else
} else {
$datarray['title'] .= $subpart->text;
}
}
$datarray['title'] = notags(trim($datarray['title']));
//$datarray['title'] = notags(trim($meta->subject));
@ -505,20 +528,23 @@ function onepoll_run(&$argv, &$argc){
if (! stristr($meta->from,$contact['addr'])) {
$from = imap_mime_header_decode($meta->from);
$fromdecoded = "";
foreach($from as $frompart)
if ($frompart->charset != "default")
foreach ($from as $frompart) {
if ($frompart->charset != "default") {
$fromdecoded .= iconv($frompart->charset, 'UTF-8//IGNORE', $frompart->text);
else
} else {
$fromdecoded .= $frompart->text;
}
}
$fromarr = imap_rfc822_parse_adrlist($fromdecoded, $a->get_hostname());
$frommail = $fromarr[0]->mailbox."@".$fromarr[0]->host;
if (isset($fromarr[0]->personal))
if (isset($fromarr[0]->personal)) {
$fromname = $fromarr[0]->personal;
else
} else {
$fromname = $frommail;
}
//$datarray['body'] = "[b]".t('From: ') . escape_tags($fromdecoded) . "[/b]\n\n" . $datarray['body'];
@ -574,14 +600,14 @@ function onepoll_run(&$argv, &$argc){
}
}
}
} else
} else {
logger("Mail: no mails for ".$mailconf[0]['user']);
}
logger("Mail: closing connection for ".$mailconf[0]['user']);
imap_close($mbox);
}
}
elseif($contact['network'] === NETWORK_FACEBOOK) {
} elseif ($contact['network'] === NETWORK_FACEBOOK) {
// This is picked up by the Facebook plugin on a cron hook.
// Ignored here.
} elseif ($contact['network'] === NETWORK_PUMPIO) {
@ -628,8 +654,9 @@ function onepoll_run(&$argv, &$argc){
if (count($hubs)) {
foreach ($hubs as $h) {
$h = trim($h);
if(! strlen($h))
if (! strlen($h)) {
continue;
}
subscribe_to_hub($h,$importer,$contact,$hubmode);
}
}

View file

@ -11,7 +11,6 @@ if (!file_exists("boot.php") AND (sizeof($_SERVER["argv"]) != 0)) {
}
use \Friendica\Core\Config;
use \Friendica\Core\PConfig;
require_once("boot.php");
@ -29,6 +28,8 @@ function poller_run($argv, $argc){
unset($db_host, $db_user, $db_pass, $db_data);
};
Config::load();
// Quit when in maintenance
if (Config::get('system', 'maintenance', true)) {
return;
@ -206,6 +207,16 @@ function poller_exec_function($queue, $funcname, $argv) {
$duration = number_format(microtime(true) - $stamp, 3);
if ($duration > 3600) {
logger("Prio ".$queue["priority"].": ".$queue["parameter"]." - longer than 1 hour (".round($duration/60, 3).")", LOGGER_DEBUG);
} elseif ($duration > 600) {
logger("Prio ".$queue["priority"].": ".$queue["parameter"]." - longer than 10 minutes (".round($duration/60, 3).")", LOGGER_DEBUG);
} elseif ($duration > 300) {
logger("Prio ".$queue["priority"].": ".$queue["parameter"]." - longer than 5 minutes (".round($duration/60, 3).")", LOGGER_DEBUG);
} elseif ($duration > 120) {
logger("Prio ".$queue["priority"].": ".$queue["parameter"]." - longer than 2 minutes (".round($duration/60, 3).")", LOGGER_DEBUG);
}
logger("Process ".$mypid." - Prio ".$queue["priority"]." - ID ".$queue["id"].": ".$funcname." - done in ".$duration." seconds.");
// Write down the performance values into the log

View file

@ -5,6 +5,7 @@ use \Friendica\Core\Config;
require_once("boot.php");
require_once('include/queue_fn.php');
require_once('include/dfrn.php');
require_once('include/cache.php');
function queue_run(&$argv, &$argc){
global $a, $db;
@ -37,14 +38,14 @@ function queue_run(&$argv, &$argc){
load_hooks();
if($argc > 1)
if ($argc > 1) {
$queue_id = intval($argv[1]);
else
} else {
$queue_id = 0;
}
$deadguys = array();
$deadservers = array();
$serverlist = array();
$cachekey_deadguy = 'queue_run:deadguy:';
$cachekey_server = 'queue_run:server:';
if (!$queue_id) {
@ -111,10 +112,10 @@ function queue_run(&$argv, &$argc){
// queue_predeliver hooks may have changed the queue db details,
// so check again if this entry still needs processing
if($queue_id)
if ($queue_id) {
$qi = q("SELECT * FROM `queue` WHERE `id` = %d LIMIT 1",
intval($queue_id));
elseif (get_config("system", "worker")) {
} elseif (get_config("system", "worker")) {
logger('Call queue for id '.$q_item['id']);
proc_run(PRIORITY_LOW, "include/queue.php", $q_item['id']);
continue;
@ -122,8 +123,9 @@ function queue_run(&$argv, &$argc){
$qi = q("SELECT * FROM `queue` WHERE `id` = %d AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ",
intval($q_item['id']));
if(! count($qi))
if (!dbm::is_result($qi)) {
continue;
}
$c = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
@ -133,7 +135,10 @@ function queue_run(&$argv, &$argc){
remove_queue_item($q_item['id']);
continue;
}
if(in_array($c[0]['notify'],$deadguys)) {
$dead = Cache::get($cachekey_deadguy.$c[0]['notify']);
if (!is_null($dead) AND $dead) {
logger('queue: skipping known dead url: '.$c[0]['notify']);
update_queue_time($q_item['id']);
continue;
@ -141,19 +146,22 @@ function queue_run(&$argv, &$argc){
$server = poco_detect_server($c[0]['url']);
if (($server != "") AND !in_array($server, $serverlist)) {
logger("Check server ".$server." (".$c[0]["network"].")");
if (!poco_check_server($server, $c[0]["network"], true))
$deadservers[] = $server;
if ($server != "") {
$vital = Cache::get($cachekey_server.$server);
$serverlist[] = $server;
if (is_null($vital)) {
logger("Check server ".$server." (".$c[0]["network"].")");
$vital = poco_check_server($server, $c[0]["network"], true);
Cache::set($cachekey_server.$server, $vital, CACHE_QUARTER_HOUR);
}
if (($server != "") AND in_array($server, $deadservers)) {
logger('queue: skipping known dead server: '.$server);
if (!is_null($vital) AND !$vital) {
logger('queue: skipping dead server: '.$server);
update_queue_time($q_item['id']);
continue;
}
}
$u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`
FROM `user` WHERE `uid` = %d LIMIT 1",
@ -176,12 +184,12 @@ function queue_run(&$argv, &$argc){
logger('queue: dfrndelivery: item '.$q_item['id'].' for '.$contact['name'].' <'.$contact['url'].'>');
$deliver_status = dfrn::deliver($owner,$contact,$data);
if($deliver_status == (-1)) {
if ($deliver_status < 0) {
update_queue_time($q_item['id']);
$deadguys[] = $contact['notify'];
} else
Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
} else {
remove_queue_item($q_item['id']);
}
break;
case NETWORK_OSTATUS:
if ($contact['notify']) {
@ -190,10 +198,11 @@ function queue_run(&$argv, &$argc){
if ($deliver_status == (-1)) {
update_queue_time($q_item['id']);
$deadguys[] = $contact['notify'];
} else
Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
} else {
remove_queue_item($q_item['id']);
}
}
break;
case NETWORK_DIASPORA:
if ($contact['notify']) {
@ -202,10 +211,10 @@ function queue_run(&$argv, &$argc){
if ($deliver_status == (-1)) {
update_queue_time($q_item['id']);
$deadguys[] = $contact['notify'];
} else
Cache::set($cachekey_deadguy.$contact['notify'], true, CACHE_QUARTER_HOUR);
} else {
remove_queue_item($q_item['id']);
}
}
break;
@ -213,15 +222,15 @@ function queue_run(&$argv, &$argc){
$params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
call_hooks('queue_deliver', $a, $params);
if($params['result'])
if ($params['result']) {
remove_queue_item($q_item['id']);
else
} else {
update_queue_time($q_item['id']);
}
break;
}
logger('Deliver status '.$deliver_status.' for item '.$q_item['id'].' to '.$contact['name'].' <'.$contact['url'].'>');
logger('Deliver status '.(int)$deliver_status.' for item '.$q_item['id'].' to '.$contact['name'].' <'.$contact['url'].'>');
}
return;

View file

@ -690,7 +690,7 @@ function poco_check_server($server_url, $network = "", $force = false) {
return false;
$servers = q("SELECT * FROM `gserver` WHERE `nurl` = '%s'", dbesc(normalise_link($server_url)));
if ($servers) {
if (dbm::is_result($servers)) {
if ($servers[0]["created"] == "0000-00-00 00:00:00")
q("UPDATE `gserver` SET `created` = '%s' WHERE `nurl` = '%s'",
@ -732,21 +732,40 @@ function poco_check_server($server_url, $network = "", $force = false) {
$orig_last_failure = $last_failure;
// Check if the page is accessible via SSL.
$orig_server_url = $server_url;
$server_url = str_replace("http://", "https://", $server_url);
$serverret = z_fetch_url($server_url."/.well-known/host-meta");
// We set the timeout to 20 seconds since this operation should be done in no time if the server was vital
$serverret = z_fetch_url($server_url."/.well-known/host-meta", false, $redirects, array('timeout' => 20));
// Quit if there is a timeout.
// But we want to make sure to only quit if we are mostly sure that this server url fits.
if (dbm::is_result($servers) AND ($orig_server_url == $server_url) AND
($serverret['errno'] == CURLE_OPERATION_TIMEDOUT)) {
logger("Connection to server ".$server_url." timed out.", LOGGER_DEBUG);
return false;
}
// Maybe the page is unencrypted only?
$xmlobj = @simplexml_load_string($serverret["body"],'SimpleXMLElement',0, "http://docs.oasis-open.org/ns/xri/xrd-1.0");
if (!$serverret["success"] OR ($serverret["body"] == "") OR (@sizeof($xmlobj) == 0) OR !is_object($xmlobj)) {
$server_url = str_replace("https://", "http://", $server_url);
$serverret = z_fetch_url($server_url."/.well-known/host-meta");
// We set the timeout to 20 seconds since this operation should be done in no time if the server was vital
$serverret = z_fetch_url($server_url."/.well-known/host-meta", false, $redirects, array('timeout' => 20));
// Quit if there is a timeout
if ($serverret['errno'] == CURLE_OPERATION_TIMEDOUT) {
logger("Connection to server ".$server_url." timed out.", LOGGER_DEBUG);
return false;
}
$xmlobj = @simplexml_load_string($serverret["body"],'SimpleXMLElement',0, "http://docs.oasis-open.org/ns/xri/xrd-1.0");
}
if (!$serverret["success"] OR ($serverret["body"] == "") OR (sizeof($xmlobj) == 0) OR !is_object($xmlobj)) {
// Workaround for bad configured servers (known nginx problem)
if ($serverret["debug"]["http_code"] != "403") {
if (!in_array($serverret["debug"]["http_code"], array("403", "404"))) {
$last_failure = datetime_convert();
$failure = true;
}
@ -1244,18 +1263,20 @@ function poco_discover_federation() {
poco_check_server("https://".$server->host);
}
// Discover GNU Social Servers
if (!get_config('system','ostatus_disabled')) {
$serverdata = "http://gstools.org/api/get_open_instances/";
// Currently disabled, since the service isn't available anymore.
// It is not removed since I hope that there will be a successor.
// Discover GNU Social Servers.
//if (!get_config('system','ostatus_disabled')) {
// $serverdata = "http://gstools.org/api/get_open_instances/";
$result = z_fetch_url($serverdata);
if ($result["success"]) {
$servers = json_decode($result["body"]);
// $result = z_fetch_url($serverdata);
// if ($result["success"]) {
// $servers = json_decode($result["body"]);
foreach($servers->data AS $server)
poco_check_server($server->instance_address);
}
}
// foreach($servers->data AS $server)
// poco_check_server($server->instance_address);
// }
//}
set_config('poco','last_federation_discovery', time());
}

View file

@ -268,12 +268,15 @@ function hex2bin($s) {
}}
if(! function_exists('paginate_data')) {
/**
* Automatica pagination data.
* @brief Paginator function. Pushes relevant links in a pager array structure.
*
* Links are generated depending on the current page and the total number of items.
* Inactive links (like "first" and "prev" on page 1) are given the "disabled" class.
* Current page link is given the "active" CSS class
*
* @param App $a App instance
* @param int $count [optional] item count (used with alt pager)
* @param int $count [optional] item count (used with minimal pager)
* @return Array data for pagination template
*/
function paginate_data(App $a, $count = null) {
@ -283,35 +286,32 @@ function paginate_data(App $a, $count=null) {
$stripped = trim($stripped, '/');
$pagenum = $a->pager['page'];
if (($a->page_offset != "") AND !preg_match('/[?&].offset=/', $stripped))
$stripped .= "&offset=".urlencode($a->page_offset);
if (($a->page_offset != '') AND !preg_match('/[?&].offset=/', $stripped)) {
$stripped .= '&offset=' . urlencode($a->page_offset);
}
$url = $stripped;
$data = array();
function _l(&$d, $name, $url, $text, $class="") {
if (!strpos($url, "?")) {
if ($pos = strpos($url, "&"))
$url = substr($url, 0, $pos)."?".substr($url, $pos + 1);
function _l(&$d, $name, $url, $text, $class = '') {
if (strpos($url, '?') === false && ($pos = strpos($url, '&')) !== false) {
$url = substr($url, 0, $pos) . '?' . substr($url, $pos + 1);
}
$d[$name] = array('url' => $url, 'text' => $text, 'class' => $class);
}
if (!is_null($count)) {
// alt pager
if($a->pager['page']>1)
_l($data, "prev", $url.'&page='.($a->pager['page'] - 1), t('newer'));
if($count>0)
_l($data, "next", $url.'&page='.($a->pager['page'] + 1), t('older'));
// minimal pager (newer / older)
$data['class'] = 'pager';
_l($data, 'prev', $url . '&page=' . ($a->pager['page'] - 1), t('newer'), 'previous' . ($a->pager['page'] == 1 ? ' disabled' : ''));
_l($data, 'next', $url . '&page=' . ($a->pager['page'] + 1), t('older'), 'next' . ($count <= 0 ? ' disabled' : ''));
} else {
// full pager
// full pager (first / prev / 1 / 2 / ... / 14 / 15 / next / last)
$data['class'] = 'pagination';
if ($a->pager['total'] > $a->pager['itemspage']) {
if($a->pager['page'] != 1)
_l($data, "prev", $url.'&page='.($a->pager['page'] - 1), t('prev'));
_l($data, "first", $url."&page=1", t('first'));
_l($data, 'first', $url . '&page=1', t('first'), $a->pager['page'] == 1 ? 'disabled' : '');
_l($data, 'prev', $url . '&page=' . ($a->pager['page'] - 1), t('prev'), $a->pager['page'] == 1 ? 'disabled' : '');
$numpages = $a->pager['total'] / $a->pager['itemspage'];
@ -326,32 +326,31 @@ function paginate_data(App $a, $count=null) {
$pages = array();
for ($i = $numstart; $i <= $numstop; $i++) {
if($i == $a->pager['page'])
_l($pages, $i, "#", $i, "current");
else
_l($pages, $i, $url."&page=$i", $i, "n");
if ($i == $a->pager['page']) {
_l($pages, $i, '#', $i, 'current active');
} else {
_l($pages, $i, $url . '&page='. $i, $i, 'n');
}
}
if (($a->pager['total'] % $a->pager['itemspage']) != 0) {
if($i == $a->pager['page'])
_l($pages, $i, "#", $i, "current");
else
_l($pages, $i, $url."&page=$i", $i, "n");
if ($i == $a->pager['page']) {
_l($pages, $i, '#', $i, 'current active');
} else {
_l($pages, $i, $url . '&page=' . $i, $i, 'n');
}
}
$data['pages'] = $pages;
$lastpage = (($numpages > intval($numpages)) ? intval($numpages)+1 : $numpages);
_l($data, "last", $url."&page=$lastpage", t('last'));
if(($a->pager['total'] - ($a->pager['itemspage'] * $a->pager['page'])) > 0)
_l($data, "next", $url."&page=".($a->pager['page'] + 1), t('next'));
_l($data, 'next', $url . '&page=' . ($a->pager['page'] + 1), t('next'), $a->pager['page'] == $lastpage ? 'disabled' : '');
_l($data, 'last', $url . '&page=' . $lastpage, t('last'), $a->pager['page'] == $lastpage ? 'disabled' : '');
}
}
return $data;
}}
}
if(! function_exists('paginate')) {
/**

View file

@ -649,9 +649,7 @@ function admin_page_site_post(App $a) {
$diaspora_enabled = ((x($_POST,'diaspora_enabled')) ? True : False);
$ssl_policy = ((x($_POST,'ssl_policy')) ? intval($_POST['ssl_policy']) : 0);
$force_ssl = ((x($_POST,'force_ssl')) ? True : False);
$old_share = ((x($_POST,'old_share')) ? True : False);
$hide_help = ((x($_POST,'hide_help')) ? True : False);
$suppress_language = ((x($_POST,'suppress_language')) ? True : False);
$suppress_tags = ((x($_POST,'suppress_tags')) ? True : False);
$use_fulltext_engine = ((x($_POST,'use_fulltext_engine')) ? True : False);
$itemcache = ((x($_POST,'itemcache')) ? notags(trim($_POST['itemcache'])) : '');
@ -662,7 +660,6 @@ function admin_page_site_post(App $a) {
$basepath = ((x($_POST,'basepath')) ? notags(trim($_POST['basepath'])) : '');
$singleuser = ((x($_POST,'singleuser')) ? notags(trim($_POST['singleuser'])) : '');
$proxy_disabled = ((x($_POST,'proxy_disabled')) ? True : False);
$old_pager = ((x($_POST,'old_pager')) ? True : False);
$only_tag_search = ((x($_POST,'only_tag_search')) ? True : False);
$rino = ((x($_POST,'rino')) ? intval($_POST['rino']) : 0);
$embedly = ((x($_POST,'embedly')) ? notags(trim($_POST['embedly'])) : '');
@ -734,7 +731,6 @@ function admin_page_site_post(App $a) {
set_config('config','sitename',$sitename);
set_config('config','hostname',$hostname);
set_config('config','sender_email', $sender_email);
set_config('system','suppress_language',$suppress_language);
set_config('system','suppress_tags',$suppress_tags);
set_config('system','shortcut_icon',$shortcut_icon);
set_config('system','touch_icon',$touch_icon);
@ -805,7 +801,6 @@ function admin_page_site_post(App $a) {
set_config('config','private_addons', $private_addons);
set_config('system','force_ssl', $force_ssl);
set_config('system','old_share', $old_share);
set_config('system','hide_help', $hide_help);
set_config('system','use_fulltext_engine', $use_fulltext_engine);
set_config('system','itemcache', $itemcache);
@ -815,7 +810,6 @@ function admin_page_site_post(App $a) {
set_config('system','temppath', $temppath);
set_config('system','basepath', $basepath);
set_config('system','proxy_disabled', $proxy_disabled);
set_config('system','old_pager', $old_pager);
set_config('system','only_tag_search', $only_tag_search);
set_config('system','worker', $worker);
set_config('system','worker_queues', $worker_queues);
@ -996,7 +990,6 @@ function admin_page_site(App $a) {
'$theme_mobile' => array('theme_mobile', t("Mobile system theme"), get_config('system','mobile-theme'), t("Theme for mobile devices"), $theme_choices_mobile),
'$ssl_policy' => array('ssl_policy', t("SSL link policy"), (string) intval(get_config('system','ssl_policy')), t("Determines whether generated links should be forced to use SSL"), $ssl_choices),
'$force_ssl' => array('force_ssl', t("Force SSL"), get_config('system','force_ssl'), t("Force all Non-SSL requests to SSL - Attention: on some systems it could lead to endless loops.")),
'$old_share' => array('old_share', t("Old style 'Share'"), get_config('system','old_share'), t("Deactivates the bbcode element 'share' for repeating items.")),
'$hide_help' => array('hide_help', t("Hide help entry from navigation menu"), get_config('system','hide_help'), t("Hides the menu entry for the Help pages from the navigation menu. You can still access it calling /help directly.")),
'$singleuser' => array('singleuser', t("Single user instance"), get_config('system','singleuser'), t("Make this instance multi-user or single-user for the named user"), $user_names),
'$maximagesize' => array('maximagesize', t("Maximum image size"), get_config('system','maximagesize'), t("Maximum size in bytes of uploaded images. Default is 0, which means no limits.")),
@ -1052,7 +1045,6 @@ function admin_page_site(App $a) {
'$nodeinfo' => array('nodeinfo', t("Publish server information"), get_config('system','nodeinfo'), t("If enabled, general server and usage data will be published. The data contains the name and version of the server, number of users with public profiles, number of posts and the activated protocols and connectors. See <a href='http://the-federation.info/'>the-federation.info</a> for details.")),
'$use_fulltext_engine' => array('use_fulltext_engine', t("Use MySQL full text engine"), get_config('system','use_fulltext_engine'), t("Activates the full text engine. Speeds up search - but can only search for four and more characters.")),
'$suppress_language' => array('suppress_language', t("Suppress Language"), get_config('system','suppress_language'), t("Suppress language information in meta information about a posting.")),
'$suppress_tags' => array('suppress_tags', t("Suppress Tags"), get_config('system','suppress_tags'), t("Suppress showing a list of hashtags at the end of the posting.")),
'$itemcache' => array('itemcache', t("Path to item cache"), get_config('system','itemcache'), t("The item caches buffers generated bbcode and external images.")),
'$itemcache_duration' => array('itemcache_duration', t("Cache duration in seconds"), get_config('system','itemcache_duration'), t("How long should the cache files be hold? Default value is 86400 seconds (One day). To disable the item cache, set the value to -1.")),
@ -1061,7 +1053,6 @@ function admin_page_site(App $a) {
'$temppath' => array('temppath', t("Temp path"), get_config('system','temppath'), t("If you have a restricted system where the webserver can't access the system temp path, enter another path here.")),
'$basepath' => array('basepath', t("Base path to installation"), get_config('system','basepath'), t("If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot.")),
'$proxy_disabled' => array('proxy_disabled', t("Disable picture proxy"), get_config('system','proxy_disabled'), t("The picture proxy increases performance and privacy. It shouldn't be used on systems with very low bandwith.")),
'$old_pager' => array('old_pager', t("Enable old style pager"), get_config('system','old_pager'), t("The old style pager has page numbers but slows down massively the page speed.")),
'$only_tag_search' => array('only_tag_search', t("Only search in tags"), get_config('system','only_tag_search'), t("On large systems the text search can slow down the system extremely.")),
'$relocate_url' => array('relocate_url', t("New base url"), App::get_baseurl(), t("Change base url for this server. Sends relocate message to all DFRN contacts of all users.")),

View file

@ -48,27 +48,6 @@ function community_content(App $a, $update = 0) {
// Only public posts can be shown
// OR your own posts if you are a logged in member
if(get_config('system', 'old_pager')) {
$r = qu("SELECT COUNT(distinct(`item`.`uri`)) AS `total`
FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
INNER JOIN `user` ON `user`.`uid` = `item`.`uid` AND `user`.`hidewall` = 0
WHERE `item`.`visible` = 1 AND `item`.`deleted` = 0 and `item`.`moderated` = 0
AND `item`.`allow_cid` = '' AND `item`.`allow_gid` = ''
AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = ''
AND `item`.`private` = 0 AND `item`.`wall` = 1"
);
if (dbm::is_result($r))
$a->set_pager_total($r[0]['total']);
if(! $r[0]['total']) {
info( t('No results.') . EOL);
return $o;
}
}
$r = community_getitems($a->pager['start'], $a->pager['itemspage']);
if (! dbm::is_result($r)) {
@ -107,11 +86,7 @@ function community_content(App $a, $update = 0) {
$o .= conversation($a, $s, 'community', $update);
if(!get_config('system', 'old_pager')) {
$o .= alt_pager($a, count($r));
} else {
$o .= paginate($a);
}
return $o;
}

View file

@ -599,21 +599,6 @@ function network_content(App $a, $update = 0) {
$pager_sql = '';
} else {
if(get_config('system', 'old_pager')) {
$r = qu("SELECT COUNT(*) AS `total`
FROM $sql_table $sql_post_table INNER JOIN `contact` ON `contact`.`id` = $sql_table.`contact-id`
AND (NOT `contact`.`blocked` OR `contact`.`pending`)
WHERE $sql_table.`uid` = %d AND $sql_table.`visible` AND NOT $sql_table.`deleted`
$sql_extra2 $sql_extra3
$sql_extra $sql_nets ",
intval($_SESSION['uid'])
);
if (dbm::is_result($r)) {
$a->set_pager_total($r[0]['total']);
}
}
// check if we serve a mobile device and get the user settings
// accordingly
if ($a->is_mobile) {
@ -793,10 +778,8 @@ function network_content(App $a, $update = 0) {
if (!$update) {
if (get_pconfig(local_user(), 'system', 'infinite_scroll')) {
$o .= scroll_loader();
} elseif (!get_config('system', 'old_pager')) {
$o .= alt_pager($a,count($items));
} else {
$o .= paginate($a);
$o .= alt_pager($a, count($items));
}
}

View file

@ -228,9 +228,10 @@ function nodeinfo_cron() {
logger("local_posts: ".$local_posts, LOGGER_DEBUG);
$posts = qu("SELECT COUNT(*) AS `local_comments` FROM `item`
INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
WHERE `contact`.`self` and `item`.`id` != `item`.`parent` AND `item`.`network` IN ('%s', '%s', '%s')",
$posts = qu("SELECT COUNT(*) FROM `contact`
INNER JOIN `item` ON `item`.`contact-id` = `contact`.`id` AND `item`.`uid` = `contact`.`uid` AND
`item`.`id` != `item`.`parent` AND `item`.`network` IN ('%s', '%s', '%s')
WHERE `contact`.`self`",
dbesc(NETWORK_OSTATUS), dbesc(NETWORK_DIASPORA), dbesc(NETWORK_DFRN));
if (!is_array($posts))

View file

@ -194,10 +194,14 @@ function notifications_content(App $a) {
if($it['network'] === NETWORK_DFRN) {
$lbl_knowyou = t('Claims to be known to you: ');
$knowyou = (($it['knowyou']) ? t('yes') : t('no'));
$helptext = t('Shall your connection be bidirectional or not? "Friend" implies that you allow to read and you subscribe to their posts. "Fan/Admirer" means that you allow to read but you do not want to read theirs. Approve as: ');
$helptext = t('Shall your connection be bidirectional or not?');
$helptext2 = sprintf(t('Accepting %s as a friend allows %s to subscribe to your posts, and you will also receive updates from them in your news feed.'), $it['name'], $it['name']);
$helptext3 = sprintf(t('Accepting %s as a subscriber allows them to subscribe to your posts, but you will not receive updates from them in your news feed.'), $it['name']);
} else {
$knowyou = '';
$helptext = t('Shall your connection be bidirectional or not? "Friend" implies that you allow to read and you subscribe to their posts. "Sharer" means that you allow to read but you do not want to read theirs. Approve as: ');
$helptext = t('Shall your connection be bidirectional or not?');
$helptext2 = sprintf(t('Accepting %s as a friend allows %s to subscribe to your posts, and you will also receive updates from them in your news feed.'), $it['name'], $it['name']);
$helptext3 = sprintf(t('Accepting %s as a sharer allows them to subscribe to your posts, but you will not receive updates from them in your news feed.'), $it['name']);
}
}
@ -205,9 +209,11 @@ function notifications_content(App $a) {
'$intro_id' => $it['intro_id'],
'$friend_selected' => $friend_selected,
'$fan_selected' => $fan_selected,
'$approve_as' => $helptext,
'$approve_as1' => $helptext,
'$approve_as2' => $helptext2,
'$approve_as3' => $helptext3,
'$as_friend' => t('Friend'),
'$as_fan' => (($it['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Fan/Admirer'))
'$as_fan' => (($it['network'] == NETWORK_DIASPORA) ? t('Sharer') : t('Subscriber'))
));
$header = $it["name"];

View file

@ -240,21 +240,15 @@ function profile_content(App $a, $update = 0) {
$sql_extra2 .= protect_sprintf(sprintf(" AND `thread`.`created` >= '%s' ", dbesc(datetime_convert(date_default_timezone_get(),'',$datequery2))));
}
if(get_config('system', 'old_pager')) {
$r = q("SELECT COUNT(*) AS `total`
FROM `thread` INNER JOIN `item` ON `item`.`id` = `thread`.`iid`
$sql_post_table INNER JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
WHERE `thread`.`uid` = %d AND `thread`.`visible` = 1 AND `thread`.`deleted` = 0
and `thread`.`moderated` = 0
AND `thread`.`wall` = 1
$sql_extra $sql_extra2 ",
intval($a->profile['profile_uid'])
);
// Belongs the profile page to a forum?
// If not then we can improve the performance with an additional condition
$r = q("SELECT `uid` FROM `user` WHERE `uid` = %d AND `page-flags` IN (%d, %d)",
intval($a->profile['profile_uid']),
intval(PAGE_COMMUNITY),
intval(PAGE_PRVGROUP));
if (dbm::is_result($r)) {
$a->set_pager_total($r[0]['total']);
}
if (!dbm::is_result($r)) {
$sql_extra3 = sprintf(" AND `thread`.`contact-id` = %d ", intval(intval($a->profile['contact_id'])));
}
// check if we serve a mobile device and get the user settings
@ -282,14 +276,12 @@ function profile_content(App $a, $update = 0) {
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
WHERE `thread`.`uid` = %d AND `thread`.`visible`
AND `thread`.`contact-id` = %d
AND NOT `thread`.`deleted`
AND NOT `thread`.`moderated`
AND `thread`.`wall`
$sql_extra $sql_extra2
$sql_extra3 $sql_extra $sql_extra2
ORDER BY `thread`.`created` DESC $pager_sql",
intval($a->profile['profile_uid']),
intval($a->profile['contact_id'])
intval($a->profile['profile_uid'])
);
}
@ -329,11 +321,7 @@ function profile_content(App $a, $update = 0) {
$o .= conversation($a, $items, 'profile', $update);
if (!$update) {
if(!get_config('system', 'old_pager')) {
$o .= alt_pager($a, count($items));
} else {
$o .= paginate($a);
}
}
return $o;

View file

@ -15,7 +15,6 @@ function share_init(App $a) {
if(! dbm::is_result($r) || ($r[0]['private'] == 1))
killme();
if (!intval(get_config('system','old_share'))) {
if (strpos($r[0]['body'], "[/share]") !== false) {
$pos = strpos($r[0]['body'], "[share");
$o = substr($r[0]['body'], $pos);
@ -27,16 +26,7 @@ function share_init(App $a) {
$o .= $r[0]['body'];
$o.= "[/share]";
}
} else {
$o = '';
$o .= "\xE2\x99\xb2" . ' [url=' . $r[0]['author-link'] . ']' . $r[0]['author-name'] . '[/url]' . "\n";
if($r[0]['title'])
$o .= '[b]' . $r[0]['title'] . '[/b]' . "\n";
$o .= $r[0]['body'] . "\n" ;
$o .= (($r[0]['plink']) ? '[url=' . $r[0]['plink'] . ']' . t('link') . '[/url]' . "\n" : '');
}
echo $o;
killme();
}

View file

@ -287,32 +287,6 @@ class Item extends BaseObject {
localize_item($item);
if ($item["postopts"] and !get_config("system", "suppress_language")) {
//$langdata = explode(";", $item["postopts"]);
//$langstr = substr($langdata[0], 5)." (".round($langdata[1]*100, 1)."%)";
$langstr = "";
if (substr($item["postopts"], 0, 5) == "lang=") {
$postopts = substr($item["postopts"], 5);
$languages = explode(":", $postopts);
if (sizeof($languages) == 1) {
$languages = array();
$languages[] = $postopts;
}
foreach ($languages as $language) {
$langdata = explode(";", $language);
if ($langstr != "") {
$langstr .= ", ";
}
//$langstr .= $langdata[0]." (".round($langdata[1]*100, 1)."%)";
$langstr .= round($langdata[1]*100, 1)."% ".$langdata[0];
}
}
}
$body = prepare_body($item,true);
list($categories, $folders) = get_cats_and_terms($item);
@ -420,7 +394,6 @@ class Item extends BaseObject {
'previewing' => ($conv->is_preview() ? ' preview ' : ''),
'wait' => t('Please wait'),
'thread_level' => $thread_level,
'postopts' => $langstr,
'edited' => $edited,
'network' => $item["item_network"],
'network_name' => network_to_name($item['item_network'], $profile_link),

View file

@ -1,6 +1,6 @@
<?php
define('UPDATE_VERSION' , 1214);
define('UPDATE_VERSION' , 1215);
/**
*

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -56,7 +56,6 @@
{{include file="field_select.tpl" field=$theme_mobile}}
{{include file="field_select.tpl" field=$ssl_policy}}
{{if $ssl_policy.2 == 1}}{{include file="field_checkbox.tpl" field=$force_ssl}}{{/if}}
{{include file="field_checkbox.tpl" field=$old_share}}
{{include file="field_checkbox.tpl" field=$hide_help}}
{{include file="field_select.tpl" field=$singleuser}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
@ -132,7 +131,6 @@
{{include file="field_input.tpl" field=$lockpath}}
{{include file="field_input.tpl" field=$temppath}}
{{include file="field_input.tpl" field=$basepath}}
{{include file="field_checkbox.tpl" field=$suppress_language}}
{{include file="field_checkbox.tpl" field=$suppress_tags}}
{{include file="field_checkbox.tpl" field=$nodeinfo}}
{{include file="field_input.tpl" field=$embedly}}
@ -153,7 +151,6 @@
{{include file="field_input.tpl" field=$itemcache_duration}}
{{include file="field_input.tpl" field=$max_comments}}
{{include file="field_checkbox.tpl" field=$proxy_disabled}}
{{include file="field_checkbox.tpl" field=$old_pager}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
<h3>{{$worker_title}}</h3>

View file

@ -1,5 +1,9 @@
<div class="intro-approve-as-friend-desc">{{$approve_as}}</div>
<div class="intro-approve-as-friend-desc">
<p>{{$approve_as1}}</p>
<p>{{$approve_as2}}</p>
<p>{{$approve_as3}}</p>
</div>
<div class="intro-approve-as-friend-wrapper">
<label class="intro-approve-as-friend-label" for="intro-approve-as-friend-{{$intro_id}}">{{$as_friend}}</label>

View file

@ -2,7 +2,7 @@
{{if $pager}}
{{if $pager.prev}}<span class="pager_prev {{$pager.prev.class}}"><a href="{{$pager.prev.url}}">{{$pager.prev.text}}</a></span>{{/if}}
{{if $pager.first}}<span class="pager_first $pager.first.class"><a href="{{$pager.first.url}}">{{$pager.first.text}}</a></span>{{/if}}
{{if $pager.first}}<span class="pager_first {{$pager.first.class}}"><a href="{{$pager.first.url}}">{{$pager.first.text}}</a></span>{{/if}}
{{foreach $pager.pages as $p}}<span class="pager_{{$p.class}}"><a href="{{$p.url}}">{{$p.text}}</a></span>{{/foreach}}

View file

@ -1552,6 +1552,9 @@ blockquote.shared_content {
clear:left;
}
.pager .disabled {
display: none;
}
.pager_first,
.pager_last,

View file

@ -2514,6 +2514,24 @@ body .tread-wrapper .hovercard:hover .hover-card-content a {
color: $link_color !important;
}
/* Pagination improvements */
.pagination > li > a,
.pagination > li > span {
color: $link_color;
}
.pagination>.active>a,
.pagination>.active>a:focus,
.pagination>.active>a:hover,
.pagination>.active>span,
.pagination>.active>span:focus,
.pagination>.active>span:hover {
background-color: $link_color;
border-color: $link_color;
}
.disabled > a {
pointer-events: none;
}
/*
* some temporary workarounds until this will solved
* elsewhere (e.g. new templates)

View file

@ -4,8 +4,9 @@
// Catch the GUID from the URL
var itemGuid = window.location.pathname.split("/").pop();
var itemGuidSafe = itemGuid.replace(/%.*/, '');
$(window).load(function(){
// Scroll to the Item by its GUID
scrollToItem('item-'+itemGuid);
scrollToItem('item-' + itemGuidSafe);
});

View file

@ -162,21 +162,29 @@ function qCommentInsert(obj,id) {
function confirmDelete() { return confirm(aStr.delitem); }
function dropItem(url, object) {
/**
* Hide and removes an item element from the DOM after the deletion url is
* successful, restore it else.
*
* @param {string} url The item removal URL
* @param {string} elementId The DOM id of the item element
* @returns {undefined}
*/
function dropItem(url, elementId) {
var confirm = confirmDelete();
//if the first character of the object is #, remove it because
// we use getElementById which don't need the #
// getElementByID selects elements even if there are special characters
// in the ID (like %) which won't work with jQuery
/// @todo ceck if we can solve this in the template
object = object.indexOf('#') == 0 ? object.substring(1) : object;
if (confirm) {
$('body').css('cursor', 'wait');
$(document.getElementById(object)).fadeTo('fast', 0.33, function () {
$.get(url).done(function() {
$(document.getElementById(object)).remove();
var $el = $(document.getElementById(elementId));
$el.fadeTo('fast', 0.33, function () {
$.get(url).then(function() {
$el.remove();
}).error(function() {
// @todo Show related error message
$el.show();
}).always(function() {
$('body').css('cursor', 'auto');
});
});

View file

@ -573,31 +573,38 @@ String.prototype.rtrim = function() {
return trimmed;
};
// Scroll to a specific item and highlight it
// Note: jquery.color.js is needed
function scrollToItem(itemID) {
if( typeof itemID === "undefined")
/**
* Scroll the screen to the item element whose id is provided, then highlights it
*
* Note: jquery.color.js is required
*
* @param {string} elementId The item element id
* @returns {undefined}
*/
function scrollToItem(elementId) {
if (typeof elementId === "undefined") {
return;
}
var elm = $('#'+itemID);
var $el = $(document.getElementById(elementId));
// Test if the Item exists
if(!elm.length)
if (!$el.length) {
return;
}
// Define the colors which are used for highlighting
var colWhite = {backgroundColor:'#F5F5F5'};
var colShiny = {backgroundColor:'#FFF176'};
// Get the Item Position (we need to substract 100 to match
// correct position
var itemPos = $(elm).offset().top - 100;
// Get the Item Position (we need to substract 100 to match correct position
var itemPos = $el.offset().top - 100;
// Scroll to the DIV with the ID (GUID)
$('html, body').animate({
scrollTop: itemPos
}, 400, function() {
// Highlight post/commenent with ID (GUID)
$(elm).animate(colWhite, 1000).animate(colShiny).animate(colWhite, 600);
$el.animate(colWhite, 1000).animate(colShiny).animate(colWhite, 600);
});
}

View file

@ -1,292 +0,0 @@
<?php
class colors {
/* Convert hexdec color string to rgb(a) string */
function hex2rgba($color, $opacity = false) {
$default = 'rgb(0,0,0)';
//Return default if no color provided
if(empty($color))
return $default;
//Sanitize $color if "#" is provided
if ($color[0] == '#' ) {
$color = substr( $color, 1 );
}
//Check if color has 6 or 3 characters and get values
if (strlen($color) == 6) {
$hex = array( $color[0] . $color[1], $color[2] . $color[3], $color[4] . $color[5] );
} elseif ( strlen( $color ) == 3 ) {
$hex = array( $color[0] . $color[0], $color[1] . $color[1], $color[2] . $color[2] );
} else {
return $default;
}
//Convert hexadec to rgb
$rgb = array_map('hexdec', $hex);
//Check if opacity is set(rgba or rgb)
if($opacity){
if(abs($opacity) > 1)
$opacity = 1.0;
$output = 'rgba('.implode(",",$rgb).','.$opacity.')';
} else {
$output = 'rgb('.implode(",",$rgb).')';
}
//Return rgb(a) color string
return $output;
}
function hex2rgb( $colour ) {
if ( $colour[0] == '#' ) {
$colour = substr( $colour, 1 );
}
if ( strlen( $colour ) == 6 ) {
list( $r, $g, $b ) = array( $colour[0] . $colour[1], $colour[2] . $colour[3], $colour[4] . $colour[5] );
} elseif ( strlen( $colour ) == 3 ) {
list( $r, $g, $b ) = array( $colour[0] . $colour[0], $colour[1] . $colour[1], $colour[2] . $colour[2] );
} else {
return false;
}
$r = hexdec( $r );
$g = hexdec( $g );
$b = hexdec( $b );
return array( 'red' => $r, 'green' => $g, 'blue' => $b );
}
function rgbToHsl( $r, $g, $b ) {
$oldR = $r;
$oldG = $g;
$oldB = $b;
$r /= 255;
$g /= 255;
$b /= 255;
$max = max( $r, $g, $b );
$min = min( $r, $g, $b );
$h;
$s;
$l = ( $max + $min ) / 2;
$d = $max - $min;
if( $d == 0 ){
$h = $s = 0; // achromatic
} else {
$s = $d / ( 1 - abs( 2 * $l - 1 ) );
switch( $max ){
case $r:
$h = 60 * fmod( ( ( $g - $b ) / $d ), 6 );
if ($b > $g) {
$h += 360;
}
break;
case $g:
$h = 60 * ( ( $b - $r ) / $d + 2 );
break;
case $b:
$h = 60 * ( ( $r - $g ) / $d + 4 );
break;
}
}
return array( round( $h, 2 ), round( $s, 2 ), round( $l, 2 ) );
}
function hslToRgb( $h, $s, $l ){
$r = "";
$g = "";
$b = "";
$c = ( 1 - abs( 2 * $l - 1 ) ) * $s;
$x = $c * ( 1 - abs( fmod( ( $h / 60 ), 2 ) - 1 ) );
$m = $l - ( $c / 2 );
if ( $h < 60 ) {
$r = $c;
$g = $x;
$b = 0;
} else if ( $h < 120 ) {
$r = $x;
$g = $c;
$b = 0;
} else if ( $h < 180 ) {
$r = 0;
$g = $c;
$b = $x;
} else if ( $h < 240 ) {
$r = 0;
$g = $x;
$b = $c;
} else if ( $h < 300 ) {
$r = $x;
$g = 0;
$b = $c;
} else {
$r = $c;
$g = 0;
$b = $x;
}
$r = ( $r + $m ) * 255;
$g = ( $g + $m ) * 255;
$b = ( $b + $m ) * 255;
return array( floor( $r ), floor( $g ), floor( $b ) );
}
/*
* Som more example code - this needs to be deletet if we don't need it in
* the future
*/
function HTMLToRGB($htmlCode)
{
if($htmlCode[0] == '#')
$htmlCode = substr($htmlCode, 1);
if (strlen($htmlCode) == 3)
{
$htmlCode = $htmlCode[0] . $htmlCode[0] . $htmlCode[1] . $htmlCode[1] . $htmlCode[2] . $htmlCode[2];
}
$r = hexdec($htmlCode[0] . $htmlCode[1]);
$g = hexdec($htmlCode[2] . $htmlCode[3]);
$b = hexdec($htmlCode[4] . $htmlCode[5]);
return $b + ($g << 0x8) + ($r << 0x10);
}
function RGBToHTML($RGB)
{
$r = 0xFF & ($RGB >> 0x10);
$g = 0xFF & ($RGB >> 0x8);
$b = 0xFF & $RGB;
$r = dechex($r);
$g = dechex($g);
$b = dechex($b);
return "#" . str_pad($r, 2, "0", STR_PAD_LEFT) . str_pad($g, 2, "0", STR_PAD_LEFT) . str_pad($b, 2, "0", STR_PAD_LEFT);
}
function ChangeLuminosity($RGB, $LuminosityPercent)
{
$HSL = RGBToHSL($RGB);
$NewHSL = (int)(((float)$LuminosityPercent / 100) * 255) + (0xFFFF00 & $HSL);
return HSLToRGB($NewHSL);
}
function RGBToHSL($RGB)
{
$r = 0xFF & ($RGB >> 0x10);
$g = 0xFF & ($RGB >> 0x8);
$b = 0xFF & $RGB;
$r = ((float)$r) / 255.0;
$g = ((float)$g) / 255.0;
$b = ((float)$b) / 255.0;
$maxC = max($r, $g, $b);
$minC = min($r, $g, $b);
$l = ($maxC + $minC) / 2.0;
if($maxC == $minC)
{
$s = 0;
$h = 0;
}
else
{
if($l < .5)
{
$s = ($maxC - $minC) / ($maxC + $minC);
}
else
{
$s = ($maxC - $minC) / (2.0 - $maxC - $minC);
}
if($r == $maxC)
$h = ($g - $b) / ($maxC - $minC);
if($g == $maxC)
$h = 2.0 + ($b - $r) / ($maxC - $minC);
if($b == $maxC)
$h = 4.0 + ($r - $g) / ($maxC - $minC);
$h = $h / 6.0;
}
$h = (int)round(255.0 * $h);
$s = (int)round(255.0 * $s);
$l = (int)round(255.0 * $l);
$HSL = $l + ($s << 0x8) + ($h << 0x10);
return $HSL;
}
function HSLToRGB($HSL)
{
$h = 0xFF & ($HSL >> 0x10);
$s = 0xFF & ($HSL >> 0x8);
$l = 0xFF & $HSL;
$h = ((float)$h) / 255.0;
$s = ((float)$s) / 255.0;
$l = ((float)$l) / 255.0;
if($s == 0)
{
$r = $l;
$g = $l;
$b = $l;
}
else
{
if($l < .5)
{
$t2 = $l * (1.0 + $s);
}
else
{
$t2 = ($l + $s) - ($l * $s);
}
$t1 = 2.0 * $l - $t2;
$rt3 = $h + 1.0/3.0;
$gt3 = $h;
$bt3 = $h - 1.0/3.0;
if($rt3 < 0) $rt3 += 1.0;
if($rt3 > 1) $rt3 -= 1.0;
if($gt3 < 0) $gt3 += 1.0;
if($gt3 > 1) $gt3 -= 1.0;
if($bt3 < 0) $bt3 += 1.0;
if($bt3 > 1) $bt3 -= 1.0;
if(6.0 * $rt3 < 1) $r = $t1 + ($t2 - $t1) * 6.0 * $rt3;
elseif(2.0 * $rt3 < 1) $r = $t2;
elseif(3.0 * $rt3 < 2) $r = $t1 + ($t2 - $t1) * ((2.0/3.0) - $rt3) * 6.0;
else $r = $t1;
if(6.0 * $gt3 < 1) $g = $t1 + ($t2 - $t1) * 6.0 * $gt3;
elseif(2.0 * $gt3 < 1) $g = $t2;
elseif(3.0 * $gt3 < 2) $g = $t1 + ($t2 - $t1) * ((2.0/3.0) - $gt3) * 6.0;
else $g = $t1;
if(6.0 * $bt3 < 1) $b = $t1 + ($t2 - $t1) * 6.0 * $bt3;
elseif(2.0 * $bt3 < 1) $b = $t2;
elseif(3.0 * $bt3 < 2) $b = $t1 + ($t2 - $t1) * ((2.0/3.0) - $bt3) * 6.0;
else $b = $t1;
}
$r = (int)round(255.0 * $r);
$g = (int)round(255.0 * $g);
$b = (int)round(255.0 * $b);
$RGB = $b + ($g << 0x8) + ($r << 0x10);
return $RGB;
}
}

View file

@ -0,0 +1,14 @@
{{* Pager template, uses output of paginate_data() in include/text.php *}}
{{if $pager}}
<div class="{{$pager.class}}">
{{if $pager.first}}<li class="pager_first {{$pager.first.class}}"><a href="{{$pager.first.url}}">{{$pager.first.text}}</a></li>{{/if}}
{{if $pager.prev}}<li class="pager_prev {{$pager.prev.class}}"><a href="{{$pager.prev.url}}">{{$pager.prev.text}}</a></li>{{/if}}
{{foreach $pager.pages as $p}}<li class="pager_{{$p.class}}"><a href="{{$p.url}}">{{$p.text}}</a></li>{{/foreach}}
{{if $pager.next}}<li class="pager_next {{$pager.next.class}}"><a href="{{$pager.next.url}}">{{$pager.next.text}}</a></li>{{/if}}
{{if $pager.last}}&nbsp;<li class="pager_last {{$pager.last.class}}"><a href="{{$pager.last.url}}">{{$pager.last.text}}</a></li>{{/if}}
</div>
{{/if}}

View file

@ -7,7 +7,7 @@
<!-- ./TODO => Unknow block -->
<div class="panel">
<div class="panel" id="item-{{$item.guid}}">
<div class="wall-item-container panel-body{{$item.indent}} {{$item.shiny}} {{$item.previewing}}" >
<div class="media">
{{* Put additional actions in a top-right dropdown menu *}}
@ -54,7 +54,7 @@
{{if $item.drop.dropping}}
<li role="separator" class="divider"></li>
<li role="menuitem">
<button type="button" class="btn-link navicon delete" onclick="dropItem('item/drop/{{$item.id}}', '#item-{{$item.guid}}'); return false;" title="{{$item.drop.delete}}"><i class="fa fa-trash"></i> {{$item.drop.delete}}</button>
<button type="button" class="btn-link navicon delete" onclick="dropItem('item/drop/{{$item.id}}', 'item-{{$item.guid}}'); return false;" title="{{$item.drop.delete}}"><i class="fa fa-trash"></i> {{$item.drop.delete}}</button>
</li>
{{/if}}
</ul>

View file

@ -129,7 +129,7 @@ as the value of $top_child_total (this is done at the end of this file)
{{if $item.drop.dropping}}
<li role="menuitem">
<button type="button" class="btn-link navicon delete" onclick="dropItem('item/drop/{{$item.id}}', '#item-{{$item.guid}}'); return false;" title="{{$item.drop.delete}}"><i class="fa fa-trash"></i> {{$item.drop.delete}}</button>
<button type="button" class="btn-link navicon delete" onclick="dropItem('item/drop/{{$item.id}}', 'item-{{$item.guid}}'); return false;" title="{{$item.drop.delete}}"><i class="fa fa-trash"></i> {{$item.drop.delete}}</button>
</li>
{{/if}}
</ul>

View file

@ -1909,6 +1909,9 @@ input#profile-jot-email {
-webkit-border-radius: 10px;
}
.pager .disabled {
display: none;
}
.pager_first,
.pager_last,

View file

@ -1866,6 +1866,9 @@ input#dfrn-url {
-webkit-border-radius: 10px;
}
.pager .disabled {
display: none;
}
.pager_first,
.pager_last,

View file

@ -2481,6 +2481,9 @@ footer {
margin-top: 25px;
clear: both;
}
.pager .disabled {
display: none;
}
/**
* ADMIN
*/

View file

@ -2481,6 +2481,9 @@ footer {
margin-top: 25px;
clear: both;
}
.pager .disabled {
display: none;
}
/**
* ADMIN
*/

View file

@ -1675,6 +1675,9 @@ footer { height: 100px; display: table-row; }
margin-top: 25px;
clear: both;
}
.pager .disabled {
display: none;
}
/**
* ADMIN

View file

@ -396,6 +396,10 @@ ul.menu-popup li a:hover {
margin: 4px;
}
.pager .disabled {
display: none;
}
.pager_current {
background-color: #1873a2;
color: #ffffff;

View file

@ -247,6 +247,10 @@ div.pager {
float: left;
}
.pager .disabled {
display: none;
}
.hide-comments-outer {
margin-left: 80px;
margin-bottom: 5px;