Browse Source

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

pull/4143/head
Michael 4 years ago
parent
commit
d707c5afcd
  1. 93
      boot.php
  2. 53
      doc/Developers-Intro.md
  3. 26
      doc/api.md
  4. 858
      include/api.php
  5. 7
      include/identity.php
  6. 5
      mod/admin.php
  7. 65
      src/Protocol/Diaspora.php
  8. 16
      src/Protocol/PortableContact.php
  9. 4
      src/Util/ExAuth.php
  10. 1643
      update.php

93
boot.php

@ -37,7 +37,6 @@ require_once 'include/datetime.php';
require_once 'include/pgettext.php';
require_once 'include/nav.php';
require_once 'include/identity.php';
require_once 'update.php';
define('FRIENDICA_PLATFORM', 'Friendica');
define('FRIENDICA_CODENAME', 'Asparagus');
@ -619,10 +618,17 @@ function is_ajax()
function check_db($via_worker)
{
$build = Config::get('system', 'build');
if (!x($build)) {
if (empty($build)) {
Config::set('system', '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) {
// When we cannot execute the database update via the worker, we will do it directly
if (!Worker::add(PRIORITY_CRITICAL, 'DBUpdate') && $via_worker) {
@ -647,7 +653,7 @@ function check_url(App $a)
// and www.example.com vs example.com.
// 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());
}
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)
{
$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) {
require_once 'update.php';
$stored = intval($build);
$current = intval(DB_UPDATE_VERSION);
if ($stored < $current) {
Config::load('database');
// We're reporting a different version than what is currently installed.
// Run any existing update scripts to bring the database up to current.
// make sure that boot.php and update.php are the same release, we might be
// updating right this very second and the correct version of the update.php
// file may not be here yet. This can happen on a very busy site.
if (DB_UPDATE_VERSION == UPDATE_VERSION) {
// Compare the current structure with the defined structure
$t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION);
if (!is_null($t)) {
return;
}
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time());
// run old update routine (wich could modify the schema and
// conflits with new routine)
for ($x = $stored; $x < NEW_UPDATE_ROUTINE_VERSION; $x++) {
$r = run_update_function($x);
if (!$r) {
break;
}
}
if ($stored < NEW_UPDATE_ROUTINE_VERSION) {
$stored = NEW_UPDATE_ROUTINE_VERSION;
}
// Compare the current structure with the defined structure
$t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION);
if (!is_null($t)) {
return;
}
// 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');
}
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time());
// run 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;
}
// run any left update_nnnn functions in update.php
for ($x = $stored + 1; $x <= $current; $x++) {
$r = run_update_function($x);
if (!$r) {
break;
}
}
}
@ -996,7 +985,7 @@ function remote_user()
if (local_user()) {
return false;
}
if ((x($_SESSION, 'authenticated')) && (x($_SESSION, 'visitor_id'))) {
if (x($_SESSION, 'authenticated') && x($_SESSION, 'visitor_id')) {
return intval($_SESSION['visitor_id']);
}
return false;
@ -1051,7 +1040,7 @@ function info($s)
function get_max_import_size()
{
$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);
}

53
doc/Developers-Intro.md

@ -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)
@ -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.
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 main [forum for Friendica development](https://forum.friendi.ca/profile/developers)
* 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?
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.
Translation
---
## Translation
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?
Design
---
## Design
Are you good at designing things?
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)
* 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.
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
Programming
---
## Programming
### 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.
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).
* Operators are wrapped by spaces, e.g. `$var === true`, `$var = 1 + 2` and `'string' . $concat . 'enation'`
* Braces are mandatory in conditions
* Boolean operators are `&&` and `||` for PHP conditions, `AND` and `OR` for SQL queries
* No closing PHP tag
* No trailing spaces
* 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).
* Operators are wrapped by spaces, e.g. `$var === true`, `$var = 1 + 2` and `'string' . $concat . 'enation'`
* Braces are mandatory in conditions
* Boolean operators are `&&` and `||` for PHP conditions, `AND` and `OR` for SQL queries
* 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.
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.
Run
$> doxygen util/Doxyfile
$> doxygen util/Doxyfile
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.
@ -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!
* 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.
* 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.
But you don't have to limit yourself to those issues.
* 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.
* 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.
But you don't have to limit yourself to those issues.
### Web interface
@ -124,10 +121,10 @@ This is a piece of work!
If you want to get involved here:
* 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.
* 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

26
doc/api.md

@ -615,6 +615,12 @@ This is an alias for `search`.
---
### saved_searches/list (*; AUTH)
This call does not have any parameter.
---
### users/search (*)
#### 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)
#### Unsupported parameters
@ -1199,8 +1222,6 @@ The following API calls from the Twitter API are not implemented in either Frien
* friendships/lookup
* account/settings
* account/update_delivery_device
* account/update_profile
* account/update_profile_background_image
* blocks/ids
* users/show
* users/search
@ -1234,7 +1255,6 @@ The following API calls from the Twitter API are not implemented in either Frien
* lists/subscriptions
* lists/members/destroy_all
* lists/ownerships
* saved_searches/list
* saved_searches/show/:id
* saved_searches/create
* saved_searches/destroy/:id

858
include/api.php
File diff suppressed because it is too large
View File

7
include/identity.php

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

5
mod/admin.php

@ -534,7 +534,7 @@ function admin_page_federation(App $a)
// 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
// 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(
'Friendi%%a' => '#ffc018', // orange from the logo
'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
'StatusNet' => '#789240', // the green from the logo (red and blue have already others
'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();
$total = 0;

65
src/Protocol/Diaspora.php

@ -3963,6 +3963,62 @@ class Diaspora
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
*
@ -3986,11 +4042,12 @@ class Diaspora
}
$profile = $r[0];
$handle = $profile["addr"];
$first = ((strpos($profile['name'], ' ')
? trim(substr($profile['name'], 0, strpos($profile['name'], ' '))) : $profile['name']));
$last = (($first === $profile['name']) ? '' : trim(substr($profile['name'], strlen($first))));
$split_name = self::splitName($profile['name']);
$first = $split_name['first'];
$last = $split_name['last'];
$large = System::baseUrl().'/photo/custom/300/'.$profile['uid'].'.jpg';
$medium = System::baseUrl().'/photo/custom/100/'.$profile['uid'].'.jpg';
$small = System::baseUrl().'/photo/custom/50/' .$profile['uid'].'.jpg';

16
src/Protocol/PortableContact.php

@ -575,7 +575,7 @@ class PortableContact
return true;
}
public static function toBoolean($val)
private static function toBoolean($val)
{
if (($val == "true") || ($val == 1)) {
return true;
@ -592,7 +592,7 @@ class PortableContact
* @param object $data POCO data
* @return array Server data
*/
public static function detectPocoData($data)
private static function detectPocoData($data)
{
$server = false;
@ -629,7 +629,7 @@ class PortableContact
* @param string $server_url address of the server
* @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");
if (!$serverret["success"]) {
@ -746,7 +746,7 @@ class PortableContact
* @param string $body Front page of the server
* @return array Server data
*/
public static function detectServerType($body)
private static function detectServerType($body)
{
$server = false;
@ -1292,7 +1292,7 @@ class PortableContact
*
* @param string $poco URL to the POCO endpoint
*/
public static function fetchServerlist($poco)
private static function fetchServerlist($poco)
{
$serverret = z_fetch_url($poco."/@server");
if (!$serverret["success"]) {
@ -1315,7 +1315,7 @@ class PortableContact
}
}
public static function discoverFederation()
private static function discoverFederation()
{
$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)) {
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)) {
return false;

4
src/Util/ExAuth.php

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

1643
update.php
File diff suppressed because it is too large
View File

Loading…
Cancel
Save