Merge remote-tracking branch 'upstream/develop' into item-view

This commit is contained in:
Michael 2021-01-12 21:14:28 +00:00
commit 122ad0af14
875 changed files with 156972 additions and 153019 deletions

1001
static/dbstructure.config.php Executable file → Normal file

File diff suppressed because it is too large Load diff

67
static/dbview.config.php Executable file → Normal file
View file

@ -164,6 +164,65 @@ return [
LEFT JOIN `tag` ON `post-tag`.`tid` = `tag`.`id`
LEFT JOIN `contact` ON `post-tag`.`cid` = `contact`.`id`"
],
"network-item-view" => [
"fields" => [
"uri-id" => ["item", "parent-uri-id"],
"uri" => ["item", "parent-uri"],
"parent" => ["item", "parent"],
"received" => ["item", "received"],
"commented" => ["item", "commented"],
"created" => ["item", "created"],
"uid" => ["item", "uid"],
"starred" => ["item", "starred"],
"mention" => ["item", "mention"],
"network" => ["item", "network"],
"unseen" => ["item", "unseen"],
"gravity" => ["item", "gravity"],
"contact-id" => ["item", "contact-id"],
"contact-type" => ["ownercontact", "contact-type"],
],
"query" => "FROM `item`
INNER JOIN `thread` ON `thread`.`iid` = `item`.`parent`
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid`
LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id`
LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id`
LEFT JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `thread`.`owner-id`
WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`)
AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`)
AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`)"
],
"network-thread-view" => [
"fields" => [
"uri-id" => ["item", "uri-id"],
"uri" => ["item", "uri"],
"parent-uri-id" => ["item", "parent-uri-id"],
"parent" => ["thread", "iid"],
"received" => ["thread", "received"],
"commented" => ["thread", "commented"],
"created" => ["thread", "created"],
"uid" => ["thread", "uid"],
"starred" => ["thread", "starred"],
"mention" => ["thread", "mention"],
"network" => ["thread", "network"],
"contact-id" => ["thread", "contact-id"],
"contact-type" => ["ownercontact", "contact-type"],
],
"query" => "FROM `thread`
STRAIGHT_JOIN `contact` ON `contact`.`id` = `thread`.`contact-id`
STRAIGHT_JOIN `item` ON `item`.`id` = `thread`.`iid`
LEFT JOIN `user-item` ON `user-item`.`iid` = `item`.`id` AND `user-item`.`uid` = `thread`.`uid`
LEFT JOIN `user-contact` AS `author` ON `author`.`uid` = `thread`.`uid` AND `author`.`cid` = `thread`.`author-id`
LEFT JOIN `user-contact` AS `owner` ON `owner`.`uid` = `thread`.`uid` AND `owner`.`cid` = `thread`.`owner-id`
LEFT JOIN `contact` AS `ownercontact` ON `ownercontact`.`id` = `thread`.`owner-id`
WHERE `thread`.`visible` AND NOT `thread`.`deleted` AND NOT `thread`.`moderated`
AND (NOT `contact`.`readonly` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`)
AND (`user-item`.`hidden` IS NULL OR NOT `user-item`.`hidden`)
AND (`author`.`blocked` IS NULL OR NOT `author`.`blocked`)
AND (`owner`.`blocked` IS NULL OR NOT `owner`.`blocked`)"
],
"owner-view" => [
"fields" => [
"id" => ["contact", "id"],
@ -218,18 +277,18 @@ return [
"term-date" => ["contact", "term-date"],
"last-item" => ["contact", "last-item"],
"priority" => ["contact", "priority"],
"blocked" => ["contact", "blocked"], /// @todo Check if "blocked" from contact or from the users table
"blocked" => ["user", "blocked"],
"block_reason" => ["contact", "block_reason"],
"readonly" => ["contact", "readonly"],
"writable" => ["contact", "writable"],
"forum" => ["contact", "forum"],
"prv" => ["contact", "prv"],
"contact-type" => ["contact", "contact-type"],
"manually-approve" => ["contact", "manually-approve"],
"hidden" => ["contact", "hidden"],
"archive" => ["contact", "archive"],
"pending" => ["contact", "pending"],
"deleted" => ["contact", "deleted"],
"rating" => ["contact", "rating"],
"unsearchable" => ["contact", "unsearchable"],
"sensitive" => ["contact", "sensitive"],
"baseurl" => ["contact", "baseurl"],
@ -241,7 +300,7 @@ return [
"bd" => ["contact", "bd"],
"notify_new_posts" => ["contact", "notify_new_posts"],
"fetch_further_information" => ["contact", "fetch_further_information"],
"ffi_keyword_blacklist" => ["contact", "ffi_keyword_blacklist"],
"ffi_keyword_denylist" => ["contact", "ffi_keyword_denylist"],
"parent-uid" => ["user", "parent-uid"],
"guid" => ["user", "guid"],
"nickname" => ["user", "nickname"], /// @todo Replaces all uses of "nickname" with "nick"
@ -273,7 +332,7 @@ return [
"account_removed" => ["user", "account_removed"],
"account_expired" => ["user", "account_expired"],
"account_expires_on" => ["user", "account_expires_on"],
"expire_notification_sent" => ["user", "expire_notification_sent"],
"expire_notification_sent" => ["user", "expire_notification_sent"],
"def_gid" => ["user", "def_gid"],
"allow_cid" => ["user", "allow_cid"],
"allow_gid" => ["user", "allow_gid"],

View file

@ -32,6 +32,11 @@ return [
// Can contain the port number with the syntax "hostname:port".
'hostname' => '',
// port (Integer)
// Port of the database server.
// Can be used instead of adding a port number to the hostname
'port' => null,
// user (String)
// Database user name. Please don't use "root".
'username' => '',
@ -45,8 +50,24 @@ return [
'database' => '',
// charset (String)
// Database connexion charset. Changing this value will likely corrupt special characters.
// Database connection charset. Changing this value will likely corrupt special characters.
'charset' => 'utf8mb4',
// pdo_emulate_prepares (Boolean)
// If enabled, the builtin emulation for prepared statements is used.
// This can be used as a workaround for the database error "Prepared statement needs to be re-prepared".
'pdo_emulate_prepares' => false,
// disable_pdo (Boolean)
// PDO is used by default (if available). Otherwise MySQLi will be used.
'disable_pdo' => false,
// persistent (Boolean)
// This controls if the system should use persistent connections or not.
// Persistent connections increase the performance.
// On the other hand the number of open connections are higher,
// this will most likely increase the system load.
'persistent' => false,
],
'config' => [
// admin_email (Comma-separated list)
@ -67,6 +88,10 @@ return [
'php_path' => 'php',
],
'system' => [
// adjust_poll_frequency (Boolean)
// Automatically detect and set the best feed poll frequency.
'adjust_poll_frequency' => false,
// allowed_link_protocols (Array)
// Allowed protocols in links URLs, add at your own risk. http(s) is always allowed.
'allowed_link_protocols' => ['ftp://', 'ftps://', 'mailto:', 'cid:', 'gopher://'],
@ -88,16 +113,28 @@ return [
// chose "Remember me" when logging in is considered logged out.
'auth_cookie_lifetime' => 7,
// big_emojis (Boolean)
// Display "Emoji Only" posts in big.
'big_emojis' => false,
// block_local_dir (Boolean)
// Deny public access to the local user directory.
'block_local_dir' => false,
// community_no_sharer (Boolean)
// Don't display sharing accounts on the global community
'community_no_sharer' => false,
// contact_update_limit (Integer)
// How much contacts should be checked at a time?
'contact_update_limit' => 100,
// cron_interval (Integer)
// Minimal period in minutes between two calls of the "Cron" worker job.
'cron_interval' => 5,
// cache_driver (database|memcache|memcached|redis)
// Whether to use Memcache or Memcached or Redis to store temporary cache.
// cache_driver (database|memcache|memcached|redis|apcu)
// Whether to use Memcache, Memcached, Redis or APCu to store temporary cache.
'cache_driver' => 'database',
// config_adapter (jit|preload)
@ -124,9 +161,9 @@ return [
// Watchlist of indexes to watch.
'db_log_index_watch' => '',
// db_log_index_blacklist (Comma-separated list)
// Blacklist of indexes that shouldn't be watched.
'db_log_index_blacklist' => '',
// db_log_index_denylist (Comma-separated list)
// Deny list of indexes that shouldn't be watched.
'db_log_index_denylist' => '',
// db_loglimit (Integer)
// If a database call lasts longer than this value in seconds it is logged.
@ -148,9 +185,19 @@ return [
// dbclean-expire-limit (Integer)
// This defines the number of items that are to be deleted in a single call.
// Reduce this value when you are getting memory issues.
// Reduce this value when you are getting lock issues.
// A value of 0 disables the deletion process.
'dbclean-expire-limit' => 1000,
// daemon_watchdog (Boolean)
// Enable regular checking if the daemon is running.
// If it is not running and hadn't been terminated normally, it will be started automatically.
'daemon_watchdog' => false,
// delete_sleeping_processes (Boolean)
// Periodically delete waiting database processes.
'delete_sleeping_processes' => false,
// diaspora_test (Boolean)
// For development only. Disables the message transfer.
'diaspora_test' => false,
@ -180,6 +227,10 @@ return [
// Disable the polling of DFRN and OStatus contacts through onepoll.php.
'disable_polling' => false,
// display_resharer (Boolean)
// Display the first resharer as icon and text on a reshared item.
'display_resharer' => false,
// dlogfile (Path)
// location of the developer log file.
'dlogfile' => '',
@ -188,19 +239,23 @@ return [
// restricts develop log writes to requests originating from this IP address.
'dlogip' => '',
// expire-notify-priority (integer)
// Priority for the expirary notification
'expire-notify-priority' => PRIORITY_LOW,
// free_crawls (Integer)
// Number of "free" searches when system => permit_crawling is enabled.
'free_crawls' => 10,
// frontend_worker_timeout (Integer)
// Value in minutes after we think that a frontend task was killed by the webserver.
'frontend_worker_timeout' => 10,
// groupedit_image_limit (Integer)
// Number of contacts at which the group editor should switch from display the profile pictures of the contacts to only display the names.
// This can alternatively be set on a per account basis in the pconfig table.
'groupedit_image_limit' => 400,
// gserver_update_limit (Integer)
// How much servers should be checked at a time?
'gserver_update_limit' => 100,
// hsts (Boolean)
// Enables the sending of HTTP Strict Transport Security headers.
'hsts' => false,
@ -256,6 +311,16 @@ return [
// Sets the logging adapter of Friendica globally (monolog, syslog, stream)
'logger_config' => 'stream',
// maintenance_start (String)
// Start of the window for the daily maintenance cron call.
// The system timezone is used when no timezone is defined here.
'maintenance_start' => '01:00 +00:00',
// maintenance_end (String)
// End of the window for the daily maintenance cron call
// The system timezone is used when no timezone is defined here.
'maintenance_end' => '03:00 +00:00',
// max_batch_queue (Integer)
// Maximum number of batched queue items for a single contact before subsequent messages are discarded.
'max_batch_queue' => 1000,
@ -273,6 +338,12 @@ return [
// Maximum number of queue items for a single contact before subsequent messages are discarded.
'max_contact_queue' => 500,
// max_csv_file_size (Integer)
// When uploading a CSV with account addresses to follow
// in the user settings, this controls the maximum file
// size of the upload file.
'max_csv_file_size' => 30720,
// max_feed_items (Integer)
// Maximum number of feed items that are fetched and processed. For unlimited items set to 0.
'max_feed_items' => 20,
@ -312,7 +383,11 @@ return [
// min_poll_interval (Integer)
// minimal distance in minutes between two polls for a contact. Reasonable values are between 1 and 59.
'min_poll_interval' => 1,
'min_poll_interval' => 15,
// minimum_posting_interval (Integer)
// Minimum interval between two feed posts per user
'minimum_posting_interval' => 0,
// no_count (Boolean)
// Don't do count calculations (currently only when showing photo albums).
@ -322,6 +397,10 @@ return [
// Don't use OEmbed to fetch more information about a link.
'no_oembed' => false,
// no_redirect_list (Array)
// List of domains where HTTP redirects should be ignored.
'no_redirect_list' => [],
// no_smilies (Boolean)
// Don't show smilies.
'no_smilies' => false,
@ -365,10 +444,6 @@ return [
// - 0 = every minute
'pushpoll_frequency' => 3,
// queue_no_dead_check (Boolean)
// Ignore if the target contact or server seems to be dead during queue delivery.
'queue_no_dead_check' => false,
// redis_host (String)
// Host name of the redis daemon.
'redis_host' => '127.0.0.1',
@ -389,6 +464,10 @@ return [
// Whether to use Cache to store session data or to use PHP native session storage.
'session_handler' => 'database',
// remote_avatar_lookup (Boolean)
// Perform an avatar lookup via the activated services for remote contacts
'remote_avatar_lookup' => false,
// remove_multiplicated_lines (Boolean)
// If enabled, multiple linefeeds in items are stripped to a single one.
'remove_multiplicated_lines' => false,
@ -431,6 +510,10 @@ return [
// Maximum number of posts that a user can send per month with the API. 0 to disable monthly throttling.
'throttle_limit_month' => 0,
// update_active_contacts (Boolean)
// When activated, only public contacts will be activated regularly that are used for example in items or tags.
'update_active_contacts' => false,
// username_min_length (Integer)
// The minimum character length a username can be.
// This length is check once the username has been trimmed and multiple spaces have been collapsed into one.
@ -455,6 +538,11 @@ return [
// Number of worker tasks that are fetched in a single query.
'worker_fetch_limit' => 1,
// worker_fork (Boolean)
// Experimental setting. Use pcntl_fork to spawn a new worker process.
// Does not work when "worker_multiple_fetch" is enabled (Needs more testing)
'worker_fork' => false,
// worker_jpm (Boolean)
// If enabled, it prints out the jobs per minute.
'worker_jpm' => false,
@ -469,6 +557,12 @@ return [
// Setting 0 would allow maximum worker queues at all times, which is not recommended.
'worker_load_exponent' => 3,
// worker_multiple_fetch (Boolean)
// When activated, the worker fetches jobs for multiple workers (not only for itself).
// This is an experimental setting without knowing the performance impact.
// Does not work when "worker_fork" is enabled (Needs more testing)
'worker_multiple_fetch' => false,
// worker_defer_limit (Integer)
// Per default the systems tries delivering for 15 times before dropping it.
'worker_defer_limit' => 15,

View file

@ -46,6 +46,7 @@ use Friendica\Database\Database;
use Friendica\Factory;
use Friendica\Model\Storage\IStorage;
use Friendica\Model\User\Cookie;
use Friendica\Network;
use Friendica\Util;
use Psr\Log\LoggerInterface;
@ -80,7 +81,7 @@ return [
Config\Cache::class => [
'instanceOf' => Factory\ConfigFactory::class,
'call' => [
['createCache', [], Dice::CHAIN_CALL],
['createCache', [$_SERVER], Dice::CHAIN_CALL],
],
],
App\Mode::class => [
@ -104,7 +105,6 @@ return [
Database::class => [
'constructParams' => [
[Dice::INSTANCE => \Psr\Log\NullLogger::class],
$_SERVER,
],
],
/**
@ -186,14 +186,14 @@ return [
Process::class => [
'constructParams' => [
[Dice::INSTANCE => '$basepath'],
getmypid(),
],
],
App\Router::class => [
'constructParams' => [
$_SERVER, null
],
'call' => [
['loadRoutes', [include __DIR__ . '/routes.config.php'], Dice::CHAIN_CALL],
$_SERVER,
__DIR__ . '/routes.config.php',
null
],
],
L10n::class => [
@ -219,4 +219,7 @@ return [
['getBackend', [], Dice::CHAIN_CALL],
],
],
Network\IHTTPRequest::class => [
'instanceOf' => Network\HTTPRequest::class,
]
];

59
static/env.config.php Normal file
View file

@ -0,0 +1,59 @@
<?php
/**
* @copyright Copyright (C) 2020, Friendica
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* Main mapping table of environment variables to namespaced config values
*
*/
return [
'MYSQL_HOST' => ['database', 'hostname'],
'MYSQL_USERNAME' => ['database', 'username'],
'MYSQL_USER' => ['database', 'username'],
'MYSQL_PORT' => ['database', 'port'],
'MYSQL_PASSWORD' => ['database', 'password'],
'MYSQL_DATABASE' => ['database', 'database'],
// Core variables
'FRIENDICA_ADMIN_MAIL' => ['config', 'admin_email'],
'FRIENDICA_URL' => ['system', 'url'],
'FRIENDICA_TZ' => ['config', 'timezone'],
'FRIENDICA_LANG' => ['config', 'language'],
'FRIENDICA_SITENAME' => ['config', 'sitename'],
// Storage
'FRIENDICA_DATA' => ['storage', 'name'],
'FRIENDICA_DATA_DIR' => ['storage', 'filesystem_path'],
// Debugging/Profiling
'FRIENDICA_DEBUGGING' => ['system', 'debugging'],
'FRIENDICA_LOGFILE' => ['system', 'logfile'],
'FRIENDICA_LOGLEVEL'=> ['system', 'loglevel'],
'FRIENDICA_PROFILING' => ['system', 'profiler'],
// Caching
'FRIENDICA_CACHE_DRIVER' => ['system', 'cache_driver'],
'FRIENDICA_SESSION_HANDLER' => ['system', 'session_handler'],
'FRIENDICA_LOCK_DRIVER' => ['system', 'lock_driver'],
// Redis Config
'REDIS_HOST' => ['system', 'redis_host'],
'REDIS_PORT' => ['system', 'redis_port'],
'REDIS_PW' => ['system', 'redis_password'],
'REDIS_DB' => ['system', 'redis_db'],
];

View file

@ -30,6 +30,14 @@
use Friendica\App\Router as R;
use Friendica\Module;
$profileRoutes = [
'' => [Module\Profile\Index::class, [R::GET]],
'/profile' => [Module\Profile\Profile::class, [R::GET]],
'/contacts/common' => [Module\Profile\Common::class, [R::GET]],
'/contacts[/{type}]' => [Module\Profile\Contacts::class, [R::GET]],
'/status[/{category}[/{date1}[/{date2}]]]' => [Module\Profile\Status::class, [R::GET]],
];
return [
'/' => [Module\Home::class, [R::GET]],
@ -37,6 +45,7 @@ return [
'/host-meta' => [Module\WellKnown\HostMeta::class, [R::GET]],
'/nodeinfo' => [Module\WellKnown\NodeInfo::class, [R::GET]],
'/webfinger' => [Module\Xrd::class, [R::GET]],
'/x-nodeinfo2' => [Module\NodeInfo210::class, [R::GET]],
'/x-social-relay' => [Module\WellKnown\XSocialRelay::class, [R::GET]],
],
@ -47,16 +56,109 @@ return [
'/api' => [
'/v1' => [
'/custom_emojis' => [Module\Api\Mastodon\CustomEmojis::class, [R::GET ]],
'/follow_requests' => [Module\Api\Mastodon\FollowRequests::class, [R::GET ]],
'/follow_requests/{id:\d+}/{action}' => [Module\Api\Mastodon\FollowRequests::class, [ R::POST]],
'/instance' => [Module\Api\Mastodon\Instance::class, [R::GET ]],
'/instance/peers' => [Module\Api\Mastodon\Instance\Peers::class, [R::GET ]],
'/accounts' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/accounts/{id:\d+}' => [Module\Api\Mastodon\Accounts::class, [R::GET ]],
'/accounts/{id:\d+}/statuses' => [Module\Api\Mastodon\Accounts\Statuses::class, [R::GET ]],
'/accounts/{id:\d+}/followers' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/accounts/{id:\d+}/following' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/accounts/{id:\d+}/lists' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/accounts/{id:\d+}/identity_proofs' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/accounts/{id:\d+}/follow' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/accounts/{id:\d+}/unfollow' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/accounts/{id:\d+}/block' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/accounts/{id:\d+}/unblock' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/accounts/{id:\d+}/mute' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/accounts/{id:\d+}/unmute' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/accounts/{id:\d+}/pin' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/accounts/{id:\d+}/unpin' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/accounts/{id:\d+}/note' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/accounts/relationships' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/accounts/search' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/accounts/verify_credentials' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/accounts/update_credentials' => [Module\Api\Mastodon\Unimplemented::class, [R::PATCH ]],
'/admin/accounts' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/admin/accounts/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/admin/accounts/{id:\d+}/{action}' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/admin/reports' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/admin/reports/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/admin/reports/{id:\d+}/{action}' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/announcements' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/announcements/{id:\d+}/dismiss' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/announcements/{id:\d+}/reactions/{name}' => [Module\Api\Mastodon\Unimplemented::class, [R::PUT, R::DELETE]],
'/apps' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/apps/verify_credentials' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/blocks' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/bookmarks' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/conversations' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/conversations/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::DELETE ]],
'/conversations/{id:\d+}/read' => [Module\Api\Mastodon\Unimplemented::class, [R::POST ]],
'/custom_emojis' => [Module\Api\Mastodon\CustomEmojis::class, [R::GET ]],
'/domain_blocks' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::POST, R::DELETE]],
'/directory' => [Module\Api\Mastodon\Directory::class, [R::GET ]],
'/endorsements' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/favourites' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/featured_tags' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::POST]],
'/featured_tags/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::DELETE ]],
'/featured_tags/suggestions' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/filters' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/filters/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::POST, R::PUT, R::DELETE]],
'/follow_requests' => [Module\Api\Mastodon\FollowRequests::class, [R::GET ]],
'/follow_requests/{id:\d+}/{action}' => [Module\Api\Mastodon\FollowRequests::class, [ R::POST]],
'/instance' => [Module\Api\Mastodon\Instance::class, [R::GET ]],
'/instance/activity' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/instance/peers' => [Module\Api\Mastodon\Instance\Peers::class, [R::GET ]],
'/lists' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::POST]],
'/lists/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::PUT, R::DELETE]],
'/lists/{id:\d+}/accounts' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::POST, R::DELETE]],
'/markers' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::POST]],
'/media' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/media/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::PUT]],
'/mutes' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/notifications' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/notifications/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/notifications/clear' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/notifications/{id:\d+}/dismiss' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/polls/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/polls/{id:\d+}/votes' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/preferences' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/reports' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/scheduled_statuses' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/scheduled_statuses/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::PUT, R::DELETE]],
'/statuses' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/statuses/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::DELETE]],
'/statuses/{id:\d+}/context' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/statuses/{id:\d+}/reblogged_by' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/statuses/{id:\d+}/favourited_by' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/statuses/{id:\d+}/favourite' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/statuses/{id:\d+}/unfavourite' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/statuses/{id:\d+}/reblog' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/statuses/{id:\d+}/unreblog' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/statuses/{id:\d+}/bookmark' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/statuses/{id:\d+}/unbookmark' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/statuses/{id:\d+}/mute' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/statuses/{id:\d+}/unmute' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/statuses/{id:\d+}/pin' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/statuses/{id:\d+}/unpin' => [Module\Api\Mastodon\Unimplemented::class, [ R::POST]],
'/suggestions' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/suggestions/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::DELETE ]],
'/timelines/home' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/timelines/list/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/timelines/public' => [Module\Api\Mastodon\Timelines\PublicTimeline::class, [R::GET ]],
'/timelines/tag/{hashtag}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
'/trends' => [Module\Api\Mastodon\Trends::class, [R::GET ]],
],
'/v2' => [
'/search' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
],
'/friendica' => [
'/profile/show' => [Module\Api\Friendica\Profile\Show::class , [R::GET ]],
'/events' => [Module\Api\Friendica\Events\Index::class , [R::GET ]],
],
'/followers/ids' => [Module\Api\Twitter\FollowersIds::class , [R::GET ]],
'/followers/list' => [Module\Api\Twitter\FollowersList::class , [R::GET ]],
'/friends/ids' => [Module\Api\Twitter\FriendsIds::class , [R::GET ]],
'/friends/list' => [Module\Api\Twitter\FriendsList::class , [R::GET ]],
'/oembed' => [Module\Api\Mastodon\Unimplemented::class, [R::GET ]],
],
'/admin' => [
@ -69,9 +171,7 @@ return [
'/blocklist/contact' => [Module\Admin\Blocklist\Contact::class, [R::GET, R::POST]],
'/blocklist/server' => [Module\Admin\Blocklist\Server::class, [R::GET, R::POST]],
'/dbsync[/check]' => [Module\Admin\DBSync::class, [R::GET]],
'/dbsync/{update:\d+}' => [Module\Admin\DBSync::class, [R::GET]],
'/dbsync/mark/{update:\d+}' => [Module\Admin\DBSync::class, [R::GET]],
'/dbsync[/{action}[/{update:\d+}]]' => [Module\Admin\DBSync::class, [R::GET]],
'/features' => [Module\Admin\Features::class, [R::GET, R::POST]],
'/federation' => [Module\Admin\Federation::class, [R::GET]],
@ -84,7 +184,7 @@ return [
'/phpinfo' => [Module\Admin\PhpInfo::class, [R::GET]],
'/queue[/deferred]' => [Module\Admin\Queue::class, [R::GET]],
'/queue[/{status}]' => [Module\Admin\Queue::class, [R::GET]],
'/site' => [Module\Admin\Site::class, [R::GET, R::POST]],
@ -94,40 +194,46 @@ return [
'/tos' => [Module\Admin\Tos::class, [R::GET, R::POST]],
'/users[/{action}/{uid}]' => [Module\Admin\Users::class, [R::GET, R::POST]],
'/users[/{action}/{uid}]' => [Module\Admin\Users\Index::class, [R::GET, R::POST]],
'/users/active[/{action}/{uid}]' => [Module\Admin\Users\Active::class, [R::GET, R::POST]],
'/users/pending[/{action}/{uid}]' => [Module\Admin\Users\Pending::class, [R::GET, R::POST]],
'/users/blocked[/{action}/{uid}]' => [Module\Admin\Users\Blocked::class, [R::GET, R::POST]],
'/users/deleted' => [Module\Admin\Users\Deleted::class, [R::GET ]],
'/users/create' => [Module\Admin\Users\Create::class, [R::GET, R::POST]],
],
'/amcd' => [Module\AccountManagementControlDocument::class, [R::GET]],
'/acctlink' => [Module\Acctlink::class, [R::GET]],
'/allfriends/{id:\d+}' => [Module\AllFriends::class, [R::GET]],
'/apps' => [Module\Apps::class, [R::GET]],
'/attach/{item:\d+}' => [Module\Attach::class, [R::GET]],
'/babel' => [Module\Debug\Babel::class, [R::GET, R::POST]],
'/debug/ap' => [Module\Debug\ActivityPubConversion::class, [R::GET, R::POST]],
'/bookmarklet' => [Module\Bookmarklet::class, [R::GET]],
'/community[/{content}[/{accounttype}]]' => [Module\Conversation\Community::class, [R::GET]],
'/community[/{content}]' => [Module\Conversation\Community::class, [R::GET]],
'/compose[/{type}]' => [Module\Item\Compose::class, [R::GET, R::POST]],
'/contact' => [
'[/]' => [Module\Contact::class, [R::GET]],
'/{id:\d+}[/]' => [Module\Contact::class, [R::GET, R::POST]],
'/{id:\d+}/archive' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/advanced' => [Module\Contact\Advanced::class, [R::GET, R::POST]],
'/{id:\d+}/block' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/conversations' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/drop' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/ignore' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/poke' => [Module\Contact\Poke::class, [R::GET, R::POST]],
'/{id:\d+}/posts' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/update' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/updateprofile' => [Module\Contact::class, [R::GET]],
'/archived' => [Module\Contact::class, [R::GET]],
'/batch' => [Module\Contact::class, [R::GET, R::POST]],
'/pending' => [Module\Contact::class, [R::GET]],
'/blocked' => [Module\Contact::class, [R::GET]],
'/hidden' => [Module\Contact::class, [R::GET]],
'/ignored' => [Module\Contact::class, [R::GET]],
'/hovercard' => [Module\Contact\Hovercard::class, [R::GET]],
'[/]' => [Module\Contact::class, [R::GET]],
'/{id:\d+}[/]' => [Module\Contact::class, [R::GET, R::POST]],
'/{id:\d+}/archive' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/advanced' => [Module\Contact\Advanced::class, [R::GET, R::POST]],
'/{id:\d+}/block' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/conversations' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/contacts[/{type}]' => [Module\Contact\Contacts::class, [R::GET]],
'/{id:\d+}/drop' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/ignore' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/poke' => [Module\Contact\Poke::class, [R::GET, R::POST]],
'/{id:\d+}/posts' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/update' => [Module\Contact::class, [R::GET]],
'/{id:\d+}/updateprofile' => [Module\Contact::class, [R::GET]],
'/archived' => [Module\Contact::class, [R::GET]],
'/batch' => [Module\Contact::class, [R::GET, R::POST]],
'/pending' => [Module\Contact::class, [R::GET]],
'/blocked' => [Module\Contact::class, [R::GET]],
'/hidden' => [Module\Contact::class, [R::GET]],
'/ignored' => [Module\Contact::class, [R::GET]],
'/hovercard' => [Module\Contact\Hovercard::class, [R::GET]],
],
'/credits' => [Module\Credits::class, [R::GET]],
@ -150,12 +256,14 @@ return [
'/status_message/{guid}' => [Module\Diaspora\Fetch::class, [R::GET]],
'/reshare/{guid}' => [Module\Diaspora\Fetch::class, [R::GET]],
],
'/filed' => [Module\Search\Filed::class, [R::GET]],
'/filer[/{id:\d+}]' => [Module\Filer\SaveTag::class, [R::GET]],
'/filerm/{id:\d+}' => [Module\Filer\RemoveTag::class, [R::GET]],
'/follow_confirm' => [Module\FollowConfirm::class, [R::GET, R::POST]],
'/followers/{owner}' => [Module\Followers::class, [R::GET]],
'/following/{owner}' => [Module\Following::class, [R::GET]],
'/friendica[/json]' => [Module\Friendica::class, [R::GET]],
'/friendica/inbox' => [Module\Inbox::class, [R::GET, R::POST]],
'/fsuggest/{contact:\d+}' => [Module\FriendSuggest::class, [R::GET, R::POST]],
@ -195,7 +303,8 @@ return [
'/manifest' => [Module\Manifest::class, [R::GET]],
'/modexp/{nick}' => [Module\PublicRSAKey::class, [R::GET]],
'/newmember' => [Module\Welcome::class, [R::GET]],
'/nodeinfo/{version}' => [Module\NodeInfo::class, [R::GET]],
'/nodeinfo/1.0' => [Module\NodeInfo110::class, [R::GET]],
'/nodeinfo/2.0' => [Module\NodeInfo120::class, [R::GET]],
'/nogroup' => [Module\Group::class, [R::GET]],
'/noscrape' => [
@ -218,7 +327,10 @@ return [
'/mark/all' => [Module\Notifications\Notification::class, [R::GET]],
'/{id:\d+}' => [Module\Notifications\Notification::class, [R::GET, R::POST]],
],
'/objects/{guid}' => [Module\Objects::class, [R::GET]],
'/oauth/authorize' => [Module\Api\Mastodon\Unimplemented::class, [R::GET]],
'/oauth/revoke' => [Module\Api\Mastodon\Unimplemented::class, [R::POST]],
'/oauth/token' => [Module\Api\Mastodon\Unimplemented::class, [R::POST]],
'/objects/{guid}[/{activity}]' => [Module\Objects::class, [R::GET]],
'/oembed' => [
'/b2h' => [Module\Oembed::class, [R::GET]],
@ -230,6 +342,8 @@ return [
'/openid' => [Module\Security\OpenID::class, [R::GET]],
'/opensearch' => [Module\OpenSearch::class, [R::GET]],
'/permission/tooltip/{type}/{id:\d+}' => [Module\PermissionTooltip::class, [R::GET]],
'/photo' => [
'/{name}' => [Module\Photo::class, [R::GET]],
'/{type}/{name}' => [Module\Photo::class, [R::GET]],
@ -240,12 +354,11 @@ return [
'/pretheme' => [Module\ThemeDetails::class, [R::GET]],
'/probe' => [Module\Debug\Probe::class, [R::GET]],
'/profile' => [
'/{nickname}' => [Module\Profile\Index::class, [R::GET]],
'/{nickname}/profile' => [Module\Profile\Profile::class, [R::GET]],
'/{nickname}/contacts[/{type}]' => [Module\Profile\Contacts::class, [R::GET]],
'/{nickname}/status[/{category}[/{date1}[/{date2}]]]' => [Module\Profile\Status::class, [R::GET]],
],
'/proofs' => [Module\Api\Mastodon\Unimplemented::class, [R::GET]],
'/profile/{nickname}' => $profileRoutes,
'/u/{nickname}' => $profileRoutes,
'/~{nickname}' => $profileRoutes,
'/proxy' => [
'[/]' => [Module\Proxy::class, [R::GET]],
@ -283,6 +396,13 @@ return [
'/userexport[/{action}]' => [Module\Settings\UserExport::class, [R::GET, R::POST]],
],
'/network' => [
'[/]' => [Module\Conversation\Network::class, [R::GET]],
'/archive/{from:\d\d\d\d-\d\d-\d\d}[/{to:\d\d\d\d-\d\d-\d\d}]' => [Module\Conversation\Network::class, [R::GET]],
'/forum/{contact_id:\d+}' => [Module\Conversation\Network::class, [R::GET]],
'/group/{group_id:\d+}' => [Module\Conversation\Network::class, [R::GET]],
],
'/randprof' => [Module\RandomProfile::class, [R::GET]],
'/register' => [Module\Register::class, [R::GET, R::POST]],
'/remote_follow/{profile}' => [Module\RemoteFollow::class, [R::GET, R::POST]],
@ -294,7 +414,8 @@ return [
'/toggle_mobile' => [Module\ToggleMobile::class, [R::GET]],
'/tos' => [Module\Tos::class, [R::GET]],
'/update_community[/{content}[/{accounttype}]]' => [Module\Update\Community::class, [R::GET]],
'/update_community[/{content}]' => [Module\Update\Community::class, [R::GET]],
'/update_network' => [Module\Update\Network::class, [R::GET]],
'/update_profile' => [Module\Update\Profile::class, [R::GET]],
'/view/theme/{theme}/style.pcss' => [Module\Theme::class, [R::GET]],

View file

@ -60,6 +60,30 @@ return [
// Themes users can change to in their settings.
'allowed_themes' => 'quattro,vier,duepuntozero,smoothly',
// curl_timeout (Integer)
// Value is in seconds. Set to 0 for unlimited (not recommended).
'curl_timeout' => 60,
// dbclean (Boolean)
// Remove old remote items, orphaned database records and old content from some other helper tables.
'dbclean' => false,
// dbclean-expire-days (Integer)
// When the database cleanup is enabled, this defines the days after which remote items will be deleted.
// Own items, and marked or filed items are always kept. 0 disables this behaviour.
'dbclean-expire-days' => 0,
// dbclean-expire-unclaimed (Integer)
// When the database cleanup is enabled, this defines the days after which unclaimed remote items
// (mostly content from the relay) will be deleted. Default value is 90 days. Defaults to the general
// lifespan value of remote items if set to 0.
'dbclean-expire-unclaimed' => 90,
// dbclean_expire_conversation (Integer)
// The conversation data is used for ActivityPub and OStatus, as well as for debug purposes.
// It should be safe to remove it after 14 days, default is 90 days.
'dbclean_expire_conversation' => 90,
// debugging (boolean)
// Enable/Disable Debugging (logging)
'debugging' => false,
@ -73,6 +97,10 @@ return [
// URL of the global directory.
'directory' => 'https://dir.friendica.social',
// explicit_content (Boolean)
// Set this to announce that your node is used mostly for explicit content that might not be suited for minors.
'explicit_content' => false,
// forbidden_nicknames (Comma-separated list)
// Prevents users from registering the specified nicknames on this node.
// Default value comprises classic role names from RFC 2142.
@ -108,19 +136,41 @@ return [
// Maximum size in bytes of an uploaded photo.
'maximagesize' => 800000,
// maxloadavg (Integer)
// Maximum system load before delivery and poll processes are deferred.
'maxloadavg' => 20,
// maxloadavg_frontend (Integer)
// Maximum system load before the frontend quits service - default 50.
'maxloadavg_frontend' => 50,
// min_memory (Integer)
// Minimal free memory in MB for the worker. Needs access to /proc/meminfo - default 0 (deactivated).
'min_memory' => 0,
// no_regfullname (Boolean)
// Allow pseudonyms (true) or enforce a space between first name and last name in Full name, as an anti spam measure (false).
'no_regfullname' => true,
// optimize_max_tablesize (Integer)
// Maximum table size (in MB) for the automatic optimization.
// -1 to disable automatic optimization.
// 0 to use internal default (100MB)
'optimize_max_tablesize' => -1,
// optimize_tables (Boolean)
// Periodically (once an hour) run an "optimize table" command for cache tables
'optimize_tables' => false,
// maxloadavg (Integer)
// Maximum system load before delivery and poll processes are deferred.
'maxloadavg' => 20,
// relay_deny_tags (String)
// Comma separated list of tags that are rejected.
'relay_deny_tags' => '',
// relay_server (String)
// Address of the relay server where public posts should be send to.
'relay_server' => 'https://social-relay.isurf.ca',
// relay_server_tags (String)
// Comma separated list of tags for the "tags" subscription.
'relay_server_tags' => '',
// relay_user_tags (Boolean)
// If enabled, the tags from the saved searches will used for the "tags" subscription in addition to the "relay_server_tags".
'relay_user_tags' => true,
// rino_encrypt (Integer)
// Server-to-server private message encryption (RINO).
@ -140,12 +190,6 @@ return [
// The fully-qualified URL of this Friendica node.
// Used by the worker in a non-HTTP execution environment.
'url' => '',
// max_csv_file_size (Integer)
// When uploading a CSV with account addresses to follow
// in the user settings, this controls the maximum file
// size of the upload file.
'max_csv_file_size' => 30720,
],
// Used in the admin settings to lock certain features