Merge remote-tracking branch 'upstream/develop' into 1512-ostatus-comment

Conflicts:
	include/ostatus.php
pull/2197/head
Michael Vogel 7 years ago
commit 307beb47fd
  1. 81
      CHANGELOG
  2. 17
      boot.php
  3. 73
      doc/api.md
  4. 12
      include/Contact.php
  5. 221
      include/api.php
  6. 14
      include/auth.php
  7. 2
      include/conversation.php
  8. 34
      include/cron.php
  9. 9
      include/cronhooks.php
  10. 9
      include/delivery.php
  11. 9
      include/discover_poco.php
  12. 25
      include/identity.php
  13. 2
      include/items.php
  14. 3
      include/ostatus.php
  15. 37
      include/poller.php
  16. 8
      include/session.php
  17. 9
      index.php
  18. 17
      js/main.js
  19. 3
      mod/admin.php
  20. 9
      mod/allfriends.php
  21. 17
      mod/common.php
  22. 4
      mod/contacts.php
  23. 26
      mod/directory.php
  24. 17
      mod/display.php
  25. 11
      mod/photo.php
  26. 2
      mod/photos.php
  27. 15
      mod/proxy.php
  28. 16
      mod/pubsubhubbub.php
  29. 2
      mod/videos.php
  30. 1
      util/credits.txt
  31. 1297
      util/messages.po
  32. 2
      util/run_xgettext.sh
  33. 1304
      view/de/messages.po
  34. 65
      view/de/strings.php
  35. 4201
      view/fr/messages.po
  36. 437
      view/fr/strings.php
  37. 8
      view/global.css
  38. 11944
      view/it/messages.po
  39. 2816
      view/it/strings.php
  40. 1
      view/templates/admin_site.tpl
  41. BIN
      view/theme/frost-mobile/images/event-attend.png
  42. BIN
      view/theme/frost-mobile/images/event-dontattend.png
  43. BIN
      view/theme/frost-mobile/images/event-maybeattend.png
  44. BIN
      view/theme/frost/images/event-attend-16.png
  45. BIN
      view/theme/frost/images/event-attend.png
  46. BIN
      view/theme/frost/images/event-dontattend-16.png
  47. BIN
      view/theme/frost/images/event-dontattend.png
  48. BIN
      view/theme/frost/images/event-maybeattend-16.png
  49. BIN
      view/theme/frost/images/event-maybeattend.png
  50. 70
      view/theme/quattro/dark/style.css
  51. 70
      view/theme/quattro/green/style.css
  52. 76
      view/theme/quattro/lilac/style.css
  53. 38
      view/theme/quattro/quattro.less
  54. 14
      view/theme/quattro/templates/message_side.tpl
  55. 4
      view/theme/vier/style.css
  56. 5
      view/theme/vier/templates/widget_forumlist_right.tpl
  57. 4
      view/theme/vier/theme.php

@ -1,6 +1,85 @@
Version 3.4.3
What's new for the users:
Updates to the documentation (silke, tobiasd, annando, rebeka-catalina)
Updated translations (tobiasd & translation teams)
New "Credits" page (tobiasd)
New custom font icon set (tobiasd, Andi Stadler)
Support to events attendance. Users can mark their participation to an event (rabuzarus, tobiasd, fabrixxm, annando)
Revised templates and used interaction in contacts lists (rabuzarus)
Mobile support for Vier theme (annando, fabrixxm)
Events editing and deletion from stream (annando)
Private forums are mentioned automatically like community forums (rabuzarus)
Show profile pictures and pending notifications on manage page (rabuzarus, annando)
Show Profile photo album only to owner and authenticated contacts (rabuzarus)
User language setting is now between settings in user settings page (fabrixxm)
Search for remote users in form of "@user@domain.tld" is supported (issue #1595) (annando)
Optionally show geo informations of uploaded photos, backport from Red (rabuzarus)
Setting for the first day of the week for events calendar (annando)
Reduced profile view with "show more" link (annando)
Show more informations to users when following a new contact (annando)
Renamed "Statusnet" to "GNU Social" (annando)
Image dialog insert link to image page instead of direct image (fabrixxm)
In registration page make clear that we only need a 'real-looking' name (issue #1898) (tobiasd, n4rky)
Unseen items per groups are shown (issue #1718) (strk, rabuzarus, fabrixxm)
Unseen items in forumlist widget (rabuzarus)
Preview the last five conversations in private message's sidebar (FlxAlbroscheit, fabrixxm)
Don't get notifications about own posts (strk)
Profile page shows a "Subscribe to atom feed" link (annando)
Contact list shows only contacts from supported networks (ananndo)
username@hostname is used instead of full urls (issue #1925) (annando)
Various small OStatus improvements (annando)
Contact's posts are shown in a dedicated page (annando)
Module name is shown in page title to ease browser history navigation (issue #2079) (tobiasd)
What's new for admins:
Forumlist functionality moved from plugin to core (rabuzarus, annando)
Changes on poller/workers limits management (annando)
Diaspora and OStatus can be enabled only if requirements are satisfied (annando)
Support for additional passwords for ejabberd (annando)
Use proxy for profile photos (annando)
'Reload active themes' in theme admin page (fabrixxm)
Install routine checks for ImageMagick and GIF support (fabrixxm)
Install routine checks for availability of "mcrypt_create_iv()" function, needed for RINO2 (fabrixxm)
Only suported themes are shown in admin page (annando)
Optimized SQL queries (annando)
System perform an optimize pass on tables in cron, with maximum table size and minimum fragmentation level settings (annando)
New access keys in profile and contact pages (rabuzarus, annando)
Support for a new Diaspora command for post retraction (annando)
Show an info message if an empty contact group is shown (issue #1871) (annando)
User setting to disable network page autoupdate (issue #1921) (annando)
Settings to limit or permit access to crawler to search page (annando)
What's new for developers:
Themes can show Events entry in navbar (annando)
Themes can now override colorbox (fabrixxm)
Updated Vagrant development VM (silke, hauke)
New hook 'template_vars' (fabrixxm)
$baseurl variable is passed to all templates by default (fabrixxm)
OStatus delivery code is moved in new function (annando)
Doxygen config file and initial documetation of code (rabuzarus)
Full rewrite of util/php2po.php (fabrixxm)
Bugfixs:
Remote self works again (annando)
Fix feeds mistakenly recognized as OStatus (issue #1914) (annando)
Report invalid feeds to user (issue #1913) (annando)
Fix Update contact data functionality (annando)
Fix proxy function with embedded images (annando)
Fix Diaspora unidirectional connect request (annando)
Fix empty poco response (annando)
Fix API for andStatus (issue#1427, AndStatus issue #241) (annando)
Fix expiration of items (fabrixxm)
Fix javascript contact deletion confirmation dialog (issue #1986) (fabrixxm)
Admin wasn't able to change settings of not currently in use themes. Fixed (issue #2022) (fabrixxm)
Fix rapid repeated requests to GNUSocial instance (issue #2038) (annando)
Fix install routine css when mod_rewrite doesn't works (issue #2071) (fabrixxm)
Fix code to be compliant with minimum required PHP version (issue #2066) (fabrixxm, rabuzarus)
Fix feedback after succesfull registration (issue #2060) (annando)
Fix mention completition popup with TinyMCE (issue #1920) (fabrixxm)
Fix photo cache and proxy when installed in subfolder (ddorian1)
Fix bbcode conversion of the about text for the profile (issue #1607) (annando)
Version 3.4.2
Updates to the documentation (tobias, silke, annando)
Updates to the documentation (tobiasd, silke, annando)
Updates to the translations (tobiasd & translation teams)
Updates to themes frost-mobile, vier, duepuntozero, quattro (annando, tobiasd)
Enancements of the communications via OStatus and Diaspora protocols (annando)

@ -17,7 +17,7 @@ require_once('include/dbstructure.php');
define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_CODENAME', 'Lily of the valley');
define ( 'FRIENDICA_VERSION', '3.4.3-dev' );
define ( 'FRIENDICA_VERSION', '3.5-dev' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1191 );
define ( 'EOL', "<br />\r\n" );
@ -634,6 +634,9 @@ if(! class_exists('App')) {
$basepath = get_config("system", "basepath");
if ($basepath == "")
$basepath = dirname(__FILE__);
if ($basepath == "")
$basepath = $_SERVER["DOCUMENT_ROOT"];
@ -1945,3 +1948,15 @@ function validate_include(&$file) {
return true;
}
function current_load() {
if (!function_exists('sys_getloadavg'))
return false;
$load_arr = sys_getloadavg();
if (!is_array($load_arr))
return false;
return max($load_arr);
}

@ -346,6 +346,79 @@ Friendica doesn't allow showing followers of other users.
Friendica doesn't allow showing friends of other users.
## Implemented API calls (not compatible with other APIs)
### friendica/group_show
Return all or a specified group of the user with the containing contacts as array.
#### Parameters
* gid: optional, if not given, API returns all groups of the user
#### Return values
Array of:
* name: name of the group
* gid: id of the group
* user: array of group members (return from api_get_user() function for each member)
### friendica/group_delete
delete the specified group of contacts; API call need to include the correct gid AND name of the group to be deleted.
### Parameters
* gid: id of the group to be deleted
* name: name of the group to be deleted
#### Return values
Array of:
* success: true if successfully deleted
* gid: gid of the deleted group
* name: name of the deleted group
* status: „deleted“ if successfully deleted
* wrong users: empty array
### friendica/group_create
Create the group with the posted array of contacts as members.
#### Parameters
* name: name of the group to be created
#### POST data
JSON data as Array like the result of „users/group_show“:
* gid
* name
* array of users
#### Return values
Array of:
* success: true if successfully created or reactivated
* gid: gid of the created group
* name: name of the created group
* status: „missing user“ | „reactivated“ | „ok“
* wrong users: array of users, which were not available in the contact table
### friendica/group_update
Update the group with the posted array of contacts as members (post all members of the group to the call; function will remove members not posted).
#### Parameters
* gid: id of the group to be changed
* name: name of the group to be changed
#### POST data
JSON data as array like the result of „users/group_show“:
* gid
* name
* array of users
#### Return values
Array of:
* success: true if successfully updated
* gid: gid of the changed group
* name: name of the changed group
* status: „missing user“ | „ok“
* wrong users: array of users, which were not available in the contact table
## Not Implemented API calls
The following API calls are implemented in GNU Social but not in Friendica: (incomplete)

@ -192,9 +192,6 @@ function unmark_for_death($contact) {
}}
function get_contact_details_by_url($url, $uid = -1) {
require_once("mod/proxy.php");
require_once("include/bbcode.php");
if ($uid == -1)
$uid = local_user();
@ -268,15 +265,6 @@ function get_contact_details_by_url($url, $uid = -1) {
} else
$profile["cid"] = 0;
if (isset($profile["photo"]))
$profile["photo"] = proxy_url($profile["photo"], false, PROXY_SIZE_SMALL);
if (isset($profile["location"]))
$profile["location"] = bbcode($profile["location"]);
if (isset($profile["about"]))
$profile["about"] = bbcode($profile["about"]);
if (($profile["cid"] == 0) AND ($profile["network"] == NETWORK_DIASPORA)) {
$profile["location"] = "";
$profile["about"] = "";

@ -2,6 +2,27 @@
/* To-Do:
- Automatically detect if incoming data is HTML or BBCode
*/
/* Contact details:
Gerhard Seeber Mail: gerhard@seeber.at Friendica: http://mozartweg.dyndns.org/friendica/gerhard
*/
/*
* Change history:
Gerhard Seeber 2015-NOV-25 Add API call /friendica/group_show to return all or a single group
with the containing contacts (necessary for Windows 10 Universal app)
Gerhard Seeber 2015-NOV-27 Add API call /friendica/group_delete to delete the specified group id
(necessary for Windows 10 Universal app)
Gerhard Seeber 2015-DEC-01 Add API call /friendica/group_create to create a group with the specified
name and the given list of contacts (necessary for Windows 10 Universal
app)
Gerhard Seeber 2015-DEC-07 Add API call /friendica/group_update to update a group with the given
list of contacts (necessary for Windows 10 Universal app)
*
*/
require_once("include/bbcode.php");
require_once("include/datetime.php");
require_once("include/conversation.php");
@ -16,6 +37,7 @@
require_once('mod/wall_upload.php');
require_once("mod/proxy.php");
require_once("include/message.php");
require_once("include/group.php");
/*
@ -3012,6 +3034,205 @@ function api_best_nickname(&$contacts) {
$contacts = array($contacts[0]);
}
// return all or a specified group of the user with the containing contacts
function api_friendica_group_show(&$a, $type) {
if (api_user()===false) return false;
// params
$user_info = api_get_user($a);
$gid = (x($_REQUEST,'gid') ? $_REQUEST['gid'] : 0);
$uid = $user_info['uid'];
// get data of the specified group id or all groups if not specified
if ($gid != 0) {
$r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d AND `id` = %d",
intval($uid),
intval($gid));
// error message if specified gid is not in database
if (count($r) == 0)
die(api_error($a, $type, 'gid not available'));
}
else
$r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d",
intval($uid));
// loop through all groups and retrieve all members for adding data in the user array
foreach ($r as $rr) {
$members = group_get_members($rr['id']);
$users = array();
foreach ($members as $member) {
$user = api_get_user($a, $member['nurl']);
$users[] = $user;
}
$grps[] = array('name' => $rr['name'], 'gid' => $rr['id'], 'user' => $users);
}
return api_apply_template("group_show", $type, array('$groups' => $grps));
}
api_register_func('api/friendica/group_show', 'api_friendica_group_show', true);
// delete the specified group of the user
function api_friendica_group_delete(&$a, $type) {
if (api_user()===false) return false;
// params
$user_info = api_get_user($a);
$gid = (x($_REQUEST,'gid') ? $_REQUEST['gid'] : 0);
$name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
$uid = $user_info['uid'];
// error if no gid specified
if ($gid == 0 || $name == "")
die(api_error($a, $type, 'gid or name not specified'));
// get data of the specified group id
$r = q("SELECT * FROM `group` WHERE `uid` = %d AND `id` = %d",
intval($uid),
intval($gid));
// error message if specified gid is not in database
if (count($r) == 0)
die(api_error($a, $type, 'gid not available'));
// get data of the specified group id and group name
$rname = q("SELECT * FROM `group` WHERE `uid` = %d AND `id` = %d AND `name` = '%s'",
intval($uid),
intval($gid),
dbesc($name));
// error message if specified gid is not in database
if (count($rname) == 0)
die(api_error($a, $type, 'wrong group name'));
// delete group
$ret = group_rmv($uid, $name);
if ($ret) {
// return success
$success = array('success' => $ret, 'gid' => $gid, 'name' => $name, 'status' => 'deleted', 'wrong users' => array());
return api_apply_template("group_delete", $type, array('$result' => $success));
}
else
die(api_error($a, $type, 'other API error'));
}
api_register_func('api/friendica/group_delete', 'api_friendica_group_delete', true);
// create the specified group with the posted array of contacts
function api_friendica_group_create(&$a, $type) {
if (api_user()===false) return false;
// params
$user_info = api_get_user($a);
$name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
$uid = $user_info['uid'];
$json = json_decode($_POST['json'], true);
$users = $json['user'];
// error if no name specified
if ($name == "")
die(api_error($a, $type, 'group name not specified'));
// get data of the specified group name
$rname = q("SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' AND `deleted` = 0",
intval($uid),
dbesc($name));
// error message if specified group name already exists
if (count($rname) != 0)
die(api_error($a, $type, 'group name already exists'));
// check if specified group name is a deleted group
$rname = q("SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' AND `deleted` = 1",
intval($uid),
dbesc($name));
// error message if specified group name already exists
if (count($rname) != 0)
$reactivate_group = true;
// create group
$ret = group_add($uid, $name);
if ($ret)
$gid = group_byname($uid, $name);
else
die(api_error($a, $type, 'other API error'));
// add members
$erroraddinguser = false;
$errorusers = array();
foreach ($users as $user) {
$cid = $user['cid'];
// check if user really exists as contact
$contact = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d",
intval($cid),
intval($uid));
if (count($contact))
$result = group_add_member($uid, $name, $cid, $gid);
else {
$erroraddinguser = true;
$errorusers[] = $cid;
}
}
// return success message incl. missing users in array
$status = ($erroraddinguser ? "missing user" : ($reactivate_group ? "reactivated" : "ok"));
$success = array('success' => true, 'gid' => $gid, 'name' => $name, 'status' => $status, 'wrong users' => $errorusers);
return api_apply_template("group_create", $type, array('result' => $success));
}
api_register_func('api/friendica/group_create', 'api_friendica_group_create', true);
// update the specified group with the posted array of contacts
function api_friendica_group_update(&$a, $type) {
if (api_user()===false) return false;
// params
$user_info = api_get_user($a);
$uid = $user_info['uid'];
$gid = (x($_REQUEST, 'gid') ? $_REQUEST['gid'] : 0);
$name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
$json = json_decode($_POST['json'], true);
$users = $json['user'];
// error if no name specified
if ($name == "")
die(api_error($a, $type, 'group name not specified'));
// error if no gid specified
if ($gid == "")
die(api_error($a, $type, 'gid not specified'));
// remove members
$members = group_get_members($gid);
foreach ($members as $member) {
$cid = $member['id'];
foreach ($users as $user) {
$found = ($user['cid'] == $cid ? true : false);
}
if (!$found) {
$ret = group_rmv_member($uid, $name, $cid);
}
}
// add members
$erroraddinguser = false;
$errorusers = array();
foreach ($users as $user) {
$cid = $user['cid'];
// check if user really exists as contact
$contact = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d",
intval($cid),
intval($uid));
if (count($contact))
$result = group_add_member($uid, $name, $cid, $gid);
else {
$erroraddinguser = true;
$errorusers[] = $cid;
}
}
// return success message incl. missing users in array
$status = ($erroraddinguser ? "missing user" : "ok");
$success = array('success' => true, 'gid' => $gid, 'name' => $name, 'status' => $status, 'wrong users' => $errorusers);
return api_apply_template("group_update", $type, array('result' => $success));
}
api_register_func('api/friendica/group_update', 'api_friendica_group_update', true);
/*
To.Do:

@ -5,6 +5,8 @@ require_once('include/security.php');
require_once('include/datetime.php');
function nuke_session() {
session_unset();
/*
new_cookie(0); // make sure cookie is deleted on browser close, as a security measure
unset($_SESSION['authenticated']);
@ -20,10 +22,11 @@ function nuke_session() {
unset($_SESSION['my_address']);
unset($_SESSION['addr']);
unset($_SESSION['return_url']);
*/
}
// login/logout
// login/logout
@ -31,7 +34,7 @@ function nuke_session() {
if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-params'))) || ($_POST['auth-params'] !== 'login'))) {
if(((x($_POST,'auth-params')) && ($_POST['auth-params'] === 'logout')) || ($a->module === 'logout')) {
// process logout request
call_hooks("logging_out");
nuke_session();
@ -203,9 +206,14 @@ else {
}
function new_cookie($time) {
$a = get_app();
$old_sid = session_id();
session_set_cookie_params("$time");
session_set_cookie_params($time);
//session_set_cookie_params($time, "/", $a->get_hostname());
session_regenerate_id(false);
q("UPDATE session SET sid = '%s' WHERE sid = '%s'", dbesc(session_id()), dbesc($old_sid));
logger("Session parameter lifetime: ".$time." - got: ".print_r(session_get_cookie_params(), true), LOGGER_DEBUG);
}

@ -951,7 +951,7 @@ function item_photo_menu($item){
* @param array &$conv_responses (already created with builtin activity structure)
* @return void
*/
if(! function_exists(builtin_activity_puller)) {
if(! function_exists('builtin_activity_puller')) {
function builtin_activity_puller($item, &$conv_responses) {
foreach($conv_responses as $mode => $v) {
$url = '';

@ -44,10 +44,11 @@ function cron_run(&$argv, &$argc){
$maxsysload = intval(get_config('system','maxloadavg'));
if($maxsysload < 1)
$maxsysload = 50;
if(function_exists('sys_getloadavg')) {
$load = sys_getloadavg();
if(intval($load[0]) > $maxsysload) {
logger('system: load ' . $load[0] . ' too high. cron deferred to next scheduled run.');
$load = current_load();
if($load) {
if(intval($load) > $maxsysload) {
logger('system: load ' . $load . ' too high. cron deferred to next scheduled run.');
return;
}
}
@ -189,24 +190,39 @@ function cron_run(&$argv, &$argc){
q('DELETE FROM `photo` WHERE `uid` = 0 AND `resource-id` LIKE "pic:%%" AND `created` < NOW() - INTERVAL %d SECOND', $cachetime);
}
// maximum table size in megabyte
// Maximum table size in megabyte
$max_tablesize = intval(get_config('system','optimize_max_tablesize')) * 1000000;
if ($max_tablesize == 0)
$max_tablesize = 100 * 1000000; // Default are 100 MB
// Minimum fragmentation level in percent
$fragmentation_level = intval(get_config('system','optimize_fragmentation')) / 100;
if ($fragmentation_level == 0)
$fragmentation_level = 0.3; // Default value is 30%
// Optimize some tables that need to be optimized
$r = q("SHOW TABLE STATUS");
foreach($r as $table) {
// Don't optimize tables that needn't to be optimized
if ($table["Data_free"] == 0)
continue;
// Don't optimize tables that are too large
if ($table["Data_length"] > $max_tablesize)
continue;
// Don't optimize empty tables
if ($table["Data_length"] == 0)
continue;
// Calculate fragmentation
$fragmentation = $table["Data_free"] / $table["Data_length"];
logger("Table ".$table["Name"]." - Fragmentation level: ".round($fragmentation * 100, 2), LOGGER_DEBUG);
// Don't optimize tables that needn't to be optimized
if ($fragmentation < $fragmentation_level)
continue;
// So optimize it
logger("Optimize Table ".$table["Name"], LOGGER_DEBUG);
q("OPTIMIZE TABLE `%s`", dbesc($table["Name"]));
}

@ -27,10 +27,11 @@ function cronhooks_run(&$argv, &$argc){
$maxsysload = intval(get_config('system','maxloadavg'));
if($maxsysload < 1)
$maxsysload = 50;
if(function_exists('sys_getloadavg')) {
$load = sys_getloadavg();
if(intval($load[0]) > $maxsysload) {
logger('system: load ' . $load[0] . ' too high. Cronhooks deferred to next scheduled run.');
$load = current_load();
if($load) {
if(intval($load) > $maxsysload) {
logger('system: load ' . $load . ' too high. Cronhooks deferred to next scheduled run.');
return;
}
}

@ -59,10 +59,11 @@ function delivery_run(&$argv, &$argc){
$maxsysload = intval(get_config('system','maxloadavg'));
if($maxsysload < 1)
$maxsysload = 50;
if(function_exists('sys_getloadavg')) {
$load = sys_getloadavg();
if(intval($load[0]) > $maxsysload) {
logger('system: load ' . $load[0] . ' too high. Delivery deferred to next queue run.');
$load = current_load();
if($load) {
if(intval($load) > $maxsysload) {
logger('system: load ' . $load . ' too high. Delivery deferred to next queue run.');
return;
}
}

@ -28,10 +28,11 @@ function discover_poco_run(&$argv, &$argc){
$maxsysload = intval(get_config('system','maxloadavg'));
if($maxsysload < 1)
$maxsysload = 50;
if(function_exists('sys_getloadavg')) {
$load = sys_getloadavg();
if(intval($load[0]) > $maxsysload) {
logger('system: load ' . $load[0] . ' too high. discover_poco deferred to next scheduled run.');
$load = current_load();
if($load) {
if(intval($load) > $maxsysload) {
logger('system: load ' . $load . ' too high. discover_poco deferred to next scheduled run.');
return;
}
}

@ -4,7 +4,8 @@
*/
require_once('include/forums.php');
require_once('include/bbcode.php');
require_once("mod/proxy.php");
/**
*
@ -108,7 +109,6 @@ if(! function_exists('profile_load')) {
else
$a->page['aside'] .= profile_sidebar($a->profile, $block);
/*if(! $block)
$a->page['aside'] .= contact_block();*/
@ -199,7 +199,7 @@ if(! function_exists('profile_sidebar')) {
if (($profile['network'] != "") AND ($profile['network'] != NETWORK_DFRN)) {
$profile['network_name'] = format_network_name($profile['network'],$profile['url']);
} else
} else
$profile['network_name'] = "";
call_hooks('profile_sidebar_enter', $profile);
@ -287,11 +287,11 @@ if(! function_exists('profile_sidebar')) {
}
// check if profile is a forum
if((x($profile['page-flags']) == 2)
|| (x($profile['page-flags']) == 5)
|| (x($profile['forum']))
|| (x($profile['prv']))
|| (x($profile['community'])))
if((intval($profile['page-flags']) == PAGE_COMMUNITY)
|| (intval($profile['page-flags']) == PAGE_PRVGROUP)
|| (intval($profile['forum']))
|| (intval($profile['prv']))
|| (intval($profile['community'])))
$account_type = t('Forum');
else
$account_type = "";
@ -360,6 +360,15 @@ if(! function_exists('profile_sidebar')) {
$p[$k] = $v;
}
if (isset($p["about"]))
$p["about"] = bbcode($p["about"]);
if (isset($p["location"]))
$p["location"] = bbcode($p["location"]);
if (isset($p["photo"]))
$p["photo"] = proxy_url($p["photo"], false, PROXY_SIZE_SMALL);
if($a->theme['template_engine'] === 'internal')
$location = template_escape($location);

@ -4402,7 +4402,7 @@ function atom_author($tag,$name,$uri,$h,$w,$photo,$geo) {
$o .= "\t<poco:preferredUsername>".xmlify($r[0]["nick"])."</poco:preferredUsername>\r\n";
$o .= "\t<poco:displayName>".xmlify($r[0]["name"])."</poco:displayName>\r\n";
$o .= "\t<poco:note>".xmlify($r[0]["about"])."</poco:note>\r\n";
$o .= "\t<poco:note>".xmlify(bbcode($r[0]["about"]))."</poco:note>\r\n";
$o .= "\t<poco:address>\r\n";
$o .= "\t\t<poco:formatted>".xmlify($location)."</poco:formatted>\r\n";
$o .= "\t</poco:address>\r\n";

@ -2,6 +2,7 @@
require_once("include/Contact.php");
require_once("include/threads.php");
require_once("include/html2bbcode.php");
require_once("include/bbcode.php");
require_once("include/items.php");
require_once("mod/share.php");
require_once("include/enotify.php");
@ -142,7 +143,7 @@ function ostatus_fetchauthor($xpath, $context, $importer, &$contact, $onlyfetch)
$value = $xpath->evaluate('atom:author/poco:note/text()', $context)->item(0)->nodeValue;
if ($value != "")
$contact["about"] = $value;
$contact["about"] = html2bbcode($value);
$value = $xpath->evaluate('atom:author/poco:address/poco:formatted/text()', $context)->item(0)->nodeValue;
if ($value != "")

@ -26,18 +26,22 @@ function poller_run(&$argv, &$argc){
unset($db_host, $db_user, $db_pass, $db_data);
};
if(function_exists('sys_getloadavg')) {
$load = current_load();
if($load) {
$maxsysload = intval(get_config('system','maxloadavg'));
if($maxsysload < 1)
$maxsysload = 50;
$load = sys_getloadavg();
if(intval($load[0]) > $maxsysload) {
logger('system: load ' . $load[0] . ' too high. poller deferred to next scheduled run.');
if(intval($load) > $maxsysload) {
logger('system: load ' . $load . ' too high. poller deferred to next scheduled run.');
return;
}
}
// Checking the number of workers
if (poller_too_much_workers(1))
return;
if(($argc <= 1) OR ($argv[1] != "no_cron")) {
// Run the cron job that calls all other jobs
proc_run("php","include/cron.php");
@ -57,17 +61,21 @@ function poller_run(&$argv, &$argc){
}
} else
// Sleep two seconds before checking for running processes to avoid having too many workers
// Sleep four seconds before checking for running processes again to avoid having too many workers
sleep(4);
// Checking number of workers
if (poller_too_much_workers())
if (poller_too_much_workers(2))
return;
$starttime = time();
while ($r = q("SELECT * FROM `workerqueue` WHERE `executed` = '0000-00-00 00:00:00' ORDER BY `created` LIMIT 1")) {
// Count active workers and compare them with a maximum value that depends on the load
if (poller_too_much_workers(3))
return;
q("UPDATE `workerqueue` SET `executed` = '%s', `pid` = %d WHERE `id` = %d AND `executed` = '0000-00-00 00:00:00'",
dbesc(datetime_convert()),
intval(getmypid()),
@ -100,10 +108,10 @@ function poller_run(&$argv, &$argc){
$funcname=str_replace(".php", "", basename($argv[0]))."_run";
if (function_exists($funcname)) {
logger("Process ".getmypid().": ".$funcname." ".$r[0]["parameter"]);
logger("Process ".getmypid()." - ID ".$r[0]["id"].": ".$funcname." ".$r[0]["parameter"]);
$funcname($argv, $argc);
logger("Process ".getmypid().": ".$funcname." - done");
logger("Process ".getmypid()." - ID ".$r[0]["id"].": ".$funcname." - done");
q("DELETE FROM `workerqueue` WHERE `id` = %d", intval($r[0]["id"]));
} else
@ -112,15 +120,11 @@ function poller_run(&$argv, &$argc){
// Quit the poller once every hour
if (time() > ($starttime + 3600))
return;
// Count active workers and compare them with a maximum value that depends on the load
if (poller_too_much_workers())
return;
}
}
function poller_too_much_workers() {
function poller_too_much_workers($stage) {
$queues = get_config("system", "worker_queues");
@ -130,9 +134,8 @@ function poller_too_much_workers() {
$active = poller_active_workers();
// Decrease the number of workers at higher load
if(function_exists('sys_getloadavg')) {
$load = max(sys_getloadavg());
$load = current_load();
if($load) {
$maxsysload = intval(get_config('system','maxloadavg'));
if($maxsysload < 1)
$maxsysload = 50;
@ -144,7 +147,7 @@ function poller_too_much_workers() {
$slope = $maxworkers / pow($maxsysload, $exponent);
$queues = ceil($slope * pow(max(0, $maxsysload - $load), $exponent));
logger("Current load: ".$load." - maximum: ".$maxsysload." - current queues: ".$active." - maximum: ".$queues, LOGGER_DEBUG);
logger("Current load stage ".$stage.": ".$load." - maximum: ".$maxsysload." - current queues: ".$active." - maximum: ".$queues, LOGGER_DEBUG);
}

@ -79,7 +79,7 @@ ini_set('session.gc_probability', $gc_probability);
ini_set('session.use_only_cookies', 1);
ini_set('session.cookie_httponly', 1);
session_set_save_handler ('ref_session_open', 'ref_session_close',
'ref_session_read', 'ref_session_write',
'ref_session_destroy', 'ref_session_gc');
if (!get_config('system', 'disable_database_session'))
session_set_save_handler('ref_session_open', 'ref_session_close',
'ref_session_read', 'ref_session_write',
'ref_session_destroy', 'ref_session_gc');

@ -56,10 +56,11 @@ if(!$install) {
$maxsysload_frontend = intval(get_config('system','maxloadavg_frontend'));
if($maxsysload_frontend < 1)
$maxsysload_frontend = 50;
if(function_exists('sys_getloadavg')) {
$load = sys_getloadavg();
if(intval($load[0]) > $maxsysload_frontend) {
logger('system: load ' . $load[0] . ' too high. Service Temporarily Unavailable.');
$load = current_load();
if($load) {
if($load > $maxsysload_frontend) {
logger('system: load ' . $load . ' too high. Service Temporarily Unavailable.');
header($_SERVER["SERVER_PROTOCOL"].' 503 Service Temporarily Unavailable');
header('Retry-After: 300');
die("System is currently unavailable. Please try again later");

@ -1,6 +1,21 @@
function resizeIframe(obj) {
obj.style.height = 0;
obj.style.height = obj.contentWindow.document.body.scrollHeight + 'px';
_resizeIframe(obj, 0);
}
function _resizeIframe(obj, desth) {
var h = obj.style.height;
var ch = obj.contentWindow.document.body.scrollHeight + 'px';
if (h==ch) {
return;
}
console.log("_resizeIframe", obj, desth, ch);
if (desth!=ch) {
setTimeout(_resizeIframe, 500, obj, ch);
} else {
obj.style.height = ch;
setTimeout(_resizeIframe, 1000, obj, ch);
}
}
function openClose(theID) {

@ -410,6 +410,7 @@ function admin_page_site_post(&$a){
$maxloadavg = ((x($_POST,'maxloadavg')) ? intval(trim($_POST['maxloadavg'])) : 50);
$maxloadavg_frontend = ((x($_POST,'maxloadavg_frontend')) ? intval(trim($_POST['maxloadavg_frontend'])) : 50);
$optimize_max_tablesize = ((x($_POST,'optimize_max_tablesize')) ? intval(trim($_POST['optimize_max_tablesize'])): 100);
$optimize_fragmentation = ((x($_POST,'optimize_fragmentation')) ? intval(trim($_POST['optimize_fragmentation'])): 30);
$poco_completion = ((x($_POST,'poco_completion')) ? intval(trim($_POST['poco_completion'])) : false);
$poco_requery_days = ((x($_POST,'poco_requery_days')) ? intval(trim($_POST['poco_requery_days'])) : 7);
$poco_discovery = ((x($_POST,'poco_discovery')) ? intval(trim($_POST['poco_discovery'])) : 0);
@ -492,6 +493,7 @@ function admin_page_site_post(&$a){
set_config('system','maxloadavg',$maxloadavg);
set_config('system','maxloadavg_frontend',$maxloadavg_frontend);
set_config('system','optimize_max_tablesize',$optimize_max_tablesize);
set_config('system','optimize_fragmentation',$optimize_fragmentation);
set_config('system','poco_completion',$poco_completion);
set_config('system','poco_requery_days',$poco_requery_days);
set_config('system','poco_discovery',$poco_discovery);
@ -775,6 +777,7 @@ function admin_page_site(&$a) {
'$maxloadavg' => array('maxloadavg', t("Maximum Load Average"), ((intval(get_config('system','maxloadavg')) > 0)?get_config('system','maxloadavg'):50), t("Maximum system load before delivery and poll processes are deferred - default 50.")),
'$maxloadavg_frontend' => array('maxloadavg_frontend', t("Maximum Load Average (Frontend)"), ((intval(get_config('system','maxloadavg_frontend')) > 0)?get_config('system','maxloadavg_frontend'):50), t("Maximum system load before the frontend quits service - default 50.")),
'$optimize_max_tablesize'=> array('optimize_max_tablesize', t("Maximum table size for optimization"), ((intval(get_config('system','optimize_max_tablesize')) > 0)?get_config('system','optimize_max_tablesize'):100), t("Maximum table size (in MB) for the automatic optimization - default 100 MB. Enter -1 to disable it.")),
'$optimize_fragmentation'=> array('optimize_fragmentation', t("Minimum level of fragmentation"), ((intval(get_config('system','optimize_fragmentation')) > 0)?get_config('system','optimize_fragmentation'):30), t("Minimum fragmenation level to start the automatic optimization - default value is 30%.")),
'$poco_completion' => array('poco_completion', t("Periodical check of global contacts"), get_config('system','poco_completion'), t("If enabled, the global contacts are checked periodically for missing or outdated data and the vitality of the contacts and servers.")),
'$poco_requery_days' => array('poco_requery_days', t("Days between requery"), get_config('system','poco_requery_days'), t("Number of days after which a server is requeried for his contacts.")),

@ -32,7 +32,12 @@ function allfriends_content(&$a) {
$a->page['aside'] = "";
profile_load($a, "", 0, get_contact_details_by_url($c[0]["url"]));
$r = all_friends(local_user(),$cid);
$total = count_all_friends(local_user(), $cid);
if(count($total))
$a->set_pager_total($total);
$r = all_friends(local_user(), $cid, $a->pager['start'], $a->pager['itemspage']);
if(! count($r)) {
$o .= t('No friends to display.');
@ -87,8 +92,8 @@ function allfriends_content(&$a) {
//'$title' => sprintf( t('Friends of %s'), htmlentities($c[0]['name'])),
'$tab_str' => $tab_str,
'$contacts' => $entries,
'$paginate' => paginate($a),
));
// $o .= paginate($a);
return $o;
}

@ -76,23 +76,22 @@ function common_content(&$a) {
if($cid)
$t = count_common_friends($uid,$cid);
$t = count_common_friends($uid, $cid);
else
$t = count_common_friends_zcid($uid,$zcid);
$t = count_common_friends_zcid($uid, $zcid);
$a->set_pager_total($t);
if(! $t) {
if(count($t))
$a->set_pager_total($t);
else {
notice( t('No contacts in common.') . EOL);
return $o;
}
if($cid)
$r = common_friends($uid,$cid);
$r = common_friends($uid, $cid, $a->pager['start'], $a->pager['itemspage']);
else
$r = common_friends_zcid($uid,$zcid);
$r = common_friends_zcid($uid, $zcid, $a->pager['start'], $a->pager['itemspage']);
if(! count($r)) {
@ -140,8 +139,8 @@ function common_content(&$a) {
'$title' => $title,
'$tab_str' => $tab_str,
'$contacts' => $entries,
'$paginate' => paginate($a),
));
// $o .= paginate($a);
return $o;
}

@ -903,7 +903,7 @@ function contact_posts($a, $contact_id) {
$r = q("SELECT COUNT(*) AS `total` FROM `item`
WHERE `item`.`uid` = %d AND `author-link` IN ('%s', '%s')",
intval(local_user()),
dbesc(normalise_link($contact["url"])),
dbesc(str_replace("https://", "http://", $contact["url"])),
dbesc(str_replace("http://", "https://", $contact["url"])));
$a->set_pager_total($r[0]['total']);
@ -918,7 +918,7 @@ function contact_posts($a, $contact_id) {
ORDER BY `item`.`created` DESC LIMIT %d, %d",
intval(local_user()),
intval($contact_id),
dbesc(normalise_link($contact["url"])),
dbesc(str_replace("https://", "http://", $contact["url"])),
dbesc(str_replace("http://", "https://", $contact["url"])),
intval($a->pager['start']),
intval($a->pager['itemspage'])

@ -57,19 +57,19 @@ function directory_content(&$a) {
$sql_extra = " AND ((`profile`.`name` LIKE '%$search%') OR
(`user`.`nickname` LIKE '%$search%') OR
(`pdesc` LIKE '%$search%') OR
(`locality` LIKE '%$search%') OR
(`region` LIKE '%$search%') OR
(`country-name` LIKE '%$search%') OR
(`gender` LIKE '%$search%') OR
(`marital` LIKE '%$search%') OR
(`sexual` LIKE '%$search%') OR
(`about` LIKE '%$search%') OR
(`romance` LIKE '%$search%') OR
(`work` LIKE '%$search%') OR
(`education` LIKE '%$search%') OR
(`pub_keywords` LIKE '%$search%') OR
(`prv_keywords` LIKE '%$search%'))";
(`profile`.`pdesc` LIKE '%$search%') OR
(`profile`.`locality` LIKE '%$search%') OR
(`profile`.`region` LIKE '%$search%') OR
(`profile`.`country-name` LIKE '%$search%') OR
(`profile`.`gender` LIKE '%$search%') OR
(`profile`.`marital` LIKE '%$search%') OR
(`profile`.`sexual` LIKE '%$search%') OR
(`profile`.`about` LIKE '%$search%') OR
(`profile`.`romance` LIKE '%$search%') OR
(`profile`.`work` LIKE '%$search%') OR
(`profile`.`education` LIKE '%$search%') OR
(`profile`.`pub_keywords` LIKE '%$search%') OR
(`profile`.`prv_keywords` LIKE '%$search%'))";
}
$publish = ((get_config('system','publish_all')) ? '' : " AND `publish` = 1 " );

@ -89,15 +89,13 @@ function display_init(&$a) {
}
function display_fetchauthor($a, $item) {
require_once("mod/proxy.php");
require_once("include/bbcode.php");
$profiledata = array();
$profiledata["uid"] = -1;
$profiledata["nickname"] = $item["author-name"];
$profiledata["name"] = $item["author-name"];
$profiledata["picdate"] = "";
$profiledata["photo"] = proxy_url($item["author-avatar"], false, PROXY_SIZE_SMALL);
$profiledata["photo"] = $item["author-avatar"];
$profiledata["url"] = $item["author-link"];
$profiledata["network"] = $item["network"];
@ -174,9 +172,9 @@ function display_fetchauthor($a, $item) {
$r[0]["about"] = "";
}
$profiledata["photo"] = proxy_url($r[0]["photo"], false, PROXY_SIZE_SMALL);
$profiledata["address"] = bbcode($r[0]["location"]);
$profiledata["about"] = bbcode($r[0]["about"]);
$profiledata["photo"] = $r[0]["photo"];
$profiledata["address"] = $r[0]["location"];
$profiledata["about"] = $r[0]["about"];
if ($r[0]["nick"] != "")
$profiledata["nickname"] = $r[0]["nick"];
}
@ -185,11 +183,11 @@ function display_fetchauthor($a, $item) {
$r = q("SELECT `avatar`, `nick`, `location`, `about` FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($profiledata["url"])));
if (count($r)) {
if ($profiledata["photo"] == "")
$profiledata["photo"] = proxy_url($r[0]["avatar"], false, PROXY_SIZE_SMALL);
$profiledata["photo"] = $r[0]["avatar"];
if (($profiledata["address"] == "") AND ($profiledata["network"] != NETWORK_DIASPORA))
$profiledata["address"] = bbcode($r[0]["location"]);
$profiledata["address"] = $r[0]["location"];
if (($profiledata["about"] == "") AND ($profiledata["network"] != NETWORK_DIASPORA))
$profiledata["about"] = bbcode($r[0]["about"]);
$profiledata["about"] = $r[0]["about"];
if (($profiledata["nickname"] == "") AND ($r[0]["nick"] != ""))
$profiledata["nickname"] = $r[0]["nick"];
}
@ -212,7 +210,6 @@ function display_content(&$a, $update = 0) {
return;
}
require_once("include/bbcode.php");
require_once('include/security.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');

@ -197,12 +197,13 @@ function photo_init(&$a) {
// If the photo is public and there is an existing photo directory store the photo there
if ($public and ($file != "")) {
// If the photo path isn't there, try to create it
if (!is_dir($_SERVER["DOCUMENT_ROOT"]."/photo"))
if (is_writable($_SERVER["DOCUMENT_ROOT"]))
mkdir($_SERVER["DOCUMENT_ROOT"]."/photo");
$basepath = $a->get_basepath();
if (!is_dir($basepath."/photo"))
if (is_writable($basepath))
mkdir($basepath."/photo");
if (is_dir($_SERVER["DOCUMENT_ROOT"]."/photo"))
file_put_contents($_SERVER["DOCUMENT_ROOT"]."/photo/".$file, $data);
if (is_dir($basepath."/photo"))
file_put_contents($basepath."/photo/".$file, $data);
}
killme();

@ -37,7 +37,7 @@ function photos_init(&$a) {
$profile = get_profiledata_by_nick($nick, $a->profile_uid);
if((x($profile['page-flags']) == 2) || (x($profile['page-flags']) == 5))
if((intval($profile['page-flags']) == PAGE_COMMUNITY) || (intval($profile['page-flags']) == PAGE_PRVGROUP))
$account_type = t('Forum');
else
$account_type = "";

@ -44,14 +44,15 @@ function proxy_init() {
$thumb = false;
$size = 1024;
$sizetype = "";
$basepath = $a->get_basepath();
// If the cache path isn't there, try to create it
if (!is_dir($_SERVER["DOCUMENT_ROOT"]."/proxy"))
if (is_writable($_SERVER["DOCUMENT_ROOT"]))
mkdir($_SERVER["DOCUMENT_ROOT"]."/proxy");
if (!is_dir($basepath."/proxy"))
if (is_writable($basepath))
mkdir($basepath."/proxy");
// Checking if caching into a folder in the webroot is activated and working
$direct_cache = (is_dir($_SERVER["DOCUMENT_ROOT"]."/proxy") AND is_writable($_SERVER["DOCUMENT_ROOT"]."/proxy"));
$direct_cache = (is_dir($basepath."/proxy") AND is_writable($basepath."/proxy"));
// Look for filename in the arguments
if ((isset($a->argv[1]) OR isset($a->argv[2]) OR isset($a->argv[3])) AND !isset($_REQUEST["url"])) {
@ -211,9 +212,9 @@ function proxy_init() {
// advantage: real file access is really fast
// Otherwise write in cachefile
if ($valid AND $direct_cache) {
file_put_contents($_SERVER["DOCUMENT_ROOT"]."/proxy/".proxy_url($_REQUEST['url'], true), $img_str_orig);
file_put_contents($basepath."/proxy/".proxy_url($_REQUEST['url'], true), $img_str_orig);
if ($sizetype <> '')
file_put_contents($_SERVER["DOCUMENT_ROOT"]."/proxy/".proxy_url($_REQUEST['url'], true).$sizetype, $img_str);
file_put_contents($basepath."/proxy/".proxy_url($_REQUEST['url'], true).$sizetype, $img_str);
} elseif ($cachefile != '')
file_put_contents($cachefile, $img_str_orig);
@ -247,7 +248,7 @@ function proxy_url($url, $writemode = false, $size = "") {
return($url);
// Creating a sub directory to reduce the amount of files in the cache directory
$basepath = $_SERVER["DOCUMENT_ROOT"]."/proxy";
$basepath = $a->get_basepath()."/proxy";
$path = substr(hash("md5", $url), 0, 2);

@ -39,7 +39,7 @@ function pubsubhubbub_init(&$a) {
http_status_exit(404);
}
logger("pubsubhubbub: $hub_mode request from " .
logger("pubsubhubbub: $hub_mode request from " .
$_SERVER['REMOTE_ADDR']);
// get the nick name from the topic, a bit hacky but needed
@ -52,9 +52,9 @@ function pubsubhubbub_init(&$a) {
// fetch user from database given the nickname
$r = q("SELECT * FROM `user` WHERE `nickname` = '%s'" .
" AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1",
" AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1",
dbesc($nick));
if(!count($r)) {
logger('pubsubhubbub: local account not found: ' . $nick);
http_status_exit(404);
@ -70,8 +70,8 @@ function pubsubhubbub_init(&$a) {
}
// get corresponding row from contact table
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `blocked` = 0" .
" AND `pending` = 0 LIMIT 1",
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND NOT `blocked`".
" AND NOT `pending` AND `self` LIMIT 1",
intval($owner['uid']));
if(!count($r)) {
logger('pubsubhubbub: contact not found.');
@ -82,20 +82,20 @@ function pubsubhubbub_init(&$a) {
// sanity check that topic URLs are the same
if(!link_compare($hub_topic, $contact['poll'])) {
logger('pubsubhubbub: hub topic ' . $hub_topic . ' != ' .
logger('pubsubhubbub: hub topic ' . $hub_topic . ' != ' .
$contact['poll']);
http_status_exit(404);
}
// do subscriber verification according to the PuSH protocol
$hub_challenge = random_string(40);
$params = 'hub.mode=' .
$params = 'hub.mode=' .
($subscribe == 1 ? 'subscribe' : 'unsubscribe') .
'&hub.topic=' . urlencode($hub_topic) .
'&hub.challenge=' . $hub_challenge .
'&hub.lease_seconds=604800' .
'&hub.verify_token=' . $hub_verify_token;
// lease time is hard coded to one week (in seconds)
// we don't actually enforce the lease time because GNU
// Social/StatusNet doesn't honour it (yet)

@ -33,7 +33,7 @@ function videos_init(&$a) {
$profile = get_profiledata_by_nick($nick, $a->profile_uid);
if((x($profile['page-flags']) == 2) || (x($profile['page-flags']) == 5))
if((intval($profile['page-flags']) == PAGE_COMMUNITY) || (intval($profile['page-flags']) == PAGE_PRVGROUP))
$account_type = t('Forum');
else
$account_type = "";

@ -108,6 +108,7 @@ Oliver
Olivier
Olivier Migeot
Pavel Morozov
Perig Gouanvic
peturisfeld
Piotr Blonkowski
pokerazor

File diff suppressed because it is too large Load Diff

@ -48,7 +48,7 @@ case "$MODE" in
OUTFILE="$FULLPATH/messages.po"
FINDSTARTDIR="."
# skip addon folder
FINDOPTS="( -wholename */addon -or -wholename */smarty3 ) -prune -o"
FINDOPTS="( -wholename */addon -or -wholename */addons-extra -or -wholename */smarty3 ) -prune -o"
F9KVERSION=$(sed -n "s/.*'FRIENDICA_VERSION'.*'\([0-9.]*\)'.*/\1/p" ./boot.php);
echo "Friendica version $F9KVERSION"

File diff suppressed because it is too large Load Diff

@ -5,6 +5,8 @@ function string_plural_select_de($n){
return ($n != 1);;
}}
;
$a->strings["Network:"] = "Netzwerk";
$a->strings["Forum"] = "Forum";
$a->strings["%d contact edited."] = array(
0 => "%d Kontakt bearbeitet.",
1 => "%d Kontakte bearbeitet",
@ -33,28 +35,11 @@ $a->strings["(Update was successful)"] = "(Aktualisierung war erfolgreich)";
$a->strings["(Update was not successful)"] = "(Aktualisierung war nicht erfolgreich)";
$a->strings["Suggest friends"] = "Kontakte vorschlagen";
$a->strings["Network type: %s"] = "Netzwerktyp: %s";
$a->strings["%d contact in common"] = array(
0 => "%d gemeinsamer Kontakt",
1 => "%d gemeinsame Kontakte",
);
$a->strings["View all contacts"] = "Alle Kontakte anzeigen";
$a->strings["Unblock"] = "Entsperren";
$a->strings["Block"] = "Sperren";
$a->strings["Toggle Blocked status"] = "Geblockt-Status ein-/ausschalten";
$a->strings["Unignore"] = "Ignorieren aufheben";
$a->strings["Ignore"] = "Ignorieren";
$a->strings["Toggle Ignored status"] = "Ignoriert-Status ein-/ausschalten";
$a->strings["Unarchive"] = "Aus Archiv zurückholen";
$a->strings["Archive"] = "Archivieren";
$a->strings["Toggle Archive status"] = "Archiviert-Status ein-/ausschalten";
$a->strings["Repair"] = "Reparieren";
$a->strings["Advanced Contact Settings"] = "Fortgeschrittene Kontakteinstellungen";
$a->strings["Communications lost with this contact!"] = "Verbindungen mit diesem Kontakt verloren!";
$a->strings["Fetch further information for feeds"] = "Weitere Informationen zu Feeds holen";
$a->strings["Disabled"] = "Deaktiviert";
$a->strings["Fetch information"] = "Beziehe Information";
$a->strings["Fetch information and keywords"] = "Beziehe Information und Schlüsselworte";
$a->strings["Contact Editor"] = "Kontakt Editor";
$a->strings["Submit"] = "Senden";
$a->strings["Profile Visibility"] = "Profil-Sichtbarkeit";
$a->strings["Please choose the profile you would like to display to %s when viewing your profile securely."] = "Bitte wähle eines Deiner Profile das angezeigt werden soll, wenn %s Dein Profil aufruft.";
@ -70,6 +55,10 @@ $a->strings["Last update:"] = "Letzte Aktualisierung: ";
$a->strings["Update public posts"] = "Öffentliche Beiträge aktualisieren";
$a->strings["Update now"] = "Jetzt aktualisieren";
$a->strings["Connect/Follow"] = "Verbinden/Folgen";
$a->strings["Unblock"] = "Entsperren";
$a->strings["Block"] = "Sperren";
$a->strings["Unignore"] = "Ignorieren aufheben";
$a->strings["Ignore"] = "Ignorieren";
$a->strings["Currently blocked"] = "Derzeit geblockt";
$a->strings["Currently ignored"] = "Derzeit ignoriert";
$a->strings["Currently archived"] = "Momentan archiviert";
@ -80,6 +69,9 @@ $a->strings["Send a notification of every new post of this contact"] = "Sende ei
$a->strings["Blacklisted keywords"] = "Blacklistete Schlüsselworte ";
$a->strings["Comma separated list of keywords that should not be converted to hashtags, when \"Fetch information and keywords\" is selected"] = "Komma-Separierte Liste mit Schlüsselworten, die nicht in Hashtags konvertiert werden, wenn \"Beziehe Information und Schlüsselworte\" aktiviert wurde";
$a->strings["Profile URL"] = "Profil URL";
$a->strings["Location:"] = "Ort:";
$a->strings["About:"] = "Über:";
$a->strings["Tags:"] = "Tags";
$a->strings["Suggestions"] = "Kontaktvorschläge";
$a->strings["Suggest potential friends"] = "Freunde vorschlagen";
$a->strings["All Contacts"] = "Alle Kontakte";
@ -99,7 +91,21 @@ $a->strings["Search your contacts"] = "Suche in deinen Kontakten";
$a->strings["Finding: "] = "Funde: ";
$a->strings["Find"] = "Finde";
$a->strings["Update"] = "Aktualisierungen";
$a->strings["Archive"] = "Archivieren";
$a->strings["Unarchive"] = "Aus Archiv zurückholen";
$a->strings["Delete"] = "Löschen";
$a->strings["Status"] = "Status";
$a->strings["Status Messages and Posts"] = "Statusnachrichten und Beiträge";
$a->strings["Profile"] = "Profil";
$a->strings["Profile Details"] = "Profildetails";
$a->strings["View all contacts"] = "Alle Kontakte anzeigen";
$a->strings["Common Friends"] = "Gemeinsame Freunde";
$a->strings["View all common friends"] = "Alle Kontakte anzeigen";
$a->strings["Repair"] = "Reparieren";
$a->strings["Advanced Contact Settings"] = "Fortgeschrittene Kontakteinstellungen";
$a->strings["Toggle Blocked status"] = "Geblockt-Status ein-/ausschalten";
$a->strings["Toggle Ignored status"] = "Ignoriert-Status ein-/ausschalten";
$a->strings["Toggle Archive status"] = "Archiviert-Status ein-/ausschalten";
$a->strings["Mutual Friendship"] = "Beidseitige Freundschaft";
$a->strings["is a fan of yours"] = "ist ein Fan von dir";
$a->strings["you are a fan of"] = "Du bist Fan von";
@ -112,7 +118,6 @@ $a->strings["Post successful."] = "Beitrag erfolgreich veröffentlicht.";
$a->strings["Permission denied"] = "Zugriff verweigert";
$a->strings["Invalid profile identifier."] = "Ungültiger Profil-Bezeichner.";<