Merge remote-tracking branch 'upstream/develop' into comment-public

This commit is contained in:
Michael 2017-12-26 23:59:32 +00:00
commit d707c5afcd
10 changed files with 844 additions and 1902 deletions

View File

@ -37,7 +37,6 @@ require_once 'include/datetime.php';
require_once 'include/pgettext.php'; require_once 'include/pgettext.php';
require_once 'include/nav.php'; require_once 'include/nav.php';
require_once 'include/identity.php'; require_once 'include/identity.php';
require_once 'update.php';
define('FRIENDICA_PLATFORM', 'Friendica'); define('FRIENDICA_PLATFORM', 'Friendica');
define('FRIENDICA_CODENAME', 'Asparagus'); define('FRIENDICA_CODENAME', 'Asparagus');
@ -619,10 +618,17 @@ function is_ajax()
function check_db($via_worker) function check_db($via_worker)
{ {
$build = Config::get('system', 'build'); $build = Config::get('system', 'build');
if (!x($build)) {
if (empty($build)) {
Config::set('system', 'build', DB_UPDATE_VERSION); Config::set('system', 'build', DB_UPDATE_VERSION);
$build = DB_UPDATE_VERSION; $build = DB_UPDATE_VERSION;
} }
// We don't support upgrading from very old versions anymore
if ($build < NEW_UPDATE_ROUTINE_VERSION) {
die('You try to update from a version prior to database version 1170. The direct upgrade path is not supported. Please update to version 3.5.4 before updating to this version.');
}
if ($build != DB_UPDATE_VERSION) { if ($build != DB_UPDATE_VERSION) {
// When we cannot execute the database update via the worker, we will do it directly // When we cannot execute the database update via the worker, we will do it directly
if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) { if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) {
@ -647,7 +653,7 @@ function check_url(App $a)
// and www.example.com vs example.com. // and www.example.com vs example.com.
// We will only change the url to an ip address if there is no existing setting // We will only change the url to an ip address if there is no existing setting
if (!x($url)) { if (empty($url)) {
$url = Config::set('system', 'url', System::baseUrl()); $url = Config::set('system', 'url', System::baseUrl());
} }
if ((!link_compare($url, System::baseUrl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->get_hostname))) { if ((!link_compare($url, System::baseUrl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->get_hostname))) {
@ -664,63 +670,46 @@ function check_url(App $a)
function update_db(App $a) function update_db(App $a)
{ {
$build = Config::get('system', 'build'); $build = Config::get('system', 'build');
if (!x($build)) {
$build = Config::set('system', 'build', DB_UPDATE_VERSION); if (empty($build)) {
Config::set('system', 'build', DB_UPDATE_VERSION);
$build = DB_UPDATE_VERSION;
} }
if ($build != DB_UPDATE_VERSION) { if ($build != DB_UPDATE_VERSION) {
require_once 'update.php';
$stored = intval($build); $stored = intval($build);
$current = intval(DB_UPDATE_VERSION); $current = intval(DB_UPDATE_VERSION);
if ($stored < $current) { if ($stored < $current) {
Config::load('database'); Config::load('database');
// We're reporting a different version than what is currently installed. // Compare the current structure with the defined structure
// Run any existing update scripts to bring the database up to current. $t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION);
// make sure that boot.php and update.php are the same release, we might be if (!is_null($t)) {
// updating right this very second and the correct version of the update.php return;
// file may not be here yet. This can happen on a very busy site. }
if (DB_UPDATE_VERSION == UPDATE_VERSION) { Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time());
// Compare the current structure with the defined structure
$t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION); // run update routine
if (!is_null($t)) { // it update the structure in one call
return; $retval = DBStructure::update(false, true);
} if ($retval) {
DBStructure::updateFail(
DB_UPDATE_VERSION,
$retval
);
return;
} else {
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success');
}
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time()); // run any left update_nnnn functions in update.php
for ($x = $stored + 1; $x <= $current; $x++) {
// run old update routine (wich could modify the schema and $r = run_update_function($x);
// conflits with new routine) if (!$r) {
for ($x = $stored; $x < NEW_UPDATE_ROUTINE_VERSION; $x++) { break;
$r = run_update_function($x);
if (!$r) {
break;
}
}
if ($stored < NEW_UPDATE_ROUTINE_VERSION) {
$stored = NEW_UPDATE_ROUTINE_VERSION;
}
// run new update routine
// it update the structure in one call
$retval = DBStructure::update(false, true);
if ($retval) {
DBStructure::updateFail(
DB_UPDATE_VERSION,
$retval
);
return;
} else {
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success');
}
// run any left update_nnnn functions in update.php
for ($x = $stored; $x < $current; $x ++) {
$r = run_update_function($x);
if (!$r) {
break;
}
} }
} }
} }
@ -996,7 +985,7 @@ function remote_user()
if (local_user()) { if (local_user()) {
return false; return false;
} }
if ((x($_SESSION, 'authenticated')) && (x($_SESSION, 'visitor_id'))) { if (x($_SESSION, 'authenticated') && x($_SESSION, 'visitor_id')) {
return intval($_SESSION['visitor_id']); return intval($_SESSION['visitor_id']);
} }
return false; return false;
@ -1051,7 +1040,7 @@ function info($s)
function get_max_import_size() function get_max_import_size()
{ {
$a = get_app(); $a = get_app();
return ((x($a->config, 'max_import_size')) ? $a->config['max_import_size'] : 0 ); return (x($a->config, 'max_import_size') ? $a->config['max_import_size'] : 0);
} }

View File

@ -1,5 +1,6 @@
Where to get started to help improve Friendica? # Where to get started to help improve Friendica
===============================================
<!-- markdownlint-disable MD010 MD013 -->
* [Home](help) * [Home](help)
@ -10,29 +11,25 @@ A project like Friendica is the sum of many different contributions.
We are looking for helpers in all areas, whether you write text or code, whether you spread the word to convince people or design new icons. We are looking for helpers in all areas, whether you write text or code, whether you spread the word to convince people or design new icons.
Whether you feel like an expert or like a newbie - join us with your ideas! Whether you feel like an expert or like a newbie - join us with your ideas!
Contact us ## Contact us
---
The discussion of Friendica development takes place in the following Friendica forums: The discussion of Friendica development takes place in the following Friendica forums:
* The main [forum for Friendica development](https://forum.friendi.ca/profile/developers) * The main [forum for Friendica development](https://forum.friendi.ca/profile/developers)
* The [forum for Friendica theme development](https://friendica.eu/profile/ftdevs) * The [forum for Friendica theme development](https://friendica.eu/profile/ftdevs)
Help other users ## Help other users
---
Remember the questions you had when you first tried Friendica? Remember the questions you had when you first tried Friendica?
A good place to start can be to help new people find their way around Friendica in the [general support forum](https://forum.friendi.ca/prufile/helpers). A good place to start can be to help new people find their way around Friendica in the [general support forum](https://forum.friendi.ca/prufile/helpers).
Welcome them, answer their questions, point them to documentation or ping other helpers directly if you can't help but think you know who can. Welcome them, answer their questions, point them to documentation or ping other helpers directly if you can't help but think you know who can.
Translation ## Translation
---
The documentation contains help on how to translate Friendica [at Transifex](/help/translations) where the UI is translated. The documentation contains help on how to translate Friendica [at Transifex](/help/translations) where the UI is translated.
If you don't want to translate the UI, or it is already done to your satisfaction, you might want to work on the translation of the /help files? If you don't want to translate the UI, or it is already done to your satisfaction, you might want to work on the translation of the /help files?
Design ## Design
---
Are you good at designing things? Are you good at designing things?
If you have seen Friendica you probably have ideas to improve it, haven't you? If you have seen Friendica you probably have ideas to improve it, haven't you?
@ -40,11 +37,10 @@ If you have seen Friendica you probably have ideas to improve it, haven't you?
* If you would like to work with us on enhancing the user interface, please join the [UX Watchdogs forum](https://fc.oscp.info/profile/ux-watchdogs) * If you would like to work with us on enhancing the user interface, please join the [UX Watchdogs forum](https://fc.oscp.info/profile/ux-watchdogs)
* Make plans for a better Friendica interface design and share them with us. * Make plans for a better Friendica interface design and share them with us.
* Tell us if you are able to realize your ideas or what kind of help you need. * Tell us if you are able to realize your ideas or what kind of help you need.
We can't promise we have the right skills in the group but we'll try. We can't promise we have the right skills in the group but we'll try.
* Choose a thing to start with, e.g. work on the icon set of your favorite theme * Choose a thing to start with, e.g. work on the icon set of your favorite theme
Programming ## Programming
---
### Composer ### Composer
@ -60,13 +56,14 @@ It's a command-line tool that downloads required libraries into the `vendor` fol
For the sake of consistency between contribution and general code readability, Friendica follows the widespread [PSR-2 coding standards](http://www.php-fig.org/psr/psr-2/) to the exception of a few rules. For the sake of consistency between contribution and general code readability, Friendica follows the widespread [PSR-2 coding standards](http://www.php-fig.org/psr/psr-2/) to the exception of a few rules.
Here's a few primers if you are new to Friendica or to the PSR-2 coding standards: Here's a few primers if you are new to Friendica or to the PSR-2 coding standards:
* Indentation is tabs, period (not PSR-2).
* By default, strings are enclosed in single quotes, but feel free to use double quotes if it makes more sense (SQL queries, adding tabs and line feeds). * Indentation is tabs, period (not PSR-2).
* Operators are wrapped by spaces, e.g. `$var === true`, `$var = 1 + 2` and `'string' . $concat . 'enation'` * By default, strings are enclosed in single quotes, but feel free to use double quotes if it makes more sense (SQL queries, adding tabs and line feeds).
* Braces are mandatory in conditions * Operators are wrapped by spaces, e.g. `$var === true`, `$var = 1 + 2` and `'string' . $concat . 'enation'`
* Boolean operators are `&&` and `||` for PHP conditions, `AND` and `OR` for SQL queries * Braces are mandatory in conditions
* No closing PHP tag * Boolean operators are `&&` and `||` for PHP conditions, `AND` and `OR` for SQL queries
* No trailing spaces * No closing PHP tag
* No trailing spaces
Don't worry, you don't have to know by heart the PSR-2 coding standards to start contributing to Friendica. 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. There are a few tools you can use to check or fix your files before you commit.
@ -100,7 +97,7 @@ If you are interested in having the documentation of the Friendica code outside
The configuration file for Doxygen is located in the `util` directory of the project sources. The configuration file for Doxygen is located in the `util` directory of the project sources.
Run Run
$> doxygen util/Doxyfile $> doxygen util/Doxyfile
to generate the files which will be located in the `doc/html` subdirectory in the Friendica directory. to generate the files which will be located in the `doc/html` subdirectory in the Friendica directory.
You can browse these files with any browser. You can browse these files with any browser.
@ -111,11 +108,11 @@ If you find missing documentation, don't hesitate to contact us and write it dow
Have a look at our [issue tracker](https://github.com/friendica/friendica) on github! Have a look at our [issue tracker](https://github.com/friendica/friendica) on github!
* Try to reproduce a bug that needs more inquiries and write down what you find out. * Try to reproduce a bug that needs more inquiries and write down what you find out.
* If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed. * If a bug looks fixed, ask the bug reporters for feedback to find out if the bug can be closed.
* Fix a bug if you can. Please make the pull request against the *develop* branch of the repository. * Fix a bug if you can. Please make the pull request against the *develop* branch of the repository.
* There is a *Junior Job* label for issues we think might be a good point to start with. * There is a *Junior Job* label for issues we think might be a good point to start with.
But you don't have to limit yourself to those issues. But you don't have to limit yourself to those issues.
### Web interface ### Web interface
@ -124,10 +121,10 @@ This is a piece of work!
If you want to get involved here: If you want to get involved here:
* Look at the first steps that were made (e.g. the clean theme). * Look at the first steps that were made (e.g. the clean theme).
Ask us to find out whom to talk to about their experiences. Ask us to find out whom to talk to about their experiences.
* Talk to design people if you know any. * Talk to design people if you know any.
* Let us know about your plans [in the dev forum](https://forum.friendi.ca/profile/developers) or the [theme developer forum](https://friendica.eu/profile/ftdevs). * Let us know about your plans [in the dev forum](https://forum.friendi.ca/profile/developers) or the [theme developer forum](https://friendica.eu/profile/ftdevs).
Do not worry about cross-posting. Do not worry about cross-posting.
### Client software ### Client software

View File

@ -615,6 +615,12 @@ This is an alias for `search`.
--- ---
### saved_searches/list (*; AUTH)
This call does not have any parameter.
---
### users/search (*) ### users/search (*)
#### Parameters #### Parameters
@ -686,6 +692,23 @@ On error:
--- ---
### account/update_profile (POST; AUTH)
#### Parameters
* name (optional): full name of the user
* description (optional): a description of the user
#### Unsupported parameters
* url
* location
* profile_link_color
* include_entities
* skip_status
---
### friendships/incoming (*; AUTH) ### friendships/incoming (*; AUTH)
#### Unsupported parameters #### Unsupported parameters
@ -1199,8 +1222,6 @@ The following API calls from the Twitter API are not implemented in either Frien
* friendships/lookup * friendships/lookup
* account/settings * account/settings
* account/update_delivery_device * account/update_delivery_device
* account/update_profile
* account/update_profile_background_image
* blocks/ids * blocks/ids
* users/show * users/show
* users/search * users/search
@ -1234,7 +1255,6 @@ The following API calls from the Twitter API are not implemented in either Frien
* lists/subscriptions * lists/subscriptions
* lists/members/destroy_all * lists/members/destroy_all
* lists/ownerships * lists/ownerships
* saved_searches/list
* saved_searches/show/:id * saved_searches/show/:id
* saved_searches/create * saved_searches/create
* saved_searches/destroy/:id * saved_searches/destroy/:id

File diff suppressed because it is too large Load Diff

View File

@ -13,6 +13,7 @@ use Friendica\Core\System;
use Friendica\Core\Worker; use Friendica\Core\Worker;
use Friendica\Database\DBM; use Friendica\Database\DBM;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Protocol\Diaspora;
require_once 'include/bbcode.php'; require_once 'include/bbcode.php';
require_once 'mod/proxy.php'; require_once 'mod/proxy.php';
@ -374,9 +375,9 @@ function profile_sidebar($profile, $block = 0)
$location = $pdesc = $gender = $marital = $homepage = $about = false; $location = $pdesc = $gender = $marital = $homepage = $about = false;
} }
$firstname = ((strpos($profile['name'], ' ')) $split_name = Diaspora::splitName($profile['name']);
? trim(substr($profile['name'], 0, strpos($profile['name'], ' '))) : $profile['name']); $firstname = $split_name['first'];
$lastname = (($firstname === $profile['name']) ? '' : trim(substr($profile['name'], strlen($firstname)))); $lastname = $split_name['last'];
if ($profile['guid'] != "") { if ($profile['guid'] != "") {
$diaspora = array( $diaspora = array(

View File

@ -534,7 +534,7 @@ function admin_page_federation(App $a)
// off one % two of them are needed in the query // off one % two of them are needed in the query
// Add more platforms if you like, when one returns 0 known nodes it is not // Add more platforms if you like, when one returns 0 known nodes it is not
// displayed on the stats page. // displayed on the stats page.
$platforms = array('Friendi%%a', 'Diaspora', '%%red%%', 'Hubzilla', 'BlaBlaNet', 'GNU Social', 'StatusNet', 'Mastodon', 'Pleroma'); $platforms = array('Friendi%%a', 'Diaspora', '%%red%%', 'Hubzilla', 'BlaBlaNet', 'GNU Social', 'StatusNet', 'Mastodon', 'Pleroma', 'socialhome');
$colors = array( $colors = array(
'Friendi%%a' => '#ffc018', // orange from the logo 'Friendi%%a' => '#ffc018', // orange from the logo
'Diaspora' => '#a1a1a1', // logo is black and white, makes a gray 'Diaspora' => '#a1a1a1', // logo is black and white, makes a gray
@ -544,7 +544,8 @@ function admin_page_federation(App $a)
'GNU Social' => '#a22430', // dark red from the logo 'GNU Social' => '#a22430', // dark red from the logo
'StatusNet' => '#789240', // the green from the logo (red and blue have already others 'StatusNet' => '#789240', // the green from the logo (red and blue have already others
'Mastodon' => '#1a9df9', // blue from the Mastodon logo 'Mastodon' => '#1a9df9', // blue from the Mastodon logo
'Pleroma' => '#E46F0F' // Orange from the text that is used on Pleroma instances 'Pleroma' => '#E46F0F', // Orange from the text that is used on Pleroma instances
'socialhome' => '#52056b' // lilac from the Django Image used at the Socialhome homepage
); );
$counts = array(); $counts = array();
$total = 0; $total = 0;

View File

@ -3963,6 +3963,62 @@ class Diaspora
return self::buildAndTransmit($owner, $contact, $type, $message, false, $item["guid"]); return self::buildAndTransmit($owner, $contact, $type, $message, false, $item["guid"]);
} }
/**
* @brief Split a name into first name and last name
*
* @param string $name The name
*
* @return array The array with "first" and "last"
*/
public static function splitName($name) {
$name = trim($name);
// Is the name longer than 64 characters? Then cut the rest of it.
if (strlen($name) > 64) {
if ((strpos($name, ' ') <= 64) && (strpos($name, ' ') !== false)) {
$name = trim(substr($name, 0, strrpos(substr($name, 0, 65), ' ')));
} else {
$name = substr($name, 0, 64);
}
}
// Take the first word as first name
$first = ((strpos($name, ' ') ? trim(substr($name, 0, strpos($name, ' '))) : $name));
$last = (($first === $name) ? '' : trim(substr($name, strlen($first))));
if ((strlen($first) < 32) && (strlen($last) < 32)) {
return ['first' => $first, 'last' => $last];
}
// Take the last word as last name
$first = ((strrpos($name, ' ') ? trim(substr($name, 0, strrpos($name, ' '))) : $name));
$last = (($first === $name) ? '' : trim(substr($name, strlen($first))));
if ((strlen($first) < 32) && (strlen($last) < 32)) {
return ['first' => $first, 'last' => $last];
}
// Take the first 32 characters if there is no space in the first 32 characters
if ((strpos($name, ' ') > 32) || (strpos($name, ' ') === false)) {
$first = substr($name, 0, 32);
$last = substr($name, 32);
return ['first' => $first, 'last' => $last];
}
$first = trim(substr($name, 0, strrpos(substr($name, 0, 33), ' ')));
$last = (($first === $name) ? '' : trim(substr($name, strlen($first))));
// Check if the last name is longer than 32 characters
if (strlen($last) > 32) {
if (strpos($last, ' ') <= 32) {
$last = trim(substr($last, 0, strrpos(substr($last, 0, 33), ' ')));
} else {
$last = substr($last, 0, 32);
}
}
return ['first' => $first, 'last' => $last];
}
/** /**
* @brief Create profile data * @brief Create profile data
* *
@ -3986,11 +4042,12 @@ class Diaspora
} }
$profile = $r[0]; $profile = $r[0];
$handle = $profile["addr"]; $handle = $profile["addr"];
$first = ((strpos($profile['name'], ' ')
? trim(substr($profile['name'], 0, strpos($profile['name'], ' '))) : $profile['name'])); $split_name = self::splitName($profile['name']);
$last = (($first === $profile['name']) ? '' : trim(substr($profile['name'], strlen($first)))); $first = $split_name['first'];
$last = $split_name['last'];
$large = System::baseUrl().'/photo/custom/300/'.$profile['uid'].'.jpg'; $large = System::baseUrl().'/photo/custom/300/'.$profile['uid'].'.jpg';
$medium = System::baseUrl().'/photo/custom/100/'.$profile['uid'].'.jpg'; $medium = System::baseUrl().'/photo/custom/100/'.$profile['uid'].'.jpg';
$small = System::baseUrl().'/photo/custom/50/' .$profile['uid'].'.jpg'; $small = System::baseUrl().'/photo/custom/50/' .$profile['uid'].'.jpg';

View File

@ -575,7 +575,7 @@ class PortableContact
return true; return true;
} }
public static function toBoolean($val) private static function toBoolean($val)
{ {
if (($val == "true") || ($val == 1)) { if (($val == "true") || ($val == 1)) {
return true; return true;
@ -592,7 +592,7 @@ class PortableContact
* @param object $data POCO data * @param object $data POCO data
* @return array Server data * @return array Server data
*/ */
public static function detectPocoData($data) private static function detectPocoData($data)
{ {
$server = false; $server = false;
@ -629,7 +629,7 @@ class PortableContact
* @param string $server_url address of the server * @param string $server_url address of the server
* @return array Server data * @return array Server data
*/ */
public static function fetchNodeinfo($server_url) private static function fetchNodeinfo($server_url)
{ {
$serverret = z_fetch_url($server_url."/.well-known/nodeinfo"); $serverret = z_fetch_url($server_url."/.well-known/nodeinfo");
if (!$serverret["success"]) { if (!$serverret["success"]) {
@ -746,7 +746,7 @@ class PortableContact
* @param string $body Front page of the server * @param string $body Front page of the server
* @return array Server data * @return array Server data
*/ */
public static function detectServerType($body) private static function detectServerType($body)
{ {
$server = false; $server = false;
@ -1292,7 +1292,7 @@ class PortableContact
* *
* @param string $poco URL to the POCO endpoint * @param string $poco URL to the POCO endpoint
*/ */
public static function fetchServerlist($poco) private static function fetchServerlist($poco)
{ {
$serverret = z_fetch_url($poco."/@server"); $serverret = z_fetch_url($poco."/@server");
if (!$serverret["success"]) { if (!$serverret["success"]) {
@ -1315,7 +1315,7 @@ class PortableContact
} }
} }
public static function discoverFederation() private static function discoverFederation()
{ {
$last = Config::get('poco', 'last_federation_discovery'); $last = Config::get('poco', 'last_federation_discovery');
@ -1470,7 +1470,7 @@ class PortableContact
} }
} }
public static function discoverServerUsers($data, $server) private static function discoverServerUsers($data, $server)
{ {
if (!isset($data->entry)) { if (!isset($data->entry)) {
return; return;
@ -1501,7 +1501,7 @@ class PortableContact
} }
} }
public static function discoverServer($data, $default_generation = 0) private static function discoverServer($data, $default_generation = 0)
{ {
if (!isset($data->entry) || !count($data->entry)) { if (!isset($data->entry) || !count($data->entry)) {
return false; return false;

View File

@ -310,6 +310,7 @@ class ExAuth
$lockpath = Config::get('jabber', 'lockpath'); $lockpath = Config::get('jabber', 'lockpath');
if (is_null($lockpath)) { if (is_null($lockpath)) {
$this->writeLog(LOG_INFO, 'No lockpath defined.');
return; return;
} }
@ -325,6 +326,9 @@ class ExAuth
// Now it is safe to create the pid file // Now it is safe to create the pid file
PidFile::create($file); PidFile::create($file);
if (!file_exists($file)) {
$this->writeLog(LOG_WARNING, 'Logfile ' . $file . " couldn't be created.");
}
} }
/** /**

1621
update.php

File diff suppressed because it is too large Load Diff