diff --git a/composer.lock b/composer.lock index 68bf9bb7b..9de7fd696 100644 --- a/composer.lock +++ b/composer.lock @@ -41,16 +41,16 @@ }, { "name": "bacon/bacon-qr-code", - "version": "2.0.4", + "version": "2.0.7", "source": { "type": "git", "url": "https://github.com/Bacon/BaconQrCode.git", - "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09" + "reference": "d70c840f68657ce49094b8d91f9ee0cc07fbf66c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/f73543ac4e1def05f1a70bcd1525c8a157a1ad09", - "reference": "f73543ac4e1def05f1a70bcd1525c8a157a1ad09", + "url": "https://api.github.com/repos/Bacon/BaconQrCode/zipball/d70c840f68657ce49094b8d91f9ee0cc07fbf66c", + "reference": "d70c840f68657ce49094b8d91f9ee0cc07fbf66c", "shasum": "" }, "require": { @@ -59,8 +59,9 @@ "php": "^7.1 || ^8.0" }, "require-dev": { - "phly/keep-a-changelog": "^1.4", + "phly/keep-a-changelog": "^2.1", "phpunit/phpunit": "^7 | ^8 | ^9", + "spatie/phpunit-snapshot-assertions": "^4.2.9", "squizlabs/php_codesniffer": "^3.4" }, "suggest": { @@ -86,7 +87,7 @@ ], "description": "BaconQrCode is a QR code generator for PHP.", "homepage": "https://github.com/Bacon/BaconQrCode", - "time": "2021-06-18T13:26:35+00:00" + "time": "2022-03-14T02:02:36+00:00" }, { "name": "bower-asset/Chart-js", @@ -242,16 +243,16 @@ }, { "name": "bower-asset/vue", - "version": "v2.6.14", + "version": "v2.7.10", "source": { "type": "git", "url": "https://github.com/vuejs/vue.git", - "reference": "612fb89547711cacb030a3893a0065b785802860" + "reference": "ee57d9fd1d51abe245c6c37e6f8f2d45977b929e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vuejs/vue/zipball/612fb89547711cacb030a3893a0065b785802860", - "reference": "612fb89547711cacb030a3893a0065b785802860", + "url": "https://api.github.com/repos/vuejs/vue/zipball/ee57d9fd1d51abe245c6c37e6f8f2d45977b929e", + "reference": "ee57d9fd1d51abe245c6c37e6f8f2d45977b929e", "shasum": "" }, "type": "bower-asset-library" @@ -314,16 +315,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.1", + "version": "1.3.3", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b" + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", - "reference": "4c679186f2aca4ab6a0f1b0b9cf9252decb44d0b", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/30897edbfb15e784fe55587b4f73ceefd3c4d98c", + "reference": "30897edbfb15e784fe55587b4f73ceefd3c4d98c", "shasum": "" }, "require": { @@ -381,7 +382,7 @@ "type": "tidelift" } ], - "time": "2021-10-28T20:44:15+00:00" + "time": "2022-07-20T07:14:26+00:00" }, { "name": "dasprid/enum", @@ -545,12 +546,12 @@ }, "type": "library", "autoload": { - "files": [ - "src/PasswordExposedFunction.php" - ], "psr-4": { "DivineOmega\\PasswordExposed\\": "src/" - } + }, + "files": [ + "src/PasswordExposedFunction.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -567,24 +568,21 @@ }, { "name": "ezyang/htmlpurifier", - "version": "v4.13.0", + "version": "v4.14.0", "source": { "type": "git", "url": "https://github.com/ezyang/htmlpurifier.git", - "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75" + "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75", - "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/12ab42bd6e742c70c0a52f7b82477fcd44e64b75", + "reference": "12ab42bd6e742c70c0a52f7b82477fcd44e64b75", "shasum": "" }, "require": { "php": ">=5.2" }, - "require-dev": { - "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" - }, "type": "library", "autoload": { "files": [ @@ -613,28 +611,28 @@ "keywords": [ "html" ], - "time": "2020-06-29T00:56:53+00:00" + "time": "2021-12-25T01:21:49+00:00" }, { "name": "fgrosse/phpasn1", - "version": "v2.3.0", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/fgrosse/PHPASN1.git", - "reference": "20299033c35f4300eb656e7e8e88cf52d1d6694e" + "reference": "eef488991d53e58e60c9554b09b1201ca5ba9296" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fgrosse/PHPASN1/zipball/20299033c35f4300eb656e7e8e88cf52d1d6694e", - "reference": "20299033c35f4300eb656e7e8e88cf52d1d6694e", + "url": "https://api.github.com/repos/fgrosse/PHPASN1/zipball/eef488991d53e58e60c9554b09b1201ca5ba9296", + "reference": "eef488991d53e58e60c9554b09b1201ca5ba9296", "shasum": "" }, "require": { - "php": ">=7.0.0" + "php": "~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0" }, "require-dev": { - "phpunit/phpunit": "~6.3", - "satooshi/php-coveralls": "~2.0" + "php-coveralls/php-coveralls": "~2.0", + "phpunit/phpunit": "^6.3 || ^7.0 || ^8.0" }, "suggest": { "ext-bcmath": "BCmath is the fallback extension for big integer calculations", @@ -684,7 +682,7 @@ "x509", "x690" ], - "time": "2021-04-24T19:01:55+00:00" + "time": "2021-12-11T12:41:06+00:00" }, { "name": "friendica/json-ld", @@ -950,16 +948,16 @@ }, { "name": "guzzlehttp/promises", - "version": "1.5.1", + "version": "1.5.2", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" + "reference": "b94b2807d85443f9719887892882d0329d1e2598" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", - "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "url": "https://api.github.com/repos/guzzle/promises/zipball/b94b2807d85443f9719887892882d0329d1e2598", + "reference": "b94b2807d85443f9719887892882d0329d1e2598", "shasum": "" }, "require": { @@ -1026,7 +1024,7 @@ "type": "tidelift" } ], - "time": "2021-10-22T20:56:57+00:00" + "time": "2022-08-28T14:55:35+00:00" }, { "name": "guzzlehttp/psr7", @@ -1495,16 +1493,16 @@ }, { "name": "mobiledetect/mobiledetectlib", - "version": "2.8.37", + "version": "2.8.39", "source": { "type": "git", "url": "https://github.com/serbanghita/Mobile-Detect.git", - "reference": "9841e3c46f5bd0739b53aed8ac677fa712943df7" + "reference": "0fd6753003fc870f6e229bae869cc1337c99bc45" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/9841e3c46f5bd0739b53aed8ac677fa712943df7", - "reference": "9841e3c46f5bd0739b53aed8ac677fa712943df7", + "url": "https://api.github.com/repos/serbanghita/Mobile-Detect/zipball/0fd6753003fc870f6e229bae869cc1337c99bc45", + "reference": "0fd6753003fc870f6e229bae869cc1337c99bc45", "shasum": "" }, "require": { @@ -1543,26 +1541,20 @@ "mobile detector", "php mobile detect" ], - "funding": [ - { - "url": "https://github.com/serbanghita", - "type": "github" - } - ], - "time": "2021-02-19T21:22:57+00:00" + "time": "2022-02-17T19:24:25+00:00" }, { "name": "monolog/monolog", - "version": "1.26.1", + "version": "1.27.1", "source": { "type": "git", "url": "https://github.com/Seldaek/monolog.git", - "reference": "c6b00f05152ae2c9b04a448f99c7590beb6042f5" + "reference": "904713c5929655dc9b97288b69cfeedad610c9a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/monolog/zipball/c6b00f05152ae2c9b04a448f99c7590beb6042f5", - "reference": "c6b00f05152ae2c9b04a448f99c7590beb6042f5", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/904713c5929655dc9b97288b69cfeedad610c9a1", + "reference": "904713c5929655dc9b97288b69cfeedad610c9a1", "shasum": "" }, "require": { @@ -1631,7 +1623,7 @@ "type": "tidelift" } ], - "time": "2021-05-28T08:32:12+00:00" + "time": "2022-06-09T08:53:42+00:00" }, { "name": "nikic/fast-route", @@ -1655,12 +1647,12 @@ }, "type": "library", "autoload": { - "files": [ - "src/functions.php" - ], "psr-4": { "FastRoute\\": "src/" - } + }, + "files": [ + "src/functions.php" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -2290,11 +2282,11 @@ }, { "name": "npm-asset/moment", - "version": "2.29.1", + "version": "2.29.4", "dist": { "type": "tar", - "url": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "shasum": "b2be769fa31940be9eeea6469c075e35006fa3d3" + "url": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "shasum": "3dbe052889fe7c1b2ed966fcb3a77328964ef108" }, "type": "npm-asset-library", "extra": { @@ -2368,7 +2360,7 @@ "time", "validate" ], - "time": "2020-10-06T11:21:28+00:00" + "time": "2022-07-06T16:01:32+00:00" }, { "name": "npm-asset/perfect-scrollbar", @@ -2718,16 +2710,16 @@ }, { "name": "paragonie/constant_time_encoding", - "version": "v2.4.0", + "version": "v2.6.3", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c" + "reference": "58c3f47f650c94ec05a151692652a868995d2938" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", - "reference": "f34c2b11eb9d2c9318e13540a1dbc2a3afbd939c", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/58c3f47f650c94ec05a151692652a868995d2938", + "reference": "58c3f47f650c94ec05a151692652a868995d2938", "shasum": "" }, "require": { @@ -2776,7 +2768,7 @@ "hex2bin", "rfc4648" ], - "time": "2020-12-06T15:14:20+00:00" + "time": "2022-06-14T06:56:20+00:00" }, { "name": "paragonie/hidden-string", @@ -2874,16 +2866,16 @@ }, { "name": "paragonie/sodium_compat", - "version": "v1.17.0", + "version": "v1.18.0", "source": { "type": "git", "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "c59cac21abbcc0df06a3dd18076450ea4797b321" + "reference": "906e0b925895d3a5941eda25f371fbafb3cbc22f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/c59cac21abbcc0df06a3dd18076450ea4797b321", - "reference": "c59cac21abbcc0df06a3dd18076450ea4797b321", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/906e0b925895d3a5941eda25f371fbafb3cbc22f", + "reference": "906e0b925895d3a5941eda25f371fbafb3cbc22f", "shasum": "" }, "require": { @@ -2952,7 +2944,7 @@ "secret-key cryptography", "side-channel resistant" ], - "time": "2021-08-10T02:43:50+00:00" + "time": "2022-09-13T20:54:27+00:00" }, { "name": "patrickschur/language-detection", @@ -3058,16 +3050,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "2.0.35", + "version": "2.0.38", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "4e16cf3f5f927a7d3f5317820af795c0366c0420" + "reference": "b03536539f43a4f9aa33c4f0b2f3a1c752088fcd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/4e16cf3f5f927a7d3f5317820af795c0366c0420", - "reference": "4e16cf3f5f927a7d3f5317820af795c0366c0420", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/b03536539f43a4f9aa33c4f0b2f3a1c752088fcd", + "reference": "b03536539f43a4f9aa33c4f0b2f3a1c752088fcd", "shasum": "" }, "require": { @@ -3082,7 +3074,8 @@ "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." + "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.", + "ext-xml": "Install the XML extension to load XML formatted public keys." }, "type": "library", "autoload": { @@ -3159,7 +3152,7 @@ "type": "tidelift" } ], - "time": "2021-11-28T23:30:39+00:00" + "time": "2022-09-02T17:04:26+00:00" }, { "name": "pragmarx/google2fa", @@ -3725,16 +3718,16 @@ }, { "name": "smarty/smarty", - "version": "v4.1.0", + "version": "v4.2.1", "source": { "type": "git", "url": "https://github.com/smarty-php/smarty.git", - "reference": "9e0536de18b53ba193364291ef0303b0ab9903e1" + "reference": "ffa2b81a8e354a49fd8a2f24742dc9dc399e8007" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/smarty-php/smarty/zipball/9e0536de18b53ba193364291ef0303b0ab9903e1", - "reference": "9e0536de18b53ba193364291ef0303b0ab9903e1", + "url": "https://api.github.com/repos/smarty-php/smarty/zipball/ffa2b81a8e354a49fd8a2f24742dc9dc399e8007", + "reference": "ffa2b81a8e354a49fd8a2f24742dc9dc399e8007", "shasum": "" }, "require": { @@ -3782,7 +3775,7 @@ "keywords": [ "templating" ], - "time": "2022-02-06T20:34:27+00:00" + "time": "2022-09-14T10:59:01+00:00" }, { "name": "spomky-labs/base64url", @@ -4658,29 +4651,30 @@ }, { "name": "doctrine/instantiator", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/doctrine/instantiator.git", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", - "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, "require-dev": { - "doctrine/coding-standard": "^8.0", + "doctrine/coding-standard": "^9", "ext-pdo": "*", "ext-phar": "*", - "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", - "phpstan/phpstan": "^0.12", - "phpstan/phpstan-phpunit": "^0.12", - "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" }, "type": "library", "autoload": { @@ -4719,7 +4713,7 @@ "type": "tidelift" } ], - "time": "2020-11-10T18:47:58+00:00" + "time": "2022-03-03T08:28:38+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -4770,16 +4764,16 @@ }, { "name": "mikey179/vfsstream", - "version": "v1.6.10", + "version": "v1.6.11", "source": { "type": "git", "url": "https://github.com/bovigo/vfsStream.git", - "reference": "250c0825537d501e327df879fb3d4cd751933b85" + "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/250c0825537d501e327df879fb3d4cd751933b85", - "reference": "250c0825537d501e327df879fb3d4cd751933b85", + "url": "https://api.github.com/repos/bovigo/vfsStream/zipball/17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", + "reference": "17d16a85e6c26ce1f3e2fa9ceeacdc2855db1e9f", "shasum": "" }, "require": { @@ -4812,20 +4806,20 @@ ], "description": "Virtual file system to mock the real file system in unit tests.", "homepage": "http://vfs.bovigo.org/", - "time": "2021-09-25T08:05:01+00:00" + "time": "2022-02-23T02:02:42+00:00" }, { "name": "mockery/mockery", - "version": "1.4.4", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/mockery/mockery.git", - "reference": "e01123a0e847d52d186c5eb4b9bf58b0c6d00346" + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mockery/mockery/zipball/e01123a0e847d52d186c5eb4b9bf58b0c6d00346", - "reference": "e01123a0e847d52d186c5eb4b9bf58b0c6d00346", + "url": "https://api.github.com/repos/mockery/mockery/zipball/e92dcc83d5a51851baf5f5591d32cb2b16e3684e", + "reference": "e92dcc83d5a51851baf5f5591d32cb2b16e3684e", "shasum": "" }, "require": { @@ -4880,32 +4874,33 @@ "test double", "testing" ], - "time": "2021-09-13T15:28:59+00:00" + "time": "2022-09-07T15:32:08+00:00" }, { "name": "myclabs/deep-copy", - "version": "1.10.2", + "version": "1.11.0", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", - "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, - "replace": { - "myclabs/deep-copy": "self.version" + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" }, "require-dev": { - "doctrine/collections": "^1.0", - "doctrine/common": "^2.6", - "phpunit/phpunit": "^7.1" + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "type": "library", "autoload": { @@ -4934,20 +4929,20 @@ "type": "tidelift" } ], - "time": "2020-11-13T09:40:50+00:00" + "time": "2022-03-03T13:19:32+00:00" }, { "name": "nikic/php-parser", - "version": "v4.13.2", + "version": "v4.15.1", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077" + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", - "reference": "210577fe3cf7badcc5814d99455df46564f3c077", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", + "reference": "0ef6c55a3f47f89d7a374e6f835197a0b5fcf900", "shasum": "" }, "require": { @@ -4986,7 +4981,7 @@ "parser", "php" ], - "time": "2021-11-30T19:35:32+00:00" + "time": "2022-09-04T07:30:47+00:00" }, { "name": "phar-io/manifest", @@ -5046,16 +5041,16 @@ }, { "name": "phar-io/version", - "version": "3.1.0", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/phar-io/version.git", - "reference": "bae7c545bef187884426f042434e561ab1ddb182" + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", - "reference": "bae7c545bef187884426f042434e561ab1ddb182", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", "shasum": "" }, "require": { @@ -5089,238 +5084,27 @@ } ], "description": "Library for handling version information and constraints", - "time": "2021-02-23T14:00:09+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "2.2.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-2.x": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" - } - ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2020-06-27T09:03:43+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "5.3.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", - "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", - "shasum": "" - }, - "require": { - "ext-filter": "*", - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.2", - "phpdocumentor/type-resolver": "^1.3", - "webmozart/assert": "^1.9.1" - }, - "require-dev": { - "mockery/mockery": "~1.3.2", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - }, - { - "name": "Jaap van Otterdijk", - "email": "account@ijaap.nl" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2021-10-19T17:43:47+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "1.5.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "phpdocumentor/reflection-common": "^2.0" - }, - "require-dev": { - "ext-tokenizer": "*", - "psalm/phar": "^4.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-1.x": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", - "time": "2021-10-02T14:08:47+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.15.0", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.2", - "phpdocumentor/reflection-docblock": "^5.2", - "sebastian/comparator": "^3.0 || ^4.0", - "sebastian/recursion-context": "^3.0 || ^4.0" - }, - "require-dev": { - "phpspec/phpspec": "^6.0 || ^7.0", - "phpunit/phpunit": "^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Prophecy\\": "src/Prophecy" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2021-12-08T12:19:24+00:00" + "time": "2022-02-21T01:04:05+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.10", + "version": "9.2.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687" + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d5850aaf931743067f4bfc1ae4cbd06468400687", - "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/aa94dc41e8661fe90c7316849907cba3007b10d8", + "reference": "aa94dc41e8661fe90c7316849907cba3007b10d8", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.13.0", + "nikic/php-parser": "^4.14", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -5373,7 +5157,7 @@ "type": "github" } ], - "time": "2021-12-05T09:12:13+00:00" + "time": "2022-08-30T12:24:04+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5602,16 +5386,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.10", + "version": "9.5.24", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" + "reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d0aa6097bef9fd42458a9b3c49da32c6ce6129c5", + "reference": "d0aa6097bef9fd42458a9b3c49da32c6ce6129c5", "shasum": "" }, "require": { @@ -5626,8 +5410,7 @@ "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", "php": ">=7.3", - "phpspec/prophecy": "^1.12.1", - "phpunit/php-code-coverage": "^9.2.7", + "phpunit/php-code-coverage": "^9.2.13", "phpunit/php-file-iterator": "^3.0.5", "phpunit/php-invoker": "^3.1.1", "phpunit/php-text-template": "^2.0.3", @@ -5641,13 +5424,9 @@ "sebastian/global-state": "^5.0.1", "sebastian/object-enumerator": "^4.0.3", "sebastian/resource-operations": "^3.0.3", - "sebastian/type": "^2.3.4", + "sebastian/type": "^3.1", "sebastian/version": "^3.0.2" }, - "require-dev": { - "ext-pdo": "*", - "phpspec/prophecy-phpunit": "^2.0.1" - }, "suggest": { "ext-soap": "*", "ext-xdebug": "*" @@ -5689,7 +5468,7 @@ ], "funding": [ { - "url": "https://phpunit.de/donate.html", + "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { @@ -5697,7 +5476,7 @@ "type": "github" } ], - "time": "2021-09-25T07:38:51+00:00" + "time": "2022-08-30T07:42:16+00:00" }, { "name": "sebastian/cli-parser", @@ -5856,16 +5635,16 @@ }, { "name": "sebastian/comparator", - "version": "4.0.6", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", - "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { @@ -5922,7 +5701,7 @@ "type": "github" } ], - "time": "2020-10-26T15:49:45+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { "name": "sebastian/complexity", @@ -6041,16 +5820,16 @@ }, { "name": "sebastian/environment", - "version": "5.1.3", + "version": "5.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac" + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", - "reference": "388b6ced16caa751030f6a69e588299fa09200ac", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", "shasum": "" }, "require": { @@ -6096,20 +5875,20 @@ "type": "github" } ], - "time": "2020-09-28T05:52:38+00:00" + "time": "2022-04-03T09:37:03+00:00" }, { "name": "sebastian/exporter", - "version": "4.0.4", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", - "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { @@ -6169,20 +5948,20 @@ "type": "github" } ], - "time": "2021-11-11T14:18:36+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", - "version": "5.0.3", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", - "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { @@ -6229,7 +6008,7 @@ "type": "github" } ], - "time": "2021-06-11T13:31:12+00:00" + "time": "2022-02-14T08:28:10+00:00" }, { "name": "sebastian/lines-of-code", @@ -6500,28 +6279,28 @@ }, { "name": "sebastian/type", - "version": "2.3.4", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", - "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", + "reference": "fb3fe09c5f0bae6bc27ef3ce933a1e0ed9464b6e", "shasum": "" }, "require": { "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^9.3" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.3-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -6548,7 +6327,7 @@ "type": "github" } ], - "time": "2021-06-15T12:49:02+00:00" + "time": "2022-09-12T14:47:03+00:00" }, { "name": "sebastian/version", @@ -6599,82 +6378,6 @@ ], "time": "2020-09-28T06:39:44+00:00" }, - { - "name": "symfony/polyfill-ctype", - "version": "v1.23.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-ctype.git", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "suggest": { - "ext-ctype": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.23-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Ctype\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Gert de Pagter", - "email": "BackEndTea@gmail.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for ctype functions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "ctype", - "polyfill", - "portable" - ], - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-02-19T12:13:01+00:00" - }, { "name": "theseer/tokenizer", "version": "1.2.1", @@ -6720,60 +6423,6 @@ } ], "time": "2021-07-28T10:34:58+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/webmozarts/assert.git", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", - "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0", - "symfony/polyfill-ctype": "^1.8" - }, - "conflict": { - "phpstan/phpstan": "<0.12.20", - "vimeo/psalm": "<4.6.1 || 4.6.2" - }, - "require-dev": { - "phpunit/phpunit": "^8.5.13" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.10-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2021-03-09T10:59:23+00:00" } ], "aliases": [], diff --git a/database.sql b/database.sql index 75d31f291..48de2fcae 100644 --- a/database.sql +++ b/database.sql @@ -639,6 +639,7 @@ CREATE TABLE IF NOT EXISTS `fcontact` ( `network` char(4) NOT NULL DEFAULT '' COMMENT '', `alias` varbinary(383) NOT NULL DEFAULT '' COMMENT '', `pubkey` text COMMENT '', + `created` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '', `updated` datetime NOT NULL DEFAULT '0001-01-01 00:00:00' COMMENT '', `interacting_count` int unsigned DEFAULT 0 COMMENT 'Number of contacts this contact interactes with', `interacted_count` int unsigned DEFAULT 0 COMMENT 'Number of contacts that interacted with this contact', diff --git a/doc/database/db_fcontact.md b/doc/database/db_fcontact.md index d082b1717..095c47aaf 100644 --- a/doc/database/db_fcontact.md +++ b/doc/database/db_fcontact.md @@ -25,6 +25,7 @@ Fields | network | | char(4) | NO | | | | | alias | | varbinary(383) | NO | | | | | pubkey | | text | YES | | NULL | | +| created | | datetime | NO | | 0001-01-01 00:00:00 | | | updated | | datetime | NO | | 0001-01-01 00:00:00 | | | interacting_count | Number of contacts this contact interactes with | int unsigned | YES | | 0 | | | interacted_count | Number of contacts that interacted with this contact | int unsigned | YES | | 0 | | diff --git a/src/App.php b/src/App.php index ceace228f..a141adf49 100644 --- a/src/App.php +++ b/src/App.php @@ -586,7 +586,7 @@ class App $this->profiler->set(microtime(true), 'classinit'); $moduleName = $this->args->getModuleName(); - $page->setLogging($this->args->getCommand(), $this->args->getMethod()); + $page->setLogging($this->args->getMethod(), $this->args->getModuleName(), $this->args->getCommand()); try { // Missing DB connection: ERROR diff --git a/src/App/Page.php b/src/App/Page.php index 475681054..633145611 100644 --- a/src/App/Page.php +++ b/src/App/Page.php @@ -80,8 +80,9 @@ class Page implements ArrayAccess private $basePath; private $timestamp = 0; - private $command = ''; private $method = ''; + private $module = ''; + private $command = ''; /** * @param string $basepath The Page basepath @@ -92,21 +93,25 @@ class Page implements ArrayAccess $this->basePath = $basepath; } - public function setLogging(string $command, string $method) + public function setLogging(string $method, string $module, string $command) { - $this->command = $command; $this->method = $method; + $this->module = $module; + $this->command = $command; } public function logRuntime(IManageConfigValues $config, string $origin = '') { - if (in_array($this->command, $config->get('system', 'runtime_ignore'))) { + $ignore = $config->get('system', 'runtime_ignore'); + if (in_array($this->module, $ignore) || in_array($this->command, $ignore)) { return; } - $runtime = number_format(microtime(true) - $this->timestamp, 3); + $signature = !empty($_SERVER['HTTP_SIGNATURE']); + $load = number_format(System::currentLoad(), 2); + $runtime = number_format(microtime(true) - $this->timestamp, 3); if ($runtime > $config->get('system', 'runtime_loglimit')) { - Logger::debug('Runtime', ['method' => $this->method, 'command' => $this->command, 'runtime' => $runtime, 'origin' => $origin]); + Logger::debug('Runtime', ['method' => $this->method, 'module' => $this->module, 'runtime' => $runtime, 'load' => $load, 'origin' => $origin, 'signature' => $signature, 'request' => $_SERVER['REQUEST_URI'] ?? '']); } } diff --git a/src/Model/Contact.php b/src/Model/Contact.php index a4c4c0a14..9e363bf37 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -277,7 +277,7 @@ class Contact // Add internal fields $removal = []; if (!empty($fields)) { - foreach (['id', 'avatar', 'created', 'updated', 'last-update', 'success_update', 'failure_update', 'network'] as $internal) { + foreach (['id', 'next-update', 'network'] as $internal) { if (!in_array($internal, $fields)) { $fields[] = $internal; $removal[] = $internal; @@ -307,9 +307,8 @@ class Contact } // Update the contact in the background if needed - $updated = max($contact['success_update'], $contact['created'], $contact['updated'], $contact['last-update'], $contact['failure_update']); - if (($updated < DateTimeFormat::utc('now -7 days')) && in_array($contact['network'], Protocol::FEDERATED) && !self::isLocalById($contact['id'])) { - Worker::add(PRIORITY_LOW, "UpdateContact", $contact['id']); + if (Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) { + Worker::add(['priority' => PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']); } // Remove the internal fields @@ -962,7 +961,6 @@ class Contact DI::cache()->delete(ActivityPub\Transmitter::CACHEKEY_CONTACTS . 'followers:' . $uid); DI::cache()->delete(ActivityPub\Transmitter::CACHEKEY_CONTACTS . 'following:' . $uid); - DI::cache()->delete(NoScrape::CACHEKEY . $uid); } /** @@ -1221,11 +1219,15 @@ class Contact return 0; } - $contact = self::getByURL($url, false, ['id', 'network', 'uri-id'], $uid); + $contact = self::getByURL($url, false, ['id', 'network', 'uri-id', 'next-update'], $uid); if (!empty($contact)) { $contact_id = $contact['id']; + if (Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) { + Worker::add(['priority' => PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']); + } + if (empty($update) && (!empty($contact['uri-id']) || is_bool($update))) { Logger::debug('Contact found', ['url' => $url, 'uid' => $uid, 'update' => $update, 'cid' => $contact_id]); return $contact_id; @@ -2524,7 +2526,7 @@ class Contact $has_local_data = self::hasLocalData($id, $contact); - if (!in_array($ret['network'], array_merge(Protocol::FEDERATED, [Protocol::ZOT, Protocol::PHANTOM]))) { + if (!Probe::isProbable($ret['network'])) { // Periodical checks are only done on federated contacts $failed_next_update = null; $success_next_update = null; @@ -3382,12 +3384,12 @@ class Contact if (empty($url) || !is_string($url)) { continue; } - $contact = self::getByURL($url, false, ['id', 'updated']); + $contact = self::getByURL($url, false, ['id', 'network', 'next-update']); if (empty($contact['id']) && Network::isValidHttpUrl($url)) { Worker::add(PRIORITY_LOW, 'AddContact', 0, $url); ++$added; - } elseif ($contact['updated'] < DateTimeFormat::utc('now -7 days')) { - Worker::add(PRIORITY_LOW, 'UpdateContact', $contact['id']); + } elseif (Probe::isProbable($contact['network']) && ($contact['next-update'] < DateTimeFormat::utcNow())) { + Worker::add(['priority' => PRIORITY_LOW, 'dont_fork' => true], 'UpdateContact', $contact['id']); ++$updated; } else { ++$unchanged; diff --git a/src/Model/FContact.php b/src/Model/FContact.php index 62f2f9836..ae6c9cb31 100644 --- a/src/Model/FContact.php +++ b/src/Model/FContact.php @@ -23,6 +23,7 @@ namespace Friendica\Model; use Friendica\Core\Logger; use Friendica\Core\Protocol; +use Friendica\Core\Worker; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Network\Probe; @@ -43,6 +44,7 @@ class FContact */ public static function getByURL(string $handle, $update = null): array { + Logger::debug('Fetch fcontact', ['handle' => $handle, 'update' => $update]); $person = DBA::selectFirst('fcontact', [], ['network' => Protocol::DIASPORA, 'addr' => $handle]); if (!DBA::isResult($person)) { $urls = [$handle, str_replace('http://', 'https://', $handle), Strings::normaliseLink($handle)]; @@ -50,21 +52,17 @@ class FContact } if (DBA::isResult($person)) { - Logger::debug('In cache', ['person' => $person]); + Logger::debug('In cache', ['handle' => $handle]); if (is_null($update)) { - // update record occasionally so it doesn't get stale - $d = strtotime($person['updated'] . ' +00:00'); - if ($d < strtotime('now - 14 days')) { - $update = true; - } - - if (empty($person['guid']) || empty($person['uri-id'])) { - $update = true; + $update = empty($person['guid']) || empty($person['uri-id']) || ($person['created'] <= DBA::NULL_DATETIME); + if (GServer::getNextUpdateDate(true, $person['created'], $person['updated'], false) < DateTimeFormat::utcNow()) { + Logger::debug('Start background update', ['handle' => $handle]); + Worker::add(['priority' => PRIORITY_LOW, 'dont_fork' => true], 'UpdateFContact', $handle); } } } elseif (is_null($update)) { - $update = !DBA::isResult($person); + $update = true; } else { $person = []; } @@ -95,7 +93,8 @@ class FContact { $uriid = ItemURI::insert(['uri' => $arr['url'], 'guid' => $arr['guid']]); - $contact = Contact::getByUriId($uriid, ['id']); + $fcontact = DBA::selectFirst('fcontact', ['created'], ['url' => $arr['url'], 'network' => $arr['network']]); + $contact = Contact::getByUriId($uriid, ['id', 'created']); $apcontact = APContact::getByURL($arr['url'], false); if (!empty($apcontact)) { $interacted = $apcontact['following_count']; @@ -129,10 +128,14 @@ class FContact 'updated' => DateTimeFormat::utcNow(), ]; - $condition = ['url' => $arr['url'], 'network' => $arr['network']]; + if (empty($fcontact['created'])) { + $fields['created'] = $fields['updated']; + } elseif (!empty($contact['created']) && ($fcontact['created'] <= DBA::NULL_DATETIME)) { + $fields['created'] = $contact['created']; + } $fields = DI::dbaDefinition()->truncateFieldsForTable('fcontact', $fields); - DBA::update('fcontact', $fields, $condition, true); + DBA::update('fcontact', $fields, ['url' => $arr['url'], 'network' => $arr['network']], true); } /** diff --git a/src/Model/Item.php b/src/Model/Item.php index 2ce582c32..de8666c98 100644 --- a/src/Model/Item.php +++ b/src/Model/Item.php @@ -1870,23 +1870,40 @@ class Item return ''; } - // Convert attachments to links - $naked_body = BBCode::removeAttachment($item['body']); - if (empty($naked_body)) { + $languages = self::getLanguageArray(trim($item['title'] . "\n" . $item['body']), 3); + if (empty($languages)) { return ''; } + return json_encode($languages); + } + + /** + * Get a language array from a given text + * + * @param string $body + * @param integer $count + * @return array + */ + public static function getLanguageArray(string $body, int $count): array + { + // Convert attachments to links + $naked_body = BBCode::removeAttachment($body); + if (empty($naked_body)) { + return []; + } + // Remove links and pictures $naked_body = BBCode::removeLinks($naked_body); // Convert the title and the body to plain text - $naked_body = trim($item['title'] . "\n" . BBCode::toPlaintext($naked_body)); + $naked_body = BBCode::toPlaintext($naked_body); // Remove possibly remaining links $naked_body = preg_replace(Strings::autoLinkRegEx(), '', $naked_body); if (empty($naked_body)) { - return ''; + return []; } $naked_body = self::getDominantLanguage($naked_body); @@ -1898,12 +1915,7 @@ class Item $availableLanguages['fa'] = 'fa'; $ld = new Language(array_keys($availableLanguages)); - $languages = $ld->detect($naked_body)->limit(0, 3)->close(); - if (is_array($languages)) { - return json_encode($languages); - } - - return ''; + return $ld->detect($naked_body)->limit(0, $count)->close() ?: []; } /** diff --git a/src/Module/NoScrape.php b/src/Module/NoScrape.php index e3a01ceaa..363acd38c 100644 --- a/src/Module/NoScrape.php +++ b/src/Module/NoScrape.php @@ -22,11 +22,10 @@ namespace Friendica\Module; use Friendica\BaseModule; -use Friendica\Core\Cache\Enum\Duration; -use Friendica\Core\Protocol; use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; +use Friendica\Model\APContact; use Friendica\Model\User; /** @@ -36,8 +35,6 @@ use Friendica\Model\User; */ class NoScrape extends BaseModule { - const CACHEKEY = 'noscrape:'; - protected function rawContent(array $request = []) { $a = DI::app(); @@ -58,12 +55,6 @@ class NoScrape extends BaseModule System::jsonError(404, 'Profile not found'); } - $cachekey = self::CACHEKEY . $owner['uid']; - $result = DI::cache()->get($cachekey); - if (!is_null($result)) { - System::jsonExit($result); - } - $json_info = [ 'addr' => $owner['addr'], 'nick' => $which, @@ -98,16 +89,8 @@ class NoScrape extends BaseModule } if (!($owner['hide-friends'] ?? false)) { - $json_info['contacts'] = DBA::count('contact', - [ - 'uid' => $owner['uid'], - 'self' => 0, - 'blocked' => 0, - 'pending' => 0, - 'hidden' => 0, - 'archive' => 0, - 'network' => [Protocol::DFRN, Protocol::DIASPORA, Protocol::OSTATUS] - ]); + $apcontact = APContact::getByURL($owner['url']); + $json_info['contacts'] = max($apcontact['following_count'], $apcontact['followers_count']); } // We display the last activity (post or login), reduced to year and week number @@ -135,8 +118,6 @@ class NoScrape extends BaseModule } } - DI::cache()->set($cachekey, $json_info, Duration::DAY); - System::jsonExit($json_info); } } diff --git a/src/Network/Probe.php b/src/Network/Probe.php index d5d87ebf9..f075a514a 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -57,6 +57,17 @@ class Probe private static $baseurl; private static $istimeout; + /** + * Checks if the provided network can be probed + * + * @param string $network + * @return boolean + */ + public static function isProbable(string $network): bool + { + return (in_array($network, array_merge(Protocol::FEDERATED, [Protocol::ZOT, Protocol::PHANTOM]))); + } + /** * Remove stuff from an URI that doesn't belong there * diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index e16e2e953..7988d97f6 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -91,7 +91,7 @@ class Processor * @param string $body * @return string */ - protected static function normalizeMentionLinks(string $body): string + public static function normalizeMentionLinks(string $body): string { return preg_replace('%\[url=([^\[\]]*)]([#@!])(.*?)\[/url]%ism', '$2[url=$1]$3[/url]', $body); } diff --git a/src/Protocol/Relay.php b/src/Protocol/Relay.php index 7414c2931..ff8276250 100644 --- a/src/Protocol/Relay.php +++ b/src/Protocol/Relay.php @@ -29,6 +29,7 @@ use Friendica\DI; use Friendica\Model\APContact; use Friendica\Model\Contact; use Friendica\Model\GServer; +use Friendica\Model\Item; use Friendica\Model\Post; use Friendica\Model\Search; use Friendica\Model\Tag; @@ -76,6 +77,8 @@ class Relay return false; } + $body = ActivityPub\Processor::normalizeMentionLinks($body); + $systemTags = []; $userTags = []; $denyTags = []; @@ -125,6 +128,25 @@ class Relay } } + $languages = []; + foreach (Item::getLanguageArray($body, 10) as $language => $reliability) { + if ($reliability > 0) { + $languages[] = $language; + } + } + + Logger::debug('Got languages', ['languages' => $languages, 'body' => $body]); + + if (!empty($languages)) { + if (in_array($languages[0], $config->get('system', 'relay_deny_languages'))) { + Logger::info('Unwanted language found - rejected', ['language' => $languages[0], 'network' => $network, 'url' => $url]); + return false; + } + } elseif ($config->get('system', 'relay_deny_undetected_language')) { + Logger::info('Undetected language found - rejected', ['body' => $body, 'network' => $network, 'url' => $url]); + return false; + } + if ($scope == self::SCOPE_ALL) { Logger::info('Server accept all posts - accepted', ['network' => $network, 'url' => $url]); return true; diff --git a/src/Util/Profiler.php b/src/Util/Profiler.php index f4e485048..a98e72892 100644 --- a/src/Util/Profiler.php +++ b/src/Util/Profiler.php @@ -152,13 +152,13 @@ class Profiler implements ContainerInterface * Saves a timestamp for a value - f.e. a call * Necessary for profiling Friendica * - * @param int $timestamp the Timestamp + * @param float $timestamp the Timestamp * @param string $value A value to profile * @param string $callstack A callstack string, generated if absent * * @return void */ - public function saveTimestamp(int $timestamp, string $value, string $callstack = '') + public function saveTimestamp(float $timestamp, string $value, string $callstack = '') { if (!$this->enabled) { return; @@ -358,9 +358,9 @@ class Profiler implements ContainerInterface * @throws NotFoundExceptionInterface No entry was found for **this** identifier. * @throws ContainerExceptionInterface Error while retrieving the entry. * - * @return int Entry. + * @return float Entry. */ - public function get(string $id): int + public function get(string $id): float { if (!$this->has($id)) { return 0; diff --git a/static/dbstructure.config.php b/static/dbstructure.config.php index 1f1982c98..90fea5bcf 100644 --- a/static/dbstructure.config.php +++ b/static/dbstructure.config.php @@ -697,6 +697,7 @@ return [ "network" => ["type" => "char(4)", "not null" => "1", "default" => "", "comment" => ""], "alias" => ["type" => "varbinary(383)", "not null" => "1", "default" => "", "comment" => ""], "pubkey" => ["type" => "text", "comment" => ""], + "created" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], "updated" => ["type" => "datetime", "not null" => "1", "default" => DBA::NULL_DATETIME, "comment" => ""], "interacting_count" => ["type" => "int unsigned", "default" => 0, "comment" => "Number of contacts this contact interactes with"], "interacted_count" => ["type" => "int unsigned", "default" => 0, "comment" => "Number of contacts that interacted with this contact"], diff --git a/static/defaults.config.php b/static/defaults.config.php index adffad896..fb6727491 100644 --- a/static/defaults.config.php +++ b/static/defaults.config.php @@ -525,6 +525,14 @@ return [ // The authentication password for the redis database 'redis_password' => null, + // relay_deny_languages (Array) + // Array of languages (two digit format) that are rejected. + 'relay_deny_languages' => [], + + // relay_deny_undetected_language (Boolean) + // Deny undetected languages + 'relay_deny_undetected_language' => false, + // session_handler (database|cache|native) // Whether to use Cache to store session data or to use PHP native session storage. 'session_handler' => 'database',