diff --git a/bin/auth_ejabberd.php b/bin/auth_ejabberd.php index 7ad28c96f5..1f03b94af9 100755 --- a/bin/auth_ejabberd.php +++ b/bin/auth_ejabberd.php @@ -54,7 +54,7 @@ require_once "include/dba.php"; $a = new App(dirname(__DIR__)); -if ($a->mode === App::MODE_NORMAL) { +if ($a->getMode()->isNormal()) { $oAuth = new ExAuth(); $oAuth->readStdin(); -} \ No newline at end of file +} diff --git a/bin/composer.phar b/bin/composer.phar index c8152aded2..96fa2df7bd 100755 Binary files a/bin/composer.phar and b/bin/composer.phar differ diff --git a/bin/daemon.php b/bin/daemon.php index 159b20e159..f0f5826d92 100755 --- a/bin/daemon.php +++ b/bin/daemon.php @@ -34,7 +34,7 @@ require_once "include/dba.php"; $a = new App(dirname(__DIR__)); -if ($a->isInstallMode()) { +if ($a->getMode()->isInstall()) { die("Friendica isn't properly installed yet.\n"); } diff --git a/bin/worker.php b/bin/worker.php index ceab479cea..cb09a4929d 100755 --- a/bin/worker.php +++ b/bin/worker.php @@ -45,7 +45,7 @@ if (Config::get('system', 'maintenance', false, true)) { return; } -$a->set_baseurl(Config::get('system', 'url')); +$a->setBaseURL(Config::get('system', 'url')); Addon::loadHooks(); diff --git a/boot.php b/boot.php index 581bbb1817..eda4ed1e8d 100644 --- a/boot.php +++ b/boot.php @@ -41,7 +41,7 @@ define('FRIENDICA_PLATFORM', 'Friendica'); define('FRIENDICA_CODENAME', 'The Tazmans Flax-lily'); define('FRIENDICA_VERSION', '2018.12-dev'); define('DFRN_PROTOCOL_VERSION', '2.23'); -define('DB_UPDATE_VERSION', 1283); +define('DB_UPDATE_VERSION', 1285); define('NEW_UPDATE_ROUTINE_VERSION', 1170); /** @@ -475,44 +475,6 @@ function defaults() { 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. * @@ -556,7 +518,7 @@ function check_url(App $a) // and www.example.com vs example.com. // We will only change the url to an ip address if there is no existing setting - if (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()); } @@ -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. * @deprecated @@ -1031,27 +937,27 @@ function get_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 - return App::realpath($temppath); + return App::getRealPath($temppath); } // We don't have a working preconfigured temp path, so we take the system path. $temppath = sys_get_temp_dir(); // 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 - $temppath = App::realpath($temppath); + $temppath = App::getRealPath($temppath); // 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)) { /// @TODO There is a mkdir()+chmod() upwards, maybe generalize this (+ configurable) into a function/method? mkdir($new_temppath); } - if (App::directory_usable($new_temppath)) { + if (App::isDirectoryUsable($new_temppath)) { // The new path is usable, we are happy Config::set("system", "temppath", $new_temppath); return $new_temppath; @@ -1133,8 +1039,8 @@ function get_itemcachepath() } $itemcache = Config::get('system', 'itemcache'); - if (($itemcache != "") && App::directory_usable($itemcache)) { - return App::realpath($itemcache); + if (($itemcache != "") && App::isDirectoryUsable($itemcache)) { + return App::getRealPath($itemcache); } $temppath = get_temppath(); @@ -1145,7 +1051,7 @@ function get_itemcachepath() mkdir($itemcache); } - if (App::directory_usable($itemcache)) { + if (App::isDirectoryUsable($itemcache)) { Config::set("system", "itemcache", $itemcache); return $itemcache; } @@ -1161,7 +1067,7 @@ function get_itemcachepath() function get_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 return $spoolpath; } @@ -1176,7 +1082,7 @@ function get_spoolpath() mkdir($spoolpath); } - if (App::directory_usable($spoolpath)) { + if (App::isDirectoryUsable($spoolpath)) { // The new path is usable, we are happy Config::set("system", "spoolpath", $spoolpath); return $spoolpath; @@ -1231,46 +1137,6 @@ function validate_include(&$file) 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 * diff --git a/composer.json b/composer.json index c717775506..5df9a5355b 100644 --- a/composer.json +++ b/composer.json @@ -18,6 +18,7 @@ "asika/simple-console": "^1.0", "divineomega/password_exposed": "^2.4", "ezyang/htmlpurifier": "~4.7.0", + "friendica/json-ld": "^1.0", "league/html-to-markdown": "~4.8.0", "lightopenid/lightopenid": "dev-master", "michelf/php-markdown": "^1.7", @@ -42,7 +43,7 @@ "repositories": [ { "type": "vcs", - "url": "https://github.com/pear/Text_Highlighter" + "url": "https://git.friendi.ca/friendica/php-json-ld" } ], "autoload": { @@ -74,7 +75,8 @@ "phpunit/dbunit": "^2.0", "phpdocumentor/reflection-docblock": "^3.0.2", "phpunit/php-token-stream": "^1.4.2", - "mikey179/vfsStream": "^1.6" + "mikey179/vfsStream": "^1.6", + "mockery/mockery": "^1.2" }, "scripts": { "test": "phpunit" diff --git a/composer.lock b/composer.lock index b0ff745c68..9230bb4db9 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "5f6a43237dc52758484cd21cd76e8ce6", + "content-hash": "9f0dbeccbae197460a0ce74a940177cd", "packages": [ { "name": "asika/simple-console", @@ -41,16 +41,16 @@ }, { "name": "bower-asset/Chart-js", - "version": "v2.7.1", + "version": "v2.7.2", "source": { "type": "git", "url": "https://github.com/chartjs/Chart.js.git", - "reference": "0fead21939b92c15093c1b7d5ee2627fb5900fff" + "reference": "98f104cdd03617f1300b417b3d60c23d4e3e3403" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chartjs/Chart.js/zipball/0fead21939b92c15093c1b7d5ee2627fb5900fff", - "reference": "0fead21939b92c15093c1b7d5ee2627fb5900fff", + "url": "https://api.github.com/repos/chartjs/Chart.js/zipball/98f104cdd03617f1300b417b3d60c23d4e3e3403", + "reference": "98f104cdd03617f1300b417b3d60c23d4e3e3403", "shasum": "" }, "type": "bower-asset-library", @@ -69,7 +69,7 @@ "MIT" ], "description": "Simple HTML5 charts using the canvas element.", - "time": "2017-10-28T15:01:52+00:00" + "time": "2018-03-01T21:45:21+00:00" }, { "name": "bower-asset/base64", @@ -135,44 +135,133 @@ }, { "name": "bower-asset/vue", - "version": "v2.5.16", + "version": "v2.5.17", "source": { "type": "git", "url": "https://github.com/vuejs/vue.git", - "reference": "25342194016dc3bcc81cb3e8e229b0fb7ba1d1d6" + "reference": "636c9b4ef17f2062720b677cbbe613f146f4d4db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vuejs/vue/zipball/25342194016dc3bcc81cb3e8e229b0fb7ba1d1d6", - "reference": "25342194016dc3bcc81cb3e8e229b0fb7ba1d1d6", + "url": "https://api.github.com/repos/vuejs/vue/zipball/636c9b4ef17f2062720b677cbbe613f146f4d4db", + "reference": "636c9b4ef17f2062720b677cbbe613f146f4d4db", "shasum": "" }, "type": "bower-asset-library" }, { - "name": "divineomega/password_exposed", - "version": "v2.5.1", + "name": "divineomega/do-file-cache", + "version": "v2.0.2", "source": { "type": "git", - "url": "https://github.com/DivineOmega/password_exposed.git", - "reference": "c928bf722eb02398df11076add60df070cb55581" + "url": "https://github.com/DivineOmega/DO-File-Cache.git", + "reference": "261c6e30a0de8cd325f826d08b2e51b2e367a1a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/DivineOmega/password_exposed/zipball/c928bf722eb02398df11076add60df070cb55581", - "reference": "c928bf722eb02398df11076add60df070cb55581", + "url": "https://api.github.com/repos/DivineOmega/DO-File-Cache/zipball/261c6e30a0de8cd325f826d08b2e51b2e367a1a3", + "reference": "261c6e30a0de8cd325f826d08b2e51b2e367a1a3", "shasum": "" }, "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^6.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "psr-4": { + "DivineOmega\\DOFileCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-only" + ], + "description": "DO File Cache is a PHP File-based Caching Library. Its syntax is designed to closely resemble the PHP memcache extension.", + "keywords": [ + "cache", + "caching", + "caching library", + "file cache", + "library", + "php" + ], + "time": "2018-09-12T23:08:34+00:00" + }, + { + "name": "divineomega/do-file-cache-psr-6", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/DivineOmega/DO-File-Cache-PSR-6.git", + "reference": "18f9807d0491d093e9a12741afb40257d92f017e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DivineOmega/DO-File-Cache-PSR-6/zipball/18f9807d0491d093e9a12741afb40257d92f017e", + "reference": "18f9807d0491d093e9a12741afb40257d92f017e", + "shasum": "" + }, + "require": { + "divineomega/do-file-cache": "^2.0.0", + "psr/cache": "^1.0" + }, + "require-dev": { + "cache/integration-tests": "^0.16.0", + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "DivineOmega\\DOFileCachePSR6\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0-only" + ], + "authors": [ + { + "name": "Jordan Hall", + "email": "jordan@hall05.co.uk" + } + ], + "description": "PSR-6 adapter for DO File Cache", + "time": "2018-07-13T08:32:36+00:00" + }, + { + "name": "divineomega/password_exposed", + "version": "v2.5.3", + "source": { + "type": "git", + "url": "https://github.com/DivineOmega/password_exposed.git", + "reference": "1f1b49e3ec55b0f07115d342b145091368b081c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/DivineOmega/password_exposed/zipball/1f1b49e3ec55b0f07115d342b145091368b081c4", + "reference": "1f1b49e3ec55b0f07115d342b145091368b081c4", + "shasum": "" + }, + "require": { + "divineomega/do-file-cache-psr-6": "^2.0", "guzzlehttp/guzzle": "^6.3", "paragonie/certainty": "^1", - "php": ">=5.6", - "rapidwebltd/rw-file-cache-psr-6": "^1.0" + "php": ">=5.6" }, "require-dev": { "fzaninotto/faker": "^1.7", + "php-coveralls/php-coveralls": "^2.1", "phpunit/phpunit": "^5.7", - "satooshi/php-coveralls": "^2.0", "vimeo/psalm": "^1" }, "type": "library", @@ -195,7 +284,7 @@ } ], "description": "This PHP package provides a `password_exposed` helper function, that uses the haveibeenpwned.com API to check if a password has been exposed in a data breach.", - "time": "2018-04-02T18:16:36+00:00" + "time": "2018-07-12T22:09:43+00:00" }, { "name": "ezyang/htmlpurifier", @@ -241,18 +330,62 @@ ], "time": "2015-08-05T01:03:42+00:00" }, + { + "name": "friendica/json-ld", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://git.friendi.ca/friendica/php-json-ld", + "reference": "ca3916d10d2ad9073b3b1eae383978dbe828e1e1" + }, + "require": { + "ext-json": "*", + "php": ">=5.4.0" + }, + "type": "library", + "autoload": { + "files": [ + "jsonld.php" + ] + }, + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Digital Bazaar, Inc.", + "email": "support@digitalbazaar.com", + "homepage": "http://digitalbazaar.com/" + }, + { + "name": "Friendica Team", + "homepage": "https://friendi.ca/" + } + ], + "description": "A JSON-LD Processor and API implementation in PHP.", + "homepage": "https://git.friendi.ca/friendica/php-json-ld", + "keywords": [ + "JSON", + "JSON-LD", + "Linked Data", + "RDF", + "Semantic Web", + "jsonld" + ], + "time": "2018-10-08T20:41:00+00:00" + }, { "name": "fxp/composer-asset-plugin", - "version": "v1.4.2", + "version": "v1.4.4", "source": { "type": "git", "url": "https://github.com/fxpio/composer-asset-plugin.git", - "reference": "61352d99940d2b2392a5d2db83b8c0ef5faf222a" + "reference": "0d07328eef6e6f3753aa835fd2faef7fed1717bf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fxpio/composer-asset-plugin/zipball/61352d99940d2b2392a5d2db83b8c0ef5faf222a", - "reference": "61352d99940d2b2392a5d2db83b8c0ef5faf222a", + "url": "https://api.github.com/repos/fxpio/composer-asset-plugin/zipball/0d07328eef6e6f3753aa835fd2faef7fed1717bf", + "reference": "0d07328eef6e6f3753aa835fd2faef7fed1717bf", "shasum": "" }, "require": { @@ -260,7 +393,7 @@ "php": ">=5.3.3" }, "require-dev": { - "composer/composer": "^1.4.0" + "composer/composer": "^1.6.0" }, "type": "composer-plugin", "extra": { @@ -298,20 +431,20 @@ "npm", "package" ], - "time": "2017-10-20T06:53:56+00:00" + "time": "2018-07-02T11:37:17+00:00" }, { "name": "guzzlehttp/guzzle", - "version": "6.3.0", + "version": "6.3.3", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", + "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", "shasum": "" }, "require": { @@ -321,7 +454,7 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0 || ^5.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", "psr/log": "^1.0" }, "suggest": { @@ -330,7 +463,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.2-dev" + "dev-master": "6.3-dev" } }, "autoload": { @@ -363,7 +496,7 @@ "rest", "web service" ], - "time": "2017-06-22T18:50:49+00:00" + "time": "2018-04-22T15:46:56+00:00" }, { "name": "guzzlehttp/promises", @@ -626,16 +759,16 @@ }, { "name": "mobiledetect/mobiledetectlib", - "version": "2.8.30", + "version": "2.8.33", "source": { "type": "git", "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "5500bbbf312fe77ef0c7223858dad84fe49ee0c3" + "reference": "cd385290f9a0d609d2eddd165a1e44ec1bf12102" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/5500bbbf312fe77ef0c7223858dad84fe49ee0c3", - "reference": "5500bbbf312fe77ef0c7223858dad84fe49ee0c3", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/cd385290f9a0d609d2eddd165a1e44ec1bf12102", + "reference": "cd385290f9a0d609d2eddd165a1e44ec1bf12102", "shasum": "" }, "require": { @@ -674,7 +807,7 @@ "mobile detector", "php mobile detect" ], - "time": "2017-12-18T10:38:51+00:00" + "time": "2018-09-01T15:05:15+00:00" }, { "name": "npm-asset/cropperjs", @@ -815,67 +948,16 @@ }, { "name": "npm-asset/fullcalendar", - "version": "3.8.2", + "version": "3.9.0", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.8.2.tgz", + "url": "https://registry.npmjs.org/fullcalendar/-/fullcalendar-3.9.0.tgz", "reference": null, - "shasum": "ef7dc77b89134bbe6163e51136f7a1f8bfc1d807" + "shasum": "b608a9989f3416f0b1d526c6bdfeeaf2ac79eda5" }, "require": { "npm-asset/jquery": ">=2,<4.0", - "npm-asset/moment": ">=2.9.0,<3.0.0" - }, - "require-dev": { - "npm-asset/awesome-typescript-loader": ">=3.3.0,<4.0.0", - "npm-asset/bootstrap": ">=3.3.7,<4.0.0", - "npm-asset/components-jqueryui": "dev-github:components/jqueryui", - "npm-asset/css-loader": ">=0.28.7,<0.29.0", - "npm-asset/del": ">=2.2.1,<3.0.0", - "npm-asset/dts-generator": ">=2.1.0,<3.0.0", - "npm-asset/eslint": ">=4.13.1,<5.0.0", - "npm-asset/eslint-config-standard": ">=11.0.0-beta.0,<12.0.0", - "npm-asset/eslint-plugin-import": ">=2.8.0,<3.0.0", - "npm-asset/eslint-plugin-node": ">=5.2.1,<6.0.0", - "npm-asset/eslint-plugin-promise": ">=3.6.0,<4.0.0", - "npm-asset/eslint-plugin-standard": ">=3.0.1,<4.0.0", - "npm-asset/extract-text-webpack-plugin": ">=3.0.2,<4.0.0", - "npm-asset/glob": ">=7.1.2,<8.0.0", - "npm-asset/gulp": ">=3.9.1,<4.0.0", - "npm-asset/gulp-cssmin": ">=0.1.7,<0.2.0", - "npm-asset/gulp-eslint": ">=4.0.0,<5.0.0", - "npm-asset/gulp-filter": ">=4.0.0,<5.0.0", - "npm-asset/gulp-modify-file": ">=1.0.0,<2.0.0", - "npm-asset/gulp-rename": ">=1.2.2,<2.0.0", - "npm-asset/gulp-shell": ">=0.6.5,<0.7.0", - "npm-asset/gulp-tslint": ">=8.1.2,<9.0.0", - "npm-asset/gulp-uglify": ">=2.0.0,<3.0.0", - "npm-asset/gulp-util": ">=3.0.7,<4.0.0", - "npm-asset/gulp-watch": ">=4.3.11,<5.0.0", - "npm-asset/gulp-zip": ">=3.2.0,<4.0.0", - "npm-asset/jasmine-core": "2.5.2", - "npm-asset/jasmine-fixture": ">=2.0.0,<3.0.0", - "npm-asset/jasmine-jquery": ">=2.1.1,<3.0.0", - "npm-asset/jquery-mockjax": ">=2.2.0,<3.0.0", - "npm-asset/jquery-simulate": "dev-github:jquery/jquery-simulate", - "npm-asset/karma": ">=0.13.22,<0.14.0", - "npm-asset/karma-jasmine": ">=1.0.2,<2.0.0", - "npm-asset/karma-phantomjs-launcher": ">=1.0.0,<2.0.0", - "npm-asset/karma-sourcemap-loader": ">=0.3.7,<0.4.0", - "npm-asset/karma-verbose-reporter": "0.0.6", - "npm-asset/moment-timezone": ">=0.5.5,<0.6.0", - "npm-asset/native-promise-only": ">=0.8.1,<0.9.0", - "npm-asset/node-sass": ">=4.7.2,<5.0.0", - "npm-asset/phantomjs-prebuilt": ">=2.1.7,<3.0.0", - "npm-asset/sass-loader": ">=6.0.6,<7.0.0", - "npm-asset/tslib": ">=1.8.0,<2.0.0", - "npm-asset/tslint": ">=5.8.0,<6.0.0", - "npm-asset/tslint-config-standard": ">=7.0.0,<8.0.0", - "npm-asset/types--jquery": "2.0.47", - "npm-asset/typescript": ">=2.6.2,<3.0.0", - "npm-asset/webpack": ">=3.8.1,<4.0.0", - "npm-asset/webpack-stream": ">=4.0.0,<5.0.0", - "npm-asset/yargs": ">=4.8.1,<5.0.0" + "npm-asset/moment": ">=2.20.1,<3.0.0" }, "type": "npm-asset-library", "extra": { @@ -923,7 +1005,7 @@ "full-sized", "jquery-plugin" ], - "time": "2018-01-30T23:49:01+00:00" + "time": "2018-03-05T03:30:23+00:00" }, { "name": "npm-asset/imagesloaded", @@ -1150,24 +1232,18 @@ }, { "name": "npm-asset/jquery-datetimepicker", - "version": "2.5.17", + "version": "2.5.20", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/jquery-datetimepicker/-/jquery-datetimepicker-2.5.17.tgz", + "url": "https://registry.npmjs.org/jquery-datetimepicker/-/jquery-datetimepicker-2.5.20.tgz", "reference": null, - "shasum": "8857a631f248081d4072563bde40fa8c17e407b1" + "shasum": "687d6204b90b03dc93f725f8df036e1d061f37ac" }, "require": { "npm-asset/jquery": ">=1.7.2", "npm-asset/jquery-mousewheel": ">=3.1.13", "npm-asset/php-date-formatter": ">=1.3.4,<2.0.0" }, - "require-dev": { - "npm-asset/concat": "dev-github:azer/concat", - "npm-asset/concat-cli": ">=4.0.0,<5.0.0", - "npm-asset/uglifycss": ">=0.0.27,<0.0.28", - "npm-asset/uglifyjs": ">=2.4.10,<3.0.0" - }, "type": "npm-asset-library", "extra": { "npm-asset-bugs": { @@ -1180,13 +1256,13 @@ "url": "git+https://github.com/xdan/datetimepicker.git" }, "npm-asset-scripts": { - "test": "echo \"Error: no test specified\" && exit 1", + "test": "karma start --browsers Firefox karma.conf.js --single-run", "concat": "concat-cli -f node_modules/php-date-formatter/js/php-date-formatter.min.js jquery.datetimepicker.js node_modules/jquery-mousewheel/jquery.mousewheel.js -o build/jquery.datetimepicker.full.js", "minify": "uglifyjs jquery.datetimepicker.js -c -m -o build/jquery.datetimepicker.min.js && uglifycss jquery.datetimepicker.css > build/jquery.datetimepicker.min.css", "minifyconcat": "uglifyjs build/jquery.datetimepicker.full.js -c -m -o build/jquery.datetimepicker.full.min.js", "github": "git add --all && git commit -m \"New version %npm_package_version% \" && git tag %npm_package_version% && git push --tags origin HEAD:master && npm publish", "build": "npm run minify && npm run concat && npm run minifyconcat", - "public": "npm version patch --no-git-tag-version && npm run build && npm run github" + "public": "npm run test && npm version patch --no-git-tag-version && npm run build && npm run github" } }, "license": [ @@ -1196,7 +1272,7 @@ { "name": "Chupurnov", "email": "chupurnov@gmail.com", - "url": "http://xdsoft.net/" + "url": "https://xdsoft.net/" } ], "description": "jQuery Plugin DateTimePicker it is DatePicker and TimePicker in one", @@ -1210,7 +1286,7 @@ "time", "timepicker" ], - "time": "2018-01-23T05:56:50+00:00" + "time": "2018-03-21T16:26:39+00:00" }, { "name": "npm-asset/jquery-mousewheel", @@ -1269,45 +1345,12 @@ }, { "name": "npm-asset/moment", - "version": "2.20.1", + "version": "2.22.2", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/moment/-/moment-2.20.1.tgz", + "url": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", "reference": null, - "shasum": "d6eb1a46cbcc14a2b2f9434112c1ff8907f313fd" - }, - "require-dev": { - "npm-asset/benchmark": "dev-default|*", - "npm-asset/coveralls": ">=2.11.2,<3.0.0", - "npm-asset/es6-promise": "dev-default|*", - "npm-asset/grunt": "~0.4", - "npm-asset/grunt-benchmark": "dev-default|*", - "npm-asset/grunt-cli": "dev-default|*", - "npm-asset/grunt-contrib-clean": "dev-default|*", - "npm-asset/grunt-contrib-concat": "dev-default|*", - "npm-asset/grunt-contrib-copy": "dev-default|*", - "npm-asset/grunt-contrib-jshint": "dev-default|*", - "npm-asset/grunt-contrib-uglify": "dev-default|*", - "npm-asset/grunt-contrib-watch": "dev-default|*", - "npm-asset/grunt-env": "dev-default|*", - "npm-asset/grunt-exec": "dev-default|*", - "npm-asset/grunt-jscs": "dev-default|*", - "npm-asset/grunt-karma": "dev-default|*", - "npm-asset/grunt-nuget": "dev-default|*", - "npm-asset/grunt-string-replace": "dev-default|*", - "npm-asset/karma": "dev-default|*", - "npm-asset/karma-chrome-launcher": "dev-default|*", - "npm-asset/karma-firefox-launcher": "dev-default|*", - "npm-asset/karma-qunit": "dev-default|*", - "npm-asset/karma-sauce-launcher": "dev-default|*", - "npm-asset/load-grunt-tasks": "dev-default|*", - "npm-asset/nyc": ">=2.1.4,<3.0.0", - "npm-asset/qunit": ">=0.7.5,<0.8.0", - "npm-asset/qunit-cli": ">=0.1.4,<0.2.0", - "npm-asset/rollup": "dev-default|*", - "npm-asset/spacejam": "dev-default|*", - "npm-asset/typescript": ">=1.8.10,<2.0.0", - "npm-asset/uglify-js": "dev-default|*" + "shasum": "3c257f9839fc0e93ff53149632239eb90783ff66" }, "type": "npm-asset-library", "extra": { @@ -1377,16 +1420,21 @@ "time", "validate" ], - "time": "2017-12-19T04:44:18+00:00" + "time": "2018-06-01T06:58:41+00:00" }, { "name": "npm-asset/php-date-formatter", - "version": "1.3.4", + "version": "v1.3.5", + "source": { + "type": "git", + "url": "https://github.com/kartik-v/php-date-formatter.git", + "reference": "d842e1c4e6a8d6108017b726321c305bb5ae4fb5" + }, "dist": { - "type": "tar", - "url": "https://registry.npmjs.org/php-date-formatter/-/php-date-formatter-1.3.4.tgz", - "reference": null, - "shasum": "09a15ae0766ba0beb1900c27c1ec319ef2e4563e" + "type": "zip", + "url": "https://api.github.com/repos/kartik-v/php-date-formatter/zipball/d842e1c4e6a8d6108017b726321c305bb5ae4fb5", + "reference": "d842e1c4e6a8d6108017b726321c305bb5ae4fb5", + "shasum": "" }, "type": "npm-asset-library", "extra": { @@ -1399,35 +1447,31 @@ }, "npm-asset-repository": { "type": "git", - "url": "git+https://github.com/kartik-v/php-date-formatter.git" - }, - "npm-asset-scripts": [] + "url": "https://github.com/kartik-v/php-date-formatter.git" + } }, "license": [ "BSD-3-Clause" ], "authors": [ - { - "name": "Kartik Visweswaran", - "email": "kartikv2@gmail.com" - } + "Kartik Visweswaran " ], "description": "A Javascript datetime formatting and manipulation library using PHP date-time formats.", "homepage": "https://github.com/kartik-v/php-date-formatter", - "time": "2016-02-18T15:15:55+00:00" + "time": "2018-07-13T06:56:46+00:00" }, { "name": "paragonie/certainty", - "version": "v1.0.2", + "version": "v1.0.4", "source": { "type": "git", "url": "https://github.com/paragonie/certainty.git", - "reference": "a2d14f5b0b85c58329dee248d77d34e7e1202a32" + "reference": "d0f22c0fe579cf0e4f8ee301de5bc97ab124faac" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/certainty/zipball/a2d14f5b0b85c58329dee248d77d34e7e1202a32", - "reference": "a2d14f5b0b85c58329dee248d77d34e7e1202a32", + "url": "https://api.github.com/repos/paragonie/certainty/zipball/d0f22c0fe579cf0e4f8ee301de5bc97ab124faac", + "reference": "d0f22c0fe579cf0e4f8ee301de5bc97ab124faac", "shasum": "" }, "require": { @@ -1474,29 +1518,29 @@ "ssl", "tls" ], - "time": "2018-03-12T18:34:23+00:00" + "time": "2018-04-09T07:21:55+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v1.0.2", + "version": "v1.0.4", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "6111a38faf6fdebc14e36652d22036f379ba58d3" + "reference": "2132f0f293d856026d7d11bd81b9f4a23a1dc1f6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/6111a38faf6fdebc14e36652d22036f379ba58d3", - "reference": "6111a38faf6fdebc14e36652d22036f379ba58d3", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/2132f0f293d856026d7d11bd81b9f4a23a1dc1f6", + "reference": "2132f0f293d856026d7d11bd81b9f4a23a1dc1f6", "shasum": "" }, "require": { "php": "^5.3|^7" }, "require-dev": { - "paragonie/random_compat": "^1|^2", + "paragonie/random_compat": "^1.4|^2", "phpunit/phpunit": "4.*|5.*", - "vimeo/psalm": "^1" + "vimeo/psalm": "^0.3|^1" }, "type": "library", "autoload": { @@ -1537,20 +1581,20 @@ "hex2bin", "rfc4648" ], - "time": "2018-03-10T19:46:06+00:00" + "time": "2018-04-30T17:57:16+00:00" }, { "name": "paragonie/random_compat", - "version": "v2.0.11", + "version": "v2.0.17", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8" + "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8", - "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/29af24f25bab834fcbb38ad2a69fa93b867e070d", + "reference": "29af24f25bab834fcbb38ad2a69fa93b867e070d", "shasum": "" }, "require": { @@ -1582,27 +1626,28 @@ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7", "keywords": [ "csprng", + "polyfill", "pseudorandom", "random" ], - "time": "2017-09-27T21:40:39+00:00" + "time": "2018-07-04T16:31:37+00:00" }, { "name": "paragonie/sodium_compat", - "version": "v1.6.0", + "version": "v1.7.0", "source": { "type": "git", "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "1f6e5682eff4a5a6a394b14331a1904f1740e432" + "reference": "7b73005be3c224f12c47bd75a23ce24b762e47e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/1f6e5682eff4a5a6a394b14331a1904f1740e432", - "reference": "1f6e5682eff4a5a6a394b14331a1904f1740e432", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/7b73005be3c224f12c47bd75a23ce24b762e47e8", + "reference": "7b73005be3c224f12c47bd75a23ce24b762e47e8", "shasum": "" }, "require": { - "paragonie/random_compat": "^1|^2", + "paragonie/random_compat": ">=1", "php": "^5.2.4|^5.3|^5.4|^5.5|^5.6|^7" }, "require-dev": { @@ -1667,7 +1712,7 @@ "secret-key cryptography", "side-channel resistant" ], - "time": "2018-02-15T05:50:20+00:00" + "time": "2018-09-22T03:59:58+00:00" }, { "name": "pear/text_languagedetect", @@ -1809,94 +1854,6 @@ ], "time": "2016-08-06T14:39:51+00:00" }, - { - "name": "rapidwebltd/rw-file-cache", - "version": "v1.2.5", - "source": { - "type": "git", - "url": "https://github.com/rapidwebltd/RW-File-Cache.git", - "reference": "4a1d5aaefa6ffafec8e2d60787f12bcd9890977e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/rapidwebltd/RW-File-Cache/zipball/4a1d5aaefa6ffafec8e2d60787f12bcd9890977e", - "reference": "4a1d5aaefa6ffafec8e2d60787f12bcd9890977e", - "shasum": "" - }, - "require": { - "php": ">=5.2.1" - }, - "require-dev": { - "phpunit/phpunit": "^5.7" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "psr-4": { - "rapidweb\\RWFileCache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-only" - ], - "description": "RW File Cache is a PHP File-based Caching Library. Its syntax is designed to closely resemble the PHP memcache extension.", - "homepage": "https://github.com/rapidwebltd/RW-File-Cache", - "keywords": [ - "cache", - "caching", - "caching library", - "file cache", - "library", - "php" - ], - "time": "2018-01-23T17:20:58+00:00" - }, - { - "name": "rapidwebltd/rw-file-cache-psr-6", - "version": "v1.0.0", - "source": { - "type": "git", - "url": "https://github.com/rapidwebltd/RW-File-Cache-PSR-6.git", - "reference": "b74ea201d4c964f0e6db0fb036d1ab28a570df66" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/rapidwebltd/RW-File-Cache-PSR-6/zipball/b74ea201d4c964f0e6db0fb036d1ab28a570df66", - "reference": "b74ea201d4c964f0e6db0fb036d1ab28a570df66", - "shasum": "" - }, - "require": { - "psr/cache": "^1.0", - "rapidwebltd/rw-file-cache": "^1.2.3" - }, - "require-dev": { - "cache/integration-tests": "^0.16.0", - "phpunit/phpunit": "^5.7" - }, - "type": "library", - "autoload": { - "psr-4": { - "rapidweb\\RWFileCachePSR6\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "LGPL-3.0-only" - ], - "authors": [ - { - "name": "Jordan Hall", - "email": "jordan.hall@rapidweb.biz" - } - ], - "description": "PSR-6 adapter for RW File Cache", - "time": "2018-01-30T19:13:45+00:00" - }, { "name": "seld/cli-prompt", "version": "1.0.3", @@ -1947,16 +1904,16 @@ }, { "name": "smarty/smarty", - "version": "v3.1.31", + "version": "v3.1.33", "source": { "type": "git", "url": "https://github.com/smarty-php/smarty.git", - "reference": "c7d42e4a327c402897dd587871434888fde1e7a9" + "reference": "dd55b23121e55a3b4f1af90a707a6c4e5969530f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/c7d42e4a327c402897dd587871434888fde1e7a9", - "reference": "c7d42e4a327c402897dd587871434888fde1e7a9", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/dd55b23121e55a3b4f1af90a707a6c4e5969530f", + "reference": "dd55b23121e55a3b4f1af90a707a6c4e5969530f", "shasum": "" }, "require": { @@ -1996,7 +1953,7 @@ "keywords": [ "templating" ], - "time": "2016-12-14T21:57:25+00:00" + "time": "2018-09-12T20:54:16+00:00" } ], "packages-dev": [ @@ -2054,6 +2011,54 @@ ], "time": "2015-06-14T21:17:01+00:00" }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/776503d3a8e85d4f9a1148614f95b7a608b046ad", + "reference": "776503d3a8e85d4f9a1148614f95b7a608b046ad", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "1.3.3", + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "time": "2016-01-20T08:20:44+00:00" + }, { "name": "mikey179/vfsStream", "version": "v1.6.5", @@ -2100,6 +2105,71 @@ "homepage": "http://vfs.bovigo.org/", "time": "2017-08-01T08:02:14+00:00" }, + { + "name": "mockery/mockery", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "100633629bf76d57430b86b7098cd6beb996a35a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/100633629bf76d57430b86b7098cd6beb996a35a", + "reference": "100633629bf76d57430b86b7098cd6beb996a35a", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "~2.0", + "lib-pcre": ">=7.0", + "php": ">=5.6.0" + }, + "require-dev": { + "phpunit/phpunit": "~5.7.10|~6.5|~7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "time": "2018-10-02T21:52:37+00:00" + }, { "name": "myclabs/deep-copy", "version": "1.7.0", @@ -2145,53 +2215,6 @@ ], "time": "2017-10-19T19:58:43+00:00" }, - { - "name": "phar-io/version", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", - "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "time": "2017-03-05T17:38:23+00:00" - }, { "name": "phpdocumentor/reflection-common", "version": "1.0.1", @@ -2340,16 +2363,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.7.6", + "version": "1.8.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712" + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/33a7e3c4fda54e912ff6338c48823bd5c0f0b712", - "reference": "33a7e3c4fda54e912ff6338c48823bd5c0f0b712", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", + "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", "shasum": "" }, "require": { @@ -2361,12 +2384,12 @@ }, "require-dev": { "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.7.x-dev" + "dev-master": "1.8.x-dev" } }, "autoload": { @@ -2399,7 +2422,7 @@ "spy", "stub" ], - "time": "2018-04-18T13:57:24+00:00" + "time": "2018-08-05T17:53:17+00:00" }, { "name": "phpunit/dbunit", @@ -2947,7 +2970,7 @@ } ], "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", + "homepage": "https://github.com/sebastianbergmann/comparator", "keywords": [ "comparator", "compare", @@ -3049,7 +3072,7 @@ } ], "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", + "homepage": "https://github.com/sebastianbergmann/environment", "keywords": [ "Xdebug", "environment", @@ -3117,7 +3140,7 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" @@ -3169,7 +3192,7 @@ } ], "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", + "homepage": "https://github.com/sebastianbergmann/global-state", "keywords": [ "global state" ], @@ -3271,7 +3294,7 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://github.com/sebastianbergmann/recursion-context", "time": "2016-11-19T07:33:16+00:00" }, { @@ -3360,21 +3383,80 @@ "time": "2016-10-03T07:35:21+00:00" }, { - "name": "symfony/yaml", - "version": "v3.4.8", + "name": "symfony/polyfill-ctype", + "version": "v1.9.0", "source": { "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "a42f9da85c7c38d59f5e53f076fe81a091f894d0" + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/a42f9da85c7c38d59f5e53f076fe81a091f894d0", - "reference": "a42f9da85c7c38d59f5e53f076fe81a091f894d0", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", + "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": ">=5.3.3" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.9-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + }, + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "time": "2018-08-06T14:22:27+00:00" + }, + { + "name": "symfony/yaml", + "version": "v3.4.16", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "61973ecda60e9f3561e929e19c07d4878b960fc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/61973ecda60e9f3561e929e19c07d4878b960fc1", + "reference": "61973ecda60e9f3561e929e19c07d4878b960fc1", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-ctype": "~1.8" }, "conflict": { "symfony/console": "<3.4" @@ -3415,7 +3497,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-04-03T05:14:20+00:00" + "time": "2018-09-24T08:15:45+00:00" }, { "name": "webmozart/assert", diff --git a/config/dbstructure.json b/config/dbstructure.json index c467ba6bc7..443f9bd755 100644 --- a/config/dbstructure.json +++ b/config/dbstructure.json @@ -15,6 +15,34 @@ "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": { "comment": "file attachments", "fields": { @@ -164,6 +192,7 @@ "hidden": {"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": ""}, + "deleted": {"type": "boolean", "not null": "1", "default": "0", "comment": "Contact has been deleted"}, "rating": {"type": "tinyint", "not null": "1", "default": "0", "comment": ""}, "reason": {"type": "text", "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"}, "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"}, - "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"}, "received": {"type": "datetime", "not null": "1", "default": "0001-01-01 00:00:00", "comment": "Receiving date"} }, diff --git a/database.sql b/database.sql index 7188558042..341ee5a858 100644 --- a/database.sql +++ b/database.sql @@ -1,6 +1,6 @@ -- ------------------------------------------ -- 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`) ) 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 -- @@ -163,6 +189,7 @@ CREATE TABLE IF NOT EXISTS `contact` ( `hidden` boolean NOT NULL DEFAULT '0' COMMENT '', `archive` boolean NOT NULL DEFAULT '0' 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 '', `reason` text 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', `conversation-uri` varbinary(255) NOT NULL DEFAULT '' COMMENT 'GNU Social conversation URI', `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', `received` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT 'Receiving date', PRIMARY KEY(`item-uri`), diff --git a/doc/Addons.md b/doc/Addons.md index 2465db7307..011bca0737 100644 --- a/doc/Addons.md +++ b/doc/Addons.md @@ -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. Remember to declare it with `&` if you wish to alter it. -## JavaScript addon hooks +## Global stylesheets -### PHP part - -Make sure your JavaScript addon file (addon/*addon_name*/*addon_name*.js) is listed in the document response. - -In your addon install function, add: +If your addon requires adding a stylesheet on all pages of Friendica, add the following hook: ```php -Addon::registerHook('template_vars', __FILE__, '_template_vars'); -``` - -In your addon uninstall function, add: - -```php -Addon::unregisterHook('template_vars', __FILE__, '_template_vars'); -``` - -Then, add your addon name to the *addon_hooks* template variable array: - -```php -function _template_vars($a, &$arr) +function _install() { - if (!array_key_exists('addon_hooks', $arr['vars'])) - { - $arr['vars']['addon_hooks'] = array(); - } - $arr['vars']['addon_hooks'][] = ""; + Addon::registerHook('head', __FILE__, '_head'); + ... +} + + +function _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 _install() +{ + Addon::registerHook('footer', __FILE__, '_footer'); + ... +} + +function _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 -Addon_registerHook(type, hookfnstr); +document.addEventListener(name, callback); ``` -*type* is the name of the hook and corresponds to a known Friendica JavaScript hook. -*hookfnstr* is the name of your JavaScript function to execute. +- *name* is the name of the hook and corresponds to a known Friendica JavaScript hook. +- *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 -function myhook_function() { +#### Current JavaScript hooks -} -``` +##### postprocess_liveupdate +Called at the end of the live update process (XmlHttpRequest) and on a post preview. +No additional data is provided. ## 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) `$b` is a string converted text +### head +Called when building the `` sections. +Stylesheets should be registered using this hook. +`$b` is an HTML string of the `` tag. + ### page_header Called after building the page navigation section. `$b` is a string HTML of nav region. @@ -294,6 +311,11 @@ No hook data. Called after HTML content functions have completed. `$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 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 url => the query string -## Current JavaScript hooks - -### postprocess_liveupdate -Called at the end of the live update process (XmlHttpRequest) - ## 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 @@ -571,6 +588,8 @@ Here is a complete list of all hook callbacks with file locations (as of 01-Apr- ### src/App.php Addon::callHooks('load_config'); + Addon::callHooks('head'); + Addon::callHooks('footer'); ### 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 - callAddonHooks("postprocess_liveupdate"); + document.dispatchEvent(new Event('postprocess_liveupdate')); diff --git a/doc/Install.md b/doc/Install.md index 3854c32bce..427299c3ea 100644 --- a/doc/Install.md +++ b/doc/Install.md @@ -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. 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_ADMIN_MAIL` The admin email address of Friendica (this email will be used for admin access) - `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 ` The username of the mysql/mariadb database login (env `MYSQL_USER` or `MYSQL_USERNAME`) - `-P|--dbpass ` The password of the mysql/mariadb database login (env `MYSQL_PASSWORD`) - `-d|--dbdata ` The name of the mysql/mariadb database (env `MYSQL_DATABASE`) -- `-b|--phppath ` The path of the PHP binary (env `FRIENDICA_PHP_PATH`) +- `-u|--urlpath ` The URL path of Friendica - f.e. '/friendica' (env `FRIENDICA_URL_PATH`) +- `-b|--phppath ` The path of the PHP binary (env `FRIENDICA_PHP_PATH`) - `-A|--admin ` The admin email address of Friendica (env `FRIENDICA_ADMIN_MAIL`) - `-T|--tz ` The timezone of Friendica (env `FRIENDICA_TZ`) - `-L|--land ` The language of Friendica (env `FRIENDICA_LANG`) diff --git a/include/api.php b/include/api.php index 5510eddb4f..01cb93a3b8 100644 --- a/include/api.php +++ b/include/api.php @@ -819,7 +819,7 @@ function api_item_get_user(App $a, $item) $status_user["protected"] = defaults($item, 'private', 0); 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 { $owner_user = $status_user; } @@ -2351,7 +2351,7 @@ function api_format_messages($item, $recipient, $sender) // standard meta information $ret = [ 'id' => $item['id'], - 'sender_id' => $sender['id'] , + 'sender_id' => $sender['id'], 'text' => "", 'recipient_id' => $recipient['id'], 'created_at' => api_date(defaults($item, 'created', DateTimeFormat::utcNow())), @@ -2732,7 +2732,7 @@ function api_contactlink_to_array($txt) * likes => int count, * dislikes => int count */ -function api_format_items_activities(&$item, $type = "json") +function api_format_items_activities($item, $type = "json") { $a = get_app(); @@ -2747,13 +2747,13 @@ function api_format_items_activities(&$item, $type = "json") $condition = ['uid' => $item['uid'], 'thr-parent' => $item['uri']]; $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 //builtin_activity_puller($i, $activities); // get user data and add it to the array of the activity - $user = api_get_user($a, $item['author-id']); - switch ($item['verb']) { + $user = api_get_user($a, $parent_item['author-id']); + switch ($parent_item['verb']) { case ACTIVITY_LIKE: $activities['like'][] = $user; 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'], $geo => null, 'favorited' => $item['starred'] ? true : false, - 'user' => $status_user , + 'user' => $status_user, 'friendica_owner' => $owner_user, 'friendica_private' => $item['private'] == 1, //'entities' => NULL, @@ -3344,7 +3344,7 @@ function api_statusnet_config($type) $a = get_app(); $name = Config::get('config', 'sitename'); - $server = $a->get_hostname(); + $server = $a->getHostName(); $logo = System::baseUrl() . '/images/friendica-64.png'; $email = Config::get('config', 'admin_email'); $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) { - if (! api_user()) { + if (!api_user()) { throw new ForbiddenException(); } @@ -3629,6 +3629,84 @@ function api_direct_messages_destroy($type) /// @TODO move to top of file or somewhere better 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) @@ -4427,7 +4505,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ // create Photo instance with the data of the image $imagedata = @file_get_contents($src); $Image = new Image($imagedata, $filetype); - if (! $Image->isValid()) { + if (!$Image->isValid()) { 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 $max_length = Config::get('system', 'max_image_length'); - if (! $max_length) { + if (!$max_length) { $max_length = MAX_IMAGE_LENGTH; } 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); $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"); } if ($width > 640 || $height > 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); - if (! $r) { + if (!$r) { 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) { $Image->scaleDown(320); $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"); } } @@ -4481,7 +4559,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ if ($width > 175 || $height > 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); - if (! $r) { + if (!$r) { 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) { $Image->scaleDown(80); $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"); } } @@ -4497,7 +4575,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ if ($width > 48 || $height > 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); - if (! $r) { + if (!$r) { 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]); $arr = []; - $arr['guid'] = System::createGUID(32); + $arr['guid'] = System::createUUID(); $arr['uid'] = intval(api_user()); $arr['uri'] = $uri; $arr['parent-uri'] = $uri; @@ -4749,77 +4827,86 @@ function api_share_as_retweet(&$item) { $body = trim($item["body"]); - if (Diaspora::isReshare($body, false)===false) { - return false; + if (Diaspora::isReshare($body, false) === 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' ? $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "$1", $body); /* - * Skip if there is no shared message in there - * we already checked this in diaspora::isReshare() - * but better one more than one less... - */ - if ($body == $attributes) { + * Skip if there is no shared message in there + * we already checked this in diaspora::isReshare() + * but better one more than one less... + */ + if (($body == $attributes) || empty($attributes)) { return false; } - // build the fake reshared item $reshared_item = $item; $author = ""; preg_match("/author='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $author = html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8'); } preg_match('/author="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $author = $matches[1]; } $profile = ""; preg_match("/profile='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $profile = $matches[1]; } preg_match('/profile="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $profile = $matches[1]; } $avatar = ""; preg_match("/avatar='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $avatar = $matches[1]; } preg_match('/avatar="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $avatar = $matches[1]; } $link = ""; preg_match("/link='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $link = $matches[1]; } preg_match('/link="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $link = $matches[1]; } $posted = ""; preg_match("/posted='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $posted = $matches[1]; } preg_match('/posted="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $posted = $matches[1]; } diff --git a/include/conversation.php b/include/conversation.php index e41b697b54..43854bb40f 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -556,7 +556,7 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o if (in_array($mode, ['community', 'contacts'])) { $writable = true; } 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()) { @@ -657,7 +657,7 @@ function conversation(App $a, array $items, $mode, $update, $preview = false, $o 'id' => ($preview ? 'P0' : $item['id']), 'guid' => ($preview ? 'Q0' : $item['guid']), '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']), 'profile_url' => $profile_link, '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) { 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)) && - 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']); } } else { @@ -1091,21 +1091,6 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false) '$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 everybody'), - '$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 = ''; Addon::callHooks('jot_tool', $jotplugins); diff --git a/include/enotify.php b/include/enotify.php index 70abce5845..b184a6935e 100644 --- a/include/enotify.php +++ b/include/enotify.php @@ -61,7 +61,7 @@ function notification($params) } $sender_name = $sitename; - $hostname = $a->get_hostname(); + $hostname = $a->getHostName(); if (strpos($hostname, ':')) { $hostname = substr($hostname, 0, strpos($hostname, ':')); } diff --git a/include/items.php b/include/items.php index 9fd557a778..27a7db767b 100644 --- a/include/items.php +++ b/include/items.php @@ -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']]); } - 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; @@ -349,12 +349,12 @@ function drop_item($id) // 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]); if (!DBA::isResult($item)) { notice(L10n::t('Item not found.') . EOL); - goaway(System::baseUrl() . '/' . $_SESSION['return_url']); + goaway('/network'); } if ($item['deleted']) { @@ -401,17 +401,17 @@ function drop_item($id) } // Now check how the user responded to the confirmation query if (!empty($_REQUEST['canceled'])) { - goaway(System::baseUrl() . '/' . $_SESSION['return_url']); + goaway('/display/' . $item['guid']); } // delete the item Item::deleteForUser(['id' => $item['id']], local_user()); - goaway(System::baseUrl() . '/' . $_SESSION['return_url']); + goaway('/network'); //NOTREACHED } else { notice(L10n::t('Permission denied.') . EOL); - goaway(System::baseUrl() . '/' . $_SESSION['return_url']); + goaway('/display/' . $item['guid']); //NOTREACHED } } diff --git a/include/text.php b/include/text.php index 97baee7f60..5a18529d93 100644 --- a/include/text.php +++ b/include/text.php @@ -42,7 +42,7 @@ function replace_macros($s, $r) { // pass $baseurl to all templates $r['$baseurl'] = System::baseUrl(); - $t = $a->template_engine(); + $t = $a->getTemplateEngine(); try { $output = $t->replaceMacros($s, $r); } catch (Exception $e) { @@ -50,7 +50,7 @@ function replace_macros($s, $r) { killme(); } - $a->save_timestamp($stamp1, "rendering"); + $a->saveTimestamp($stamp1, "rendering"); return $output; } @@ -473,7 +473,7 @@ function get_markup_template($s, $root = '') { $stamp1 = microtime(true); $a = get_app(); - $t = $a->template_engine(); + $t = $a->getTemplateEngine(); try { $template = $t->getTemplateFile($s, $root); } catch (Exception $e) { @@ -481,7 +481,7 @@ function get_markup_template($s, $root = '') { killme(); } - $a->save_timestamp($stamp1, "file"); + $a->saveTimestamp($stamp1, "file"); return $template; } @@ -574,7 +574,7 @@ function logger($msg, $level = LOGGER_INFO) { $stamp1 = microtime(true); @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); @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'), [ '$baseurl' => System::baseUrl(), ]); - $a->page['end'] .= replace_macros(get_markup_template('videos_end.tpl'), [ - '$baseurl' => System::baseUrl(), - ]); } $url_parts = explode('/', $the_url); @@ -1417,7 +1414,7 @@ function get_plink($item) { ]; if (x($item, 'plink')) { - $ret["href"] = $a->remove_baseurl($item['plink']); + $ret["href"] = $a->removeBaseURL($item['plink']); $ret["title"] = L10n::t('link to source'); } diff --git a/index.php b/index.php index 8b0bd47251..6ab405c632 100644 --- a/index.php +++ b/index.php @@ -23,11 +23,9 @@ use Friendica\Module\Login; require_once 'boot.php'; -$a = new App(__DIR__); - // We assume that the index.php is called by a frontend process // The value is set to "true" by default in boot.php -$a->backend = false; +$a = new App(__DIR__, false); /** * Try to open the database; @@ -36,7 +34,7 @@ $a->backend = false; require_once "include/dba.php"; // 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.']); } @@ -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.']); } -if (!$a->isInstallMode()) { - if (Config::get('system', 'force_ssl') && ($a->get_scheme() == "http") +if (strstr($a->query_string, '.well-known/host-meta') && ($a->query_string != '.well-known/host-meta')) { + 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) && (substr(System::baseUrl(), 0, 8) == "https://") && ($_SERVER['REQUEST_METHOD'] == 'GET')) { @@ -78,10 +80,10 @@ L10n::loadTranslationTable($lang); */ // Exclude the backend processes from the session management -if (!$a->is_backend()) { +if (!$a->isBackend()) { $stamp1 = microtime(true); session_start(); - $a->save_timestamp($stamp1, "parser"); + $a->saveTimestamp($stamp1, "parser"); } else { $_SESSION = []; Worker::executeIfIdle(); @@ -91,7 +93,7 @@ if (!$a->is_backend()) { * 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. */ -if (x($_SESSION, 'authenticated') && !x($_SESSION, 'language')) { +if (!empty($_SESSION['authenticated']) && empty($_SESSION['language'])) { $_SESSION['language'] = $lang; // we haven't loaded user data yet, but we need user language 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']; 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); if (!local_user()) { // 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); header('HTTP/1.1 403 Forbidden'); echo "

403 Forbidden

"; - killme(); + exit(); } } } -if ((x($_GET,'owt')) && $a->mode == App::MODE_NORMAL) { +if (!empty($_GET['owt']) && $a->getMode()->isNormal()) { $token = $_GET['owt']; $a->query_string = Profile::stripQueryParam($a->query_string, 'owt'); Profile::openWebAuthInit($token); @@ -149,14 +151,10 @@ if ((x($_GET,'owt')) && $a->mode == App::MODE_NORMAL) { Login::sessionAuth(); -if (! x($_SESSION, 'authenticated')) { +if (empty($_SESSION['authenticated'])) { 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_info'] = defaults($_SESSION, 'sysmsg_info' , []); $_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 // but we need "view" module for stylesheet -if ($a->isInstallMode() && $a->module!="view") { +if ($a->getMode()->isInstall() && $a->module != 'view') { $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'; } else { check_url($a); check_db(false); - check_addons($a); + Addon::check(); } Nav::setSelected('nothing'); @@ -295,11 +293,11 @@ if (strlen($a->module)) { 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. - 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(); } - 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']); 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); header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . L10n::t('Not Found')); $tpl = get_markup_template("404.tpl"); - $a->page['content'] = replace_macros( - $tpl, - [ - '$message' => L10n::t('Page not found.')] - ); + $a->page['content'] = replace_macros($tpl, [ + '$message' => L10n::t('Page not found.') + ]); } } @@ -326,11 +322,7 @@ if (file_exists($theme_info_file)) { /* initialise content region */ -if (! x($a->page, 'content')) { - $a->page['content'] = ''; -} - -if ($a->mode == App::MODE_NORMAL) { +if ($a->getMode()->isNormal()) { Addon::callHooks('page_content_top', $a->page['content']); } @@ -342,15 +334,21 @@ if ($a->module_loaded) { $a->page['page_title'] = $a->module; $placeholder = ''; + Addon::callHooks($a->module . '_mod_init', $placeholder); + if ($a->module_class) { - Addon::callHooks($a->module . '_mod_init', $placeholder); call_user_func([$a->module_class, 'init']); } else if (function_exists($a->module . '_init')) { - Addon::callHooks($a->module . '_mod_init', $placeholder); $func = $a->module . '_init'; $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')) { $func = str_replace('-', '_', $a->getCurrentTheme()) . '_init'; $func($a); @@ -405,24 +403,13 @@ if ($a->module_loaded) { * 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 * the closing tag */ -$a->init_page_end(); - -// 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'] .= ''; -} +$a->initFooter(); /* * 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); } -/* - * 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 */ - -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"))) { $doc = new DOMDocument(); @@ -502,7 +462,7 @@ if (isset($_GET["mode"]) && ($_GET["mode"] == "raw")) { echo substr($target->saveHTML(), 6, -8); - killme(); + exit(); } $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 require_once $template; - -killme(); diff --git a/mod/acctlink.php b/mod/acctlink.php deleted file mode 100644 index fb8cfd400f..0000000000 --- a/mod/acctlink.php +++ /dev/null @@ -1,16 +0,0 @@ -= `failure_update` - AND `network` IN ('%s', '%s') $sql_extra2", + AND `network` IN ('%s', '%s', '%s') $sql_extra2", intval(local_user()), + DBA::escape(Protocol::ACTIVITYPUB), DBA::escape(Protocol::DFRN), DBA::escape(Protocol::DIASPORA) ); @@ -169,10 +170,11 @@ function acl_content(App $a) } elseif ($type == 'm') { $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` - AND `success_update` >= `failure_update` AND `network` IN ('%s', '%s') + AND `success_update` >= `failure_update` AND `network` IN ('%s', '%s', '%s') $sql_extra2 ORDER BY `name` ASC ", intval(local_user()), + DBA::escape(Protocol::ACTIVITYPUB), DBA::escape(Protocol::DFRN), DBA::escape(Protocol::DIASPORA) ); diff --git a/mod/admin.php b/mod/admin.php index 562845ecc8..d0e8ab0e38 100644 --- a/mod/admin.php +++ b/mod/admin.php @@ -77,7 +77,7 @@ function admin_post(App $a) break; case 'themes': if ($a->argc < 2) { - if (is_ajax()) { + if ($a->isAjax()) { return; } goaway('admin/'); @@ -107,7 +107,7 @@ function admin_post(App $a) } info(L10n::t('Theme settings updated.')); - if (is_ajax()) { + if ($a->isAjax()) { return; } $return_path = 'admin/themes/' . $theme; @@ -286,7 +286,7 @@ function admin_content(App $a) $o = admin_page_summary($a); } - if (is_ajax()) { + if ($a->isAjax()) { echo $o; killme(); return ''; @@ -475,8 +475,8 @@ function admin_page_contactblock(App $a) $total = DBA::count('contact', $condition); - $a->set_pager_total($total); - $a->set_pager_itemspage(30); + $a->setPagerTotal($total); + $a->setPagerItemsPage(30); $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 if (file_exists('.htconfig.php')) { $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 .htconfig.php. See the Config help page 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 .htconfig.php. See the Config help page for help with the transition.', $a->getBaseURL() . '/help/Config'); } // Check server vitality if (!admin_page_server_vital()) { $showwarning = true; - $well_known = $a->get_baseurl() . '/.well-known/host-meta'; + $well_known = $a->getBaseURL() . '/.well-known/host-meta'; $warningtext[] = L10n::t('%s is not reachable on your system. This is a severe configuration issue that prevents server to server communication. See the installation page 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`"); @@ -1012,7 +1012,7 @@ function admin_page_site_post(App $a) // update config Config::set('system', 'hostname', parse_url($new_url, PHP_URL_HOST)); Config::set('system', 'url', $new_url); - $a->set_baseurl($new_url); + $a->setBaseURL($new_url); // send relocate $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'); } - if ($a->get_path() != "") { + if ($a->getURLPath() != "") { $diaspora_enabled = false; } 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); if ($itemcache != '') { - $itemcache = App::realpath($itemcache); + $itemcache = App::getRealPath($itemcache); } Config::set('system', 'itemcache', $itemcache); @@ -1269,13 +1269,13 @@ function admin_page_site_post(App $a) Config::set('system', 'max_comments', $max_comments); if ($temppath != '') { - $temppath = App::realpath($temppath); + $temppath = App::getRealPath($temppath); } Config::set('system', 'temppath', $temppath); if ($basepath != '') { - $basepath = App::realpath($basepath); + $basepath = App::getRealPath($basepath); } Config::set('system', 'basepath', $basepath); @@ -1419,9 +1419,9 @@ function admin_page_site(App $a) ]; 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); @@ -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], '$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_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."), '$diaspora_able' => $diaspora_able, '$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 */ $total = q("SELECT COUNT(*) AS `total` FROM `user` WHERE 1"); if (count($total)) { - $a->set_pager_total($total[0]['total']); - $a->set_pager_itemspage(100); + $a->setPagerTotal($total[0]['total']); + $a->setPagerItemsPage(100); } /* ordering */ @@ -2536,7 +2536,7 @@ function admin_page_features_post(App $a) */ function admin_page_features(App $a) { - if ((argc() > 1) && (argv(1) === 'features')) { + if (($a->argc > 1) && ($a->getArgumentValue(1) === 'features')) { $arr = []; $features = Feature::get(false); @@ -2567,6 +2567,5 @@ function admin_page_features(App $a) function admin_page_server_vital() { // Fetch the host-meta to check if this really is a vital server - $serverret = Network::curl(System::baseUrl() . '/.well-known/host-meta'); - return $serverret["success"]; + return Network::curl(System::baseUrl() . '/.well-known/host-meta')->isSuccess(); } diff --git a/mod/allfriends.php b/mod/allfriends.php index 7623a9cd06..b41d0c891b 100644 --- a/mod/allfriends.php +++ b/mod/allfriends.php @@ -46,7 +46,7 @@ function allfriends_content(App $a) $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']); if (!DBA::isResult($r)) { diff --git a/mod/babel.php b/mod/babel.php index e5ae96be70..65287b9f2b 100644 --- a/mod/babel.php +++ b/mod/babel.php @@ -114,6 +114,17 @@ function babel_content() '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); $results[] = [ 'title' => L10n::t('HTML::toMarkdown'), diff --git a/mod/cal.php b/mod/cal.php index bdedaaacfa..ae1060c47a 100644 --- a/mod/cal.php +++ b/mod/cal.php @@ -94,11 +94,6 @@ function cal_content(App $a) '$i18n' => $i18n, ]); - $etpl = get_markup_template('event_end.tpl'); - $a->page['end'] .= replace_macros($etpl, [ - '$baseurl' => System::baseUrl(), - ]); - $mode = 'view'; $y = 0; $m = 0; diff --git a/mod/common.php b/mod/common.php index afe78ce460..d694527b86 100644 --- a/mod/common.php +++ b/mod/common.php @@ -88,7 +88,7 @@ function common_content(App $a) } if ($t > 0) { - $a->set_pager_total($t); + $a->setPagerTotal($t); } else { notice(L10n::t('No contacts in common.') . EOL); return $o; diff --git a/mod/community.php b/mod/community.php index 9c9fb43900..d1432b7bbb 100644 --- a/mod/community.php +++ b/mod/community.php @@ -153,7 +153,7 @@ function community_content(App $a, $update = 0) $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); diff --git a/mod/contacts.php b/mod/contacts.php index 1604f0b660..4e149ab74f 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -22,6 +22,7 @@ use Friendica\Network\Probe; use Friendica\Util\DateTimeFormat; use Friendica\Util\Proxy as ProxyUtils; use Friendica\Core\ACL; +use Friendica\Module\Login; function contacts_init(App $a) { @@ -117,12 +118,6 @@ function contacts_init(App $a) '$baseurl' => System::baseUrl(true), '$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) @@ -168,11 +163,7 @@ function contacts_batch_actions(App $a) info(L10n::tt("%d contact edited.", "%d contacts edited.", $count_actions)); } - if (x($_SESSION, 'return_url')) { - goaway('' . $_SESSION['return_url']); - } else { - goaway('contacts'); - } + goaway('contacts'); } function contacts_post(App $a) @@ -385,7 +376,7 @@ function contacts_content(App $a, $update = 0) if (!local_user()) { notice(L10n::t('Permission denied.') . EOL); - return; + return Login::form(); } 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 if (x($_REQUEST, 'canceled')) { - if (x($_SESSION, 'return_url')) { - goaway('' . $_SESSION['return_url']); - } else { - goaway('contacts'); - } + goaway('contacts'); } _contact_drop($orig_record); info(L10n::t('Contact has been removed.') . EOL); - if (x($_SESSION, 'return_url')) { - goaway('' . $_SESSION['return_url']); - } else { - goaway('contacts'); - } + + goaway('contacts'); return; // NOTREACHED } 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'), [ '$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['readonly'] = Contact::isIgnoredByUser($contact['id'], local_user()); @@ -542,7 +523,7 @@ function contacts_content(App $a, $update = 0) $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 = ""; } @@ -655,15 +636,15 @@ function contacts_content(App $a, $update = 0) '$follow_text' => $follow_text, '$profile_select' => $profile_select, '$contact_id' => $contact['id'], - '$block_text' => (($contact['blocked']) ? L10n::t('Unblock') : L10n::t('Block') ), - '$ignore_text' => (($contact['readonly']) ? L10n::t('Unignore') : L10n::t('Ignore') ), - '$insecure' => (($contact['network'] !== Protocol::DFRN && $contact['network'] !== Protocol::MAIL && $contact['network'] !== Protocol::DIASPORA) ? $insecure : ''), + '$block_text' => ($contact['blocked'] ? L10n::t('Unblock') : L10n::t('Block')), + '$ignore_text' => ($contact['readonly'] ? L10n::t('Unignore') : L10n::t('Ignore')), + '$insecure' => (in_array($contact['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::MAIL, Protocol::DIASPORA]) ? '' : $insecure), '$info' => $contact['info'], '$cinfo' => ['info', '', $contact['info'], ''], - '$blocked' => (($contact['blocked']) ? L10n::t('Currently blocked') : ''), - '$ignored' => (($contact['readonly']) ? L10n::t('Currently ignored') : ''), - '$archived' => (($contact['archive']) ? L10n::t('Currently archived') : ''), - '$pending' => (($contact['pending']) ? L10n::t('Awaiting connection acknowledge') : ''), + '$blocked' => ($contact['blocked'] ? L10n::t('Currently blocked') : ''), + '$ignored' => ($contact['readonly'] ? L10n::t('Currently ignored') : ''), + '$archived' => ($contact['archive'] ? L10n::t('Currently archived') : ''), + '$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 may 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')], '$fetch_further_information' => $fetch_further_information, @@ -812,7 +793,7 @@ function contacts_content(App $a, $update = 0) intval($_SESSION['uid']) ); if (DBA::isResult($r)) { - $a->set_pager_total($r[0]['total']); + $a->setPagerTotal($r[0]['total']); $total = $r[0]['total']; } @@ -975,7 +956,7 @@ function contact_conversations(App $a, $contact_id, $update) $profiledata = Contact::getDetailsByURL($contact["url"]); 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"]); } } @@ -999,7 +980,7 @@ function contact_posts(App $a, $contact_id) $profiledata = Contact::getDetailsByURL($contact["url"]); 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"]); } } @@ -1080,7 +1061,7 @@ function _contact_detail_for_template(array $rr) */ 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 = []; // Provide friend suggestion only for Friendica contacts @@ -1105,7 +1086,7 @@ function contact_actions($contact) } $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', 'title' => L10n::t('Toggle Blocked status'), 'sel' => (intval($contact['blocked']) ? 'active' : ''), @@ -1113,7 +1094,7 @@ function contact_actions($contact) ]; $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', 'title' => L10n::t('Toggle Ignored status'), 'sel' => (intval($contact['readonly']) ? 'active' : ''), @@ -1122,7 +1103,7 @@ function contact_actions($contact) if ($contact['uid'] != 0) { $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', 'title' => L10n::t('Toggle Archive status'), 'sel' => (intval($contact['archive']) ? 'active' : ''), diff --git a/mod/crepair.php b/mod/crepair.php index 076c611db4..d8c6b35f5a 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -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')]; } - $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); diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 41b5e0ef54..969e2286c8 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -28,6 +28,7 @@ use Friendica\Model\Group; use Friendica\Model\User; use Friendica\Network\Probe; use Friendica\Protocol\Diaspora; +use Friendica\Protocol\ActivityPub; use Friendica\Util\Crypto; use Friendica\Util\DateTimeFormat; 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); @@ -335,10 +336,17 @@ function dfrn_confirm_post(App $a, $handsfree = null) intval($contact_id) ); } else { + if ($network == Protocol::ACTIVITYPUB) { + ActivityPub\Transmitter::sendContactAccept($contact['url'], $contact['hub-verify'], $uid); + $pending = true; + } else { + $pending = false; + } + // $network !== Protocol::DFRN $network = defaults($contact, 'network', Protocol::OSTATUS); - $arr = Probe::uri($contact['url']); + $arr = Probe::uri($contact['url'], $network); $notify = defaults($contact, 'notify' , $arr['notify']); $poll = defaults($contact, 'poll' , $arr['poll']); @@ -348,7 +356,7 @@ function dfrn_confirm_post(App $a, $handsfree = null) $new_relation = $contact['rel']; $writable = $contact['writable']; - if ($network === Protocol::DIASPORA) { + if (in_array($network, [Protocol::DIASPORA, Protocol::ACTIVITYPUB])) { if ($duplex) { $new_relation = Contact::FRIEND; } else { @@ -362,30 +370,12 @@ function dfrn_confirm_post(App $a, $handsfree = null) DBA::delete('intro', ['id' => $intro_id]); - $r = q("UPDATE `contact` SET `name-date` = '%s', - `uri-date` = '%s', - `addr` = '%s', - `notify` = '%s', - `poll` = '%s', - `blocked` = 0, - `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) - ); + $fields = ['name-date' => DateTimeFormat::utcNow(), + 'uri-date' => DateTimeFormat::utcNow(), 'addr' => $addr, + 'notify' => $notify, 'poll' => $poll, 'blocked' => false, + 'pending' => $pending, 'network' => $network, + 'writable' => $writable, 'hidden' => $hidden, 'rel' => $new_relation]; + DBA::update('contact', $fields, ['id' => $contact_id]); } 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']); + 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 // do anything special with this new friend. if ($handsfree === null) { diff --git a/mod/dfrn_poll.php b/mod/dfrn_poll.php index 54539ee03d..af597d76ff 100644 --- a/mod/dfrn_poll.php +++ b/mod/dfrn_poll.php @@ -502,7 +502,7 @@ function dfrn_poll_content(App $a) 'dfrn_version' => DFRN_PROTOCOL_VERSION, 'challenge' => $challenge, 'sec' => $sec - ]); + ])->getBody(); } $profile = ((DBA::isResult($r) && $r[0]['nickname']) ? $r[0]['nickname'] : $nickname); diff --git a/mod/dfrn_request.php b/mod/dfrn_request.php index 25fe69066f..e611458281 100644 --- a/mod/dfrn_request.php +++ b/mod/dfrn_request.php @@ -451,10 +451,10 @@ function dfrn_request_post(App $a) // Diaspora needs the uri in the format user@domain.tld // Diaspora will support the remote subscription in a future version if ($network == Protocol::DIASPORA) { - $uri = $nickname . '@' . $a->get_hostname(); + $uri = $nickname . '@' . $a->getHostName(); - if ($a->get_path()) { - $uri .= '/' . $a->get_path(); + if ($a->getURLPath()) { + $uri .= '/' . $a->getURLPath(); } $uri = urlencode($uri); @@ -609,7 +609,7 @@ function dfrn_request_content(App $a) } elseif (x($_GET, 'address') && ($_GET['address'] != "")) { $myaddr = $_GET['address']; } elseif (local_user()) { - if (strlen($a->urlpath)) { + if (strlen($a->getURLPath())) { $myaddr = System::baseUrl() . '/profile/' . $a->user['nickname']; } else { $myaddr = $a->user['nickname'] . '@' . substr(System::baseUrl(), strpos(System::baseUrl(), '://') + 3); diff --git a/mod/directory.php b/mod/directory.php index 411024dc1a..202132e366 100644 --- a/mod/directory.php +++ b/mod/directory.php @@ -16,7 +16,7 @@ use Friendica\Util\Proxy as ProxyUtils; function directory_init(App $a) { - $a->set_pager_itemspage(60); + $a->setPagerItemsPage(60); if (local_user()) { $a->page['aside'] .= Widget::findPeople(); @@ -87,7 +87,7 @@ function directory_content(App $a) LEFT JOIN `user` ON `user`.`uid` = `profile`.`uid` WHERE `is-default` $publish AND NOT `user`.`blocked` AND NOT `user`.`account_removed` $sql_extra"); if (DBA::isResult($cnt)) { - $a->set_pager_total($cnt['total']); + $a->setPagerTotal($cnt['total']); } $order = " ORDER BY `name` ASC "; diff --git a/mod/dirfind.php b/mod/dirfind.php index 332fe90f6c..5fe9ae13af 100644 --- a/mod/dirfind.php +++ b/mod/dirfind.php @@ -54,7 +54,7 @@ function dirfind_content(App $a, $prefix = "") { if ((valid_email($search) && Network::isEmailDomainValid($search)) || (substr(normalise_link($search), 0, 7) == "http://")) { $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) { - $a->set_pager_total($j->total); - $a->set_pager_itemspage($j->items_page); + $a->setPagerTotal($j->total); + $a->setPagerItemsPage($j->items_page); } if (!empty($j->results)) { diff --git a/mod/display.php b/mod/display.php index 907bf8ebba..a03b918372 100644 --- a/mod/display.php +++ b/mod/display.php @@ -17,6 +17,7 @@ use Friendica\Model\Group; use Friendica\Model\Item; use Friendica\Model\Profile; use Friendica\Protocol\DFRN; +use Friendica\Protocol\ActivityPub; function display_init(App $a) { @@ -43,7 +44,7 @@ function display_init(App $a) $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 ($a->argc == 2) { @@ -76,6 +77,10 @@ function display_init(App $a) displayShowFeed($item["id"], false); } + if (ActivityPub::isRequest()) { + goaway(str_replace('display/', 'objects/', $a->query_string)); + } + if ($item["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)); $author_name = $item["author-name"]; - $image = $a->remove_baseurl($item["author-avatar"]); + $image = $a->removeBaseURL($item["author-avatar"]); if ($title == "") { $title = $author_name; diff --git a/mod/editpost.php b/mod/editpost.php index 9f4aee31d6..d6493b3c0c 100644 --- a/mod/editpost.php +++ b/mod/editpost.php @@ -57,15 +57,6 @@ function editpost_content(App $a) '$nickname' => $a->user['nickname'] ]); - $tpl = get_markup_template('jot-end.tpl'); - $a->page['end'] .= replace_macros($tpl, [ - '$baseurl' => System::baseUrl(), - '$ispublic' => ' ', // L10n::t('Visible to everybody'), - '$geotag' => $geotag, - '$nickname' => $a->user['nickname'] - ]); - - $tpl = get_markup_template("jot.tpl"); if (strlen($item['allow_cid']) || strlen($item['allow_gid']) || strlen($item['deny_cid']) || strlen($item['deny_gid'])) { diff --git a/mod/events.php b/mod/events.php index 38b632cf49..d6ad97eac6 100644 --- a/mod/events.php +++ b/mod/events.php @@ -17,6 +17,7 @@ use Friendica\Model\Item; use Friendica\Model\Profile; use Friendica\Util\DateTimeFormat; use Friendica\Util\Temporal; +use Friendica\Module\Login; require_once 'include/items.php'; @@ -186,14 +187,14 @@ function events_post(App $a) Worker::add(PRIORITY_HIGH, "Notifier", "event", $item_id); } - goaway($_SESSION['return_url']); + goaway('/events'); } function events_content(App $a) { if (!local_user()) { notice(L10n::t('Permission denied.') . EOL); - return; + return Login::form(); } if ($a->argc == 1) { @@ -231,11 +232,6 @@ function events_content(App $a) '$i18n' => $i18n, ]); - $etpl = get_markup_template('event_end.tpl'); - $a->page['end'] .= replace_macros($etpl, [ - '$baseurl' => System::baseUrl(), - ]); - $o = ''; $tabs = ''; // tabs diff --git a/mod/feedtest.php b/mod/feedtest.php index d9a9abb91f..e75e7a1b8e 100644 --- a/mod/feedtest.php +++ b/mod/feedtest.php @@ -32,8 +32,7 @@ function feedtest_content(App $a) $contact = DBA::selectFirst('contact', [], ['id' => $contact_id]); - $ret = Network::curl($contact['poll']); - $xml = $ret['body']; + $xml = Network::fetchUrl($contact['poll']); $dummy = null; $import_result = Feed::import($xml, $importer, $contact, $dummy, true); diff --git a/mod/filerm.php b/mod/filerm.php index bd46a8bfea..7fb978ae69 100644 --- a/mod/filerm.php +++ b/mod/filerm.php @@ -25,9 +25,7 @@ function filerm_content(App $a) { file_tag_unsave_file(local_user(),$item_id,$term, $category); } - if (x($_SESSION,'return_url')) { - goaway(System::baseUrl() . '/' . $_SESSION['return_url']); - } + //goaway('/network'); killme(); } diff --git a/mod/follow.php b/mod/follow.php index 627ab52033..04c279c5b6 100644 --- a/mod/follow.php +++ b/mod/follow.php @@ -20,12 +20,12 @@ function follow_post(App $a) } if (isset($_REQUEST['cancel'])) { - goaway($_SESSION['return_url']); + goaway('contacts'); } $uid = local_user(); $url = notags(trim($_REQUEST['url'])); - $return_url = $_SESSION['return_url']; + $return_url = 'contacts'; // Makes the connection request for friendica contacts easier // 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); } elseif ($result['cid']) { - goaway(System::baseUrl() . '/contacts/' . $result['cid']); + goaway('contacts/' . $result['cid']); } info(L10n::t('The contact could not be added.')); @@ -50,9 +50,11 @@ function follow_post(App $a) function follow_content(App $a) { + $return_url = 'contacts'; + if (!local_user()) { notice(L10n::t('Permission denied.')); - goaway($_SESSION['return_url']); + goaway($return_url); // NOTREACHED } @@ -116,7 +118,7 @@ function follow_content(App $a) if (!$r) { notice(L10n::t('Permission denied.')); - goaway($_SESSION['return_url']); + goaway($return_url); // NOTREACHED } diff --git a/mod/fsuggest.php b/mod/fsuggest.php index 8fc0f07dee..35710bb338 100644 --- a/mod/fsuggest.php +++ b/mod/fsuggest.php @@ -36,7 +36,7 @@ function fsuggest_post(App $a) $hash = random_string(); - $note = escape_tags(trim($_POST['note'])); + $note = escape_tags(trim(defaults($_POST, 'note', ''))); if ($new_contact) { $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d LIMIT 1", diff --git a/mod/hcard.php b/mod/hcard.php index 0c046da540..7e5c2cc08a 100644 --- a/mod/hcard.php +++ b/mod/hcard.php @@ -50,7 +50,7 @@ function hcard_init(App $a) $a->page['htmlhead'] .= '' . "\r\n" ; $a->page['htmlhead'] .= '' . "\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'] .= '' . "\r\n"; header('Link: <' . System::baseUrl() . '/xrd/?uri=' . $uri . '>; rel="lrdd"; type="application/xrd+xml"', false); diff --git a/mod/help.php b/mod/help.php index 5db74c15e8..53118544fb 100644 --- a/mod/help.php +++ b/mod/help.php @@ -36,12 +36,12 @@ function help_content(App $a) $path = ''; // looping through the argv keys bigger than 0 to build // a path relative to /help - for ($x = 1; $x < argc(); $x ++) { + for ($x = 1; $x < $a->argc; $x ++) { if (strlen($path)) { $path .= '/'; } - $path .= argv($x); + $path .= $a->getArgumentValue($x); } $title = basename($path); $filename = $path; diff --git a/mod/home.php b/mod/home.php index d28bf3cb43..33d736a4e1 100644 --- a/mod/home.php +++ b/mod/home.php @@ -38,8 +38,8 @@ function home_content(App $a) { $customhome = false; $defaultheader = '

' . (Config::get('config', 'sitename') ? L10n::t('Welcome to %s', Config::get('config', 'sitename')) : '') . '

'; - $homefilepath = $a->basepath . "/home.html"; - $cssfilepath = $a->basepath . "/home.css"; + $homefilepath = $a->getBasePath() . "/home.html"; + $cssfilepath = $a->getBasePath() . "/home.css"; if (file_exists($homefilepath)) { $customhome = $homefilepath; if (file_exists($cssfilepath)) { diff --git a/mod/hostxrd.php b/mod/hostxrd.php index 16f132fe09..30343381c3 100644 --- a/mod/hostxrd.php +++ b/mod/hostxrd.php @@ -23,7 +23,7 @@ function hostxrd_init(App $a) $tpl = get_markup_template('xrd_host.tpl'); echo replace_macros($tpl, [ - '$zhost' => $a->get_hostname(), + '$zhost' => $a->getHostName(), '$zroot' => System::baseUrl(), '$domain' => System::baseUrl(), '$bigkey' => Salmon::salmonKey(Config::get('system', 'site_pubkey'))] diff --git a/mod/install.php b/mod/install.php index d2d322b3b9..5a0794b354 100644 --- a/mod/install.php +++ b/mod/install.php @@ -8,6 +8,7 @@ use Friendica\Core\Install; use Friendica\Core\L10n; use Friendica\Core\System; use Friendica\Database\DBA; +use Friendica\Database\DBStructure; use Friendica\Util\Temporal; $install_wizard_pass = 1; @@ -42,7 +43,6 @@ function install_post(App $a) { return; break; // just in case return don't return :) case 3: - $urlpath = $a->get_path(); $dbhost = notags(trim($_POST['dbhost'])); $dbuser = notags(trim($_POST['dbuser'])); $dbpass = notags(trim($_POST['dbpass'])); @@ -57,7 +57,7 @@ function install_post(App $a) { return; break; case 4: - $urlpath = $a->get_path(); + $urlpath = $a->getURLPath(); $dbhost = notags(trim($_POST['dbhost'])); $dbuser = notags(trim($_POST['dbuser'])); $dbpass = notags(trim($_POST['dbpass'])); @@ -70,14 +70,16 @@ function install_post(App $a) { // connect to db DBA::connect($dbhost, $dbuser, $dbpass, $dbdata); - $errors = Install::createConfig($urlpath, $dbhost, $dbuser, $dbpass, $dbdata, $phpath, $timezone, $language, $adminmail); + $install = new Install(); - if ($errors) { - $a->data['db_failed'] = $errors; + $errors = $install->createConfig($phpath, $urlpath, $dbhost, $dbuser, $dbpass, $dbdata, $timezone, $language, $adminmail, $a->getBasePath()); + + if ($errors !== true) { + $a->data['data'] = $errors; return; } - $errors = Install::installDatabaseStructure(); + $errors = DBStructure::update(false, true, true); if ($errors) { $a->data['db_failed'] = $errors; @@ -97,8 +99,6 @@ function install_content(App $a) { $wizard_status = ""; $install_title = L10n::t('Friendica Communications Server - Setup'); - - if (x($a->data, 'db_conn_failed')) { $install_wizard_pass = 2; $wizard_status = L10n::t('Could not connect to database.'); @@ -125,13 +125,8 @@ function install_content(App $a) { if (DBA::$connected) { $r = q("SELECT COUNT(*) as `total` FROM `user`"); if (DBA::isResult($r) && $r[0]['total']) { - $tpl = get_markup_template('install.tpl'); - return replace_macros($tpl, [ - '$title' => $install_title, - '$pass' => '', - '$status' => L10n::t('Database already in use.'), - '$text' => '', - ]); + $install_wizard_pass = 2; + $wizard_status = L10n::t('Database already in use.'); } } @@ -153,19 +148,21 @@ function install_content(App $a) { $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'); $o .= replace_macros($tpl, [ '$title' => $install_title, '$pass' => L10n::t('System check'), - '$checks' => $checks, - '$passed' => $checkspassed, + '$checks' => $install->getChecks(), + '$passed' => $status, '$see_install' => L10n::t('Please see the file "INSTALL.txt".'), '$next' => L10n::t('Next'), '$reload' => L10n::t('Check again'), '$phpath' => $phpath, - '$baseurl' => System::baseUrl(), + '$baseurl' => $a->getBaseURL(), ]); return $o; }; break; @@ -197,7 +194,7 @@ function install_content(App $a) { '$lbl_10' => L10n::t('Please select a default timezone for your website'), - '$baseurl' => System::baseUrl(), + '$baseurl' => $a->getBaseURL(), '$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, ''), '$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'), diff --git a/mod/item.php b/mod/item.php index 213a990789..053a00c977 100644 --- a/mod/item.php +++ b/mod/item.php @@ -159,7 +159,7 @@ function item_post(App $a) { } // 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 if (!can_write_wall($profile_uid) && !$allow_comment) { @@ -240,7 +240,7 @@ function item_post(App $a) { $emailcc = notags(trim(defaults($_REQUEST, 'emailcc' , ''))); $body = escape_tags(trim(defaults($_REQUEST, 'body' , ''))); $network = notags(trim(defaults($_REQUEST, 'network' , Protocol::DFRN))); - $guid = System::createGUID(32); + $guid = System::createUUID(); $postopts = defaults($_REQUEST, 'postopts', ''); @@ -343,20 +343,11 @@ function item_post(App $a) { $tags = get_tags($body); - // Add a tag if the parent contact is from OStatus (This will notify them during delivery) - if ($parent) { - if ($thr_parent_contact['network'] == Protocol::OSTATUS) { - $contact = '@[url=' . $thr_parent_contact['url'] . ']' . $thr_parent_contact['nick'] . '[/url]'; - if (!stripos(implode($tags), '[url=' . $thr_parent_contact['url'] . ']')) { - $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; - } + // Add a tag if the parent contact is from ActivityPub or OStatus (This will notify them) + if ($parent && in_array($thr_parent_contact['network'], [Protocol::OSTATUS, Protocol::ACTIVITYPUB])) { + $contact = '@[url=' . $thr_parent_contact['url'] . ']' . $thr_parent_contact['nick'] . '[/url]'; + if (!stripos(implode($tags), '[url=' . $thr_parent_contact['url'] . ']')) { + $tags[] = $contact; } } @@ -885,13 +876,13 @@ function item_content(App $a) $o = ''; 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()); } else { $o = drop_item($a->argv[2]); } - if (is_ajax()) { + if ($a->isAjax()) { // ajax return: [, 0 (no perm) | ] echo json_encode([intval($a->argv[2]), intval($o)]); killme(); @@ -1026,8 +1017,7 @@ function handle_tag(App $a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $n $alias = $contact["alias"]; $newname = $contact["nick"]; - if (($newname == "") || (($contact["network"] != Protocol::OSTATUS) && ($contact["network"] != Protocol::TWITTER) - && ($contact["network"] != Protocol::STATUSNET))) { + if (($newname == "") || !in_array($contact["network"], [Protocol::ACTIVITYPUB, Protocol::OSTATUS, Protocol::TWITTER, Protocol::STATUSNET])) { $newname = $contact["name"]; } } diff --git a/mod/match.php b/mod/match.php index caa4c944ca..7e805d5baf 100644 --- a/mod/match.php +++ b/mod/match.php @@ -59,16 +59,16 @@ function match_content(App $a) } if (strlen(Config::get('system', 'directory'))) { - $x = Network::post(get_server().'/msearch', $params); + $x = Network::post(get_server().'/msearch', $params)->getBody(); } else { - $x = Network::post(System::baseUrl() . '/msearch', $params); + $x = Network::post(System::baseUrl() . '/msearch', $params)->getBody(); } $j = json_decode($x); if ($j->total) { - $a->set_pager_total($j->total); - $a->set_pager_itemspage($j->items_page); + $a->setPagerTotal($j->total); + $a->setPagerItemsPage($j->items_page); } if (count($j->results)) { diff --git a/mod/message.php b/mod/message.php index d0a583967b..f9c5c29ec7 100644 --- a/mod/message.php +++ b/mod/message.php @@ -16,6 +16,7 @@ use Friendica\Model\Mail; use Friendica\Util\DateTimeFormat; use Friendica\Util\Proxy as ProxyUtils; use Friendica\Util\Temporal; +use Friendica\Module\Login; require_once 'include/conversation.php'; @@ -46,12 +47,6 @@ function message_init(App $a) '$baseurl' => System::baseUrl(true), '$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) @@ -103,7 +98,7 @@ function message_content(App $a) if (!local_user()) { notice(L10n::t('Permission denied.') . EOL); - return; + return Login::form(); } $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 if (!empty($_REQUEST['canceled'])) { - goaway($_SESSION['return_url']); + goaway('/message'); } $cmd = $a->argv[1]; 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()])) { info(L10n::t('Message deleted.') . EOL); } - //goaway(System::baseUrl(true) . '/message' ); - goaway($_SESSION['return_url']); + $conversation = DBA::selectFirst('mail', ['id'], ['convid' => $message['convid'], 'uid' => local_user()]); + if(!DBA::isResult($conversation)){ + info(L10n::t('Conversation removed.') . EOL); + goaway('/message'); + } + + goaway('/message/' . $conversation['id'] ); } else { $r = q("SELECT `parent-uri`,`convid` FROM `mail` WHERE `id` = %d AND `uid` = %d LIMIT 1", intval($a->argv[2]), @@ -184,8 +190,7 @@ function message_content(App $a) info(L10n::t('Conversation removed.') . EOL); } } - //goaway(System::baseUrl(true) . '/message' ); - goaway($_SESSION['return_url']); + goaway('/message' ); } } @@ -199,13 +204,6 @@ function message_content(App $a) '$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]] : []; $prename = $preurl = $preid = ''; @@ -281,7 +279,7 @@ function message_content(App $a) ); 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']); @@ -344,13 +342,6 @@ function message_content(App $a) '$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 = []; $seen = 0; $unknown = false; diff --git a/mod/network.php b/mod/network.php index c630beb25f..fb0093849e 100644 --- a/mod/network.php +++ b/mod/network.php @@ -302,7 +302,7 @@ function networkPager($a, $update) $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'])); } @@ -721,7 +721,7 @@ function networkThreadedView(App $a, $update, $parent) if ($last_received != '') { $last_date = $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'])); } break; @@ -729,7 +729,7 @@ function networkThreadedView(App $a, $update, $parent) if ($last_commented != '') { $last_date = $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'])); } break; @@ -737,14 +737,14 @@ function networkThreadedView(App $a, $update, $parent) if ($last_created != '') { $last_date = $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'])); } break; case 'id': if (($last_id > 0) && ($sql_table == '`thread`')) { $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'])); } break; @@ -810,7 +810,7 @@ function networkThreadedView(App $a, $update, $parent) } // 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)) { $top_limit = current($r)['order_date']; $bottom_limit = end($r)['order_date']; diff --git a/mod/nodeinfo.php b/mod/nodeinfo.php index 072986cc5e..ed0166838f 100644 --- a/mod/nodeinfo.php +++ b/mod/nodeinfo.php @@ -215,7 +215,7 @@ function nodeinfo_cron() { logger('local_comments: ' . $local_comments, LOGGER_DEBUG); // 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); $ret = Network::fetchUrl($url); logger('registering answer: '.$ret, LOGGER_DEBUG); diff --git a/mod/notes.php b/mod/notes.php index 01f283870e..da8352966e 100644 --- a/mod/notes.php +++ b/mod/notes.php @@ -61,7 +61,7 @@ function notes_content(App $a, $update = false) $condition = ['uid' => local_user(), 'post-type' => Item::PT_PERSONAL_NOTE, 'gravity' => GRAVITY_PARENT, 'wall' => false, 'contact-id'=> $a->contact['id']]; - $a->set_pager_itemspage(40); + $a->setPagerItemsPage(40); $params = ['order' => ['created' => true], 'limit' => [$a->pager['start'], $a->pager['itemspage']]]; diff --git a/mod/notifications.php b/mod/notifications.php index 3934a32357..1885f96447 100644 --- a/mod/notifications.php +++ b/mod/notifications.php @@ -12,6 +12,7 @@ use Friendica\Core\NotificationsManager; use Friendica\Core\Protocol; use Friendica\Core\System; use Friendica\Database\DBA; +use Friendica\Module\Login; function notifications_post(App $a) { @@ -65,7 +66,7 @@ function notifications_content(App $a) { if (!local_user()) { notice(L10n::t('Permission denied.') . EOL); - return; + return Login::form(); } $page = defaults($_REQUEST, 'page', 1); @@ -119,7 +120,7 @@ function notifications_content(App $a) } // Set the pager - $a->set_pager_itemspage($perpage); + $a->setPagerItemsPage($perpage); // Add additional informations (needed for json output) $notifs['items_page'] = $a->pager['itemspage']; diff --git a/mod/notify.php b/mod/notify.php index 458d0140a6..a277e59813 100644 --- a/mod/notify.php +++ b/mod/notify.php @@ -27,7 +27,7 @@ function notify_init(App $a) $nm->setSeen($note); // 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"); $urldata = parse_url($note['link']); $guid = basename($urldata["path"]); diff --git a/mod/openid.php b/mod/openid.php index 41d45c1f60..63b29684b3 100644 --- a/mod/openid.php +++ b/mod/openid.php @@ -19,7 +19,7 @@ function openid_content(App $a) { if((x($_GET,'openid_mode')) && (x($_SESSION,'openid'))) { - $openid = new LightOpenID($a->get_hostname()); + $openid = new LightOpenID($a->getHostName()); if($openid->validate()) { diff --git a/mod/opensearch.php b/mod/opensearch.php index 8a427908bc..5410024100 100644 --- a/mod/opensearch.php +++ b/mod/opensearch.php @@ -11,7 +11,7 @@ function opensearch_content(App $a) { $o = replace_macros($tpl, [ '$baseurl' => System::baseUrl(), - '$nodename' => $a->get_hostname(), + '$nodename' => $a->getHostName(), ]); echo $o; diff --git a/mod/ostatus_subscribe.php b/mod/ostatus_subscribe.php index 987f31699e..7012ecd4bc 100644 --- a/mod/ostatus_subscribe.php +++ b/mod/ostatus_subscribe.php @@ -15,7 +15,7 @@ function ostatus_subscribe_content(App $a) { if (! local_user()) { notice(L10n::t('Permission denied.') . EOL); - goaway($_SESSION['return_url']); + goaway('/ostatus_subscribe'); // NOTREACHED } @@ -44,14 +44,14 @@ function ostatus_subscribe_content(App $a) { $api = $contact["baseurl"]."/api/"; // 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"); 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")); @@ -72,8 +72,8 @@ function ostatus_subscribe_content(App $a) { $o .= "

".$counter."/".$total.": ".$url; - $data = Probe::uri($url); - if ($data["network"] == Protocol::OSTATUS) { + $curlResult = Probe::uri($url); + if ($curlResult["network"] == Protocol::OSTATUS) { $result = Contact::createFromProbe($uid, $url, true, Protocol::OSTATUS); if ($result["success"]) { $o .= " - ".L10n::t("success"); diff --git a/mod/parse_url.php b/mod/parse_url.php index ebe34875b7..40eddc3bdd 100644 --- a/mod/parse_url.php +++ b/mod/parse_url.php @@ -60,12 +60,12 @@ function parse_url_content(App $a) // the URL with the corresponding BBCode media tag $redirects = 0; // 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 $hdrs = []; - $h = explode("\n", $result['header']); + $h = explode("\n", $curlResponse->getHeader()); foreach ($h as $l) { $header = array_map('trim', explode(':', trim($l), 2)); if (count($header) == 2) { diff --git a/mod/photo.php b/mod/photo.php index 6d456b349e..b1dd9a5c3a 100644 --- a/mod/photo.php +++ b/mod/photo.php @@ -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 ($public and $file != '') { // 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_writable($basepath)) { mkdir($basepath . "/photo"); diff --git a/mod/photos.php b/mod/photos.php index e205d72c6d..259209ed40 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -472,7 +472,7 @@ function photos_post(App $a) $uri = Item::newURI($page_owner_uid); $arr = []; - $arr['guid'] = System::createGUID(32); + $arr['guid'] = System::createUUID(); $arr['uid'] = $page_owner_uid; $arr['uri'] = $uri; $arr['parent-uri'] = $uri; @@ -651,7 +651,7 @@ function photos_post(App $a) $uri = Item::newURI($page_owner_uid); $arr = []; - $arr['guid'] = System::createGUID(32); + $arr['guid'] = System::createUUID(); $arr['uid'] = $page_owner_uid; $arr['uri'] = $uri; $arr['parent-uri'] = $uri; @@ -889,7 +889,7 @@ function photos_post(App $a) $arr['coord'] = $lat . ' ' . $lon; } - $arr['guid'] = System::createGUID(32); + $arr['guid'] = System::createUUID(); $arr['uid'] = $page_owner_uid; $arr['uri'] = $uri; $arr['parent-uri'] = $uri; @@ -1143,8 +1143,8 @@ function photos_content(App $a) DBA::escape($album) ); if (DBA::isResult($r)) { - $a->set_pager_total(count($r)); - $a->set_pager_itemspage(20); + $a->setPagerTotal(count($r)); + $a->setPagerItemsPage(20); } /// @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']]); $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']]]; $result = Item::selectForUser($link_item['uid'], Item::ITEM_FIELDLIST, $condition, $params); @@ -1655,8 +1655,8 @@ function photos_content(App $a) ); if (DBA::isResult($r)) { - $a->set_pager_total(count($r)); - $a->set_pager_itemspage(20); + $a->setPagerTotal(count($r)); + $a->setPagerItemsPage(20); } $r = q("SELECT `resource-id`, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`filename`) AS `filename`, diff --git a/mod/ping.php b/mod/ping.php index 968751a7da..ff0139f28f 100644 --- a/mod/ping.php +++ b/mod/ping.php @@ -350,7 +350,7 @@ function ping_init(App $a) $regularnotifications = (!empty($_GET['uid']) && !empty($_GET['_'])); foreach ($notifs as $notif) { - if ($a->is_friendica_app() || !$regularnotifications) { + if ($a->isFriendicaApp() || !$regularnotifications) { $notif['message'] = str_replace("{0}", $notif['name'], $notif['message']); } diff --git a/mod/poke.php b/mod/poke.php index 91f33c0def..6ebb8632c1 100644 --- a/mod/poke.php +++ b/mod/poke.php @@ -97,7 +97,7 @@ function poke_init(App $a) $arr = []; - $arr['guid'] = System::createGUID(32); + $arr['guid'] = System::createUUID(); $arr['uid'] = $uid; $arr['uri'] = $uri; $arr['parent-uri'] = (!empty($parent_uri) ? $parent_uri : $uri); diff --git a/mod/profile.php b/mod/profile.php index 2e3ccd28c5..aa284d1669 100644 --- a/mod/profile.php +++ b/mod/profile.php @@ -20,6 +20,7 @@ use Friendica\Model\Profile; use Friendica\Module\Login; use Friendica\Protocol\DFRN; use Friendica\Util\DateTimeFormat; +use Friendica\Protocol\ActivityPub; function profile_init(App $a) { @@ -49,6 +50,16 @@ function profile_init(App $a) 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); $blocked = !local_user() && !remote_user() && Config::get('system', 'block_public'); @@ -80,7 +91,7 @@ function profile_init(App $a) $a->page['htmlhead'] .= '' . "\r\n"; $a->page['htmlhead'] .= '' . "\r\n"; $a->page['htmlhead'] .= '' . "\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'] .= '' . "\r\n"; 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; } - $a->set_pager_itemspage($itemspage_network); + $a->setPagerItemsPage($itemspage_network); $pager_sql = sprintf(" LIMIT %d, %d ", intval($a->pager['start']), intval($a->pager['itemspage'])); diff --git a/mod/profile_photo.php b/mod/profile_photo.php index 567a7f3a25..984ebfed6f 100644 --- a/mod/profile_photo.php +++ b/mod/profile_photo.php @@ -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['end'] .= replace_macros(get_markup_template("cropend.tpl"), []); $imagecrop = [ 'hash' => $hash, diff --git a/mod/profiles.php b/mod/profiles.php index d951a470d7..3e6bd1cb0d 100644 --- a/mod/profiles.php +++ b/mod/profiles.php @@ -20,6 +20,7 @@ use Friendica\Model\Profile; use Friendica\Network\Probe; use Friendica\Util\DateTimeFormat; use Friendica\Util\Temporal; +use Friendica\Module\Login; function profiles_init(App $a) { @@ -509,7 +510,7 @@ function profiles_content(App $a) { if (! local_user()) { notice(L10n::t('Permission denied.') . EOL); - return; + return Login::form(); } $o = ''; @@ -527,9 +528,6 @@ function profiles_content(App $a) { $a->page['htmlhead'] .= replace_macros(get_markup_template('profed_head.tpl'), [ '$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"); $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']], '$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']), - '$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')], '$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']], '$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']], @@ -669,7 +667,7 @@ function profiles_content(App $a) { $profiles = ''; foreach ($r as $rr) { $profiles .= replace_macros($tpl, [ - '$photo' => $a->remove_baseurl($rr['thumb']), + '$photo' => $a->removeBaseURL($rr['thumb']), '$id' => $rr['id'], '$alt' => L10n::t('Profile Image'), '$profile_name' => $rr['profile-name'], diff --git a/mod/pubsubhubbub.php b/mod/pubsubhubbub.php index 8f9478d8aa..d7b204e89c 100644 --- a/mod/pubsubhubbub.php +++ b/mod/pubsubhubbub.php @@ -104,8 +104,9 @@ function pubsubhubbub_init(App $a) { // we don't actually enforce the lease time because GNU // Social/StatusNet doesn't honour it (yet) - $body = Network::fetchUrl($hub_callback . "?" . $params); - $ret = $a->get_curl_code(); + $fetchResult = Network::fetchUrlFull($hub_callback . "?" . $params); + $body = $fetchResult->getBody(); + $ret = $fetchResult->getReturnCode(); // give up if the HTTP return code wasn't a success (2xx) if ($ret < 200 || $ret > 299) { diff --git a/mod/redir.php b/mod/redir.php index 3acf960dab..e989ad015a 100644 --- a/mod/redir.php +++ b/mod/redir.php @@ -57,7 +57,7 @@ function redir_init(App $a) { } 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); // On a local instance we have to check if the local user has already authenticated diff --git a/mod/register.php b/mod/register.php index b851faf2d6..454062d89b 100644 --- a/mod/register.php +++ b/mod/register.php @@ -274,7 +274,7 @@ function register_content(App $a) '$passwords' => $passwords, '$password1' => ['password1', L10n::t('New Password:'), '', L10n::t('Leave empty for an auto generated password.')], '$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 \'nickname@%s\'.', $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 \'nickname@%s\'.', $a->getHostName()), '$nicklabel' => L10n::t('Choose a nickname: '), '$photo' => $photo, '$publish' => $profile_publish, @@ -283,7 +283,7 @@ function register_content(App $a) '$email' => $email, '$nickname' => $nickname, '$license' => $license, - '$sitename' => $a->get_hostname(), + '$sitename' => $a->getHostName(), '$importh' => L10n::t('Import'), '$importt' => L10n::t('Import your profile to this friendica instance'), '$showtoslink' => Config::get('system', 'tosdisplay'), diff --git a/mod/repair_ostatus.php b/mod/repair_ostatus.php index 3acaa687a7..4499220817 100644 --- a/mod/repair_ostatus.php +++ b/mod/repair_ostatus.php @@ -14,7 +14,7 @@ function repair_ostatus_content(App $a) { if (! local_user()) { notice(L10n::t('Permission denied.') . EOL); - goaway($_SESSION['return_url']); + goaway('/ostatus_repair'); // NOTREACHED } diff --git a/mod/settings.php b/mod/settings.php index 84bc230e30..5632193e3b 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -22,6 +22,7 @@ use Friendica\Model\User; use Friendica\Protocol\Email; use Friendica\Util\Network; use Friendica\Util\Temporal; +use Friendica\Module\Login; 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 (Network::isUrlValid($openid)) { logger('updating openidserver'); - $open_id_obj = new LightOpenID($a->get_hostname()); + $open_id_obj = new LightOpenID($a->getHostName()); $open_id_obj->identity = $openid; $openidserver = $open_id_obj->discover($open_id_obj->identity); } else { @@ -658,7 +659,7 @@ function settings_content(App $a) if (!local_user()) { //notice(L10n::t('Permission denied.') . EOL); - return; + return Login::form(); } if (x($_SESSION, 'submanage') && intval($_SESSION['submanage'])) { @@ -982,11 +983,6 @@ function settings_content(App $a) '$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; } @@ -1140,8 +1136,8 @@ function settings_content(App $a) $tpl_addr = get_markup_template('settings/nick_set.tpl'); $prof_addr = replace_macros($tpl_addr,[ - '$desc' => L10n::t("Your Identity Address is '%s' or '%s'.", $nickname . '@' . $a->get_hostname() . $a->get_path(), System::baseUrl() . '/profile/' . $nickname), - '$basepath' => $a->get_hostname() + '$desc' => L10n::t("Your Identity Address is '%s' or '%s'.", $nickname . '@' . $a->getHostName() . $a->getURLPath(), System::baseUrl() . '/profile/' . $nickname), + '$basepath' => $a->getHostName() ]); $stpl = get_markup_template('settings/settings.tpl'); diff --git a/mod/subthread.php b/mod/subthread.php index 1153f2147d..105cf60feb 100644 --- a/mod/subthread.php +++ b/mod/subthread.php @@ -108,7 +108,7 @@ EOT; $arr = []; - $arr['guid'] = System::createGUID(32); + $arr['guid'] = System::createUUID(); $arr['uri'] = $uri; $arr['uid'] = $owner_uid; $arr['contact-id'] = $contact['id']; diff --git a/mod/tagger.php b/mod/tagger.php index 959394c078..fd79d54150 100644 --- a/mod/tagger.php +++ b/mod/tagger.php @@ -115,7 +115,7 @@ EOT; $arr = []; - $arr['guid'] = System::createGUID(32); + $arr['guid'] = System::createUUID(); $arr['uri'] = $uri; $arr['uid'] = $owner_uid; $arr['contact-id'] = $contact['id']; diff --git a/mod/unfollow.php b/mod/unfollow.php index b80263a3ec..9b0e206904 100644 --- a/mod/unfollow.php +++ b/mod/unfollow.php @@ -14,18 +14,14 @@ use Friendica\Model\User; function unfollow_post() { - $return_url = $_SESSION['return_url']; + $return_url = 'contacts'; if (!local_user()) { notice(L10n::t('Permission denied.')); - goaway($return_url); + goaway('/login'); // NOTREACHED } - if (!empty($_REQUEST['cancel'])) { - goaway($return_url); - } - $uid = local_user(); $url = notags(trim(defaults($_REQUEST, 'url', ''))); @@ -40,9 +36,13 @@ function unfollow_post() // NOTREACHED } + if (!empty($_REQUEST['cancel'])) { + goaway($return_url . '/' . $contact['id']); + } + if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { notice(L10n::t('Unfollowing is currently not supported by your network.')); - goaway($return_url); + goaway($return_url . '/' . $contact['id']); // NOTREACHED } @@ -69,9 +69,11 @@ function unfollow_post() function unfollow_content(App $a) { + $return_url = 'contacts'; + if (!local_user()) { notice(L10n::t('Permission denied.')); - goaway($_SESSION['return_url']); + goaway('/login'); // NOTREACHED } @@ -86,7 +88,7 @@ function unfollow_content(App $a) if (!DBA::isResult($contact)) { notice(L10n::t("You aren't following this contact.")); - goaway('contacts'); + goaway($return_url); // NOTREACHED } @@ -103,7 +105,7 @@ function unfollow_content(App $a) if (!DBA::isResult($self)) { notice(L10n::t('Permission denied.')); - goaway($_SESSION['return_url']); + goaway($return_url); // NOTREACHED } diff --git a/mod/videos.php b/mod/videos.php index e00df10a24..e52c78cab1 100644 --- a/mod/videos.php +++ b/mod/videos.php @@ -105,12 +105,6 @@ function videos_init(App $a) $a->page['htmlhead'] .= replace_macros($tpl,[ '$baseurl' => System::baseUrl(), ]); - - $tpl = get_markup_template("videos_end.tpl"); - $a->page['end'] .= replace_macros($tpl,[ - '$baseurl' => System::baseUrl(), - ]); - } return; @@ -347,8 +341,8 @@ function videos_content(App $a) ); if (DBA::isResult($r)) { - $a->set_pager_total(count($r)); - $a->set_pager_itemspage(20); + $a->setPagerTotal(count($r)); + $a->setPagerItemsPage(20); } $r = q("SELECT hash, ANY_VALUE(`id`) AS `id`, ANY_VALUE(`created`) AS `created`, diff --git a/mod/viewcontacts.php b/mod/viewcontacts.php index 9446470e1b..563c13c6d4 100644 --- a/mod/viewcontacts.php +++ b/mod/viewcontacts.php @@ -71,7 +71,7 @@ function viewcontacts_content(App $a) DBA::escape(Protocol::OSTATUS) ); if (DBA::isResult($r)) { - $a->set_pager_total($r[0]['total']); + $a->setPagerTotal($r[0]['total']); } $r = q("SELECT * FROM `contact` diff --git a/mod/viewsrc.php b/mod/viewsrc.php index afdcaada22..7ed029aa78 100644 --- a/mod/viewsrc.php +++ b/mod/viewsrc.php @@ -26,7 +26,7 @@ function viewsrc_content(App $a) $item = Item::selectFirst(['body'], ['uid' => local_user(), 'id' => $item_id]); if (DBA::isResult($item)) { - if (is_ajax()) { + if ($a->isAjax()) { echo str_replace("\n", '
', $item['body']); killme(); } else { diff --git a/mod/wallmessage.php b/mod/wallmessage.php index 5606b6feed..5e08420ecb 100644 --- a/mod/wallmessage.php +++ b/mod/wallmessage.php @@ -120,13 +120,6 @@ function wallmessage_content(App $a) { '$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'); $o = replace_macros($tpl, [ '$header' => L10n::t('Send Private Message'), diff --git a/mod/xrd.php b/mod/xrd.php index 61505f2996..1d29d7904a 100644 --- a/mod/xrd.php +++ b/mod/xrd.php @@ -13,7 +13,7 @@ function xrd_init(App $a) { if ($a->argv[0] == 'xrd') { if (empty($_GET['uri'])) { - killme(); + System::httpExit(404); } $uri = urldecode(notags(trim($_GET['uri']))); @@ -24,7 +24,7 @@ function xrd_init(App $a) } } else { if (empty($_GET['resource'])) { - killme(); + System::httpExit(404); } $uri = urldecode(notags(trim($_GET['resource']))); @@ -48,16 +48,16 @@ function xrd_init(App $a) $user = DBA::selectFirst('user', [], ['nickname' => $name]); if (!DBA::isResult($user)) { - killme(); + System::httpExit(404); } $profile_url = System::baseUrl().'/profile/'.$user['nickname']; $alias = str_replace('/profile/', '/~', $profile_url); - $addr = 'acct:'.$user['nickname'].'@'.$a->get_hostname(); - if ($a->get_path()) { - $addr .= '/'.$a->get_path(); + $addr = 'acct:'.$user['nickname'].'@'.$a->getHostName(); + if ($a->getURLPath()) { + $addr .= '/'.$a->getURLPath(); } if ($mode == 'xml') { @@ -80,6 +80,7 @@ function xrd_json($a, $uri, $alias, $profile_url, $r) ['rel' => NAMESPACE_DFRN, 'href' => $profile_url], ['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' => 'self', 'type' => 'application/activity+json', 'href' => $profile_url], ['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' => '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'] ] ]; + echo json_encode($json); killme(); } diff --git a/src/App.php b/src/App.php index 0dc4b86b95..97c193b3b7 100644 --- a/src/App.php +++ b/src/App.php @@ -11,6 +11,7 @@ use Friendica\Core\L10n; use Friendica\Core\PConfig; use Friendica\Core\System; use Friendica\Database\DBA; +use Friendica\Network\HTTPException\InternalServerErrorException; require_once 'boot.php'; require_once 'include/dba.php'; @@ -31,21 +32,6 @@ require_once 'include/text.php'; */ class App { - const MODE_LOCALCONFIGPRESENT = 1; - const MODE_DBAVAILABLE = 2; - const MODE_DBCONFIGAVAILABLE = 4; - const MODE_MAINTENANCEDISABLED = 8; - - /** - * @deprecated since version 2008.08 Use App->isInstallMode() instead to check for install mode. - */ - const MODE_INSTALL = 0; - - /** - * @deprecated since version 2008.08 Use the precise mode constant to check for a specific capability instead. - */ - const MODE_NORMAL = App::MODE_LOCALCONFIGPRESENT | App::MODE_DBAVAILABLE | App::MODE_DBCONFIGAVAILABLE | App::MODE_MAINTENANCEDISABLED; - public $module_loaded = false; public $module_class = null; public $query_string = ''; @@ -67,10 +53,7 @@ class App public $argv; public $argc; public $module; - public $mode = App::MODE_INSTALL; public $strings; - public $basepath; - public $urlpath; public $hooks = []; public $timezone; public $interactive = true; @@ -80,11 +63,9 @@ class App public $identities; public $is_mobile = false; public $is_tablet = false; - public $is_friendica_app; public $performance = []; public $callstack = []; public $theme_info = []; - public $backend = true; public $nav_sel; public $category; // Allow themes to control internal parameters @@ -96,6 +77,76 @@ class App public $force_max_items = 0; public $theme_events_in_profile = true; + public $stylesheets = []; + public $footerScripts = []; + + /** + * @var App\Mode The Mode of the Application + */ + private $mode; + + /** + * @var string The App base path + */ + private $basePath; + + /** + * @var string The App URL path + */ + private $urlPath; + + /** + * @var bool true, if the call is from the Friendica APP, otherwise false + */ + private $isFriendicaApp; + + /** + * @var bool true, if the call is from an backend node (f.e. worker) + */ + private $isBackend; + + /** + * @var string The name of the current theme + */ + private $currentTheme; + + /** + * @var bool check if request was an AJAX (xmlhttprequest) request + */ + private $isAjax; + + /** + * Register a stylesheet file path to be included in the tag of every page. + * Inclusion is done in App->initHead(). + * The path can be absolute or relative to the Friendica installation base folder. + * + * @see App->initHead() + * + * @param string $path + */ + public function registerStylesheet($path) + { + $url = str_replace($this->getBasePath() . DIRECTORY_SEPARATOR, '', $path); + + $this->stylesheets[] = trim($url, '/'); + } + + /** + * Register a javascript file path to be included in the