Merge branch 'develop' of https://github.com/friendica/friendica into develop

This commit is contained in:
Ralf Thees 2018-10-14 21:48:20 +02:00
commit a97b540ebb
218 changed files with 11066 additions and 5869 deletions

View file

@ -54,7 +54,7 @@ require_once "include/dba.php";
$a = new App(dirname(__DIR__)); $a = new App(dirname(__DIR__));
if ($a->mode === App::MODE_NORMAL) { if ($a->getMode()->isNormal()) {
$oAuth = new ExAuth(); $oAuth = new ExAuth();
$oAuth->readStdin(); $oAuth->readStdin();
} }

Binary file not shown.

View file

@ -34,7 +34,7 @@ require_once "include/dba.php";
$a = new App(dirname(__DIR__)); $a = new App(dirname(__DIR__));
if ($a->isInstallMode()) { if ($a->getMode()->isInstall()) {
die("Friendica isn't properly installed yet.\n"); die("Friendica isn't properly installed yet.\n");
} }

View file

@ -45,7 +45,7 @@ if (Config::get('system', 'maintenance', false, true)) {
return; return;
} }
$a->set_baseurl(Config::get('system', 'url')); $a->setBaseURL(Config::get('system', 'url'));
Addon::loadHooks(); Addon::loadHooks();

160
boot.php
View file

@ -41,7 +41,7 @@ define('FRIENDICA_PLATFORM', 'Friendica');
define('FRIENDICA_CODENAME', 'The Tazmans Flax-lily'); define('FRIENDICA_CODENAME', 'The Tazmans Flax-lily');
define('FRIENDICA_VERSION', '2018.12-dev'); define('FRIENDICA_VERSION', '2018.12-dev');
define('DFRN_PROTOCOL_VERSION', '2.23'); define('DFRN_PROTOCOL_VERSION', '2.23');
define('DB_UPDATE_VERSION', 1283); define('DB_UPDATE_VERSION', 1285);
define('NEW_UPDATE_ROUTINE_VERSION', 1170); define('NEW_UPDATE_ROUTINE_VERSION', 1170);
/** /**
@ -475,44 +475,6 @@ function defaults() {
return $return; return $return;
} }
/**
* @brief Returns the baseurl.
*
* @see System::baseUrl()
*
* @return string
* @TODO Function is deprecated and only used in some addons
*/
function z_root()
{
return System::baseUrl();
}
/**
* @brief Return absolut URL for given $path.
*
* @param string $path given path
*
* @return string
*/
function absurl($path)
{
if (strpos($path, '/') === 0) {
return z_path() . $path;
}
return $path;
}
/**
* @brief Function to check if request was an AJAX (xmlhttprequest) request.
*
* @return boolean
*/
function is_ajax()
{
return (!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
}
/** /**
* @brief Function to check if request was an AJAX (xmlhttprequest) request. * @brief Function to check if request was an AJAX (xmlhttprequest) request.
* *
@ -556,7 +518,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 (empty($url) || (!link_compare($url, System::baseUrl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->get_hostname()))) { if (empty($url) || (!link_compare($url, System::baseUrl())) && (!preg_match("/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/", $a->getHostName()))) {
Config::set('system', 'url', System::baseUrl()); Config::set('system', 'url', System::baseUrl());
} }
@ -673,62 +635,6 @@ function run_update_function($x, $prefix)
} }
} }
/**
* @brief Synchronise addons:
*
* system.addon contains a comma-separated list of names
* of addons which are used on this system.
* Go through the database list of already installed addons, and if we have
* an entry, but it isn't in the config list, call the uninstall procedure
* and mark it uninstalled in the database (for now we'll remove it).
* Then go through the config list and if we have a addon that isn't installed,
* call the install procedure and add it to the database.
*
* @param object $a App
*/
function check_addons(App $a)
{
$r = q("SELECT * FROM `addon` WHERE `installed` = 1");
if (DBA::isResult($r)) {
$installed = $r;
} else {
$installed = [];
}
$addons = Config::get('system', 'addon');
$addons_arr = [];
if ($addons) {
$addons_arr = explode(',', str_replace(' ', '', $addons));
}
$a->addons = $addons_arr;
$installed_arr = [];
if (count($installed)) {
foreach ($installed as $i) {
if (!in_array($i['name'], $addons_arr)) {
Addon::uninstall($i['name']);
} else {
$installed_arr[] = $i['name'];
}
}
}
if (count($addons_arr)) {
foreach ($addons_arr as $p) {
if (!in_array($p, $installed_arr)) {
Addon::install($p);
}
}
}
Addon::loadHooks();
return;
}
/** /**
* @brief Used to end the current process, after saving session state. * @brief Used to end the current process, after saving session state.
* @deprecated * @deprecated
@ -1031,27 +937,27 @@ function get_temppath()
$temppath = Config::get("system", "temppath"); $temppath = Config::get("system", "temppath");
if (($temppath != "") && App::directory_usable($temppath)) { if (($temppath != "") && App::isDirectoryUsable($temppath)) {
// We have a temp path and it is usable // We have a temp path and it is usable
return App::realpath($temppath); return App::getRealPath($temppath);
} }
// We don't have a working preconfigured temp path, so we take the system path. // We don't have a working preconfigured temp path, so we take the system path.
$temppath = sys_get_temp_dir(); $temppath = sys_get_temp_dir();
// Check if it is usable // Check if it is usable
if (($temppath != "") && App::directory_usable($temppath)) { if (($temppath != "") && App::isDirectoryUsable($temppath)) {
// Always store the real path, not the path through symlinks // Always store the real path, not the path through symlinks
$temppath = App::realpath($temppath); $temppath = App::getRealPath($temppath);
// To avoid any interferences with other systems we create our own directory // To avoid any interferences with other systems we create our own directory
$new_temppath = $temppath . "/" . $a->get_hostname(); $new_temppath = $temppath . "/" . $a->getHostName();
if (!is_dir($new_temppath)) { if (!is_dir($new_temppath)) {
/// @TODO There is a mkdir()+chmod() upwards, maybe generalize this (+ configurable) into a function/method? /// @TODO There is a mkdir()+chmod() upwards, maybe generalize this (+ configurable) into a function/method?
mkdir($new_temppath); mkdir($new_temppath);
} }
if (App::directory_usable($new_temppath)) { if (App::isDirectoryUsable($new_temppath)) {
// The new path is usable, we are happy // The new path is usable, we are happy
Config::set("system", "temppath", $new_temppath); Config::set("system", "temppath", $new_temppath);
return $new_temppath; return $new_temppath;
@ -1133,8 +1039,8 @@ function get_itemcachepath()
} }
$itemcache = Config::get('system', 'itemcache'); $itemcache = Config::get('system', 'itemcache');
if (($itemcache != "") && App::directory_usable($itemcache)) { if (($itemcache != "") && App::isDirectoryUsable($itemcache)) {
return App::realpath($itemcache); return App::getRealPath($itemcache);
} }
$temppath = get_temppath(); $temppath = get_temppath();
@ -1145,7 +1051,7 @@ function get_itemcachepath()
mkdir($itemcache); mkdir($itemcache);
} }
if (App::directory_usable($itemcache)) { if (App::isDirectoryUsable($itemcache)) {
Config::set("system", "itemcache", $itemcache); Config::set("system", "itemcache", $itemcache);
return $itemcache; return $itemcache;
} }
@ -1161,7 +1067,7 @@ function get_itemcachepath()
function get_spoolpath() function get_spoolpath()
{ {
$spoolpath = Config::get('system', 'spoolpath'); $spoolpath = Config::get('system', 'spoolpath');
if (($spoolpath != "") && App::directory_usable($spoolpath)) { if (($spoolpath != "") && App::isDirectoryUsable($spoolpath)) {
// We have a spool path and it is usable // We have a spool path and it is usable
return $spoolpath; return $spoolpath;
} }
@ -1176,7 +1082,7 @@ function get_spoolpath()
mkdir($spoolpath); mkdir($spoolpath);
} }
if (App::directory_usable($spoolpath)) { if (App::isDirectoryUsable($spoolpath)) {
// The new path is usable, we are happy // The new path is usable, we are happy
Config::set("system", "spoolpath", $spoolpath); Config::set("system", "spoolpath", $spoolpath);
return $spoolpath; return $spoolpath;
@ -1231,46 +1137,6 @@ function validate_include(&$file)
return $valid; return $valid;
} }
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[0], $load_arr[1]);
}
/**
* @brief get c-style args
*
* @return int
*/
function argc()
{
return get_app()->argc;
}
/**
* @brief Returns the value of a argv key
*
* @param int $x argv key
* @return string Value of the argv key
*/
function argv($x)
{
if (array_key_exists($x, get_app()->argv)) {
return get_app()->argv[$x];
}
return '';
}
/** /**
* @brief Get the data which is needed for infinite scroll * @brief Get the data which is needed for infinite scroll
* *

View file

@ -18,6 +18,7 @@
"asika/simple-console": "^1.0", "asika/simple-console": "^1.0",
"divineomega/password_exposed": "^2.4", "divineomega/password_exposed": "^2.4",
"ezyang/htmlpurifier": "~4.7.0", "ezyang/htmlpurifier": "~4.7.0",
"friendica/json-ld": "^1.0",
"league/html-to-markdown": "~4.8.0", "league/html-to-markdown": "~4.8.0",
"lightopenid/lightopenid": "dev-master", "lightopenid/lightopenid": "dev-master",
"michelf/php-markdown": "^1.7", "michelf/php-markdown": "^1.7",
@ -42,7 +43,7 @@
"repositories": [ "repositories": [
{ {
"type": "vcs", "type": "vcs",
"url": "https://github.com/pear/Text_Highlighter" "url": "https://git.friendi.ca/friendica/php-json-ld"
} }
], ],
"autoload": { "autoload": {
@ -74,7 +75,8 @@
"phpunit/dbunit": "^2.0", "phpunit/dbunit": "^2.0",
"phpdocumentor/reflection-docblock": "^3.0.2", "phpdocumentor/reflection-docblock": "^3.0.2",
"phpunit/php-token-stream": "^1.4.2", "phpunit/php-token-stream": "^1.4.2",
"mikey179/vfsStream": "^1.6" "mikey179/vfsStream": "^1.6",
"mockery/mockery": "^1.2"
}, },
"scripts": { "scripts": {
"test": "phpunit" "test": "phpunit"

764
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -15,6 +15,34 @@
"name": ["UNIQUE", "name"] "name": ["UNIQUE", "name"]
} }
}, },
"apcontact": {
"comment": "ActivityPub compatible contacts - used in the ActivityPub implementation",
"fields": {
"url": {"type": "varbinary(255)", "not null": "1", "primary": "1", "comment": "URL of the contact"},
"uuid": {"type": "varchar(255)", "comment": ""},
"type": {"type": "varchar(20)", "not null": "1", "comment": ""},
"following": {"type": "varchar(255)", "comment": ""},
"followers": {"type": "varchar(255)", "comment": ""},
"inbox": {"type": "varchar(255)", "not null": "1", "comment": ""},
"outbox": {"type": "varchar(255)", "comment": ""},
"sharedinbox": {"type": "varchar(255)", "comment": ""},
"nick": {"type": "varchar(255)", "not null": "1", "default": "", "comment": ""},
"name": {"type": "varchar(255)", "comment": ""},
"about": {"type": "text", "comment": ""},
"photo": {"type": "varchar(255)", "comment": ""},
"addr": {"type": "varchar(255)", "comment": ""},
"alias": {"type": "varchar(255)", "comment": ""},
"pubkey": {"type": "text", "comment": ""},
"baseurl": {"type": "varchar(255)", "comment": "baseurl of the ap contact"},
"updated": {"type": "datetime", "not null": "1", "default": "0001-01-01 00:00:00", "comment": ""}
},
"indexes": {
"PRIMARY": ["url"],
"addr": ["addr(32)"],
"url": ["followers(190)"]
}
},
"attach": { "attach": {
"comment": "file attachments", "comment": "file attachments",
"fields": { "fields": {
@ -164,6 +192,7 @@
"hidden": {"type": "boolean", "not null": "1", "default": "0", "comment": ""}, "hidden": {"type": "boolean", "not null": "1", "default": "0", "comment": ""},
"archive": {"type": "boolean", "not null": "1", "default": "0", "comment": ""}, "archive": {"type": "boolean", "not null": "1", "default": "0", "comment": ""},
"pending": {"type": "boolean", "not null": "1", "default": "1", "comment": ""}, "pending": {"type": "boolean", "not null": "1", "default": "1", "comment": ""},
"deleted": {"type": "boolean", "not null": "1", "default": "0", "comment": "Contact has been deleted"},
"rating": {"type": "tinyint", "not null": "1", "default": "0", "comment": ""}, "rating": {"type": "tinyint", "not null": "1", "default": "0", "comment": ""},
"reason": {"type": "text", "comment": ""}, "reason": {"type": "text", "comment": ""},
"closeness": {"type": "tinyint unsigned", "not null": "1", "default": "99", "comment": ""}, "closeness": {"type": "tinyint unsigned", "not null": "1", "default": "99", "comment": ""},
@ -215,7 +244,7 @@
"reply-to-uri": {"type": "varbinary(255)", "not null": "1", "default": "", "comment": "URI to which this item is a reply"}, "reply-to-uri": {"type": "varbinary(255)", "not null": "1", "default": "", "comment": "URI to which this item is a reply"},
"conversation-uri": {"type": "varbinary(255)", "not null": "1", "default": "", "comment": "GNU Social conversation URI"}, "conversation-uri": {"type": "varbinary(255)", "not null": "1", "default": "", "comment": "GNU Social conversation URI"},
"conversation-href": {"type": "varbinary(255)", "not null": "1", "default": "", "comment": "GNU Social conversation link"}, "conversation-href": {"type": "varbinary(255)", "not null": "1", "default": "", "comment": "GNU Social conversation link"},
"protocol": {"type": "tinyint unsigned", "not null": "1", "default": "0", "comment": "The protocol of the item"}, "protocol": {"type": "tinyint unsigned", "not null": "1", "default": "255", "comment": "The protocol of the item"},
"source": {"type": "mediumtext", "comment": "Original source"}, "source": {"type": "mediumtext", "comment": "Original source"},
"received": {"type": "datetime", "not null": "1", "default": "0001-01-01 00:00:00", "comment": "Receiving date"} "received": {"type": "datetime", "not null": "1", "default": "0001-01-01 00:00:00", "comment": "Receiving date"}
}, },

View file

@ -1,6 +1,6 @@
-- ------------------------------------------ -- ------------------------------------------
-- Friendica 2018.12-dev (The Tazmans Flax-lily) -- Friendica 2018.12-dev (The Tazmans Flax-lily)
-- DB_UPDATE_VERSION 1283 -- DB_UPDATE_VERSION 1285
-- ------------------------------------------ -- ------------------------------------------
@ -19,6 +19,32 @@ CREATE TABLE IF NOT EXISTS `addon` (
UNIQUE INDEX `name` (`name`) UNIQUE INDEX `name` (`name`)
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='registered addons'; ) DEFAULT COLLATE utf8mb4_general_ci COMMENT='registered addons';
--
-- TABLE apcontact
--
CREATE TABLE IF NOT EXISTS `apcontact` (
`url` varbinary(255) NOT NULL COMMENT 'URL of the contact',
`uuid` varchar(255) COMMENT '',
`type` varchar(20) NOT NULL COMMENT '',
`following` varchar(255) COMMENT '',
`followers` varchar(255) COMMENT '',
`inbox` varchar(255) NOT NULL COMMENT '',
`outbox` varchar(255) COMMENT '',
`sharedinbox` varchar(255) COMMENT '',
`nick` varchar(255) NOT NULL DEFAULT '' COMMENT '',
`name` varchar(255) COMMENT '',
`about` text COMMENT '',
`photo` varchar(255) COMMENT '',
`addr` varchar(255) COMMENT '',
`alias` varchar(255) COMMENT '',
`pubkey` text COMMENT '',
`baseurl` varchar(255) COMMENT 'baseurl of the ap contact',
`updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '',
PRIMARY KEY(`url`),
INDEX `addr` (`addr`(32)),
INDEX `url` (`followers`(190))
) DEFAULT COLLATE utf8mb4_general_ci COMMENT='ActivityPub compatible contacts - used in the ActivityPub implementation';
-- --
-- TABLE attach -- TABLE attach
-- --
@ -163,6 +189,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
`hidden` boolean NOT NULL DEFAULT '0' COMMENT '', `hidden` boolean NOT NULL DEFAULT '0' COMMENT '',
`archive` boolean NOT NULL DEFAULT '0' COMMENT '', `archive` boolean NOT NULL DEFAULT '0' COMMENT '',
`pending` boolean NOT NULL DEFAULT '1' COMMENT '', `pending` boolean NOT NULL DEFAULT '1' COMMENT '',
`deleted` boolean NOT NULL DEFAULT '0' COMMENT 'Contact has been deleted',
`rating` tinyint NOT NULL DEFAULT 0 COMMENT '', `rating` tinyint NOT NULL DEFAULT 0 COMMENT '',
`reason` text COMMENT '', `reason` text COMMENT '',
`closeness` tinyint unsigned NOT NULL DEFAULT 99 COMMENT '', `closeness` tinyint unsigned NOT NULL DEFAULT 99 COMMENT '',
@ -212,7 +239,7 @@ CREATE TABLE IF NOT EXISTS `conversation` (
`reply-to-uri` varbinary(255) NOT NULL DEFAULT '' COMMENT 'URI to which this item is a reply', `reply-to-uri` varbinary(255) NOT NULL DEFAULT '' COMMENT 'URI to which this item is a reply',
`conversation-uri` varbinary(255) NOT NULL DEFAULT '' COMMENT 'GNU Social conversation URI', `conversation-uri` varbinary(255) NOT NULL DEFAULT '' COMMENT 'GNU Social conversation URI',
`conversation-href` varbinary(255) NOT NULL DEFAULT '' COMMENT 'GNU Social conversation link', `conversation-href` varbinary(255) NOT NULL DEFAULT '' COMMENT 'GNU Social conversation link',
`protocol` tinyint unsigned NOT NULL DEFAULT 0 COMMENT 'The protocol of the item', `protocol` tinyint unsigned NOT NULL DEFAULT 255 COMMENT 'The protocol of the item',
`source` mediumtext COMMENT 'Original source', `source` mediumtext COMMENT 'Original source',
`received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Receiving date', `received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Receiving date',
PRIMARY KEY(`item-uri`), PRIMARY KEY(`item-uri`),

View file

@ -67,55 +67,67 @@ $b can be called anything you like.
This is information specific to the hook currently being processed, and generally contains information that is being immediately processed or acted on that you can use, display, or alter. This is information specific to the hook currently being processed, and generally contains information that is being immediately processed or acted on that you can use, display, or alter.
Remember to declare it with `&` if you wish to alter it. Remember to declare it with `&` if you wish to alter it.
## JavaScript addon hooks ## Global stylesheets
### PHP part If your addon requires adding a stylesheet on all pages of Friendica, add the following hook:
Make sure your JavaScript addon file (addon/*addon_name*/*addon_name*.js) is listed in the document response.
In your addon install function, add:
```php ```php
Addon::registerHook('template_vars', __FILE__, '<addon_name>_template_vars'); function <addon>_install()
```
In your addon uninstall function, add:
```php
Addon::unregisterHook('template_vars', __FILE__, '<addon_name>_template_vars');
```
Then, add your addon name to the *addon_hooks* template variable array:
```php
function <addon_name>_template_vars($a, &$arr)
{ {
if (!array_key_exists('addon_hooks', $arr['vars'])) Addon::registerHook('head', __FILE__, '<addon>_head');
{ ...
$arr['vars']['addon_hooks'] = array(); }
}
$arr['vars']['addon_hooks'][] = "<addon_name>";
function <addon>_head(App $a)
{
$a->registerStylesheet(__DIR__ . '/relative/path/to/addon/stylesheet.css');
} }
``` ```
### JavaScript part `__DIR__` is the folder path of your addon.
Register your addon hooks in file `addon/*addon_name*/*addon_name*.js`. ## JavaScript
### Global scripts
If your addon requires adding a script on all pages of Friendica, add the following hook:
```php
function <addon>_install()
{
Addon::registerHook('footer', __FILE__, '<addon>_footer');
...
}
function <addon>_footer(App $a)
{
$a->registerFooterScript(__DIR__ . '/relative/path/to/addon/script.js');
}
```
`__DIR__` is the folder path of your addon.
### JavaScript hooks
The main Friendica script provides hooks via events dispatched on the `document` property.
In your Javascript file included as described above, add your event listener like this:
```js ```js
Addon_registerHook(type, hookfnstr); document.addEventListener(name, callback);
``` ```
*type* is the name of the hook and corresponds to a known Friendica JavaScript hook. - *name* is the name of the hook and corresponds to a known Friendica JavaScript hook.
*hookfnstr* is the name of your JavaScript function to execute. - *callback* is a JavaScript anonymous function to execute.
No arguments are provided to your JavaScript callback function. Example: More info about Javascript event listeners: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
```javascript #### Current JavaScript hooks
function myhook_function() {
} ##### postprocess_liveupdate
``` Called at the end of the live update process (XmlHttpRequest) and on a post preview.
No additional data is provided.
## Modules ## Modules
@ -260,6 +272,11 @@ Called after conversion of bbcode to HTML.
Called after tag conversion of HTML to bbcode (e.g. remote message posting) Called after tag conversion of HTML to bbcode (e.g. remote message posting)
`$b` is a string converted text `$b` is a string converted text
### head
Called when building the `<head>` sections.
Stylesheets should be registered using this hook.
`$b` is an HTML string of the `<head>` tag.
### page_header ### page_header
Called after building the page navigation section. Called after building the page navigation section.
`$b` is a string HTML of nav region. `$b` is a string HTML of nav region.
@ -294,6 +311,11 @@ No hook data.
Called after HTML content functions have completed. Called after HTML content functions have completed.
`$b` is (string) HTML of content div. `$b` is (string) HTML of content div.
### footer
Called after HTML content functions have completed.
Deferred Javascript files should be registered using this hook.
`$b` is (string) HTML of footer div/element.
### avatar_lookup ### avatar_lookup
Called when looking up the avatar. `$b` is an array: Called when looking up the avatar. `$b` is an array:
@ -389,14 +411,9 @@ Hook data:
visitor => array with the contact record of the visitor visitor => array with the contact record of the visitor
url => the query string url => the query string
## Current JavaScript hooks
### postprocess_liveupdate
Called at the end of the live update process (XmlHttpRequest)
## Complete list of hook callbacks ## Complete list of hook callbacks
Here is a complete list of all hook callbacks with file locations (as of 01-Apr-2018). Please see the source for details of any hooks not documented above. Here is a complete list of all hook callbacks with file locations (as of 24-Sep-2018). Please see the source for details of any hooks not documented above.
### index.php ### index.php
@ -571,6 +588,8 @@ Here is a complete list of all hook callbacks with file locations (as of 01-Apr-
### src/App.php ### src/App.php
Addon::callHooks('load_config'); Addon::callHooks('load_config');
Addon::callHooks('head');
Addon::callHooks('footer');
### src/Model/Item.php ### src/Model/Item.php
@ -704,4 +723,4 @@ Here is a complete list of all hook callbacks with file locations (as of 01-Apr-
### view/js/main.js ### view/js/main.js
callAddonHooks("postprocess_liveupdate"); document.dispatchEvent(new Event('postprocess_liveupdate'));

View file

@ -164,6 +164,7 @@ if you don't use the option `--savedb` during installation, the DB credentials w
This variables wont be used at normal Friendica runtime. This variables wont be used at normal Friendica runtime.
Instead, they get saved into `config/local.ini.php`. Instead, they get saved into `config/local.ini.php`.
- `FRIENDICA_URL_PATH` The URL path of Friendica (f.e. '/friendica')
- `FRIENDICA_PHP_PATH` The path of the PHP binary - `FRIENDICA_PHP_PATH` The path of the PHP binary
- `FRIENDICA_ADMIN_MAIL` The admin email address of Friendica (this email will be used for admin access) - `FRIENDICA_ADMIN_MAIL` The admin email address of Friendica (this email will be used for admin access)
- `FRIENDICA_TZ` The timezone of Friendica - `FRIENDICA_TZ` The timezone of Friendica
@ -182,7 +183,8 @@ All options will be saved in the `config/local.ini.php` and are overruling the a
- `-U|--dbuser <username>` The username of the mysql/mariadb database login (env `MYSQL_USER` or `MYSQL_USERNAME`) - `-U|--dbuser <username>` The username of the mysql/mariadb database login (env `MYSQL_USER` or `MYSQL_USERNAME`)
- `-P|--dbpass <password>` The password of the mysql/mariadb database login (env `MYSQL_PASSWORD`) - `-P|--dbpass <password>` The password of the mysql/mariadb database login (env `MYSQL_PASSWORD`)
- `-d|--dbdata <database>` The name of the mysql/mariadb database (env `MYSQL_DATABASE`) - `-d|--dbdata <database>` The name of the mysql/mariadb database (env `MYSQL_DATABASE`)
- `-b|--phppath <path>` The path of the PHP binary (env `FRIENDICA_PHP_PATH`) - `-u|--urlpath <url_path>` The URL path of Friendica - f.e. '/friendica' (env `FRIENDICA_URL_PATH`)
- `-b|--phppath <php_path>` The path of the PHP binary (env `FRIENDICA_PHP_PATH`)
- `-A|--admin <mail>` The admin email address of Friendica (env `FRIENDICA_ADMIN_MAIL`) - `-A|--admin <mail>` The admin email address of Friendica (env `FRIENDICA_ADMIN_MAIL`)
- `-T|--tz <timezone>` The timezone of Friendica (env `FRIENDICA_TZ`) - `-T|--tz <timezone>` The timezone of Friendica (env `FRIENDICA_TZ`)
- `-L|--land <language>` The language of Friendica (env `FRIENDICA_LANG`) - `-L|--land <language>` The language of Friendica (env `FRIENDICA_LANG`)

View file

@ -819,7 +819,7 @@ function api_item_get_user(App $a, $item)
$status_user["protected"] = defaults($item, 'private', 0); $status_user["protected"] = defaults($item, 'private', 0);
if (defaults($item, 'thr-parent', '') == defaults($item, 'uri', '')) { if (defaults($item, 'thr-parent', '') == defaults($item, 'uri', '')) {
$owner_user = api_get_user($a, defaults($item, 'author-id', null)); $owner_user = api_get_user($a, defaults($item, 'owner-id', null));
} else { } else {
$owner_user = $status_user; $owner_user = $status_user;
} }
@ -2351,7 +2351,7 @@ function api_format_messages($item, $recipient, $sender)
// standard meta information // standard meta information
$ret = [ $ret = [
'id' => $item['id'], 'id' => $item['id'],
'sender_id' => $sender['id'] , 'sender_id' => $sender['id'],
'text' => "", 'text' => "",
'recipient_id' => $recipient['id'], 'recipient_id' => $recipient['id'],
'created_at' => api_date(defaults($item, 'created', DateTimeFormat::utcNow())), 'created_at' => api_date(defaults($item, 'created', DateTimeFormat::utcNow())),
@ -2732,7 +2732,7 @@ function api_contactlink_to_array($txt)
* likes => int count, * likes => int count,
* dislikes => int count * dislikes => int count
*/ */
function api_format_items_activities(&$item, $type = "json") function api_format_items_activities($item, $type = "json")
{ {
$a = get_app(); $a = get_app();
@ -2747,13 +2747,13 @@ function api_format_items_activities(&$item, $type = "json")
$condition = ['uid' => $item['uid'], 'thr-parent' => $item['uri']]; $condition = ['uid' => $item['uid'], 'thr-parent' => $item['uri']];
$ret = Item::selectForUser($item['uid'], ['author-id', 'verb'], $condition); $ret = Item::selectForUser($item['uid'], ['author-id', 'verb'], $condition);
while ($item = Item::fetch($ret)) { while ($parent_item = Item::fetch($ret)) {
// not used as result should be structured like other user data // not used as result should be structured like other user data
//builtin_activity_puller($i, $activities); //builtin_activity_puller($i, $activities);
// get user data and add it to the array of the activity // get user data and add it to the array of the activity
$user = api_get_user($a, $item['author-id']); $user = api_get_user($a, $parent_item['author-id']);
switch ($item['verb']) { switch ($parent_item['verb']) {
case ACTIVITY_LIKE: case ACTIVITY_LIKE:
$activities['like'][] = $user; $activities['like'][] = $user;
break; break;
@ -2893,7 +2893,7 @@ function api_format_items($r, $user_info, $filter_user = false, $type = "json")
'in_reply_to_screen_name' => $in_reply_to['screen_name'], 'in_reply_to_screen_name' => $in_reply_to['screen_name'],
$geo => null, $geo => null,
'favorited' => $item['starred'] ? true : false, 'favorited' => $item['starred'] ? true : false,
'user' => $status_user , 'user' => $status_user,
'friendica_owner' => $owner_user, 'friendica_owner' => $owner_user,
'friendica_private' => $item['private'] == 1, 'friendica_private' => $item['private'] == 1,
//'entities' => NULL, //'entities' => NULL,
@ -3344,7 +3344,7 @@ function api_statusnet_config($type)
$a = get_app(); $a = get_app();
$name = Config::get('config', 'sitename'); $name = Config::get('config', 'sitename');
$server = $a->get_hostname(); $server = $a->getHostName();
$logo = System::baseUrl() . '/images/friendica-64.png'; $logo = System::baseUrl() . '/images/friendica-64.png';
$email = Config::get('config', 'admin_email'); $email = Config::get('config', 'admin_email');
$closed = intval(Config::get('config', 'register_policy')) === REGISTER_CLOSED ? 'true' : 'false'; $closed = intval(Config::get('config', 'register_policy')) === REGISTER_CLOSED ? 'true' : 'false';
@ -3401,7 +3401,7 @@ api_register_func('api/statusnet/version', 'api_statusnet_version', false);
*/ */
function api_ff_ids($type) function api_ff_ids($type)
{ {
if (! api_user()) { if (!api_user()) {
throw new ForbiddenException(); throw new ForbiddenException();
} }
@ -3629,6 +3629,84 @@ function api_direct_messages_destroy($type)
/// @TODO move to top of file or somewhere better /// @TODO move to top of file or somewhere better
api_register_func('api/direct_messages/destroy', 'api_direct_messages_destroy', true, API_METHOD_DELETE); api_register_func('api/direct_messages/destroy', 'api_direct_messages_destroy', true, API_METHOD_DELETE);
/**
* Unfollow Contact
*
* @brief unfollow contact
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
* @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/post-friendships-destroy.html
*/
function api_friendships_destroy($type)
{
$uid = api_user();
if ($uid === false) {
throw new ForbiddenException();
}
$contact_id = defaults($_REQUEST, 'user_id');
if (empty($contact_id)) {
logger("No user_id specified", LOGGER_DEBUG);
throw new BadRequestException("no user_id specified");
}
// Get Contact by given id
$contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => 0, 'self' => false]);
if(!DBA::isResult($contact)) {
logger("No contact found for ID" . $contact_id, LOGGER_DEBUG);
throw new NotFoundException("no contact found to given ID");
}
$url = $contact["url"];
$condition = ["`uid` = ? AND (`rel` = ? OR `rel` = ?) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)",
$uid, Contact::SHARING, Contact::FRIEND, normalise_link($url),
normalise_link($url), $url];
$contact = DBA::selectFirst('contact', [], $condition);
if (!DBA::isResult($contact)) {
logger("Not following Contact", LOGGER_DEBUG);
throw new NotFoundException("Not following Contact");
}
if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
logger("Not supported", LOGGER_DEBUG);
throw new ExpectationFailedException("Not supported");
}
$dissolve = ($contact['rel'] == Contact::SHARING);
$owner = User::getOwnerDataById($uid);
if ($owner) {
Contact::terminateFriendship($owner, $contact, $dissolve);
}
else {
logger("No owner found", LOGGER_DEBUG);
throw new NotFoundException("Error Processing Request");
}
// Sharing-only contacts get deleted as there no relationship any more
if ($dissolve) {
Contact::remove($contact['id']);
} else {
DBA::update('contact', ['rel' => Contact::FOLLOWER], ['id' => $contact['id']]);
}
// "uid" and "self" are only needed for some internal stuff, so remove it from here
unset($contact["uid"]);
unset($contact["self"]);
// Set screen_name since Twidere requests it
$contact["screen_name"] = $contact["nick"];
return api_format_data("friendships-destroy", $type, ['user' => $contact]);
}
api_register_func('api/friendships/destroy', 'api_friendships_destroy', true, API_METHOD_POST);
/** /**
* *
* @param string $type Return type (atom, rss, xml, json) * @param string $type Return type (atom, rss, xml, json)
@ -4427,7 +4505,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $
// create Photo instance with the data of the image // create Photo instance with the data of the image
$imagedata = @file_get_contents($src); $imagedata = @file_get_contents($src);
$Image = new Image($imagedata, $filetype); $Image = new Image($imagedata, $filetype);
if (! $Image->isValid()) { if (!$Image->isValid()) {
throw new InternalServerErrorException("unable to process image data"); throw new InternalServerErrorException("unable to process image data");
} }
@ -4437,7 +4515,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $
// check max length of images on server // check max length of images on server
$max_length = Config::get('system', 'max_image_length'); $max_length = Config::get('system', 'max_image_length');
if (! $max_length) { if (!$max_length) {
$max_length = MAX_IMAGE_LENGTH; $max_length = MAX_IMAGE_LENGTH;
} }
if ($max_length > 0) { if ($max_length > 0) {
@ -4455,13 +4533,13 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $
logger("photo upload: starting new photo upload", LOGGER_DEBUG); logger("photo upload: starting new photo upload", LOGGER_DEBUG);
$r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 0, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 0, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
if (! $r) { if (!$r) {
logger("photo upload: image upload with scale 0 (original size) failed"); logger("photo upload: image upload with scale 0 (original size) failed");
} }
if ($width > 640 || $height > 640) { if ($width > 640 || $height > 640) {
$Image->scaleDown(640); $Image->scaleDown(640);
$r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 1, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 1, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
if (! $r) { if (!$r) {
logger("photo upload: image upload with scale 1 (640x640) failed"); logger("photo upload: image upload with scale 1 (640x640) failed");
} }
} }
@ -4469,7 +4547,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $
if ($width > 320 || $height > 320) { if ($width > 320 || $height > 320) {
$Image->scaleDown(320); $Image->scaleDown(320);
$r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 2, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 2, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
if (! $r) { if (!$r) {
logger("photo upload: image upload with scale 2 (320x320) failed"); logger("photo upload: image upload with scale 2 (320x320) failed");
} }
} }
@ -4481,7 +4559,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $
if ($width > 175 || $height > 175) { if ($width > 175 || $height > 175) {
$Image->scaleDown(175); $Image->scaleDown(175);
$r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 4, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 4, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
if (! $r) { if (!$r) {
logger("photo upload: profile image upload with scale 4 (175x175) failed"); logger("photo upload: profile image upload with scale 4 (175x175) failed");
} }
} }
@ -4489,7 +4567,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $
if ($width > 80 || $height > 80) { if ($width > 80 || $height > 80) {
$Image->scaleDown(80); $Image->scaleDown(80);
$r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 5, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 5, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
if (! $r) { if (!$r) {
logger("photo upload: profile image upload with scale 5 (80x80) failed"); logger("photo upload: profile image upload with scale 5 (80x80) failed");
} }
} }
@ -4497,7 +4575,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $
if ($width > 48 || $height > 48) { if ($width > 48 || $height > 48) {
$Image->scaleDown(48); $Image->scaleDown(48);
$r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 6, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 6, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc);
if (! $r) { if (!$r) {
logger("photo upload: profile image upload with scale 6 (48x48) failed"); logger("photo upload: profile image upload with scale 6 (48x48) failed");
} }
} }
@ -4534,7 +4612,7 @@ function post_photo_item($hash, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $f
$owner_record = DBA::selectFirst('contact', [], ['uid' => api_user(), 'self' => true]); $owner_record = DBA::selectFirst('contact', [], ['uid' => api_user(), 'self' => true]);
$arr = []; $arr = [];
$arr['guid'] = System::createGUID(32); $arr['guid'] = System::createUUID();
$arr['uid'] = intval(api_user()); $arr['uid'] = intval(api_user());
$arr['uri'] = $uri; $arr['uri'] = $uri;
$arr['parent-uri'] = $uri; $arr['parent-uri'] = $uri;
@ -4749,77 +4827,86 @@ function api_share_as_retweet(&$item)
{ {
$body = trim($item["body"]); $body = trim($item["body"]);
if (Diaspora::isReshare($body, false)===false) { if (Diaspora::isReshare($body, false) === false) {
return false; if ($item['author-id'] == $item['owner-id']) {
return false;
} else {
// Reshares from OStatus, ActivityPub and Twitter
$reshared_item = $item;
$reshared_item['owner-id'] = $reshared_item['author-id'];
$reshared_item['owner-link'] = $reshared_item['author-link'];
$reshared_item['owner-name'] = $reshared_item['author-name'];
$reshared_item['owner-avatar'] = $reshared_item['author-avatar'];
return $reshared_item;
}
} }
/// @TODO "$1" should maybe mean '$1' ? /// @TODO "$1" should maybe mean '$1' ?
$attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "$1", $body); $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "$1", $body);
/* /*
* Skip if there is no shared message in there * Skip if there is no shared message in there
* we already checked this in diaspora::isReshare() * we already checked this in diaspora::isReshare()
* but better one more than one less... * but better one more than one less...
*/ */
if ($body == $attributes) { if (($body == $attributes) || empty($attributes)) {
return false; return false;
} }
// build the fake reshared item // build the fake reshared item
$reshared_item = $item; $reshared_item = $item;
$author = ""; $author = "";
preg_match("/author='(.*?)'/ism", $attributes, $matches); preg_match("/author='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") { if (!empty($matches[1])) {
$author = html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8'); $author = html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8');
} }
preg_match('/author="(.*?)"/ism', $attributes, $matches); preg_match('/author="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") { if (!empty($matches[1])) {
$author = $matches[1]; $author = $matches[1];
} }
$profile = ""; $profile = "";
preg_match("/profile='(.*?)'/ism", $attributes, $matches); preg_match("/profile='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") { if (!empty($matches[1])) {
$profile = $matches[1]; $profile = $matches[1];
} }
preg_match('/profile="(.*?)"/ism', $attributes, $matches); preg_match('/profile="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") { if (!empty($matches[1])) {
$profile = $matches[1]; $profile = $matches[1];
} }
$avatar = ""; $avatar = "";
preg_match("/avatar='(.*?)'/ism", $attributes, $matches); preg_match("/avatar='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") { if (!empty($matches[1])) {
$avatar = $matches[1]; $avatar = $matches[1];
} }
preg_match('/avatar="(.*?)"/ism', $attributes, $matches); preg_match('/avatar="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") { if (!empty($matches[1])) {
$avatar = $matches[1]; $avatar = $matches[1];
} }
$link = ""; $link = "";
preg_match("/link='(.*?)'/ism", $attributes, $matches); preg_match("/link='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") { if (!empty($matches[1])) {
$link = $matches[1]; $link = $matches[1];
} }
preg_match('/link="(.*?)"/ism', $attributes, $matches); preg_match('/link="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") { if (!empty($matches[1])) {
$link = $matches[1]; $link = $matches[1];
} }
$posted = ""; $posted = "";
preg_match("/posted='(.*?)'/ism", $attributes, $matches); preg_match("/posted='(.*?)'/ism", $attributes, $matches);
if ($matches[1] != "") { if (!empty($matches[1])) {
$posted = $matches[1]; $posted = $matches[1];
} }
preg_match('/posted="(.*?)"/ism', $attributes, $matches); preg_match('/posted="(.*?)"/ism', $attributes, $matches);
if ($matches[1] != "") { if (!empty($matches[1])) {
$posted = $matches[1]; $posted = $matches[1];
} }

View file

@ -556,7 +556,7 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
if (in_array($mode, ['community', 'contacts'])) { if (in_array($mode, ['community', 'contacts'])) {
$writable = true; $writable = true;
} else { } else {
$writable = ($items[0]['uid'] == 0) && in_array($items[0]['network'], [Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]); $writable = ($items[0]['uid'] == 0) && in_array($items[0]['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]);
} }
if (!local_user()) { if (!local_user()) {
@ -657,7 +657,7 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o
'id' => ($preview ? 'P0' : $item['id']), 'id' => ($preview ? 'P0' : $item['id']),
'guid' => ($preview ? 'Q0' : $item['guid']), 'guid' => ($preview ? 'Q0' : $item['guid']),
'network' => $item['network'], 'network' => $item['network'],
'network_name' => ContactSelector::networkToName($item['network'], $profile_link), 'network_name' => ContactSelector::networkToName($item['network'], $item['author-link']),
'linktitle' => L10n::t('View %s\'s profile @ %s', $profile_name, $item['author-link']), 'linktitle' => L10n::t('View %s\'s profile @ %s', $profile_name, $item['author-link']),
'profile_url' => $profile_link, 'profile_url' => $profile_link,
'item_photo_menu' => item_photo_menu($item), 'item_photo_menu' => item_photo_menu($item),
@ -807,7 +807,7 @@ function conversation_add_children(array $parents, $block_authors, $order, $uid)
foreach ($items as $index => $item) { foreach ($items as $index => $item) {
if ($item['uid'] == 0) { if ($item['uid'] == 0) {
$items[$index]['writable'] = in_array($item['network'], [Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]); $items[$index]['writable'] = in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]);
} }
} }
@ -877,7 +877,7 @@ function item_photo_menu($item) {
} }
if ((($cid == 0) || ($rel == Contact::FOLLOWER)) && if ((($cid == 0) || ($rel == Contact::FOLLOWER)) &&
in_array($item['network'], [Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) { in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) {
$menu[L10n::t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']); $menu[L10n::t('Connect/Follow')] = 'follow?url=' . urlencode($item['author-link']);
} }
} else { } else {
@ -1091,21 +1091,6 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false)
'$delitems' => L10n::t("Delete item\x28s\x29?") '$delitems' => L10n::t("Delete item\x28s\x29?")
]); ]);
$tpl = get_markup_template('jot-end.tpl');
$a->page['end'] .= replace_macros($tpl, [
'$newpost' => 'true',
'$baseurl' => System::baseUrl(true),
'$geotag' => $geotag,
'$nickname' => $x['nickname'],
'$ispublic' => L10n::t('Visible to <strong>everybody</strong>'),
'$linkurl' => L10n::t('Please enter a link URL:'),
'$vidurl' => L10n::t("Please enter a video link/URL:"),
'$audurl' => L10n::t("Please enter an audio link/URL:"),
'$term' => L10n::t('Tag term:'),
'$fileas' => L10n::t('Save to Folder:'),
'$whereareu' => L10n::t('Where are you right now?')
]);
$jotplugins = ''; $jotplugins = '';
Addon::callHooks('jot_tool', $jotplugins); Addon::callHooks('jot_tool', $jotplugins);

View file

@ -61,7 +61,7 @@ function notification($params)
} }
$sender_name = $sitename; $sender_name = $sitename;
$hostname = $a->get_hostname(); $hostname = $a->getHostName();
if (strpos($hostname, ':')) { if (strpos($hostname, ':')) {
$hostname = substr($hostname, 0, strpos($hostname, ':')); $hostname = substr($hostname, 0, strpos($hostname, ':'));
} }

View file

@ -316,9 +316,9 @@ function subscribe_to_hub($url, array $importer, array $contact, $hubmode = 'sub
DBA::update('contact', ['hub-verify' => $verify_token], ['id' => $contact['id']]); DBA::update('contact', ['hub-verify' => $verify_token], ['id' => $contact['id']]);
} }
Network::post($url, $params); $postResult = Network::post($url, $params);
logger('subscribe_to_hub: returns: ' . $a->get_curl_code(), LOGGER_DEBUG); logger('subscribe_to_hub: returns: ' . $postResult->getReturnCode(), LOGGER_DEBUG);
return; return;
@ -349,12 +349,12 @@ function drop_item($id)
// locate item to be deleted // locate item to be deleted
$fields = ['id', 'uid', 'contact-id', 'deleted']; $fields = ['id', 'uid', 'guid', 'contact-id', 'deleted'];
$item = Item::selectFirstForUser(local_user(), $fields, ['id' => $id]); $item = Item::selectFirstForUser(local_user(), $fields, ['id' => $id]);
if (!DBA::isResult($item)) { if (!DBA::isResult($item)) {
notice(L10n::t('Item not found.') . EOL); notice(L10n::t('Item not found.') . EOL);
goaway(System::baseUrl() . '/' . $_SESSION['return_url']); goaway('/network');
} }
if ($item['deleted']) { if ($item['deleted']) {
@ -401,17 +401,17 @@ function drop_item($id)
} }
// Now check how the user responded to the confirmation query // Now check how the user responded to the confirmation query
if (!empty($_REQUEST['canceled'])) { if (!empty($_REQUEST['canceled'])) {
goaway(System::baseUrl() . '/' . $_SESSION['return_url']); goaway('/display/' . $item['guid']);
} }
// delete the item // delete the item
Item::deleteForUser(['id' => $item['id']], local_user()); Item::deleteForUser(['id' => $item['id']], local_user());
goaway(System::baseUrl() . '/' . $_SESSION['return_url']); goaway('/network');
//NOTREACHED //NOTREACHED
} else { } else {
notice(L10n::t('Permission denied.') . EOL); notice(L10n::t('Permission denied.') . EOL);
goaway(System::baseUrl() . '/' . $_SESSION['return_url']); goaway('/display/' . $item['guid']);
//NOTREACHED //NOTREACHED
} }
} }

View file

@ -42,7 +42,7 @@ function replace_macros($s, $r) {
// pass $baseurl to all templates // pass $baseurl to all templates
$r['$baseurl'] = System::baseUrl(); $r['$baseurl'] = System::baseUrl();
$t = $a->template_engine(); $t = $a->getTemplateEngine();
try { try {
$output = $t->replaceMacros($s, $r); $output = $t->replaceMacros($s, $r);
} catch (Exception $e) { } catch (Exception $e) {
@ -50,7 +50,7 @@ function replace_macros($s, $r) {
killme(); killme();
} }
$a->save_timestamp($stamp1, "rendering"); $a->saveTimestamp($stamp1, "rendering");
return $output; return $output;
} }
@ -473,7 +473,7 @@ function get_markup_template($s, $root = '') {
$stamp1 = microtime(true); $stamp1 = microtime(true);
$a = get_app(); $a = get_app();
$t = $a->template_engine(); $t = $a->getTemplateEngine();
try { try {
$template = $t->getTemplateFile($s, $root); $template = $t->getTemplateFile($s, $root);
} catch (Exception $e) { } catch (Exception $e) {
@ -481,7 +481,7 @@ function get_markup_template($s, $root = '') {
killme(); killme();
} }
$a->save_timestamp($stamp1, "file"); $a->saveTimestamp($stamp1, "file");
return $template; return $template;
} }
@ -574,7 +574,7 @@ function logger($msg, $level = LOGGER_INFO) {
$stamp1 = microtime(true); $stamp1 = microtime(true);
@file_put_contents($logfile, $logline, FILE_APPEND); @file_put_contents($logfile, $logline, FILE_APPEND);
$a->save_timestamp($stamp1, "file"); $a->saveTimestamp($stamp1, "file");
} }
/** /**
@ -634,7 +634,7 @@ function dlogger($msg, $level = LOGGER_INFO) {
$stamp1 = microtime(true); $stamp1 = microtime(true);
@file_put_contents($logfile, $logline, FILE_APPEND); @file_put_contents($logfile, $logline, FILE_APPEND);
$a->save_timestamp($stamp1, "file"); $a->saveTimestamp($stamp1, "file");
} }
@ -1191,9 +1191,6 @@ function prepare_body(array &$item, $attach = false, $is_preview = false)
$a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), [ $a->page['htmlhead'] .= replace_macros(get_markup_template('videos_head.tpl'), [
'$baseurl' => System::baseUrl(), '$baseurl' => System::baseUrl(),
]); ]);
$a->page['end'] .= replace_macros(get_markup_template('videos_end.tpl'), [
'$baseurl' => System::baseUrl(),
]);
} }
$url_parts = explode('/', $the_url); $url_parts = explode('/', $the_url);
@ -1417,7 +1414,7 @@ function get_plink($item) {
]; ];
if (x($item, 'plink')) { if (x($item, 'plink')) {
$ret["href"] = $a->remove_baseurl($item['plink']); $ret["href"] = $a->removeBaseURL($item['plink']);
$ret["title"] = L10n::t('link to source'); $ret["title"] = L10n::t('link to source');
} }

114
index.php
View file

@ -23,11 +23,9 @@ use Friendica\Module\Login;
require_once 'boot.php'; require_once 'boot.php';
$a = new App(__DIR__);
// We assume that the index.php is called by a frontend process // We assume that the index.php is called by a frontend process
// The value is set to "true" by default in boot.php // The value is set to "true" by default in boot.php
$a->backend = false; $a = new App(__DIR__, false);
/** /**
* Try to open the database; * Try to open the database;
@ -36,7 +34,7 @@ $a->backend = false;
require_once "include/dba.php"; require_once "include/dba.php";
// Missing DB connection: ERROR // Missing DB connection: ERROR
if ($a->mode & App::MODE_LOCALCONFIGPRESENT && !($a->mode & App::MODE_DBAVAILABLE)) { if ($a->getMode()->has(App\Mode::LOCALCONFIGPRESENT) && !$a->getMode()->has(App\Mode::DBAVAILABLE)) {
System::httpExit(500, ['title' => 'Error 500 - Internal Server Error', 'description' => 'Apologies but the website is unavailable at the moment.']); System::httpExit(500, ['title' => 'Error 500 - Internal Server Error', 'description' => 'Apologies but the website is unavailable at the moment.']);
} }
@ -48,8 +46,12 @@ if ($a->isMaxProcessesReached() || $a->isMaxLoadReached()) {
System::httpExit(503, ['title' => 'Error 503 - Service Temporarily Unavailable', 'description' => 'System is currently overloaded. Please try again later.']); System::httpExit(503, ['title' => 'Error 503 - Service Temporarily Unavailable', 'description' => 'System is currently overloaded. Please try again later.']);
} }
if (!$a->isInstallMode()) { if (strstr($a->query_string, '.well-known/host-meta') && ($a->query_string != '.well-known/host-meta')) {
if (Config::get('system', 'force_ssl') && ($a->get_scheme() == "http") System::httpExit(404);
}
if (!$a->getMode()->isInstall()) {
if (Config::get('system', 'force_ssl') && ($a->getScheme() == "http")
&& (intval(Config::get('system', 'ssl_policy')) == SSL_POLICY_FULL) && (intval(Config::get('system', 'ssl_policy')) == SSL_POLICY_FULL)
&& (substr(System::baseUrl(), 0, 8) == "https://") && (substr(System::baseUrl(), 0, 8) == "https://")
&& ($_SERVER['REQUEST_METHOD'] == 'GET')) { && ($_SERVER['REQUEST_METHOD'] == 'GET')) {
@ -78,10 +80,10 @@ L10n::loadTranslationTable($lang);
*/ */
// Exclude the backend processes from the session management // Exclude the backend processes from the session management
if (!$a->is_backend()) { if (!$a->isBackend()) {
$stamp1 = microtime(true); $stamp1 = microtime(true);
session_start(); session_start();
$a->save_timestamp($stamp1, "parser"); $a->saveTimestamp($stamp1, "parser");
} else { } else {
$_SESSION = []; $_SESSION = [];
Worker::executeIfIdle(); Worker::executeIfIdle();
@ -91,7 +93,7 @@ if (!$a->is_backend()) {
* Language was set earlier, but we can over-ride it in the session. * Language was set earlier, but we can over-ride it in the session.
* We have to do it here because the session was just now opened. * We have to do it here because the session was just now opened.
*/ */
if (x($_SESSION, 'authenticated') && !x($_SESSION, 'language')) { if (!empty($_SESSION['authenticated']) && empty($_SESSION['language'])) {
$_SESSION['language'] = $lang; $_SESSION['language'] = $lang;
// we haven't loaded user data yet, but we need user language // we haven't loaded user data yet, but we need user language
if (!empty($_SESSION['uid'])) { if (!empty($_SESSION['uid'])) {
@ -102,12 +104,12 @@ if (x($_SESSION, 'authenticated') && !x($_SESSION, 'language')) {
} }
} }
if (x($_SESSION, 'language') && ($_SESSION['language'] !== $lang)) { if (!empty($_SESSION['language']) && $_SESSION['language'] !== $lang) {
$lang = $_SESSION['language']; $lang = $_SESSION['language'];
L10n::loadTranslationTable($lang); L10n::loadTranslationTable($lang);
} }
if (!empty($_GET['zrl']) && $a->mode == App::MODE_NORMAL) { if (!empty($_GET['zrl']) && $a->getMode()->isNormal()) {
$a->query_string = Profile::stripZrls($a->query_string); $a->query_string = Profile::stripZrls($a->query_string);
if (!local_user()) { if (!local_user()) {
// Only continue when the given profile link seems valid // Only continue when the given profile link seems valid
@ -125,12 +127,12 @@ if (!empty($_GET['zrl']) && $a->mode == App::MODE_NORMAL) {
logger("Invalid ZRL parameter " . $_GET['zrl'], LOGGER_DEBUG); logger("Invalid ZRL parameter " . $_GET['zrl'], LOGGER_DEBUG);
header('HTTP/1.1 403 Forbidden'); header('HTTP/1.1 403 Forbidden');
echo "<h1>403 Forbidden</h1>"; echo "<h1>403 Forbidden</h1>";
killme(); exit();
} }
} }
} }
if ((x($_GET,'owt')) && $a->mode == App::MODE_NORMAL) { if (!empty($_GET['owt']) && $a->getMode()->isNormal()) {
$token = $_GET['owt']; $token = $_GET['owt'];
$a->query_string = Profile::stripQueryParam($a->query_string, 'owt'); $a->query_string = Profile::stripQueryParam($a->query_string, 'owt');
Profile::openWebAuthInit($token); Profile::openWebAuthInit($token);
@ -149,14 +151,10 @@ if ((x($_GET,'owt')) && $a->mode == App::MODE_NORMAL) {
Login::sessionAuth(); Login::sessionAuth();
if (! x($_SESSION, 'authenticated')) { if (empty($_SESSION['authenticated'])) {
header('X-Account-Management-Status: none'); header('X-Account-Management-Status: none');
} }
/* set up page['htmlhead'] and page['end'] for the modules to use */
$a->page['htmlhead'] = '';
$a->page['end'] = '';
$_SESSION['sysmsg'] = defaults($_SESSION, 'sysmsg' , []); $_SESSION['sysmsg'] = defaults($_SESSION, 'sysmsg' , []);
$_SESSION['sysmsg_info'] = defaults($_SESSION, 'sysmsg_info' , []); $_SESSION['sysmsg_info'] = defaults($_SESSION, 'sysmsg_info' , []);
$_SESSION['last_updated'] = defaults($_SESSION, 'last_updated', []); $_SESSION['last_updated'] = defaults($_SESSION, 'last_updated', []);
@ -169,14 +167,14 @@ $_SESSION['last_updated'] = defaults($_SESSION, 'last_updated', []);
// in install mode, any url loads install module // in install mode, any url loads install module
// but we need "view" module for stylesheet // but we need "view" module for stylesheet
if ($a->isInstallMode() && $a->module!="view") { if ($a->getMode()->isInstall() && $a->module != 'view') {
$a->module = 'install'; $a->module = 'install';
} elseif (!($a->mode & App::MODE_MAINTENANCEDISABLED) && $a->module != "view") { } elseif (!$a->getMode()->has(App\Mode::MAINTENANCEDISABLED) && $a->module != 'view') {
$a->module = 'maintenance'; $a->module = 'maintenance';
} else { } else {
check_url($a); check_url($a);
check_db(false); check_db(false);
check_addons($a); Addon::check();
} }
Nav::setSelected('nothing'); Nav::setSelected('nothing');
@ -295,11 +293,11 @@ if (strlen($a->module)) {
if (! $a->module_loaded) { if (! $a->module_loaded) {
// Stupid browser tried to pre-fetch our Javascript img template. Don't log the event or return anything - just quietly exit. // Stupid browser tried to pre-fetch our Javascript img template. Don't log the event or return anything - just quietly exit.
if ((x($_SERVER, 'QUERY_STRING')) && preg_match('/{[0-9]}/', $_SERVER['QUERY_STRING']) !== 0) { if (!empty($_SERVER['QUERY_STRING']) && preg_match('/{[0-9]}/', $_SERVER['QUERY_STRING']) !== 0) {
killme(); killme();
} }
if ((x($_SERVER, 'QUERY_STRING')) && ($_SERVER['QUERY_STRING'] === 'q=internal_error.html') && isset($dreamhost_error_hack)) { if (!empty($_SERVER['QUERY_STRING']) && ($_SERVER['QUERY_STRING'] === 'q=internal_error.html') && isset($dreamhost_error_hack)) {
logger('index.php: dreamhost_error_hack invoked. Original URI =' . $_SERVER['REQUEST_URI']); logger('index.php: dreamhost_error_hack invoked. Original URI =' . $_SERVER['REQUEST_URI']);
goaway(System::baseUrl() . $_SERVER['REQUEST_URI']); goaway(System::baseUrl() . $_SERVER['REQUEST_URI']);
} }
@ -307,11 +305,9 @@ if (strlen($a->module)) {
logger('index.php: page not found: ' . $_SERVER['REQUEST_URI'] . ' ADDRESS: ' . $_SERVER['REMOTE_ADDR'] . ' QUERY: ' . $_SERVER['QUERY_STRING'], LOGGER_DEBUG); logger('index.php: page not found: ' . $_SERVER['REQUEST_URI'] . ' ADDRESS: ' . $_SERVER['REMOTE_ADDR'] . ' QUERY: ' . $_SERVER['QUERY_STRING'], LOGGER_DEBUG);
header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . L10n::t('Not Found')); header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . L10n::t('Not Found'));
$tpl = get_markup_template("404.tpl"); $tpl = get_markup_template("404.tpl");
$a->page['content'] = replace_macros( $a->page['content'] = replace_macros($tpl, [
$tpl, '$message' => L10n::t('Page not found.')
[ ]);
'$message' => L10n::t('Page not found.')]
);
} }
} }
@ -326,11 +322,7 @@ if (file_exists($theme_info_file)) {
/* initialise content region */ /* initialise content region */
if (! x($a->page, 'content')) { if ($a->getMode()->isNormal()) {
$a->page['content'] = '';
}
if ($a->mode == App::MODE_NORMAL) {
Addon::callHooks('page_content_top', $a->page['content']); Addon::callHooks('page_content_top', $a->page['content']);
} }
@ -342,15 +334,21 @@ if ($a->module_loaded) {
$a->page['page_title'] = $a->module; $a->page['page_title'] = $a->module;
$placeholder = ''; $placeholder = '';
Addon::callHooks($a->module . '_mod_init', $placeholder);
if ($a->module_class) { if ($a->module_class) {
Addon::callHooks($a->module . '_mod_init', $placeholder);
call_user_func([$a->module_class, 'init']); call_user_func([$a->module_class, 'init']);
} else if (function_exists($a->module . '_init')) { } else if (function_exists($a->module . '_init')) {
Addon::callHooks($a->module . '_mod_init', $placeholder);
$func = $a->module . '_init'; $func = $a->module . '_init';
$func($a); $func($a);
} }
// "rawContent" is especially meant for technical endpoints.
// This endpoint doesn't need any theme initialization or other comparable stuff.
if (!$a->error && $a->module_class) {
call_user_func([$a->module_class, 'rawContent']);
}
if (function_exists(str_replace('-', '_', $a->getCurrentTheme()) . '_init')) { if (function_exists(str_replace('-', '_', $a->getCurrentTheme()) . '_init')) {
$func = str_replace('-', '_', $a->getCurrentTheme()) . '_init'; $func = str_replace('-', '_', $a->getCurrentTheme()) . '_init';
$func($a); $func($a);
@ -405,24 +403,13 @@ if ($a->module_loaded) {
* theme choices made by the modules can take effect. * theme choices made by the modules can take effect.
*/ */
$a->init_pagehead(); $a->initHead();
/* /*
* Build the page ending -- this is stuff that goes right before * Build the page ending -- this is stuff that goes right before
* the closing </body> tag * the closing </body> tag
*/ */
$a->init_page_end(); $a->initFooter();
// If you're just visiting, let javascript take you home
if (x($_SESSION, 'visitor_home')) {
$homebase = $_SESSION['visitor_home'];
} elseif (local_user()) {
$homebase = 'profile/' . $a->user['nickname'];
}
if (isset($homebase)) {
$a->page['content'] .= '<script>var homebase="' . $homebase . '" ; </script>';
}
/* /*
* now that we've been through the module content, see if the page reported * now that we've been through the module content, see if the page reported
@ -444,36 +431,9 @@ if ($a->module != 'install' && $a->module != 'maintenance') {
Nav::build($a); Nav::build($a);
} }
/*
* Add a "toggle mobile" link if we're using a mobile device
*/
if ($a->is_mobile || $a->is_tablet) {
if (isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) {
$link = 'toggle_mobile?address=' . curPageURL();
} else {
$link = 'toggle_mobile?off=1&address=' . curPageURL();
}
$a->page['footer'] = replace_macros(
get_markup_template("toggle_mobile_footer.tpl"),
[
'$toggle_link' => $link,
'$toggle_text' => L10n::t('toggle mobile')]
);
}
/** /**
* Build the page - now that we have all the components * Build the page - now that we have all the components
*/ */
if (!$a->theme['stylesheet']) {
$stylesheet = $a->getCurrentThemeStylesheetPath();
} else {
$stylesheet = $a->theme['stylesheet'];
}
$a->page['htmlhead'] = str_replace('{{$stylesheet}}', $stylesheet, $a->page['htmlhead']);
//$a->page['htmlhead'] = replace_macros($a->page['htmlhead'], array('$stylesheet' => $stylesheet));
if (isset($_GET["mode"]) && (($_GET["mode"] == "raw") || ($_GET["mode"] == "minimal"))) { if (isset($_GET["mode"]) && (($_GET["mode"] == "raw") || ($_GET["mode"] == "minimal"))) {
$doc = new DOMDocument(); $doc = new DOMDocument();
@ -502,7 +462,7 @@ if (isset($_GET["mode"]) && ($_GET["mode"] == "raw")) {
echo substr($target->saveHTML(), 6, -8); echo substr($target->saveHTML(), 6, -8);
killme(); exit();
} }
$page = $a->page; $page = $a->page;
@ -540,5 +500,3 @@ if (empty($template)) {
/// @TODO Looks unsafe (remote-inclusion), is maybe not but Theme::getPathForFile() uses file_exists() but does not escape anything /// @TODO Looks unsafe (remote-inclusion), is maybe not but Theme::getPathForFile() uses file_exists() but does not escape anything
require_once $template; require_once $template;
killme();

View file

@ -1,16 +0,0 @@
<?php
use Friendica\App;
use Friendica\Network\Probe;
function acctlink_init()
{
if (x($_GET, 'addr')) {
$addr = trim($_GET['addr']);
$res = Probe::uri($addr);
if ($res['url']) {
goaway($res['url']);
killme();
}
}
}

View file

@ -83,8 +83,9 @@ function acl_content(App $a)
WHERE `uid` = %d AND NOT `self` WHERE `uid` = %d AND NOT `self`
AND NOT `blocked` AND NOT `pending` AND NOT `archive` AND NOT `blocked` AND NOT `pending` AND NOT `archive`
AND `success_update` >= `failure_update` AND `success_update` >= `failure_update`
AND `network` IN ('%s', '%s') $sql_extra2", AND `network` IN ('%s', '%s', '%s') $sql_extra2",
intval(local_user()), intval(local_user()),
DBA::escape(Protocol::ACTIVITYPUB),
DBA::escape(Protocol::DFRN), DBA::escape(Protocol::DFRN),
DBA::escape(Protocol::DIASPORA) DBA::escape(Protocol::DIASPORA)
); );
@ -169,10 +170,11 @@ function acl_content(App $a)
} elseif ($type == 'm') { } elseif ($type == 'm') {
$r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr` FROM `contact` $r = q("SELECT `id`, `name`, `nick`, `micro`, `network`, `url`, `attag`, `addr` FROM `contact`
WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive` WHERE `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` AND NOT `archive`
AND `success_update` >= `failure_update` AND `network` IN ('%s', '%s') AND `success_update` >= `failure_update` AND `network` IN ('%s', '%s', '%s')
$sql_extra2 $sql_extra2
ORDER BY `name` ASC ", ORDER BY `name` ASC ",
intval(local_user()), intval(local_user()),
DBA::escape(Protocol::ACTIVITYPUB),
DBA::escape(Protocol::DFRN), DBA::escape(Protocol::DFRN),
DBA::escape(Protocol::DIASPORA) DBA::escape(Protocol::DIASPORA)
); );

View file

@ -77,7 +77,7 @@ function admin_post(App $a)
break; break;
case 'themes': case 'themes':
if ($a->argc < 2) { if ($a->argc < 2) {
if (is_ajax()) { if ($a->isAjax()) {
return; return;
} }
goaway('admin/'); goaway('admin/');
@ -107,7 +107,7 @@ function admin_post(App $a)
} }
info(L10n::t('Theme settings updated.')); info(L10n::t('Theme settings updated.'));
if (is_ajax()) { if ($a->isAjax()) {
return; return;
} }
$return_path = 'admin/themes/' . $theme; $return_path = 'admin/themes/' . $theme;
@ -286,7 +286,7 @@ function admin_content(App $a)
$o = admin_page_summary($a); $o = admin_page_summary($a);
} }
if (is_ajax()) { if ($a->isAjax()) {
echo $o; echo $o;
killme(); killme();
return ''; return '';
@ -475,8 +475,8 @@ function admin_page_contactblock(App $a)
$total = DBA::count('contact', $condition); $total = DBA::count('contact', $condition);
$a->set_pager_total($total); $a->setPagerTotal($total);
$a->set_pager_itemspage(30); $a->setPagerItemsPage(30);
$statement = DBA::select('contact', [], $condition, ['limit' => [$a->pager['start'], $a->pager['itemspage']]]); $statement = DBA::select('contact', [], $condition, ['limit' => [$a->pager['start'], $a->pager['itemspage']]]);
@ -866,15 +866,15 @@ function admin_page_summary(App $a)
// Legacy config file warning // Legacy config file warning
if (file_exists('.htconfig.php')) { if (file_exists('.htconfig.php')) {
$showwarning = true; $showwarning = true;
$warningtext[] = L10n::t('Friendica\'s configuration now is stored in config/local.ini.php, please copy config/local-sample.ini.php and move your config from <code>.htconfig.php</code>. See <a href="%s">the Config help page</a> for help with the transition.', $a->get_baseurl() . '/help/Config'); $warningtext[] = L10n::t('Friendica\'s configuration now is stored in config/local.ini.php, please copy config/local-sample.ini.php and move your config from <code>.htconfig.php</code>. See <a href="%s">the Config help page</a> for help with the transition.', $a->getBaseURL() . '/help/Config');
} }
// Check server vitality // Check server vitality
if (!admin_page_server_vital()) { if (!admin_page_server_vital()) {
$showwarning = true; $showwarning = true;
$well_known = $a->get_baseurl() . '/.well-known/host-meta'; $well_known = $a->getBaseURL() . '/.well-known/host-meta';
$warningtext[] = L10n::t('<a href="%s">%s</a> is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See <a href="%s">the installation page</a> for help.', $warningtext[] = L10n::t('<a href="%s">%s</a> is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See <a href="%s">the installation page</a> for help.',
$well_known, $well_known, $a->get_baseurl() . '/help/Install'); $well_known, $well_known, $a->getBaseURL() . '/help/Install');
} }
$r = q("SELECT `page-flags`, COUNT(`uid`) AS `count` FROM `user` GROUP BY `page-flags`"); $r = q("SELECT `page-flags`, COUNT(`uid`) AS `count` FROM `user` GROUP BY `page-flags`");
@ -1012,7 +1012,7 @@ function admin_page_site_post(App $a)
// update config // update config
Config::set('system', 'hostname', parse_url($new_url, PHP_URL_HOST)); Config::set('system', 'hostname', parse_url($new_url, PHP_URL_HOST));
Config::set('system', 'url', $new_url); Config::set('system', 'url', $new_url);
$a->set_baseurl($new_url); $a->setBaseURL($new_url);
// send relocate // send relocate
$users = q("SELECT `uid` FROM `user` WHERE `account_removed` = 0 AND `account_expired` = 0"); $users = q("SELECT `uid` FROM `user` WHERE `account_removed` = 0 AND `account_expired` = 0");
@ -1124,7 +1124,7 @@ function admin_page_site_post(App $a)
Worker::add(PRIORITY_LOW, 'Directory'); Worker::add(PRIORITY_LOW, 'Directory');
} }
if ($a->get_path() != "") { if ($a->getURLPath() != "") {
$diaspora_enabled = false; $diaspora_enabled = false;
} }
if ($ssl_policy != intval(Config::get('system', 'ssl_policy'))) { if ($ssl_policy != intval(Config::get('system', 'ssl_policy'))) {
@ -1261,7 +1261,7 @@ function admin_page_site_post(App $a)
Config::set('system', 'dbclean-expire-unclaimed', $dbclean_unclaimed); Config::set('system', 'dbclean-expire-unclaimed', $dbclean_unclaimed);
if ($itemcache != '') { if ($itemcache != '') {
$itemcache = App::realpath($itemcache); $itemcache = App::getRealPath($itemcache);
} }
Config::set('system', 'itemcache', $itemcache); Config::set('system', 'itemcache', $itemcache);
@ -1269,13 +1269,13 @@ function admin_page_site_post(App $a)
Config::set('system', 'max_comments', $max_comments); Config::set('system', 'max_comments', $max_comments);
if ($temppath != '') { if ($temppath != '') {
$temppath = App::realpath($temppath); $temppath = App::getRealPath($temppath);
} }
Config::set('system', 'temppath', $temppath); Config::set('system', 'temppath', $temppath);
if ($basepath != '') { if ($basepath != '') {
$basepath = App::realpath($basepath); $basepath = App::getRealPath($basepath);
} }
Config::set('system', 'basepath', $basepath); Config::set('system', 'basepath', $basepath);
@ -1419,9 +1419,9 @@ function admin_page_site(App $a)
]; ];
if (empty(Config::get('config', 'hostname'))) { if (empty(Config::get('config', 'hostname'))) {
Config::set('config', 'hostname', $a->get_hostname()); Config::set('config', 'hostname', $a->getHostName());
} }
$diaspora_able = ($a->get_path() == ""); $diaspora_able = ($a->getURLPath() == "");
$optimize_max_tablesize = Config::get('system', 'optimize_max_tablesize', -1); $optimize_max_tablesize = Config::get('system', 'optimize_max_tablesize', -1);
@ -1488,7 +1488,7 @@ function admin_page_site(App $a)
'$community_page_style' => ['community_page_style', L10n::t("Community pages for visitors"), Config::get('system','community_page_style'), L10n::t("Which community pages should be available for visitors. Local users always see both pages."), $community_page_style_choices], '$community_page_style' => ['community_page_style', L10n::t("Community pages for visitors"), Config::get('system','community_page_style'), L10n::t("Which community pages should be available for visitors. Local users always see both pages."), $community_page_style_choices],
'$max_author_posts_community_page' => ['max_author_posts_community_page', L10n::t("Posts per user on community page"), Config::get('system','max_author_posts_community_page'), L10n::t("The maximum number of posts per user on the community page. \x28Not valid for 'Global Community'\x29")], '$max_author_posts_community_page' => ['max_author_posts_community_page', L10n::t("Posts per user on community page"), Config::get('system','max_author_posts_community_page'), L10n::t("The maximum number of posts per user on the community page. \x28Not valid for 'Global Community'\x29")],
'$ostatus_disabled' => ['ostatus_disabled', L10n::t("Enable OStatus support"), !Config::get('system','ostatus_disabled'), L10n::t("Provide built-in OStatus \x28StatusNet, GNU Social etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")], '$ostatus_disabled' => ['ostatus_disabled', L10n::t("Enable OStatus support"), !Config::get('system','ostatus_disabled'), L10n::t("Provide built-in OStatus \x28StatusNet, GNU Social etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed.")],
'$ostatus_full_threads' => ['ostatus_full_threads', L10n::t("Only import OStatus threads from our contacts"), Config::get('system','ostatus_full_threads'), L10n::t("Normally we import every content from our OStatus contacts. With this option we only store threads that are started by a contact that is known on our system.")], '$ostatus_full_threads' => ['ostatus_full_threads', L10n::t("Only import OStatus/ActivityPub threads from our contacts"), Config::get('system','ostatus_full_threads'), L10n::t("Normally we import every content from our OStatus and ActivityPub contacts. With this option we only store threads that are started by a contact that is known on our system.")],
'$ostatus_not_able' => L10n::t("OStatus support can only be enabled if threading is enabled."), '$ostatus_not_able' => L10n::t("OStatus support can only be enabled if threading is enabled."),
'$diaspora_able' => $diaspora_able, '$diaspora_able' => $diaspora_able,
'$diaspora_not_able' => L10n::t("Diaspora support can't be enabled because Friendica was installed into a sub directory."), '$diaspora_not_able' => L10n::t("Diaspora support can't be enabled because Friendica was installed into a sub directory."),
@ -1801,8 +1801,8 @@ function admin_page_users(App $a)
/* get users */ /* get users */
$total = q("SELECT COUNT(*) AS `total` FROM `user` WHERE 1"); $total = q("SELECT COUNT(*) AS `total` FROM `user` WHERE 1");
if (count($total)) { if (count($total)) {
$a->set_pager_total($total[0]['total']); $a->setPagerTotal($total[0]['total']);
$a->set_pager_itemspage(100); $a->setPagerItemsPage(100);
} }
/* ordering */ /* ordering */
@ -2536,7 +2536,7 @@ function admin_page_features_post(App $a)
*/ */
function admin_page_features(App $a) function admin_page_features(App $a)
{ {
if ((argc() > 1) && (argv(1) === 'features')) { if (($a->argc > 1) && ($a->getArgumentValue(1) === 'features')) {
$arr = []; $arr = [];
$features = Feature::get(false); $features = Feature::get(false);
@ -2567,6 +2567,5 @@ function admin_page_features(App $a)
function admin_page_server_vital() function admin_page_server_vital()
{ {
// Fetch the host-meta to check if this really is a vital server // Fetch the host-meta to check if this really is a vital server
$serverret = Network::curl(System::baseUrl() . '/.well-known/host-meta'); return Network::curl(System::baseUrl() . '/.well-known/host-meta')->isSuccess();
return $serverret["success"];
} }

View file

@ -46,7 +46,7 @@ function allfriends_content(App $a)
$total = GContact::countAllFriends(local_user(), $cid); $total = GContact::countAllFriends(local_user(), $cid);
$a->set_pager_total($total); $a->setPagerTotal($total);
$r = GContact::allFriends(local_user(), $cid, $a->pager['start'], $a->pager['itemspage']); $r = GContact::allFriends(local_user(), $cid, $a->pager['start'], $a->pager['itemspage']);
if (!DBA::isResult($r)) { if (!DBA::isResult($r)) {

View file

@ -114,6 +114,17 @@ function babel_content()
'content' => visible_whitespace($bbcode) 'content' => visible_whitespace($bbcode)
]; ];
$html2 = Text\BBCode::convert($bbcode);
$results[] = [
'title' => L10n::t('HTML::toBBCode => BBCode::convert'),
'content' => $html2
];
$results[] = [
'title' => L10n::t('HTML::toBBCode => BBCode::convert (raw HTML)'),
'content' => htmlspecialchars($html2)
];
$markdown = Text\HTML::toMarkdown($html); $markdown = Text\HTML::toMarkdown($html);
$results[] = [ $results[] = [
'title' => L10n::t('HTML::toMarkdown'), 'title' => L10n::t('HTML::toMarkdown'),

View file

@ -94,11 +94,6 @@ function cal_content(App $a)
'$i18n' => $i18n, '$i18n' => $i18n,
]); ]);
$etpl = get_markup_template('event_end.tpl');
$a->page['end'] .= replace_macros($etpl, [
'$baseurl' => System::baseUrl(),
]);
$mode = 'view'; $mode = 'view';
$y = 0; $y = 0;
$m = 0; $m = 0;

View file

@ -88,7 +88,7 @@ function common_content(App $a)
} }
if ($t > 0) { if ($t > 0) {
$a->set_pager_total($t); $a->setPagerTotal($t);
} else { } else {
notice(L10n::t('No contacts in common.') . EOL); notice(L10n::t('No contacts in common.') . EOL);
return $o; return $o;

View file

@ -153,7 +153,7 @@ function community_content(App $a, $update = 0)
$itemspage_network = $a->force_max_items; $itemspage_network = $a->force_max_items;
} }
$a->set_pager_itemspage($itemspage_network); $a->setPagerItemsPage($itemspage_network);
$r = community_getitems($a->pager['start'], $a->pager['itemspage'], $content, $accounttype); $r = community_getitems($a->pager['start'], $a->pager['itemspage'], $content, $accounttype);

View file

@ -22,6 +22,7 @@ use Friendica\Network\Probe;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Proxy as ProxyUtils; use Friendica\Util\Proxy as ProxyUtils;
use Friendica\Core\ACL; use Friendica\Core\ACL;
use Friendica\Module\Login;
function contacts_init(App $a) function contacts_init(App $a)
{ {
@ -117,12 +118,6 @@ function contacts_init(App $a)
'$baseurl' => System::baseUrl(true), '$baseurl' => System::baseUrl(true),
'$base' => $base '$base' => $base
]); ]);
$tpl = get_markup_template("contacts-end.tpl");
$a->page['end'] .= replace_macros($tpl, [
'$baseurl' => System::baseUrl(true),
'$base' => $base
]);
} }
function contacts_batch_actions(App $a) function contacts_batch_actions(App $a)
@ -168,11 +163,7 @@ function contacts_batch_actions(App $a)
info(L10n::tt("%d contact edited.", "%d contacts edited.", $count_actions)); info(L10n::tt("%d contact edited.", "%d contacts edited.", $count_actions));
} }
if (x($_SESSION, 'return_url')) { goaway('contacts');
goaway('' . $_SESSION['return_url']);
} else {
goaway('contacts');
}
} }
function contacts_post(App $a) function contacts_post(App $a)
@ -385,7 +376,7 @@ function contacts_content(App $a, $update = 0)
if (!local_user()) { if (!local_user()) {
notice(L10n::t('Permission denied.') . EOL); notice(L10n::t('Permission denied.') . EOL);
return; return Login::form();
} }
if ($a->argc == 3) { if ($a->argc == 3) {
@ -476,20 +467,13 @@ function contacts_content(App $a, $update = 0)
} }
// Now check how the user responded to the confirmation query // Now check how the user responded to the confirmation query
if (x($_REQUEST, 'canceled')) { if (x($_REQUEST, 'canceled')) {
if (x($_SESSION, 'return_url')) { goaway('contacts');
goaway('' . $_SESSION['return_url']);
} else {
goaway('contacts');
}
} }
_contact_drop($orig_record); _contact_drop($orig_record);
info(L10n::t('Contact has been removed.') . EOL); info(L10n::t('Contact has been removed.') . EOL);
if (x($_SESSION, 'return_url')) {
goaway('' . $_SESSION['return_url']); goaway('contacts');
} else {
goaway('contacts');
}
return; // NOTREACHED return; // NOTREACHED
} }
if ($cmd === 'posts') { if ($cmd === 'posts') {
@ -509,9 +493,6 @@ function contacts_content(App $a, $update = 0)
$a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), [ $a->page['htmlhead'] .= replace_macros(get_markup_template('contact_head.tpl'), [
'$baseurl' => System::baseUrl(true), '$baseurl' => System::baseUrl(true),
]); ]);
$a->page['end'] .= replace_macros(get_markup_template('contact_end.tpl'), [
'$baseurl' => System::baseUrl(true),
]);
$contact['blocked'] = Contact::isBlockedByUser($contact['id'], local_user()); $contact['blocked'] = Contact::isBlockedByUser($contact['id'], local_user());
$contact['readonly'] = Contact::isIgnoredByUser($contact['id'], local_user()); $contact['readonly'] = Contact::isIgnoredByUser($contact['id'], local_user());
@ -542,7 +523,7 @@ function contacts_content(App $a, $update = 0)
$relation_text = ''; $relation_text = '';
} }
if (!in_array($contact['network'], [Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) { if (!in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])) {
$relation_text = ""; $relation_text = "";
} }
@ -655,15 +636,15 @@ function contacts_content(App $a, $update = 0)
'$follow_text' => $follow_text, '$follow_text' => $follow_text,
'$profile_select' => $profile_select, '$profile_select' => $profile_select,
'$contact_id' => $contact['id'], '$contact_id' => $contact['id'],
'$block_text' => (($contact['blocked']) ? L10n::t('Unblock') : L10n::t('Block') ), '$block_text' => ($contact['blocked'] ? L10n::t('Unblock') : L10n::t('Block')),
'$ignore_text' => (($contact['readonly']) ? L10n::t('Unignore') : L10n::t('Ignore') ), '$ignore_text' => ($contact['readonly'] ? L10n::t('Unignore') : L10n::t('Ignore')),
'$insecure' => (($contact['network'] !== Protocol::DFRN && $contact['network'] !== Protocol::MAIL && $contact['network'] !== Protocol::DIASPORA) ? $insecure : ''), '$insecure' => (in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA]) ? '' : $insecure),
'$info' => $contact['info'], '$info' => $contact['info'],
'$cinfo' => ['info', '', $contact['info'], ''], '$cinfo' => ['info', '', $contact['info'], ''],
'$blocked' => (($contact['blocked']) ? L10n::t('Currently blocked') : ''), '$blocked' => ($contact['blocked'] ? L10n::t('Currently blocked') : ''),
'$ignored' => (($contact['readonly']) ? L10n::t('Currently ignored') : ''), '$ignored' => ($contact['readonly'] ? L10n::t('Currently ignored') : ''),
'$archived' => (($contact['archive']) ? L10n::t('Currently archived') : ''), '$archived' => ($contact['archive'] ? L10n::t('Currently archived') : ''),
'$pending' => (($contact['pending']) ? L10n::t('Awaiting connection acknowledge') : ''), '$pending' => ($contact['pending'] ? L10n::t('Awaiting connection acknowledge') : ''),
'$hidden' => ['hidden', L10n::t('Hide this contact from others'), ($contact['hidden'] == 1), L10n::t('Replies/likes to your public posts <strong>may</strong> still be visible')], '$hidden' => ['hidden', L10n::t('Hide this contact from others'), ($contact['hidden'] == 1), L10n::t('Replies/likes to your public posts <strong>may</strong> still be visible')],
'$notify' => ['notify', L10n::t('Notification for new posts'), ($contact['notify_new_posts'] == 1), L10n::t('Send a notification of every new post of this contact')], '$notify' => ['notify', L10n::t('Notification for new posts'), ($contact['notify_new_posts'] == 1), L10n::t('Send a notification of every new post of this contact')],
'$fetch_further_information' => $fetch_further_information, '$fetch_further_information' => $fetch_further_information,
@ -812,7 +793,7 @@ function contacts_content(App $a, $update = 0)
intval($_SESSION['uid']) intval($_SESSION['uid'])
); );
if (DBA::isResult($r)) { if (DBA::isResult($r)) {
$a->set_pager_total($r[0]['total']); $a->setPagerTotal($r[0]['total']);
$total = $r[0]['total']; $total = $r[0]['total'];
} }
@ -975,7 +956,7 @@ function contact_conversations(App $a, $contact_id, $update)
$profiledata = Contact::getDetailsByURL($contact["url"]); $profiledata = Contact::getDetailsByURL($contact["url"]);
if (local_user()) { if (local_user()) {
if (in_array($profiledata["network"], [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) {
$profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]);
} }
} }
@ -999,7 +980,7 @@ function contact_posts(App $a, $contact_id)
$profiledata = Contact::getDetailsByURL($contact["url"]); $profiledata = Contact::getDetailsByURL($contact["url"]);
if (local_user()) { if (local_user()) {
if (in_array($profiledata["network"], [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) { if (in_array($profiledata["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) {
$profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]); $profiledata["remoteconnect"] = System::baseUrl()."/follow?url=".urlencode($profiledata["url"]);
} }
} }
@ -1080,7 +1061,7 @@ function _contact_detail_for_template(array $rr)
*/ */
function contact_actions($contact) function contact_actions($contact)
{ {
$poll_enabled = in_array($contact['network'], [Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]); $poll_enabled = in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::FEED, Protocol::MAIL]);
$contact_actions = []; $contact_actions = [];
// Provide friend suggestion only for Friendica contacts // Provide friend suggestion only for Friendica contacts
@ -1105,7 +1086,7 @@ function contact_actions($contact)
} }
$contact_actions['block'] = [ $contact_actions['block'] = [
'label' => (intval($contact['blocked']) ? L10n::t('Unblock') : L10n::t('Block') ), 'label' => (intval($contact['blocked']) ? L10n::t('Unblock') : L10n::t('Block')),
'url' => 'contacts/' . $contact['id'] . '/block', 'url' => 'contacts/' . $contact['id'] . '/block',
'title' => L10n::t('Toggle Blocked status'), 'title' => L10n::t('Toggle Blocked status'),
'sel' => (intval($contact['blocked']) ? 'active' : ''), 'sel' => (intval($contact['blocked']) ? 'active' : ''),
@ -1113,7 +1094,7 @@ function contact_actions($contact)
]; ];
$contact_actions['ignore'] = [ $contact_actions['ignore'] = [
'label' => (intval($contact['readonly']) ? L10n::t('Unignore') : L10n::t('Ignore') ), 'label' => (intval($contact['readonly']) ? L10n::t('Unignore') : L10n::t('Ignore')),
'url' => 'contacts/' . $contact['id'] . '/ignore', 'url' => 'contacts/' . $contact['id'] . '/ignore',
'title' => L10n::t('Toggle Ignored status'), 'title' => L10n::t('Toggle Ignored status'),
'sel' => (intval($contact['readonly']) ? 'active' : ''), 'sel' => (intval($contact['readonly']) ? 'active' : ''),
@ -1122,7 +1103,7 @@ function contact_actions($contact)
if ($contact['uid'] != 0) { if ($contact['uid'] != 0) {
$contact_actions['archive'] = [ $contact_actions['archive'] = [
'label' => (intval($contact['archive']) ? L10n::t('Unarchive') : L10n::t('Archive') ), 'label' => (intval($contact['archive']) ? L10n::t('Unarchive') : L10n::t('Archive')),
'url' => 'contacts/' . $contact['id'] . '/archive', 'url' => 'contacts/' . $contact['id'] . '/archive',
'title' => L10n::t('Toggle Archive status'), 'title' => L10n::t('Toggle Archive status'),
'sel' => (intval($contact['archive']) ? 'active' : ''), 'sel' => (intval($contact['archive']) ? 'active' : ''),

View file

@ -133,7 +133,7 @@ function crepair_content(App $a)
$remote_self_options = ['0' => L10n::t('No mirroring'), '2' => L10n::t('Mirror as my own posting')]; $remote_self_options = ['0' => L10n::t('No mirroring'), '2' => L10n::t('Mirror as my own posting')];
} }
$update_profile = in_array($contact['network'], [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]); $update_profile = in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]);
$tab_str = contacts_tab($a, $contact, 5); $tab_str = contacts_tab($a, $contact, 5);

View file

@ -28,6 +28,7 @@ use Friendica\Model\Group;
use Friendica\Model\User; use Friendica\Model\User;
use Friendica\Network\Probe; use Friendica\Network\Probe;
use Friendica\Protocol\Diaspora; use Friendica\Protocol\Diaspora;
use Friendica\Protocol\ActivityPub;
use Friendica\Util\Crypto; use Friendica\Util\Crypto;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Network; use Friendica\Util\Network;
@ -220,7 +221,7 @@ function dfrn_confirm_post(App $a, $handsfree = null)
* *
*/ */
$res = Network::post($dfrn_confirm, $params, null, $redirects, 120); $res = Network::post($dfrn_confirm, $params, null, $redirects, 120)->getBody();
logger(' Confirm: received data: ' . $res, LOGGER_DATA); logger(' Confirm: received data: ' . $res, LOGGER_DATA);
@ -335,10 +336,17 @@ function dfrn_confirm_post(App $a, $handsfree = null)
intval($contact_id) intval($contact_id)
); );
} else { } else {
if ($network == Protocol::ACTIVITYPUB) {
ActivityPub\Transmitter::sendContactAccept($contact['url'], $contact['hub-verify'], $uid);
$pending = true;
} else {
$pending = false;
}
// $network !== Protocol::DFRN // $network !== Protocol::DFRN
$network = defaults($contact, 'network', Protocol::OSTATUS); $network = defaults($contact, 'network', Protocol::OSTATUS);
$arr = Probe::uri($contact['url']); $arr = Probe::uri($contact['url'], $network);
$notify = defaults($contact, 'notify' , $arr['notify']); $notify = defaults($contact, 'notify' , $arr['notify']);
$poll = defaults($contact, 'poll' , $arr['poll']); $poll = defaults($contact, 'poll' , $arr['poll']);
@ -348,7 +356,7 @@ function dfrn_confirm_post(App $a, $handsfree = null)
$new_relation = $contact['rel']; $new_relation = $contact['rel'];
$writable = $contact['writable']; $writable = $contact['writable'];
if ($network === Protocol::DIASPORA) { if (in_array($network, [Protocol::DIASPORA, Protocol::ACTIVITYPUB])) {
if ($duplex) { if ($duplex) {
$new_relation = Contact::FRIEND; $new_relation = Contact::FRIEND;
} else { } else {
@ -362,30 +370,12 @@ function dfrn_confirm_post(App $a, $handsfree = null)
DBA::delete('intro', ['id' => $intro_id]); DBA::delete('intro', ['id' => $intro_id]);
$r = q("UPDATE `contact` SET `name-date` = '%s', $fields = ['name-date' => DateTimeFormat::utcNow(),
`uri-date` = '%s', 'uri-date' => DateTimeFormat::utcNow(), 'addr' => $addr,
`addr` = '%s', 'notify' => $notify, 'poll' => $poll, 'blocked' => false,
`notify` = '%s', 'pending' => $pending, 'network' => $network,
`poll` = '%s', 'writable' => $writable, 'hidden' => $hidden, 'rel' => $new_relation];
`blocked` = 0, DBA::update('contact', $fields, ['id' => $contact_id]);
`pending` = 0,
`network` = '%s',
`writable` = %d,
`hidden` = %d,
`rel` = %d
WHERE `id` = %d
",
DBA::escape(DateTimeFormat::utcNow()),
DBA::escape(DateTimeFormat::utcNow()),
DBA::escape($addr),
DBA::escape($notify),
DBA::escape($poll),
DBA::escape($network),
intval($writable),
intval($hidden),
intval($new_relation),
intval($contact_id)
);
} }
if (!DBA::isResult($r)) { if (!DBA::isResult($r)) {
@ -403,6 +393,10 @@ function dfrn_confirm_post(App $a, $handsfree = null)
Group::addMember(User::getDefaultGroup($uid, $contact["network"]), $contact['id']); Group::addMember(User::getDefaultGroup($uid, $contact["network"]), $contact['id']);
if ($network == Protocol::ACTIVITYPUB && $duplex) {
ActivityPub\Transmitter::sendActivity('Follow', $contact['url'], $uid);
}
// Let's send our user to the contact editor in case they want to // Let's send our user to the contact editor in case they want to
// do anything special with this new friend. // do anything special with this new friend.
if ($handsfree === null) { if ($handsfree === null) {

View file

@ -502,7 +502,7 @@ function dfrn_poll_content(App $a)
'dfrn_version' => DFRN_PROTOCOL_VERSION, 'dfrn_version' => DFRN_PROTOCOL_VERSION,
'challenge' => $challenge, 'challenge' => $challenge,
'sec' => $sec 'sec' => $sec
]); ])->getBody();
} }
$profile = ((DBA::isResult($r) && $r[0]['nickname']) ? $r[0]['nickname'] : $nickname); $profile = ((DBA::isResult($r) && $r[0]['nickname']) ? $r[0]['nickname'] : $nickname);

View file

@ -451,10 +451,10 @@ function dfrn_request_post(App $a)
// Diaspora needs the uri in the format user@domain.tld // Diaspora needs the uri in the format user@domain.tld
// Diaspora will support the remote subscription in a future version // Diaspora will support the remote subscription in a future version
if ($network == Protocol::DIASPORA) { if ($network == Protocol::DIASPORA) {
$uri = $nickname . '@' . $a->get_hostname(); $uri = $nickname . '@' . $a->getHostName();
if ($a->get_path()) { if ($a->getURLPath()) {
$uri .= '/' . $a->get_path(); $uri .= '/' . $a->getURLPath();
} }
$uri = urlencode($uri); $uri = urlencode($uri);
@ -609,7 +609,7 @@ function dfrn_request_content(App $a)
} elseif (x($_GET, 'address') && ($_GET['address'] != "")) { } elseif (x($_GET, 'address') && ($_GET['address'] != "")) {
$myaddr = $_GET['address']; $myaddr = $_GET['address'];
} elseif (local_user()) { } elseif (local_user()) {
if (strlen($a->urlpath)) { if (strlen($a->getURLPath())) {
$myaddr = System::baseUrl() . '/profile/' . $a->user['nickname']; $myaddr = System::baseUrl() . '/profile/' . $a->user['nickname'];
} else { } else {
$myaddr = $a->user['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(), '://') + 3); $myaddr = $a->user['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(), '://') + 3);

View file

@ -16,7 +16,7 @@ use Friendica\Util\Proxy as ProxyUtils;
function directory_init(App $a) function directory_init(App $a)
{ {
$a->set_pager_itemspage(60); $a->setPagerItemsPage(60);
if (local_user()) { if (local_user()) {
$a->page['aside'] .= Widget::findPeople(); $a->page['aside'] .= Widget::findPeople();
@ -87,7 +87,7 @@ function directory_content(App $a)
LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid`
WHERE `is-default` $publish AND NOT `user`.`blocked` AND NOT `user`.`account_removed` $sql_extra"); WHERE `is-default` $publish AND NOT `user`.`blocked` AND NOT `user`.`account_removed` $sql_extra");
if (DBA::isResult($cnt)) { if (DBA::isResult($cnt)) {
$a->set_pager_total($cnt['total']); $a->setPagerTotal($cnt['total']);
} }
$order = " ORDER BY `name` ASC "; $order = " ORDER BY `name` ASC ";

View file

@ -54,7 +54,7 @@ function dirfind_content(App $a, $prefix = "") {
if ((valid_email($search) && Network::isEmailDomainValid($search)) || if ((valid_email($search) && Network::isEmailDomainValid($search)) ||
(substr(normalise_link($search), 0, 7) == "http://")) { (substr(normalise_link($search), 0, 7) == "http://")) {
$user_data = Probe::uri($search); $user_data = Probe::uri($search);
$discover_user = (in_array($user_data["network"], [Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA])); $discover_user = (in_array($user_data["network"], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::OSTATUS, Protocol::DIASPORA]));
} }
} }
@ -188,8 +188,8 @@ function dirfind_content(App $a, $prefix = "") {
} }
if ($j->total) { if ($j->total) {
$a->set_pager_total($j->total); $a->setPagerTotal($j->total);
$a->set_pager_itemspage($j->items_page); $a->setPagerItemsPage($j->items_page);
} }
if (!empty($j->results)) { if (!empty($j->results)) {

View file

@ -17,6 +17,7 @@ use Friendica\Model\Group;
use Friendica\Model\Item; use Friendica\Model\Item;
use Friendica\Model\Profile; use Friendica\Model\Profile;
use Friendica\Protocol\DFRN; use Friendica\Protocol\DFRN;
use Friendica\Protocol\ActivityPub;
function display_init(App $a) function display_init(App $a)
{ {
@ -43,7 +44,7 @@ function display_init(App $a)
$item = null; $item = null;
$fields = ['id', 'parent', 'author-id', 'body', 'uid']; $fields = ['id', 'parent', 'author-id', 'body', 'uid', 'guid'];
// If there is only one parameter, then check if this parameter could be a guid // If there is only one parameter, then check if this parameter could be a guid
if ($a->argc == 2) { if ($a->argc == 2) {
@ -76,6 +77,10 @@ function display_init(App $a)
displayShowFeed($item["id"], false); displayShowFeed($item["id"], false);
} }
if (ActivityPub::isRequest()) {
goaway(str_replace('display/', 'objects/', $a->query_string));
}
if ($item["id"] != $item["parent"]) { if ($item["id"] != $item["parent"]) {
$item = Item::selectFirstForUser(local_user(), $fields, ['id' => $item["parent"]]); $item = Item::selectFirstForUser(local_user(), $fields, ['id' => $item["parent"]]);
} }
@ -360,7 +365,7 @@ function display_content(App $a, $update = false, $update_uid = 0)
$title = trim(HTML::toPlaintext(BBCode::convert($item["title"], false), 0, true)); $title = trim(HTML::toPlaintext(BBCode::convert($item["title"], false), 0, true));
$author_name = $item["author-name"]; $author_name = $item["author-name"];
$image = $a->remove_baseurl($item["author-avatar"]); $image = $a->removeBaseURL($item["author-avatar"]);
if ($title == "") { if ($title == "") {
$title = $author_name; $title = $author_name;

View file

@ -57,15 +57,6 @@ function editpost_content(App $a)
'$nickname' => $a->user['nickname'] '$nickname' => $a->user['nickname']
]); ]);
$tpl = get_markup_template('jot-end.tpl');
$a->page['end'] .= replace_macros($tpl, [
'$baseurl' => System::baseUrl(),
'$ispublic' => '&nbsp;', // L10n::t('Visible to <strong>everybody</strong>'),
'$geotag' => $geotag,
'$nickname' => $a->user['nickname']
]);
$tpl = get_markup_template("jot.tpl"); $tpl = get_markup_template("jot.tpl");
if (strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid'])) { if (strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid'])) {

View file

@ -17,6 +17,7 @@ use Friendica\Model\Item;
use Friendica\Model\Profile; use Friendica\Model\Profile;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Temporal; use Friendica\Util\Temporal;
use Friendica\Module\Login;
require_once 'include/items.php'; require_once 'include/items.php';
@ -186,14 +187,14 @@ function events_post(App $a)
Worker::add(PRIORITY_HIGH, "Notifier", "event", $item_id); Worker::add(PRIORITY_HIGH, "Notifier", "event", $item_id);
} }
goaway($_SESSION['return_url']); goaway('/events');
} }
function events_content(App $a) function events_content(App $a)
{ {
if (!local_user()) { if (!local_user()) {
notice(L10n::t('Permission denied.') . EOL); notice(L10n::t('Permission denied.') . EOL);
return; return Login::form();
} }
if ($a->argc == 1) { if ($a->argc == 1) {
@ -231,11 +232,6 @@ function events_content(App $a)
'$i18n' => $i18n, '$i18n' => $i18n,
]); ]);
$etpl = get_markup_template('event_end.tpl');
$a->page['end'] .= replace_macros($etpl, [
'$baseurl' => System::baseUrl(),
]);
$o = ''; $o = '';
$tabs = ''; $tabs = '';
// tabs // tabs

View file

@ -32,8 +32,7 @@ function feedtest_content(App $a)
$contact = DBA::selectFirst('contact', [], ['id' => $contact_id]); $contact = DBA::selectFirst('contact', [], ['id' => $contact_id]);
$ret = Network::curl($contact['poll']); $xml = Network::fetchUrl($contact['poll']);
$xml = $ret['body'];
$dummy = null; $dummy = null;
$import_result = Feed::import($xml, $importer, $contact, $dummy, true); $import_result = Feed::import($xml, $importer, $contact, $dummy, true);

View file

@ -25,9 +25,7 @@ function filerm_content(App $a) {
file_tag_unsave_file(local_user(),$item_id,$term, $category); file_tag_unsave_file(local_user(),$item_id,$term, $category);
} }
if (x($_SESSION,'return_url')) { //goaway('/network');
goaway(System::baseUrl() . '/' . $_SESSION['return_url']);
}
killme(); killme();
} }

View file

@ -20,12 +20,12 @@ function follow_post(App $a)
} }
if (isset($_REQUEST['cancel'])) { if (isset($_REQUEST['cancel'])) {
goaway($_SESSION['return_url']); goaway('contacts');
} }
$uid = local_user(); $uid = local_user();
$url = notags(trim($_REQUEST['url'])); $url = notags(trim($_REQUEST['url']));
$return_url = $_SESSION['return_url']; $return_url = 'contacts';
// Makes the connection request for friendica contacts easier // Makes the connection request for friendica contacts easier
// This is just a precaution if maybe this page is called somewhere directly via POST // This is just a precaution if maybe this page is called somewhere directly via POST
@ -39,7 +39,7 @@ function follow_post(App $a)
} }
goaway($return_url); goaway($return_url);
} elseif ($result['cid']) { } elseif ($result['cid']) {
goaway(System::baseUrl() . '/contacts/' . $result['cid']); goaway('contacts/' . $result['cid']);
} }
info(L10n::t('The contact could not be added.')); info(L10n::t('The contact could not be added.'));
@ -50,9 +50,11 @@ function follow_post(App $a)
function follow_content(App $a) function follow_content(App $a)
{ {
$return_url = 'contacts';
if (!local_user()) { if (!local_user()) {
notice(L10n::t('Permission denied.')); notice(L10n::t('Permission denied.'));
goaway($_SESSION['return_url']); goaway($return_url);
// NOTREACHED // NOTREACHED
} }
@ -116,7 +118,7 @@ function follow_content(App $a)
if (!$r) { if (!$r) {
notice(L10n::t('Permission denied.')); notice(L10n::t('Permission denied.'));
goaway($_SESSION['return_url']); goaway($return_url);
// NOTREACHED // NOTREACHED
} }

View file

@ -36,7 +36,7 @@ function fsuggest_post(App $a)
$hash = random_string(); $hash = random_string();
$note = escape_tags(trim($_POST['note'])); $note = escape_tags(trim(defaults($_POST, 'note', '')));
if ($new_contact) { if ($new_contact) {
$r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1",

View file

@ -50,7 +50,7 @@ function hcard_init(App $a)
$a->page['htmlhead'] .= '<meta name="dfrn-global-visibility" content="' . (($a->profile['net-publish']) ? 'true' : 'false') . '" />' . "\r\n" ; $a->page['htmlhead'] .= '<meta name="dfrn-global-visibility" content="' . (($a->profile['net-publish']) ? 'true' : 'false') . '" />' . "\r\n" ;
$a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . System::baseUrl() . '/dfrn_poll/' . $which .'" />' . "\r\n" ; $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . System::baseUrl() . '/dfrn_poll/' . $which .'" />' . "\r\n" ;
$uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . (($a->urlpath) ? '/' . $a->urlpath : '')); $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->getHostName() . (($a->getURLPath()) ? '/' . $a->getURLPath() : ''));
$a->page['htmlhead'] .= '<link rel="lrdd" type="application/xrd+xml" href="' . System::baseUrl() . '/xrd/?uri=' . $uri . '" />' . "\r\n"; $a->page['htmlhead'] .= '<link rel="lrdd" type="application/xrd+xml" href="' . System::baseUrl() . '/xrd/?uri=' . $uri . '" />' . "\r\n";
header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false); header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false);

View file

@ -36,12 +36,12 @@ function help_content(App $a)
$path = ''; $path = '';
// looping through the argv keys bigger than 0 to build // looping through the argv keys bigger than 0 to build
// a path relative to /help // a path relative to /help
for ($x = 1; $x < argc(); $x ++) { for ($x = 1; $x < $a->argc; $x ++) {
if (strlen($path)) { if (strlen($path)) {
$path .= '/'; $path .= '/';
} }
$path .= argv($x); $path .= $a->getArgumentValue($x);
} }
$title = basename($path); $title = basename($path);
$filename = $path; $filename = $path;

View file

@ -38,8 +38,8 @@ function home_content(App $a) {
$customhome = false; $customhome = false;
$defaultheader = '<h1>' . (Config::get('config', 'sitename') ? L10n::t('Welcome to %s', Config::get('config', 'sitename')) : '') . '</h1>'; $defaultheader = '<h1>' . (Config::get('config', 'sitename') ? L10n::t('Welcome to %s', Config::get('config', 'sitename')) : '') . '</h1>';
$homefilepath = $a->basepath . "/home.html"; $homefilepath = $a->getBasePath() . "/home.html";
$cssfilepath = $a->basepath . "/home.css"; $cssfilepath = $a->getBasePath() . "/home.css";
if (file_exists($homefilepath)) { if (file_exists($homefilepath)) {
$customhome = $homefilepath; $customhome = $homefilepath;
if (file_exists($cssfilepath)) { if (file_exists($cssfilepath)) {

View file

@ -23,7 +23,7 @@ function hostxrd_init(App $a)
$tpl = get_markup_template('xrd_host.tpl'); $tpl = get_markup_template('xrd_host.tpl');
echo replace_macros($tpl, [ echo replace_macros($tpl, [
'$zhost' => $a->get_hostname(), '$zhost' => $a->getHostName(),
'$zroot' => System::baseUrl(), '$zroot' => System::baseUrl(),
'$domain' => System::baseUrl(), '$domain' => System::baseUrl(),
'$bigkey' => Salmon::salmonKey(Config::get('system', 'site_pubkey'))] '$bigkey' => Salmon::salmonKey(Config::get('system', 'site_pubkey'))]

View file

@ -8,6 +8,7 @@ use Friendica\Core\Install;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Database\DBStructure;
use Friendica\Util\Temporal; use Friendica\Util\Temporal;
$install_wizard_pass = 1; $install_wizard_pass = 1;
@ -42,7 +43,6 @@ function install_post(App $a) {
return; return;
break; // just in case return don't return :) break; // just in case return don't return :)
case 3: case 3:
$urlpath = $a->get_path();
$dbhost = notags(trim($_POST['dbhost'])); $dbhost = notags(trim($_POST['dbhost']));
$dbuser = notags(trim($_POST['dbuser'])); $dbuser = notags(trim($_POST['dbuser']));
$dbpass = notags(trim($_POST['dbpass'])); $dbpass = notags(trim($_POST['dbpass']));
@ -57,7 +57,7 @@ function install_post(App $a) {
return; return;
break; break;
case 4: case 4:
$urlpath = $a->get_path(); $urlpath = $a->getURLPath();
$dbhost = notags(trim($_POST['dbhost'])); $dbhost = notags(trim($_POST['dbhost']));
$dbuser = notags(trim($_POST['dbuser'])); $dbuser = notags(trim($_POST['dbuser']));
$dbpass = notags(trim($_POST['dbpass'])); $dbpass = notags(trim($_POST['dbpass']));
@ -70,14 +70,16 @@ function install_post(App $a) {
// connect to db // connect to db
DBA::connect($dbhost, $dbuser, $dbpass, $dbdata); DBA::connect($dbhost, $dbuser, $dbpass, $dbdata);
$errors = Install::createConfig($urlpath, $dbhost, $dbuser, $dbpass, $dbdata, $phpath, $timezone, $language, $adminmail); $install = new Install();
if ($errors) { $errors = $install->createConfig($phpath, $urlpath, $dbhost, $dbuser, $dbpass, $dbdata, $timezone, $language, $adminmail, $a->getBasePath());
$a->data['db_failed'] = $errors;
if ($errors !== true) {
$a->data['data'] = $errors;
return; return;
} }
$errors = Install::installDatabaseStructure(); $errors = DBStructure::update(false, true, true);
if ($errors) { if ($errors) {
$a->data['db_failed'] = $errors; $a->data['db_failed'] = $errors;
@ -97,8 +99,6 @@ function install_content(App $a) {
$wizard_status = ""; $wizard_status = "";
$install_title = L10n::t('Friendica Communications Server - Setup'); $install_title = L10n::t('Friendica Communications Server - Setup');
if (x($a->data, 'db_conn_failed')) { if (x($a->data, 'db_conn_failed')) {
$install_wizard_pass = 2; $install_wizard_pass = 2;
$wizard_status = L10n::t('Could not connect to database.'); $wizard_status = L10n::t('Could not connect to database.');
@ -125,13 +125,8 @@ function install_content(App $a) {
if (DBA::$connected) { if (DBA::$connected) {
$r = q("SELECT COUNT(*) as `total` FROM `user`"); $r = q("SELECT COUNT(*) as `total` FROM `user`");
if (DBA::isResult($r) && $r[0]['total']) { if (DBA::isResult($r) && $r[0]['total']) {
$tpl = get_markup_template('install.tpl'); $install_wizard_pass = 2;
return replace_macros($tpl, [ $wizard_status = L10n::t('Database already in use.');
'$title' => $install_title,
'$pass' => '',
'$status' => L10n::t('Database already in use.'),
'$text' => '',
]);
} }
} }
@ -153,19 +148,21 @@ function install_content(App $a) {
$phpath = defaults($_POST, 'phpath', 'php'); $phpath = defaults($_POST, 'phpath', 'php');
list($checks, $checkspassed) = Install::check($phpath); $install = new Install($phpath);
$status = $install->checkAll($a->getBasePath(), $a->getBaseURL());
$tpl = get_markup_template('install_checks.tpl'); $tpl = get_markup_template('install_checks.tpl');
$o .= replace_macros($tpl, [ $o .= replace_macros($tpl, [
'$title' => $install_title, '$title' => $install_title,
'$pass' => L10n::t('System check'), '$pass' => L10n::t('System check'),
'$checks' => $checks, '$checks' => $install->getChecks(),
'$passed' => $checkspassed, '$passed' => $status,
'$see_install' => L10n::t('Please see the file "INSTALL.txt".'), '$see_install' => L10n::t('Please see the file "INSTALL.txt".'),
'$next' => L10n::t('Next'), '$next' => L10n::t('Next'),
'$reload' => L10n::t('Check again'), '$reload' => L10n::t('Check again'),
'$phpath' => $phpath, '$phpath' => $phpath,
'$baseurl' => System::baseUrl(), '$baseurl' => $a->getBaseURL(),
]); ]);
return $o; return $o;
}; break; }; break;
@ -197,7 +194,7 @@ function install_content(App $a) {
'$lbl_10' => L10n::t('Please select a default timezone for your website'), '$lbl_10' => L10n::t('Please select a default timezone for your website'),
'$baseurl' => System::baseUrl(), '$baseurl' => $a->getBaseURL(),
'$phpath' => $phpath, '$phpath' => $phpath,
@ -235,9 +232,7 @@ function install_content(App $a) {
'$timezone' => Temporal::getTimezoneField('timezone', L10n::t('Please select a default timezone for your website'), $timezone, ''), '$timezone' => Temporal::getTimezoneField('timezone', L10n::t('Please select a default timezone for your website'), $timezone, ''),
'$language' => ['language', L10n::t('System Language:'), 'en', L10n::t('Set the default language for your Friendica installation interface and to send emails.'), $lang_choices], '$language' => ['language', L10n::t('System Language:'), 'en', L10n::t('Set the default language for your Friendica installation interface and to send emails.'), $lang_choices],
'$baseurl' => System::baseUrl(), '$baseurl' => $a->getBaseURL(),
'$submit' => L10n::t('Submit'), '$submit' => L10n::t('Submit'),

View file

@ -159,7 +159,7 @@ function item_post(App $a) {
} }
// Allow commenting if it is an answer to a public post // Allow commenting if it is an answer to a public post
$allow_comment = local_user() && ($profile_uid == 0) && $parent && in_array($parent_item['network'], [Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]); $allow_comment = local_user() && ($profile_uid == 0) && $parent && in_array($parent_item['network'], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::DIASPORA, Protocol::DFRN]);
// Now check that valid personal details have been provided // Now check that valid personal details have been provided
if (!can_write_wall($profile_uid) && !$allow_comment) { if (!can_write_wall($profile_uid) && !$allow_comment) {
@ -240,7 +240,7 @@ function item_post(App $a) {
$emailcc = notags(trim(defaults($_REQUEST, 'emailcc' , ''))); $emailcc = notags(trim(defaults($_REQUEST, 'emailcc' , '')));
$body = escape_tags(trim(defaults($_REQUEST, 'body' , ''))); $body = escape_tags(trim(defaults($_REQUEST, 'body' , '')));
$network = notags(trim(defaults($_REQUEST, 'network' , Protocol::DFRN))); $network = notags(trim(defaults($_REQUEST, 'network' , Protocol::DFRN)));
$guid = System::createGUID(32); $guid = System::createUUID();
$postopts = defaults($_REQUEST, 'postopts', ''); $postopts = defaults($_REQUEST, 'postopts', '');
@ -343,20 +343,11 @@ function item_post(App $a) {
$tags = get_tags($body); $tags = get_tags($body);
// Add a tag if the parent contact is from OStatus (This will notify them during delivery) // Add a tag if the parent contact is from ActivityPub or OStatus (This will notify them)
if ($parent) { if ($parent && in_array($thr_parent_contact['network'], [Protocol::OSTATUS, Protocol::ACTIVITYPUB])) {
if ($thr_parent_contact['network'] == Protocol::OSTATUS) { $contact = '@[url=' . $thr_parent_contact['url'] . ']' . $thr_parent_contact['nick'] . '[/url]';
$contact = '@[url=' . $thr_parent_contact['url'] . ']' . $thr_parent_contact['nick'] . '[/url]'; if (!stripos(implode($tags), '[url=' . $thr_parent_contact['url'] . ']')) {
if (!stripos(implode($tags), '[url=' . $thr_parent_contact['url'] . ']')) { $tags[] = $contact;
$tags[] = $contact;
}
}
if ($parent_contact['network'] == Protocol::OSTATUS) {
$contact = '@[url=' . $parent_contact['url'] . ']' . $parent_contact['nick'] . '[/url]';
if (!stripos(implode($tags), '[url=' . $parent_contact['url'] . ']')) {
$tags[] = $contact;
}
} }
} }
@ -885,13 +876,13 @@ function item_content(App $a)
$o = ''; $o = '';
if (($a->argc == 3) && ($a->argv[1] === 'drop') && intval($a->argv[2])) { if (($a->argc == 3) && ($a->argv[1] === 'drop') && intval($a->argv[2])) {
if (is_ajax()) { if ($a->isAjax()) {
$o = Item::deleteForUser(['id' => $a->argv[2]], local_user()); $o = Item::deleteForUser(['id' => $a->argv[2]], local_user());
} else { } else {
$o = drop_item($a->argv[2]); $o = drop_item($a->argv[2]);
} }
if (is_ajax()) { if ($a->isAjax()) {
// ajax return: [<item id>, 0 (no perm) | <owner id>] // ajax return: [<item id>, 0 (no perm) | <owner id>]
echo json_encode([intval($a->argv[2]), intval($o)]); echo json_encode([intval($a->argv[2]), intval($o)]);
killme(); killme();
@ -1026,8 +1017,7 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n
$alias = $contact["alias"]; $alias = $contact["alias"];
$newname = $contact["nick"]; $newname = $contact["nick"];
if (($newname == "") || (($contact["network"] != Protocol::OSTATUS) && ($contact["network"] != Protocol::TWITTER) if (($newname == "") || !in_array($contact["network"], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::TWITTER, Protocol::STATUSNET])) {
&& ($contact["network"] != Protocol::STATUSNET))) {
$newname = $contact["name"]; $newname = $contact["name"];
} }
} }

View file

@ -59,16 +59,16 @@ function match_content(App $a)
} }
if (strlen(Config::get('system', 'directory'))) { if (strlen(Config::get('system', 'directory'))) {
$x = Network::post(get_server().'/msearch', $params); $x = Network::post(get_server().'/msearch', $params)->getBody();
} else { } else {
$x = Network::post(System::baseUrl() . '/msearch', $params); $x = Network::post(System::baseUrl() . '/msearch', $params)->getBody();
} }
$j = json_decode($x); $j = json_decode($x);
if ($j->total) { if ($j->total) {
$a->set_pager_total($j->total); $a->setPagerTotal($j->total);
$a->set_pager_itemspage($j->items_page); $a->setPagerItemsPage($j->items_page);
} }
if (count($j->results)) { if (count($j->results)) {

View file

@ -16,6 +16,7 @@ use Friendica\Model\Mail;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Proxy as ProxyUtils; use Friendica\Util\Proxy as ProxyUtils;
use Friendica\Util\Temporal; use Friendica\Util\Temporal;
use Friendica\Module\Login;
require_once 'include/conversation.php'; require_once 'include/conversation.php';
@ -46,12 +47,6 @@ function message_init(App $a)
'$baseurl' => System::baseUrl(true), '$baseurl' => System::baseUrl(true),
'$base' => $base '$base' => $base
]); ]);
$end_tpl = get_markup_template('message-end.tpl');
$a->page['end'] .= replace_macros($end_tpl, [
'$baseurl' => System::baseUrl(true),
'$base' => $base
]);
} }
function message_post(App $a) function message_post(App $a)
@ -103,7 +98,7 @@ function message_content(App $a)
if (!local_user()) { if (!local_user()) {
notice(L10n::t('Permission denied.') . EOL); notice(L10n::t('Permission denied.') . EOL);
return; return Login::form();
} }
$myprofile = System::baseUrl() . '/profile/' . $a->user['nickname']; $myprofile = System::baseUrl() . '/profile/' . $a->user['nickname'];
@ -160,17 +155,28 @@ function message_content(App $a)
// Now check how the user responded to the confirmation query // Now check how the user responded to the confirmation query
if (!empty($_REQUEST['canceled'])) { if (!empty($_REQUEST['canceled'])) {
goaway($_SESSION['return_url']); goaway('/message');
} }
$cmd = $a->argv[1]; $cmd = $a->argv[1];
if ($cmd === 'drop') { if ($cmd === 'drop') {
$message = DBA::selectFirst('mail', ['convid'], ['id' => $a->argv[2], 'uid' => local_user()]);
if(!DBA::isResult($message)){
info(L10n::t('Conversation not found.') . EOL);
goaway('/message');
}
if (DBA::delete('mail', ['id' => $a->argv[2], 'uid' => local_user()])) { if (DBA::delete('mail', ['id' => $a->argv[2], 'uid' => local_user()])) {
info(L10n::t('Message deleted.') . EOL); info(L10n::t('Message deleted.') . EOL);
} }
//goaway(System::baseUrl(true) . '/message' ); $conversation = DBA::selectFirst('mail', ['id'], ['convid' => $message['convid'], 'uid' => local_user()]);
goaway($_SESSION['return_url']); if(!DBA::isResult($conversation)){
info(L10n::t('Conversation removed.') . EOL);
goaway('/message');
}
goaway('/message/' . $conversation['id'] );
} else { } else {
$r = q("SELECT `parent-uri`,`convid` FROM `mail` WHERE `id` = %d AND `uid` = %d LIMIT 1", $r = q("SELECT `parent-uri`,`convid` FROM `mail` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($a->argv[2]), intval($a->argv[2]),
@ -184,8 +190,7 @@ function message_content(App $a)
info(L10n::t('Conversation removed.') . EOL); info(L10n::t('Conversation removed.') . EOL);
} }
} }
//goaway(System::baseUrl(true) . '/message' ); goaway('/message' );
goaway($_SESSION['return_url']);
} }
} }
@ -199,13 +204,6 @@ function message_content(App $a)
'$linkurl' => L10n::t('Please enter a link URL:') '$linkurl' => L10n::t('Please enter a link URL:')
]); ]);
$tpl = get_markup_template('msg-end.tpl');
$a->page['end'] .= replace_macros($tpl, [
'$baseurl' => System::baseUrl(true),
'$nickname' => $a->user['nickname'],
'$linkurl' => L10n::t('Please enter a link URL:')
]);
$preselect = isset($a->argv[2]) ? [$a->argv[2]] : []; $preselect = isset($a->argv[2]) ? [$a->argv[2]] : [];
$prename = $preurl = $preid = ''; $prename = $preurl = $preid = '';
@ -281,7 +279,7 @@ function message_content(App $a)
); );
if (DBA::isResult($r)) { if (DBA::isResult($r)) {
$a->set_pager_total($r[0]['total']); $a->setPagerTotal($r[0]['total']);
} }
$r = get_messages(local_user(), $a->pager['start'], $a->pager['itemspage']); $r = get_messages(local_user(), $a->pager['start'], $a->pager['itemspage']);
@ -344,13 +342,6 @@ function message_content(App $a)
'$linkurl' => L10n::t('Please enter a link URL:') '$linkurl' => L10n::t('Please enter a link URL:')
]); ]);
$tpl = get_markup_template('msg-end.tpl');
$a->page['end'] .= replace_macros($tpl, [
'$baseurl' => System::baseUrl(true),
'$nickname' => $a->user['nickname'],
'$linkurl' => L10n::t('Please enter a link URL:')
]);
$mails = []; $mails = [];
$seen = 0; $seen = 0;
$unknown = false; $unknown = false;

View file

@ -302,7 +302,7 @@ function networkPager($a, $update)
$itemspage_network = $a->force_max_items; $itemspage_network = $a->force_max_items;
} }
$a->set_pager_itemspage($itemspage_network); $a->setPagerItemsPage($itemspage_network);
return sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); return sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage']));
} }
@ -721,7 +721,7 @@ function networkThreadedView(App $a, $update, $parent)
if ($last_received != '') { if ($last_received != '') {
$last_date = $last_received; $last_date = $last_received;
$sql_range .= sprintf(" AND $sql_table.`received` < '%s'", DBA::escape($last_received)); $sql_range .= sprintf(" AND $sql_table.`received` < '%s'", DBA::escape($last_received));
$a->set_pager_page(1); $a->setPagerPage(1);
$pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage']));
} }
break; break;
@ -729,7 +729,7 @@ function networkThreadedView(App $a, $update, $parent)
if ($last_commented != '') { if ($last_commented != '') {
$last_date = $last_commented; $last_date = $last_commented;
$sql_range .= sprintf(" AND $sql_table.`commented` < '%s'", DBA::escape($last_commented)); $sql_range .= sprintf(" AND $sql_table.`commented` < '%s'", DBA::escape($last_commented));
$a->set_pager_page(1); $a->setPagerPage(1);
$pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage']));
} }
break; break;
@ -737,14 +737,14 @@ function networkThreadedView(App $a, $update, $parent)
if ($last_created != '') { if ($last_created != '') {
$last_date = $last_created; $last_date = $last_created;
$sql_range .= sprintf(" AND $sql_table.`created` < '%s'", DBA::escape($last_created)); $sql_range .= sprintf(" AND $sql_table.`created` < '%s'", DBA::escape($last_created));
$a->set_pager_page(1); $a->setPagerPage(1);
$pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage']));
} }
break; break;
case 'id': case 'id':
if (($last_id > 0) && ($sql_table == '`thread`')) { if (($last_id > 0) && ($sql_table == '`thread`')) {
$sql_range .= sprintf(" AND $sql_table.`iid` < '%s'", DBA::escape($last_id)); $sql_range .= sprintf(" AND $sql_table.`iid` < '%s'", DBA::escape($last_id));
$a->set_pager_page(1); $a->setPagerPage(1);
$pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage']));
} }
break; break;
@ -810,7 +810,7 @@ function networkThreadedView(App $a, $update, $parent)
} }
// Only show it when unfiltered (no groups, no networks, ...) // Only show it when unfiltered (no groups, no networks, ...)
if (in_array($nets, ['', Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]) && (strlen($sql_extra . $sql_extra2 . $sql_extra3) == 0)) { if (in_array($nets, ['', Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS]) && (strlen($sql_extra . $sql_extra2 . $sql_extra3) == 0)) {
if (DBA::isResult($r)) { if (DBA::isResult($r)) {
$top_limit = current($r)['order_date']; $top_limit = current($r)['order_date'];
$bottom_limit = end($r)['order_date']; $bottom_limit = end($r)['order_date'];

View file

@ -215,7 +215,7 @@ function nodeinfo_cron() {
logger('local_comments: ' . $local_comments, LOGGER_DEBUG); logger('local_comments: ' . $local_comments, LOGGER_DEBUG);
// Now trying to register // Now trying to register
$url = 'http://the-federation.info/register/'.$a->get_hostname(); $url = 'http://the-federation.info/register/'.$a->getHostName();
logger('registering url: '.$url, LOGGER_DEBUG); logger('registering url: '.$url, LOGGER_DEBUG);
$ret = Network::fetchUrl($url); $ret = Network::fetchUrl($url);
logger('registering answer: '.$ret, LOGGER_DEBUG); logger('registering answer: '.$ret, LOGGER_DEBUG);

View file

@ -61,7 +61,7 @@ function notes_content(App $a, $update = false)
$condition = ['uid' => local_user(), 'post-type' => Item::PT_PERSONAL_NOTE, 'gravity' => GRAVITY_PARENT, $condition = ['uid' => local_user(), 'post-type' => Item::PT_PERSONAL_NOTE, 'gravity' => GRAVITY_PARENT,
'wall' => false, 'contact-id'=> $a->contact['id']]; 'wall' => false, 'contact-id'=> $a->contact['id']];
$a->set_pager_itemspage(40); $a->setPagerItemsPage(40);
$params = ['order' => ['created' => true], $params = ['order' => ['created' => true],
'limit' => [$a->pager['start'], $a->pager['itemspage']]]; 'limit' => [$a->pager['start'], $a->pager['itemspage']]];

View file

@ -12,6 +12,7 @@ use Friendica\Core\NotificationsManager;
use Friendica\Core\Protocol; use Friendica\Core\Protocol;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Module\Login;
function notifications_post(App $a) function notifications_post(App $a)
{ {
@ -65,7 +66,7 @@ function notifications_content(App $a)
{ {
if (!local_user()) { if (!local_user()) {
notice(L10n::t('Permission denied.') . EOL); notice(L10n::t('Permission denied.') . EOL);
return; return Login::form();
} }
$page = defaults($_REQUEST, 'page', 1); $page = defaults($_REQUEST, 'page', 1);
@ -119,7 +120,7 @@ function notifications_content(App $a)
} }
// Set the pager // Set the pager
$a->set_pager_itemspage($perpage); $a->setPagerItemsPage($perpage);
// Add additional informations (needed for json output) // Add additional informations (needed for json output)
$notifs['items_page'] = $a->pager['itemspage']; $notifs['items_page'] = $a->pager['itemspage'];

View file

@ -27,7 +27,7 @@ function notify_init(App $a)
$nm->setSeen($note); $nm->setSeen($note);
// The friendica client has problems with the GUID. this is some workaround // The friendica client has problems with the GUID. this is some workaround
if ($a->is_friendica_app()) { if ($a->isFriendicaApp()) {
require_once("include/items.php"); require_once("include/items.php");
$urldata = parse_url($note['link']); $urldata = parse_url($note['link']);
$guid = basename($urldata["path"]); $guid = basename($urldata["path"]);

View file

@ -19,7 +19,7 @@ function openid_content(App $a) {
if((x($_GET,'openid_mode')) && (x($_SESSION,'openid'))) { if((x($_GET,'openid_mode')) && (x($_SESSION,'openid'))) {
$openid = new LightOpenID($a->get_hostname()); $openid = new LightOpenID($a->getHostName());
if($openid->validate()) { if($openid->validate()) {

View file

@ -11,7 +11,7 @@ function opensearch_content(App $a) {
$o = replace_macros($tpl, [ $o = replace_macros($tpl, [
'$baseurl' => System::baseUrl(), '$baseurl' => System::baseUrl(),
'$nodename' => $a->get_hostname(), '$nodename' => $a->getHostName(),
]); ]);
echo $o; echo $o;

View file

@ -15,7 +15,7 @@ function ostatus_subscribe_content(App $a) {
if (! local_user()) { if (! local_user()) {
notice(L10n::t('Permission denied.') . EOL); notice(L10n::t('Permission denied.') . EOL);
goaway($_SESSION['return_url']); goaway('/ostatus_subscribe');
// NOTREACHED // NOTREACHED
} }
@ -44,14 +44,14 @@ function ostatus_subscribe_content(App $a) {
$api = $contact["baseurl"]."/api/"; $api = $contact["baseurl"]."/api/";
// Fetching friends // Fetching friends
$data = Network::curl($api."statuses/friends.json?screen_name=".$contact["nick"]); $curlResult = Network::curl($api."statuses/friends.json?screen_name=".$contact["nick"]);
if (!$data["success"]) { if (!$curlResult->isSuccess()) {
PConfig::delete($uid, "ostatus", "legacy_contact"); PConfig::delete($uid, "ostatus", "legacy_contact");
return $o.L10n::t("Couldn't fetch friends for contact."); return $o.L10n::t("Couldn't fetch friends for contact.");
} }
PConfig::set($uid, "ostatus", "legacy_friends", $data["body"]); PConfig::set($uid, "ostatus", "legacy_friends", $curlResult->getBody());
} }
$friends = json_decode(PConfig::get($uid, "ostatus", "legacy_friends")); $friends = json_decode(PConfig::get($uid, "ostatus", "legacy_friends"));
@ -72,8 +72,8 @@ function ostatus_subscribe_content(App $a) {
$o .= "<p>".$counter."/".$total.": ".$url; $o .= "<p>".$counter."/".$total.": ".$url;
$data = Probe::uri($url); $curlResult = Probe::uri($url);
if ($data["network"] == Protocol::OSTATUS) { if ($curlResult["network"] == Protocol::OSTATUS) {
$result = Contact::createFromProbe($uid, $url, true, Protocol::OSTATUS); $result = Contact::createFromProbe($uid, $url, true, Protocol::OSTATUS);
if ($result["success"]) { if ($result["success"]) {
$o .= " - ".L10n::t("success"); $o .= " - ".L10n::t("success");

View file

@ -60,12 +60,12 @@ function parse_url_content(App $a)
// the URL with the corresponding BBCode media tag // the URL with the corresponding BBCode media tag
$redirects = 0; $redirects = 0;
// Fetch the header of the URL // Fetch the header of the URL
$result = Network::curl($url, false, $redirects, ['novalidate' => true, 'nobody' => true]); $curlResponse = Network::curl($url, false, $redirects, ['novalidate' => true, 'nobody' => true]);
if ($result['success']) { if ($curlResponse->isSuccess()) {
// Convert the header fields into an array // Convert the header fields into an array
$hdrs = []; $hdrs = [];
$h = explode("\n", $result['header']); $h = explode("\n", $curlResponse->getHeader());
foreach ($h as $l) { foreach ($h as $l) {
$header = array_map('trim', explode(':', trim($l), 2)); $header = array_map('trim', explode(':', trim($l), 2));
if (count($header) == 2) { if (count($header) == 2) {

View file

@ -192,7 +192,7 @@ function photo_init(App $a)
// If the photo is public and there is an existing photo directory store the photo there // If the photo is public and there is an existing photo directory store the photo there
if ($public and $file != '') { if ($public and $file != '') {
// If the photo path isn't there, try to create it // If the photo path isn't there, try to create it
$basepath = $a->get_basepath(); $basepath = $a->getBasePath();
if (!is_dir($basepath . "/photo")) { if (!is_dir($basepath . "/photo")) {
if (is_writable($basepath)) { if (is_writable($basepath)) {
mkdir($basepath . "/photo"); mkdir($basepath . "/photo");

View file

@ -472,7 +472,7 @@ function photos_post(App $a)
$uri = Item::newURI($page_owner_uid); $uri = Item::newURI($page_owner_uid);
$arr = []; $arr = [];
$arr['guid'] = System::createGUID(32); $arr['guid'] = System::createUUID();
$arr['uid'] = $page_owner_uid; $arr['uid'] = $page_owner_uid;
$arr['uri'] = $uri; $arr['uri'] = $uri;
$arr['parent-uri'] = $uri; $arr['parent-uri'] = $uri;
@ -651,7 +651,7 @@ function photos_post(App $a)
$uri = Item::newURI($page_owner_uid); $uri = Item::newURI($page_owner_uid);
$arr = []; $arr = [];
$arr['guid'] = System::createGUID(32); $arr['guid'] = System::createUUID();
$arr['uid'] = $page_owner_uid; $arr['uid'] = $page_owner_uid;
$arr['uri'] = $uri; $arr['uri'] = $uri;
$arr['parent-uri'] = $uri; $arr['parent-uri'] = $uri;
@ -889,7 +889,7 @@ function photos_post(App $a)
$arr['coord'] = $lat . ' ' . $lon; $arr['coord'] = $lat . ' ' . $lon;
} }
$arr['guid'] = System::createGUID(32); $arr['guid'] = System::createUUID();
$arr['uid'] = $page_owner_uid; $arr['uid'] = $page_owner_uid;
$arr['uri'] = $uri; $arr['uri'] = $uri;
$arr['parent-uri'] = $uri; $arr['parent-uri'] = $uri;
@ -1143,8 +1143,8 @@ function photos_content(App $a)
DBA::escape($album) DBA::escape($album)
); );
if (DBA::isResult($r)) { if (DBA::isResult($r)) {
$a->set_pager_total(count($r)); $a->setPagerTotal(count($r));
$a->set_pager_itemspage(20); $a->setPagerItemsPage(20);
} }
/// @TODO I have seen this many times, maybe generalize it script-wide and encapsulate it? /// @TODO I have seen this many times, maybe generalize it script-wide and encapsulate it?
@ -1393,7 +1393,7 @@ function photos_content(App $a)
$link_item = Item::selectFirst([], ['id' => $linked_items[0]['id']]); $link_item = Item::selectFirst([], ['id' => $linked_items[0]['id']]);
$condition = ["`parent` = ? AND `parent` != `id`", $link_item['parent']]; $condition = ["`parent` = ? AND `parent` != `id`", $link_item['parent']];
$a->set_pager_total(DBA::count('item', $condition)); $a->setPagerTotal(DBA::count('item', $condition));
$params = ['order' => ['id'], 'limit' => [$a->pager['start'], $a->pager['itemspage']]]; $params = ['order' => ['id'], 'limit' => [$a->pager['start'], $a->pager['itemspage']]];
$result = Item::selectForUser($link_item['uid'], Item::ITEM_FIELDLIST, $condition, $params); $result = Item::selectForUser($link_item['uid'], Item::ITEM_FIELDLIST, $condition, $params);
@ -1655,8 +1655,8 @@ function photos_content(App $a)
); );
if (DBA::isResult($r)) { if (DBA::isResult($r)) {
$a->set_pager_total(count($r)); $a->setPagerTotal(count($r));
$a->set_pager_itemspage(20); $a->setPagerItemsPage(20);
} }
$r = q("SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`, $r = q("SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`,

View file

@ -350,7 +350,7 @@ function ping_init(App $a)
$regularnotifications = (!empty($_GET['uid']) && !empty($_GET['_'])); $regularnotifications = (!empty($_GET['uid']) && !empty($_GET['_']));
foreach ($notifs as $notif) { foreach ($notifs as $notif) {
if ($a->is_friendica_app() || !$regularnotifications) { if ($a->isFriendicaApp() || !$regularnotifications) {
$notif['message'] = str_replace("{0}", $notif['name'], $notif['message']); $notif['message'] = str_replace("{0}", $notif['name'], $notif['message']);
} }

View file

@ -97,7 +97,7 @@ function poke_init(App $a)
$arr = []; $arr = [];
$arr['guid'] = System::createGUID(32); $arr['guid'] = System::createUUID();
$arr['uid'] = $uid; $arr['uid'] = $uid;
$arr['uri'] = $uri; $arr['uri'] = $uri;
$arr['parent-uri'] = (!empty($parent_uri) ? $parent_uri : $uri); $arr['parent-uri'] = (!empty($parent_uri) ? $parent_uri : $uri);

View file

@ -20,6 +20,7 @@ use Friendica\Model\Profile;
use Friendica\Module\Login; use Friendica\Module\Login;
use Friendica\Protocol\DFRN; use Friendica\Protocol\DFRN;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Protocol\ActivityPub;
function profile_init(App $a) function profile_init(App $a)
{ {
@ -49,6 +50,16 @@ function profile_init(App $a)
DFRN::autoRedir($a, $which); DFRN::autoRedir($a, $which);
} }
if (ActivityPub::isRequest()) {
$user = DBA::selectFirst('user', ['uid'], ['nickname' => $which]);
if (DBA::isResult($user)) {
$data = ActivityPub\Transmitter::getProfile($user['uid']);
echo json_encode($data);
header('Content-Type: application/activity+json');
exit();
}
}
Profile::load($a, $which, $profile); Profile::load($a, $which, $profile);
$blocked = !local_user() && !remote_user() && Config::get('system', 'block_public'); $blocked = !local_user() && !remote_user() && Config::get('system', 'block_public');
@ -80,7 +91,7 @@ function profile_init(App $a)
$a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . System::baseUrl() . '/feed/' . $which . '/" title="' . L10n::t('%s\'s posts', $a->profile['username']) . '"/>' . "\r\n"; $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . System::baseUrl() . '/feed/' . $which . '/" title="' . L10n::t('%s\'s posts', $a->profile['username']) . '"/>' . "\r\n";
$a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . System::baseUrl() . '/feed/' . $which . '/comments" title="' . L10n::t('%s\'s comments', $a->profile['username']) . '"/>' . "\r\n"; $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . System::baseUrl() . '/feed/' . $which . '/comments" title="' . L10n::t('%s\'s comments', $a->profile['username']) . '"/>' . "\r\n";
$a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . System::baseUrl() . '/feed/' . $which . '/activity" title="' . L10n::t('%s\'s timeline', $a->profile['username']) . '"/>' . "\r\n"; $a->page['htmlhead'] .= '<link rel="alternate" type="application/atom+xml" href="' . System::baseUrl() . '/feed/' . $which . '/activity" title="' . L10n::t('%s\'s timeline', $a->profile['username']) . '"/>' . "\r\n";
$uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->get_hostname() . ($a->urlpath ? '/' . $a->urlpath : '')); $uri = urlencode('acct:' . $a->profile['nickname'] . '@' . $a->getHostName() . ($a->getURLPath() ? '/' . $a->getURLPath() : ''));
$a->page['htmlhead'] .= '<link rel="lrdd" type="application/xrd+xml" href="' . System::baseUrl() . '/xrd/?uri=' . $uri . '" />' . "\r\n"; $a->page['htmlhead'] .= '<link rel="lrdd" type="application/xrd+xml" href="' . System::baseUrl() . '/xrd/?uri=' . $uri . '" />' . "\r\n";
header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false); header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false);
@ -296,7 +307,7 @@ function profile_content(App $a, $update = 0)
$itemspage_network = $a->force_max_items; $itemspage_network = $a->force_max_items;
} }
$a->set_pager_itemspage($itemspage_network); $a->setPagerItemsPage($itemspage_network);
$pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage']));

View file

@ -317,7 +317,6 @@ function profile_photo_crop_ui_head(App $a, Image $image)
} }
$a->page['htmlhead'] .= replace_macros(get_markup_template("crophead.tpl"), []); $a->page['htmlhead'] .= replace_macros(get_markup_template("crophead.tpl"), []);
$a->page['end'] .= replace_macros(get_markup_template("cropend.tpl"), []);
$imagecrop = [ $imagecrop = [
'hash' => $hash, 'hash' => $hash,

View file

@ -20,6 +20,7 @@ use Friendica\Model\Profile;
use Friendica\Network\Probe; use Friendica\Network\Probe;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Temporal; use Friendica\Util\Temporal;
use Friendica\Module\Login;
function profiles_init(App $a) { function profiles_init(App $a) {
@ -509,7 +510,7 @@ function profiles_content(App $a) {
if (! local_user()) { if (! local_user()) {
notice(L10n::t('Permission denied.') . EOL); notice(L10n::t('Permission denied.') . EOL);
return; return Login::form();
} }
$o = ''; $o = '';
@ -527,9 +528,6 @@ function profiles_content(App $a) {
$a->page['htmlhead'] .= replace_macros(get_markup_template('profed_head.tpl'), [ $a->page['htmlhead'] .= replace_macros(get_markup_template('profed_head.tpl'), [
'$baseurl' => System::baseUrl(true), '$baseurl' => System::baseUrl(true),
]); ]);
$a->page['end'] .= replace_macros(get_markup_template('profed_end.tpl'), [
'$baseurl' => System::baseUrl(true),
]);
$opt_tpl = get_markup_template("profile-hide-friends.tpl"); $opt_tpl = get_markup_template("profile-hide-friends.tpl");
$hide_friends = replace_macros($opt_tpl,[ $hide_friends = replace_macros($opt_tpl,[
@ -618,10 +616,10 @@ function profiles_content(App $a) {
'$country_name' => ['country_name', L10n::t('Country:'), $r[0]['country-name']], '$country_name' => ['country_name', L10n::t('Country:'), $r[0]['country-name']],
'$age' => ((intval($r[0]['dob'])) ? '(' . L10n::t('Age: ') . Temporal::getAgeByTimezone($r[0]['dob'],$a->user['timezone'],$a->user['timezone']) . ')' : ''), '$age' => ((intval($r[0]['dob'])) ? '(' . L10n::t('Age: ') . Temporal::getAgeByTimezone($r[0]['dob'],$a->user['timezone'],$a->user['timezone']) . ')' : ''),
'$gender' => ContactSelector::gender($r[0]['gender']), '$gender' => ContactSelector::gender($r[0]['gender']),
'$marital' => ContactSelector::maritalStatus($r[0]['marital']), '$marital' => ['selector' => ContactSelector::maritalStatus($r[0]['marital']), 'value' => $r[0]['marital']],
'$with' => ['with', L10n::t("Who: \x28if applicable\x29"), strip_tags($r[0]['with']), L10n::t('Examples: cathy123, Cathy Williams, cathy@example.com')], '$with' => ['with', L10n::t("Who: \x28if applicable\x29"), strip_tags($r[0]['with']), L10n::t('Examples: cathy123, Cathy Williams, cathy@example.com')],
'$howlong' => ['howlong', L10n::t('Since [date]:'), ($r[0]['howlong'] <= NULL_DATE ? '' : DateTimeFormat::local($r[0]['howlong']))], '$howlong' => ['howlong', L10n::t('Since [date]:'), ($r[0]['howlong'] <= NULL_DATE ? '' : DateTimeFormat::local($r[0]['howlong']))],
'$sexual' => ContactSelector::sexualPreference($r[0]['sexual']), '$sexual' => ['selector' => ContactSelector::sexualPreference($r[0]['sexual']), 'value' => $r[0]['sexual']],
'$about' => ['about', L10n::t('Tell us about yourself...'), $r[0]['about']], '$about' => ['about', L10n::t('Tell us about yourself...'), $r[0]['about']],
'$xmpp' => ['xmpp', L10n::t("XMPP \x28Jabber\x29 address:"), $r[0]['xmpp'], L10n::t("The XMPP address will be propagated to your contacts so that they can follow you.")], '$xmpp' => ['xmpp', L10n::t("XMPP \x28Jabber\x29 address:"), $r[0]['xmpp'], L10n::t("The XMPP address will be propagated to your contacts so that they can follow you.")],
'$homepage' => ['homepage', L10n::t('Homepage URL:'), $r[0]['homepage']], '$homepage' => ['homepage', L10n::t('Homepage URL:'), $r[0]['homepage']],
@ -669,7 +667,7 @@ function profiles_content(App $a) {
$profiles = ''; $profiles = '';
foreach ($r as $rr) { foreach ($r as $rr) {
$profiles .= replace_macros($tpl, [ $profiles .= replace_macros($tpl, [
'$photo' => $a->remove_baseurl($rr['thumb']), '$photo' => $a->removeBaseURL($rr['thumb']),
'$id' => $rr['id'], '$id' => $rr['id'],
'$alt' => L10n::t('Profile Image'), '$alt' => L10n::t('Profile Image'),
'$profile_name' => $rr['profile-name'], '$profile_name' => $rr['profile-name'],

View file

@ -104,8 +104,9 @@ function pubsubhubbub_init(App $a) {
// we don't actually enforce the lease time because GNU // we don't actually enforce the lease time because GNU
// Social/StatusNet doesn't honour it (yet) // Social/StatusNet doesn't honour it (yet)
$body = Network::fetchUrl($hub_callback . "?" . $params); $fetchResult = Network::fetchUrlFull($hub_callback . "?" . $params);
$ret = $a->get_curl_code(); $body = $fetchResult->getBody();
$ret = $fetchResult->getReturnCode();
// give up if the HTTP return code wasn't a success (2xx) // give up if the HTTP return code wasn't a success (2xx)
if ($ret < 200 || $ret > 299) { if ($ret < 200 || $ret > 299) {

View file

@ -57,7 +57,7 @@ function redir_init(App $a) {
} }
if (remote_user()) { if (remote_user()) {
$host = substr(System::baseUrl() . ($a->urlpath ? '/' . $a->urlpath : ''), strpos(System::baseUrl(), '://') + 3); $host = substr(System::baseUrl() . ($a->getURLPath() ? '/' . $a->getURLPath() : ''), strpos(System::baseUrl(), '://') + 3);
$remotehost = substr($contact['addr'], strpos($contact['addr'], '@') + 1); $remotehost = substr($contact['addr'], strpos($contact['addr'], '@') + 1);
// On a local instance we have to check if the local user has already authenticated // On a local instance we have to check if the local user has already authenticated

View file

@ -274,7 +274,7 @@ function register_content(App $a)
'$passwords' => $passwords, '$passwords' => $passwords,
'$password1' => ['password1', L10n::t('New Password:'), '', L10n::t('Leave empty for an auto generated password.')], '$password1' => ['password1', L10n::t('New Password:'), '', L10n::t('Leave empty for an auto generated password.')],
'$password2' => ['confirm', L10n::t('Confirm:'), '', ''], '$password2' => ['confirm', L10n::t('Confirm:'), '', ''],
'$nickdesc' => L10n::t('Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \'<strong>nickname@%s</strong>\'.', $a->get_hostname()), '$nickdesc' => L10n::t('Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be \'<strong>nickname@%s</strong>\'.', $a->getHostName()),
'$nicklabel' => L10n::t('Choose a nickname: '), '$nicklabel' => L10n::t('Choose a nickname: '),
'$photo' => $photo, '$photo' => $photo,
'$publish' => $profile_publish, '$publish' => $profile_publish,
@ -283,7 +283,7 @@ function register_content(App $a)
'$email' => $email, '$email' => $email,
'$nickname' => $nickname, '$nickname' => $nickname,
'$license' => $license, '$license' => $license,
'$sitename' => $a->get_hostname(), '$sitename' => $a->getHostName(),
'$importh' => L10n::t('Import'), '$importh' => L10n::t('Import'),
'$importt' => L10n::t('Import your profile to this friendica instance'), '$importt' => L10n::t('Import your profile to this friendica instance'),
'$showtoslink' => Config::get('system', 'tosdisplay'), '$showtoslink' => Config::get('system', 'tosdisplay'),

View file

@ -14,7 +14,7 @@ function repair_ostatus_content(App $a) {
if (! local_user()) { if (! local_user()) {
notice(L10n::t('Permission denied.') . EOL); notice(L10n::t('Permission denied.') . EOL);
goaway($_SESSION['return_url']); goaway('/ostatus_repair');
// NOTREACHED // NOTREACHED
} }

View file

@ -22,6 +22,7 @@ use Friendica\Model\User;
use Friendica\Protocol\Email; use Friendica\Protocol\Email;
use Friendica\Util\Network; use Friendica\Util\Network;
use Friendica\Util\Temporal; use Friendica\Util\Temporal;
use Friendica\Module\Login;
function get_theme_config_file($theme) function get_theme_config_file($theme)
{ {
@ -546,7 +547,7 @@ function settings_post(App $a)
if ($openid != $a->user['openid'] || (strlen($openid) && (!strlen($openidserver)))) { if ($openid != $a->user['openid'] || (strlen($openid) && (!strlen($openidserver)))) {
if (Network::isUrlValid($openid)) { if (Network::isUrlValid($openid)) {
logger('updating openidserver'); logger('updating openidserver');
$open_id_obj = new LightOpenID($a->get_hostname()); $open_id_obj = new LightOpenID($a->getHostName());
$open_id_obj->identity = $openid; $open_id_obj->identity = $openid;
$openidserver = $open_id_obj->discover($open_id_obj->identity); $openidserver = $open_id_obj->discover($open_id_obj->identity);
} else { } else {
@ -658,7 +659,7 @@ function settings_content(App $a)
if (!local_user()) { if (!local_user()) {
//notice(L10n::t('Permission denied.') . EOL); //notice(L10n::t('Permission denied.') . EOL);
return; return Login::form();
} }
if (x($_SESSION, 'submanage') && intval($_SESSION['submanage'])) { if (x($_SESSION, 'submanage') && intval($_SESSION['submanage'])) {
@ -982,11 +983,6 @@ function settings_content(App $a)
'$theme_config' => $theme_config, '$theme_config' => $theme_config,
]); ]);
$tpl = get_markup_template('settings/display_end.tpl');
$a->page['end'] .= replace_macros($tpl, [
'$theme' => ['theme', L10n::t('Display Theme:'), $theme_selected, '', $themes]
]);
return $o; return $o;
} }
@ -1140,8 +1136,8 @@ function settings_content(App $a)
$tpl_addr = get_markup_template('settings/nick_set.tpl'); $tpl_addr = get_markup_template('settings/nick_set.tpl');
$prof_addr = replace_macros($tpl_addr,[ $prof_addr = replace_macros($tpl_addr,[
'$desc' => L10n::t("Your Identity Address is <strong>'%s'</strong> or '%s'.", $nickname . '@' . $a->get_hostname() . $a->get_path(), System::baseUrl() . '/profile/' . $nickname), '$desc' => L10n::t("Your Identity Address is <strong>'%s'</strong> or '%s'.", $nickname . '@' . $a->getHostName() . $a->getURLPath(), System::baseUrl() . '/profile/' . $nickname),
'$basepath' => $a->get_hostname() '$basepath' => $a->getHostName()
]); ]);
$stpl = get_markup_template('settings/settings.tpl'); $stpl = get_markup_template('settings/settings.tpl');

View file

@ -108,7 +108,7 @@ EOT;
$arr = []; $arr = [];
$arr['guid'] = System::createGUID(32); $arr['guid'] = System::createUUID();
$arr['uri'] = $uri; $arr['uri'] = $uri;
$arr['uid'] = $owner_uid; $arr['uid'] = $owner_uid;
$arr['contact-id'] = $contact['id']; $arr['contact-id'] = $contact['id'];

View file

@ -115,7 +115,7 @@ EOT;
$arr = []; $arr = [];
$arr['guid'] = System::createGUID(32); $arr['guid'] = System::createUUID();
$arr['uri'] = $uri; $arr['uri'] = $uri;
$arr['uid'] = $owner_uid; $arr['uid'] = $owner_uid;
$arr['contact-id'] = $contact['id']; $arr['contact-id'] = $contact['id'];

View file

@ -14,18 +14,14 @@ use Friendica\Model\User;
function unfollow_post() function unfollow_post()
{ {
$return_url = $_SESSION['return_url']; $return_url = 'contacts';
if (!local_user()) { if (!local_user()) {
notice(L10n::t('Permission denied.')); notice(L10n::t('Permission denied.'));
goaway($return_url); goaway('/login');
// NOTREACHED // NOTREACHED
} }
if (!empty($_REQUEST['cancel'])) {
goaway($return_url);
}
$uid = local_user(); $uid = local_user();
$url = notags(trim(defaults($_REQUEST, 'url', ''))); $url = notags(trim(defaults($_REQUEST, 'url', '')));
@ -40,9 +36,13 @@ function unfollow_post()
// NOTREACHED // NOTREACHED
} }
if (!empty($_REQUEST['cancel'])) {
goaway($return_url . '/' . $contact['id']);
}
if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
notice(L10n::t('Unfollowing is currently not supported by your network.')); notice(L10n::t('Unfollowing is currently not supported by your network.'));
goaway($return_url); goaway($return_url . '/' . $contact['id']);
// NOTREACHED // NOTREACHED
} }
@ -69,9 +69,11 @@ function unfollow_post()
function unfollow_content(App $a) function unfollow_content(App $a)
{ {
$return_url = 'contacts';
if (!local_user()) { if (!local_user()) {
notice(L10n::t('Permission denied.')); notice(L10n::t('Permission denied.'));
goaway($_SESSION['return_url']); goaway('/login');
// NOTREACHED // NOTREACHED
} }
@ -86,7 +88,7 @@ function unfollow_content(App $a)
if (!DBA::isResult($contact)) { if (!DBA::isResult($contact)) {
notice(L10n::t("You aren't following this contact.")); notice(L10n::t("You aren't following this contact."));
goaway('contacts'); goaway($return_url);
// NOTREACHED // NOTREACHED
} }
@ -103,7 +105,7 @@ function unfollow_content(App $a)
if (!DBA::isResult($self)) { if (!DBA::isResult($self)) {
notice(L10n::t('Permission denied.')); notice(L10n::t('Permission denied.'));
goaway($_SESSION['return_url']); goaway($return_url);
// NOTREACHED // NOTREACHED
} }

View file

@ -105,12 +105,6 @@ function videos_init(App $a)
$a->page['htmlhead'] .= replace_macros($tpl,[ $a->page['htmlhead'] .= replace_macros($tpl,[
'$baseurl' => System::baseUrl(), '$baseurl' => System::baseUrl(),
]); ]);
$tpl = get_markup_template("videos_end.tpl");
$a->page['end'] .= replace_macros($tpl,[
'$baseurl' => System::baseUrl(),
]);
} }
return; return;
@ -347,8 +341,8 @@ function videos_content(App $a)
); );
if (DBA::isResult($r)) { if (DBA::isResult($r)) {
$a->set_pager_total(count($r)); $a->setPagerTotal(count($r));
$a->set_pager_itemspage(20); $a->setPagerItemsPage(20);
} }
$r = q("SELECT hash, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`created`) AS `created`, $r = q("SELECT hash, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`created`) AS `created`,

View file

@ -71,7 +71,7 @@ function viewcontacts_content(App $a)
DBA::escape(Protocol::OSTATUS) DBA::escape(Protocol::OSTATUS)
); );
if (DBA::isResult($r)) { if (DBA::isResult($r)) {
$a->set_pager_total($r[0]['total']); $a->setPagerTotal($r[0]['total']);
} }
$r = q("SELECT * FROM `contact` $r = q("SELECT * FROM `contact`

View file

@ -26,7 +26,7 @@ function viewsrc_content(App $a)
$item = Item::selectFirst(['body'], ['uid' => local_user(), 'id' => $item_id]); $item = Item::selectFirst(['body'], ['uid' => local_user(), 'id' => $item_id]);
if (DBA::isResult($item)) { if (DBA::isResult($item)) {
if (is_ajax()) { if ($a->isAjax()) {
echo str_replace("\n", '<br />', $item['body']); echo str_replace("\n", '<br />', $item['body']);
killme(); killme();
} else { } else {

View file

@ -120,13 +120,6 @@ function wallmessage_content(App $a) {
'$linkurl' => L10n::t('Please enter a link URL:') '$linkurl' => L10n::t('Please enter a link URL:')
]); ]);
$tpl = get_markup_template('wallmsg-end.tpl');
$a->page['end'] .= replace_macros($tpl, [
'$baseurl' => System::baseUrl(true),
'$nickname' => $user['nickname'],
'$linkurl' => L10n::t('Please enter a link URL:')
]);
$tpl = get_markup_template('wallmessage.tpl'); $tpl = get_markup_template('wallmessage.tpl');
$o = replace_macros($tpl, [ $o = replace_macros($tpl, [
'$header' => L10n::t('Send Private Message'), '$header' => L10n::t('Send Private Message'),

View file

@ -13,7 +13,7 @@ function xrd_init(App $a)
{ {
if ($a->argv[0] == 'xrd') { if ($a->argv[0] == 'xrd') {
if (empty($_GET['uri'])) { if (empty($_GET['uri'])) {
killme(); System::httpExit(404);
} }
$uri = urldecode(notags(trim($_GET['uri']))); $uri = urldecode(notags(trim($_GET['uri'])));
@ -24,7 +24,7 @@ function xrd_init(App $a)
} }
} else { } else {
if (empty($_GET['resource'])) { if (empty($_GET['resource'])) {
killme(); System::httpExit(404);
} }
$uri = urldecode(notags(trim($_GET['resource']))); $uri = urldecode(notags(trim($_GET['resource'])));
@ -48,16 +48,16 @@ function xrd_init(App $a)
$user = DBA::selectFirst('user', [], ['nickname' => $name]); $user = DBA::selectFirst('user', [], ['nickname' => $name]);
if (!DBA::isResult($user)) { if (!DBA::isResult($user)) {
killme(); System::httpExit(404);
} }
$profile_url = System::baseUrl().'/profile/'.$user['nickname']; $profile_url = System::baseUrl().'/profile/'.$user['nickname'];
$alias = str_replace('/profile/', '/~', $profile_url); $alias = str_replace('/profile/', '/~', $profile_url);
$addr = 'acct:'.$user['nickname'].'@'.$a->get_hostname(); $addr = 'acct:'.$user['nickname'].'@'.$a->getHostName();
if ($a->get_path()) { if ($a->getURLPath()) {
$addr .= '/'.$a->get_path(); $addr .= '/'.$a->getURLPath();
} }
if ($mode == 'xml') { if ($mode == 'xml') {
@ -80,6 +80,7 @@ function xrd_json($a, $uri, $alias, $profile_url, $r)
['rel' => NAMESPACE_DFRN, 'href' => $profile_url], ['rel' => NAMESPACE_DFRN, 'href' => $profile_url],
['rel' => NAMESPACE_FEED, 'type' => 'application/atom+xml', 'href' => System::baseUrl().'/dfrn_poll/'.$r['nickname']], ['rel' => NAMESPACE_FEED, 'type' => 'application/atom+xml', 'href' => System::baseUrl().'/dfrn_poll/'.$r['nickname']],
['rel' => 'http://webfinger.net/rel/profile-page', 'type' => 'text/html', 'href' => $profile_url], ['rel' => 'http://webfinger.net/rel/profile-page', 'type' => 'text/html', 'href' => $profile_url],
['rel' => 'self', 'type' => 'application/activity+json', 'href' => $profile_url],
['rel' => 'http://microformats.org/profile/hcard', 'type' => 'text/html', 'href' => System::baseUrl().'/hcard/'.$r['nickname']], ['rel' => 'http://microformats.org/profile/hcard', 'type' => 'text/html', 'href' => System::baseUrl().'/hcard/'.$r['nickname']],
['rel' => NAMESPACE_POCO, 'href' => System::baseUrl().'/poco/'.$r['nickname']], ['rel' => NAMESPACE_POCO, 'href' => System::baseUrl().'/poco/'.$r['nickname']],
['rel' => 'http://webfinger.net/rel/avatar', 'type' => 'image/jpeg', 'href' => System::baseUrl().'/photo/profile/'.$r['uid'].'.jpg'], ['rel' => 'http://webfinger.net/rel/avatar', 'type' => 'image/jpeg', 'href' => System::baseUrl().'/photo/profile/'.$r['uid'].'.jpg'],
@ -92,6 +93,7 @@ function xrd_json($a, $uri, $alias, $profile_url, $r)
['rel' => 'http://purl.org/openwebauth/v1', 'type' => 'application/x-dfrn+json', 'href' => System::baseUrl().'/owa'] ['rel' => 'http://purl.org/openwebauth/v1', 'type' => 'application/x-dfrn+json', 'href' => System::baseUrl().'/owa']
] ]
]; ];
echo json_encode($json); echo json_encode($json);
killme(); killme();
} }

File diff suppressed because it is too large Load diff

117
src/App/Mode.php Normal file
View file

@ -0,0 +1,117 @@
<?php
namespace Friendica\App;
use Friendica\Core\Config;
use Friendica\Database\DBA;
/**
* Mode of the current Friendica Node
*
* @package Friendica\App
*/
class Mode
{
const LOCALCONFIGPRESENT = 1;
const DBAVAILABLE = 2;
const DBCONFIGAVAILABLE = 4;
const MAINTENANCEDISABLED = 8;
/***
* @var int the mode of this Application
*
*/
private $mode;
/**
* @var string the basepath of the application
*/
private $basepath;
public function __construct($basepath = '')
{
$this->basepath = $basepath;
$this->mode = 0;
}
/**
* Sets the App mode
*
* - App::MODE_INSTALL : Either the database connection can't be established or the config table doesn't exist
* - App::MODE_MAINTENANCE: The maintenance mode has been set
* - App::MODE_NORMAL : Normal run with all features enabled
*
* @param string $basepath the Basepath of the Application
*
*/
public function determine($basepath = null)
{
if (!empty($basepath)) {
$this->basepath = $basepath;
}
$this->mode = 0;
if (!file_exists($this->basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php')
&& !file_exists($this->basepath . DIRECTORY_SEPARATOR . '.htconfig.php')) {
return;
}
$this->mode |= Mode::LOCALCONFIGPRESENT;
if (!DBA::connected()) {
return;
}
$this->mode |= Mode::DBAVAILABLE;
if (DBA::fetchFirst("SHOW TABLES LIKE 'config'") === false) {
return;
}
$this->mode |= Mode::DBCONFIGAVAILABLE;
if (Config::get('system', 'maintenance')) {
return;
}
$this->mode |= Mode::MAINTENANCEDISABLED;
}
/**
* Checks, if the Friendica Node has the given mode
*
* @param int $mode A mode to test
*
* @return bool returns true, if the mode is set
*/
public function has($mode)
{
return ($this->mode & $mode) > 0;
}
/**
* Install mode is when the local config file is missing or the DB schema hasn't been installed yet.
*
* @return bool
*/
public function isInstall()
{
return !$this->has(Mode::LOCALCONFIGPRESENT) ||
!$this->has(MODE::DBCONFIGAVAILABLE);
}
/**
* Normal mode is when the local config file is set, the DB schema is installed and the maintenance mode is off.
*
* @return bool
*/
public function isNormal()
{
return $this->has(Mode::LOCALCONFIGPRESENT) &&
$this->has(Mode::DBAVAILABLE) &&
$this->has(Mode::DBCONFIGAVAILABLE) &&
$this->has(Mode::MAINTENANCEDISABLED);
}
}

View file

@ -21,7 +21,16 @@ abstract class BaseModule extends BaseObject
*/ */
public static function init() public static function init()
{ {
}
/**
* @brief Module GET method to display raw content from technical endpoints
*
* Extend this method if the module is supposed to return communication data,
* e.g. from protocol implementations.
*/
public static function rawContent()
{
} }
/** /**

View file

@ -7,7 +7,9 @@ namespace Friendica\Content;
use Friendica\Core\Addon; use Friendica\Core\Addon;
use Friendica\Core\L10n; use Friendica\Core\L10n;
use Friendica\Core\Protocol; use Friendica\Core\Protocol;
use Friendica\Core\System;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Util\Network;
/** /**
* @brief ContactSelector class * @brief ContactSelector class
@ -68,28 +70,29 @@ class ContactSelector
} }
/** /**
* @param string $s network * @param string $network network
* @param string $profile optional, default empty * @param string $profile optional, default empty
* @return string * @return string
*/ */
public static function networkToName($s, $profile = "") public static function networkToName($network, $profile = "")
{ {
$nets = [ $nets = [
Protocol::DFRN => L10n::t('Friendica'), Protocol::DFRN => L10n::t('Friendica'),
Protocol::OSTATUS => L10n::t('OStatus'), Protocol::OSTATUS => L10n::t('OStatus'),
Protocol::FEED => L10n::t('RSS/Atom'), Protocol::FEED => L10n::t('RSS/Atom'),
Protocol::MAIL => L10n::t('Email'), Protocol::MAIL => L10n::t('Email'),
Protocol::DIASPORA => L10n::t('Diaspora'), Protocol::DIASPORA => L10n::t('Diaspora'),
Protocol::ZOT => L10n::t('Zot!'), Protocol::ZOT => L10n::t('Zot!'),
Protocol::LINKEDIN => L10n::t('LinkedIn'), Protocol::LINKEDIN => L10n::t('LinkedIn'),
Protocol::XMPP => L10n::t('XMPP/IM'), Protocol::XMPP => L10n::t('XMPP/IM'),
Protocol::MYSPACE => L10n::t('MySpace'), Protocol::MYSPACE => L10n::t('MySpace'),
Protocol::GPLUS => L10n::t('Google+'), Protocol::GPLUS => L10n::t('Google+'),
Protocol::PUMPIO => L10n::t('pump.io'), Protocol::PUMPIO => L10n::t('pump.io'),
Protocol::TWITTER => L10n::t('Twitter'), Protocol::TWITTER => L10n::t('Twitter'),
Protocol::DIASPORA2 => L10n::t('Diaspora Connector'), Protocol::DIASPORA2 => L10n::t('Diaspora Connector'),
Protocol::STATUSNET => L10n::t('GNU Social Connector'), Protocol::STATUSNET => L10n::t('GNU Social Connector'),
Protocol::PNUT => L10n::t('pnut'), Protocol::ACTIVITYPUB => L10n::t('ActivityPub'),
Protocol::PNUT => L10n::t('pnut'),
]; ];
Addon::callHooks('network_to_name', $nets); Addon::callHooks('network_to_name', $nets);
@ -97,15 +100,37 @@ class ContactSelector
$search = array_keys($nets); $search = array_keys($nets);
$replace = array_values($nets); $replace = array_values($nets);
$networkname = str_replace($search, $replace, $s); $networkname = str_replace($search, $replace, $network);
if ((in_array($s, [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) && ($profile != "")) { if ((in_array($network, [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS])) && ($profile != "")) {
$r = DBA::fetchFirst("SELECT `gserver`.`platform` FROM `gcontact` // Create the server url out of the profile url
INNER JOIN `gserver` ON `gserver`.`nurl` = `gcontact`.`server_url` $parts = parse_url($profile);
WHERE `gcontact`.`nurl` = ? AND `platform` != ''", normalise_link($profile)); unset($parts['path']);
$server_url = [normalise_link(Network::unparseURL($parts))];
if (DBA::isResult($r)) { // Fetch the server url
$networkname = $r['platform']; $gcontact = DBA::selectFirst('gcontact', ['server_url'], ['nurl' => normalise_link($profile)]);
if (!empty($gcontact) && !empty($gcontact['server_url'])) {
$server_url[] = normalise_link($gcontact['server_url']);
}
// Now query the GServer for the platform name
$gserver = DBA::selectFirst('gserver', ['platform', 'network'], ['nurl' => $server_url]);
if (DBA::isResult($gserver)) {
if (!empty($gserver['platform'])) {
$platform = $gserver['platform'];
} elseif (!empty($gserver['network']) && ($gserver['network'] != Protocol::ACTIVITYPUB)) {
$platform = self::networkToName($gserver['network']);
}
if (!empty($platform)) {
$networkname = $platform;
if ($network == Protocol::ACTIVITYPUB) {
$networkname .= ' (AP)';
}
}
} }
} }

View file

@ -107,7 +107,7 @@ class Nav
// user info // user info
$contact = DBA::selectFirst('contact', ['micro'], ['uid' => $a->user['uid'], 'self' => true]); $contact = DBA::selectFirst('contact', ['micro'], ['uid' => $a->user['uid'], 'self' => true]);
$userinfo = [ $userinfo = [
'icon' => (DBA::isResult($contact) ? $a->remove_baseurl($contact['micro']) : 'images/person-48.jpg'), 'icon' => (DBA::isResult($contact) ? $a->removeBaseURL($contact['micro']) : 'images/person-48.jpg'),
'name' => $a->user['username'], 'name' => $a->user['username'],
]; ];
} else { } else {

View file

@ -1060,11 +1060,11 @@ class BBCode extends BaseObject
$ch = @curl_init($match[1]); $ch = @curl_init($match[1]);
@curl_setopt($ch, CURLOPT_NOBODY, true); @curl_setopt($ch, CURLOPT_NOBODY, true);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@curl_setopt($ch, CURLOPT_USERAGENT, $a->get_useragent()); @curl_setopt($ch, CURLOPT_USERAGENT, $a->getUserAgent());
@curl_exec($ch); @curl_exec($ch);
$curl_info = @curl_getinfo($ch); $curl_info = @curl_getinfo($ch);
$a->save_timestamp($stamp1, "network"); $a->saveTimestamp($stamp1, "network");
if (substr($curl_info["content_type"], 0, 6) == "image/") { if (substr($curl_info["content_type"], 0, 6) == "image/") {
$text = "[url=" . $match[1] . "]" . $match[1] . "[/url]"; $text = "[url=" . $match[1] . "]" . $match[1] . "[/url]";
@ -1119,11 +1119,11 @@ class BBCode extends BaseObject
$ch = @curl_init($match[1]); $ch = @curl_init($match[1]);
@curl_setopt($ch, CURLOPT_NOBODY, true); @curl_setopt($ch, CURLOPT_NOBODY, true);
@curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
@curl_setopt($ch, CURLOPT_USERAGENT, $a->get_useragent()); @curl_setopt($ch, CURLOPT_USERAGENT, $a->getUserAgent());
@curl_exec($ch); @curl_exec($ch);
$curl_info = @curl_getinfo($ch); $curl_info = @curl_getinfo($ch);
$a->save_timestamp($stamp1, "network"); $a->saveTimestamp($stamp1, "network");
// if its a link to a picture then embed this picture // if its a link to a picture then embed this picture
if (substr($curl_info["content_type"], 0, 6) == "image/") { if (substr($curl_info["content_type"], 0, 6) == "image/") {
@ -1265,9 +1265,6 @@ class BBCode extends BaseObject
$text = preg_replace("/\s?\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "[share$1]$2[/share]", $text); $text = preg_replace("/\s?\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "[share$1]$2[/share]", $text);
$text = preg_replace("/\s?\[quote(.*?)\]\s?(.*?)\s?\[\/quote\]\s?/ism", "[quote$1]$2[/quote]", $text); $text = preg_replace("/\s?\[quote(.*?)\]\s?(.*?)\s?\[\/quote\]\s?/ism", "[quote$1]$2[/quote]", $text);
$text = preg_replace("/\n\[code\]/ism", "[code]", $text);
$text = preg_replace("/\[\/code\]\n/ism", "[/code]", $text);
// when the content is meant exporting to other systems then remove the avatar picture since this doesn't really look good on these systems // when the content is meant exporting to other systems then remove the avatar picture since this doesn't really look good on these systems
if (!$try_oembed) { if (!$try_oembed) {
$text = preg_replace("/\[share(.*?)avatar\s?=\s?'.*?'\s?(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "\n[share$1$2]$3[/share]", $text); $text = preg_replace("/\[share(.*?)avatar\s?=\s?'.*?'\s?(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "\n[share$1$2]$3[/share]", $text);
@ -1717,18 +1714,6 @@ class BBCode extends BaseObject
$text = Smilies::replace($text, false, true); $text = Smilies::replace($text, false, true);
} }
// Replace inline code blocks
$text = preg_replace_callback("|(?!<br[^>]*>)<code>([^<]*)</code>(?!<br[^>]*>)|ism",
function ($match) use ($simple_html) {
$return = '<key>' . $match[1] . '</key>';
// Use <code> for Diaspora inline code blocks
if ($simple_html === 3) {
$return = '<code>' . $match[1] . '</code>';
}
return $return;
}
, $text);
// Unhide all [noparse] contained bbtags unspacefying them // Unhide all [noparse] contained bbtags unspacefying them
// and triming the [noparse] tag. // and triming the [noparse] tag.
@ -1946,7 +1931,7 @@ class BBCode extends BaseObject
// unmask the special chars back to HTML // unmask the special chars back to HTML
$text = str_replace(['&\_lt\_;', '&\_gt\_;', '&\_amp\_;'], ['&lt;', '&gt;', '&amp;'], $text); $text = str_replace(['&\_lt\_;', '&\_gt\_;', '&\_amp\_;'], ['&lt;', '&gt;', '&amp;'], $text);
$a->save_timestamp($stamp1, "parser"); $a->saveTimestamp($stamp1, "parser");
// Libertree has a problem with escaped hashtags. // Libertree has a problem with escaped hashtags.
$text = str_replace(['\#'], ['#'], $text); $text = str_replace(['\#'], ['#'], $text);

View file

@ -35,7 +35,7 @@ class Markdown extends BaseObject
$MarkdownParser->code_class_prefix = 'language-'; $MarkdownParser->code_class_prefix = 'language-';
$html = $MarkdownParser->transform($text); $html = $MarkdownParser->transform($text);
self::getApp()->save_timestamp($stamp1, "parser"); self::getApp()->saveTimestamp($stamp1, "parser");
return $html; return $html;
} }

View file

@ -142,10 +142,7 @@ class Widget
$nets = array(); $nets = array();
while ($rr = DBA::fetch($r)) { while ($rr = DBA::fetch($r)) {
/// @TODO If 'network' is not there, this triggers an E_NOTICE $nets[] = array('ref' => $rr['network'], 'name' => ContactSelector::networkToName($rr['network']), 'selected' => (($selected == $rr['network']) ? 'selected' : '' ));
if ($rr['network']) {
$nets[] = array('ref' => $rr['network'], 'name' => ContactSelector::networkToName($rr['network']), 'selected' => (($selected == $rr['network']) ? 'selected' : '' ));
}
} }
DBA::close($r); DBA::close($r);

View file

@ -51,14 +51,14 @@ class ACL extends BaseObject
break; break;
case 'PRIVATE': case 'PRIVATE':
$networks = [Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA]; $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA];
break; break;
case 'TWO_WAY': case 'TWO_WAY':
if (!empty($a->user['prvnets'])) { if (!empty($a->user['prvnets'])) {
$networks = [Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA]; $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA];
} else { } else {
$networks = [Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA, Protocol::OSTATUS]; $networks = [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA, Protocol::OSTATUS];
} }
break; break;
@ -344,9 +344,9 @@ class ACL extends BaseObject
$a = self::getApp(); $a = self::getApp();
$p = $a->pager['page'] != 1 ? '&p=' . $a->pager['page'] : ''; $p = $a->pager['page'] != 1 ? '&p=' . $a->pager['page'] : '';
$response = Network::curl(get_server() . '/lsearch?f=' . $p . '&search=' . urlencode($search)); $curlResult = Network::curl(get_server() . '/lsearch?f=' . $p . '&search=' . urlencode($search));
if ($response['success']) { if ($curlResult->isSuccess()) {
$lsearch = json_decode($response['body'], true); $lsearch = json_decode($curlResult->getBody(), true);
if (!empty($lsearch['results'])) { if (!empty($lsearch['results'])) {
$return = $lsearch['results']; $return = $lsearch['results'];
} }

View file

@ -5,6 +5,7 @@
namespace Friendica\Core; namespace Friendica\Core;
use Friendica\App; use Friendica\App;
use Friendica\BaseObject;
use Friendica\Database\DBA; use Friendica\Database\DBA;
require_once 'include/dba.php'; require_once 'include/dba.php';
@ -12,8 +13,65 @@ require_once 'include/dba.php';
/** /**
* Some functions to handle addons * Some functions to handle addons
*/ */
class Addon class Addon extends BaseObject
{ {
/**
* @brief Synchronise addons:
*
* system.addon contains a comma-separated list of names
* of addons which are used on this system.
* Go through the database list of already installed addons, and if we have
* an entry, but it isn't in the config list, call the uninstall procedure
* and mark it uninstalled in the database (for now we'll remove it).
* Then go through the config list and if we have a addon that isn't installed,
* call the install procedure and add it to the database.
*
*/
public static function check()
{
$a = self::getApp();
$r = DBA::select('addon', [], ['installed' => 1]);
if (DBA::isResult($r)) {
$installed = DBA::toArray($r);
} else {
$installed = [];
}
$addons = Config::get('system', 'addon');
$addons_arr = [];
if ($addons) {
$addons_arr = explode(',', str_replace(' ', '', $addons));
}
$a->addons = $addons_arr;
$installed_arr = [];
if (count($installed)) {
foreach ($installed as $i) {
if (!in_array($i['name'], $addons_arr)) {
self::uninstall($i['name']);
} else {
$installed_arr[] = $i['name'];
}
}
}
if (count($addons_arr)) {
foreach ($addons_arr as $p) {
if (!in_array($p, $installed_arr)) {
self::install($p);
}
}
}
self::loadHooks();
return;
}
/** /**
* @brief uninstalls an addon. * @brief uninstalls an addon.
* *
@ -139,7 +197,7 @@ class Addon
*/ */
public static function registerHook($hook, $file, $function, $priority = 0) public static function registerHook($hook, $file, $function, $priority = 0)
{ {
$file = str_replace(get_app()->get_basepath() . DIRECTORY_SEPARATOR, '', $file); $file = str_replace(self::getApp()->getBasePath() . DIRECTORY_SEPARATOR, '', $file);
$condition = ['hook' => $hook, 'file' => $file, 'function' => $function]; $condition = ['hook' => $hook, 'file' => $file, 'function' => $function];
$exists = DBA::exists('hook', $condition); $exists = DBA::exists('hook', $condition);
@ -162,7 +220,7 @@ class Addon
*/ */
public static function unregisterHook($hook, $file, $function) public static function unregisterHook($hook, $file, $function)
{ {
$relative_file = str_replace(get_app()->get_basepath() . DIRECTORY_SEPARATOR, '', $file); $relative_file = str_replace(self::getApp()->getBasePath() . DIRECTORY_SEPARATOR, '', $file);
// This here is only needed for fixing a problem that existed on the develop branch // This here is only needed for fixing a problem that existed on the develop branch
$condition = ['hook' => $hook, 'file' => $file, 'function' => $function]; $condition = ['hook' => $hook, 'file' => $file, 'function' => $function];
@ -178,7 +236,7 @@ class Addon
*/ */
public static function loadHooks() public static function loadHooks()
{ {
$a = get_app(); $a = self::getApp();
$a->hooks = []; $a->hooks = [];
$r = DBA::select('hook', ['hook', 'file', 'function'], [], ['order' => ['priority' => 'desc', 'file']]); $r = DBA::select('hook', ['hook', 'file', 'function'], [], ['order' => ['priority' => 'desc', 'file']]);
@ -201,7 +259,7 @@ class Addon
*/ */
public static function forkHooks($priority, $name, $data = null) public static function forkHooks($priority, $name, $data = null)
{ {
$a = get_app(); $a = self::getApp();
if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) { if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) {
foreach ($a->hooks[$name] as $hook) { foreach ($a->hooks[$name] as $hook) {
@ -221,7 +279,7 @@ class Addon
*/ */
public static function callHooks($name, &$data = null) public static function callHooks($name, &$data = null)
{ {
$a = get_app(); $a = self::getApp();
if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) { if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) {
foreach ($a->hooks[$name] as $hook) { foreach ($a->hooks[$name] as $hook) {
@ -262,7 +320,7 @@ class Addon
*/ */
public static function isApp($name) public static function isApp($name)
{ {
$a = get_app(); $a = self::getApp();
if (is_array($a->hooks) && (array_key_exists('app_menu', $a->hooks))) { if (is_array($a->hooks) && (array_key_exists('app_menu', $a->hooks))) {
foreach ($a->hooks['app_menu'] as $hook) { foreach ($a->hooks['app_menu'] as $hook) {
@ -293,7 +351,7 @@ class Addon
*/ */
public static function getInfo($addon) public static function getInfo($addon)
{ {
$a = get_app(); $a = self::getApp();
$info = [ $info = [
'name' => $addon, 'name' => $addon,
@ -310,7 +368,7 @@ class Addon
$stamp1 = microtime(true); $stamp1 = microtime(true);
$f = file_get_contents("addon/$addon/$addon.php"); $f = file_get_contents("addon/$addon/$addon.php");
$a->save_timestamp($stamp1, "file"); $a->saveTimestamp($stamp1, "file");
$r = preg_match("|/\*.*\*/|msU", $f, $m); $r = preg_match("|/\*.*\*/|msU", $f, $m);

View file

@ -23,13 +23,15 @@ class Cache extends \Friendica\BaseObject
/** /**
* @var Cache\ICacheDriver * @var Cache\ICacheDriver
*/ */
private static $driver = null; private static $driver = null;
public static $driver_class = null;
public static $driver_name = null;
public static function init() public static function init()
{ {
$driver_name = Config::get('system', 'cache_driver', 'database'); self::$driver_name = Config::get('system', 'cache_driver', 'database');
self::$driver = CacheDriverFactory::create(self::$driver_name);
self::$driver = CacheDriverFactory::create($driver_name); self::$driver_class = get_class(self::$driver);
} }
/** /**
@ -46,6 +48,24 @@ class Cache extends \Friendica\BaseObject
return self::$driver; return self::$driver;
} }
/**
* @brief Returns all the cache keys sorted alphabetically
*
* @param string $prefix Prefix of the keys (optional)
*
* @return array Empty if the driver doesn't support this feature
*/
public static function getAllKeys($prefix = null)
{
$time = microtime(true);
$return = self::getDriver()->getAllKeys($prefix);
self::getApp()->saveTimestamp($time, 'cache');
return $return;
}
/** /**
* @brief Fetch cached data according to the key * @brief Fetch cached data according to the key
* *
@ -59,7 +79,7 @@ class Cache extends \Friendica\BaseObject
$return = self::getDriver()->get($key); $return = self::getDriver()->get($key);
self::getApp()->save_timestamp($time, 'cache'); self::getApp()->saveTimestamp($time, 'cache');
return $return; return $return;
} }
@ -81,7 +101,7 @@ class Cache extends \Friendica\BaseObject
$return = self::getDriver()->set($key, $value, $duration); $return = self::getDriver()->set($key, $value, $duration);
self::getApp()->save_timestamp($time, 'cache_write'); self::getApp()->saveTimestamp($time, 'cache_write');
return $return; return $return;
} }
@ -99,7 +119,7 @@ class Cache extends \Friendica\BaseObject
$return = self::getDriver()->delete($key); $return = self::getDriver()->delete($key);
self::getApp()->save_timestamp($time, 'cache_write'); self::getApp()->saveTimestamp($time, 'cache_write');
return $return; return $return;
} }
@ -107,12 +127,12 @@ class Cache extends \Friendica\BaseObject
/** /**
* @brief Remove outdated data from the cache * @brief Remove outdated data from the cache
* *
* @param integer $max_level The maximum cache level that is to be cleared * @param boolean $outdated just remove outdated values
* *
* @return void * @return void
*/ */
public static function clear() public static function clear($outdated = true)
{ {
return self::getDriver()->clear(); return self::getDriver()->clear($outdated);
} }
} }

View file

@ -17,8 +17,56 @@ abstract class AbstractCacheDriver extends BaseObject
* @param string $key The original key * @param string $key The original key
* @return string The cache key used for the cache * @return string The cache key used for the cache
*/ */
protected function getCacheKey($key) { protected function getCacheKey($key)
{
// We fetch with the hostname as key to avoid problems with other applications // We fetch with the hostname as key to avoid problems with other applications
return self::getApp()->get_hostname() . ":" . $key; return self::getApp()->getHostName() . ":" . $key;
}
/**
* @param array $keys A list of cached keys
* @return array A list of original keys
*/
protected function getOriginalKeys($keys)
{
if (empty($keys)) {
return [];
} else {
// Keys are prefixed with the node hostname, let's remove it
array_walk($keys, function (&$value) {
$value = preg_replace('/^' . self::getApp()->getHostName() . ':/', '', $value);
});
sort($keys);
return $keys;
}
}
/**
* Filters the keys of an array with a given prefix
* Returns the filtered keys as an new array
*
* @param array $array The array, which should get filtered
* @param string|null $prefix The prefix (if null, all keys will get returned)
*
* @return array The filtered array with just the keys
*/
protected function filterArrayKeysByPrefix($array, $prefix = null)
{
if (empty($prefix)) {
return array_keys($array);
} else {
$result = [];
foreach (array_keys($array) as $key) {
if (strpos($key, $prefix) === 0) {
array_push($result, $key);
}
}
return $result;
}
} }
} }

View file

@ -19,6 +19,14 @@ class ArrayCache extends AbstractCacheDriver implements IMemoryCacheDriver
/** @var array Array with the cached data */ /** @var array Array with the cached data */
protected $cachedData = array(); protected $cachedData = array();
/**
* (@inheritdoc)
*/
public function getAllKeys($prefix = null)
{
return $this->filterArrayKeysByPrefix($this->cachedData, $prefix);
}
/** /**
* (@inheritdoc) * (@inheritdoc)
*/ */

View file

@ -13,6 +13,31 @@ use Friendica\Util\DateTimeFormat;
*/ */
class DatabaseCacheDriver extends AbstractCacheDriver implements ICacheDriver class DatabaseCacheDriver extends AbstractCacheDriver implements ICacheDriver
{ {
/**
* (@inheritdoc)
*/
public function getAllKeys($prefix = null)
{
if (empty($prefix)) {
$where = ['`expires` >= ?', DateTimeFormat::utcNow()];
} else {
$where = ['`expires` >= ? AND `k` LIKE CONCAT(?, \'%\')', DateTimeFormat::utcNow(), $prefix];
}
$stmt = DBA::select('cache', ['k'], $where);
$keys = [];
while ($key = DBA::fetch($stmt)) {
array_push($keys, $key['k']);
}
DBA::close($stmt);
return $keys;
}
/**
* (@inheritdoc)
*/
public function get($key) public function get($key)
{ {
$cache = DBA::selectFirst('cache', ['v'], ['`k` = ? AND `expires` >= ?', $key, DateTimeFormat::utcNow()]); $cache = DBA::selectFirst('cache', ['v'], ['`k` = ? AND `expires` >= ?', $key, DateTimeFormat::utcNow()]);
@ -32,6 +57,9 @@ class DatabaseCacheDriver extends AbstractCacheDriver implements ICacheDriver
return null; return null;
} }
/**
* (@inheritdoc)
*/
public function set($key, $value, $ttl = Cache::FIVE_MINUTES) public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
{ {
$fields = [ $fields = [
@ -43,11 +71,17 @@ class DatabaseCacheDriver extends AbstractCacheDriver implements ICacheDriver
return DBA::update('cache', $fields, ['k' => $key], true); return DBA::update('cache', $fields, ['k' => $key], true);
} }
/**
* (@inheritdoc)
*/
public function delete($key) public function delete($key)
{ {
return DBA::delete('cache', ['k' => $key]); return DBA::delete('cache', ['k' => $key]);
} }
/**
* (@inheritdoc)
*/
public function clear($outdated = true) public function clear($outdated = true)
{ {
if ($outdated) { if ($outdated) {

View file

@ -11,6 +11,15 @@ use Friendica\Core\Cache;
*/ */
interface ICacheDriver interface ICacheDriver
{ {
/**
* Lists all cache keys
*
* @param string prefix optional a prefix to search
*
* @return array Empty if it isn't supported by the cache driver
*/
public function getAllKeys($prefix = null);
/** /**
* Fetches cached data according to the key * Fetches cached data according to the key
* *

View file

@ -22,6 +22,11 @@ class MemcacheCacheDriver extends AbstractCacheDriver implements IMemoryCacheDri
*/ */
private $memcache; private $memcache;
/**
* @param string $memcache_host
* @param int $memcache_port
* @throws Exception
*/
public function __construct($memcache_host, $memcache_port) public function __construct($memcache_host, $memcache_port)
{ {
if (!class_exists('Memcache', false)) { if (!class_exists('Memcache', false)) {
@ -35,6 +40,30 @@ class MemcacheCacheDriver extends AbstractCacheDriver implements IMemoryCacheDri
} }
} }
/**
* (@inheritdoc)
*/
public function getAllKeys($prefix = null)
{
$keys = [];
$allSlabs = $this->memcache->getExtendedStats('slabs');
foreach ($allSlabs as $slabs) {
foreach (array_keys($slabs) as $slabId) {
$cachedump = $this->memcache->getExtendedStats('cachedump', (int)$slabId);
foreach ($cachedump as $key => $arrVal) {
if (!is_array($arrVal)) {
continue;
}
$keys = array_merge($keys, array_keys($arrVal));
}
}
}
$keys = $this->getOriginalKeys($keys);
return $this->filterArrayKeysByPrefix($keys, $prefix);
}
/** /**
* (@inheritdoc) * (@inheritdoc)
*/ */

View file

@ -5,6 +5,7 @@ namespace Friendica\Core\Cache;
use Friendica\Core\Cache; use Friendica\Core\Cache;
use Exception; use Exception;
use Friendica\Network\HTTPException\InternalServerErrorException;
use Memcached; use Memcached;
/** /**
@ -53,6 +54,24 @@ class MemcachedCacheDriver extends AbstractCacheDriver implements IMemoryCacheDr
} }
} }
/**
* (@inheritdoc)
*/
public function getAllKeys($prefix = null)
{
$keys = $this->getOriginalKeys($this->memcached->getAllKeys());
if ($this->memcached->getResultCode() == Memcached::RES_SUCCESS) {
return $this->filterArrayKeysByPrefix($keys, $prefix);
} else {
logger('Memcached \'getAllKeys\' failed with ' . $this->memcached->getResultMessage(), LOGGER_ALL);
return [];
}
}
/**
* (@inheritdoc)
*/
public function get($key) public function get($key)
{ {
$return = null; $return = null;
@ -63,11 +82,16 @@ class MemcachedCacheDriver extends AbstractCacheDriver implements IMemoryCacheDr
if ($this->memcached->getResultCode() === Memcached::RES_SUCCESS) { if ($this->memcached->getResultCode() === Memcached::RES_SUCCESS) {
$return = $value; $return = $value;
} else {
logger('Memcached \'get\' failed with ' . $this->memcached->getResultMessage(), LOGGER_ALL);
} }
return $return; return $return;
} }
/**
* (@inheritdoc)
*/
public function set($key, $value, $ttl = Cache::FIVE_MINUTES) public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
{ {
$cachekey = $this->getCacheKey($key); $cachekey = $this->getCacheKey($key);
@ -85,15 +109,20 @@ class MemcachedCacheDriver extends AbstractCacheDriver implements IMemoryCacheDr
$value $value
); );
} }
} }
/**
* (@inheritdoc)
*/
public function delete($key) public function delete($key)
{ {
$cachekey = $this->getCacheKey($key); $cachekey = $this->getCacheKey($key);
return $this->memcached->delete($cachekey); return $this->memcached->delete($cachekey);
} }
/**
* (@inheritdoc)
*/
public function clear($outdated = true) public function clear($outdated = true)
{ {
if ($outdated) { if ($outdated) {
@ -104,12 +133,7 @@ class MemcachedCacheDriver extends AbstractCacheDriver implements IMemoryCacheDr
} }
/** /**
* @brief Sets a value if it's not already stored * (@inheritdoc)
*
* @param string $key The cache key
* @param mixed $value The old value we know from the cache
* @param int $ttl The cache lifespan, must be one of the Cache constants
* @return bool
*/ */
public function add($key, $value, $ttl = Cache::FIVE_MINUTES) public function add($key, $value, $ttl = Cache::FIVE_MINUTES)
{ {

View file

@ -20,6 +20,11 @@ class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver
*/ */
private $redis; private $redis;
/**
* @param string $redis_host
* @param int $redis_port
* @throws Exception
*/
public function __construct($redis_host, $redis_port) public function __construct($redis_host, $redis_port)
{ {
if (!class_exists('Redis', false)) { if (!class_exists('Redis', false)) {
@ -33,6 +38,25 @@ class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver
} }
} }
/**
* (@inheritdoc)
*/
public function getAllKeys($prefix = null)
{
if (empty($prefix)) {
$search = '*';
} else {
$search = $prefix . '*';
}
$list = $this->redis->keys($this->getCacheKey($search));
return $this->getOriginalKeys($list);
}
/**
* (@inheritdoc)
*/
public function get($key) public function get($key)
{ {
$return = null; $return = null;
@ -55,6 +79,9 @@ class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver
return $return; return $return;
} }
/**
* (@inheritdoc)
*/
public function set($key, $value, $ttl = Cache::FIVE_MINUTES) public function set($key, $value, $ttl = Cache::FIVE_MINUTES)
{ {
$cachekey = $this->getCacheKey($key); $cachekey = $this->getCacheKey($key);
@ -75,12 +102,18 @@ class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver
} }
} }
/**
* (@inheritdoc)
*/
public function delete($key) public function delete($key)
{ {
$cachekey = $this->getCacheKey($key); $cachekey = $this->getCacheKey($key);
return ($this->redis->delete($cachekey) > 0); return ($this->redis->delete($cachekey) > 0);
} }
/**
* (@inheritdoc)
*/
public function clear($outdated = true) public function clear($outdated = true)
{ {
if ($outdated) { if ($outdated) {
@ -127,6 +160,7 @@ class RedisCacheDriver extends AbstractCacheDriver implements IMemoryCacheDriver
$this->redis->unwatch(); $this->redis->unwatch();
return false; return false;
} }
/** /**
* (@inheritdoc) * (@inheritdoc)
*/ */

View file

@ -31,7 +31,7 @@ class Config extends BaseObject
public static function init() public static function init()
{ {
// Database isn't ready or populated yet // Database isn't ready or populated yet
if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) { if (!self::getApp()->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
return; return;
} }
@ -55,7 +55,7 @@ class Config extends BaseObject
public static function load($family = "config") public static function load($family = "config")
{ {
// Database isn't ready or populated yet // Database isn't ready or populated yet
if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) { if (!self::getApp()->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
return; return;
} }
@ -88,7 +88,7 @@ class Config extends BaseObject
public static function get($family, $key, $default_value = null, $refresh = false) public static function get($family, $key, $default_value = null, $refresh = false)
{ {
// Database isn't ready or populated yet, fallback to file config // Database isn't ready or populated yet, fallback to file config
if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) { if (!self::getApp()->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
return self::getApp()->getConfigValue($family, $key, $default_value); return self::getApp()->getConfigValue($family, $key, $default_value);
} }
@ -116,7 +116,7 @@ class Config extends BaseObject
public static function set($family, $key, $value) public static function set($family, $key, $value)
{ {
// Database isn't ready or populated yet // Database isn't ready or populated yet
if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) { if (!self::getApp()->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
return false; return false;
} }
@ -141,7 +141,7 @@ class Config extends BaseObject
public static function delete($family, $key) public static function delete($family, $key)
{ {
// Database isn't ready or populated yet // Database isn't ready or populated yet
if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) { if (!self::getApp()->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
return false; return false;
} }

View file

@ -14,6 +14,7 @@ class Console extends \Asika\SimpleConsole\Console
protected $customHelpOptions = ['h', 'help', '?']; protected $customHelpOptions = ['h', 'help', '?'];
protected $subConsoles = [ protected $subConsoles = [
'cache' => __NAMESPACE__ . '\Console\Cache',
'config' => __NAMESPACE__ . '\Console\Config', 'config' => __NAMESPACE__ . '\Console\Config',
'createdoxygen' => __NAMESPACE__ . '\Console\CreateDoxygen', 'createdoxygen' => __NAMESPACE__ . '\Console\CreateDoxygen',
'docbloxerrorchecker' => __NAMESPACE__ . '\Console\DocBloxErrorChecker', 'docbloxerrorchecker' => __NAMESPACE__ . '\Console\DocBloxErrorChecker',
@ -37,6 +38,7 @@ class Console extends \Asika\SimpleConsole\Console
Usage: bin/console [--version] [-h|--help|-?] <command> [<args>] [-v] Usage: bin/console [--version] [-h|--help|-?] <command> [<args>] [-v]
Commands: Commands:
cache Manage node cache
config Edit site config config Edit site config
createdoxygen Generate Doxygen headers createdoxygen Generate Doxygen headers
dbstructure Do database updates dbstructure Do database updates

View file

@ -39,7 +39,7 @@ HELP;
protected function doExecute() protected function doExecute()
{ {
$a = get_app(); $a = \Friendica\BaseObject::getApp();
if ($this->getOption('v')) { if ($this->getOption('v')) {
$this->out('Class: ' . __CLASS__); $this->out('Class: ' . __CLASS__);
@ -56,7 +56,7 @@ HELP;
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments'); throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
} }
if ($a->mode === App::MODE_INSTALL) { if ($a->getMode()->isInstall()) {
throw new RuntimeException('Friendica isn\'t properly installed yet.'); throw new RuntimeException('Friendica isn\'t properly installed yet.');
} }

View file

@ -3,15 +3,14 @@
namespace Friendica\Core\Console; namespace Friendica\Core\Console;
use Asika\SimpleConsole\Console; use Asika\SimpleConsole\Console;
use Friendica\App;
use Friendica\BaseObject; use Friendica\BaseObject;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\Install; use Friendica\Core\Install;
use Friendica\Core\Theme; use Friendica\Core\Theme;
use Friendica\Database\DBA; use Friendica\Database\DBA;
use Friendica\Database\DBStructure;
use RuntimeException; use RuntimeException;
require_once 'mod/install.php';
require_once 'include/dba.php'; require_once 'include/dba.php';
class AutomaticInstallation extends Console class AutomaticInstallation extends Console
@ -30,20 +29,21 @@ Notes
Not checking .htaccess/URL-Rewrite during CLI installation. Not checking .htaccess/URL-Rewrite during CLI installation.
Options Options
-h|--help|-? Show help information -h|--help|-? Show help information
-v Show more debug information. -v Show more debug information.
-a All setup checks are required (except .htaccess) -a All setup checks are required (except .htaccess)
-f|--file <config> prepared config file (e.g. "config/local.ini.php" itself) which will override every other config option - except the environment variables) -f|--file <config> prepared config file (e.g. "config/local.ini.php" itself) which will override every other config option - except the environment variables)
-s|--savedb Save the DB credentials to the file (if environment variables is used) -s|--savedb Save the DB credentials to the file (if environment variables is used)
-H|--dbhost <host> The host of the mysql/mariadb database (env MYSQL_HOST) -H|--dbhost <host> The host of the mysql/mariadb database (env MYSQL_HOST)
-p|--dbport <port> The port of the mysql/mariadb database (env MYSQL_PORT) -p|--dbport <port> The port of the mysql/mariadb database (env MYSQL_PORT)
-d|--dbdata <database> The name of the mysql/mariadb database (env MYSQL_DATABASE) -d|--dbdata <database> The name of the mysql/mariadb database (env MYSQL_DATABASE)
-U|--dbuser <username> The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME) -U|--dbuser <username> The username of the mysql/mariadb database login (env MYSQL_USER or MYSQL_USERNAME)
-P|--dbpass <password> The password of the mysql/mariadb database login (env MYSQL_PASSWORD) -P|--dbpass <password> The password of the mysql/mariadb database login (env MYSQL_PASSWORD)
-b|--phppath <path> The path of the PHP binary (env FRIENDICA_PHP_PATH) -u|--urlpath <url_path> The URL path of Friendica - f.e. '/friendica' (env FRIENDICA_URL_PATH)
-A|--admin <mail> The admin email address of Friendica (env FRIENDICA_ADMIN_MAIL) -b|--phppath <php_path> The path of the PHP binary (env FRIENDICA_PHP_PATH)
-T|--tz <timezone> The timezone of Friendica (env FRIENDICA_TZ) -A|--admin <mail> The admin email address of Friendica (env FRIENDICA_ADMIN_MAIL)
-L|--lang <language> The language of Friendica (env FRIENDICA_LANG) -T|--tz <timezone> The timezone of Friendica (env FRIENDICA_TZ)
-L|--lang <language> The language of Friendica (env FRIENDICA_LANG)
Environment variables Environment variables
MYSQL_HOST The host of the mysql/mariadb database (mandatory if mysql and environment is used) MYSQL_HOST The host of the mysql/mariadb database (mandatory if mysql and environment is used)
@ -51,6 +51,7 @@ Environment variables
MYSQL_USERNAME|MYSQL_USER The username of the mysql/mariadb database login (MYSQL_USERNAME is for mysql, MYSQL_USER for mariadb) MYSQL_USERNAME|MYSQL_USER The username of the mysql/mariadb database login (MYSQL_USERNAME is for mysql, MYSQL_USER for mariadb)
MYSQL_PASSWORD The password of the mysql/mariadb database login MYSQL_PASSWORD The password of the mysql/mariadb database login
MYSQL_DATABASE The name of the mysql/mariadb database MYSQL_DATABASE The name of the mysql/mariadb database
FRIENDICA_URL_PATH The URL path of Friendica (f.e. '/friendica')
FRIENDICA_PHP_PATH The path of the PHP binary FRIENDICA_PHP_PATH The path of the PHP binary
FRIENDICA_ADMIN_MAIL The admin email address of Friendica (this email will be used for admin access) FRIENDICA_ADMIN_MAIL The admin email address of Friendica (this email will be used for admin access)
FRIENDICA_TZ The timezone of Friendica FRIENDICA_TZ The timezone of Friendica
@ -75,6 +76,8 @@ HELP;
$a = BaseObject::getApp(); $a = BaseObject::getApp();
$install = new Install();
// if a config file is set, // if a config file is set,
$config_file = $this->getOption(['f', 'file']); $config_file = $this->getOption(['f', 'file']);
@ -82,8 +85,8 @@ HELP;
if ($config_file != 'config' . DIRECTORY_SEPARATOR . 'local.ini.php') { if ($config_file != 'config' . DIRECTORY_SEPARATOR . 'local.ini.php') {
// Copy config file // Copy config file
$this->out("Copying config file...\n"); $this->out("Copying config file...\n");
if (!copy($a->basepath . DIRECTORY_SEPARATOR . $config_file, $a->basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php')) { if (!copy($a->getBasePath() . DIRECTORY_SEPARATOR . $config_file, $a->getBasePath() . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php')) {
throw new RuntimeException("ERROR: Saving config file failed. Please copy '$config_file' to '$a->basepath" . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . "local.ini.php' manually.\n"); throw new RuntimeException("ERROR: Saving config file failed. Please copy '$config_file' to '" . $a->getBasePath() . "'" . DIRECTORY_SEPARATOR . "config" . DIRECTORY_SEPARATOR . "local.ini.php' manually.\n");
} }
} }
@ -102,21 +105,23 @@ HELP;
$db_data = $this->getOption(['d', 'dbdata'], ($save_db) ? getenv('MYSQL_DATABASE') : ''); $db_data = $this->getOption(['d', 'dbdata'], ($save_db) ? getenv('MYSQL_DATABASE') : '');
$db_user = $this->getOption(['U', 'dbuser'], ($save_db) ? getenv('MYSQL_USER') . getenv('MYSQL_USERNAME') : ''); $db_user = $this->getOption(['U', 'dbuser'], ($save_db) ? getenv('MYSQL_USER') . getenv('MYSQL_USERNAME') : '');
$db_pass = $this->getOption(['P', 'dbpass'], ($save_db) ? getenv('MYSQL_PASSWORD') : ''); $db_pass = $this->getOption(['P', 'dbpass'], ($save_db) ? getenv('MYSQL_PASSWORD') : '');
$php_path = $this->getOption(['b', 'phppath'], (!empty('FRIENDICA_PHP_PATH')) ? getenv('FRIENDICA_PHP_PATH') : ''); $url_path = $this->getOption(['u', 'urlpath'], (!empty('FRIENDICA_URL_PATH')) ? getenv('FRIENDICA_URL_PATH') : null);
$php_path = $this->getOption(['b', 'phppath'], (!empty('FRIENDICA_PHP_PATH')) ? getenv('FRIENDICA_PHP_PATH') : null);
$admin_mail = $this->getOption(['A', 'admin'], (!empty('FRIENDICA_ADMIN_MAIL')) ? getenv('FRIENDICA_ADMIN_MAIL') : ''); $admin_mail = $this->getOption(['A', 'admin'], (!empty('FRIENDICA_ADMIN_MAIL')) ? getenv('FRIENDICA_ADMIN_MAIL') : '');
$tz = $this->getOption(['T', 'tz'], (!empty('FRIENDICA_TZ')) ? getenv('FRIENDICA_TZ') : ''); $tz = $this->getOption(['T', 'tz'], (!empty('FRIENDICA_TZ')) ? getenv('FRIENDICA_TZ') : '');
$lang = $this->getOption(['L', 'lang'], (!empty('FRIENDICA_LANG')) ? getenv('FRIENDICA_LANG') : ''); $lang = $this->getOption(['L', 'lang'], (!empty('FRIENDICA_LANG')) ? getenv('FRIENDICA_LANG') : '');
Install::createConfig( $install->createConfig(
$php_path, $php_path,
$url_path,
((!empty($db_port)) ? $db_host . ':' . $db_port : $db_host), ((!empty($db_port)) ? $db_host . ':' . $db_port : $db_host),
$db_user, $db_user,
$db_pass, $db_pass,
$db_data, $db_data,
$php_path,
$tz, $tz,
$lang, $lang,
$admin_mail $admin_mail,
$a->getBasePath()
); );
} }
@ -126,7 +131,10 @@ HELP;
$this->out("Checking basic setup...\n"); $this->out("Checking basic setup...\n");
$checkResults = []; $checkResults = [];
$checkResults['basic'] = $this->runBasicChecks($a);
$this->runBasicChecks($install);
$checkResults['basic'] = $install->getChecks();
$errorMessage = $this->extractErrors($checkResults['basic']); $errorMessage = $this->extractErrors($checkResults['basic']);
if ($errorMessage !== '') { if ($errorMessage !== '') {
@ -151,7 +159,7 @@ HELP;
// Install database // Install database
$this->out("Inserting data into database...\n"); $this->out("Inserting data into database...\n");
$checkResults['data'] = Install::installDatabaseStructure(); $checkResults['data'] = DBStructure::update(false, true, true);
if ($checkResults['data'] !== '') { if ($checkResults['data'] !== '') {
throw new RuntimeException("ERROR: DB Database creation error. Is the DB empty?\n"); throw new RuntimeException("ERROR: DB Database creation error. Is the DB empty?\n");
@ -174,28 +182,26 @@ HELP;
} }
/** /**
* @param App $app * @param Install $install the Installer instance
* @return array
*/ */
private function runBasicChecks($app) private function runBasicChecks(Install $install)
{ {
$checks = []; $install->resetChecks();
$install->checkFunctions();
Install::checkFunctions($checks); $install->checkImagick();
Install::checkImagick($checks); $install->checkLocalIni();
Install::checkLocalIni($checks); $install->checkSmarty3();
Install::checkSmarty3($checks); $install->checkKeys();
Install::checkKeys($checks);
if (!empty(Config::get('config', 'php_path'))) { if (!empty(Config::get('config', 'php_path'))) {
Install::checkPHP(Config::get('config', 'php_path'), $checks); if (!$install->checkPHP(Config::get('config', 'php_path'), true)) {
throw new RuntimeException(" ERROR: The php_path is not valid in the config.\n");
}
} else { } else {
throw new RuntimeException(" ERROR: The php_path is not set in the config.\n"); throw new RuntimeException(" ERROR: The php_path is not set in the config.\n");
} }
$this->out(" NOTICE: Not checking .htaccess/URL-Rewrite during CLI installation.\n"); $this->out(" NOTICE: Not checking .htaccess/URL-Rewrite during CLI installation.\n");
return $checks;
} }
/** /**
@ -203,6 +209,7 @@ HELP;
* @param $db_user * @param $db_user
* @param $db_pass * @param $db_pass
* @param $db_data * @param $db_data
*
* @return array * @return array
*/ */
private function runDatabaseCheck($db_host, $db_user, $db_pass, $db_data) private function runDatabaseCheck($db_host, $db_user, $db_pass, $db_data)

178
src/Core/Console/Cache.php Normal file
View file

@ -0,0 +1,178 @@
<?php
namespace Friendica\Core\Console;
use Asika\SimpleConsole\CommandArgsException;
use Friendica\App;
use Friendica\Core;
use RuntimeException;
/**
* @brief tool to access the cache from the CLI
*
* With this script you can access the cache of your node from the CLI.
* You can read current values stored in the cache and set new values
* in cache keys.
*
* @author Hypolite Petovan <hypolite@mrpetovan.com>
*/
class Cache extends \Asika\SimpleConsole\Console
{
protected $helpOptions = ['h', 'help', '?'];
protected function getHelp()
{
$help = <<<HELP
console cache - Manage node cache
Synopsis
bin/console cache list [-h|--help|-?] [-v]
bin/console cache get <key> [-h|--help|-?] [-v]
bin/console cache set <key> <value> [-h|--help|-?] [-v]
bin/console cache flush [-h|--help|-?] [-v]
bin/console cache clear [-h|--help|-?] [-v]
Description
bin/console cache list [<prefix>]
List all cache keys, optionally filtered by a prefix
bin/console cache get <key>
Shows the value of the provided cache key
bin/console cache set <key> <value> [<ttl>]
Sets the value of the provided cache key, optionally with the provided TTL (time to live) with a default of five minutes.
bin/console cache flush
Clears expired cache keys
bin/console cache clear
Clears all cache keys
Options
-h|--help|-? Show help information
-v Show more debug information.
HELP;
return $help;
}
protected function doExecute()
{
$a = \Friendica\BaseObject::getApp();
if ($this->getOption('v')) {
$this->out('Executable: ' . $this->executable);
$this->out('Class: ' . __CLASS__);
$this->out('Arguments: ' . var_export($this->args, true));
$this->out('Options: ' . var_export($this->options, true));
}
if ($a->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
$this->out('Database isn\'t ready or populated yet, database cache won\'t be available');
}
Core\Cache::init();
if ($this->getOption('v')) {
$this->out('Cache Driver Name: ' . Core\Cache::$driver_name);
$this->out('Cache Driver Class: ' . Core\Cache::$driver_class);
}
switch ($this->getArgument(0)) {
case 'list':
$this->executeList();
break;
case 'get':
$this->executeGet();
break;
case 'set':
$this->executeSet();
break;
case 'flush':
$this->executeFlush();
break;
case 'clear':
$this->executeClear();
break;
}
if (count($this->args) == 0) {
$this->out($this->getHelp());
return 0;
}
return 0;
}
private function executeList()
{
$prefix = $this->getArgument(1);
$keys = Core\Cache::getAllKeys($prefix);
if (empty($prefix)) {
$this->out('Listing all cache keys:');
} else {
$this->out('Listing all cache keys starting with "' . $prefix . '":');
}
$count = 0;
foreach ($keys as $key) {
$this->out($key);
$count++;
}
$this->out($count . ' keys found');
}
private function executeGet()
{
if (count($this->args) >= 2) {
$key = $this->getArgument(1);
$value = Core\Cache::get($key);
$this->out("{$key} => " . var_export($value, true));
} else {
throw new CommandArgsException('Too few arguments for get');
}
}
private function executeSet()
{
if (count($this->args) >= 3) {
$key = $this->getArgument(1);
$value = $this->getArgument(2);
$duration = intval($this->getArgument(3, Core\Cache::FIVE_MINUTES));
if (is_array(Core\Cache::get($key))) {
throw new RuntimeException("$key is an array and can't be set using this command.");
}
$result = Core\Cache::set($key, $value, $duration);
if ($result) {
$this->out("{$key} <= " . Core\Cache::get($key));
} else {
$this->out("Unable to set {$key}");
}
} else {
throw new CommandArgsException('Too few arguments for set');
}
}
private function executeFlush()
{
$result = Core\Cache::clear();
if ($result) {
$this->out('Cache successfully flushed');
} else {
$this->out('Unable to flush the cache');
}
}
private function executeClear()
{
$result = Core\Cache::clear(false);
if ($result) {
$this->out('Cache successfully cleared');
} else {
$this->out('Unable to flush the cache');
}
}
}

View file

@ -1,11 +1,5 @@
<?php <?php
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
namespace Friendica\Core\Console; namespace Friendica\Core\Console;
use Asika\SimpleConsole\CommandArgsException; use Asika\SimpleConsole\CommandArgsException;
@ -13,9 +7,6 @@ use Friendica\App;
use Friendica\Core; use Friendica\Core;
use RuntimeException; use RuntimeException;
require_once 'include/dba.php';
require_once 'include/text.php';
/** /**
* @brief tool to access the system config from the CLI * @brief tool to access the system config from the CLI
* *
@ -80,7 +71,7 @@ HELP;
protected function doExecute() protected function doExecute()
{ {
$a = get_app(); $a = \Friendica\BaseObject::getApp();
if ($this->getOption('v')) { if ($this->getOption('v')) {
$this->out('Executable: ' . $this->executable); $this->out('Executable: ' . $this->executable);
@ -93,7 +84,7 @@ HELP;
throw new CommandArgsException('Too many arguments'); throw new CommandArgsException('Too many arguments');
} }
if (!($a->mode & App::MODE_DBCONFIGAVAILABLE)) { if (!$a->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
$this->out('Database isn\'t ready or populated yet, showing file config only'); $this->out('Database isn\'t ready or populated yet, showing file config only');
} }
@ -152,7 +143,7 @@ HELP;
if (count($this->args) == 0) { if (count($this->args) == 0) {
Core\Config::load(); Core\Config::load();
if (Core\Config::get('system', 'config_adapter') == 'jit' && $a->mode & App::MODE_DBCONFIGAVAILABLE) { if (Core\Config::get('system', 'config_adapter') == 'jit' && $a->getMode()->has(App\Mode::DBCONFIGAVAILABLE)) {
$this->out('Warning: The JIT (Just In Time) Config adapter doesn\'t support loading the entire configuration, showing file config only'); $this->out('Warning: The JIT (Just In Time) Config adapter doesn\'t support loading the entire configuration, showing file config only');
} }

Some files were not shown because too many files have changed in this diff Show more